r - Rmarkdown 和 PDF 输出:评估 Latex 部分中的 Markdown
问题描述
我怎样才能使在 Latex 代码中使用的降价代码得到评估?(带有 PDF(乳胶)输出的 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}
我很乐意找到一种方法来实现这一点,因为我试图找到一种方法来通过 kable/kableExtra 传递 tibble/dataframe。表格单元格已经可以包含 Latex 代码,但没有 markdown 代码,因为 kable 将所有内容都转换为 Latex 结构。
在我看来,任何 Latex 代码块中的所有 Markdown 代码都没有得到评估。
我知道我可以通过使用 Latex 代码来获得相同的结果,但我更喜欢尽可能使用 Markdown 快捷方式。
编辑:
@duckmayr 好心地提出审查另一个最小示例,以了解如何自动更改 R 函数生成的 Latex 代码以使其工作(连同建议和接受的答案,谢谢)。所以我正在寻找一种无论我使用什么 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")
```
解决方案
几年前有人在 pandoc GitHub repo 上打开了一个关于这个的问题,我们可以在那里找到一个解决方法:Making LaTeX synonyms for \begin{}
and \end{}
。因此,要在 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}
乳胶输出:
... 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()
?
为了处理kable()
在 R 块中使用类似的东西results='asis'
,我们需要修复 ; 的输出kable()
。即,我们需要将其\begin{}
and\end{}
标签更改为\Begin{}
and \End{}
,并且我们还需要确保最终不会将\\
序列转换为textbackslash{}
s。以下是我们的做法:
---
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"))
```
我们在标题中添加了一个新的 LaTeX 命令,\newcommand{\Newrow}{\\}
这样我们就可以安全地添加\\
而不会将它们转换为\textbackslash{}
. 这是必要的,因为我们如何欺骗 pandoc 在\Begin
和之间的环境中处理降价\End
。
我们还添加了一个用于修复 LaTeX 输出的 R 函数,该函数kable()
修复了开始和结束标记以及新的行\\
字符。
然后我们得到以下 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}
推荐阅读
- ios - 为什么我的 rx 订阅没有在我的 onNext 上触发?
- mrtk - MRTK2 在没有对撞机的情况下检测空气水龙头
- ios - 如何使用 Swift 将存储的值转换为 JSON 格式?
- sql - 如何控制 Spark SQL 查询的输出文件数?
- c# - 使用 C# 的 AES 加密
- javascript - Reactjs 光滑的幻灯片
- javascript - 反应模态自定义组件未显示正确数据
- sql - 加入表格的最佳方法是什么
- java - 解析 2.000,00 到 2000 和 2.000,15 到 2000.15
- javascript - ResizeObserver 在 Edge 和 Firefox for Android 中不起作用