html 编译为 pdf 的 R markdown 文档中的标签

html tags in an R markdown document compiled to pdf

我正在尝试使用 R Markdown 创建 pdf 文档,但在使用某些 html 标签时遇到问题。例如,R markdown 文档

---
output: pdf_document
---

<pre>
code1
</pre>

<code>
code2
</code>

<pre><code>
code3
</code></pre>

编译给

code2

当期望的输出是

code1
code2
code3

code3 设置了一些不错的格式。但是如果我编译成 html(output: html_document 而不是元数据中的 output: pdf_document),问题就解决了。

我正在使用下面的引擎在 Mac 上使用 TexShop 进行编译。

#!/bin/bash
/Library/Frameworks/R.framework/Versions/Current/Resources/bin/Rscript -e "rmarkdown::render(\"\", encoding='UTF-8')"

我怀疑在编译为 pdf 时不允许我使用某些 html 标签,但我找不到任何关于此的指南。

重要的是要记住 PDF 格式不是 HTML 并且对 HTML 标签一无所知。当文档转换为PDF时,文档的每一部分都需要转换为对应的PDF实体。因此,当您在文档中引入 non-standard raw HTML 时,转换器很容易混淆。

当然,转换器在引擎盖下的工作方式也会对输出产生一些影响。例如,如果您使用的工具将 Markdown 转换为 HTML,然后将 HTML 转换为 PDF,那么原始 HTML 可能更有可能被正确映射。但是,如果该工具直接从解析树(标记列表)到输出格式,那么它可能对原始 HTML 一无所知(除非它也是一个 HTML 解析器)。关键是使用 raw HTML 在转换为 PDF 时增加了另一个潜在的失败层。我的建议是在您缩进转换为 PDF 时尽可能避免使用它(记住 Markdown 最初只打算输出 HTML)。

事实证明,Markdown 已经提供了一种(或两种;取决于您使用的实现方式)标记代码块的方法:indented code blocks(以及可能的围栏代码块)。有趣的是,它们输出的 HTML 与您发现有效的原始 HTML 相同。也许这应该提供一个线索,表明您尝试的其他两种可能性都无效。

事实上,HTML 规范非常清楚代码块必须包含在 <pre><code> 标记中。 <pre> 标签是块级标签,因此不需要包裹在任何父标签中。但是,<pre> 标签并未将其内容标识为 "code"。因此,永远不应假定它包含 "code" 本身。另一方面,<code> 标签不是块级标签。它必须由块级标记包裹(如 <pre><p>...)。 <code> 标签是唯一将内容标记为 "code" 的标签。因此,在 HTML 中标记代码块的唯一有效方法是将其包装在 <pre><code> 标记中。事实证明,当您这样做时,它会起作用。因此,我的结论是转换器被无效 HTML 和失败(应该如此)所混淆。

因此,总而言之,要么使用原生 Markdown 方法来标记代码,要么,如果您必须使用原始 HTML,请坚持使用有效 HTML.