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

时间:2018-11-29 02:31:16

标签: r r-markdown syntax-highlighting

是否可以在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会引发错误。

例如,当我从Highlight.js库下载zenburn.css时,对其进行修改并想要使用它:

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

我得到:

  

match.arg(highlight,html_highlighters())中的错误:     “ arg”应为“默认值”,“探戈”,“色素”,“ kate”,“单色”,“ espresso”,“ zenburn”,“ haddock”,“ textmate”之一   调用:...-> pandoc_html_highlight_args-> match.arg   执行停止

3 个答案:

答案 0 :(得分:2)

您似乎正在尝试将CS​​S文件用作突出显示样式。 (一般),这是行不通的,因为pandoc希望使用特殊的JSON格式定义突出显示样式。要使用修改后的zenburn,必须通过pandoc --print-highlight-style zenburn > myzenburn.style创建一个新样式文件,然后修改新文件myzenburn.style

要使用新样式,必须通过将必要的选项直接传递给pandoc来规避R Markdown。

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

但是,这仅适用于非HTML输出格式,因为每当可以使用highlight.js时,knitr都会进行干扰。

答案 1 :(得分:1)

至少对于HTML文档,您可以使用stroke-dasharray: auto 20 auto 20 YAML选项简单地包括自定义样式:

css

关于PDF文档,您可以检查中间的TeX文件。在那里,您会找到一系列类似的命令

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

这些是定义代码突出显示的行。例如,第一个定义注释的颜色。您可以编写一个\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}}} 

enter image description here

答案 2 :(得分:0)

为后代,因为这花费了更多的时间:

问题

@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"
```

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

HTML解决方案

highlight.jspandoc高亮显示之间进行切换会使情况变得更加复杂。如果未指定突出显示,则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>

这意味着只要特定代码块中没有样式(由于默认情况下rmarkdown假定为R,所以仅适用于“ echo”块),背景为白色。只需在.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,没有您,我将无法解决它!