You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandoc+mermaid-filter实现图表并排显示?

解决方法

方法1:修复mermaid-filter的LaTeX输出格式

你改width后仍无法并排的核心问题是:mermaid-filter生成的LaTeX代码中,每个\subfloat块之间存在空白行,Pandoc会将空白行解析为段落分隔符\par,导致LaTeX把它们当成独立段落纵向堆叠。

找到filter.js中处理LaTeX输出的代码分支,做两处修改:

  1. 把宽度设置从百分比改为LaTeX原生的相对单位,比如0.45\\columnwidth,适配页面排版更稳妥;
  2. 拼接多个\subfloat输出时,不要加换行,直接用join('')替代join('\n'),消除空白行。

示例修改后的代码片段:

// 生成单个subfloat的代码
function generateLatexSubfloat(file, caption) {
  return `\\subfloat[${caption}]{\n\\includegraphics[width=0.45\\columnwidth]{${file}}\n}`;
}

// 拼接多个subfloat时去掉换行
const latexOutput = mermaidBlocks.map(block => generateLatexSubfloat(block.file, block.caption)).join('');

方法2:用Markdown表格实现并排(无需修改filter)

如果不想改动filter源码,直接用两列表格包裹mermaid代码块即可,Pandoc会自动将表格转为LaTeX的tabular环境,实现图表并排:

| 左图表 | 右图表 |
|--------|--------|
| ```mermaid
graph TD
A --> B
``` | ```mermaid
graph TD
C --> D
``` |

只需确保mermaid-filter生成的图表宽度设置在50%以内(比如45%),就能完美适配两列布局。

方法3:用自定义Lua Filter批量处理

如果需要频繁生成并排mermaid图表,可以写个轻量的Pandoc Lua Filter,自动将连续的mermaid代码块合并为LaTeX的subfloat组:

local mermaid_queue = {}

function CodeBlock(block)
  if block.classes[1] == "mermaid" then
    table.insert(mermaid_queue, block)
    return {} -- 暂存当前块,后续统一处理
  else
    -- 遇到非mermaid块时,处理之前积累的图表
    if #mermaid_queue > 0 then
      local latex = "\\begin{figure}[h]\n"
      for _, mb in ipairs(mermaid_queue) do
        -- 适配mermaid-filter生成的图片路径逻辑
        local img_name = pandoc.utils.sha1(pandoc.utils.stringify(mb)) .. ".pdf"
        latex = latex .. "\\subfloat[]{\n\\includegraphics[width=0.45\\columnwidth]{" .. img_name .. "}\n}"
      end
      latex = latex .. "\n\\caption{并排图表组}\n\\end{figure}"
      mermaid_queue = {}
      return pandoc.RawBlock("latex", latex)
    end
    return block
  end
end

-- 文档结束时处理剩余的mermaid块
function Pandoc(doc)
  if #mermaid_queue > 0 then
    local latex = "\\begin{figure}[h]\n"
    for _, mb in ipairs(mermaid_queue) do
      local img_name = pandoc.utils.sha1(pandoc.utils.stringify(mb)) .. ".pdf"
      latex = latex .. "\\subfloat[]{\n\\includegraphics[width=0.45\\columnwidth]{" .. img_name .. "}\n}"
    end
    latex = latex .. "\n\\caption{并排图表组}\n\\end{figure}"
    table.insert(doc.blocks, pandoc.RawBlock("latex", latex))
  end
  return doc
end

使用时将脚本存为mermaid-sbs.lua,执行Pandoc命令:

pandoc input.md -o output.pdf --filter mermaid-filter --lua-filter mermaid-sbs.lua

内容的提问来源于stack exchange,提问作者yakatz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:03:16