如何分别在pandoc中为每个组成文件重新定义-top-level-division?

时间:2019-02-27 10:09:47

标签: text markdown pandoc m4

我有一堆.md个组成内容文件,标有标题###等。

我想灵活地编译新文档,其组成文件保持不变,但位于最终文档的ToC层次结构的不同级别。

例如:

  1. compiled-1.pdf中,# Foo中的顶级头文件constituent-1.md可能会以“ Chapter Foo”结尾-层次结构不变。

  2. 但是,在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 }}。

什么是最好的方法?

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

您可以组合并扩展这些构造块以编写自己的过滤器并定义扩展。这样,您就可以拥有一个包含所有子文件的主文档,并根据需要更改标题级别。