如何在 R Markdown 中语法高亮内联 R 代码?
How to syntax highlight inline R code in R Markdown?
此题与consistent code html inline and in chunks with knitr相似。我想在 R Markdown 文档中突出显示内联 R 代码,而不是 .Rhtml 文档,例如,在通过 rmarkdown 编译 `r "plot(cars, main = 'A scatterplot.')"`
之后,像 plot
这样的标记应该被突出显示。默认情况下,R 代码块是语法高亮的,但无法高亮内联 R 代码。
这是一个使用 highr 包 (devtools::install_github('yihui/highr')
) 的 development version 的解决方案。基本上,您只需定义自定义 LaTeX 命令来突出显示标记。 highr:::cmd_pandoc_latex
是 Pandoc 用于语法高亮显示的 LaTeX 命令数据框。
head(highr:::cmd_pandoc_latex)
## cmd1 cmd2
## COMMENT \CommentTok{ }
## FUNCTION \NormalTok{ }
## IF \NormalTok{ }
## ELSE \NormalTok{ }
## WHILE \NormalTok{ }
## FOR \NormalTok{ }
然后可以重新定义knitr的inline
钩子:
---
output:
pdf_document:
keep_tex: yes
---
```{r include=FALSE}
local({
hi_pandoc = function(code) {
if (knitr:::pandoc_to() != 'latex') return(code)
if (packageVersion('highr') < '0.6.1') stop('highr >= 0.6.1 is required')
res = highr::hi_latex(code, markup = highr:::cmd_pandoc_latex)
sprintf('\texttt{%s}', res)
}
hook_inline = knitr::knit_hooks$get('inline')
knitr::knit_hooks$set(inline = function(x) {
if (is.character(x) && inherits(x, 'AsIs')) hi_pandoc(x) else hook_inline(x)
})
})
```
Test inline R code: `r I("plot(cars, main = 'A scatterplot.')")`.
Normal inline code `r pi`.
A code block:
```r
plot(cars, main = 'A scatterplot.')
1 + 2 # a comment
```
我使用I()
作为一个方便的标记来告诉字符串是从普通字符串中突出显示的语法。这只是一个任意的选择。 PDF 输出:
不过,这并不是一个完美的解决方案。在某些情况下,您需要对其进行调整。例如,大多数特殊的 LaTeX 字符不会被转义,例如 ~
。您可能需要通过 gsub()
.
处理 hi_pandoc()
返回的 LaTeX 代码
就我个人而言,我发现内联输出中的多种颜色让人分心,所以我不会对其进行语法高亮显示,但这完全是个人品味。
现在:
Here is some `plot(cars, main = 'A scatterplot.')`{.R} inline R code
好吧,我不太了解 R 以及您使用它的方式,但是对于大多数语言(pandoc 使用 skylighting pkg 来做到这一点),你可以用上面的语法做内联代码块。
此题与consistent code html inline and in chunks with knitr相似。我想在 R Markdown 文档中突出显示内联 R 代码,而不是 .Rhtml 文档,例如,在通过 rmarkdown 编译 `r "plot(cars, main = 'A scatterplot.')"`
之后,像 plot
这样的标记应该被突出显示。默认情况下,R 代码块是语法高亮的,但无法高亮内联 R 代码。
这是一个使用 highr 包 (devtools::install_github('yihui/highr')
) 的 development version 的解决方案。基本上,您只需定义自定义 LaTeX 命令来突出显示标记。 highr:::cmd_pandoc_latex
是 Pandoc 用于语法高亮显示的 LaTeX 命令数据框。
head(highr:::cmd_pandoc_latex)
## cmd1 cmd2
## COMMENT \CommentTok{ }
## FUNCTION \NormalTok{ }
## IF \NormalTok{ }
## ELSE \NormalTok{ }
## WHILE \NormalTok{ }
## FOR \NormalTok{ }
然后可以重新定义knitr的inline
钩子:
---
output:
pdf_document:
keep_tex: yes
---
```{r include=FALSE}
local({
hi_pandoc = function(code) {
if (knitr:::pandoc_to() != 'latex') return(code)
if (packageVersion('highr') < '0.6.1') stop('highr >= 0.6.1 is required')
res = highr::hi_latex(code, markup = highr:::cmd_pandoc_latex)
sprintf('\texttt{%s}', res)
}
hook_inline = knitr::knit_hooks$get('inline')
knitr::knit_hooks$set(inline = function(x) {
if (is.character(x) && inherits(x, 'AsIs')) hi_pandoc(x) else hook_inline(x)
})
})
```
Test inline R code: `r I("plot(cars, main = 'A scatterplot.')")`.
Normal inline code `r pi`.
A code block:
```r
plot(cars, main = 'A scatterplot.')
1 + 2 # a comment
```
我使用I()
作为一个方便的标记来告诉字符串是从普通字符串中突出显示的语法。这只是一个任意的选择。 PDF 输出:
不过,这并不是一个完美的解决方案。在某些情况下,您需要对其进行调整。例如,大多数特殊的 LaTeX 字符不会被转义,例如 ~
。您可能需要通过 gsub()
.
hi_pandoc()
返回的 LaTeX 代码
就我个人而言,我发现内联输出中的多种颜色让人分心,所以我不会对其进行语法高亮显示,但这完全是个人品味。
现在:
Here is some `plot(cars, main = 'A scatterplot.')`{.R} inline R code
好吧,我不太了解 R 以及您使用它的方式,但是对于大多数语言(pandoc 使用 skylighting pkg 来做到这一点),你可以用上面的语法做内联代码块。