当我将多个 markdown 文件从 markdown 转换为 pdf 时,我想使用 pandoc lua 过滤器。我希望将各个 Markdown 文件的标题用作章节(一级标题)。
我学习了现有的示例,我认为这个接近我需要的 - 基本上我需要将 pandoc.Header(1, doc.meta.title) 添加到我所有的 Markdown 文件中,但是我正在努力编写 lua 过滤器并使其工作。
我觉得这个题是在做类似的 Action pandoc filter in lua and walk_block
pandoc命令:
pandoc -N --lua-filter add-title.lua blog/*.md --pdf-engine=xelatex --toc -s -o my_book.pdf
add-title.lua(这是错误的,没有异常(exception),但输出没有任何反应):
function add_header (header)
return {
{Header = pandoc.Header(1, meta.title)}}
end
输入文件:
1.md
---
title: Topic1
---
## Sample Header from file 1.md
text text text
2.md
---
title: Topic2
---
## Sample Header from file 2.md
text text text
预期输出相当于这个 Markdown (但我的最终格式是pdf)
---
title: Title from pandoc latex variable
---
# Topic1
## Sample Header from file 1.md
text text text
# Topic2
## Sample Header from file 2.md
text text text
最佳答案
我认为关键问题是 lua 过滤器仅在整套文档被解析为单个 AST 后才运行。因此,在解析之前将各个文件有效地串联起来,以创建具有一组元数据的单个文档。在过滤器有机会运行之前,yaml 元数据 block 中的各个 title
设置将被覆盖。假设您需要从每个单独的元数据 block 中获取标题(并且不能直接将标题放入),这意味着您不能让 pandoc 加入文件。您将需要分别读取和解析每个文件。幸运的是,使用过滤器这很容易。
第一步是制作一个包含指向所有其他文件的链接的引用文件。
---
title: Combined title
---
![First file](1.md){.markdown}
![Second file](2.md){.markdown}
请注意,链接是使用具有特殊类 .markdown
的图像指定的。您可以使用其他方法,但图像很方便,因为它们支持属性并且易于识别。
现在我们只需要一个过滤器,它将用来自链接的 Markdown 文件的已解析元素替换这些图像。我们可以通过从 lua 打开文件,然后使用 pandoc.read
将它们解析为完整文档来完成此操作(参见 https://www.pandoc.org/lua-filters.html#module-pandoc)。一旦我们有了文档,我们就可以从元数据中读取标题并插入新的标题。请注意,我们将过滤器应用于 Para
元素而不是 Image
本身。这是因为pandoc将Block
元素和Inline
元素分开,过滤器的返回值必须是同一类型。 Image
过滤器无法返回从文件解析的 block 列表,但 Para
可以。
这是结果代码。
function Para(elem)
if #elem.content == 1 and elem.content[1].t == "Image" then
local img = elem.content[1]
if img.classes:find('markdown',1) then
local f = io.open(img.src, 'r')
local doc = pandoc.read(f:read('*a'))
f:close()
-- now we need to create a header from the metadata
local title=pandoc.utils.stringify(doc.meta.title) or "Title has not been set"
local newHeader=pandoc.Header(1, {pandoc.Str(title)})
table.insert(doc.blocks, 1, newHeader)
return doc.blocks
end
end
end
如果你在组合文件上运行它
pandoc -f markdown -t markdown -i combined.md -s --lua-filter addtitle.lua
你会得到
---
title: Combined title
---
Topic 1
=======
Sample Header from file 1.md
----------------------------
text text text
Topic 2
=======
Sample Header from file 2.md
----------------------------
text text text
根据需要。
请注意,包含文件中的任何其他 yaml 元数据都将丢失。您可以通过从单个 meta
对象中获取任何其他内容并将其放入全局对象中来捕获其他任何内容。
关于lua - 如何使用 pandoc lua 过滤器将标题添加为 1 级标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561584/