Я хотел бы задать вопрос по поводу longtable
пакета. Я уже задавал его на других форумах.
У меня есть длинная таблица (в несколько страниц), использующая longtable
пакет, и я хотел бы добавить заголовок таблицы в нижней части каждой ее части, но другой на ПЕРВОЙ странице.
longtable
пакет позволяет использовать другой "заголовок" на первой странице таблицы ( \endfirsthead
) и/или другой "нижний колонтитул" на ПОСЛЕДНЕЙ странице таблицы ( \endlastfoot
). Я бы хотел использовать другой заголовок нижнего колонтитула на ПЕРВОЙ странице таблицы.
Мой пример будет примерно таким:
Подпись к таблице на первой странице: «Таблица 1.2: Описание таблицы и т. д. и т. п.».
Подписи к таблицам на следующих страницах: «Таблица 1.2 (продолжение): Описание таблицы и т. д., и т. п.».
Он похож на пример, доступный в документации longtable
пакета об использовании \endfirsthead
, но я хочу поместить его в конец таблиц, поскольку подписи ко всем рисункам и таблицам в моем документе находятся внизу, а не в начале.
Неужели то, что я хочу сделать, настолько странно? Как я могу это сделать с помощью longtable
?
Я был бы очень признателен, если бы вы дали мне какую-либо подсказку или совет.
Заранее спасибо за ответы! :)
решение1
Вы можете попробовать следующий пример. Он добавляет \endfirstfoot
.
\documentclass{article}
\usepackage[a6paper,showframe]{geometry}
\usepackage{longtable}
\makeatletter
\newbox\LT@firstfoot
\def\endfirstfoot{\LT@end@hd@ft\LT@firstfoot}
\newdimen\LT@footdiff
\def\LT@start{%
\let\LT@start\endgraf
\endgraf\penalty\z@
\vskip\LTpre\endgraf
\LT@footdiff-\ht\LT@foot
\advance\LT@footdiff\ht\LT@firstfoot
\dimen@\pagetotal
\advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \ht\ifvoid\LT@firstfoot\LT@foot\else\LT@firstfoot\fi
\dimen@ii\vfuzz
\vfuzz\maxdimen
\setbox\tw@\copy\z@
\setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
\setbox\tw@\vbox{\unvbox\tw@}%
\vfuzz\dimen@ii
\advance\dimen@ \ht
\ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@\dp
\ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@ -\pagegoal
\ifdim \dimen@>\z@\vfil\break\fi
\global\@colroom\@colht
\ifvoid\LT@firstfoot
\ifvoid\LT@foot
\else
\advance\vsize-\ht\LT@foot
\global\advance\@colroom-\ht\LT@foot
\dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
\maxdepth\z@
\fi
\else
\advance\vsize-\ht\LT@firstfoot
\global\advance\@colroom-\ht\LT@firstfoot
\dimen@\pagegoal\advance\dimen@-\ht\LT@firstfoot\pagegoal\dimen@
\maxdepth\z@
\fi
\ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
\output{\LT@output}%
}
\def\LT@output{%
\ifnum\outputpenalty <-\@Mi
\ifnum\outputpenalty > -\LT@end@pen
\LT@err{floats and marginpars not allowed in a longtable}\@ehc
\else
\setbox\z@\vbox{\unvbox\@cclv}%
\ifdim \ht\LT@lastfoot>\ht\LT@foot
\dimen@\pagegoal
\advance\dimen@-\ht\LT@lastfoot
\ifdim\dimen@<\ht\z@
\setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
\@makecol
\@outputpage
\setbox\z@\vbox{\box\LT@head}%
\fi
\fi
\global\@colroom\@colht
\global\vsize\@colht
\vbox
{\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
\fi
\else
\ifvoid\LT@firstfoot
\setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
\@makecol
\@outputpage
\global\vsize\@colroom
\else
\setbox\@cclv\vbox{\unvbox\@cclv\box\LT@firstfoot\vss}%
\@makecol
\@outputpage
\global\advance\@colroom\LT@footdiff
\global\vsize\@colroom
\fi
\copy\LT@head\nobreak
\fi
}
\makeatother
\begin{document}
\begin{longtable}{l}
\hline first head\\\hline\endfirsthead
\hline head\\\hline\endhead
\hline first foot\\\hline\endfirstfoot
\hline (continued)\\foot\\\hline\endfoot
\hline last foot\\\hline\endlastfoot
A\\B\\C\\D\\E\\F\\G\\H\\I\\J\\K\\L\\M\\N\\O\\P\\Q\\R\\S\\T\\U\\V\\W\\X\\Y\\Z\\
a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m\\n\\o\\p\\q\\r\\s\\t\\u\\v\\w\\x\\y\\z\\
0\\1\\2\\3\\4\\5\\6\\7\\8\\9\\
\end{longtable}
\end{document}
Дополнение от Skillmon:
Приведенный выше подход будет использовать обычный foot
вместо , firstfoot
если , longtable
займет только одну страницу и lastfoot
не был использован. Следующий код почти идентичен приведенному выше коду, но он будет использовать firstfoot
на одной странице longtable
.
Приоритет для нижнего колонтитула на одной странице longtable
будет следующим:
lastfoot
, и если это пустоfirstfoot
, и если это пустоfoot
.
Код:
\documentclass{article}
\usepackage[a6paper,showframe]{geometry}
\usepackage{longtable}
\makeatletter
\newbox\LT@firstfoot
\def\endfirstfoot{\LT@end@hd@ft\LT@firstfoot}
\newdimen\LT@footdiff
\def\LT@start{%
\let\LT@start\endgraf
\endgraf\penalty\z@
\vskip\LTpre\endgraf
\LT@footdiff-\ht\LT@foot
\advance\LT@footdiff\ht\LT@firstfoot
\dimen@\pagetotal
\advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \ht\ifvoid\LT@firstfoot\LT@foot\else\LT@firstfoot\fi
\dimen@ii\vfuzz
\vfuzz\maxdimen
\setbox\tw@\copy\z@
\setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
\setbox\tw@\vbox{\unvbox\tw@}%
\vfuzz\dimen@ii
\advance\dimen@ \ht
\ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@\dp
\ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@ -\pagegoal
\ifdim \dimen@>\z@\vfil\break\fi
\global\@colroom\@colht
\ifvoid\LT@firstfoot
\ifvoid\LT@foot
\else
\advance\vsize-\ht\LT@foot
\global\advance\@colroom-\ht\LT@foot
\dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
\maxdepth\z@
\fi
\else
\advance\vsize-\ht\LT@firstfoot
\global\advance\@colroom-\ht\LT@firstfoot
\dimen@\pagegoal\advance\dimen@-\ht\LT@firstfoot\pagegoal\dimen@
\maxdepth\z@
\fi
\ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
\output{\LT@output}%
}
\def\LT@output{%
\ifnum\outputpenalty <-\@Mi
\ifnum\outputpenalty > -\LT@end@pen
\LT@err{floats and marginpars not allowed in a longtable}\@ehc
\else
\setbox\z@\vbox{\unvbox\@cclv}%
\ifdim \ht\LT@lastfoot>\ht\LT@foot
\dimen@\pagegoal
\advance\dimen@-\ht\LT@lastfoot
\ifdim\dimen@<\ht\z@
\setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
\@makecol
\@outputpage
\setbox\z@\vbox{\box\LT@head}%
\fi
\fi
\global\@colroom\@colht
\global\vsize\@colht
\vbox
{%
\unvbox\z@
\box
\ifvoid\LT@lastfoot
\ifvoid\LT@firstfoot
\LT@foot
\else
\LT@firstfoot
\fi
\else
\LT@lastfoot
\fi
}%
\fi
\else
\ifvoid\LT@firstfoot
\setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
\@makecol
\@outputpage
\global\vsize\@colroom
\else
\setbox\@cclv\vbox{\unvbox\@cclv\box\LT@firstfoot\vss}%
\@makecol
\@outputpage
\global\advance\@colroom\LT@footdiff
\global\vsize\@colroom
\fi
\copy\LT@head\nobreak
\fi
}
\makeatother
\begin{document}
\begin{longtable}{l}
\hline first head\\\hline\endfirsthead
\hline head\\\hline\endhead
\hline first foot\\\hline\endfirstfoot
\hline (continued)\\foot\\\hline\endfoot
\hline last foot\\\hline\endlastfoot
A\\B\\C\\D\\E\\F\\G\\H\\I\\J\\K\\L\\M\\N\\O\\P\\Q\\R\\S\\T\\U\\V\\W\\X\\Y\\Z\\
a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m\\n\\o\\p\\q\\r\\s\\t\\u\\v\\w\\x\\y\\z\\
0\\1\\2\\3\\4\\5\\6\\7\\8\\9\\
\end{longtable}
\end{document}
решение2
Новый пакет LaTeX3tabularray
недавно (в версии 2021L) добавлена поддержка длинных таблиц с помощью следующих шаблонов: firsthead
, firstfoot
, middlehead
, middlefoot
и .lasthead
lastfoot
\documentclass[12pt]{article}
\usepackage[a6paper,margin=15mm]{geometry}
\usepackage{tabularray}
\usepackage{xcolor}
\usepackage{hyperref}
\hypersetup{colorlinks}
\begin{document}
\DefTblrTemplate{head}{default}{}
\DefTblrTemplate{firstfoot}{default}{
\UseTblrTemplate{caption}{default}
}
\DefTblrTemplate{middlefoot,lastfoot}{default}{
\UseTblrTemplate{capcont}{default}
}
\SetTblrStyle{firstfoot}{blue3}
\SetTblrStyle{middlefoot}{\itshape}
\SetTblrStyle{caption-tag}{red3}
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text.
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text.
\begin{longtblr}[
caption = {Long Long Long Long Long Long Tabular},
entry = {Short Caption},
label = {tblr:test},
]{
colspec = {XXX}, width = \linewidth,
rowhead = 2, rowfoot = 1
}
\hline
\SetRow{purple7} Head & Head & Head \\
\hline
\SetRow{purple7} Head & Head & Head \\
\hline
Alpha & Beta & Gamma \\
\hline
Epsilon & Zeta & Eta \\
\hline
Iota & Kappa & Lambda \\
\hline
Nu & Xi & Omicron \\
\hline
Rho & Sigma & Tau \\
\hline
Phi & Chi & Psi \\
\hline
Alpha & Beta & Gamma \\
\hline
Epsilon & Zeta & Eta \\
\hline
Iota & Kappa & Lambda \\
\hline
Nu & Xi & Omicron \\
\hline
Rho & Sigma & Tau \\
\hline
Phi & Chi & Psi \\
\hline
Alpha & Beta & Gamma \\
\hline
Epsilon & Zeta & Eta \\
\hline
Iota & Kappa & Lambda \\
\hline
Nu & Xi & Omicron \\
\hline
Rho & Sigma & Tau \\
\hline
Phi & Chi & Psi \\
\hline
Alpha & Beta & Gamma \\
\hline
Epsilon & Zeta & Eta \\
\hline
Iota & Kappa & Lambda \\
\hline
Nu & Xi & Omicron \\
\hline
Rho & Sigma & Tau \\
\hline
Phi & Chi & Psi \\
\hline
Alpha & Beta & Gamma \\
\hline
Epsilon & Zeta & Eta \\
\hline
Iota & Kappa & Lambda \\
\hline
Nu & Xi & Omicron \\
\hline
Rho & Sigma & Tau \\
\hline
Phi & Chi & Psi \\
\hline
\SetRow{blue7} Foot & Foot & Foot \\
\hline
\end{longtblr}
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text.
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text.
\end{document}