如何在 "list of table" 中仅显示一次 table 标题,将 table 分成多个页面

How to only show table caption once in "list of table" for a table split onto multiple pages

我正在使用 R 包(xtableknitr)和 Latex 包(longtablehyperref)来准备文档。

我的一篇 table 很长,分成多页。结果 "List of Table" 显示了此 table 出现的每个页码,但所有超链接都将我带到了此 table.

的开头

我的问题是,在 "List of Table" 中,我怎样才能只显示 table 出现的第一个页码。

\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. 哪个 LaTeX 代码需要在 LOF(图表列表)中只包含 table 的第一部分?
  2. 如何使 xtable 生成该代码?

第一部分已经在 tex.stackexchange: How to use a longtable with only one entry in the list of tables 上有了答案。它归结为在 table 的第一个 header 中使用 \caption{…} 并在随后的 header 中使用 \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 \ 

(请注意,\endlastfoot 之后的 ID & LAB 也可以进入第一个 header 部分,但使用 xtable 更容易生成上面的结构。)


第二部分有点棘手。默认情况下,xtable 在 table header 中包含一个 \caption 命令。使用print.xtableadd.to.row选项,我们可以在tablebody前面添加内容,但是不能在\caption命令前添加内容(到目前为止我所知)。

因此,为了实现如上图所示的结构,我们尽可能抑制auto-generated LaTeX代码,并手动添加正确的table header。

这可以通过 print.xtable 的选项 only.contents 来完成。所有关于 table(latex.environmentfloating 等)元数据的参数都已过时,因为我们自己编写了 table header:

<<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}

附录

解决additional question如何旋转列名的问题:

  • 在序言中添加 \usepackage{rotating}
  • 使用paste(paste("\begin{sideways}", colnames(dTab), "\end{sideways}"), collapse = " & ")代替paste(colnames(dTab), collapse = " & ")
  • rotate.colnames = TRUE 添加到 print.xtable 调用。