longtable
has two settings for the headers of the table: \endfirsthead
and \endhead
. The contents of \endfirsthead
will be saved in the save box \LT@firsthead
and the contents of \endhead
in \LT@head
. If the box \LT@firsthead
is empty, longtable
uses the contents of \LT@head
. The same procedure will be used for the footer. In the same way I defined a \endsecondhead
\def\endsecondhead{\LT@end@hd@ft\LT@secondhead}
To use this command I have to define a new save box which will be set only on the second page.
\newbox\LT@secondhead
To make sure that only on the second page this box will be used I have to manipulate the output of longtable
. Therefore I use a simple \ifvoid
clause.
\ifvoid\LT@secondhead
\copy\LT@head\nobreak
\else
\box\LT@secondhead\nobreak
\fi
\ifvoid
tests whether the save box \LT@secondhead
is empty or not. If you set a second head, the box will be printed by \box
. This command prints the box and clears the box. So on the next page the test above is true. In this way you make sure that when no second head is defined the \endhead
will be used.
To allow for more than three different headings you must define new save boxes and extend the test.
\documentclass{article}
\usepackage{forloop,longtable}
\newcounter{count}
\setcounter{count}{1}
\makeatletter
\newbox\LT@secondhead
\def\endsecondhead{\LT@end@hd@ft\LT@secondhead}
\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
\ifvoid\LT@secondhead
\setbox\z@\vbox{\box\LT@head}%
\else
\setbox\z@\vbox{\box\LT@secondhead}%
\fi
\fi
\fi
\global\@colroom\@colht
\global\vsize\@colht
\vbox
{\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
\fi
\else
\setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
\@makecol
\@outputpage
\global\vsize\@colroom
\ifvoid\LT@secondhead
\copy\LT@head\nobreak
\else
\box\LT@secondhead\nobreak
\fi
\fi}
\makeatother
\begin{document}
\listoftables
\section{section}
\begin{longtable}{c}
\caption{foo}\\\stepcounter{table}\endfirsthead
\caption{foo bar}\\\stepcounter{table}\endsecondhead
\caption{bar}\\\endhead
\whiledo{\value{count} < 100}{\stepcounter{count}
\arabic{count} \\}
\end{longtable}
\end{document}