Rmarkdown & PDF Output: Оценете Markdown в секцията Latex

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

Много прост минимален пример:

\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 Code, но предпочитам да използвам преките пътища Markdown, където е възможно.

Редактиране:

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

person joffdd    schedule 09.05.2020    source източник


Отговори (2)


Някой отвори проблем в репото на pandoc GitHub за това преди няколко години и можем да намерим там заобиколно решение: Създаване на 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 изход:

въведете описание на изображението тук

Актуализация: Какво ще кажете за използването на неща като kable()?

За да се справим с използването на неща като kable() в R парчета с results='asis', ще трябва да коригираме изхода на kable(); а именно, ще трябва да променим неговите \begin{} и \end{} тагове на \Begin{} и \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.

Също така добавихме 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}

въведете описание на изображението тук

person duckmayr    schedule 09.05.2020
comment
Благодаря @duckmayr, доста ясно! Имате ли представа кой би бил най-умният начин да замените \begin с \Begin, ако Latex кодът всъщност е произведен от част от R код (с results="asis"), т.е. от функция в R пакет, която не мога просто да пренапиша? - person joffdd; 09.05.2020
comment
@joffdd Вероятно бихте могли да обвиете извикването на R функция с gsub("begin", "Begin", foo(x)), където foo(x) е вашето действително извикване на функция. Ще трябва да се погрижите и за end/End, така че вероятно gsub("begin", "Begin", gsub("end", "End", foo(x))). Бихте ли могли да редактирате въпроса си, за да имате възпроизводим пример за тази част от проблема си? Бих могъл лесно да проверя и/или адаптирам първоначалната си мисъл. - person duckmayr; 09.05.2020
comment
Странно е, че Pandoc променя \Begin и \End в техните версии с малки букви. - person user2554330; 09.05.2020
comment
@user2554330 Да, това е доста интересно, не се сетих за това - person duckmayr; 09.05.2020
comment
@joffdd Вижте актуализацията! Радвам се, че добавихте този допълнителен въпрос, мисля, че значително подобрява полезността на отговора! - person duckmayr; 09.05.2020
comment
@duckmayr Благодаря много! в момента в моята по-голяма кабелна таблица все още срещам проблеми, тъй като има случаи на \begingroup, които също са заменени. Но ще се опитам да разреша това сам и ще публикувам, когато получа решение :) - person joffdd; 09.05.2020

Ако имате нужда само от проста LaTeX среда, бих ви препоръчал да използвате оградени Div блокове в Markdown на Pandoc (вижте този раздел в R Markdown Cookbook за повече информация), напр.

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

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

В оградения Div блок можете да пишете произволно Markdown съдържание. Освен това, това работи и за HTML изход.

Обърнете внимание, че тази функция изисква сравнително нова версия на Pandoc и версията за разработка на rmarkdown. Можете да опитате версията на RStudio Preview (ако използвате RStudio), заедно с remotes::install_github('rstudio/rmarkdown') .

person Yihui Xie    schedule 09.05.2020