【问题标题】:Custom highlighting style in rmarkdownrmarkdown 中的自定义突出显示样式
【发布时间】:2018-11-29 02:31:16
【问题描述】:

有没有办法在 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”应该是“default”、“tango”、“pygments”、“kate”、“monochrome”、“espresso”、“zenburn”、“haddock”、“textmate”之一 调用:... -> pandoc_html_highlight_args -> match.arg 执行停止

【问题讨论】:

  • @Marius 这真是一个奇怪的评论。首先,我不是在尝试使用自定义主题,而是自定义突出显示主题。这是一个很大的区别,因为虽然支持自定义 CSS(但仅适用于 HTML),但不支持自定义突出显示:bookdown.org/yihui/rmarkdown/… 其次,我在问“可以做到吗?如何做到?”而不是“我做错了什么?” pandoc 的版本与此无关。除非我在代码中读错了什么。

标签: r r-markdown syntax-highlighting


【解决方案1】:

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

问题

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

```{r, echo=TRUE}
foo = "bar"
foo
```

将是:

```r
foo = "bar"
foo
```

```
## [1] "foo"
```

虽然第一个块将被突出显示,但第二个块将仅以文本颜色跟随,但背景将始终为白色。这对于较暗的主题来说是非常有问题的,因为它们通常具有非常浅的文本颜色,并且这与白色背景不能很好地配合。请参阅:https://eranraviv.com/syntax-highlighting-style-in-rmarkdown/ 以了解 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>

这意味着只要特定代码块中没有样式(仅适用于“echo”块,因为默认情况下 rmarkdown 假定为 R),背景是白色的。只需在 .Rmd 文件中包含以下块即可更改此行为:

```{css, echo = FALSE}
  pre:not([class]) {
    color: #333333;
    background-color: #cccccc;
  }
```

并且可以相应地完全指定它们的行为。这里的颜色和背景与 zenburn 风格相反。输出如下所示:

之前:

之后:

PDF解决方案

使用 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 环境重新定义为具有彩色背景和彩色文本。结果是“回声”块的统一格式:

再次感谢@tarleb 和@martin_schmelzer,如果没有你们,我将无法解决这个问题!

【讨论】:

    【解决方案2】:

    您似乎正在尝试使用 CSS 文件作为突出显示样式。这不起作用(通常),因为 pandoc 期望使用特殊的 JSON 格式定义突出显示样式。要使用修改后的 zenburn,必须通过pandoc --print-highlight-style zenburn &gt; myzenburn.style 创建一个新样式文件,然后修改新文件myzenburn.style

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

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

    但是,这仅适用于非 HTML 输出格式,因为只要可以使用 highlight.js,knitr 就会干扰。

    【讨论】:

    • 我完全错过了 pandoc_args。但似乎使用来自@martin_schmelzer 答案的自定义 css + 标头更便携,因为它甚至适用于较旧的 Pandoc 版本。
    【解决方案3】:

    至少对于 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}}}
    

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

    并将其包含在您的文档中正文之前。

    这是一个示例,我们在其中更改了正文中 cmets 和关键字的突出显示:

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

    【讨论】:

    • 有一个问题。见这里:eranraviv.com/syntax-highlighting-style-in-rmarkdown 每种风格都有相同的回声块背景。我还没有找到改变它的方法(我不擅长 CSS)。
    • 您能详细说明一下吗?回声块是什么意思?你想换什么颜色?
    • 当你执行echo=TRUE 时,它会创建额外的代码块,我们称之为回显块。此回声块具有不同的格式,具有白色背景颜色(无论突出显示样式如何)。这对于文本颜色较浅但背景较暗的深色样式是有问题的。这使得 echo 块基本上不可读。见stackoverflow.com/a/53602166/4868692
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 2015-06-13
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多