如何通过Pandoc将docx中的字段值传递到LaTeX模板变量中?
Pandoc提取DOCX变量到LaTeX模板的实现方案
Pandoc本身没有原生支持直接从DOCX中提取标记文本作为LaTeX模板变量的功能,但可以通过两种可行方法实现需求:
方法一:用自定义Lua过滤器处理
Pandoc的Lua过滤器可以遍历并修改文档内容,通过它能识别DOCX里的自定义样式或标记,提取内容转为模板可用的变量:
- 识别自定义Word样式:比如给客户名称文本应用
customer_name样式,过滤器可以捕获带该样式的元素,把文本内容存入Pandoc元数据。 - 识别自定义标记格式:针对你尝试的
$variable_name$TEXT$variable_name%$格式,过滤器可以匹配这种文本块,提取中间的TEXT作为变量值,同时清除标记字符。
简化版Lua过滤器示例(保存为extract-vars.lua):
function Span(el) -- 匹配带指定样式的文本 if el.classes[1] == "customer_name" then -- 将内容写入元数据 pandoc.mediabag.set("metadata.customer_name", el.text) -- 移除原文本(若需保留可删除此行) return pandoc.Null() end end
执行命令时调用过滤器:
pandoc input.docx --lua-filter=extract-vars.lua --template=your-template.tex -o output.pdf
之后就能在LaTeX模板中用$customer_name$调用该变量。
方法二:先转Markdown再处理变量
- 把DOCX转成Markdown文件:
pandoc input.docx -o input.md
- 在Markdown开头的元数据区添加提取到的变量:
--- customer_name: "ABC科技有限公司" system_ref: "SYS-2024-007" ---
- 结合LaTeX模板编译:
pandoc input.md --template=your-template.tex -o output.pdf
这种方法适合变量数量少、可接受少量手动操作的场景。
你之前尝试的方法无效的原因
- 自定义Word样式:Pandoc默认不会把Word样式映射为元数据变量,必须通过过滤器主动提取。
$variable_name$标记:Pandoc仅解析文档元数据区的变量,不会自动识别正文里的这类标记,需要预处理或过滤器来处理。
内容的提问来源于stack exchange,提问作者Timothy Roes
相关产品推荐
相关产品推荐

