Проблема: У вас есть документ с несколькими звонками до 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}
Выход:
Иногда я думаю, что должно быть "10 минут раствор". И только через 2 часа я понимаю, что я ошибся ... –