gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:33:43 26 4
gpt4 key购买 nike

有没有办法在 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
```

我得到:

Error in match.arg(highlight, html_highlighters()) : 'arg' should be one of “default”, “tango”, “pygments”, “kate”, “monochrome”, “espresso”, “zenburn”, “haddock”, “textmate” Calls: ... -> pandoc_html_highlight_args -> match.arg Execution halted

最佳答案

对于后代,因为这花费了比它应该更多的时间:
问题
@martin_schmelzer 的答案是正确的(没有测试@tarleb 的解决方案,因为 rmarkdown 据说不能与 Pandoc > 2.0 一起使用,请参阅:https://github.com/rstudio/rmarkdown/issues/1471)。然而,当你写 echo=TRUE在 block 上,输出是代码未标记为 R 代码,因此适用于它的规则不同。在 HTML 中,这意味着它具有白色背景,而在 PDF 中,它仅通过逐字环境进行格式化。比如下面的markdown:

```{r, echo=TRUE}
foo = "bar"
foo
```
将会:
```r
foo = "bar"
foo
```

```
## [1] "foo"
```
虽然第一个 block 将突出显示,但第二个 block 将仅以文本颜色跟随,但背景将始终为白色。这对于较暗的主题来说是非常有问题的,因为它们通常具有非常浅的文本颜色,并且这与白色背景不匹配。见: 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
---
在这种情况下,有解决方案。查看 HTML 输出,有这样的结构:
<style typetext/css">
pre:not([class]) {
background-color: white;
}
</style>
这意味着只要特定代码块中没有样式(仅适用于“回声” block ,因为默认情况下 rmarkdown 假定为 R),背景是白色的。只需在 .Rmd 中包含以下 block 即可更改此行为。文件:
```{css, echo = FALSE}
pre:not([class]) {
color: #333333;
background-color: #cccccc;
}
```
并且可以相应地完全指定它们的行为。这里的颜色和背景与 zenburn 风格相反。输出如下所示:
之前:
Zenburn before
之后:
Zenburn after
PDF解决方案
使用 PDF,查找问题要容易一些,但解决问题要复杂一些。如果有人看 .tex文件中,您可以看到虽然所有带有实际代码的 block 在它们周围都有很多事情发生,但回显 block 仅包装在一个简单的逐字环境中。结果如下所示:
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” block 的统一格式:
Zenburn PDF after
所以再次感谢@tarleb 和@martin_schmelzer,没有你们我将无法解决它!

关于r - rmarkdown 中的自定义突出显示样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53530985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com