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

