Как указать параметры kableExtra с форматом kbl = «markdown»?

Я пытаюсь включить цитаты из файла .bib в таблицу kable в Rmarkdown, используя bookdown. Цитаты работают, если я указываю format = "markdown" в кабеле с помощью kableExtra::kbl(). Но добавление этого к дополнительным параметрам форматирования kable_styling больше не работает и приводит к предупреждениям:

---
title: "Citation in landscape table"
site: bookdown::bookdown_site
output: 
  bookdown::pdf_book:
bibliography: [ref.bib]
biblio-style: apalike
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library('kableExtra')
```

```{r}
tmp <- data.frame('line' = c(1:3), 'ref' = c("no ref", "@R-base", "no ref"))
kbl(tmp, format = "markdown", longtable = TRUE, booktabs = TRUE, escape = FALSE) %>%
 kable_styling(latex_options =c("striped", "hold_position", "repeat_header", "scale_down")) %>%
 column_spec(2, width = "20em") %>%
 landscape()
```

Это приводит к предупреждающим сообщениям в созданном PDF-файле:

## Warning in kableExtra::kable_styling(., latex_options = c("striped",
## "hold_position", : Please specify format in kable. kableExtra can customize
## either HTML or LaTeX outputs. See https://haozhu233.github.io/kableExtra/ for
## details.
## Warning in column_spec(., 2, width = "20em"): Please specify format in
## kable. kableExtra can customize either HTML or LaTeX outputs. See https://
## haozhu233.github.io/kableExtra/ for details.
## Warning in kableExtra::landscape(.): Please specify format in kable. kableExtra
## can customize either HTML or LaTeX outputs. See https://haozhu233.github.io/
## kableExtra/ for details

Если я исключаю опцию format = "markdown", предупреждения исчезают, и я получаю правильную таблицу в альбомном формате, но цитирование больше не работает.

Как мне получить как горизонтальную таблицу с параметрами, указанными в kable_styling(), так и рабочие цитаты в таблице?

Содержимое ref.bib:

@Manual{R-base,
  title = {R: A Language and Environment for Statistical
           Computing},
  author = {{R Core Team}},
  organization = {R Foundation for Statistical Computing},
  address = {Vienna, Austria},
  year = {2019},
  url = {https://www.R-project.org},
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 441
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предупреждения говорят вам, что функции стиля kable не применяются к формату markdown, поэтому вам действительно нужно использовать format = "latex" (по умолчанию).

Чтобы ссылки работали внутри таблицы, нам нужно приложить некоторые дополнительные усилия и использовать LaTeX только для обработки ссылок (вместо того, чтобы позволить Knitr предварительно разобраться).

  1. Настройте файл .tex preamble.tex, который включает подходящий пакет LaTeX (например, natbib) и определяет стиль библиографии:

    preamble.tex

    \usepackage{natbib}
    \bibliographystyle{unsrtnat}
    
  2. Включите преамбулу в заголовок .Rmd YAML:

    output: 
    bookdown::pdf_book:
    includes: 
      in_header: preamble.tex
    
  3. Включите библиографию, добавив \bibliography{ref} в свой .Rmd. Используйте \cite{<your_reference>} для ссылки в тексте. Обратите внимание, что \ — это специальный символ для R, и его необходимо экранировать дополнительным \, если он используется внутри строки:

    tmp <- data.frame(
     'line' = c(1:3), 
     'ref' = c("no ref", "\\cite{R-base}", "no ref")
    )
    

Пример:

Let's check that citations work: R \citep{R-base} is great!

```{r}
kbl(tmp, booktabs = T, escape = F) %>%
 kableExtra::kable_styling(
   latex_options = c("striped", "hold_position", "repeat_header")
   ) %>%  
  column_spec(2, width = "50em") %>%
landscape()
```

Спасибо @М. О. Пришлось добавить \bibliography{ref} в тело документа, чтобы natbib мог найти файл bib, вместо того, чтобы указывать его в заголовке YAML. Но теперь это работает. Есть одна опечатка: in_header: preample.tex должно быть in_header: preamble.tex

VincentH 16.12.2020 09:57

@VincentH Извините, торопился; Я исправил это! Было бы неплохо, если бы вы тогда приняли ответ.

Martin C. Arnold 16.12.2020 12:00

Другие вопросы по теме