用于 pdf 输出的多行 kable 额外标题

问题描述 投票:0回答:1

我尝试复制下表。来自 gt 的这个

example
正是我所需要的,但我只在 HTML 中工作,而不是 PDF。)

我使用

add_header_above
中的
kableExtra
的方法(也欢迎任何其他包):

我最大的问题是要考虑第 2 列和第 3 列的

header_above
,同时还要将第 1 列和第 4 列放在一个标题中,而无需使用 cline(valign:中间)。我还希望这两个标题 (1&4) 垂直居中对齐,并在第 4 列之间有一个换行符。

MWE 使用四开

---
title: "Example Table"
format:
  pdf:
    pdf-engine: xelatex
    mainfont: "Barlow"
    include-in-header: 
      text: |
        \setlength{\arrayrulewidth}{0.35mm}
        \renewcommand{\arraystretch}{1.8} 
        \arrayrulecolor{white}
---
```{r}
library(kableExtra)

df <- data.frame(
  age = 1:3,
  table1 = 1:3 / 10,
  table2 = 1:3 / 100
)

df$diff <- df$table1 - df$table2

colhd <- "#548235"
colbd <- "#FFF2CC"

kable(df, format = "latex",
      col.names = c("Age", "Table 1", "Table 2",
                    "Difference between Table 1 and Table 2")) |> 
  add_header_above(header = c(" " = 1, "Table Number" = 2, " " = 1),
                    background = colhd, color = "white") |> 
  row_spec(0, background = colhd, color = "white") |> 

  row_spec(1:3, background = colbd, color = "black") |>
  column_spec(1, background = colhd, color = "white")
```
r latex quarto kableextra gt
1个回答
0
投票

也许您想看看

flextable
?我发现这个包非常通用且简单。

我已经采用了您的示例并生成了您正在寻找的表格。除了您可能想要适应和选择的字体之外,一切都在那里。您可以直接复制粘贴运行并查看结果。

library(dplyr)

df <- data.frame(
  age = 1:3,
  table1 = 1:3 / 10,
  table2 = 1:3 / 100
)

df$diff <- df$table1 - df$table2
names(df) <- c("Age", "Table 1", "Table 2", " ")

colhd <- "#548235"
colbd <- "#FFF2CC"
std_border <- officer::fp_border(color = "white")

df_flex <- df %>%
  flextable() %>%
  flextable::bg(bg = colbd, part = "body") %>%
  flextable::add_header_row(
    values = c(
      "", "Table Number", "",
      "Difference between\n table1 and table2"
    )
  ) %>%
  flextable::bg(bg = colhd, part = "header") %>%
  flextable::color(color = "white", part = "header") %>%
  flextable::align(align = "center", part = "header") %>%
  flextable::merge_at(i = 1, j = c(2, 3), part = "header") %>%
  flextable::merge_at(i = c(1, 2), j = 4, part = "header") %>%
  flextable::bg(j = 1, bg = colhd, part = "body") %>%
  flextable::color(j = 1, color = "white", part = "body") %>%
  flextable::width(width = c(1, 1, 1, 2)) %>%
  flextable::border(border = std_border, part = "all")

df_flex
© www.soinside.com 2019 - 2024. All rights reserved.