R Markdown生成PDF时kableExtra条件格式化LaTeX命令未解析或编译报错的问题求助
我现在在做一个用RMarkdown生成的PDF报告,需要给其中一个表格做条件格式化。HTML版本的条件格式已经顺利搞定了,但PDF导出的时候碰到了棘手的问题。我的需求很明确:当单元格的值是0时,给它加上浅红色背景;非0的话就保持透明背景。下面的最小可复现示例(MWE)里用到的自定义颜色是在preamble.tex里定义好的,这个没问题,不是导致报错的原因。
用到的R代码
加载依赖包
# Load required packages library(tidyverse) library(kableExtra)
生成测试数据并输出表格
# Create MWE Data Example mwe_data <- tibble( proj_na = rep(paste("PROJECT", 1:10), 5), proj_yr = rep(2020:2024, each = 10), proj_st = sample(rep(c(0, 1), each = 10), 50, replace = TRUE) ) # Kable Output mwe_data %>% mutate( proj_st = cell_spec( proj_st, format = "latex", bold = TRUE, background = case_when( proj_st == 0 ~ "mpsred!50", TRUE ~ "mpswine!0" ) ) ) %>% pivot_wider( names_from = proj_yr, values_from = proj_st ) %>% kable( format = "latex", booktabs = TRUE, align = "lccccc", # escape = FALSE # 第二次尝试时添加的参数 ) %>% kable_styling(latex_options = c("HOLD_position", "repeat_header")) %>% row_spec(row = 0, color = "mpswine", align = "c")
两次尝试遇到的问题
第一次尝试:LaTeX命令被当作文本显示
直接用上面的代码(不加escape=FALSE) knit 后,PDF里的表格完全不对味——虽然\cellcolor{mpsred!50}和\cellcolor{mpswine!0}这些命令确实加到了对应的单元格里,但它们直接以文本形式显示出来了,根本没有被解析成背景色,完全达不到我要的效果。
第二次尝试:添加escape=FALSE后编译报错
后来查了资料说要给kable()加escape=FALSE参数,这样LaTeX命令才会被正确解析。结果加了这个参数之后,直接编译失败,控制台抛出了以下错误:
! Missing $ inserted.
$
l.113 ...icolumn{1}{c}{\textcolor{mpswine}{proj_na}} & \multicolumn{1}{c}> {\tex...
Try to find the following text in testing.Rmd:
...icolumn{1}{c}{\textcolor{mpswine}{proj_na}}
You may need to add $ $ around a certain inline R expression r in testing.Rmd (see the above hint).
Error: LaTeX failed to compile testing.tex.
Execution halted
生成的中间.tex文件里,表格的部分内容如下(截取了表头和前几行):
\begin{table}[H] \centering \begin{tabular}{lccccc} \toprule \multicolumn{1}{c}{\textcolor{mpswine}{proj_na}} & \multicolumn{1}{c}{\textcolor{mpswine}{2020}} & \multicolumn{1}{c}{\textcolor{mpswine}{2021}} & \multicolumn{1}{c}{\textcolor{mpswine}{2022}} & \multicolumn{1}{c}{\textcolor{mpswine}{2023}} & \multicolumn{1}{c}{\textcolor{mpswine}{2024}}\\ \midrule PROJECT 1 & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpsred!50}{\textbf{0}} & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpsred!50}{\textbf{0}}\\ PROJECT 2 & \cellcolor{mpsred!50}{\textbf{0}} & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpsred!50}{\textbf{0}}\\ PROJECT 3 & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpsred!50}{\textbf{0}} & \cellcolor{mpsred!50}{\textbf{0}} & \cellcolor{mpswine!0}{\textbf{1}} & \cellcolor{mpswine!0}{\textbf{1}}\\ ...(后续行省略)
现在我完全卡在这里了,有没有大佬能指点一下,怎么才能既让LaTeX的背景色命令被正确解析成实际的背景色,又不会触发这种编译报错呢?
内容来源于stack exchange

