rmarkdown 中的自定义突出显示样式

Col*_*mbo 5 r syntax-highlighting r-markdown

有没有办法在 rmarkdown 中使用自定义突出显示样式?

\n\n

手册对此有点沉默,最接近的是为所有内容制作一个完整的自定义CSS文件,但是这只适用于html_document而不适用于pdf_document(请参阅https://bookdown.org/yihui/rmarkdown/html -document.html#外观和风格

\n\n

新版本的 Pandoc 支持此功能:\n http://pandoc.org/MANUAL.html#syntax-highlighting

\n\n

但是,当指定除默认 pandoc 样式之一之外的任何其他内容时,rmarkdown 会引发错误。

\n\n

例如,当我从highlight.js库下载zenburn.css时,修改它并想使用它:

\n\n
```\ntitle: Some title\noutput:\n    html_document:\n        theme: readable\n        highlight: zenburn.css\n```\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到:

\n\n
\n

match.arg(highlight, html_highlighters()) 中的错误:\n \'arg\' 应该是 \xe2\x80\x9cdefault\xe2\x80\x9d、\xe2\x80\x9ctango\xe2\x80\x9d 之一, \xe2\x80\x9cpygments\xe2\x80\x9d、\xe2\x80\x9ckate\xe2\x80\x9d、\xe2\x80\x9cmonochrome\xe2\x80\x9d、\xe2\x80\x9cespresso\xe2\x80\ x9d、\xe2\x80\x9czenburn\xe2\x80\x9d、\xe2\x80\x9chaddock\xe2\x80\x9d、\xe2\x80\x9ctextmate\xe2\x80\x9d\n 调用: ... -> pandoc_html_highlight_args -> match.arg\n 执行停止

\n
\n

Col*_*mbo 5

对于后代来说,因为这花费了比应有的时间更多的时间:

问题

@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
```
Run Code Online (Sandbox Code Playgroud)

将:

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

```
## [1] "foo"
```
Run Code Online (Sandbox Code Playgroud)

虽然第一个块将突出显示,但第二个块将仅以文本颜色显示,但背景始终为白色。这对于较暗的主题来说是非常有问题的,因为它们通常具有非常浅的文本颜色,并且这在白色背景下效果不佳。请参阅: https: //eranraviv.com/syntax-highlighting-style-in-rmarkdown/了解概述rmarkdown

HTML解决方案

highlight.js通过在突出显示和突出显示之间进行切换,这会变得更加复杂pandoc。如果未指定突出显示,highlight.js则与关联标签一起使用。在那里,突出显示是通过外部css.js库完成的,然后(我推测)将其散列到 HTML 中以使其独立。所以没有运气。

然而,如果使用某种突出显示样式,则pandoc使用突出显示。IE,:

---
title = "Foo"
output:
  html_document:
    theme: readable
    highlight: zenburn
---
Run Code Online (Sandbox Code Playgroud)

在这种情况下,有解决方案。查看 HTML 输出,有这样的结构:

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

这意味着只要特定代码块中没有样式(仅适用于“echo”块,因为默认情况下 rmarkdown 假定为 R),背景就是白色。只需在.Rmd文件中包含以下块即可更改此行为:

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

并且他们的行为可以相应地被完全指定。这里的颜色和背景与 zenburn 风格相反。输出如下所示:

前: 之前的 Zenburn

后: 禅燃后

PDF解决方案

使用 PDF,发现问题会更容易一些,但解决问题会更复杂一些。如果查看该.tex文件,您可以看到,虽然所有具有实际代码的块周围都有很多事情发生,但回显块仅包装在简单的逐字环境中。结果如下:

之前的 Zenburn PDF

虽然它比 HTML 输出更具可读性,但由于它不共享由突出显示样式定义的文本颜色,因此它有点融入到文本中,并创建和打破了输出之间统一样式的感觉。正如前面的答案中提到的,解决方案是使用:

---
title: "Foo"
output:
  pdf_document:
  highlight: zenburn
  includes:
    in_header: highlight_echo.tex
---
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这将verbatim环境重新定义为具有彩色背景和彩色文本。结果是“echo”块的统一格式:

Zenburn PDF 之后

再次感谢@tarleb 和@martin_schmelzer,没有你们我就无法解决这个问题!


Mar*_*zer 3

至少对于 HTML 文档,您可以使用cssYAML 选项简单地包含自定义样式:

---
title: Some title
output:
    html_document:
        theme: readable
        css: zenburn.css
---
Run Code Online (Sandbox Code Playgroud)

对于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}}}
Run Code Online (Sandbox Code Playgroud)

这些是定义代码突出显示的行。例如,第一个定义注释的颜色。您可以编写一个文件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}}} 
Run Code Online (Sandbox Code Playgroud)

并将其包含在文档正文之前

这是一个示例,我们在其中更改正文中评论和关键字的突出显示:

---
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)
```
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述