Кул стори

Как-то раз пару месяцев назад мне нужно было выступать на конференции и для этого нужно было сделать презентацию. Обычно я делал презентации в Powerpoint - это быстро, но грязно и неспортивно. Я давно слышал про LaTeX и стандартный шаблон для презентаций Beamer, который, во-первых, сразу выдаёт вас за продвинутого пользователя, во-вторых, красиво и ровно всё форматирует. На конференции нужно было выступать с несколькими графиками и табличками, которые я посчитал в RStudio. Дай-ка, думаю я, сделаю финт ушами: запилю красивую презенташку в Beamer, но сделаю это в RStudio через RMarkdown/knitr.
RStudio - мощная среда не только для работы с данными в R, но и с кучей плюшек, таких, как подключение системы контроля версий (git), создание интерактивных приложений Shiny и вёрстка документов в RMarkdown с конвертацией в HTML, PDF и Word.

Опции вывода RMarkdown в rStudio

Именно вёрстка и конвертация позволяет создавать максимально воспроизводимые исследования. В чём разница с традиционным подходом? Традиционно мы генерируем таблицы и графики после выполнения кода и вручную вставляем в текст отчёта или статьи, а иногда делаем всё вообще без кода и строим таблички и картинки в Excel. Сам текст обычно пишется в Word. Почему это плохо: во-первых, если с момента генерации картинок и табличек что-то изменилось в данных, то их снова нужно копировать и вставлять в вордовский документ. Результаты при этом могут измениться, а мы этого не заметим и допустим ошибку. Во-вторых, гораздо больше ручной работы: нужно сначала выполнить код, который сохранит таблички и картинки, потом их нужно вручную вставить в текст и что-то переписать в тексте. Что же является альтернативой? RMarkdown в RStudio.
RMarkdown - это подмножество языка разметки Markdown. В RStudio он позволяет писать единый документ, в котором есть и обычный текст, и куски кода (которые выполняются и становятся табличками, графиками и чем угодно), и сами данные, которые подгружаются и обрабатываются в коде. Выглядит это так:

Rmd in RStudio

Звучит интересно, правда? RStudio позволяет конвертировать наш RMarkdown в PDF, HTML и Word. Кроме того, можно создавать презентации в HTML или PDF (используя встроенный шаблон Beamer, используя тот же самый RMarkdown. PDF при этом создаётся после промежуточного перевода RMarkdown в LaTeX, который затем конвертируется в PDF. С этими мыслями начал делать презентацию в RStudio для перевода в PDF и сразу расстроился:

Beamer fail

При это конвертация презенташки в HTML работает из коробки. Для этого в RStudio используется два пакета - ioslides и Slidy (Slidy лучше форматирует, не ограничивает слайд одним размером экрана и в целом чище).
Окей, подумал я, интересно, а что будет, если я захочу сделать статью в PDF? Сработает ли всё из коробки?

PDF document fail

Что происходит? Нужно немного рассказать про то, как вообще получается PDF из RMarkdown.

Rmd convertion pipeline в RStudio

Rmd convertion pipeline

На первом этапе knitr анализирует .Rmd и выполняет куски кода (chunks), в результате чего получается .md-документ c приложениями вроде картинок. После этого он уходит в pandoc и там конвертируется в HTML, DOCX или PDF в зависимости от выбора, и для любого варианта используются шаблоны. В HTML и Word конвертация происходит напрямую, а для PDF промежуточным этапом является TeX-документ. TeX-документ затем конвертируется с помощью одного из движков: по умолчанию, pdflatex, но можно переключить на xelatex или что-то еще.

Поломка происходит на этапе конвертации в PDF, когда конвертер подбирает TeX-файл, и связана она с кириллицей/Юникодом. Полное и пошаговое решение можно увидеть в конце текста, сейчас я пошагово опишу, что и где отваливается. Давайте посмотрим на шаблон теховского документа, который показан в логе:

Типичный TeX-шаблон для RStudio

Опытным путём выяснилось, что проблема в подгружаемой для теха библиотеке шрифтов. Нужно просто дописать, чтобы загружал известный в русскоязычной TeX-среде babel:

\usepackage[russian]{babel}

Для Beamer шаблон в директории rmarkdown не найти, поскольку он встроен в сам Pandoc. Но можно написать в заголовке Rmd-документа опцию для принудительного включения библиотеки babel для русского языка:

---
title: "Мастер-класс по анализу данных решений арбитражных судов в R"
author: "Алексей Кнорре"
date: "4 марта 2017"
output:
  beamer_presentation
header-includes:
   - \usepackage[russian]{babel}
---

И это же работает для обычного Rmd документа, без правки TeX-шаблона. После этого Rmd-документы с русским языком (и документы, и презентации Beamer) спокойно конвертируются.

Важно не забыть, что babel должен быть установлен. Для этого нужно установить дистрибутив всего для TeX’а MiKTeX или TeXLive (весят несколько гигабайт, хотя для MiKTeX можно выбрать только отдельные библиотеки для установки).

Я попробовал воспроизвести всё то же самое в Ubuntu. Там возникают такие же проблемы, которые лечатся точно так же. Для Ubuntu есть альтернативный способ: не править шаблоны, а использовать другой движок для перевода TeX в PDF - xelatex. Для этого нужно установить TeXLive через менеджер пакетов, а потом прописать опцию в заголовке Rmd файла:

---
title: "Хвалёный UTF-8"
author: "Алексей"
date: "April 14, 2017"
output:
  pdf_document:
    latex_engine: xelatex
mainfont: FreeSans
---

Важно, чтобы был указан основной шрифт. Их много, но они довольно малоизвестные. Чтобы увидеть список доступных в Ubuntu шрифтов для TeX2PDF конверсии, можно в терминале ввести:

fc-list :outline -f "%{family}\n"

Источник на SO

Готовые Rmd/TeX шаблоны для PDF: статья, диссертация, презентация, CV

Вёрстка в LaTeX или RMarkdown лучше, чем вёрстка в Word. Однако код в LaTeX тяжело читать по сравнению с Rmd. Кроме того, для Rmd документов можно использовать пользовательские шаблоны, просто их нужно указывать в заголовке Rmd файла. Я попробовал адаптировать готовые шаблоны, которые разработал Стивен Миллер из Clemson University, которые позволяют напрямую из RStudio создавать PDF для академических презентаций, статей, диссертаций и резюме. Я немного поправил ссылки и добавил импорт библиотеки babel, что позволяет склонировать репозиторий и сразу же ими пользоваться без починки TeX-шаблонов, форк репозитория, готовый для работы с русским языком, здесь.

Немного ссылок:

Rmd to PDF in Linux

Больше стандартных шаблонов для Rmd

Примеры работы с knitr