如何用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
相关产品推荐
相关产品推荐

