Как вставить R текстовые переменные в латексные выражения, сохраняя нормальное форматирование - PullRequest
2 голосов
/ 17 мая 2019

Я хочу создать заголовки разделов с циклом for, и мне удалось это сделать, однако текст застрял в математическом режиме форматирования. Я попытался использовать синтаксис Latex, чтобы отменить это, однако это не сработало, как ожидалось:

Код:

---
title: "Troubleshooting"
author: "Me"
output: pdf_document
header-includes:
  - \usepackage{amsmath}
---


```{r} 
words <- c("plz_work","better_yet","what_is_this")
```

```{r, results='asis', echo=FALSE}
for (i in 1:3) {
cat('\\subsection{$',words[i],'$}')
}
```

Выход:

math_converted_text

Если я использую латексную нотацию для преобразования ее в форматирование текста, ничего не изменится:

```{r, results='asis', echo=FALSE}
for (i in 1:3) {
cat('\\subsection{$\text{',words[i],'}$}')
}
```

Если я снова уйду из "$\text{..}$", т.е. "$\\text{..}$", я получу ошибку:

! Missing $ inserted.
<inserted text> 
                $
l.283 \subsection{$\text{ plz_work }$}

Error: Failed to compile test_delete_is_ok.tex. See test_delete_is_ok.log for more info.
Execution halted

Добавление побегов не помогает. Если я пытаюсь вставить эту переменную без математического режима, я получаю ту же ошибку, которую я только что перечислил:

```{r, results='asis', echo=FALSE}
for (i in 1:3) {
cat('\\subsection{',words[i],'}')
}
```

! Missing $ inserted.
<inserted text> 
                $
l.283 \subsection{ plz_work }

Error: Failed to compile test_delete_is_ok.tex. See test_delete_is_ok.log for more info.
Execution halted

1 Ответ

1 голос
/ 20 мая 2019

Как упомянул Samcarter, при использовании tex вам также необходимо знать о каких-либо специальных значениях, связанных с tex.

В этом случае - символ "_" используется в текстовом режиме для сигнализации о том, что нижний индекс должен последовать. При передаче моих строк R, которые содержали "_", в выражение tex, он выдавал бы ошибку, поскольку "_" зарезервирован для математического режима (если не экранирован) - вот почему я не получил ошибку, когда приложил его к $...$

Решением для меня было добавить экранирование перед каждым специальным символом tex:

#original
words <- c("plz_work","better_yet","what_is_this")

#modified version. Replace collapse with other tex functions if needed
words2 <- lapply(strsplit(words,"_"), paste, collapse = '\\_')
for (i in 1:3) {
cat('\\subsection{',words2[[i]],'}')
}

enter image description here

Подчеркивание здесь немного длинное, на мой взгляд, но вы можете легко заменить аргумент «коллапс» на что-то другое, что вы предпочитаете, например. ... collapse ='\\textunderscore ') ... тоже работает

...