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

标签 r latex syntax-highlighting knitr

我正在使用 .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

我的设置有什么问题?

最佳答案

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

Syntax highlighting stays with the default colors.

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

However, changing the themes in knit_theme$get() only results in a different background (for some) in the final pdf.

与关键字的突出显示不同,背景颜色是为每个 block 定义的(查找 \definecolor{shadecolor}{rgb}{0.961, 0.961, 0.961})。 (异常(exception):results = "asis" 的 block 。)

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

实现:

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 block 中调用。不要忘记恢复主题(参见最后一 block )。只有调用 setThemeInline 的 block 之后的 block 才会受到影响。

\documentclass{article}
\begin{document}
<<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("\\definecolor{shadecolor}{rgb}{%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"))
@

\end{document}

输出:

Output

关于r - .Rnw 文件中的knitr 语法高亮显示 (LaTeX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38869803/

相关文章:

r - 如何更改 ggplot 气泡图中轮廓的颜色?

python - 如何避免在我的代码片段中使用\xc2 字符或 ?

syntax-highlighting - SyntaxHighlighter 被错误地解析

python - 全部大写的驼峰式字符串

r - makePSOCKcluster(names = spec, ...) 错误 : Cluster setup failed. 3 个工作人员中的 3 个无法连接

pdf - 在 Latex 中包含图像时出错

css - CSS 和 Latex 盒子模型有什么区别?

latex - 如何在LaTeX幻灯片中放置居中的大 "Thank You"

scala - Emacs 上的 Scaml 语法高亮显示

r - 在 R 中使用 sf 查找最近的特征