我有一堆.md
个组成内容文件,标有标题#
,##
等。
我想灵活地编译新文档,其组成文件保持不变,但位于最终文档的ToC层次结构的不同级别。
例如:
在compiled-1.pdf
中,# Foo
中的顶级头文件constituent-1.md
可能会以“ Chapter Foo”结尾-层次结构不变。
但是,在compiled-2.pdf
中,与完全相同的# Foo
相同的constituent-1.md
可能会以“ Section Foo”结尾---降级为第二级compiled-2.pdf
的ToC层次结构。
在每个组成.md
文件中,顶级标题始终为#
,每个组成.md
文件始终被视为一个完整的不可分割的单元。因此,所有构成文件的标头都将以相同的系数降级。另外,从不提升构成文件的标题。
我认为问题与为每个文件重新设置-top-level-divison
有关。
.yaml
配置和make
)?
但是也许更好的方法是为每个最终文档创建一个主文件,该主文件使用include ('constituent-1.md')
等和define ('level', '1')
等的组合建立组成文件的层次结构。根据每个文件的m4
用#
进行预处理,以搜索##
或用###
等替换level
,然后通过管道传输到{{1 }}。
什么是最好的方法?
答案 0 :(得分:1)
我认为这些是正确的想法,但不是正确的工具。除了使用m4之外,您可能还想检出pandoc filters,特别是内置Lua filters或出色的panflute python软件包。这些使您可以操纵实际的文档结构,而不仅仅是文本表示。
例如,此Lua过滤器将文档中的所有标头降级:
function Header (header)
header.level = header.level + 1
return header
end
类似地,您可以基于代码块定义自己的include语句:
```{include="FILENAME.md"}
```
包含此过滤器:
function CodeBlock (cb)
if not cb.attributes.include then
return
end
local fh = io.open(cb.attributes.include)
local blocks = pandoc.read(fh:read('*a')).blocks
f:close()
return blocks
end
还可以将过滤器仅应用于块的子集(需要一点技巧):
local blocks = …
local div = pandoc.Div(blocks)
local filtered_blocks = pandoc.walk_block(div, YOUR_FILTER).content
您可以组合并扩展这些构造块以编写自己的过滤器并定义扩展。这样,您就可以拥有一个包含所有子文件的主文档,并根据需要更改标题级别。