在header-includes中停止knitr“清理”字符

时间:2017-03-27 05:08:07

标签: r knitr r-markdown

我正在创建一个文档,其中某些表包含一些受益于this解决方案的列,以强制包装文本条目的右对齐。

为了实现该解决方案,我在序言中包括以下内容:

\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1\linewidth}}

要使用knitr实现此目的,我尝试了:

---
output:
  pdf_document:
    keep_tex: yes
header-includes:
  - \usepackage{array}
  - \newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1\linewidth}}
---

但这失败了,错误:

  

! LaTeX错误:缺少\ begin {document}。

     

...

     

l.83 \ newcolumntype {R} {[} 1

     

pandoc:生成PDF时出错

     

错误:pandoc文档转换失败,错误43

检查.tex输出,很清楚出了什么问题:

\usepackage{array}
\newcolumntype{R}{[}1{]}\{\textgreater{}\{\raggedleft\arraybackslash\}p\{\#1\linewidth\}\}

knitr已将>转换为\textgreater{},将{转换为\{,将}'转换为\}[ } {[}]{]}#\#。我当然希望 none 进行这些自动转换。

This问题解决了同一个问题,但在这种情况下有一个解决方法解决了这个问题(在YAML中引用) - 引用和转义\产生相同的输出,引用而不转义\会产生“无法识别的控制序列”错误。

如何让knitr不要操纵我的输入?

2 个答案:

答案 0 :(得分:3)

您可以(并且应该)使用includes选项(请参阅documentation)。额外的好处是您的LaTeX代码将仅应用于LaTeX输出。如果您在YAML元数据中使用header-includes,它将应用于所有可能的输出格式,例如即使你将Rmd编译为HTML。

BTW, knitr 不会清理YAML中的任何字符。 Pandoc确实。

答案 1 :(得分:1)

https://github.com/jgm/pandoc/issues/4473#issuecomment-419667477启发,另一种方法是从pandoc逃脱LaTeX代码(请注意,为了方便起见,我也将yaml多行样式更改为'|'):

---
output:
  pdf_document:
    keep_tex: yes
header-includes: |
  \usepackage{array}
  ```{=latex}
  \newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1\linewidth}}
  ```
---