Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rmarkdown中的自定义高亮显示样式_R_R Markdown_Syntax Highlighting - Fatal编程技术网

rmarkdown中的自定义高亮显示样式

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

有没有办法在rmarkdown中使用自定义高亮显示样式

手册对此有点沉默,最接近于此的是为所有内容创建一个完整的自定义css文件,但这只适用于html文档,而不适用于pdf文档(请参阅)

较新版本的Pandoc支持以下功能:

但是,如果指定了默认pandoc样式以外的任何其他样式,rmarkdown将抛出一个错误

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

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