.Rnw 文件 (LaTeX) 中的 knitr 语法高亮显示

Posted

技术标签:

【中文标题】.Rnw 文件 (LaTeX) 中的 knitr 语法高亮显示【英文标题】:knitr syntax highlighting in .Rnw files (LaTeX) 【发布时间】:2016-08-10 09:46:24 【问题描述】:

我正在使用 .Rnw 文件使用 LaTeX 和 knitr 生成报告。

我的knitr_setup 如下所示:

<<knitr_setup, echo=FALSE>>=
library(knitr)
opts_chunk$set(highlight = TRUE, cache = TRUE, eval = FALSE, size = "small")
options(width = 60)
opts_knit$set(out.format = "latex")
@
<<theme, cache=FALSE, echo=FALSE>>=
thm = knit_theme$get("olive")
knit_theme$set(thm)
@

我测试了几个语法高亮主题。提供预览here。 但是,更改 knit_theme$get() 中的主题只会导致最终 pdf 中的背景(对于某些人)不同。语法突出显示保留默认颜色。

R 版本:3.3.1 RStudio 版本:0.99.1280(预览版) knitr-版本:1.13

我的设置有什么问题?

【问题讨论】:

【参考方案1】:

问题:您有一个文档,其中多次调用knit_theme$set(),并且期望语法突出显示会在每个块的基础上相应地更改。

语法高亮保留默认颜色。

knit_theme$set() 的每次调用都会取代上一次调用。这是因为语法高亮的颜色只定义一次,在 LaTeX 序言中(例如\newcommand\hlnum[1]\textcolor[rgb]0.529,0.875,0.443#1)。

但是,在 knit_theme$get() 中更改主题只会导致最终 pdf 中的背景(对于某些人)不同。

与突出显示关键字不同,为每个块定义背景颜色(查找\definecolorshadecolorrgb0.961, 0.961, 0.961)。 (例外:带有results = "asis" 的块。)

解决方案(概念): 使用\renewcommand,语法高亮命令可以在文档中间“更新”。因此,我们可以设置一个新主题,提取其语法高亮定义,将 newcommand 替换为 renewcommand 并将定义写入文档。所有后续块都将使用新主题。 在文档的最后,恢复默认主题;否则,第一次主题更改之前的所有块将使用 last 主题集。

实施:

setThemeInline <- function(theme) 
  knit_theme$set(knit_theme$get(theme))
  header <- opts_knit$get("header")["highlight"]
  header <- gsub(pattern = "newcommand",
                 replacement = "renewcommand",
                 x = header)
  cat(header)

用法:

请注意,setThemeInline 必须在 asis 块中调用。不要忘记恢复主题(见最后一块)。只有调用setThemeInline 的块之后会受到影响。

\documentclassarticle
\begindocument
<<setup>>=
library(knitr)

setThemeInline <- function(theme) 
  knit_theme$set(knit_theme$get(theme))
  header <- opts_knit$get("header")["highlight"]
  header <- gsub(pattern = "newcommand",
                 replacement = "renewcommand",
                 x = header)
  cat(header)

  # for chunks with results = "asis"
  shadecolor <- col2rgb(opts_chunk$get("background")) / 255
  cat(sprintf("\\definecolorshadecolorrgb%s, %s, %s",
              shadecolor[1, 1], shadecolor[2, 1], shadecolor[3, 1]))


@


<<theme, results='asis'>>=
setThemeInline("denim")
@

<<>>=
getAnswer <- function(question) 
  if (missing(question)) 
    stop("Ask something!")
  
  return(42)

@

<<results='asis'>>=
setThemeInline("vampire")
@

<<>>=
getAnswer <- function(question) 
  if (missing(question)) 
    stop("Ask something!")
  
  return(42)

@

<<restore>>=
knit_theme$set(knit_theme$get("default"))
@

\enddocument

输出:

【讨论】:

有时,我认为必须有一个“10 分钟解决方案”。直到 2 小时后,我才意识到我错了……

以上是关于.Rnw 文件 (LaTeX) 中的 knitr 语法高亮显示的主要内容,如果未能解决你的问题,请参考以下文章

knitr 中 R 代码块和 LaTeX 的全局变量

R,knitr不尊重块和文本的顺序

R Markdown、Knitr、Pandoc和Bookdown之间的关系

使用knitr和Rstudio自动调整LaTeX表格宽度以适合pdf

在 R-Markdown 中使用 knitr 和 kableExtra 的表格单元格中的乳胶公式或符号,

使用 knitr PACKAGE LATEX "titlesec" 从 rstudio 更改 .pdf 文档的章节样式