将多个章节拼接在一起,每个章节都有 % 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
然而,这个输出根本不是我想要的:
- 来自第一个文件 (
a.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。
我有一些 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
然而,这个输出根本不是我想要的:
- 来自第一个文件 (
a.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。