如何在"表格列表中仅显示一次表格标题"将表拆分为多个页面

时间:2015-10-15 21:50:45

标签: r latex knitr xtable longtable

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

我的一张桌子很长,分成多页。事实证明,"表格列表"显示此表出现的每个页码,但所有超链接都会将我带到此表的开头。

我的问题是,"表格列表"如何才能显示此表出现的第一个页码。

\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 个答案:

答案 0 :(得分:2)

这个问题需要分两部分来解答:

  1. 哪个LaTeX代码只需要在LOF(图表列表)中包含表格的第一部分?
  2. 如何让xtable生成该代码?
  3. 第一部分已经在tex.stackexchange: How to use a longtable with only one entry in the list of tables得到答案。归结为在表格的第一个标题中使用\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的{​​{1}}选项,我们可以在表体前添加内容,但我们无法在print.xtable命令之前添加内容(据我所知)。

    因此,为了实现上述结构,我们尽可能地抑制自动生成的LaTeX代码并手动添加正确的表头。

    这可以通过\caption的{​​{1}}选项完成。关于表格的元数据(only.contentsprint.xtable等)的所有参数都已过时,因为我们自己编写表头:

    latex.environment

    根据要求,LOF只包含一个条目:

    Output

    完整代码:

    floating

    附录

    解决如何轮换列名的additional question

    • <<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}") @ 添加到序言中。
    • 使用\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 = " & ")来电。