如何在R Markdown中突出显示内联R代码的语法?

Yih*_*Xie 12 r syntax-highlighting knitr r-markdown

这个问题类似于一致的代码html内联和与knitr的块.而不是.Rhtml文档,我想在R Markdown文档中突出显示内联R代码,例如,在`r "plot(cars, main = 'A scatterplot.')"`通过rmarkdown编译之后,plot应该突出显示标记.默认情况下,R代码块是语法突出显示的,但无法突出显示内联R代码.

Yih*_*Xie 18

这是一个使用高级包()的开发版本的解决方案.基本上,您只需定义自定义LaTeX命令以突出显示标记.是Pandoc用于进行语法突出显示的LaTeX命令的数据框.devtools::install_github('yihui/highr')highr:::cmd_pandoc_latex

head(highr:::cmd_pandoc_latex)
##                   cmd1 cmd2
## COMMENT  \\CommentTok{    }
## FUNCTION  \\NormalTok{    }
## IF        \\NormalTok{    }
## ELSE      \\NormalTok{    }
## WHILE     \\NormalTok{    }
## FOR       \\NormalTok{    }
Run Code Online (Sandbox Code Playgroud)

然后你可以重新定义knitrinline钩子:

---
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
```
Run Code Online (Sandbox Code Playgroud)

我用它I()作为方便的标记来告诉字符串是从普通字符串突出显示的语法.这只是一个随意的选择.PDF输出:

语法突出显示内联代码

但这不是一个完美的解决方案.在某些情况下,您需要调整它.例如,大多数特殊的LaTeX字符都不会被转义,例如~.您可能需要处理hi_pandoc()by 返回的LaTeX代码gsub().

我个人发现内联输出中的多种颜色让人分心,所以我不会用语法突出显示它,但这完全是个人品味.


dyl*_*nmc 6

如今:

Here is some `plot(cars, main = 'A scatterplot.')`{.R} inline R code
Run Code Online (Sandbox Code Playgroud)

好吧,我不特别了解R及其使用方式,但是对于大多数语言(pandoc使用skylighting pkg来做到这一点),您可以使用上述语法来执行内联代码块。

  • @YihuiXie [这里](http://pandoc.org/MANUAL.html#verbatim)似乎**非常**有最少的记录。(特别请参阅“inline_code_attributes”扩展中的两行。) (2认同)