Rmarkdown 和 PDF 输出:在 Latex 部分评估 Markdown

Rmarkdown & PDF Output: Evaluate Markdown inside Latex section

我怎样才能使 Latex 代码中使用的降价代码得到评估? (带 PDF(Latex)输出的 Rmarkdown)

非常简单的最小示例:

\begin{center}
**should be bold text**
\end{center}

用 knitr 编译后 .tex 文件中的当前输出:

\begin{center}
**should be bold text**
\end{center}

预计:

\begin{center}
\textbf{should be bold text}
\end{center}

我很乐意找到一种方法来实现它,因为我试图找到一种方法可以将 tibble/dataframe 传递到 kable/kableExtra。 Table 单元格已经可以包含 Latex 代码,但不能包含降价代码,因为 kable 会将所有内容都转换为 Latex 结构。

在我看来,任何 Latex 代码块中的所有 Markdown 代码都不会被评估。

我知道我可以通过使用 Latex 代码实现相同的结果,但我更喜欢尽可能使用 Markdown 快捷方式。

编辑:

@duckmayr 友善地提出要查看另一个最小示例,以了解如何自动更改 R 函数生成的 Latex 代码以使其工作(连同建议和接受的答案,thx)。所以我正在寻找某种无论我使用什么 R 函数都可以工作的包装器(这里:一个基本的 R 示例和一个简单的 kable 测试;也可以是 Stargazer 或其他东西)

---
title: "Untitled"
output: 
  pdf_document:
    keep_tex: true
    df_print: kable
header-includes:
    - \let\Begin\begin
    - \let\End\end
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, results='hide', message=FALSE, warning=FALSE)
library(kableExtra)
```


```{r test1, results='asis'}
test = function(x=1){
  cat('\begin{center}\n**test**\n\end{center}')
}
test()
```

```{r test2, results='asis'}
kable(data.frame(x=c("**bold text**")),"latex")
```

有人打开 an issue on the pandoc GitHub repo about this a couple years ago, and we can find there a workaround:使 \begin{}\end{} 成为 LaTeX 同义词。所以,要在 R Markdown 中使用它,我们只需将它们放在 header-includes:

---
title: "Stack Overflow Answer"
author: "duckmayr"
date: "5/9/2020"
output:
    pdf_document:
        keep_tex: true
header-includes:
    - \let\Begin\begin
    - \let\End\end
---

\Begin{center}

**should be bold text**

\End{center}

LaTeX 输出:

... Many initial lines skipped ...
\let\Begin\begin
\let\End\end

\title{Stack Overflow Answer}
\author{duckmayr}
\date{5/9/2020}

\begin{document}
\maketitle

\begin{center}

\textbf{should be bold text}

\end{center}

\end{document}

PDF 输出:

更新:使用 kable() 之类的东西怎么样?

为了处理在 results='asis' 的 R 块中使用 kable() 之类的东西,我们需要修复 kable() 的输出;也就是说,我们需要将其 \begin{}\end{} 标签更改为 \Begin{}\End{},并且我们还需要确保我们不会最终转换\ 个序列到 textbackslash{} 个。以下是我们的做法:

---
title: "Untitled"
output: 
  pdf_document:
    keep_tex: true
    df_print: kable
header-includes:
    - \let\Begin\begin
    - \let\End\end
    - \newcommand{\Newrow}{\}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, results='hide', message=FALSE, warning=FALSE)
library(kableExtra)
allow_markdown <- function(tex) {
    tex <- gsub("begin", "Begin", tex) ## fix \begin{} tags
    tex <- gsub("\\end", "\n\\End", tex) ## fix \end{} tags
    tex <- gsub("\\\\", "\\Newrow\n", tex) ## fix new row \
    return(tex)
}
```

```{r test2, results='asis'}
kable(data.frame(x=c("**bold text**")),"latex")
```

```{r test3, results='asis'}
allow_markdown(kable(data.frame(x=c("**bold text**")), "latex"))
```

我们在 header 和 \newcommand{\Newrow}{\} 中添加了一个新的 LaTeX 命令,这样我们就可以安全地添加 \ 而不会将它们转换为 \textbackslash{}。这是必要的,因为我们如何欺骗 pandoc 在 \Begin\End 之间的环境中处理降价。

我们还添加了一个 R 函数来修复 kable() 的 LaTeX 输出,修复了开始和结束标记以及新行 \ 个字符。

然后我们得到以下 LaTeX 和 PDF 输出:

[header omitted]
\begin{document}
\maketitle

\begin{tabular}{l}
\hline
x\
\hline
**bold text**\
\hline
\end{tabular}

\begin{tabular}{l}
\hline

x\

\hline

\textbf{bold text}\

\hline

\end{tabular}

\end{document}

如果您只需要一个简单的 LaTeX 环境,我建议您在 Pandoc 的 Markdown 中使用围栏 Div 块(see this section in the R Markdown Cookbook 了解更多信息),例如,

::: {.center}
**should be bold text**

```{r}
knitr::kable(head(iris))
```
:::

在围栏Div块中,您可以编写任意Markdown内容。此外,这也适用于 HTML 输出。

请注意,此功能需要相对较新版本的 Pandoc,以及 rmarkdown 的开发版本。您可以尝试 RStudio Preview version (如果您使用 RStudio),以及 remotes::install_github('rstudio/rmarkdown').