Как отображать заголовок таблицы только один раз в "списке таблиц" для таблицы, разбитой на несколько страниц

Я использую пакеты R (xtable а также knitr) и латексные пакеты (longtable а также hyperref) подготовить документ.

Одна из моих таблиц очень длинная и разбивается на несколько страниц. Оказалось, что "Список таблиц" показывает каждый номер страницы, на которой эта таблица появляется, но все гиперссылки приводят меня к началу этой таблицы.

Мой вопрос в "Списке таблиц", как я могу просто показать номер первой страницы, на которой эта таблица появляется.

\documentclass{article}
\usepackage{longtable}
\usepackage{hyperref}

<<setup, include=FALSE, cache=FALSE>>=
library(knitr)
library(xtable)
@

\begin{document}
\listoftables
\newpage

<<echo=FALSE,results='asis'>>=
## some customerized settings for "longtable"
addtorow          <- list()
addtorow$pos      <- list()
addtorow$pos[[1]] <- c(0)
addtorow$command  <- c(paste("\\hline \n",
                             "\\endhead \n",
                             "\\hline \n",
                             "{\\footnotesize Continued on next page} \n",
                             "\\endfoot \n",
                             "\\endlastfoot \n",sep=""))
## create a long table
d <- data.frame(ID=rep(1:300), LAB=rnorm(300))

## execute "xtable"
dTab <- xtable(d, caption="This is Table 1")

print(dTab,    
      tabular.environment = "longtable",
      floating = FALSE,
      include.colnames = TRUE,
      include.rownames = FALSE, #addtorow substitute default row names
      add.to.row = addtorow,    # make the substitution here
      hline.after=c(-1),        # addtorow substitute default hline for first row
      caption.placement="top"
)
@

\end{document}

1 ответ

Решение

На этот вопрос нужно ответить в двух частях:

  1. Какой код LaTeX требуется для включения только первой части таблицы в LOF (Список рисунков)?
  2. Как сделать xtable генерировать этот код?

В первой части уже есть ответ на tex.stackexchange: как использовать longtable только с одной записью в списке таблиц. Сводится к использованию \caption{…} в первом заголовке таблицы и \caption*{…} в следующих заголовках.

Включая нижний колонтитул из вопроса, требуемый LaTeX выглядит так:

\begin{longtable}{rr}
    \caption{This is Table 1} \\ \hline
  \endfirsthead
    \caption*{This is Table 1} \\ \hline
    ID & LAB \\
    \hline
  \endhead
    \hline
    {\footnotesize Continued on next page}
  \endfoot
  \endlastfoot
ID & LAB \\ 
\hline
1 & 1.08 \\ 
2 & -0.99 \\ 
3 & 1.64 \\ 

(Обратите внимание, что ID & LAB после \endlastfoot также можно перейти к первой части заголовка, но приведенную выше структуру легче создать с помощью xtable.)


Вторая часть немного сложнее. По умолчанию, xtable включает в себя \caption Команда в заголовке таблицы. С использованием add.to.row вариант print.xtableмы можем добавить контент перед телом таблицы, но мы не можем добавить контент до \caption команда (насколько я знаю).

Поэтому, чтобы получить структуру, показанную выше, мы подавляем как можно больше автоматически сгенерированного кода LaTeX и добавляем правильный заголовок таблицы вручную.

Это можно сделать с помощью опции only.contents из print.xtable, Все аргументы относительно метаданных таблицы (latex.environment, floating и так далее) устаревают, потому что мы сами пишем заголовок таблицы:

<<echo=FALSE, results='asis'>>=

  ## create a long table
  d <- data.frame(ID=rep(1:300), LAB=rnorm(300))

  ## execute "xtable"
  dTab <- xtable(d)

  cat(sprintf("
  \\begin{longtable}{rr}
    \\caption{%1$s} \\\\ \\hline
    \\endfirsthead
    \\caption*{%s} \\\\ \\hline
    %2$s \\\\
    \\hline
    \\endhead
    \\hline
    {\\footnotesize %3$s}
    \\endfoot
    \\endlastfoot",
  "This is Table 1",
  paste(colnames(dTab), collapse = " & "),
  "Continued on next page"))

  print(dTab,
        include.colnames = TRUE,
        include.rownames = FALSE,
        only.contents = TRUE
  )

  cat("\\end{longtable}")
@

Согласно запросу, LOF содержит только одну запись:

Выход


Полный код:

\documentclass{article}
\usepackage{longtable}
\usepackage{hyperref}

<<setup, include=FALSE, cache=FALSE>>=
  library(knitr)
  library(xtable)
@

\begin{document}
\listoftables

<<echo=FALSE, results='asis'>>=

  ## create a long table
  d <- data.frame(ID=rep(1:300), LAB=rnorm(300))

  ## execute "xtable"
  dTab <- xtable(d)

  cat(sprintf("
  \\begin{longtable}{rr}
    \\caption{%1$s} \\\\ \\hline
    \\endfirsthead
    \\caption*{%s} \\\\ \\hline
    %2$s \\\\
    \\hline
    \\endhead
    \\hline
    {\\footnotesize %3$s}
    \\endfoot
    \\endlastfoot",
  "This is Table 1",
  paste(colnames(dTab), collapse = " & "),
  "Continued on next page"))

  print(dTab,
        include.colnames = TRUE,
        include.rownames = FALSE,
        only.contents = TRUE
  )

  cat("\\end{longtable}")
@

\end{document}

добавление

Чтобы ответить на дополнительный вопрос о том, как вращать имена столбцов:

  • добавлять \usepackage{rotating} к преамбуле.
  • использование paste(paste("\\begin{sideways}", colnames(dTab), "\\end{sideways}"), collapse = " & ") вместо paste(colnames(dTab), collapse = " & "),
  • добавлять rotate.colnames = TRUE к print.xtable вызов.
Другие вопросы по тегам