Таблица в Bookdown / Huskydown с несколькими функциями (Цитирование, Заголовок, URL, PNG рисунок, ...) - PullRequest
0 голосов
/ 04 февраля 2020

Я хотел бы включить таблицу в документ уценки R (Bookdown / Huskydown), который должен отвечать следующим требованиям. В идеале таблица работает с несколькими форматами вывода, например, LaTex / PDF и HTML.

Требования:

  • Ширина таблицы: фиксированная
  • Ширина ячейки: фиксированная
  • Вертикальное выравнивание: содержимое ячейки выровнено по верху
  • Форматирование текста: как полужирный или курсив (лучше всего, если поддерживается форматирование md, такое, что код выводится агности c) и допускается разрыв строки в более длинных текстах
  • Цитаты: должны отображаться
  • URL-адреса: в виде интерактивных ссылок как в HTML, так и в LaTex / PDF
  • Рисунки: include
    1. цифры хранятся локально, либо в
      • способе уценки ![](Rlogo.png) или
      • способе вязания knitr::include_graphics("Rlogo.png")
    2. взятые цифры прямо из Интернета
  • Заголовок для таблицы
  • Форматирование текста заголовков: Подпись также должна позволять форматирование текста
  • Нумерация таблиц: Таблицы должны быть пронумерованы
  • Ссылка на таблицу: в документе необходимо

Comparison of Approaches

Примечания относительно различных подходов

  • Фиксированная ширина ячейки: в уценке число «-» в заголовке таблицы определяет ширину ячейки
  • Разрывы строк:
    • LaTex: \\linebreak
    • Все другие: <br/>
  • Ссылка
    • LaTex: add \label{foo} => \ref{foo} (\@ref(foo))
    • Уценка: добавить Table: (\#tab:md-table) Caption ==> \@ref(tab:md-table))

Комментарии к различным подходам

  • Уценка: простое кодирование таблиц в уценке
  • Kable & kableExtra: Универсальное кодирование R-таблицы для уценки, но вертикальное выравнивание текста и цифры не включены в PDF
  • Пандер: достигает наибольшего, но не V выравнивание по вертикали и сноски
  • Huxtable: наиболее перспективный, но цифры не включены в PDF

1 Ответ

0 голосов
/ 04 февраля 2020

Это менее ответ, чем предоставление MWE для таблицы, показанной выше

MWE-screenshot

```{r}
# create some random text
library(stringi)
some_text <- stri_rand_lipsum(1)
some_text <- substr(some_text, 1, 75)

# create dataframe with some stuff
figpath <- "figure/"
df <- data.frame(
  Citation = c("@R-base", "@R-bookdown"),
  Textfield = c("**Formatted** string<br/> -- _Everyone_ needs H^2^O", some_text),
  URL = c("[R-url](https://www.r-project.org/)", "[bookdown](https://bookdown.org/)"),
  fig_local_md = c(
    paste0("![](", figpath, "Rlogo.png){ width=10% height=5% }"),
    paste0("![](", figpath, "bookdownlogo.png){ height='36px' width='36px' }")
  )#,
  # not working:
  # fig_local_knitr = c("knitr::include_graphics('figure/Rlogo.png')", "knitr::include_graphics('figure/bookdownlogo.png')") 
)

# only include if output format is HTML, else pander throws error
if (knitr::is_html_output()) {
  df$fig_web  <- c("![](https://www.picgifs.com/glitter-gifs/a/arrows/picgifs-arrows-110130.gif)")
  output_format <- "html"
}
if (knitr::is_latex_output()) {
  output_format <- "latex"
}
```

Уценка

Table: markdown table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\\textbf{bold})

  | Image                                                      | Description                                                  |
  | :--------------------------------------------------------- | :----------------------------------------------------------- |
  | ![](figure/Rlogo.png){ width=10% height=5% }               | **Image description** [@R-base]  <br/>Lorem ipsum dolor sit amet, ...  [R-url](https://www.r-project.org/) |
  | ![](figure/bookdownlogo.png){ height='36px' width='36px' } | **Image description** [@R-bookdown] <br/>Lorem ipsum dolor sit amet, ... [bookdown](https://bookdown.org/) |

kable table

  ```{r kable-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(knitr)
kable(df, 
      caption = "kable table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\\textbf{bold})", 
      caption.short = "md styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\\textbf{bold})"
      )
```

kableExtra table

```{r kableExtra-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(kableExtra)
# http://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf 
kable(
  df,
  caption = "kableExtra table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\\textbf{bold})",
  output_format, booktabs = T, # output_format = latex, html (specify above)
  # align = "l", 
  valign = "top"
) %>% 
  kable_styling(full_width = F,
                latex_options = c(#"striped",
                  "hold_position", # stop table floating
                  "repeat_header") # for long tables
  ) %>% 
  column_spec(1, bold = T, border_right = T, width = "30em") %>%
  column_spec(2, width = "50em") %>%
  column_spec(3, width = "5em") %>%
  column_spec(4, width = "10em") %>%
  column_spec(5, width = "10em") %>%
  footnote(general = "Here is a general comments of the table. ",
           number = c("Footnote 1; ", "Footnote 2; "),
           alphabet = c("Footnote A; ", "Footnote B; "),
           symbol = c("Footnote Symbol 1; ", "Footnote Symbol 2"),
           general_title = "General: ", number_title = "Type I: ",
           alphabet_title = "Type II: ", symbol_title = "Type III: ",
           footnote_as_chunk = T, title_format = c("italic", "underline")
  )
```

pander table

```{r pander-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(pander)
# https://cran.r-project.org/web/packages/pander/vignettes/pandoc_table.html

pander(
  df,
  caption = "pander table: markdown styling works in HTML and PDF (*italics*, **bold**), LaTex styling in PDF (\\textbf{bold})",
  # style = "multiline", # simple
  split.table = Inf, # default = 80 characters; Inf = turn off table splitting
  split.cells = c(15, 50, 5, 5, 5), # default = 30
  # split.cells = c("25%", "50%", "5%", "10%", "10%"), # no difference
  justify = "left"
)
```

huxtable table

```{r huxtable-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(dplyr)
library(huxtable)
# https://hughjonesd.github.io/huxtable/
hux <- as_hux(df)                                                       %>%
  # huxtable::add_rownames(colname = '')                                  %>%
  huxtable::add_colnames()                                              %>%
  set_top_border(1, everywhere, 1)                                      %>%
  set_bottom_border(1, everywhere, 1)                                   %>%
  set_bottom_border(final(), everywhere, 1)                             %>%
  set_bold(1, everywhere, TRUE)                                         %>% # bold headlines
  set_italic(-1, 1, TRUE)                                               %>% # italics in first column (except the first row)
  set_valign("top")                                                     %>%
  set_width(1)                                                          %>%
  set_col_width(c(0.10,0.45,0.05,0.10,0.10))                             %>%
  set_wrap(TRUE)                                        %>%
  set_position('left')                                    %>% # fix table alignment (default is center)
  add_footnote("Sample Footnote")                                       %>% 
  set_font_size(4)

table_caption <-  'huxtable table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\\textbf{bold})'

# Print table conditional on output type
if (knitr::is_html_output()) {
  caption(hux) <- paste0('(#tab:huxtable-table-explicit) ', table_caption)
  print_html(hux) # output table html friendly (requires in chunk options "results='asis'")
}
if (knitr::is_latex_output()) {
  caption(hux) <- paste0('(\\#tab:huxtable-table-explicit) ', table_caption)
  hux   # if using chunk option "results='asis'" simply output the table with "hux", i.e. do not use print_latex(hux)
}
```

Ссылки на таблицы

работает по-разному для разных типов таблиц

Referencing the tables

Добавление краткой подписи для LoT

Наконец добавление короткой подписи для таблица рисунков не работает должным образом (ref: huxtable-table-caption) заголовок huxtable-таблицы (ref: huxtable-table-scaption) короткий заголовок huxtable-таблицы

```{r huxtable-table, echo=FALSE, out.width='90%', fig.align = "center", fig.cap='(ref:huxtable-table-caption)', fig.scap='(ref:huxtable-table-scaption)', results='asis'}
...
```
...