【问题标题】:Compile multiple files into one with title blocks使用标题栏将多个文件编译为一个
【发布时间】:2014-01-21 02:24:04
【问题描述】:

我想知道如何将多个 pandoc 文件编译成一个输出文档,每个输入文件都有一个标题栏

例如假设我有两个文件:

ch1.md:

% Chapter 1
% John Doe
% 1 Jan 2014
Here is chapter 1.

ch2.md:

% Chapter 2
% Jane Smith
% 3 Jan 2014
Here is chapter 2.

通常有多个输入文件,您可以通过将它们提供给 pandoc 来编译它们:

pandoc ch1.md ch2.md --standalone -o output.html

但是 pandoc 在编译之前连接输入文件,这意味着只有 first 标题块(来自ch1.md)被适当地设置样式。 我希望 每个 标题栏的样式适当(例如,在 html 中,标题栏的第一行样式为 <h1 class="title">,第二行样式为 <h2 class="author"> 等等)。

(注意:我还尝试将每个章节单独编译,然后使用 pandoc 将它们连接在一起。这会删除 1 之后章节的标题样式,但保留作者/日期的样式)。

为什么?我可以:

  • 在单独的文档中编译每一章,并适当标记作者/标题/日期
  • 一起编译整个文档,并为每一章适当地标记作者/标题/日期(可以使用--chapters 选项)

我可以直接在每个章节文件中用“#”(h1)指定标题,用“##”(h2)指定作者,用“###”(h3)直接指定日期,但这意味着 pandoc 没有“知道”我的文档的标题/标题/日期是什么,因此(例如)如果我编译为乳胶,它将不会正确使用 \date{}\author{} 标签。

【问题讨论】:

  • 您可能想单独编译它们,然后用 pdf 连接器连接它们。我会将这个问题提请邮件列表的注意,希望有人有更好的解决方案。
  • @Shahbaz - 我不想受限于 PDF,但是如果我对 PDF 输出感兴趣,那就可以了。我现在已经想出了一个足够好的解决方案。
  • 试试pandoc ch1.md ch2.md --standalone -o output.html --file-scope。根据文档,这将“在组合多文件文档之前单独解析每个文件。这将允许具有相同标识符的不同文件中的脚注按预期工作。如果设置此选项,脚注和链接将无法跨文件工作。读取二进制文件(docx、odt、epub)意味着 --file-scope."

标签: pandoc


【解决方案1】:

我写了一个pandoc filter,当在每个单独的章节文件上运行时,插入标题块作为标题(1 级为标题,2 级为作者,3 级为日期。这就是 HTML 编写器所做的)。

这使您可以在每个章节上单独运行 pandoc(以生成 pandoc 的输出和格式化的标题块),然后在所有章节上运行 pandoc一起以编译单个文档。

过滤器就在这里(我不对代码故障等负责):https://gist.github.com/mathematicalcoffee/e4f25350449e6004014f

如果你希望它的格式不同,你可以修改它(例如,作者/日期出现在目录中,因为它们是标题,这不太正确......但这是一个不同的问题,因为它发生了也使用默认的 HTML 编写器)。

我的工作流程现在是这样的:

FORMAT=latex  # as understood by -t <format> in pandoc
FLAGS=--toc   # other flags for pandoc, --smart, etc
OUT=pdf       # output extension
for f in Chapter*.md; do \
    pandoc $FLAGS -t $FORMAT --filter ./chapter.hs $f; \
    echo ""; \
done | pandoc $FLAGS --standalone -o thesis.$OUT

我的chmod +x chapter.hs 位于当前目录中。

(我还有一个title.txt,我把整个论文的标题栏(而不是每章的标题栏)放在前面。

我从pandoc google group 那里得到了一些帮助,这很棒。

【讨论】:

    【解决方案2】:

    % 标题栏无法做到这一点,但您可以使用新的 YAML 标题栏做到这一点。

    像这样开始每个文档:

    ---
    title:  Chapter One
    author:  Me
    date: June 4
    ...
    

    当文档连接在一起时,第一个值集将优先于其他值集,因此使用相同参数(例如“标题:”)的后续 YAML 行将被忽略。 (参见“扩展名:yaml_metadata_block”下的readme。)

    【讨论】:

    • 这可以单独编译每个文档,但是当我一起编译文档时,我会丢失后续章节的标题等(因为忽略了后续的 YAML 块)。目前,我只有一个 Makefile,在将单独的文档一起编译时(将标题块降级为章节),将标题/作者/日期的 % 块替换为 '#'、'##' 等。我想在将文档编译为章节时,我应该编写一个适当的脚本来将每个标题降级一个级别? (我想用乳胶你必须选择说第一章作为文档标题/作者)。
    猜你喜欢
    • 2018-07-04
    • 2016-01-14
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多