Пользовательский стиль подсветки в rmarkdown - PullRequest
0 голосов
/ 29 ноября 2018

Есть ли способ использовать пользовательский стиль подсветки в rmarkdown?

Руководство немного об этом молчит, и самое близкое к этому - создать полноценный пользовательский CSS-файл для всего, что будет работатьтолько для html_document, но не для pdf_document (см. https://bookdown.org/yihui/rmarkdown/html-document.html#appearance-and-style)

Более новые версии Pandoc поддерживают это: http://pandoc.org/MANUAL.html#syntax-highlighting

, но когда что-либо еще, кроме одного из стилей pandoc по умолчаниюуказано, rmarkdown выдает ошибку.

Например, когда я загружаю zenburn.css из библиотеки highlight.js, изменяю его и хочу использовать:

```
title: Some title
output:
    html_document:
        theme: readable
        highlight: zenburn.css
```

Я получаю:

Ошибка в match.arg (highlight, html_highlighters ()): «arg» должно быть одним из «default», «tango», «pygments», «kate», «monochrome», «espresso».»,« Zenburn »,« пикша »,« textmate »Вызовы: ... -> pandoc_html_highlight_args -> match.arg Выполнение остановлено

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Похоже, что вы пытаетесь использовать файл CSS в качестве стиля выделения.Это не будет работать (в общем), так как pandoc ожидает, что стили выделения будут определены с использованием специального формата JSON.Чтобы использовать модифицированный zenburn, необходимо создать новый файл стиля через pandoc --print-highlight-style zenburn > myzenburn.style, а затем изменить новый файл myzenburn.style.

Чтобы использовать новый стиль, нужно обойти R Markdown, передавнеобходимые параметры непосредственно для pandoc.

output:
  html_document:
      theme: readable
      pandoc_args: --highlight-style=myzenburn.style

Однако это будет работать только для выходных форматов, отличных от HTML, поскольку knitr создает помехи всякий раз, когда можно использовать highlight.js.

0 голосов
/ 04 декабря 2018

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

Проблема

Ответы от @martin_schmelzer верны (не тестировал решение @ tarleb, поскольку rmarkdown предположительно не работаетхорошо играйте с Pandoc> 2.0 см .: https://github.com/rstudio/rmarkdown/issues/1471).Однако, когда вы пишете echo=TRUE в чанке, выводом является то, что код не помечен как R-код, и поэтому к нему применяются другие правила.В HTML это означает, что он имеет белый фон, а в PDF он форматируется только через дословную среду.Например, уценка следующая:

```{r, echo=TRUE}
foo = "bar"
foo
```

будет:

```r
foo = "bar"
foo
```

```
## [1] "foo"
```

И хотя первый фрагмент будет выделен, второй будет следовать только цветом текста, но фон будетвсегда будь белым.Это очень проблематично с более темными темами, поскольку они часто имеют очень светлый цвет текста, и это плохо сочетается с белым фоном.См. https://eranraviv.com/syntax-highlighting-style-in-rmarkdown/ для обзора rmarkdown стилей подсветки.

HTML-решение

Это усложняется переключением между highlight.js и pandoc подсветкой.Если выделение не указано, highlight.js используется со связанными тегами.Там выделение осуществляется через внешние библиотеки css и .js, которые затем (я полагаю) хэшируются в HTML, чтобы сделать его автономным.Так что не повезло.

Если используется какой-либо стиль подсветки, тогда используется pandoc подсветка.То есть:

---
title = "Foo"
output:
  html_document:
    theme: readable
    highlight: zenburn
---

В этом случае есть решение.Глядя на вывод HTML, есть такая структура:

<style typetext/css">
  pre:not([class]) {
    background-color: white;
  }
</style>

Это означает, что всякий раз, когда в конкретном фрагменте кода нет стиля (применяется только к фрагментам "echo", так как по умолчанию rmarkdown предполагает R),фон белый.Это поведение можно изменить, просто включив следующий фрагмент в файл .Rmd:

```{css, echo = FALSE}
  pre:not([class]) {
    color: #333333;
    background-color: #cccccc;
  }
```

, и их поведение может быть полностью определено соответствующим образом.Здесь цвет и фон как обратный стилю Zenburn.Вывод выглядит следующим образом:

До: Zenburn before

После: Zenburn after

PDF решение

С PDF легче найти проблему, но немного сложнее ее решить.Если вы посмотрите на файл .tex, вы увидите, что, хотя все фрагменты с реальным кодом имеют много общего вокруг них, блоки эхо-кода заключаются только в простую дословную среду.Результат выглядит следующим образом:

Zenburn PDF before

Хотя он более читабелен, чем вывод HTML, так как он не разделяет цвет текста, определенный стилем выделения,он как бы вписывается в текст и создает и разрушает ощущение единого стиля на всех выходах.Решение, как упомянуто в предыдущем ответе, состоит в использовании:

---
title: "Foo"
output:
  pdf_document:
  highlight: zenburn
  includes:
    in_header: highlight_echo.tex
---

и следующей конструкции, которая использует пакет framed, который уже включен:

\usepackage{xcolor}
\definecolor{backgroundecho}{HTML}{cccccc}
\definecolor{textecho}{HTML}{333333}

\let\oldverbatim=\verbatim
\let\oldendverbatim=\endverbatim

\makeatletter
\renewenvironment{verbatim}{
    \def\FrameCommand{
        \hskip-\fboxsep
        \color{textecho}
        \colorbox{backgroundecho}
        }
    \MakeFramed{\@setminipage}
    \oldverbatim
}
{
    \oldendverbatim
    \vskip-2em\@minipagefalse % The size required for this negative space is probably in some variable
    \endMakeFramed
}
\makeatother

Это переопределит verbatim среда, чтобы иметь цветной фон и цветной текст.Результатом является унифицированное форматирование фрагментов "echo":

Zenburn PDF after

Итак, еще раз спасибо @tarleb и @martin_schmelzer, я не смогу решитьэто без тебя!

0 голосов
/ 29 ноября 2018

По крайней мере, для документов HTML вы можете просто включить свои собственные стили, используя параметр css YAML:

---
title: Some title
output:
    html_document:
        theme: readable
        css: zenburn.css
---

Что касается документов PDF, вы можете проверить промежуточный файл TeX.Там вы найдете блок команд, которые выглядят как

\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.96,0.35,0.01}{\textit{#1}}}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.93,0.29,0.53}{\textbf{#1}}}

Это строки, которые определяют подсветку кода.Первый, например, определяет цвет для комментариев.Вы можете написать header.tex, в котором вы переопределите эти команды, используя \renewcommand

\renewcommand{\CommentTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{#1}}}
\renewcommand{\KeywordTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}} 

, и включить его в документ прямо перед телом.

Вот пример, в котором мы изменяем подсветку комментариев и ключевых слов в теле:

---
title: Some title
output: 
  pdf_document:
    keep_tex: true
---

```{r}
# This is a test
head(mtcars)
```
\renewcommand{\CommentTok}[1]{\textcolor[rgb]{0.96,0.35,0.01}{\textit{#1}}}
\renewcommand{\KeywordTok}[1]{\textcolor[rgb]{0.93,0.29,0.53}{\textbf{#1}}}
```{r}
# This is a test
head(mtcars)
```

enter image description here

...