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

如何在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的内置/自定义文档属性作为模板变量,步骤如下:

  1. 打开目标Docx,点击「文件」→「信息」→「属性」→「高级属性」→「自定义」标签
  2. 添加一个名为mynewcommand的属性,填入对应的值并保存
  3. 直接用你原来的转换命令即可,模板里的$mynewcommand$会自动读取这个属性的值

方法2:自定义段落样式+Lua过滤器(推荐)

如果需要提取的是文档正文里的特定内容块,用Lua过滤器识别自定义样式的段落并将其转为模板变量:

  1. 在Docx里给需要提取的段落应用自定义样式,比如命名为MyNewCommandStyle
  2. 编写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
  1. 修改转换命令,加入过滤器参数:
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,可以基于默认写入器修改:

  1. 导出默认LaTeX写入器模板:
pandoc --print-default-data-file latex.lua > custom-latex-writer.lua
  1. 在custom-latex-writer.lua中找到metaToContext函数,添加自定义变量的映射逻辑(比如从Docx元数据或样式内容提取值)
  2. 转换时指定自定义写入器:
pandoc --extract-media=. --template=mytemplate.latex --from=docx+styles --to=custom-latex-writer.lua --output=test.tex test.docx

注:这种方法复杂度较高,仅建议用于高度定制化的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:37:40