2016-08-10 3 views
2

Я использую файлы .Rnw для создания отчета с помощью LaTeX и knitr.подсветка синтаксиса knitr в .Rnw файлах (LaTeX)

Мой 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-Version: 3.3.1
RStudio Версия: 0.99.1280 (Preview)
knitr-Version: 1,13

Что плохого в моей установке?

ответ

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, то подсветка синтаксиса команд может быть «обновление» в середине документа. Поэтому мы можем установить новую тему, извлечь ее определения подсветки синтаксиса, заменить newcommand на renewcommand и записать определения в документ. Все последующие фрагменты будут использовать новую тему. В конце документа восстановите тему по умолчанию; в противном случае все куски до с первой заменой темы будет использовать последние темы.

Реализация:

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

+0

Иногда я думаю, что должно быть "10 минут раствор". И только через 2 часа я понимаю, что я ошибся ... –

Смежные вопросы