.Rnw 文件中的 knitr 语法高亮 (LaTeX)
knitr syntax highlighting in .Rnw files (LaTeX)
我正在使用 .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()
并期望语法突出显示在每个块的基础上相应地改变。
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.
与关键字突出显示不同,背景颜色是为每个块定义的(查找 \definecolor{shadecolor}{rgb}{0.961, 0.961, 0.961}
)。 (例外:带有 results = "asis"
的块。)
解决方案(概念):
使用\renewcommand
,语法高亮命令可以在"updated" 文档中间。因此,我们可以设置一个新主题,提取其语法高亮定义,将 newcommand
替换为 renewcommand
并将定义写入文档。所有后续块都将使用新主题。
文档末尾,恢复默认主题;否则,所有 before 第一次更改主题的块将使用 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
的块之后的块才会受到影响。
\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}
输出:
我正在使用 .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()
并期望语法突出显示在每个块的基础上相应地改变。
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.
与关键字突出显示不同,背景颜色是为每个块定义的(查找 \definecolor{shadecolor}{rgb}{0.961, 0.961, 0.961}
)。 (例外:带有 results = "asis"
的块。)
解决方案(概念):
使用\renewcommand
,语法高亮命令可以在"updated" 文档中间。因此,我们可以设置一个新主题,提取其语法高亮定义,将 newcommand
替换为 renewcommand
并将定义写入文档。所有后续块都将使用新主题。
文档末尾,恢复默认主题;否则,所有 before 第一次更改主题的块将使用 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
的块之后的块才会受到影响。
\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}
输出: