我尝试使用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标签,但我还没有找到任何相关指南。
答案 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。