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

时间:2016-08-10 09:46:24

标签: r latex syntax-highlighting knitr

我正在使用.Rnw文件生成一个包含LaTeX和knitr的报告。

我的<<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) @ 如下所示:

knit_theme$get()

我测试了几个语法高亮主题。预览提供here。 但是,更改import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; import {HttpModule} from '@angular/http'; import {routing, APP_ROUTER_PROVIDERS, children } from './app.routes'; import {appStateProvider} from './providers/AppStateProvider' // Import configured routes import {AuthGuard} from './services/auth.guard' import {AuthService} from './services/auth.service'; import {AppComponent } from './app.component'; import {LoginComponent} from './components/login.component' import {HomeComponent} from './components/home.component' @NgModule({ imports: [ BrowserModule, FormsModule, HttpModule, routing, children ], providers: [ appStateProvider, APP_ROUTER_PROVIDERS, AuthService, InsaService ], declarations: [ AppComponent, LoginComponent, HomeComponent, NewsComponent ], bootstrap: [AppComponent] }) export class AppModule { } 中的主题只会导致最终pdf中的背景(对某些人而言)不同。语法高亮显示保留默认颜色。

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

我的设置有什么问题?

1 个答案:

答案 0 :(得分:2)

问题:您的文档中有多次调用knit_theme$set()并希望语法突出显示相应地更改,基于每个块。

  

语法高亮显示保留默认颜色。

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

  

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

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

解决方案(概念): 使用\renewcommand,语法突出显示命令可以更新&#34;中期文件。因此,我们可以设置一个新主题,提取其语法突出显示定义,将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的块后,只有块才会受到影响。

\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