r - 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 创建此行?
任何有关执行此操作的任何提示都将不胜感激。提前致谢。
解决方案
这似乎是一种 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}
我希望这对某人有用...
推荐阅读
- amazon-web-services - 如何使 CodePipeline 与 Git、ECR、CodeBuild 和 CodeDeploy 一起工作?
- apache - AEM 6.3:将选择器中的点替换为斜线时出现错误请求
- javascript - 如何有效地查找范围包含的数组中的所有元素?
- sql - 更改从 SQL Server 数据库获取的数据值
- mysql - MySQL 服务器无法删除
- javascript - 未抓住(承诺)即使尝试抓住它
- python - ImportError:无法从“电报”(未知位置)导入名称“Bot”
- json - 使用 Dataweave 2.0 转换 JSON 对象
- .net - 使用 Blazor InputFile 标记 - 我如何控制浏览时显示的文件类型
- c# - 使用 GitVersion 进行 AssemblyInfo.cs 更新