Rmarkdown 正在编织的 PDF 中打印乳胶代码

Rmarkdown is printing the latex code in the knited PDF

我 运行 结果很奇怪。我在 Rmarkdown 的文档中插入了一些 table 。这是 YAML:

---
output:
  pdf_document:
    toc: true
    toc_depth: 2
    number_sections: true
header-includes:
 \usepackage{float}
 \floatplacement{figure}{H}
 \floatplacement{table}{H}
---

第一个块:

{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE,
                      fig.pos = "H",
                      fig.width=8,
                      fig.height=7,
                      tab.pos = "H",
                      collapse = TRUE,
                      message = FALSE,
                      warning = FALSE,
                      comment = "#>"
)

knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())

options(knitr.kable.NA = "-")

table的插入方式是这样的:

kable(tableX, caption = "Caption", booktabs = TRUE) %>% 
  row_spec(0, bold=TRUE) %>% 
  kable_styling(bootstrap_options = "condensed") %>% 
  column_spec(1, italic = TRUE)

现在,大多数 tables 都被正确插入,但只有一个是用乳胶代码打印的,\begin{table},然后是 \caption{},然后是 table,最后是 \end{table}。怎么可能这样打印一个table,而且代码是一样的?

谢谢

当输出选项设置为pdf_document时,R markdown会生成latex代码(可以通过选择选项keep_tex并检查生成的.tex文件来查看latex代码)或者当输出设置为 latex_fragment.

knitr::kable 输出 table 的完整乳胶输出(当处于 tex 模式时),但会消耗任何字面提供的标题。 knitr 解释器然后使用生成的乳胶块。当在 \begin\end 环境语句之间的某处产生非法内容时(例如其中带有未转义的 % 的标题),解释器反而会产生转义的乳胶代码。

有效代码

```{r tab1, echo=F}
tableX=data.frame(col1 = "Empty data frame")
kable(tableX, caption = "Caption 20pct", booktabs = TRUE) |> 
  row_spec(0, bold=TRUE) |>
  kable_styling(bootstrap_options = "condensed") %>% 
  column_spec(1, italic = TRUE)
```

按预期生成乳胶代码:

\begin{table}

\caption{\label{tab:tab1}Caption 20pct}
\centering
\begin{tabular}[t]{>{}l}
\toprule
\textbf{col1}\
\midrule
\em{Empty data frame}\
\bottomrule
\end{tabular}
\end{table}

但是当 % 添加到标题时,乳胶代码生成中断。代码块

```{r tab1, echo=F}
tableX=data.frame(col1 = "Empty data frame")
kable(tableX, caption = "Caption 20%", booktabs = TRUE) |> 
  row_spec(0, bold=TRUE) |>
  kable_styling(bootstrap_options = "condensed") %>% 
  column_spec(1, italic = TRUE)
```

产生

\textbackslash begin\{table\}

\textbackslash caption\{\label{tab:tab1}Caption 20\%\} \centering

\begin{tabular}[t]{>{}l}
\toprule
\textbf{col1}\
\midrule
\em{Empty data frame}\
\bottomrule
\end{tabular}

\textbackslash end\{table\}

它只是在 pdf 中呈现为文字乳胶代码。

正如 rmarkdown 的作者 Yihui Xie 所指出的 here,您可以在 kable() 中禁用 character-escaping 参数以在 table 标题中包含 LaTeX 的空格字符,或者column/row 个名字,或两者。然后你需要通过在每个特殊字符前添加 \ 来手动转义这些字符。

```{r tab1, echo=F}
tableX=data.frame(col1 = "Empty data frame")
kable(
  tableX,
  caption  = "Caption 20\%",
  booktabs = TRUE,
  escape   = FALSE
  ) |> 
  row_spec(0, bold=TRUE) |>
  kable_styling(bootstrap_options = "condensed") %>% 
  column_spec(1, italic = TRUE)
```