如何在 "list of table" 中仅显示一次 table 标题,将 table 分成多个页面
How to only show table caption once in "list of table" for a table split onto multiple pages
我正在使用 R 包(xtable
和 knitr
)和 Latex 包(longtable
和 hyperref
)来准备文档。
我的一篇 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}
这个问题需要分两部分回答:
- 哪个 LaTeX 代码需要在 LOF(图表列表)中只包含 table 的第一部分?
- 如何使
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.xtable
的add.to.row
选项,我们可以在tablebody前面添加内容,但是不能在\caption
命令前添加内容(到目前为止我所知)。
因此,为了实现如上图所示的结构,我们尽可能抑制auto-generated LaTeX代码,并手动添加正确的table header。
这可以通过 print.xtable
的选项 only.contents
来完成。所有关于 table(latex.environment
、floating
等)元数据的参数都已过时,因为我们自己编写了 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
调用。
我正在使用 R 包(xtable
和 knitr
)和 Latex 包(longtable
和 hyperref
)来准备文档。
我的一篇 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}
这个问题需要分两部分回答:
- 哪个 LaTeX 代码需要在 LOF(图表列表)中只包含 table 的第一部分?
- 如何使
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.xtable
的add.to.row
选项,我们可以在tablebody前面添加内容,但是不能在\caption
命令前添加内容(到目前为止我所知)。
因此,为了实现如上图所示的结构,我们尽可能抑制auto-generated LaTeX代码,并手动添加正确的table header。
这可以通过 print.xtable
的选项 only.contents
来完成。所有关于 table(latex.environment
、floating
等)元数据的参数都已过时,因为我们自己编写了 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
调用。