首页 > 解决方案 > knitr 使用钩子设置 Latex 定义颜色

问题描述

TL;博士

我希望在某些情况下更改一些乳胶命令(在这种情况下\definecolor),所以我想在 R 中为这些命令创建文本,并在标记期间将它们写入标记文件。我还不能使用 knitr hooks 让它完美地工作。

更多详情:

我想在.rnw文件中定义的颜色数量(和样式)会有所不同,因此我避免在文档中对\definecolor调用进行硬编码。.rnw

看来我可以用 knitr hooks 做到这一点,而且我非常接近。但我对几件事感到困惑。

这是一个可重现的示例。R文件优先

library(RColorBrewer)
library(knitr)

colNames <- c("one","two","three")
txtColors <- sub("#","",brewer.pal(6, "Dark2")[1:3])

# set the knitr hook to create color definitions within the rnw file
knitr::knit_hooks$set(setColors = function(before, options, envir) {
  if (!before){
    defs <- vector("list",length(txtColors))
    for(i in 1:length(txtColors)){
      defs[[i]] <- paste0("\\definecolor{",colNames[[i]],"Color}{HTML}{",txtColors[[i]],"}")
    } 
    return(paste0("\\xglobal",unlist(defs), "\n"))
  }   
})

setwd(file.path("G:", "my", "working", "dir"))
knit2pdf("testColors_s.rnw")

这里有一个 rnw 文件(将其命名为“testColors_s.rnw”)

\documentclass{article}
\usepackage{xcolor}
\begin{document}

<<setColorHook, setColors = TRUE>>=

@

\textcolor{oneColor}{The first color}
\textcolor{twoColor}{The second color}
\textcolor{threeColor}{The third color}

\end{document}

问题 #1。我必须全局设置颜色,\xglobal因为(我猜)knitr 将这些调用放在 kframe 中。我可以制作一个避免 kframe 的钩子吗?或者不需要 xglobal 调用?

问题2。我在运行时收到此警告:Warning message: Package xcolor Warning: Incompatible color definition on input line 57. 这是由 knitr 完成的颜色定义,而不是我。这是 tex 文件中的违规行:

\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}

如何避免此警告或阻止 knitr 创建此行?

任何有关执行此操作的任何提示都将不胜感激。提前致谢。

标签: rknitr

解决方案


这似乎是一种 hack,但我想出了一个使用文档挂钩而不是块挂钩的解决方案。这解决了这两个问题(xglobal不再需要并且definecolor不会创建额外的问题)。欢迎更好的解决方案。

可重现的示例,R 文件:

library(RColorBrewer)
library(knitr)

colNames <- c("one","two","three")
txtColors <- sub("#","",brewer.pal(6, "Dark2")[1:3])

defs <- vector("list",length(txtColors))
for(i in 1:length(txtColors)){
  defs[[i]] <- paste0("\\\\definecolor{",colNames[[i]],"Color}{HTML}{",txtColors[[i]],"}")
} 

knit_hooks$set(document = function(x) {
  sub('%CustomColorDefsHere', paste0(unlist(defs), "\n", collapse = ""), x)
})


setwd(file.path("G:", "my", "working", "dir"))
knit2pdf("testColors_s.rnw")

和 rnw 文件

\documentclass{article}
\usepackage{xcolor}
%CustomColorDefsHere

\begin{document}

\textcolor{oneColor}{The first color}
\textcolor{twoColor}{The second color}
\textcolor{threeColor}{The third color}

\end{document}

我希望这对某人有用...


推荐阅读