rmarkdown中的自定义高亮显示样式
有没有办法在rmarkdown中使用自定义高亮显示样式 手册对此有点沉默,最接近于此的是为所有内容创建一个完整的自定义css文件,但这只适用于html文档,而不适用于pdf文档(请参阅) 较新版本的Pandoc支持以下功能: 但是,如果指定了默认pandoc样式以外的任何其他样式,rmarkdown将抛出一个错误 例如,当我从highlight.js库下载zenburn.css时,修改它并想要使用它:rmarkdown中的自定义高亮显示样式,r,r-markdown,syntax-highlighting,R,R Markdown,Syntax Highlighting,有没有办法在rmarkdown中使用自定义高亮显示样式 手册对此有点沉默,最接近于此的是为所有内容创建一个完整的自定义css文件,但这只适用于html文档,而不适用于pdf文档(请参阅) 较新版本的Pandoc支持以下功能: 但是,如果指定了默认pandoc样式以外的任何其他样式,rmarkdown将抛出一个错误 例如,当我从highlight.js库下载zenburn.css时,修改它并想要使用它: ``` title: Some title output: html_documen
```
title: Some title
output:
html_document:
theme: readable
highlight: zenburn.css
```
我得到:
match.arg(突出显示,html\u highlighters())中出错:
“arg”应该是“default”、“tango”、“pygments”、“kate”、“monology”、“espresso”、“zenburn”、“haddock”、“textmate”中的一个
电话:…->pandoc\u html\u高亮显示\u args->match.arg
停止执行
至少对于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)
```
您似乎试图使用CSS文件作为突出显示样式。这(通常)不起作用,因为pandoc希望使用特殊的JSON格式定义突出显示样式。要使用修改过的zenburn,必须通过
pandoc--print highlight style zenburn>myzenburn.style
,创建一个新的样式文件,然后修改新文件myzenburn.style
要使用新样式,必须通过将必要的选项直接传递给pandoc来绕过R标记
output:
html_document:
theme: readable
pandoc_args: --highlight-style=myzenburn.style
但是,这只适用于非HTML输出格式,因为只要可以使用highlight.js,knitr就会干扰。对于后代来说,这需要更多的时间: 问题 来自@martin_schmelzer的答案是正确的(没有测试@tarleb的解决方案,因为rmarkdown在Pandoc>2.0上的表现不好,请参见:)。但是,当您在块上写入
echo=TRUE
时,输出的是未标记为R代码的代码,因为适用于它的规则不同。在HTML中,这意味着它有白色的背景,而PDF格式仅通过逐字记录环境进行格式化。例如,以下各项的降价:
```{r, echo=TRUE}
foo = "bar"
foo
```
将是:
```r
foo = "bar"
foo
```
```
## [1] "foo"
```
虽然第一个区块将高亮显示,但第二个区块将仅以文本颜色显示,但背景将始终为白色。对于较暗的主题,这是非常有问题的,因为它们通常有非常浅的文本颜色,这与白色背景的效果不好。请参阅:有关突出显示样式的概述
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>
它们的行为也可以相应地得到充分说明。这里的颜色和背景与zenburn风格相反。输出如下所示:
之前:
之后:
PDF解决方案
使用PDF,查找问题稍微容易一点,但解决问题稍微复杂一点。如果查看.tex
文件,您可以看到,虽然所有包含实际代码的块都有很多围绕着它们进行的操作,但回音块仅包装在简单的逐字记录环境中。结果如下所示:
虽然它比HTML输出更具可读性,但由于它不共享突出显示样式定义的文本颜色,因此它在某种程度上融入了文本,并在输出之间创建和打破了统一样式的感觉。如前一个答案所述,解决方案是使用:
---
title: "Foo"
output:
pdf_document:
highlight: zenburn
includes:
in_header: highlight_echo.tex
---
以及利用已包含的包框架的以下构造:
\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
这将重新定义逐字打印
环境,使其具有彩色背景和彩色文本。结果是“echo”块的统一格式:
所以再次感谢@tarleb和@martin_schmelzer,没有你我无法解决它 @Marius这真是一个奇怪的评论。首先,我并没有尝试使用自定义主题,而是使用自定义突出显示主题。这在这里是一个很大的区别,因为虽然支持自定义CSS(但仅适用于HTML),但自定义突出显示却不受支持:其次,我问的问题是“它可以做到吗?如何做到?”而不是“我做错了什么?”pandoc的版本与此无关。除非代码中有什么我读错了。我完全错过了pandoc_args。但使用@martin_schmelzer answer定制的css+头似乎更具可移植性,因为它甚至适用于较旧的Pandoc版本。请看这里:每个样式都有相同的回音块背景。我还没有找到改变它的方法(我不擅长CSS)。你能详细说明一下吗?你说的回声块是什么意思?您想更改什么颜色?当您执行echo=TRUE
时,它将创建额外的代码块,我们称之为echo chunk。此回显块具有不同的格式,背景颜色为白色(不考虑高亮显示样式)。这对于黑色样式来说是有问题的
\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