使用 RMarkdown 将带有颜色和 unicode 字符的 kableExtra table 渲染为 PDF

Rendering kableExtra table with colors and unicode characters to PDF with RMarkdown

我最近学习了如何使用包含 unicode 符号的 kableExtra 制作很棒的 tables,以便它们可以作为我的情节的解释性 tables。

library(dplyr)
library(kableExtra)

data.frame(
  Symbol = c("●", "●", "▲"),
  Description = c("bla bla bla", "bla bla bla", "bla bla bla"),
  Result = c("bla bla bla", "bla bla bla", "bla bla bla")
) %>%
  mutate(
    Symbol = cell_spec(Symbol, color = c("yellow", "pink", "pink"), escape = F)
  ) %>%
  kable(escape = F, align = c("c", "l", "l")) %>%
  kable_styling(full_width = F)

生成一个漂亮的 table,看起来像这样:

我现在想自动将其渲染成 PDF,但是当我将这段确切的代码粘贴到设置为编织成 PDF 的 RMarkdown 文件中时,这让我陷入了一个长达数小时的尝试调试各种乳胶错误的兔子洞与 table 中的 unicode 字符相关联,导致问题的颜色规范中的数字符号,脚注,声明 ! Misplaced \noalign. 的错误,我还没有弄清楚来源等

我将在最后包含完整 Rmd 文件的文本。如果这有所作为,我正在使用 Mac。使用 BasicTex 和 tlmgr 安装缺少的乳胶包。

是否有 (1) 一种方法可以将我的 kableExtra table 保存到不涉及 RMarkdown 的可缩放 PDF 文件中?我今天玩了 write2pdf() 函数,但 运行 又遇到了 unicode 问题。我还尝试将它编织成 html 并通过调用 pandoc 将其转换,但这删除了我需要的大部分 table 格式。

也许我错过了一些简单的解决方案,但是...或者 (2) 有没有人能告诉我哪些更改会使此 Rmd 代码正确地将我的图表呈现为 PDF? R 代码本身工作正常。我猜这是某种 Latex 问题。

非常感谢您的帮助。

---
title: ""
output:
  pdf_document:
    latex_engine: xelatex
---

```{r, echo=FALSE, results="asis"}
# TODOREQ: add "much" grammars for acute levels
# TODOREQ: change "levels of concern" to the respective guideline name.
# TODO: Change to groupby/summarize
# TODO: Factor out package loading and global variables into a single setup file

# Packages
suppressMessages(library(ggplot2))
suppressMessages(library(extrafont))
suppressMessages(library(kableExtra))
suppressMessages(library(dplyr))


  table_info <- data.frame(Symbol=c("&#9650", "&#9670", "&#2795"),
                       Name=c("Name1", "Name2", "Name3"),
                       Description=c("Description1", "Description2",
                                     "Description3"),
                       Results=c("Bad", "Good", "Bad"),
                       Color=c("#ffde71", "#394f38",
                               "#09a2dd"))

  ktable <- table_info %>%
    mutate(Symbol = cell_spec(Symbol, color = Color, escape = FALSE)) %>%
    select(-Color) %>%
    kable(escape = FALSE, align = c("c", "l", "l")) %>%
    kable_styling(full_width = FALSE)

  ktable


```

有一些问题。

  1. cell_spec 将插入原始 HTML 代码,除非您要求它插入 LaTeX 代码。使用 format = "latex" 来做到这一点。

  2. 您需要在 LaTeX 代码中指定符号,而不是 HTML 标记。 xelatex 应该为 "&#9650" 支持 "\symbol{9650}" 之类的东西,但我无法显示任何内容:也许我没有安装字体。相反,您可以使用 AMS 符号;实心圆是 "$\bullet$",向上的实心三角形是 "$\blacktriangle$"。我没有查找你的其他人,但如果你幸运的话,你会在 https://www.rpi.edu/dept/arc/training/latex/LaTeX_symbols.pdf.

  3. 中找到它们
  4. 常规 kable 表格在 LaTeX 中很难看;使用 booktabs = TRUE 选项以获得更好的选项。

所以这就是您的 ktable 规范应该是这样的:

  table_info <- data.frame(Symbol=c("$\bullet$", "$\bullet$", "$\blacktriangle$"),
                       Name=c("Name1", "Name2", "Name3"),
                       Description=c("Description1", "Description2",
                                     "Description3"),
                       Results=c("Bad", "Good", "Bad"),
                       Color=c("#ffde71", "#394f38",
                               "#09a2dd"))

  ktable <- table_info %>%
    mutate(Symbol = cell_spec(Symbol, color = Color, format = "latex", 
                              escape = FALSE)) %>%
    select(-Color) %>%
    kable(escape = FALSE, align = c("c", "l", "l"), booktabs = TRUE) %>%
    kable_styling(full_width = FALSE)

  ktable