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

时间:2016-01-14 22:50:46

标签: r markdown knitr

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

---
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(\"$1\", encoding='UTF-8')"

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

1 个答案:

答案 0 :(得分:3)

重要的是要记住PDF格式不是HTML格式,并且不知道HTML标记。将文档转换为PDF时,需要将文档的每个部分转换为其对应的PDF实体。因此,当您在文档中引入非标准原始HTML时,转换器很容易混淆。

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

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

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

因此,总而言之,要么使用本机Markdown方法来标记代码,要么必须使用原始HTML,坚持使用有效的HTML。