summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:59:09 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:59:09 +0000
commit72c74f54d9b29d11e8a155d8fe4fadd30f462cc3 (patch)
tree1be7ad186eb24a7950646c4afdc4f73c9439de56 /Master
parent8d3e6bb6b2d9c49c46c8f65716cb67f3e0a3498a (diff)
trunk/Master/texmf-dist/source/latex/xtab
git-svn-id: svn://tug.org/texlive/trunk@596 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r--Master/texmf-dist/source/latex/xtab/xtab.dtx2292
-rw-r--r--Master/texmf-dist/source/latex/xtab/xtab.ins60
2 files changed, 2352 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/xtab/xtab.dtx b/Master/texmf-dist/source/latex/xtab/xtab.dtx
new file mode 100644
index 00000000000..39b47c81570
--- /dev/null
+++ b/Master/texmf-dist/source/latex/xtab/xtab.dtx
@@ -0,0 +1,2292 @@
+% \iffalse meta-comment
+%
+% xtab.dtx
+% Copyright 1998 Peter R. Wilson
+%
+% This program is provided under the terms of the
+% LaTeX Project Public License distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt.
+%
+% Author: Peter Wilson (CUA and NIST)
+% now at: peter.r.wilson@boeing.com
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{xtab}
+\providecommand{\captionsize}{}
+\EnableCrossrefs
+\CodelineIndex
+\setcounter{StandardModuleDepth}{1}
+\begin{document}
+ \DocInput{xtab.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+% \CheckSum{1508}
+%
+% \DoNotIndex{\',\.,\@M,\@@input,\@addtoreset,\@arabic,\@badmath}
+% \DoNotIndex{\@centercr,\@cite}
+% \DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue}
+% \DoNotIndex{\@input,\@ixpt,\@m}
+% \DoNotIndex{\@minus,\@mkboth,\@ne,\@nil,\@nomath,\@plus,\@set@topoint}
+% \DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb}
+% \DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt}
+% \DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt}
+% \DoNotIndex{\@xxpt,\@xxvpt,\\,\ ,\addpenalty,\addtolength,\addvspace}
+% \DoNotIndex{\advance,\Alph,\alph}
+% \DoNotIndex{\arabic,\ast,\begin,\begingroup,\bfseries,\bgroup,\box}
+% \DoNotIndex{\bullet}
+% \DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption}
+% \DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass}
+% \DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist}
+% \DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup}
+% \DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter}
+% \DoNotIndex{\fbox}
+% \DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef}
+% \DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule}
+% \DoNotIndex{\hsize,\hskip,\hspace,\hss,\if@tempswa,\ifcase,\or,\fi,\fi}
+% \DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi}
+% \DoNotIndex{\input}
+% \DoNotIndex{\jobname,\kern,\leavevmode,\let,\leftmark}
+% \DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark,\markboth,\markright}
+% \DoNotIndex{\month,\newcommand,\newcounter,\newenvironment}
+% \DoNotIndex{\NeedsTeXFormat,\newdimen}
+% \DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number}
+% \DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@}
+% \DoNotIndex{\pagestyle,\par,\paragraph,\paragraphmark,\parfillskip}
+% \DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions}
+% \DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright}
+% \DoNotIndex{\refstepcounter,\relax,\renewcommand,\reset@font}
+% \DoNotIndex{\rightmargin,\rightmark,\rightskip,\rlap,\rmfamily,\roman}
+% \DoNotIndex{\roman,\secdef,\selectfont,\setbox,\setcounter,\setlength}
+% \DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space}
+% \DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase}
+% \DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt}
+% \DoNotIndex{\viipt,\vipt,\vskip,\vspace}
+% \DoNotIndex{\wd,\xiipt,\year,\z@}
+%
+% \def\fileversion{v2.3}
+% \def\filedate{2000/04/09}
+% \newcommand*{\Lpack}[1]{\textsf {#1}} ^^A typeset a package
+% \newcommand*{\Lopt}[1]{\textsf {#1}} ^^A typeset an option
+% \newcommand*{\file}[1]{\texttt {#1}} ^^A typeset a file
+% \newcommand*{\Lcount}[1]{\textsl {\small#1}} ^^A typeset a counter
+% \newcommand*{\pstyle}[1]{\textsl {#1}} ^^A typeset a pagestyle
+% \newcommand*{\Lenv}[1]{\texttt {#1}} ^^A typeset an environment
+%
+% \title{The \Lpack{xtab} package\thanks{This
+% file has version number \fileversion, last revised
+% \filedate.}}
+%
+% \author{%
+% Peter Wilson\\
+% Catholic University of America\thanks{This work was originally
+% performed as
+% a Guest Researcher at the National Institute of Standards and Technology.} \\
+% Now at \texttt{peter.r.wilson@boeing.com}
+% }
+% \date{\filedate}
+% \maketitle
+% \begin{abstract}
+% The \Lpack{xtab} package enables long tables to be automatically broken
+% at page boundaries. It is an extension of the \Lpack{supertabular}
+% package and also reduces or eliminates some of its weaknesses.
+% \end{abstract}
+% \tableofcontents
+% \listoftables
+%
+% \StopEventually{}
+%
+%
+%
+% \section{Introduction}
+%
+% Although the \Lpack{xtab} package was originally developed as part of a
+% suite for typesetting ISO international standards~\cite{PRW96i}, it
+% is also applicable for use with the \LaTeX{} standard classes.
+% The package is an extension of the \Lpack{supertabular} package
+% developed by Johannes Braams and Theo
+% Jurriens.\footnote{\Lpack{supertabular.sty}, version 4.1c, 7 November 1997.}
+% It reduces some of the weaknesses noted in the \Lpack{supertabular}
+% documentation and provides additional functionality.
+%
+%
+% Section~\ref{sec:usr} provides the user manual for the package which
+% enables long tables to be automatically broken across multiple pages.
+% Section~\ref{sec:xtab} describes the implementation.
+%
+% This manual is typeset according to the conventions of the
+% \LaTeX{} \textsc{docstrip} utility which enables the automatic
+% extraction of the \LaTeX{} macro source files~\cite{GOOSSENS94}.
+%
+%
+% \section{The \Lpack{xtab} package} \label{sec:usr}
+%
+% The \Lpack{supertabular} package provides for the automatic
+% breaking of a long table across page boundaries.
+% The extension provided here enables the
+% heading on the table on the last page to differ from those on earlier
+% pages of the table.
+% The downside of the extension is that \LaTeX{} has to be run twice
+% if the document contains a |supertabular|. However, \LaTeX{} is usually
+% run at least twice for any but the simplest document in order to get
+% cross-references and Table of Contents, etc., resolved correctly.
+%
+% The current version of the extension also either cures or reduces
+% following
+% weaknesses in the \Lpack{supertabular} package.\footnote{I have
+% corresponded with the authors of \Lpack{supertabular} about these.}
+% \begin{enumerate}
+% \item Sometimes the top caption of a |supertabular| is printed on
+% one page and the body is printed on the following page(s).
+% That is, there is a lonely caption.
+% \item Sometimes the last page of a |supertabular| consists of an
+% empty table. That is, just the head and foot of the table are
+% printed.
+% \item If the number of lines in the first header for the table differs
+% from the number of lines in subsequent headers, then the
+% continuation pages of the table may be too short or, more
+% troubling, too long.
+% \end{enumerate}
+%
+% The weaknesses are caused by trying to guess where \TeX{} will put a page
+% break. The package has to guesstimate how long the next entry will be in
+% the table and, if it is too long for the available space, it puts in its
+% own page break. If its guess is off too much in one direction, \TeX{} will
+% break the page unexpectadly; if it's off in the other direction
+% \Lpack{supertabular} will put in an unnecessary page break.
+%
+% The \Lpack{xtab} package has reduced, but perhaps not entirely
+% eliminated, these weaknesses. Some hand tuning may still be required.
+%
+%
+%
+% The principal commands available are given in Table~\ref{tab:xtab}.
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\?}
+% \topcaption{The principal xtab package commands} \label{tab:xtab}
+% \tablefirsthead{\hline \multicolumn{1}{|c|}{\textbf{Command}} &
+% \multicolumn{1}{c|}{\textbf{Effect}} \\ \hline }
+% \tablehead{\multicolumn{2}{c}%
+% {{\captionsize\bfseries \tablename\ \thetable{} -- continued from previous page}} \\
+% \hline \multicolumn{1}{|c|}{\textbf{Command}} &
+% \multicolumn{1}{c|}{\textbf{Effect}} \\ \hline }
+% \tablelasthead{\multicolumn{2}{c}%
+% {{\captionsize\bfseries \tablename\ \thetable{} -- concluded from previous page}} \\
+% \hline \multicolumn{1}{|c|}{\textbf{Command}} &
+% \multicolumn{1}{c|}{\textbf{Effect}} \\ \hline }
+% \tabletail{\hline \multicolumn{2}{|r|}{{Continued on next page}} \\ \hline}
+% \tablelasttail{\hline \hline}
+%
+% \begin{center}
+% \begin{xtabular}{|l|p{0.5\textwidth}|}
+% ?\begin{xtabular}{...}? & This is equivalent to the normal
+% ?\begin{tabular}{...}? environment.
+% You supply the specification of the columns
+% just as for the normal tabular environment.
+% \\
+% &
+% All commands that can be used within a
+% \Lenv{tabular}
+% environment can also be used within
+% the \Lenv{xtabular} environment.
+% \\
+% &
+% Unlike the \Lenv{tabular} environment which prevents page breaking
+% within the tabular, the \Lenv{xtabular} allows page breaking, so that
+% tabulars can extend automatically across several pages.
+% \\
+% &
+% \Lenv{xtabular}
+% starts off with a \Lenv{tabular} environment and checks the amount of
+% space left on the page as it adds each row to the tabulation.
+% If the space left on the page is too short for another row, then
+% it ends the current \Lenv{tabular}, performs a page break and starts
+% another \Lenv{tabular} on the following page. This process is repeated
+% until all the rows have been output.
+% \\
+% &
+% There are special commands for captioning an \Lenv{xtabular} as a
+% table, and also elements can be automatically inserted after each
+% (internal) ?\begin{tabular}? and immediately before each
+% ?\end{tabular}?.
+% \\
+% &
+% Do not put a \Lenv{xtabular} in a \Lenv{table} environment,
+% as the \Lenv{table}
+% environment keeps its contents on a single page (presumably you
+% are using \Lenv{xtabular} because its contents are longer than
+% one page).
+% \\
+% ?\end{xtabular}? & End the \Lenv{xtabular} environment. \\ \hline
+% ?\begin{mpxtabular}? & Like the \Lenv{xtabular} environment
+% except that each `page' is put into a ?minipage? first.
+% \\
+% &
+% Thus it is possible to have footnotes inside an \Lenv{mpxtabular}.
+% The footnote text is printed at the end of each page.
+% \\
+% ?\end{mpxtabular}? & End the \Lenv{mpxtabular} environment. \\ \hline
+% & \textbf{Note:} If any of the following commands
+% are used, then they should be placed
+% before the particular \Lenv{xtabular}
+% environment that they apply to. \\
+% ?\topcaption{...}? & A command to provide a caption for the
+% table. The caption is placed at the top
+% of the table. \\
+% ?\bottomcaption{...}? & A command to provide a caption for the
+% table. The caption is placed at the bottom
+% of the table. \\
+% ?\tablecaption{...}? & A command to provide a caption for the
+% table. The caption is placed at the default
+% position, which is at the top
+% of the table.
+% \\
+% &
+% \textbf{Notes:} You cannot use the ?\caption?
+% command but you can put a label after
+% any of these captioning commands. If you
+% want captioning, the command must be specified
+% before the start of the supertabular environment.
+% \\
+% &
+% The ?\...caption{}? command(s) remain
+% in effect until changed by another
+% ?\...caption? command.
+% \\
+% ?\tablefirsthead{...}? & Defines the contents of the first occurence
+% of the tabular head. The tabular head is some
+% special treatment of the first row in the table.
+% This command is optional.
+% \\
+% &
+% If used, the header must be closed by the
+% end of line command for tabulars (e.g., ?\\?). \\
+% ?\tablehead{...}? & Defines the contents of the table head on
+% subsequent pages.
+% \\
+% &
+% For example, you might want to note that
+% this is a continuation of the table on
+% the previous page, as well as repeating
+% any column headings that were given
+% at the start of the \Lenv{xtabular} by
+% ?\tablefirsthead?.
+% \\
+% &
+% The header must be closed like the
+% ?\tablefirsthead? command.
+% \\
+% ?\tablelasthead{...}? & Defines the contents of the table head
+% on the last page of the table.
+% \\
+% &
+% For example, you might want to note that the table
+% is concluded on this page.
+% \\
+% &
+% The header must be closed like the
+% ?\tablefirsthead? command.
+% \\
+% ?\notablelasthead? & Switches off the last ?\tablelasthead?.
+% A ?\tablelasthead? stays in effect until
+% overwritten by a new ?\tablelasthead?
+% or cancelled by this command.
+% \\
+% ?\tabletail{...}? & The contents of this command are inserted before
+% the (internal) ?\end{tabular}? on each page except
+% for the last page of the table.
+% \\
+% &
+% For example, you might want to note that the
+% table is continued on the next page.
+% \\
+% ?\tablelasttail{...}? & The contents of this command are inserted before
+% the final (internal) ?\end{tabular}? of the table.
+% \\
+% &
+% For example, you might want to note that
+% this is where the table ends.
+% \\
+% \end{xtabular}
+% \end{center}
+% \DeleteShortVerb{\?}
+% \MakeShortVerb{\|}
+%
+% As well as the \Lenv{xtabular} and \Lenv{mpxtabular} environments there
+% are the corresponding starred versions
+% (i.e., \Lenv{xtabular*} and \Lenv{mpxtabular*} for use in
+% two column mode where the table is meant to span both columns.
+%
+% Table~\ref{tab:xtab} was produced by code similar to the following:
+% \begin{verbatim}
+% \topcaption{The principal xtab package commands} \label{tab:xtab}
+% \tablefirsthead{\hline \multicolumn{1}{|c|}{\textbf{Command}} &
+% \multicolumn{1}{c|}{\textbf{Effect}} \\ \hline }
+% \tablehead{\multicolumn{2}{c}%
+% {{\captionsize\bfseries \tablename\ \thetable{} --
+% continued from previous page}} \\
+% \hline \multicolumn{1}{|c|}{\textbf{Command}} &
+% \multicolumn{1}{c|}{\textbf{Effect}} \\ \hline }
+% \tablelasthead{\multicolumn{2}{c}%
+% {{\captionsize\bfseries \tablename\ \thetable{} --
+% concluded from previous page}} \\
+% \hline \multicolumn{1}{|c|}{\textbf{Command}} &
+% \multicolumn{1}{c|}{\textbf{Effect}} \\ \hline }
+% \tabletail{\hline \multicolumn{2}{|r|}{{Continued on next page}} \\ \hline}
+% \tablelasttail{\hline \hline}
+%
+% \begin{center}
+% \begin{xtabular}{|l|p{0.5\textwidth}|}
+% \verb|\begin{xtabular}{...}| & This is equivalent to the normal
+% \verb|\begin{tabular}{...}| environment.
+% You supply the specification of the columns
+% just as for the normal \Lenv{tabular} environment.
+% \\
+% &
+% All commands that can be used within a \Lenv{tabular}
+% environment can also be used within
+% the \Lenv{xtabular} environment.
+% \\
+% &
+% Unlike the \Lenv{tabular} environment which prevents page breaking
+% within the tabular, the \Lenv{xtabular} allows page breaking, so that
+% tabulars can extend automatically across several pages.
+% ... ... ...
+% \verb|\tablelasttail{...}| & The contents of this command are inserted before
+% the final (internal) \verb|\end{tabular}| of the table.
+% \\
+% &
+% For example, you might want to note that this is where
+% the table ends.
+% \\
+% \end{xtabular}
+% \end{center}
+% \end{verbatim}
+%
+% The table is only broken between rows --- a row will not be split
+% across pages. This can lead to some bad page breaks, especially if
+% there are rows with a large vertical height (like some in Table~\ref{tab:xtab}).
+% It is best to keep rows not too tall.
+%
+% Unkike the \Lenv{table} environment which floats, an \Lenv{xtabular}
+% environment is typeset at the point in the document where the environment
+% is specified. It is best not to start an \Lenv{xtabular} too close to the
+% bottom of a page otherwise there might be an ugly page break.
+%
+% \DescribeMacro{\shrinkheight}
+% The command
+% |\shrinkheight{|\meta{length}|}| may be
+% used after the first |\\| in the table to modify the allowed
+% height of the table on that page. A positive \meta{length} decreases
+% the allowed space on the page and a negative \meta{length} increases
+% the allowed space.
+%
+% For example: \\
+% |\shrinkheight{2\baselineskip}| decreases the space per page by
+% two lines. \\
+% |\shrinkheight{-\baselineskip}| increases the space per page by
+% one line. \\
+% Note that I have never tried using this command so I cannot comment
+% on its efficacy. Instead, I use the
+% |\xentrystretch| command when necessary.
+%
+% \DescribeMacro{\xentrystretch}
+% The command |\xentrystretch{|\meta{decimal-fraction}|}| can be used before
+% a table to modify the amount of vertical space apparently
+% consumed by each entry in the subsequent table(s).
+% The default is |\xentrystretch{0.1}| which
+% specifies a 10\% overestimate in the vertical space. Similarly,
+% |\xentrystretch{0.25}| will overestimate the space by 25\%. A different
+% value may be used for each table in order to eliminate, or at least reduce,
+% bad page breaks. Increasing the value causes fewer entries to be put on
+% a page, thus reducing the chance of \TeX{} putting in a page break before
+% the \Lpack{xtab} package is prepared for one.
+%
+%
+% You may specify the font used for the
+% |\tablehead| and |\tablelasthead| yourself.
+%
+% \textbf{Note:} Within ISO documents, captions shall
+% be in bold font. The \file{iso} class also provides
+% a command for
+% setting the size of the font used in captions, namely
+% |\captionsize|. The default value for this is set by the \file{iso} class.
+% For the curious, the default definition is: \\
+% |\newcommand{\captionsize}{\normalsize}|
+%
+% \subsection{Options}
+%
+% The \Lpack{xtab} package has three options which control the amount of
+% information that is written to the \file{.log} file. The
+% options are:
+% \begin{enumerate}
+% \item The option \Lopt{errorshow} (the default) does not
+% write any extra information;
+% \item The option \Lopt{pageshow} writes information
+% about when and why \Lpack{xtab} decides to produce a new page;
+% \item The option \Lopt{debugshow}, which also includes
+% \Lopt{pageshow}, additionally writes information about each line
+% that is added to the table.
+% \end{enumerate}
+%
+% Under normal circumstances \Lpack{xtab} is used without invoking any
+% option. The \Lopt{pageshow} option may be useful when attempting to cure
+% a bad page break. The \Lopt{debugshow} option, as its name implies, is
+% principally of use to the \Lpack{xtab} developer.
+%
+% Independently of the options, the command
+% |\sstraceon| may be used at any
+% point in the document to turn on printing of \Lopt{debugshow} data. This
+% can be turned off later by the |\sstraceoff|
+% command, which will stop all \Lopt{\ldots show} printing.
+%
+%
+% \section{The implementation} \label{sec:xtab}
+%
+% The \Lpack{xtab} package provides an extension to the
+% \Lpack{supertabular} package
+% written by Johannes Braams and Theo
+% Jurriens.\footnote{\texttt{supertabular.sty}, version 4.1c, 7 November 1997.}
+% The major portion of the following documentation is taken from
+% \file{supertabular.dtx}.
+% The package is designed to be used with the \file{iso} class in addition
+% to the usual \file{article}, etc., classes.
+%
+% \changes{v2}{1997/11/30}{xtab updated from version 3.7 to version 4.1c of supertabular}
+% The extension provided here enables the
+% heading on the table on the last page to differ from those on earlier
+% pages of the table. The implementation of the extension is based
+% on ideas in David Carlisle's \Lpack{longtable} package.
+% The downside of the extension is that \LaTeX{} has to be run twice
+% if the document contains a |supertabular|. However, \LaTeX{} is usually
+% run at least twice for any but the simplest document in order to get
+% cross-references and Table of Contents, etc., resolved correctly.
+%
+% The current version of the extension also either cures or reduces
+% following
+% weaknesses in the \Lpack{supertabular} package.\footnote{Only the first
+% two of these have been recognised by the authors of \Lpack{supertabular}.}
+% \begin{enumerate}
+% \item Sometimes the top caption of a |supertabular| is printed on
+% one page and the body is printed on the following page(s).
+% That is, there is a lonely caption.
+% \item Sometimes the last page of a |supertabular| consists of an
+% empty table. That is, just the head and foot of the table are
+% printed.
+% \item If the number of lines in the first header for the table differs
+% from the number of lines in subsequent headers, then the
+% continuation pages of the table may be too short or, more
+% troubling, too long.
+% \end{enumerate}
+%
+% The first version of \Lpack{xtab} imported much of the code from the
+% supertabular package (version 3.7) but I found that this did not work
+% well because there were incompatible coded versions of supertabular
+% available on CTAN. Further, I
+% found that there were some problems with the original \file{supertabular}
+% code in any case.\footnote{I also found a bug in the 4.1b version which
+% the authors kindly fixed in version 4.1c.}
+% I have to make the assumption that other users may have dissimilar
+% or problematic versions, so include all the code here, and thus any errors
+% can now be laid at my door.
+%
+% The requirement for compatibilty with the \file{iso} class is
+% achieved by modifications to the |\ST@caption| command only. Effectively
+% this is orthogonal to the code required to implement the extension.
+%
+% Now for the code itself. As syntactic sugar, all new macros for the
+% extension have the prefix `PWST' to distinguish them from the original
+% macros. I have also denoted all extensions to the original
+% \Lpack{supertabular} by introducing them as \emph{Extension:}.
+%
+% Announce the name and version of the package, which requires \LaTeXe.
+% \changes{v2.2}{1998/10/14}{Rewrote the documentation}
+% \changes{v2.2}{1998/10/14}{Changed names from ...supertab... to ...xtab...}
+% \changes{v2.2}{1998/10/14}{Kept supertab... as synonyms for xtab..., but deprecated them}
+% \changes{v2.2a}{2000/02/15}{Deleted supertab... }
+% \changes{v2.2a}{2000/02/15}{Updated to latest ISO class}
+% \changes{v2.3}{2000/04/09}{Improved pagebreak control via \cs{xentrystretch} }
+% \begin{macrocode}
+%<*xtab>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{xtab}[2000/04/09 v2.3 Extended supertabular package]
+
+% \end{macrocode}
+%
+% \begin{macro}{\c@tracingst}
+% There are three options with the package which control the amount
+% of information written to the log file:
+% \begin{enumerate}
+% \item \Lopt{errorshow} (the default) no extra information
+% \item \Lopt{pageshow} writes information about page breaking
+% \item \Lopt{debugshow} adds information about each line that
+% is added to the tabular
+% \end{enumerate}
+% \changes{v2}{1997/11/30}{Added options to xtab}
+% \begin{macrocode}
+\newcount\c@tracingst
+\DeclareOption{errorshow}{\c@tracingst\z@}
+% \end{macrocode}
+% \emph{Extension:} The next line in the original code did not do what
+% the authors intended; the number should have been 3 rather than 2.
+% \begin{macrocode}
+%%%%\DeclareOption{pageshow}{\c@tracingst\tw@}
+\DeclareOption{pageshow}{\c@tracingst\thr@@}
+\DeclareOption{debugshow}{\c@tracingst5\relax}
+\ProcessOptions
+
+% \end{macrocode}
+% \end{macro} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \begin{macro}{\if@topcaption}
+% \begin{macro}{\topcaption}
+% \begin{macro}{\bottomcaption}
+% The user-commands |\topcaption| and |\bottomcaption| set the
+% flag |@topcaption| to determine where to put the
+% tablecaption. The default is to put the caption on the top of
+% the table
+% \begin{macrocode}
+\newif\if@topcaption \@topcaptiontrue
+\def\topcaption{\@topcaptiontrue\tablecaption}
+\def\bottomcaption{\@topcaptionfalse\tablecaption}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PWST@thecaption}
+% \begin{macro}{\PWSTcapht}
+% \emph{Extension:} |\PWST@thecaption| is used to store
+% the text of the table's caption. The vertical space required by
+% a caption is stored in |\PWSTcapht|.
+% \changes{v2}{1997/11/30}{Added PWST@thecaption and PWSTcapht}
+% \begin{macrocode}
+\gdef\PWST@thecaption{}
+\newdimen\PWSTcapht
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tablecaption}
+% \begin{macro}{\@xtablecaption}
+% This command has to function exactly like |\caption| does except
+% it has to store its argument (and the optional argument) for
+% later processing \emph{within} the supertabular environment.
+%
+% \begin{macrocode}
+\long\def\tablecaption{%
+ \refstepcounter{table}\@dblarg{\@xtablecaption}}
+\long\def\@xtablecaption[#1]#2{%
+% \end{macrocode}
+% \emph{Extension:} I store the caption text for later measurement.
+% \begin{macrocode}
+ \long\gdef\PWST@thecaption{#2}%
+% \end{macrocode}
+% Finish up with the original code.
+% \begin{macrocode}
+ \long\gdef\@process@tablecaption{\ST@caption{table}[#1]{#2}}}
+\global\let\@process@tablecaption\relax
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifST@star}
+% This switch is used in the internal macros to remember which
+% kind of environment was started.
+% \begin{macrocode}
+\newif\ifST@star
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifST@mp}
+% This flag is used in the internal macros to remember if the
+% tabular is to be put in a minipage.
+% \changes{v2}{1997/11/30}{Added ifST@mp}
+% \begin{macrocode}
+\newif\ifST@mp
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@wd}
+% For the \Lenv{supertabular*} environment it is necessary to
+% store the intended width of the tabular.
+% \begin{macrocode}
+\newdimen\ST@wd
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@rightskip}
+% \begin{macro}{\ST@leftskip}
+% \begin{macro}{\ST@parfillskip}
+% For the \Lenv{mpsupertabular} environments we need special versions
+% of |\leftskip|, |\rightskip| and |\parfillskip|.
+% \changes{v2}{1997/11/30}{Added ST@rightskip, ST@leftskip and ST@parfillskip}
+% \begin{macrocode}
+\newskip\ST@rightskip
+\newskip\ST@leftskip
+\newskip\ST@parfillskip
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@initisotab}
+% Required for ISO class, and check if class loaded.
+% \changes{v2.2a}{2000/02/15}{Added \cs{@initisotab} command}
+% \begin{macrocode}
+\@ifundefined{@initisotab}{%
+ \newcommand{\@initisotab}{}
+ \newif\ifinfloat}{\typeout{xtab using iso captions}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@caption}
+% This is a redefinition of LaTeX's |\@caption|, |\@makecaption| is
+% called within a group so as not to return to |\normalsize|
+% globally. In the original a fix was made for the `feature' of the
+% |\@makecaption| of \file{article.sty} and friends that a caption
+% \emph{always} gets a |\vskip 10pt| at the top and \emph{none}
+% at the bottom; if a user
+% wants to precede his table with a caption this results in a
+% collision. This fix is not implemented here as I think it should
+% be done by the user modifying |\beforecaptionskip| and |\aftercaptionskip|.
+%
+% \emph{Extension:} The ISO captioning is also initialised.
+%
+% \begin{macrocode}
+\long\def\ST@caption#1[#2]#3{\par%
+ \@initisotab
+ \addcontentsline{\csname ext@#1\endcsname}{#1}%
+ {\protect\numberline{%
+ \csname the#1\endcsname}{\ignorespaces #2}}
+ \begingroup
+ \@parboxrestore
+ \normalsize
+ %% \if@topcaption \vskip -10\p@ \fi
+ \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
+ %% \if@topcaption \vskip 10\p@ \fi
+ \endgroup
+% \end{macrocode}
+% \emph{Extension:} The height of the caption is subtracted from the available
+% space on the page.
+% \changes{v2.3}{2000/04/09}{Subtracted caption height from available space in
+% \cs{ST@caption} }
+% \begin{macrocode}
+ \global\advance\ST@pageleft -\PWSTcapht
+ \ST@trace\tw@{Added caption. Space left for xtabular: \the\ST@pageleft}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tablehead}
+% \begin{macro}{\tablefirsthead}
+%
+% |\tablehead| activates the new tabular |\cr| commands.
+% \changes{v2}{1997/11/30}{Using version 4.1b of tablehead}
+% \begin{macrocode}
+\newcommand\tablehead[1]{%
+ \gdef\@tablehead{%
+ \noalign{%
+ \global\let\@savcr=\\
+ \global\let\\=\org@tabularcr}%
+ #1%
+ \noalign{\global\let\\=\@savcr}}}
+\tablehead{}
+\newcommand\tablefirsthead[1]{\gdef\@table@first@head{#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@PWSTtable}
+% \begin{macro}{\PWSTlastpage}
+% \begin{macro}{\PWSTcurpage}
+% \begin{macro}{\PWSTpenultimate}
+% \begin{macro}{\PWSTtempc}
+% \begin{macro}{\PWSTlines}
+% \begin{macro}{\PWSThead}
+% \begin{macro}{\PWSTlasthead}
+% \emph{Extension:} These are counters for the supertabular extension.
+% \Lcount{c@PWSTtable}
+% counts the number of supertabulars in case one or more are not captioned.
+% \Lcount{PWSTlastpage} is a counter holding the number of pages that a
+% supertabular uses and \Lcount{PWSTpenultimate} is the penultimate page.
+% \Lcount{PWSTcurpage} counts the current number
+% of supertabular pages processed. \Lcount{PWSTtempc} is a scratch
+% counter for page processing.
+% \changes{v2}{1997/11/30}{Changed PWSToldpages to PWSTlastpage}
+% \changes{v2}{1997/11/30}{Added counters PWSTpenultimate, PWSTlines, PWSThead and PWSTlasthead}
+% \begin{macrocode}
+\newcounter{PWSTtable}
+\newcount\PWSTlastpage
+\newcount\PWSTpenultimate
+\newcount\PWSTcurpage
+\newcount\PWSTtempc
+% \end{macrocode}
+% \emph{Extension:} \Lcount{PWSTlines} is used to count the number of
+% supertabular entry
+% lines on a page. Estimates of the number of lines in the normal table
+% heading is held by \Lcount{PWSThead}, and similarly \Lcount{PWSTlasthead}
+% is for the number of lines in the last heading.
+% \begin{macrocode}
+\newcount\PWSTlines
+%%% \newcount\PWSThead
+%%% \newcount\PWSTlasthead
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\iffirstcall}
+% \emph{Extension:} This is used by the extension code to flag if the presumed last
+% page overflows. If overflow occurs, then |firstcall| is set to false.
+% \changes{v2}{1997/11/30}{Added iffirstcall}
+% \begin{macrocode}
+\newif\iffirstcall
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWST@lastht}
+% \begin{macro}{\PWST@generalht}
+% \begin{macro}{\PWST@ht}
+% \emph{Extension:} The estimated height of a table header and tail (i.e., the height of
+% an empty table) for the last page of a supertabular is stored in
+% |\PWSTlastht|. Similarly, the corresponding height of an empty table on
+% a general page (neither the first nor the last) is stored in
+% |\PWSTgeneralht|. |\PWST@ht| is a scratch variable.
+% \changes{v2}{1997/11/30}{Added PWST@generalht, PWST@lastht and PWST@ht}
+% \begin{macrocode}
+\newdimen\PWST@lastht
+\newdimen\PWST@generalht
+\newdimen\PWST@ht
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tablelasthead}
+% \begin{macro}{\@table@last@head}
+% \begin{macro}{\notablelasthead}
+% \emph{Extension:} |\tablelasthead| is the extension user command
+% to specify the heading for
+% the last page of a supertabular. The command |\notablelasthead|
+% switches off the last heading. This has to be used if a last headed
+% table precedes one that does not have a special last head.
+% \begin{macrocode}
+\newcommand{\tablelasthead}[1]{\gdef\@table@last@head{#1}}
+\newcommand{\notablelasthead}{\let\@table@last@head\relax}
+% \end{macrocode}
+% Now initialize these commands.
+% \begin{macrocode}
+\tablelasthead{}
+\notablelasthead
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tabletail}
+% \begin{macro}{\tablelasttail}
+% |\tabletail| is the user command to specify the appearance of
+% the bottom of each tabular on a page. Special treatment is
+% given to the end of the supertabular via the |\tablelasttail|
+% command.
+%
+% If the user uses an extra amount of tabular-data (like
+% |\multicolumn|) in |\tabletail| \TeX\ starts looping because of
+% the definition of |\nextline|. So make |\\| act like just a |\cr|
+% inside this tail to prevent the loop. Save and restore the value
+% of |\\|
+%
+% \changes{v2}{1997/11/30}{tabletail revised to 4.1b version}
+% \changes{v2.1}{1998/4/13}{Added initialization of tablelasttail}
+% \begin{macrocode}
+\newcommand\tabletail[1]{%
+ \gdef\@tabletail{%
+ \noalign{%
+ \global\let\@savcr=\\
+ \global\let\\=\org@tabularcr}%
+ #1%
+ \noalign{\global\let\\=\@savcr}}}
+\tabletail{}
+\newcommand\tablelasttail[1]{\gdef\@table@last@tail{#1}}
+\tablelasttail{}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sttraceon}
+% \begin{macro}{\sttraceoff}
+% The original supertabular included a tracing mechanism to
+% follow the decisions supertabular made about page breaking.
+% This is now also used as a debugging mechanism for the
+% extension.
+%
+% \changes{v2}{1997/11/30}{Tracing revised}
+% \begin{macrocode}
+\newcommand\sttraceon{\c@tracingst5\relax}
+\newcommand\sttraceoff{\c@tracingst\z@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ST@trace}
+% A macro that gets the trace message as its argument
+% \changes{v2}{1997/11/30}{ST@trace revised to version 4.1b}
+% \begin{macrocode}
+\newcommand\ST@trace[2]{%
+ \ifnum\c@tracingst>#1\relax
+ \GenericWarning
+ {(xtab)\@spaces\@spaces}
+ {Package xtab: #2}%
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@pageleft}
+% This register holds the estimate of the amount of space left over
+% on the current page. This is used in the decision when to start a
+% new page.
+% \begin{macrocode}
+\newdimen\ST@pageleft
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\shrinkheight}
+% \begin{macro}{\setSTheight}
+% |\shrinkheight| is a command to diminish the value of
+% |\ST@pageleft| if necessary.
+%
+% |\setSTheight| sets the value of |\ST@pageleft| if necessary.
+%
+% \changes{v2}{1997/30/11}{Added shrinkheight and setSTheight commands}
+% \begin{macrocode}
+\newcommand*\shrinkheight[1]{%
+ \noalign{\global\advance\ST@pageleft-#1\relax}}
+\newcommand*\setSTheight[1]{%
+ \noalign{\global\ST@pageleft=#1\relax}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\xentrystretch}
+% \begin{macro}{\PWST@xentrystretch}
+% \emph{Extension:} Provide a user and internal command for fudging
+% the estimated space taken by a table entry. Initialise to 10\% increase.
+% \changes{v2.3}{2000/04/09}{Added \cs{xentrystretch} command}
+% \begin{macrocode}
+\newcommand{\xentrystretch}[1]{\def\PWST@xentrystretch{#1}}
+\xentrystretch{0.1}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\ST@headht}
+% \begin{macro}{\ST@tailht}
+% The register |\ST@headht| holds the height of the first head of
+% a \Lenv{supertabular}. The register |\ST@tailht| holds the
+% height of the tail.
+%
+% \changes{v2}{1997/11/30}{ST@heightht and ST@tailht defined}
+% \begin{macrocode}
+\newdimen\ST@headht
+\newdimen\ST@tailht
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ST@pagesofar}
+% Register |\ST@pagesofar| stores the estimate of the amount of the
+% page already filled up.
+% \begin{macrocode}
+\newdimen\ST@pagesofar
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@pboxht}
+% The measured (total) height of a parbox argument.
+% \begin{macrocode}
+\newdimen\ST@pboxht
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@lineht}
+% \begin{macro}{\ST@stretchht}
+% \begin{macro}{\ST@prevht}
+% The estimated height of a normal line is stored in |\ST@lineht|.
+% The register |\ST@stretchht| is used to store the difference
+% between the normal line height and the line height when |\arraystretch|
+% has a non-standard value. This is used in the case when p-box
+% entries are added to the tabular. |\ST@prevht| stores the height
+% of the previous line to use it as an estimate for the height
+% of the next line. This is needed for a better estimate of when to
+% break the tabular.
+%
+% \begin{macrocode}
+\newdimen\ST@lineht
+\newdimen\ST@stretchht
+\newdimen\ST@prevht
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ST@toadd}
+% When a tabular row is ended with |\\[...]| we need to temporarily
+% store the optional argument in |\ST@toadd|.
+% \begin{macrocode}
+\newdimen\ST@toadd
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@dimen}
+% A private scratch dimension register.
+% \begin{macrocode}
+\newdimen\ST@dimen
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@pbox}
+% A box register to store the contents of a parbox.
+% \begin{macrocode}
+\newbox\ST@pbox
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ST@tabularcr}
+% \begin{macro}{\ST@xtabularcr}
+% \begin{macro}{\ST@argtabularcr}
+% These are redefinitions of |\@tabularcr| and |\@xtabularcr|. This
+% is needed to include |\ST@cr| in the definition of
+% |\@xtabularcr|.
+%
+% All redefined macros have names that are similar to the original
+% names, except with a leading `ST'.
+% \begin{macrocode}
+\def\ST@tabularcr{%
+ {\ifnum0=`}\fi
+ \@ifstar{\ST@xtabularcr}{\ST@xtabularcr}}
+\def\ST@xtabularcr{%
+ \@ifnextchar[%]
+ {\ST@argtabularcr}%
+ {\ifnum0=`{\fi}\cr\ST@cr}}
+\def\ST@argtabularcr[#1]{%
+ \ifnum0=`{\fi}%
+ \ifdim #1>\z@
+ \unskip\ST@xargarraycr{#1}
+ \else
+ \ST@yargarraycr{#1}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\ST@xargarraycr}
+% \begin{macro}{\ST@yargarraycr}
+% In this case we need to copy the value of the optional argument
+% of |\\| in our private register |\ST@toadd|.
+% \begin{macrocode}
+\def\ST@xargarraycr#1{%
+ \@tempdima #1\advance\@tempdima \dp \@arstrutbox
+ \vrule \@height\z@ \@depth\@tempdima \@width\z@ \cr
+ \noalign{\global\ST@toadd=#1}\ST@cr}
+% \end{macrocode}
+%
+% Here we need to insert |\ST@cr|
+% \begin{macrocode}
+\def\ST@yargarraycr#1{%
+ \cr\noalign{\vskip #1\global\ST@toadd=#1}\ST@cr}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ST@startpbox}
+% The macros that deal with parbox columns need to be redefined,
+% because we need to know the size of the parbox.
+% \changes{v2}{1997/11/30}{ST@startpbox changed to 4.1b version}
+% \begin{macrocode}
+\def\ST@startpbox#1{%
+% \end{macrocode}
+% To achieve our goal we need to save the text in box.
+% \begin{macrocode}
+ \setbox\ST@pbox\vtop\bgroup\hsize#1\@arrayparboxrestore}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@astartpbox}
+% supertabular version of |\@astartpbox|.
+% \begin{macrocode}
+\def\ST@astartpbox#1{%
+ \bgroup\hsize#1%
+ \setbox\ST@pbox\vtop\bgroup\hsize#1\@arrayparboxrestore}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@endpbox}
+% \begin{macro}{\ST@aendpbox}
+% supertabular versions of |\@endpbox| and |\@aendpbox|.
+% \begin{macrocode}
+\def\ST@endpbox{%
+ \@finalstrut\@arstrutbox\par\egroup
+ \ST@dimen=\ht\ST@pbox
+ \advance\ST@dimen by \dp\ST@pbox
+ \ifnum\ST@pboxht<\ST@dimen
+ \global\ST@pboxht=\ST@dimen
+ \fi
+ \ST@dimen=\z@
+ \box\ST@pbox\hfil}
+\def\ST@aendpbox{%
+ \@finalstrut\@arstrutbox\par\egroup
+ \ST@dimen=\ht\ST@pbox
+ \advance\ST@dimen by \dp\ST@pbox
+ \ifnum\ST@pboxht<\ST@dimen
+ \global\ST@pboxht=\ST@dimen
+ \fi
+ \ST@dimen=\z@
+ \unvbox\ST@pbox\egroup\hfil}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\estimate@lineht}
+% Estimates the height of normal line taking |\arraystretch| into
+% account. Also computes the difference between a `normal' line
+% and a stretched one.
+% \changes{v2.3}{2000/04/09}{Added fudge to \cs{estimate@lineht} }
+% \begin{macrocode}
+\def\estimate@lineht{%
+ \ST@lineht=\arraystretch \baselineskip
+ \global\advance\ST@lineht by 1\p@
+ \ST@stretchht\ST@lineht\advance\ST@stretchht-\baselineskip
+ \ifdim\ST@stretchht<\z@\ST@stretchht\z@\fi
+ \ST@trace\tw@{Basic line height: \the\ST@lineht\MessageBreak%
+ Arrayed line height: \the\ST@stretchht}%
+ \global\advance\ST@lineht \PWST@xentrystretch\ST@lineht
+ \ST@trace\tw@{Stretched line height: \the\ST@lineht}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@calfirstpageht}
+% Estimates the space left on the current page and decides whether
+% the tabular can be started on this page or on a new page. Aspects
+% of the original code are modified for the extension.
+% \begin{macrocode}
+\def\@calfirstpageht{%
+ \ST@trace\tw@{Calculating height of xtabular on first page}%
+% \end{macrocode}
+% The \TeX{} register |\pagetotal| contains the height of the page
+% sofar, the \LaTeX{} register |\@colroom| contains the height of
+% the column.
+% \begin{macrocode}
+ \global\ST@pagesofar\pagetotal
+ \global\ST@pageleft\@colroom
+ \ST@trace\tw@{Height of previous text = \the\pagetotal; \MessageBreak
+ Height of column = \the\ST@pageleft}%
+% \end{macrocode}
+% When we are in twocolumn mode \TeX{} may still be collecting
+% material for the first column although there seems to be no space
+% left. In this case we have to check against two times |\ST@pageleft|.
+% \begin{macrocode}
+ \if@twocolumn
+ \ST@trace\tw@{two column mode}%
+ \if@firstcolumn
+ \ST@trace\tw@{First column}%
+ \ifnum\ST@pagesofar > \ST@pageleft
+ \global\ST@pageleft=2\ST@pageleft
+ \ifnum\ST@pagesofar > \ST@pageleft
+ \newpage\@calnextpageht
+ \ST@trace\tw@{starting new page}%
+ \else
+% \end{macrocode}
+% In this case we're in the second column, so we have to compensate
+% for the material in the first column.
+% \begin{macrocode}
+ \ST@trace\tw@{Second column}%
+ \global\advance\ST@pageleft -\ST@pagesofar
+ \global\advance\ST@pageleft -\@colroom
+ \fi
+% \end{macrocode}
+% When |\ST@pagesofar| is smaller than |\ST@pageleft| \TeX{} is still
+% collecting material for the first column, so we can start a new
+% tabular environment like we do on a single column page.
+% \begin{macrocode}
+ \else
+ \global\advance\ST@pageleft by -\ST@pagesofar
+ \global\ST@pagesofar\z@
+ \fi
+ \else
+% \end{macrocode}
+% When we end up here, \TeX{} has already decided it had enough
+% material for the first column and is building the second column.
+% \begin{macrocode}
+ \ST@trace\tw@{Second column}%
+ \ifnum\ST@pagesofar > \ST@pageleft
+ \ST@trace\tw@{starting new page}%
+ \newpage\@calnextpageht
+ \else
+ \global\advance\ST@pageleft by -\ST@pagesofar
+ \global\ST@pagesofar\z@
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% In one column mode there is a simple decision.
+% \begin{macrocode}
+ \ST@trace\tw@{one column mode}%
+ \ifnum\ST@pagesofar > \ST@pageleft
+ \ST@trace\tw@{starting new page}%
+ \newpage\@calnextpageht
+% \end{macrocode}
+% When we are not starting a new page subtract the size of the
+% material already on it from the available space.
+% \begin{macrocode}
+ \else
+ \global\advance\ST@pageleft by -\ST@pagesofar
+ \global\ST@pagesofar\z@
+ \fi
+ \fi
+ \ST@trace\tw@{Available height: \the\ST@pageleft}%
+% \end{macrocode}
+% Now we need to know the height of the head of the table. In order
+% to measure this we typeset it in a normal \Lenv{tabular} environment.
+% \begin{macrocode}
+ \ifx\@@tablehead\@empty
+ \ST@headht=\z@
+ \else
+ \setbox\@tempboxa=\vbox{\@arrayparboxrestore
+ \ST@restore
+ \expandafter\tabular\expandafter{\ST@tableformat}%
+ \@@tablehead\endtabular}%
+ \ST@headht=\ht\@tempboxa\advance\ST@headht\dp\@tempboxa
+ \fi
+ \ST@trace\tw@{Height of head: \the\ST@headht}%
+% \end{macrocode}
+% To decide when to start a new page, we need to know the vertical
+% size of the tail of the table.
+% \begin{macrocode}
+ \ifx\@tabletail\@empty
+ \ST@tailht=\z@
+ \else
+ \setbox\@tempboxa=\vbox{\@arrayparboxrestore
+ \ST@restore
+ \expandafter\tabular\expandafter{\ST@tableformat}
+ \@tabletail\endtabular}
+ \ST@tailht=\ht\@tempboxa\advance\ST@tailht\dp\@tempboxa
+ \fi
+% \end{macrocode}
+% We add the average height of a line to this because when we
+% decide to continue the tabular we need to have enough space left
+% for one line and the tail.
+% \begin{macrocode}
+ \advance\ST@tailht by \ST@lineht
+ \ST@trace\tw@{Height of tail: \the\ST@tailht}%
+% \end{macrocode}
+% \begin{macrocode}
+ \ST@trace\tw@{Maximum space for xtabular: \the\ST@pageleft}%
+% \end{macrocode}
+% Now we decide whether we can continue on the current page or
+% whether we need to start a new page. We assume that the minimum
+% height of a tabular is the height of the head and tail and one line
+% of data. If that doesn't fit, start a new page.
+% \begin{macrocode}
+ \@tempdima\ST@headht
+ \advance\@tempdima\ST@lineht
+ \advance\@tempdima\ST@tailht
+% \end{macrocode}
+% \emph{Extension:} I also add the height of the caption to the required
+% space. The amount to be added depends on whether it is a top or bottom
+% caption. Allowance is also made for skips around the caption.
+% \begin{macrocode}
+ \if@topcaption
+ \setbox\@tempboxa=\vbox{\PWST@thecaption}
+ \PWSTcapht=\ht\@tempboxa\advance\PWSTcapht\dp\@tempboxa
+ \advance\PWSTcapht by 20\p@
+ \else
+ \PWSTcapht = 10\p@
+ \fi
+ \ST@trace\tw@{Caption height: \the\PWSTcapht}%
+ \advance\@tempdima\PWSTcapht
+% \end{macrocode}
+% Continue with the original code.
+% \begin{macrocode}
+ \ST@trace\tw@{Minimum height of xtabular: \the\@tempdima}%
+ \ifnum\@tempdima>\ST@pageleft
+ \ST@trace\tw@{starting new page}%
+% \end{macrocode}
+% \emph{Extension:} The next line in the original code is
+% |\newpage\@calnextpageht|. I need to start a new page, making allowance
+% for the space required by the caption.
+% \begin{macrocode}
+ \newpage
+ \global\ST@pageleft\@colroom
+ \global\advance\ST@pageleft by -\PWSTcapht
+ \global\ST@pagesofar=\z@
+% \end{macrocode}
+% Finish up with the original code.
+% \begin{macrocode}
+ \fi
+} % end \@calfirstpageheight
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@calnextpageht}
+% This calculates the maximum height of the tabular on all
+% subsequent pages of the supertabular environment.
+% \begin{macrocode}
+\def\@calnextpageht{%
+ \ST@trace\tw@{Calculating height of xtabular on next page}%
+ \global\ST@pageleft\@colroom
+ \global\ST@pagesofar=\z@
+ \ST@trace\tw@{Maximum space for xtabular: \the\ST@pageleft}%
+ }
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWSTcalchtlines}
+% \emph{Extension:} A macro to calculate the space required by an empty table
+% and the number of lines in an empty table.
+% \changes{v2.3}{2000/04/09}{Don't calculate number of head/tail lines}
+%
+% The appropriate heads and tails are typeset in a temporary box
+% so we can measure them.
+% \changes{v2}{1997/11/30}{Added PWSTcalchtlines routine}
+% \begin{macrocode}
+\newcommand{\PWSTcalchtlines}{%
+% \end{macrocode}
+% Measure the lasttail.
+% \begin{macrocode}
+ \setbox\@tempboxa=\vbox{\@arrayparboxrestore
+ \ST@restore
+ \expandafter\tabular\expandafter{\ST@tableformat}%
+ \@table@last@tail\endtabular}%
+ \PWST@ht=\ht\@tempboxa\advance\PWST@ht\dp\@tempboxa
+ \global\PWST@lastht = \PWST@ht
+% \end{macrocode}
+% And repeat for the lasthead.
+% \begin{macrocode}
+ \setbox\@tempboxa=\vbox{\@arrayparboxrestore
+ \ST@restore
+ \expandafter\tabular\expandafter{\ST@tableformat}%
+ \@table@last@head\endtabular}%
+ \PWST@ht = \ht\@tempboxa\advance\PWST@ht\dp\@tempboxa
+ \global\advance\PWST@lastht by \PWST@ht
+ \ST@trace\tw@{Height of empty xtabular on last page = \the\PWST@lastht}%
+% \end{macrocode}
+% Now repeat pretty well all of the above for a general table (i.e.,
+% one that is not on the first page nor the designated last page).
+%
+% First the tail.
+% \begin{macrocode}
+ \setbox\@tempboxa=\vbox{\@arrayparboxrestore
+ \ST@restore
+ \expandafter\tabular\expandafter{\ST@tableformat}%
+ \@tabletail\endtabular}%
+ \PWST@ht=\ht\@tempboxa\advance\PWST@ht\dp\@tempboxa
+ \global\PWST@generalht = \PWST@ht
+% \end{macrocode}
+% And on to the general head.
+% \begin{macrocode}
+ \setbox\@tempboxa=\vbox{\@arrayparboxrestore
+ \ST@restore
+ \expandafter\tabular\expandafter{\ST@tableformat}%
+ \@tablehead\endtabular}%
+ \PWST@ht = \ht\@tempboxa\advance\PWST@ht\dp\@tempboxa
+ \global\advance\PWST@generalht by \PWST@ht
+} % end \PWSTcalchtlines
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWSTcalnextpageht}
+% \emph{Extension:} From some experiments that I ran it appeared as
+% though the \Lpack{supertabular} package ignored the
+% possibility that the
+% space required for the table header and tail on pages after the
+% first one might be different. If the subsequent head/tail combination
+% were longer (i.e., took more vertical space) then the table could
+% overflow the page. This is an attempt to fix this problem by
+% calculating the actual minimum space required after the first page.
+%
+% The calculations are similar to, but simpler, than those for
+% |\@calfirstpageht|.
+% \changes{v2}{1997/11/30}{Added PWSTcalnextpageht routine}
+% \begin{macrocode}
+\newcommand{\PWSTcalnextpageht}{%
+ \ifnum\PWSTcurpage = \PWSTpenultimate
+ \ST@trace\tw@{Calculating height of xtabular on last page}%
+% \end{macrocode}
+% We are on the penultimate page, so get the height of the
+% last head/tail.
+% \begin{macrocode}
+ \PWST@ht=\PWST@lastht
+% \end{macrocode}
+% Otherwise I need the general page data.
+% \begin{macrocode}
+ \else
+ \ST@trace\tw@{Calculating height of xtabular on next general page}%
+ \PWST@ht=\PWST@generalht
+ \fi
+% \end{macrocode}
+% Having dealt with the two cases, I can now calculate the minimum
+% space for a supertabular on the following page.
+% \begin{macrocode}
+ \global\ST@pageleft\@colroom
+ \global\advance\ST@pageleft -\PWST@ht
+ \global\ST@pagesofar=\z@
+ \ST@trace\tw@{Available space for xtabular: \the\ST@pageleft}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x@supertabular}
+% The various supertabular environments share a lot of code. Thus,
+% to avoid needless repetition, the shared code is defined
+% in this macro.
+%
+% This macro has been modified as part of the supertabular extension.
+% \begin{macrocode}
+\def\x@supertabular{%
+% \end{macrocode}
+% First save the original definition of |\tabular| and then make it
+% point to |\inner@tabular|. This is done to enable supertabular
+% cells to contain a \Lenv{tabular} environment without getting
+% unexpected results when the \Lenv{supertabular} would be split
+% across this inner \Lenv{tabular} environment.
+% \begin{macrocode}
+ \let\org@tabular\tabular
+ \let\tabular\inner@tabular
+% \end{macrocode}
+% The same has to be done for the \Lenv{tabular*} environment. The
+% coding is more verbose.
+% \begin{macrocode}
+ \expandafter\let
+ \csname org@tabular*\expandafter\endcsname
+ \csname tabular*\endcsname
+ \expandafter\let\csname tabular*\expandafter\endcsname
+ \csname inner@tabular*\endcsname
+% \end{macrocode}
+% \emph{Extension:} The original code printed out the top caption
+% at this point. If there is too little space on the first page of
+% the table, the tabular data is printed on the following page.
+% If this is the case (and its not known yet whether it is), then
+% the caption should also be printed on the following page.
+% \begin{macrocode}
+%%%% \if@topcaption \@process@tablecaption \fi
+% \end{macrocode}
+% Back to the original code. Save the original definition of |\\|.
+% \begin{macrocode}
+ \global\let\@oldcr=\\
+% \end{macrocode}
+% Save the current value of |\baselineskip|, as we need it in the
+% calculation of the average height of a line.
+% \begin{macrocode}
+ \def\baslineskp{\baselineskip}%
+% \end{macrocode}
+% We have to check whether \texttt{array.sty} was loaded, because
+% some of the internal macros have different names.
+% \begin{macrocode}
+ \ifx\undefined\@classix
+% \end{macrocode}
+% Save old |\@tabularcr| and insert the definition of
+% |\@stabularcr|.
+% \begin{macrocode}
+ \let\org@tabularcr\@tabularcr
+ \let\@tabularcr\ST@tabularcr
+% \end{macrocode}
+% Activate the new parbox algorithm.
+% \begin{macrocode}
+ \let\org@startpbox=\@startpbox
+ \let\org@endpbox=\@endpbox
+ \let\@@startpbox=\ST@startpbox
+ \let\@@endpbox=\ST@endpbox
+ \else
+% \end{macrocode}
+% When \texttt{array.sty} was loaded things are a bit different.
+% \begin{macrocode}
+ \let\org@tabularcr\@arraycr
+ \let\@arraycr\ST@tabularcr
+ \let\org@startpbox=\@startpbox
+ \let\org@endpbox=\@endpbox
+ \let\@startpbox=\ST@astartpbox
+ \let\@endpbox=\ST@aendpbox
+ \fi
+% \end{macrocode}
+%
+% Check if the head of the table should be different for the first
+% and subsequent pages.
+% \begin{macrocode}
+ \ifx\@table@first@head\undefined
+ \let\@@tablehead=\@tablehead
+ \else
+ \let\@@tablehead=\@table@first@head
+ \fi
+% \end{macrocode}
+% The first part of a supertabular may be moved to the next page
+% if it doesn't fit on the current page. Subsequent parts can not
+% be moved; therefore we will have to switch the definition of
+% |\ST@skippart| around.
+% \begin{macrocode}
+ \let\ST@skippage\ST@skipfirstpart
+% \end{macrocode}
+% Now we can estimate the average line height and the height
+% of the first page of the supertabular.
+% \begin{macrocode}
+ \estimate@lineht
+ \@calfirstpageht
+% \end{macrocode}
+% \emph{Extension:} Call the macro to initialize the extension code for
+% this table.
+% \begin{macrocode}
+ \PWSTinit
+% \end{macrocode}
+% \emph{Extension:} At this point I know, and have adjusted for, the
+% page on which the first part of the table will be printed. It should now
+% be safe to print the top caption, if any. Unfortunately, in spite of
+% everthing, the \TeX{} page breaking
+% mechanism might still think that there is too little space left.
+% \begin{macrocode}
+ \if@topcaption \@process@tablecaption \fi
+ \noindent
+% \end{macrocode}
+% \emph{Extension:} Finally, subtract the space required by the header
+% and the tail (as these don't update the available space when output).
+% \changes{v2.3}{2000/04/09}{Subtracted head/tail space in \cs{x@supertabular} }
+% \begin{macrocode}
+ \global\advance\ST@pageleft -\ST@headht%
+ \ST@trace\tw@{Available space after accounting for header: \the\ST@pageleft}%
+ \global\advance\ST@pageleft -\ST@tailht%
+ \ST@trace\tw@{Available space after accounting for tail: \the\ST@pageleft}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWSTinit}
+% \emph{Extension:} This routine initialises the extension data.
+% \changes{v2}{1997/11/30}{Added PWSTinit routine}
+% \begin{macrocode}
+\newcommand{\PWSTinit}{%
+% \end{macrocode}
+% At the end of processing each supertabular (see later) the number of
+% pages consumed by the supertabular is written to the \file{.aux} file.
+% At the start of a supertabular, after incrementing the number of
+% supertabulars processed, the prior number of pages are read from
+% the file. These are stored in \Lcount{PWSTlastpage}.
+% \begin{macrocode}
+ \global\advance\c@PWSTtable\@ne
+ \global\expandafter\let\expandafter\PWSTtempc
+ \csname PWST@\romannumeral\c@PWSTtable\endcsname
+% \end{macrocode}
+% I have to take account of the fact that there might be no entry in
+% the \file{.aux} file, and hence the lastpage number might not be set.
+% \begin{macrocode}
+ \ifx\PWSTtempc\relax
+ \ST@trace\tw@{Table \the\c@PWSTtable: Processing for the first time}%
+ \PWSTlastpage=\@m % = 1000
+ \else
+ \PWSTlastpage=\PWSTtempc
+ \fi
+ \ST@trace\tw@{Table \the\c@PWSTtable: last page set to \the\PWSTlastpage}%
+% \end{macrocode}
+% Set the current page counter to unity.
+% \begin{macrocode}
+ \PWSTcurpage=\@ne
+% \end{macrocode}
+% Perform the calculations for the empty table data.
+% \begin{macrocode}
+ \PWSTcalchtlines
+% \end{macrocode}
+% Initialise the line counter and set |firstcall| to TRUE.
+% \begin{macrocode}
+ \global\PWSTlines=\z@
+ \global\firstcalltrue
+% \end{macrocode}
+% If we have the \file{iso} class, then I have to flag that we are
+% in a `float'.
+% \changes{v2}{1997/12/02}{Added setting of \cs{ifinfloat}}
+% \begin{macrocode}
+ \infloattrue
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xtabular}
+% We start by looking for an optional argument, which will be duly
+% ignored as it seems to make no sense to try to align a multipage
+% table in the middle...
+%
+% \emph{Extension:} Use \Lenv{xtabular} instead of \Lenv{supertabular},
+% and similarly for the others, so this will
+% not be mentioned explicitly again.
+% \begin{macrocode}
+\def\xtabular{%
+ \@ifnextchar[{\@supertabular}%]
+ {\@supertabular[]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@supertabular}
+% We can now save the preamble of the tabular in a macro.
+% \begin{macrocode}
+\def\@supertabular[#1]#2{%
+ \def\ST@tableformat{#2}
+ \ST@trace\tw@{Starting a new xtabular}%
+% \end{macrocode}
+% Then remember that this is not a \textsf{supertabular*}
+% environment.
+% \begin{macrocode}
+ \global\ST@starfalse
+% \end{macrocode}
+% Don't use minipages.
+% \begin{macrocode}
+ \global\ST@mpfalse
+% \end{macrocode}
+% Most of the following code is shared between the
+% \Lenv{supertabbular} and \Lenv{supertabular*} environments. So to
+% avoid duplication it is stored in a macro.
+% \begin{macrocode}
+ \x@supertabular
+% \end{macrocode}
+% Finally start a normal \Lenv{tabular} environment.
+% \begin{macrocode}
+ \expandafter\org@tabular\expandafter{\ST@tableformat}%
+ \@@tablehead}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xtabular*}
+% We start by looking for the optional argument of the tabular
+% environment.
+% \begin{macrocode}
+\@namedef{xtabular*}#1{%
+ \@ifnextchar[{\@nameuse{@supertabular*}{#1}}%
+ {\@nameuse{@supertabular*}{#1}[]}%]
+ }
+% \end{macrocode}
+% We start by saving the intended width and the preamble of the
+% \Lenv{tabular*}.
+% \begin{macrocode}
+\@namedef{@supertabular*}#1[#2]#3{%
+ \ST@trace\tw@{Starting a new xtabular*}%
+ \def\ST@tableformat{#3}%
+ \ST@wd=#1\relax
+ \global\ST@startrue
+ \global\ST@mpfalse
+% \end{macrocode}
+% Now we can call the common code for both environments.
+% \begin{macrocode}
+ \x@supertabular
+% \end{macrocode}
+% And we can start a normal \Lenv{tabular*} environment.
+% \begin{macrocode}
+ \expandafter\csname org@tabular*\expandafter\endcsname
+ \expandafter{\expandafter\ST@wd\expandafter}%
+ \expandafter{\ST@tableformat}%
+ \@@tablehead}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mpxtabular}
+% This version of the supertabular environment puts each tabular into
+% a minipage, thus making footnotes possible. We start by looking for
+% an optional argument, which will be ignored as it makes no sense
+% to try and align a multipage table in the middle\ldots
+% \changes{v2}{1997/11/30}{Added the mpsupertabular}
+% \begin{macrocode}
+\def\mpxtabular{%
+ \@ifnextchar[{\@mpsupertabular}%]
+ {\@mpsupertabular[]}}
+% \end{macrocode}
+%
+% We can now save the preamble in a macro.
+% \begin{macrocode}
+\def\@mpsupertabular[#1]#2{%
+ \def\ST@tableformat{#2}%
+ \ST@trace\tw@{Starting a new mpxtabular}%
+% \end{macrocode}
+% Remember that this is not a \Lenv{mpsupertabular*} environment
+% and also note we have to close the minipage later.
+% \begin{macrocode}
+ \global\ST@starfalse
+ \global\ST@mptrue
+% \end{macrocode}
+% Since we are about to start a minipage of |\columnwidth| the
+% horizontal alignment will not work. We have to remember the values
+% and then restore them inside the minipage.
+% \begin{macrocode}
+ \ST@rightskip \rightskip
+ \ST@leftskip \leftskip
+ \ST@parfillskip \parfillskip
+% \end{macrocode}
+% Call the code that is common to all the environments.
+% \begin{macrocode}
+ \x@supertabular
+% \end{macrocode}
+% Finally, start a normal \Lenv{tabular}
+% \begin{macrocode}
+ \minipage{\columnwidth}%
+ \parfillskip\ST@parfillskip
+ \rightskip \ST@rightskip
+ \leftskip \ST@leftskip
+ \noindent\expandafter\org@tabular\expandafter{\ST@tableformat}%
+ \@@tablehead}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mpxtabular*}
+% We start by looking for the optional argument of the tabular environment.
+% \begin{macrocode}
+\@namedef{mpxtabular*}#1{%
+ \@ifnextchar[{\@nameuse{@mpsupertabular*}{#1}}%
+ {\@nameuse{@mpsupertabular*}{#1}[]}%]
+}
+% \end{macrocode}
+%
+% Now we can save the intended width and the preamble of
+% the \Lenv{tabular*}.
+% \begin{macrocode}
+\@namedef{@mpsupertabular*}#1[#2]#3{%
+ \ST@trace\tw@{Starting a new mpxtabular*}%
+ \def\ST@tableformat{#3}%
+ \ST@wd=#1\relax
+ \global\ST@startrue
+ \global\ST@mptrue
+ \ST@rightskip \rightskip
+ \ST@leftskip \leftskip
+ \ST@parfillskip \parfillskip
+% \end{macrocode}
+% Now is the time to call the common code for both environments.
+% \begin{macrocode}
+ \x@supertabular
+% \end{macrocode}
+% And we can start a normal \Lenv{tabular*} environment.
+% \begin{macrocode}
+ \minipage{\columnwidth}%
+ \parfillskip\ST@parfillskip
+ \rightskip \ST@rightskip
+ \leftskip \ST@leftskip
+ \noindent\expandafter\csname org@tabular*\expandafter\endcsname
+ \expandafter{\expandafter\ST@wd\expandafter}%
+ \expandafter{\ST@tableformat}%
+ \@@tablehead}%
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endxtabular}
+% \begin{macro}{\endxtabular*}
+% These close the \Lenv{xtabular} and \Lenv{xtabular*}
+% environments.
+%
+% For the extension, this macro has been modified to write out
+% to the \file{.aux} file the
+% number of pages used for the supertabular.
+% \begin{macrocode}
+\def\endxtabular{%
+ \ifx\@table@last@tail\undefined
+ \@tabletail
+ \else
+ \@table@last@tail
+ \fi
+ \csname endtabular\ifST@star*\fi\endcsname
+% \end{macrocode}
+% While studying the original code to determine where additions were
+% needed for the extension, I realized that the last part of
+% the |\end...| code was common to all the environments. I have broken
+% it out into a seperate routine which also includes the modification
+% needed for the extension.
+% \begin{macrocode}
+ \x@endsupertabular
+% \end{macrocode}
+% And back to the original code.
+% \begin{macrocode}
+ \ST@trace\tw@{Ended a xtabular\ifST@star*\fi}%
+ }
+% \end{macrocode}
+%
+% The definition of the ending of the \Lenv{xtabular*}
+% environment is simple:
+% \begin{macrocode}
+\expandafter\let\csname endxtabular*\endcsname\endxtabular
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\x@endsupertabular}
+% This macro contains the code that is common to all the |\end...|
+% commands. It includes the modification required for the extension.
+% \changes{v2}{1997/11/30}{Added x@endsupertabular routine}
+% \begin{macrocode}
+\newcommand{\x@endsupertabular}{%
+% \end{macrocode}
+% Restore the original definition of |\@tabularcr|
+% \begin{macrocode}
+ \ST@restore
+% \end{macrocode}
+% Check if we have to insert a caption and restore to default
+% behaviour of putting captions at the top.
+% \begin{macrocode}
+ \if@topcaption
+ \else
+ \@process@tablecaption
+ \global\@topcaptiontrue
+ \fi
+% \end{macrocode}
+% Restore the meaning of |\\| to the one it had before the start
+% of this environment. Also re-initialize some control-sequences
+% \begin{macrocode}
+ \global\let\\=\@oldcr
+ \global\let\@table@first@head\undefined
+%%% \global\let\@table@last@tail\undefined
+ \global\let\@process@tablecaption\relax
+% \end{macrocode}
+% \emph{Extension:} For the extension, write the number of the last page
+% to the \file{.aux} file. Also, if we are in the \file{iso} class, reset
+% the `float' flag.
+% \changes{v2}{1997/12/02}{Added resetting of \cs{ifinfloat}}
+% \begin{macrocode}
+ \PWSToplastpagenum
+ \infloatfalse
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWSToplastpagenum}
+% \emph{Extension:} This routine is responsible for writing the number of the
+% last page of the supertabular to the \file{.aux} file.
+%
+% What gets written is
+% |\PWST@vi{4}|, assuming that the value of \Lcount{c@PWSTtable} is 6
+% and the value of \Lcount{PWSTcurpage} is 4.
+% \changes{v2}{1997/11/30}{Added PWSToplastpagenum routine}
+% \changes{v2.3}{2000/04/09}{Just checked for number of entry lines in \cs{PWSToplastpagenum} }
+% \begin{macrocode}
+\newcommand{\PWSToplastpagenum}{%
+% \end{macrocode}
+% There are a number of cases to consider. The first decision is whether
+% the current page is the previously calculated last page.
+% \begin{macrocode}
+ \ifnum\PWSTcurpage=\PWSTlastpage
+% \end{macrocode}
+% The current table ends on the calculated last page. There are four
+% cases to consider:
+% \begin{enumerate}
+% \item The table has not overflowed (|firstcall| is TRUE) and the table
+% is not empty --- this page is still the last page.
+% \item The table has not overflowed (|firstcall| is TRUE) and the table
+% is empty --- this page is after the actual last page, so decrease
+% the page number.
+% \item The table has overflowed (|firstcall| is FALSE) and the overflow
+% is large enough to generate a non-empty table on the next page ---
+% increment the page number.
+% \item The table has overflowed (|firstcall| is FALSE) and the overflow
+% is small enough to generate an empty table on the next page ---
+% this page is still the last page.
+% \end{enumerate}
+% \begin{macrocode}
+ \iffirstcall % on last, no overflow
+%% \ifnum\PWSTlines < \PWSTlasthead % this table is empty
+ \ifnum\PWSTlines < \@ne % this table is empty
+ \global\advance\PWSTcurpage \m@ne
+ \fi
+ \else % overflow
+%% \ifnum\PWSTlines > \tw@ % enough for another page
+ \ifnum\PWSTlines > \z@ % enough for another page
+ \global\advance\PWSTcurpage \@ne
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% The table has ended on a page that is not the calculated last page.
+% If the table is empty, then decrement the page number, else this is
+% the last page.
+% \begin{macrocode}
+%% \ifnum\PWSTlines < \PWSThead % empty table
+ \ifnum\PWSTlines < \@ne % empty table
+ \global\advance\PWSTcurpage \m@ne
+ \fi
+ \fi
+% \end{macrocode}
+% Finally, write out the `new' last page number.
+% \begin{macrocode}
+ \if@filesw\immediate\write\@auxout%
+ {\gdef\string\PWST@\romannumeral\c@PWSTtable{\the\PWSTcurpage}}
+ \ST@trace\tw@{Table \the\c@PWSTtable:\MessageBreak
+ wrote \the\PWSTcurpage\space as the last page}%
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\endmpxtabular}
+% \begin{macro}{\endmpxtabular*}
+% These close the \Lenv{mpxtabular} and \Lenv{mpxtabular*}
+% environments.
+% \begin{macrocode}
+\def\endmpxtabular{%
+ \ifx\@table@last@tail\undefined
+ \@tabletail
+ \else
+ \@table@last@tail
+ \fi
+ \csname endtabular\ifST@star*\fi\endcsname
+ \endminipage
+% \end{macrocode}
+% Now call the common code for all |\end...|.
+% \begin{macrocode}
+ \x@endsupertabular
+% \end{macrocode}
+% Finish per the original code.
+% \begin{macrocode}
+ \ST@trace\tw@{Ended an mpxtabular\ifST@star*\fi}%
+ }
+% \end{macrocode}
+%
+% The definition of the ending of the \Lenv{mpxtabular*}
+% environment is simple:
+% \begin{macrocode}
+\expandafter\let\csname endmpxtabular*\endcsname\endmpxtabular
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ST@restore}
+% This macro restores the original definitions of the macros that
+% handle parbox entries and the `end of row' macros.
+% \begin{macrocode}
+\def\ST@restore{%
+ \ifx\undefined\@classix
+ \let\@tabularcr\org@tabularcr
+ \else
+ \let\@arraycr\org@tabularcr
+ \fi
+ \let\@startpbox\org@startpbox
+ \let\@endpbox\org@endpbox
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\inner@tabular}
+% \begin{macro}{\inner@tabular*}
+% In order to facilitate complete \Lenv{tabular} environments to be in
+% a cell of a \Lenv{supertabular} we need to adapt the definition
+% of the original environments. For the inner \Lenv{tabular} a
+% number of definitions have to be restored.
+% \begin{macrocode}
+\def\inner@tabular{%
+ \ST@restore
+ \let\\=\@oldcr
+ \noindent
+ \org@tabular}
+\@namedef{inner@tabular*}{%
+ \ST@restore
+ \let\\=\@oldcr
+ \noindent
+ \csname org@tabular*\endcsname}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ST@cr}
+% This macro is called by each |\\| inside the tabular environment.
+% It updates the estimate of the amount of space left on the
+% current page and starts a new page if necessary.
+% \begin{macrocode}
+\def\ST@cr{%
+ \noalign{%
+ \ST@trace\thr@@{Parbox height: \the\ST@pboxht\MessageBreak
+ Line height: \the\ST@lineht}%
+ \ifnum\ST@pboxht<\ST@lineht
+% \end{macrocode}
+% If there is a non-empty line, but an empty parbox, then
+% |\ST@pboxht| might be non-zero, but too small thereby breaking
+% the algorithm. Therefore we estimate the height of the line to be
+% |\ST@lineht| in this case, and store it in |\ST@prevht|.
+% \begin{macrocode}
+ \global\advance\ST@pageleft -\ST@lineht
+ \global\ST@prevht\ST@lineht
+ \else
+% \end{macrocode}
+% When the parbox is not empty we take its height into account
+% plus a little extra.
+% \changes{v2.3}{2000/04/09}{Used \cs{PWST@xentrystretch} in \cs{ST@cr} }
+% \begin{macrocode}
+ \global\advance\ST@pboxht \PWST@xentrystretch\ST@pboxht
+ \global\advance\ST@pboxht \ST@stretchht
+ \ST@trace\thr@@{Added par box with height \the\ST@pboxht}%
+ \global\advance\ST@pageleft -\ST@pboxht
+ \global\ST@prevht\ST@pboxht
+ \global\ST@pboxht\z@
+ \fi
+% \end{macrocode}
+% |\ST@toadd| is the value of the optional argument of |\\|.
+% \begin{macrocode}
+ \global\advance\ST@pageleft -\ST@toadd
+ \global\ST@toadd=\z@
+ \ST@trace\thr@@{Space left for xtabular: \the\ST@pageleft}%
+% \end{macrocode}
+% \emph{Extension:} Increment the line number at this point.
+% \begin{macrocode}
+ \global\advance\PWSTlines \@ne
+ \ST@trace\thr@@{Line counter incremented by one to: \the\PWSTlines}%
+ } % end of noalign
+% \end{macrocode}
+% In general, when the |\ST@pageleft| has become negative,
+% the last row was so high
+% that the supertabular doesn't fit on the current page. In this case we
+% skip the current page and start at the top of the next one; otherwise
+% \TeX{} will move this part of the table to a new page anyway, probably
+% with a message about an overfull |\vbox|.
+%
+% \emph{Extension:} For the extension I do some special handling if we are on the last
+% page. Essentially the idea is not to start a new page, but to continue
+% on the current page, noting any overflow.
+% \begin{macrocode}
+ \ifnum\PWSTcurpage=\PWSTlastpage
+ \PWST@lastpagecr
+ \else
+% \end{macrocode}
+% Execute the original code.
+% \begin{macrocode}
+ \ifnum\ST@pageleft<\z@
+ \ST@skippage
+ \else
+% \end{macrocode}
+% When there is not enough space left on the current page, we start
+% a new page. To compute the amount of space needed we use the height
+% of the previous line (|\ST@prevht|) as an estimate of the height
+% of the next line. If we are processing an \Lenv{mpsupertabular}
+% we also need to take the height of the footnotes into account.
+% \begin{macrocode}
+ \noalign{\global\@tempdima\ST@tailht
+ \global\advance\@tempdima\ST@prevht
+ \ifST@mp
+ \ifvoid\@mpfootins\else
+ \global\advance\@tempdima\ht\@mpfootins
+ \global\advance\@tempdima 3pt
+ \fi
+ \fi} % end noalign
+ \ifnum\ST@pageleft<\@tempdima
+ \ST@newpage
+ \else
+% \end{macrocode}
+% This line is necessary because the tablehead has to be inserted
+% \emph{after} the |\if\else\fi|-clause. For this purpose |\ST@next| is
+% used. In the middle of tableprocessing it should be an \emph{empty}
+% macro (\emph{not} |\relax|).
+% \begin{macrocode}
+ \noalign{\global\let\ST@next\@empty}%
+ \fi
+ \fi
+% \end{macrocode}
+% \emph{Extension:} Close off the |\iflastpage|;
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% and finish per the original code.
+% \begin{macrocode}
+ \ST@next}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWST@lastpagecr}
+% \emph{Extension:} This routine handles newlines on the last page
+% of a supertabular. The idea is that when we are on the last page the
+% table continues to be processed until the end without calling for a
+% newpage even if the table will be too long. I do need to record whether
+% or not the table has `overflowed' the allowable space on the page.
+% The code is very similar to the last part of the code for |\ST@cr|.
+% \changes{v2}{1997/11/30}{Added PWST@lastpagecr routine}
+% \begin{macrocode}
+\newcommand{\PWST@lastpagecr}{%
+ \noalign{%
+ \ifnum\ST@pageleft<\z@
+% \end{macrocode}
+% The table has overflowed, so record the fact.
+% \begin{macrocode}
+ \PWST@setfirstcall
+ \fi
+% \end{macrocode}
+% Now continue along the lines of |\ST@cr|.
+% \begin{macrocode}
+ \global\@tempdima\ST@tailht
+ \global\advance\@tempdima\ST@prevht
+ \ifST@mp
+ \ifvoid\@mpfootins\else
+ \global\advance\@tempdima\ht\@mpfootins
+ \global\advance\@tempdima 3pt
+ \fi
+ \fi
+ \ifnum\ST@pageleft<\@tempdima
+% \end{macrocode}
+% Again, the table has overflowed.
+% \begin{macrocode}
+ \PWST@setfirstcall
+ \fi
+% \end{macrocode}
+% Finish like |\ST@cr|.
+% \begin{macrocode}
+ \global\let\ST@next\@empty
+ } % end noalign
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWST@setfirstcall}
+% \emph{Extension:} This routine records that a table on the last page
+% has overflowed
+% by setting |firstcall| to FALSE. If it is the first such overflow
+% it also zeroes the line counter.
+% \changes{v2}{1997/11/30}{Added PWST@setfirstcall routine}
+% \begin{macrocode}
+\newcommand{\PWST@setfirstcall}{%
+ \iffirstcall
+ \global\firstcallfalse
+ \global\PWSTlines=\z@
+ \ST@trace\thr@@{Overflow on last page. Line counter set to \the\PWSTlines}%
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@skipfirstpart}
+% This macro skips the current page and moves the entire supertabular
+% that has been built so far to the next page.
+% \begin{macrocode}
+\def\ST@skipfirstpart{%
+ \noalign{%
+ \ST@trace\tw@{Tabular too high, moving to next page}%
+% \end{macrocode}
+% In order for this to work properly we need to adapt the value of
+% |\ST@pageleft|. When this macro is called it has a negative value.
+% We should add the height of the next page to that (|\@colroom|).
+% From the result the `normal' height of the supertabular should be
+% subtracted (|\@colroom - \pagetotal|). This could be coded as follows:
+% \begin{verbatim}
+% \ST@dimen\@colroom
+% \advance\ST@dimen-\pagetotal
+% \global\advance\ST@pageleft\@colroom
+% \global\advance\ST@pageleft-\ST@dimen
+% \end{verbatim}
+% However, note that |\@colroom| is added \emph{and} subtracted. Thus the
+% code can be simplified to:
+% \begin{macrocode}
+ \global\advance\ST@pageleft\pagetotal
+% \end{macrocode}
+% Then we can set |\ST@pagesofar| to zero and start the new page.
+% \begin{macrocode}
+ \global\ST@pagesofar\z@
+ \newpage
+% \end{macrocode}
+% Finally we make sure that this macro can only be executed once for
+% each supertabular by changing the definition of |\ST@skippage|.
+% \begin{macrocode}
+ \global\let\ST@skippage\ST@newpage
+ }
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ST@newpage}
+% This macro performs the actions necessary to start a new page.
+%
+% This macro is also modified for the extension to supertabluar.
+%
+% \begin{macrocode}
+\def\ST@newpage{%
+ \noalign{\ST@trace\tw@{Starting new page, writing tail}}%
+% \end{macrocode}
+% Output |\tabletail|, close the tabular environment, close a minipage
+% if necessary, output all material and start a fresh new page.
+% \begin{macrocode}
+ \@tabletail
+ \ifST@star
+ \csname endtabular*\endcsname
+ \else
+ \endtabular
+ \fi
+ \ifST@mp
+ \endminipage
+ \fi
+% \end{macrocode}
+% Then we make sure that |\ST@skippage| can no longer be executed for
+% this supertabular by changing its definition.
+% \begin{macrocode}
+ \global\let\ST@skippage\ST@newpage
+% \end{macrocode}
+% On with the output.
+%
+% \emph{Extension:} The original code had the next line as
+% |\newpage\@calnextpageht|. However, if the general header has a
+% vertical height that differs from the first header, then the table
+% on the continuation pages may run short or, more disconcerting, long.
+% The extension, I think, cures that by using a different algorithm to
+% calculate the height on the next page.
+% \changes{v2}{1997/11/30}{Replaced @calnextpageht by PWSTcalnextpageht in ST@newpage}
+% \begin{macrocode}
+ \newpage\PWSTcalnextpageht
+ \ST@trace\tw@{writing head}%
+% \end{macrocode}
+% \emph{Extension:} The original code just let |\ST@next| to |\@tablehead|.
+% The extension
+% has to handle the special case of of the heading on the last page.
+% \begin{macrocode}
+ \PWSTsethead
+% \end{macrocode}
+% Now we are back to the original supertabular code.
+% \begin{macrocode}
+ \ifST@mp
+ \noindent\minipage{\columnwidth}%
+ \parfillskip\ST@parfillskip
+ \rightskip \ST@rightskip
+ \leftskip \ST@leftskip
+ \fi
+ \noindent
+ \ifST@star
+ \expandafter\csname org@tabular*\expandafter\endcsname
+ \expandafter{\expandafter\ST@wd\expandafter}%
+ \expandafter{\ST@tableformat}%
+ \else
+ \expandafter\org@tabular\expandafter{\ST@tableformat}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PWSTsethead}
+% \emph{Extension:} This is more extension code for use within |\ST@newpage|.
+% It provides the proper table head for the page about to be processed.
+% \changes{v2}{1997/11/30}{Added PWSTsethead routine}
+% \begin{macrocode}
+\newcommand{\PWSTsethead}{%
+% \end{macrocode}
+% First the line counter is zeroed.
+% \begin{macrocode}
+ \global\PWSTlines=\z@
+ \ST@trace\thr@@{Newpage, line counter set to: \the\PWSTlines}%
+% \end{macrocode}
+% The current page counter is incremented
+% and it is checked against the old page counter to see if this is
+% the last page of this supertabular.
+% \begin{macrocode}
+ \global\advance\PWSTcurpage\@ne
+ \ST@trace\tw@{Table \the\c@PWSTtable:\MessageBreak
+ current page = \the\PWSTcurpage,\MessageBreak
+ last page = \the\PWSTlastpage}%
+ \ifnum\PWSTcurpage=\PWSTlastpage
+ \ST@trace\tw@{Newpage is the last page}%
+% \end{macrocode}
+% We are on the last page. If there are more than
+% one pages and the last table heading has been specified,
+% then the heading is set to |\@table@last@head|, otherwise it is set
+% to |\@tablehead|.
+% \begin{macrocode}
+ \ifnum\PWSTcurpage>\@ne
+ \ifx\@table@last@head\relax
+ \let\ST@next\@tablehead
+ \ST@trace\tw@{Set heading to tablehead}%
+ \else
+ \let\ST@next\@table@last@head
+ \ST@trace\tw@{Set heading to tablelasthead}%
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% We are not on the last page, so just set the heading to |\@tablehead|.
+% \begin{macrocode}
+ \let\ST@next\@tablehead
+ \ST@trace\tw@{Set heading to tablehead}%
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+
+% The end of this package
+% \begin{macrocode}
+%</xtab>
+% \end{macrocode}
+%
+%
+%
+% \bibliographystyle{alpha}
+%
+% \begin{thebibliography}{GMS94}
+%
+% \bibitem[GMS94]{GOOSSENS94}
+% Michel Goossens, Frank Mittelbach, and Alexander Samarin.
+% \newblock {\em The LaTeX Companion}.
+% \newblock Addison-Wesley Publishing Company, 1994.
+%
+% \bibitem[Wil96]{PRW96i}
+% Peter~R. Wilson.
+% \newblock {\em {LaTeX for standards: The LaTeX package files user manual}}.
+% \newblock NIST Report NISTIR, June 1996.
+%
+% \end{thebibliography}
+%
+%
+% \Finale
+% \PrintIndex
+%
+\endinput
+
+%% \CharacterTable
+%% {Upper-case \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
+%% Lower-case \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
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
diff --git a/Master/texmf-dist/source/latex/xtab/xtab.ins b/Master/texmf-dist/source/latex/xtab/xtab.ins
new file mode 100644
index 00000000000..9899ebdb90d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/xtab/xtab.ins
@@ -0,0 +1,60 @@
+%%
+%% xtab.ins
+%% Copyright 1998 Peter R. Wilson
+%%
+%% This program is provided under the terms of the
+%% LaTeX Project Public License distributed from CTAN
+%% archives in directory macros/latex/base/lppl.txt.
+%%
+%% Author: Peter Wilson (CUA and NIST)
+%% now at: peter.r.wilson@boeing.com
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\batchfile{xtab.ins}
+\input docstrip.tex
+\preamble
+
+ Copyright 1998 Peter R. Wilson
+
+ This program is provided under the terms of the
+ LaTeX Project Public License distributed from CTAN
+ archives in directory macros/latex/base/lppl.txt.
+
+Author: Peter Wilson (CUA and NIST)
+ now at peter.r.wilson@boeing.com
+
+\endpreamble
+
+\keepsilent
+
+%%% \Msg{*** Generating the driver file ***}
+%%% \generateFile{xtab.drv}{t}{\from{xtab.dtx}{driver}}
+
+\Msg{*** Generating the LaTeX2e package files ***}
+
+\generateFile{xtab.sty}{t}{\from{xtab.dtx}{xtab}}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file(s) into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space xtab.sty}
+\Msg{*}
+\Msg{*}
+\Msg{* To produce the documentation run the files ending with}
+\Msg{* `.dtx' through LaTeX.}
+\Msg{* Process any name.idx file by:}
+\Msg{* \space\space\space\space makeindex -s gind.ist name}
+\Msg{* Process any name.glo file by:}
+\Msg{* \space\space\space\space makeindex -s gglo.ist -o name.gls name.glo}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+
+\endinput