R 用钩子将胶乳染色

R 用钩子将胶乳染色,r,knitr,R,Knitr,TL;博士 我希望在某些情况下更改某些latex命令(在本例中为\definecolor),因此我希望在R中为这些命令创建文本,并在标记期间将它们写入标记文件。我还不能让它完美地工作使用刀钩 更多详情: 我想在.rnw文件中定义的颜色数量(和样式)各不相同,因此我避免对.rnw文档中的\definecolor调用进行硬编码 看来我能用刀钩做到这一点,而且我非常接近。但我对一些事情感到困惑 这里有一个可复制的例子。R文件优先 library(RColorBrewer) library(knitr)

TL;博士

我希望在某些情况下更改某些latex命令(在本例中为
\definecolor
),因此我希望在R中为这些命令创建文本,并在标记期间将它们写入标记文件。我还不能让它完美地工作使用刀钩

更多详情:

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

看来我能用刀钩做到这一点,而且我非常接近。但我对一些事情感到困惑

这里有一个可复制的例子。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")
如何避免此警告或阻止knitr创建此行

如果您有任何关于这方面的建议,我们将不胜感激。
提前感谢。

这看起来像是一种黑客行为,但我想出了一个解决方案,使用文档挂钩而不是块挂钩。这解决了这两个问题(
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")
我希望这对某人有用

\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
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")
\documentclass{article}
\usepackage{xcolor}
%CustomColorDefsHere

\begin{document}

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

\end{document}