Как отображать заголовок таблицы только один раз в "списке таблиц" для таблицы, разбитой на несколько страниц
Я использую пакеты 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 ответ
На этот вопрос нужно ответить в двух частях:
- Какой код LaTeX требуется для включения только первой части таблицы в LOF (Список рисунков)?
- Как сделать
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
вызов.