如何使用Pandoc+mermaid-filter实现图表并排显示?
解决方法
方法1:修复mermaid-filter的LaTeX输出格式
你改width后仍无法并排的核心问题是:mermaid-filter生成的LaTeX代码中,每个\subfloat块之间存在空白行,Pandoc会将空白行解析为段落分隔符\par,导致LaTeX把它们当成独立段落纵向堆叠。
找到filter.js中处理LaTeX输出的代码分支,做两处修改:
- 把宽度设置从百分比改为LaTeX原生的相对单位,比如
0.45\\columnwidth,适配页面排版更稳妥; - 拼接多个
\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
相关产品推荐
相关产品推荐

