Для потомков, поскольку это заняло больше времени, чем следовало бы:
Проблема
Ответы от @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.Вывод выглядит следующим образом:
До:
После:
PDF решение
С PDF легче найти проблему, но немного сложнее ее решить.Если вы посмотрите на файл .tex
, вы увидите, что, хотя все фрагменты с реальным кодом имеют много общего вокруг них, блоки эхо-кода заключаются только в простую дословную среду.Результат выглядит следующим образом:
Хотя он более читабелен, чем вывод 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":
Итак, еще раз спасибо @tarleb и @martin_schmelzer, я не смогу решитьэто без тебя!