Rmarkdown и вывод PDF: оцените уценку внутри раздела Latex - PullRequest
2 голосов
/ 09 мая 2020

Как я могу сделать возможным оценку кода уценки, используемого внутри Latex Code? (Rmarkdown с выводом PDF (Latex))

Очень простой минимальный пример:

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

Текущий вывод в файле .tex после компиляции с помощью knitr:

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

Ожидается :

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

Я был бы счастлив найти способ заставить это работать, потому что я пытаюсь найти способ, которым я могу передать tibble / dataframe через kable / kableExtra. Ячейки таблицы уже могут содержать код Latex, но не код уценки, поскольку kable конвертирует все в структуру Latex.

Мне кажется, что весь код Markdown внутри любого блока кода Latex не оценивается.

Я знаю, что могу достичь того же результата, просто используя Latex Code, но я предпочитаю использовать ярлыки Markdown везде, где это возможно.

Edit:

@ duckmayr любезно предложил рассмотреть еще один минимальный пример, чтобы увидеть, как можно автоматически изменить код латекса, созданный функциями R, чтобы заставить его работать (вместе с предложенным и принятым ответом, спасибо). Итак, я ищу какую-то оболочку, которая будет работать независимо от того, какую функцию R я использую (здесь: один базовый пример c 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")
```

Ответы [ 2 ]

3 голосов
/ 09 мая 2020

Кто-то открыл проблему на pando c Репозиторий GitHub об этом пару лет go, и мы можем найти там обходной путь : Создание синонимов LaTeX для \begin{} и \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}

Вывод 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:

enter image description here

Обновление: как насчет использования таких вещей, как kable()?

Чтобы иметь дело с такими вещами, как kable() в фрагментах R с results='asis', мы нужно исправить вывод 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"))
```

Мы добавили новую команду LaTeX в заголовок с \newcommand{\Newrow}{\\}, чтобы мы могли безопасно добавить \\ без их преобразования в \textbackslash{}. Это необходимо из-за того, как мы обманываем pando c для обработки уценки в среде между \Begin и \End.

Мы также добавили функцию R для исправления вывода LaTeX 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}

enter image description here

1 голос
/ 09 мая 2020

Если вам нужна только простая среда LaTeX, я бы порекомендовал вам использовать изолированные блоки Div в Markdown Pando c ( см. Этот раздел в кулинарной книге R Markdown для получения дополнительной информации ), например,

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

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

В изолированном блоке Div вы можете записывать произвольное содержимое Markdown. Кроме того, это также работает для вывода HTML.

Обратите внимание, что эта функция требует относительно новой версии Pando c и разрабатываемой версии rmarkdown . Вы можете попробовать предварительную версию RStudio (если вы используете RStudio) вместе с remotes::install_github('rstudio/rmarkdown').

...