是否可以在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 执行停止
答案 0 :(得分:2)
您似乎正在尝试将CSS文件用作突出显示样式。 (一般),这是行不通的,因为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}}}
答案 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/。
在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>
这意味着只要特定代码块中没有样式(由于默认情况下rmarkdown假定为R,所以仅适用于“ echo”块),背景为白色。只需在.Rmd
文件中包含以下块即可更改此行为:
```{css, echo = FALSE}
pre:not([class]) {
color: #333333;
background-color: #cccccc;
}
```
及其行为可以完全指定。这里的颜色和背景与zenburn风格相反。输出看起来像这样:
使用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,没有您,我将无法解决它!