3

我正在使用 R 包 ( xtableand knitr) 和 Latex 包 ( longtableand 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}
4

1 回答 1

4

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

  1. 哪个 LaTeX 代码需要在 LOF(图形列表)中仅包含表格的第一部分?
  2. 如何xtable生成该代码?

第一部分已经在tex.stackexchange 上有了答案:如何使用只有一个条目的长表。它归结\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 & LABafter\endlastfoot也可以进入第一个标题部分,但上面的结构更容易使用 生成xtable。)


第二部分有点棘手。默认情况下,在表头中xtable包含一个命令。\caption使用 的add.to.row选项print.xtable,我们可以在表体前面添加内容,但我们不能在\caption命令之前添加内容(据我所知)。

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

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

<<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 = TRUEprint.xtable通话中。
于 2015-10-16T09:06:41.037 回答