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

如何通过Pandoc将Markdown YAML头的thanks、keywords写入docx文档?

解决Pandoc 2.18将YAML头中thanks/keywords写入docx的问题

我已经查阅了Pandoc在线手册及相关文档,但仍无法实现用Pandoc 2.18将Markdown文件YAML元数据中的thanks和keywords字段写入生成的docx文档。推测可以通过Lua过滤器实现,但对Lua语言和Pandoc编程框架了解有限。以下是最小可复现示例(MWE):

---
title: The Title
author: The Author
thanks: |
  The author wishes to thank certain support.
abstract: |
  This is the abstract.
keywords: [one, two, three, four]
---
   
# A Heading

Text body. 

解决方案:编写Lua过滤器

创建一个名为meta-to-docx.lua的文件,内容如下:

function Meta(meta)
  -- 插入thanks内容到文档头部
  if meta.thanks then
    local thanks_text = pandoc.utils.stringify(meta.thanks)
    local thanks_block = pandoc.RawBlock('openxml', '<w:p><w:pPr><w:pStyle w:val="BodyText"/></w:pPr><w:r><w:t>' .. thanks_text .. '</w:t></w:r></w:p>')
    meta['header-includes'] = meta['header-includes'] or {}
    table.insert(meta['header-includes'], thanks_block)
  end

  -- 插入keywords内容到文档头部
  if meta.keywords then
    local keywords_list = meta.keywords:map(function(k) return pandoc.utils.stringify(k) end)
    local keywords_text = 'Keywords: ' .. table.concat(keywords_list, ', ')
    local keywords_block = pandoc.RawBlock('openxml', '<w:p><w:pPr><w:pStyle w:val="BodyText"/></w:pPr><w:r><w:t>' .. keywords_text .. '</w:t></w:r></w:p>')
    meta['header-includes'] = meta['header-includes'] or {}
    table.insert(meta['header-includes'], keywords_block)
  end

  return meta
end

使用命令

执行以下Pandoc命令,将Markdown文件转换为docx时应用过滤器:

pandoc input.md -o output.docx --lua-filter=meta-to-docx.lua

关键说明

  • Pandoc的Lua过滤器通过Meta函数处理文档元数据,这里我们将thanks和keywords转换为docx支持的OpenXML段落,注入到文档头部
  • pandoc.utils.stringify用于将元数据中的文本块或数组元素转换为纯字符串
  • header-includes是Pandoc的内置元数据字段,用于将自定义内容插入到文档开头(标题、作者之后,正文之前)
  • 如果需要调整样式(比如让thanks用斜体、keywords用加粗),可以修改OpenXML代码,例如添加<w:i/>实现斜体,<w:b/>实现加粗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:55:16