如何在Pandoc将Docx转LaTeX时为自定义模板变量赋值?
问题
我想用Pandoc把Docx文档转成LaTeX,需要从Docx里提取内容填充LaTeX模板序言里的自定义命令。我看了default.latex模板,但不知道怎么在Docx里设置信息,才能让它被存到$title$或者$mynewcommand$这类变量里。我试过用文档自定义样式(比如mynewcommand样式),但没用。
我用的转换命令是:
pandoc --extract-media=. --template=mytemplate.latex --from=docx+styles --to=latex --output=test.tex test.docx
我的mytemplate.latex模板里有这样的示例命令:
\mynewcommand{$mynewcommand$}
请问该怎么在Docx文件里设置格式,才能获取$mynewcommand$需要的信息?
补充:我觉得可以通过自定义写入器里的metaToContext函数实现,但没找到相关示例。
解决方案
方法1:利用Docx自定义文档属性
Pandoc会自动读取Docx的内置/自定义文档属性作为模板变量,步骤如下:
- 打开目标Docx,点击「文件」→「信息」→「属性」→「高级属性」→「自定义」标签
- 添加一个名为
mynewcommand的属性,填入对应的值并保存 - 直接用你原来的转换命令即可,模板里的
$mynewcommand$会自动读取这个属性的值
方法2:自定义段落样式+Lua过滤器(推荐)
如果需要提取的是文档正文里的特定内容块,用Lua过滤器识别自定义样式的段落并将其转为模板变量:
- 在Docx里给需要提取的段落应用自定义样式,比如命名为
MyNewCommandStyle - 编写Lua过滤器文件
extract-custom-meta.lua:
local target_content = nil -- 识别目标样式的段落,提取内容并从正文移除 function Para(elem) if elem.attr.classes:includes("MyNewCommandStyle") then target_content = pandoc.utils.stringify(elem) return {} end return elem end -- 将提取的内容注入元数据,供模板调用 function Meta(meta) meta.mynewcommand = target_content return meta end
- 修改转换命令,加入过滤器参数:
pandoc --extract-media=. --template=mytemplate.latex --from=docx+styles --to=latex --lua-filter=extract-custom-meta.lua --output=test.tex test.docx
方法3:自定义LaTeX写入器(复杂场景)
如果确实要用到metaToContext,可以基于默认写入器修改:
- 导出默认LaTeX写入器模板:
pandoc --print-default-data-file latex.lua > custom-latex-writer.lua
- 在
custom-latex-writer.lua中找到metaToContext函数,添加自定义变量的映射逻辑(比如从Docx元数据或样式内容提取值) - 转换时指定自定义写入器:
pandoc --extract-media=. --template=mytemplate.latex --from=docx+styles --to=custom-latex-writer.lua --output=test.tex test.docx
注:这种方法复杂度较高,仅建议用于高度定制化的场景。
内容的提问来源于stack exchange,提问作者drl
相关产品推荐
相关产品推荐

