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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:52:19