将多个章节拼接在一起,每个章节都有 % header

Stitching together multiple chapters, each with a % header

我有一些 Markdown 文件,每个文件都使用 % 语法来设置它们的标题,例如

% A nice chapter

Lorum ipsum ....

# First section

Blah blah

如果我将它们 one-by-one 编译为 HTML,这些章节标题将成为页面标题,这正是我想要的。

但是,我想使用相同的输入文件来生成单个 PDF,其中包含 table 的内容。所以我尝试了

$ pandoc --toc -o full.pdf a.md b.md

然而,这个输出根本不是我想要的:

如何 assemble 将包含章节的 Markdown 文件合并到一本书中?

Pandoc 的 % 语法实际上是针对 document titles 的。 Pandoc 每次转换仅对一个文档进行操作(因此,如果您有多个输入文件,它们基本上会在处理前连接起来)。

您可以改为使用标题:

# title one

连同将 top-level-division 设置为 chapter 甚至 part:

pandoc --top-level-division=chapter --toc -o full.pdf a.md b.md

@mb21 的建议是使用 # 作为章节标题,即将所有内容移动一级。这样,pandoc --top-level-division=chapter --toc 确实做了正确的事情,但是相同的文件在 HTML 后端不能很好地工作:如果我没有 % 标题,它会抱怨

[WARNING] This document format requires a nonempty <title> element.
  Please specify either 'title' or 'pagetitle' in the metadata,
  e.g. by using --metadata pagetitle="..." on the command line.
  Falling back to 'a'

所以我们似乎遇到了一个难题,要么 HTML 输出正确,要么 PDF 正确,但不能同时正确。

解决方案是存储文件 % 用于(章节)标题和 # 用于顶部部分等(即 HTML-compatible 格式),然后将它们转换为PDF-compatible 即时格式化。我最后写的 Makefile 规则是:

RetroClash.pdf: $(MARKDOWNS)
    ($(foreach MARKDOWN, $^, sed -e '$$a\' -e 's/^#/##/' -e 's/^% /# /' $(MARKDOWN);)) | \
    pandoc --top-level-division=chapter --toc --toc-depth=2 -o $@

第一行遍历每个输入 .md 文件,并将其转换为:

  • Adds a newline to the end of each file 确保每个章节标题都在一个新段落上
  • 将每个 # 标题下移一个,即将 # 转换为 #### 转换为 ### 等等
  • % 标题替换为 #

然后所有转换后的 Markdown 文件的串联作为单个输入传递给 Pandoc。