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

如何用Pandoc将Word引文转换为Markdown的@格式引用键?

解决Pandoc转回Markdown时保留[@引用键]格式的问题

问题背景

我用Markdown撰写内容,其中包含[@reference]格式的引文,搭配bibliography.bib文件管理参考文献。将Markdown转成Word文档供合作者批注后,再用Pandoc转回Markdown时,原有的[@reference]格式会变成(Me 2024)这类普通文本或链接,无法保留原始引用键,导致无法继续用Git进行版本控制。

复现步骤

  • 准备含[@reference]引用的input.md文件和对应的bibliography.bib文件
  • 执行命令:pandoc input.md -o output.docx --citeproc,生成带正确引文格式的Word文档
  • 执行命令:pandoc output.docx -o new_input.md,转回Markdown后,引文变为普通文本而非[@reference]格式

已尝试的无效方案

  • 添加--metadata link-citations=True参数:仅生成指向参考文献的链接,无法保留原始引用键
  • 使用自定义CSL样式文件:对格式还原无帮助
  • 使用Zotero Lua过滤器:未运行Zotero刷新时能生成近似格式,但附带多余提示信息

可行解决方案

利用Lua过滤器嵌入并提取引用键

通过两个Lua过滤器,在生成Word时将引用键作为元数据嵌入,转回Markdown时再提取恢复格式:

1. 编写嵌入引用键的过滤器(embed-cite-keys.lua)

function Cite(cite)
  -- 将每个引用的键存入自定义属性
  for _, item in ipairs(cite.citations) do
    cite.attributes["data-cite-key"] = item.id
  end
  return cite
end

2. 生成带元数据的Word文档

执行命令:

pandoc input.md -o output.docx --citeproc --lua-filter=embed-cite-keys.lua

3. 编写提取引用键的过滤器(extract-cite-keys.lua)

function Cite(cite)
  -- 提取自定义属性中的引用键,恢复为[@引用键]格式
  local key = cite.attributes["data-cite-key"]
  if key then
    return pandoc.Cite(
      pandoc.Str("[" .. "@" .. key .. "]"),
      {pandoc.Citation(key, "NormalCitation")}
    )
  end
  return cite
end

4. 转回Markdown并恢复引用格式

执行命令:

pandoc output.docx -o new_input.md --lua-filter=extract-cite-keys.lua

备选方法:手动保留引用标记

如果不需要Word里的引文完全格式化,可在原始Markdown中用HTML属性手动保留引用键,示例:

<span data-cite="reference">(Me 2024)</span>

此方法需手动处理,自动化程度低于Lua过滤器方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:28:17