使用Pandoc生成HTML时如何合并重复脚注?
实现Pandoc合并重复脚注(仿Typora效果)
核心思路
Pandoc默认会为每个重复的脚注引用生成独立的脚注项,而Typora会把内容完全相同的脚注合并为一个,所有重复引用指向同一个脚注。我们可以通过Lua Filter实现这个逻辑:遍历文档中的脚注,记录已存在的脚注内容和对应的ID,遇到重复内容时,让引用指向已有的脚注ID,同时移除重复的脚注项。
步骤1:创建Lua Filter文件
新建一个名为merge-footnotes.lua的文件,复制以下代码进去:
local footnotes = {} -- 处理脚注引用 function Note(el) -- 获取脚注的纯文本内容 local note_text = pandoc.utils.stringify(el) -- 若内容已存在,返回已有脚注的内容结构 if footnotes[note_text] then return pandoc.Note(footnotes[note_text].content) else -- 记录新脚注的内容与ID footnotes[note_text] = { content = el.content, id = el.id } return el end end -- 处理脚注列表,移除重复项 function NoteList(el) local unique_notes = {} for _, note in ipairs(el.notes) do local note_text = pandoc.utils.stringify(note) if not unique_notes[note_text] then unique_notes[note_text] = note end end -- 重构去重后的脚注列表 return pandoc.NoteList(table.values(unique_notes)) end
步骤2:用Pandoc调用Filter转换
在命令行执行以下命令(替换为你的文件路径):
pandoc .\test.md -f markdown -t html -s --lua-filter=merge-footnotes.lua -o test.html
测试示例
用以下Markdown内容验证效果:
这是第一段内容[^note1],这是第二段内容[^note1],这是第三段内容[^note2]。 [^note1]: 这是重复的脚注内容 [^note2]: 这是另一个脚注内容
转换后的HTML中,两个[^note1]会指向同一个脚注项,页面底部只会显示一次“这是重复的脚注内容”,和Typora的呈现效果一致。
补充说明
- 代码通过
pandoc.utils.stringify()提取脚注纯文本作为去重依据,不管脚注内有什么格式(加粗、链接等),只要纯文本相同就会合并;如果需要连格式也严格匹配,可以修改判断逻辑,直接比较脚注的AST结构。 - Lua Filter是Pandoc官方推荐的轻量扩展方式,不需要额外安装依赖,直接通过命令行参数调用即可。
内容的提问来源于stack exchange,提问作者Little Train
相关产品推荐
相关产品推荐

