summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/memoir/memoir.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-12-12 21:24:10 +0000
committerKarl Berry <karl@freefriends.org>2018-12-12 21:24:10 +0000
commit5c9613c8e5ee20a6d2a318def5ec195d866ef734 (patch)
treef4d31360d0add93dd9da21f01dc670269e449f4d /Master/texmf-dist/source/latex/memoir/memoir.dtx
parent07419f17633908b8ff6f03a58fdc582f676d2ddd (diff)
memoir (12dec18)
git-svn-id: svn://tug.org/texlive/trunk@49394 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/memoir/memoir.dtx')
-rw-r--r--Master/texmf-dist/source/latex/memoir/memoir.dtx5398
1 files changed, 2739 insertions, 2659 deletions
diff --git a/Master/texmf-dist/source/latex/memoir/memoir.dtx b/Master/texmf-dist/source/latex/memoir/memoir.dtx
index 3bf13b2e751..2fd0bb32a55 100644
--- a/Master/texmf-dist/source/latex/memoir/memoir.dtx
+++ b/Master/texmf-dist/source/latex/memoir/memoir.dtx
@@ -20,7 +20,7 @@
% This work consists of the files listed in the README file.
%
% \fi
-% \CheckSum{31006}
+% \CheckSum{31004}
%
% \changes{v0.1}{2001/05/20}{First public alpha release}
% \changes{v0.2}{2001/06/03}{First beta release}
@@ -115,7 +115,9 @@
% \changes{v3.7e}{2015/07/08}{Per request from LaTeX Team, etex is not
% autoloaded on newer kernels}
% \changes{v3.7f}{2016/05/16}{Maintenance, luatex85 and booktabs update}
-%
+%
+% \changes{v3.7h}{2018/12/12}{Maintenance, removing some emulated packages}
+%
% \def\dtxfile{memoir.dtx}
%
% \def\fileversion{v0.1} \def\filedate{2001/05/20}
@@ -169,7 +171,8 @@
% \def\fileversion{v3.7d} \def\filedate{2015/04/23}
% \def\fileversion{v3.7e} \def\filedate{2015/07/08}
% \def\fileversion{v3.7f} \def\filedate{2016/05/16}
-% \def\fileversion{v3.7g} \def\filedate{2018/04/04} ^^A remember to fix
+% \def\fileversion{v3.7g} \def\filedate{2018/04/04}
+% \def\fileversion{v3.7h} \def\filedate{2018/12/12} ^^A remember to fix
% \title{The LaTeX \Lpack{memoir} class for configurable book
% typesetting: Source code\thanks{This
% file (\texttt{\dtxfile}) has version number \fileversion, last revised
@@ -400,11 +403,11 @@
% Announce the name, option files and version for LaTeX2e files:
% \begin{macrocode}
%<class>\ProvidesClass{memoir}%
-%<class> [2018/04/04 v3.7g configurable book, report, article document class]
+%<class> [2018/12/12 v3.7h configurable book, report, article document class]
% \end{macrocode}
% In the manual it is useful to know the current version.
% \begin{macrocode}
-%<class>\newcommand\memversion{v3.7g, 2018/04/04}
+%<class>\newcommand\memversion{v3.7h, 2018/12/12}
%<9pt>\ProvidesFile{mem9.clo}%
%<9pt> [2008/01/30 v0.4 memoir class 9pt size option]
%<10pt>\ProvidesFile{mem10.clo}%
@@ -5986,7 +5989,7 @@
The material used in the footer is too large^^J%
(\the\mem@maxfootheight) for the given foot skip
(\the\footskip), it is recommended to^^J%
- either increase the foot skip or redesign the fotoer^^J%
+ either increase the foot skip or redesign the footer^^J%
(in both cases you will find help in the memoir manual).%
}
% \end{macrocode}
@@ -7192,6 +7195,7 @@
% \end{macro}
%
% \begin{macro}{\SingleSpacing}
+% \begin{macro}{\SingleSpacing*}
% \cs{SingleSpacing} starts single spacing. (In package was \cs{singlespacing}).
% \changes{v3.6g}{2010/09/19}{Added reset of the float and page note spacings}
% \begin{macrocode}
@@ -7199,12 +7203,21 @@
\setSpacing{\m@m@singlespace}%
\edef\m@m@footnote@spacing{\baselinestretch}%
\edef\m@m@float@spacing{\baselinestretch}%
- \vskip\baselineskip% correction for coming into single spacing
+% \end{macrocode}
+% \changes{v3.7h}{2018/09/19}{Added the ifstar and \cs{@noocument}}
+% We can have a strange interaction with \Lpack{tikz} if this
+% \cs{vskip} is emitted in the preamble. We use a trick (via David
+% Carlisle) to check whether we are in the preamble, and only emit the
+% vskip if we are not. \cs{@ifstar} added to let the user disable the
+% vskip if needed.
+% \begin{macrocode}
+ \@ifstar{}{\ifx\@nodocument\relax\vskip\baselineskip\fi}% correction for coming into single spacing
}
\SingleSpacing
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
%
% \begin{macro}{\@OnehalfSpacing}
@@ -14815,2072 +14828,2087 @@
% \end{macro}
%
%
-% \section{Array and tabular}
+% \section{Array and tabularx}
%
% \subsection{Array}%
%
-% The description and code are essentially copied from the \Lpack{array}
-% package~\cite{ARRAY}.
-%
-% \begin{macrocode}
-
-%%%%%%%%%% Array package code %%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%% With acknowledgements to %%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%% Frank Mittelbach & David Carlisle %%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%% Copy corresponds to array.sty 2016/10/06 v2.4d %%%%%%%%%
-% \end{macrocode}
-% \changes{v3.7g}{2018/03/05}{Updated the embedded copy of the
-% \Lpack{array} package to version 2.4d, 2016/10/06}
-% \begin{dlf}
-% dlf: The \Lpack{array} package has redundant code (caused by a
-% quick mashing of and earlier \Lpack{array} version and the
-% \Lpack{newaray} package). In thus update (2018/03/05) this
-% redundant code is \emph{not} removed as it makes it very hard to
-% see where there are class changes to the \Lpack{array} code, and
-% when stuff is simply removed. We'll leave it up to the LaTeXteam to
-% clean up the \Lpack{array} code at some point.
-%
-% The following is a carbon copy of the DTX code from
-% \verb|array.dtx|, package specific \cs{changes} lines have been
-% removed, and we have made any error/warning messages class specific,
-% instead of package specific.
-% \end{dlf}
-%
-
-% \subsubsection{The construction of the preamble}
-%
-% It is obvious that those environments will consist mainly of an
-% \verb=\halign=, because \TeX\ typesets tables using this primitive.
-% That is why we will now take a look at the algorithm which determines
-% a preamble for a \verb=\halign= starting with a given user preamble
-% using the options mentioned above.
-%
-% The most interesting macros of this implementation are without doubt
-% those which are responsible for the construction of the preamble for
-% the \verb=\halign=. The underlying algorithm was developed by
-% \textsc{Lamport} (resp.\ \textsc{Knuth}, see texhax V87\#??), and it
-% has been extended and improved.
-%
-% The user preamble will be read \textsf{token} by \textsf{token}. A
-% \textsf{token} is a single character like \texttt{c} or a block
-% enclosed in \verb={...}=. For example the preamble of
-% \verb=\begin{tabular}=\linebreak[0]\verb={lc||c@{\hspace{1cm}}}= consists of
-% the \textsf{token} \texttt{l}, \texttt{c}, \texttt{|}, \texttt{|},
-% \texttt{@} and \verb=\hspace{1cm}=.
-%
-% The currently used \textsf{token} and the one, used before, are needed
-% to decide on how the construction of the preamble has to be
-% continued.
-% In the example mentioned above the \texttt{l} causes the preamble
-% to begin with \verb=\hskip\tabcolsep=. Furthermore
-% \verb=# \hfil= would be appended to define a flush left column.
-% The next \textsf{token} is a \texttt{c}. Because it was preceded by an
-% \texttt{l} it generates a new column. This is done with
-% \verb=\hskip \tabcolsep & \hskip \tabcolsep=. The column which is to
-% be centered will be appended with \verb=\hfil # \hfil=.
-% The \textsf{token} \texttt{|} would then add a space of
-% \verb=\hskip \tabcolsep=
-% and a vertical line because the last
-% \textsf{tokens} was a \texttt{c}.
-% The following \textsf{token} \texttt{|} would only add a space
-% \verb=\hskip \doublerulesep= because it was preceded by the
-% \textsf{token} \texttt{|}. We will not discuss our example further but
-% rather take a look at the general case of constructing preambles.
-%
-% The example shows that the desired preamble for the
-% \verb=\halign= can be constructed as soon as the action of all
-% combinations
-% of the preamble \textsf{tokens} are specified. There are 18 such
-% \textsf{tokens}
-% so we have $19 \cdot 18 = 342$ combinations if we count the
-% beginning of
-% the preamble as a special \textsf{token}. Fortunately, there are many
-% combinations which generate the same spaces, so we can define
-% \textsf{token} classes. We will identify a
-% \textsf{token} within a class with a number, so we can insert the
-% formatting (for example of a column).
-% Table~\ref{tab:Klassen} lists all \textsf{token} classes and
-% their corresponding numbers.
-% \begin{table}[ht]
-% \begin{center}
-% \begin{tabular}[t]{>{\ttfamily}ccc}
-% \textsf{token} & \verb=\@chclass= & \verb=\@chnum= \\[2mm]
-% c & 0 & 0 \\
-% l & 0 & 1 \\
-% r & 0 & 2 \\
-% p-arg & 0 & 3 \\
-% t-arg & 0 & 4 \\
-% b-arg & 0 & 5 \\
-% | & 1 & 0 \\
-% !-arg & 1 & 1 \\
-% <-arg & 2 & --- \\
-% >-arg & 3 & ---
-% \end{tabular}
-% \kern3mm \vrule \kern3mm%
-% \begin{tabular}[t]{>{\ttfamily}ccc}
-% \textsf{token} & \verb=\@chclass= & \verb=\@chnum= \\[2mm]
-% Start & 4 & --- \\
-% @-arg & 5 & --- \\
-% ! & 6 & --- \\
-% @ & 7 & --- \\
-% < & 8 & --- \\
-% > & 9 & --- \\
-% p & 10 & 3 \\
-% t & 10 & 4 \\
-% b & 10 & 5
-% \end{tabular}
-% \end{center}
-% \caption{Classes of preamble \textsf{tokens}}
-% \label{tab:Klassen}
-% \end{table}
-%
-%
-% \begin{macro}{\@chclass}
-% \begin{macro}{\@chnum}
-% \begin{macro}{\@lastchclass}
-% The class and the number of the current \textsf{token} are saved in
-% the
-% \textsf{count} registers \verb=\@chclass=
-% and \verb=\@chnum=, while the class of the previous
-% \textsf{token} is stored in the
-% \textsf{count} register \verb=\@lastchclass=.
-% All of the mentioned registers are already allocated in
-% \texttt{latex.tex},
-% which is the reason why the following three lines of code are
-% commented out.
-% Later throughout the text I will not mention it again explicitly
-% whenever I use a \verb=%= sign. These parts are already defined in
-% \texttt{latex.tex}.
-% \begin{macrocode}
-% \newcount \@chclass
-% \newcount \@chnum
-% \newcount \@lastchclass
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@addtopreamble}
-% We will save the already constructed preamble for
-% the \verb=\halign=
-% in the global macro \verb=\@preamble=. This will then be
-% enlarged with
-% the command \verb=\@addtopreamble=.
-% \begin{macrocode}
-\def\@addtopreamble#1{\xdef\@preamble{\@preamble #1}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-% \subsubsection{The character class of a \textsf{token}}
-%
-% \begin{macro}{\@testpach}
-% With the help of \verb=\@lastchclass= we can now define a macro
-% which determines the class and the number of a given preamble
-% \textsf{token}
-% and assigns them to the registers
-% \verb=\@chclass= and \verb=\@chnum=.
-% \begin{macrocode}
-\def\@testpach{\@chclass
-% \end{macrocode}
-% First we deal with the cases in which the \textsf{token}
-% (\verb=#1=) is the argument of \texttt{!}, \texttt{@}, \texttt{<} or
-% \texttt{>}. We can see this from the value of \verb=\@lastchclass=:
-% \begin{macrocode}
- \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
- \ifnum \@lastchclass=7 5 \else
- \ifnum \@lastchclass=8 \tw@ \else
- \ifnum \@lastchclass=9 \thr@@
-% \end{macrocode}
-% Otherwise we will assume that the \textsf{token} belongs to the
-% class $0$
-% and assign the corresponding number to \verb=\@chnum= if our
-% assumption is correct.
-% \begin{macrocode}
- \else \z@
-% \end{macrocode}
-% If the last \textsf{token} was a \texttt{p}, \texttt{m} or a
-% \texttt{b}, \verb=\@chnum= already has the right value. This is the
-% reason for the somewhat curious choice of the \textsf{token}
-% numbers in class $10$.
-% \begin{macrocode}
- \ifnum \@lastchclass = 10 \else
-% \end{macrocode}
-% Otherwise we will check if \verb=\@nextchar= is either a \texttt{c},
-% \texttt{l} or an \texttt{r}. Some applications change the
-% catcodes of certain characters like ``\texttt{@}'' in
-% \texttt{amstex.sty}. As a result the tests below would fail since
-% they assume non-active character tokens. Therefore we evaluate
-% \verb=\@nextchar= once thereby turning the first token of its
-% replacement text into a char. At this point here this should have
-% been the only char present in \verb=\@nextchar= which put into via a
-% \verb=\def=.
-% \begin{macrocode}
- \edef\@nextchar{\expandafter\string\@nextchar}%
- \@chnum
- \if \@nextchar c\z@ \else
- \if \@nextchar l\@ne \else
- \if \@nextchar r\tw@ \else
-% \end{macrocode}
-% If it is a different \textsf{token}, we know that the class was
-% not $0$. We assign the value $0$ to \verb=\@chnum= because this value
-% is needed for the \texttt{|}--\textsf{token}. Now we must check
-% the remaining classes. Note that the value of \verb=\@chnum= is
-% insignificant here for most classes.
-% \begin{macrocode}
- \z@ \@chclass
- \if\@nextchar |\@ne \else
- \if \@nextchar !6 \else
- \if \@nextchar @7 \else
- \if \@nextchar <8 \else
- \if \@nextchar >9 \else
-% \end{macrocode}
-% The remaining permitted \textsf{tokens} are \texttt{p},
-% \texttt{m} and \texttt{b} (class $10$).
-% \begin{macrocode}
- 10
- \@chnum
- \if \@nextchar m\thr@@\else
- \if \@nextchar p4 \else
- \if \@nextchar b5 \else
-% \end{macrocode}
-% Now the only remaining possibility is a forbidden \textsf{token},
-% so we choose class $0$ and number $0$ and give an error message.
-% Then we finish the macro by closing all \verb=\if='s.
-% \begin{macrocode}
- \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi
- \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-% \subsubsection{Multiple columns ($*$--form)}
-%
-% \begin{macro}{\@xexpast}
-% \begin{macro}{\the@toks}
-% \begin{macro}{\the@toksz}
-% \label{@xexpast} Now we discuss the macro that deletes all forms
-% of type \verb=*{=\textit{N\/}\verb=}{=\textit{String\/}\verb=}= from a user
-% preamble and replaces them with \textit{N} copies of
-% \textit{String}. Nested $*$--expressions are dealt with
-% correctly, that means $*$--expressions are not substituted if
-% they are in explicit braces, as in \verb=@{*}=.
-%
-% This macro is called via
-% \verb=\@xexpast=\meta{preamble}\verb=*0x\@@=.
-% The $*$--expression \verb=*0x= is being used to terminate the
-% recursion,
-% as we shall see later, and \verb=\@@= serves as an argument
-% delimiter. \verb=\@xexpast= has four arguments. The first
-% one is the part of the
-% user preamble before the first $*$--expression while the second
-% and third ones are the arguments of the first $*$--expression
-% (that is \textit{N} and \textit{String} in the notation mentioned
-% above).
-% The fourth argument is the rest of the preamble.
-% \begin{macrocode}
-\def\@xexpast#1*#2#3#4\@@{%
-% \end{macrocode}
-% The number of copies of \textit{String} (\verb=#2=) that are to be
-% produced will be saved in a \textsf{count} register.
-% \begin{macrocode}
- \@tempcnta #2
-% \end{macrocode}
-% We save the part of the preamble which does not
-% contain a $*$--form (\verb=#1=)
-% in a \PlainTeX\ \textsf{token} register.
-% We also save \textit{String} (\verb=#3=) using a \LaTeX\
-% \textsf{token} register.
-% \begin{macrocode}
- \toks@={#1}\@temptokena={#3}%
-% \end{macrocode}
-% Now we have to use a little trick to produce \textit{N} copies of
-% \textit{String}.
-% We could try \verb=\def\@tempa{#1}= and then
-% \textit{N} times \verb=\edef\@tempa{\@tempa#3}=. This would have the
-% undesired effect that all macros within \verb=#1= and \verb=#3=
-% would be expanded, although, for example, constructions like
-% \verb=@{..}= are not supposed to be changed.
-% That is why we \verb=\let= two control sequences to
-% be equivalent to \verb=\relax=.
-% \begin{macrocode}
- \let\the@toksz\relax \let\the@toks\relax
-% \end{macrocode}
-% Then we ensure that \verb=\@tempa= contains
-% \verb={\the@toksz\the@toks...\the@toks}= (the macro
-% \verb=\the@toks= exactly \textit{N\/} times) as substitution text.
-% \begin{macrocode}
- \def\@tempa{\the@toksz}%
- \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
- {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
-% \end{macrocode}
-% If \textit{N\/} was greater than zero we prepare for another call
-% of \verb=\@xexpast=. Otherwise we assume we have reached the end of
-% the user preamble, because we had appended \verb=*0x\@@= when we first
-% called \verb=\@xexpast=. In other words: if the user inserts
-% \verb=*{0}{..}= in his preamble, \LaTeX\ ignores the rest of it.
-% \begin{macrocode}
- \let \@tempb \@xexpast \else
- \let \@tempb \@xexnoop \fi
-% \end{macrocode}
-% Now we will make sure that the part of the user preamble, which
-% was already dealt with, will be saved again in \verb=\@tempa=.
-% \begin{macrocode}
- \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
- \edef\@tempa{\@tempa}%
-% \end{macrocode}
-% We have now evaluated the first $*$--expression, and the user
-% preamble up to this point
-% is saved in \verb=\@tempa=. We will put the contents of
-% \verb=\@tempa= and the rest of the user preamble together and work
-% on the result with \verb=\@tempb=. This macro either corresponds
-% to \verb=\@xexpast=, so that the next
-% $*$--expression is handled, or to the macro \verb=\@xexnoop=,
-% which only ends the recursion by deleting its argument.
-% \begin{macrocode}
- \expandafter \@tempb \@tempa #4\@@}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@xexnoop}
-% So the first big problem is solved. Now it is easy to
-% specify \verb=\@xexnoop=.
-% Its argument is delimited by \verb=\@@= and it simply expands to
-% nothing.
-% \begin{macrocode}
-% \def\@xexnoop#1\@@{}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \subsubsection{The insertion of declarations
-% (\texttt{>}, \texttt{<}, \texttt{!}, \texttt{@})}
-%
-%
-% The preamble will be enlarged with the help of \verb=\xdef=, but the
-% arguments of \texttt{>}, \texttt{<},~\texttt{!}\ and \texttt{@} are
-% not supposed to be expanded during the construction (we want an
-% implementation that doesn't need a \verb=\protect=). So we have to find a
-% way to inhibit the expansion of those arguments.
-%
-% We will solve this problem with \textsf{token} registers. We need
-% one register for every \texttt{!}\ and \texttt{@}, while we need two
-% for every \texttt{c}, \texttt{l}, \texttt{r}, \texttt{m}, \texttt{p}
-% or \texttt{b}. This limits the number of columns of a table because
-% there are only 256 \textsf{token} registers. But then, who needs
-% tables with more than 100 columns?
-%
-% One could also find a solution which only needs two or three
-% \textsf{token} registers by proceeding similarly as in the macro
-% \verb=\@xexpast= (see page \pageref{@xexpast}). The advantage of our
-% approach is the fact that we avoid some of the problems that arise
-% with the other method\footnote{Maybe there are also historical
-% reasons.}.
-%
-% So how do we proceed? Let us assume that we had \verb=!{foo}= in the
-% user preamble and say we saved \texttt{foo} in
-% \textsf{token} register $5$. Then we call
-% \verb=\@addtopreamble{\the@toks5}= where
-% \verb=\the@toks= is defined in a way that it does not expand
-% (for example it could be equivalent to \verb=\relax=). Every
-% following call
-% of \verb=\@addtopreamble= leaves \verb=\the@toks5= unchanged in
-% \verb=\@preamble=. If the construction of the preamble is completed
-% we change the definition of \verb=\the@toks= to
-% \verb=\the\toks= and expand \verb=\@preamble= for the last time.
-% During this process all parts of the form
-% \verb=\the@toks=\meta{Number}
-% will be substituted by the contents of the respective \textsf{token}
-% registers.
-%
-% As we can see from this informal discussion the construction of the
-% preamble has to take place within a group, so that the
-% \textsf{token} registers we use will be freed later on. For that
-% reason we keep all assignments to \verb=\@preamble= global; therefore the
-% replacement text of this macro will remain the same after we leave
-% the group.
-%
-% \begin{macro}{\count@}
-% We further need a \textsf{count} register to remember which
-% \textsf{token} register is to be used next. This will be
-% initialized with $-1$ if we want to begin with the \textsf{token}
-% register $0$. We use the \PlainTeX\ scratch register \verb=\count@=
-% because everything takes place locally. All we have to do is
-% insert \verb=\the@toks= \verb=\the= \verb=\count@= into the preamble.
-% \verb=\the@toks= will remain unchanged and \verb=\the\count@= expands into
-% the saved number.
-% \end{macro}
-%
-% \begin{macro}{\prepnext@tok}
-% The macro \verb=\prepnext@tok= is in charge of preparing the next
-% \textsf{token} register. For that purpose we increase
-% \verb=\count@= by $1$:
-% \begin{macrocode}
-\def\prepnext@tok{\advance \count@ \@ne
-% \end{macrocode}
-% Then we locally delete any contents the
-% \textsf{token} register might have.
-% \begin{macrocode}
- \toks\count@{}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\save@decl}
-% During the construction of the preamble the current
-% \textsf{token} is always saved in the macro \verb=\@nextchar= (see the
-% definition of \verb=\@mkpream= on page \pageref{@mkpream}). The macro
-% \verb=\save@decl= saves it into the next free \textsf{token} register,
-% i.e.\ in \verb=\toks\count@=.
-% \begin{macrocode}
-\def\save@decl{\toks\count@ \expandafter{\@nextchar}}
-% \end{macrocode}
-% The reason for the use of \verb=\relax= is the following
-% hypothetical situation in the preamble:
-% \quad \verb=..\the\toks1\the\toks2..= \quad \TeX\ expands
-% \verb=\the\toks2= first in order to find out if the digit \verb=1=
-% is followed by other digits. E.g.\ a \verb=5= saved in the
-% \textsf{token} register $2$ would lead \TeX\ to insert the contents
-% of \textsf{token} register $15$ instead of $1$ later on.
-%
-% The example above referred to an older version of \verb=\save@decl= which
-% inserted a \verb=\relex= inside the token register. This is now moved to
-% the places where the actual token registers are inserted (look for
-% \verb=\the@toks=) because the old version would still make= @=
-% expressions to moving arguments since after expanding the second
-% register while looking for the end of the number the contents of the
-% token register is added so that later on the whole register will be
-% expanded. This serious bug was found after nearly two years
-% international use of this package by Johannes Braams.
-% \end{macro}
-%
-%
-%
-% How does the situation look like, if we want to add another column
-% to the preamble, i.e.\ if we have found a \texttt{c}, \texttt{l},
-% \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in the user
-% preamble? In this case we have the problem of the \textsf{token}
-% register from \verb=>{..}= and \verb=<{..}= having to be inserted at this
-% moment because formatting instructions like \verb=\hfil= have to be set
-% around them. On the other hand it is not known yet, if any \verb=<{..}=
-% instruction will appear in the user preamble at all.
-%
-% We solve this problem by adding two \textsf{token} registers at a
-% time. This explains, why we have freed the \textsf{token} registers
-% in \verb=\prepnext@tok=.
-%
-% \begin{macro}{\insert@column}
-% \begin{macro}{\@sharp}
-% We now define the macro \verb=\insert@column= which will do
-% this work for us.
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{array} package. Now replaced by requiring the packge instead.
% \begin{macrocode}
-\def\insert@column{%
+\RequirePackage{array}[2018/04/30]
% \end{macrocode}
-% Here, we assume that the \textsf{count} register
-% \verb=\@tempcnta= has saved the value $\verb=\count@= - 1$.
-% \begin{macrocode}
- \the@toks \the \@tempcnta
-% \end{macrocode}
-% Next follows the \verb=#= sign which specifies the place
-% where the text of the column shall be inserted. To avoid
-% errors during the expansions in
-% \verb=\@addtopreamble= we hide this sign in the command
-% \verb=\@sharp= which is temporarily occupied with
-% \verb=\relax= during the build-up of the preamble.
-% To remove unwanted spaces before and after the column text, we set
-% an \verb=\ignorespaces= in front and a \verb=\unskip= afterwards.
-% \begin{macrocode}
- \ignorespaces \@sharp \unskip
-% \end{macrocode}
-% Then the second \textsf{token} register follows whose number should
-% be saved in \verb=\count@=.
-% We make sure that there will be no further expansion after reading
-% the number, by finishing with \verb=\relax=. The case above is not
-% critical since it is ended by \verb=\ignorespaces=.
-% \begin{macrocode}
- \the@toks \the \count@ \relax}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-% \subsubsection{The separation of columns}
-%
-% \begin{macro}{\@addamp}
-% In the preamble a \verb=&= has to be inserted between any two columns;
-% before the first column there should not be a \verb=&=. As the user
-% preamble may start with a \texttt{|} we have to remember somehow
-% if we have already inserted a \verb=#= (i.e.\ a column). This is done
-% with the boolean variable \verb=\if@firstamp= that we test in
-% \verb=\@addamp=, the macro that inserts the \verb=&=.
-% \begin{macrocode}
-% \newif \@iffirstamp
-% \def\@addamp{\if@firstamp \@firstampfalse
-% \else \@addtopreamble &\fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@acol}
-% \begin{macro}{\@acolampacol}
-% \begin{macro}{\col@sep}
-% We will now define some abbreviations for the extensions,
-% appearing most often in the preamble build-up.
-% Here \verb=\col@sep= is a \textsf{dimen} register which is set
-% equivalent to \verb=\arraycolsep= in an \textsf{array}--environment,
-% otherwise it is set equivalent to \verb=\tabcolsep=.
-% \begin{macrocode}
-\newdimen\col@sep
-\def\@acol{\@addtopreamble{\hskip\col@sep}}
-% \def\@acolampacol{\@acol\@addamp\@acol}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
%
-% \subsubsection{The macro \texttt{\textbackslash @mkpream}}
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{array} and replaced it with requiring the \Lpack{array} package
+% instead.}
%
-% \begin{macro}{\@mkpream}
-% \begin{macro}{\the@toks}
-% \label{@mkpream}
-% Now we can define the macro which builds up the preamble for the
-% \verb=\halign=.
-% First we initialize \verb=\@preamble=, \verb=\@lastchclass=
-% and the boolean variable \verb=\if@firstamp=.
-% \begin{macrocode}
-\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
-% \end{macrocode}
-% During the build-up of the preamble we cannot directly use the
-% \verb=#= sign; this would lead to an error message in the next
-% \verb=\@addtopreamble= call.
-% Instead, we use the command \verb=\@sharp= at places where later
-% a \verb=#= will be.
-% This command is at first given the meaning \verb=\relax=;
-% therefore it will not be expanded when the preamble
-% is extended.
-% In the macro \verb=\@array=, shortly before the \verb=\halign=
-% is carried out, \verb=\@sharp= is given its final meaning.
-%
-% In a similar way,
-% we deal with the commands \verb=\@startpbox= and
-% \verb=\@endpbox=, although the reason is different here: these
-% macros expand in many \textsf{tokens} which would delay the
-% build-up of the preamble.
-% \begin{macrocode}
- \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
-% \end{macrocode}
-% Now we remove possible $*$-forms in the user preamble with the
-% command \verb=\@xexpast=. As we already know, this command saves
-% its result in the macro \verb=\@tempa=.
-% \begin{macrocode}
- \@xexpast #1*0x\@@
-% \end{macrocode}
-% Afterwards we initialize all registers and macros, that we need
-% for the build-up of the preamble.
-% Since we want to start with the \textsf{token} register $0$,
-% \verb=\count@= has to contain the value $-1$.
-% \begin{macrocode}
- \count@\m@ne
- \let\the@toks\relax
-% \end{macrocode}
-% Then we call up \verb=\prepnext@tok= in order to prepare the
-% \textsf{token} register $0$ for use.
-% \begin{macrocode}
- \prepnext@tok
-% \end{macrocode}
-% To evaluate the user preamble (without stars) saved in
-% \verb=\@tempa= we use the \LaTeX--macro \verb=\@tfor=.
-% The strange appearing construction with \verb=\expandafter= is
-% based on the fact that we have to put the replacement text of
-% \verb=\@tempa= and not the macro \verb=\@tempa= to this
-% \LaTeX--macro.
-% \begin{macrocode}
- \expandafter \@tfor \expandafter \@nextchar
- \expandafter :\expandafter =\@tempa \do
-% \end{macrocode}
-% The body of this loop (the group after the \verb=\do=)
-% is executed for one \textsf{token} at a time, whereas
-% the current \textsf{token} is saved in \verb=\@nextchar=.
-% At first we evaluate the current \textsf{token} with the already
-% defined macro \verb=\@testpach=, i.e.\ we assign to
-% \verb=\@chclass= the character class and to \verb=\@chnum=
-% the character number of this \textsf{token}.
-% \begin{macrocode}
- {\@testpach
-% \end{macrocode}
-% Then we branch out depending on the value of \verb=\@chclass= into
-% different macros that extend the preamble respectively.
-% \begin{macrocode}
- \ifcase \@chclass \@classz \or \@classi \or \@classii
- \or \save@decl \or \or \@classv \or \@classvi
- \or \@classvii \or \@classviii \or \@classix
- \or \@classx \fi
-% \end{macrocode}
-% Two cases deserve our special attention: Since the current
-% \textsf{token} cannot have the character class $4$ (start) we
-% have skipped this possibility. If the character class is $3$,
-% only the content of \verb=\@nextchar= has to be saved into the current
-% \textsf{token} register; therefore we call up \verb=\save@decl=
-% directly and save a macro name. After the preamble has been
-% extended we assign the value of \verb=\@chclass= to the counter
-% \verb=\@lastchclass= to assure that this information will be available
-% during the next run of the loop.
-% \begin{macrocode}
- \@lastchclass\@chclass}%
-% \end{macrocode}
-% After the loop has been finished space must still be added to
-% the created preamble, depending on the last \textsf{token}.
-% Depending on the value of \verb=\@lastchclass= we perform
-% the necessary operations.
-% \begin{macrocode}
- \ifcase\@lastchclass
-% \end{macrocode}
-% If the last class equals $0$ we add a
-% \verb=\hskip \col@sep=.
-% \begin{macrocode}
- \@acol \or
-% \end{macrocode}
-% If it equals $1$ we do not add any additional space so that the
-% horizontal lines do not exceed the vertical ones.
-% \begin{macrocode}
- \or
-% \end{macrocode}
-% Class $2$ is treated like class $0$ because a \verb=<{...}= can
-% only directly follow after class $0$.
-% \begin{macrocode}
- \@acol \or
-% \end{macrocode}
-% Most of the other possibilities can only appear if the user
-% preamble was defective. Class $3$ is not allowed since after a
-% \verb=>{..}= there must always follow a \texttt{c}, \texttt{l},
-% \texttt{r}, \texttt{p},\texttt{m} or \texttt{b}. We report an
-% error and ignore the declaration given by \verb={..}=.
+% ^^A % The description and code are essentially copied from the \Lpack{array}
+% ^^A package~\cite{ARRAY}.
+% ^^A
% \begin{macrocode}
- \@preamerr \thr@@ \or
-% \end{macrocode}
-% If \verb=\@lastchclass= is $4$ the user preamble has been empty.
-% To continue, we insert a \verb=#= in the preamble.
+ %
+ % %%%%%%%%%% Array package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% Frank Mittelbach & David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
+ % %%%%%%%%%% Copy corresponds to array.sty 2016/10/06 v2.4d %%%%%%%%%
+% \end{macrocode}
+% ^^A \changes{v3.7g}{2018/03/05}{Updated the embedded copy of the
+% ^^A \Lpack{array} package to version 2.4d, 2016/10/06}
+% ^^A \begin{dlf}
+% ^^A dlf: The \Lpack{array} package has redundant code (caused by a
+% ^^A quick mashing of and earlier \Lpack{array} version and the
+% ^^A \Lpack{newaray} package). In thus update (2018/03/05) this
+% ^^A redundant code is \emph{not} removed as it makes it very hard to
+% ^^A see where there are class changes to the \Lpack{array} code, and
+% ^^A when stuff is simply removed. We'll leave it up to the LaTeXteam to
+% ^^A clean up the \Lpack{array} code at some point.
+% ^^A
+% ^^A The following is a carbon copy of the DTX code from
+% ^^A \verb|array.dtx|, package specific \cs{changes} lines have been
+% ^^A removed, and we have made any error/warning messages class specific,
+% ^^A instead of package specific.
+% ^^A \end{dlf}
+% ^^A
+% ^^A
+% ^^A \subsubsection{The construction of the preamble}
+% ^^A
+% ^^A It is obvious that those environments will consist mainly of an
+% ^^A \verb=\halign=, because \TeX\ typesets tables using this primitive.
+% ^^A That is why we will now take a look at the algorithm which determines
+% ^^A a preamble for a \verb=\halign= starting with a given user preamble
+% ^^A using the options mentioned above.
+% ^^A
+% ^^A The most interesting macros of this implementation are without doubt
+% ^^A those which are responsible for the construction of the preamble for
+% ^^A the \verb=\halign=. The underlying algorithm was developed by
+% ^^A \textsc{Lamport} (resp.\ \textsc{Knuth}, see texhax V87\#??), and it
+% ^^A has been extended and improved.
+% ^^A
+% ^^A The user preamble will be read \textsf{token} by \textsf{token}. A
+% ^^A \textsf{token} is a single character like \texttt{c} or a block
+% ^^A enclosed in \verb={...}=. For example the preamble of
+% ^^A \verb=\begin{tabular}=\linebreak[0]\verb={lc||c@{\hspace{1cm}}}= consists of
+% ^^A the \textsf{token} \texttt{l}, \texttt{c}, \texttt{|}, \texttt{|},
+% ^^A \texttt{@} and \verb=\hspace{1cm}=.
+% ^^A
+% ^^A The currently used \textsf{token} and the one, used before, are needed
+% ^^A to decide on how the construction of the preamble has to be
+% ^^A continued.
+% ^^A In the example mentioned above the \texttt{l} causes the preamble
+% ^^A to begin with \verb=\hskip\tabcolsep=. Furthermore
+% ^^A \verb=# \hfil= would be appended to define a flush left column.
+% ^^A The next \textsf{token} is a \texttt{c}. Because it was preceded by an
+% ^^A \texttt{l} it generates a new column. This is done with
+% ^^A \verb=\hskip \tabcolsep & \hskip \tabcolsep=. The column which is to
+% ^^A be centered will be appended with \verb=\hfil # \hfil=.
+% ^^A The \textsf{token} \texttt{|} would then add a space of
+% ^^A \verb=\hskip \tabcolsep=
+% ^^A and a vertical line because the last
+% ^^A \textsf{tokens} was a \texttt{c}.
+% ^^A The following \textsf{token} \texttt{|} would only add a space
+% ^^A \verb=\hskip \doublerulesep= because it was preceded by the
+% ^^A \textsf{token} \texttt{|}. We will not discuss our example further but
+% ^^A rather take a look at the general case of constructing preambles.
+% ^^A
+% ^^A The example shows that the desired preamble for the
+% ^^A \verb=\halign= can be constructed as soon as the action of all
+% ^^A combinations
+% ^^A of the preamble \textsf{tokens} are specified. There are 18 such
+% ^^A \textsf{tokens}
+% ^^A so we have $19 \cdot 18 = 342$ combinations if we count the
+% ^^A beginning of
+% ^^A the preamble as a special \textsf{token}. Fortunately, there are many
+% ^^A combinations which generate the same spaces, so we can define
+% ^^A \textsf{token} classes. We will identify a
+% ^^A \textsf{token} within a class with a number, so we can insert the
+% ^^A formatting (for example of a column).
+% ^^A Table~\ref{tab:Klassen} lists all \textsf{token} classes and
+% ^^A their corresponding numbers.
+% ^^A \begin{table}[ht]
+% ^^A \begin{center}
+% ^^A \begin{tabular}[t]{>{\ttfamily}ccc}
+% ^^A \textsf{token} & \verb=\@chclass= & \verb=\@chnum= \\[2mm]
+% ^^A c & 0 & 0 \\
+% ^^A l & 0 & 1 \\
+% ^^A r & 0 & 2 \\
+% ^^A p-arg & 0 & 3 \\
+% ^^A t-arg & 0 & 4 \\
+% ^^A b-arg & 0 & 5 \\
+% ^^A | & 1 & 0 \\
+% ^^A !-arg & 1 & 1 \\
+% ^^A <-arg & 2 & --- \\
+% ^^A >-arg & 3 & ---
+% ^^A \end{tabular}
+% ^^A \kern3mm \vrule \kern3mm%
+% ^^A \begin{tabular}[t]{>{\ttfamily}ccc}
+% ^^A \textsf{token} & \verb=\@chclass= & \verb=\@chnum= \\[2mm]
+% ^^A Start & 4 & --- \\
+% ^^A @-arg & 5 & --- \\
+% ^^A ! & 6 & --- \\
+% ^^A @ & 7 & --- \\
+% ^^A < & 8 & --- \\
+% ^^A > & 9 & --- \\
+% ^^A p & 10 & 3 \\
+% ^^A t & 10 & 4 \\
+% ^^A b & 10 & 5
+% ^^A \end{tabular}
+% ^^A \end{center}
+% ^^A \caption{Classes of preamble \textsf{tokens}}
+% ^^A \label{tab:Klassen}
+% ^^A \end{table}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@chclass}
+% ^^A \begin{macro}{\@chnum}
+% ^^A \begin{macro}{\@lastchclass}
+% ^^A The class and the number of the current \textsf{token} are saved in
+% ^^A the
+% ^^A \textsf{count} registers \verb=\@chclass=
+% ^^A and \verb=\@chnum=, while the class of the previous
+% ^^A \textsf{token} is stored in the
+% ^^A \textsf{count} register \verb=\@lastchclass=.
+% ^^A All of the mentioned registers are already allocated in
+% ^^A \texttt{latex.tex},
+% ^^A which is the reason why the following three lines of code are
+% ^^A commented out.
+% ^^A Later throughout the text I will not mention it again explicitly
+% ^^A whenever I use a \verb=%= sign. These parts are already defined in
+% ^^A \texttt{latex.tex}.
+% \begin{macrocode}
+ % % \newcount \@chclass
+ % % \newcount \@chnum
+ % % \newcount \@lastchclass
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@addtopreamble}
+% ^^A We will save the already constructed preamble for
+% ^^A the \verb=\halign=
+% ^^A in the global macro \verb=\@preamble=. This will then be
+% ^^A enlarged with
+% ^^A the command \verb=\@addtopreamble=.
% \begin{macrocode}
- \@preamerr \tw@ \@addtopreamble\@sharp \or
+ % \def\@addtopreamble#1{\xdef\@preamble{\@preamble #1}}
% \end{macrocode}
-% Class $5$ is allowed again. In this case
-% (the user preamble ends with \verb=@{..}=) we need not
-% do anything.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The character class of a \textsf{token}}
+% ^^A
+% ^^A \begin{macro}{\@testpach}
+% ^^A With the help of \verb=\@lastchclass= we can now define a macro
+% ^^A which determines the class and the number of a given preamble
+% ^^A \textsf{token}
+% ^^A and assigns them to the registers
+% ^^A \verb=\@chclass= and \verb=\@chnum=.
+% \begin{macrocode}
+ % \def\@testpach{\@chclass
+% \end{macrocode}
+% ^^A First we deal with the cases in which the \textsf{token}
+% ^^A (\verb=#1=) is the argument of \texttt{!}, \texttt{@}, \texttt{<} or
+% ^^A \texttt{>}. We can see this from the value of \verb=\@lastchclass=:
+% \begin{macrocode}
+ % \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+ % \ifnum \@lastchclass=7 5 \else
+ % \ifnum \@lastchclass=8 \tw@ \else
+ % \ifnum \@lastchclass=9 \thr@@
+% \end{macrocode}
+% ^^A Otherwise we will assume that the \textsf{token} belongs to the
+% ^^A class $0$
+% ^^A and assign the corresponding number to \verb=\@chnum= if our
+% ^^A assumption is correct.
+% \begin{macrocode}
+ % \else \z@
+% \end{macrocode}
+% ^^A If the last \textsf{token} was a \texttt{p}, \texttt{m} or a
+% ^^A \texttt{b}, \verb=\@chnum= already has the right value. This is the
+% ^^A reason for the somewhat curious choice of the \textsf{token}
+% ^^A numbers in class $10$.
+% \begin{macrocode}
+ % \ifnum \@lastchclass = 10 \else
+% \end{macrocode}
+% ^^A Otherwise we will check if \verb=\@nextchar= is either a \texttt{c},
+% ^^A \texttt{l} or an \texttt{r}. Some applications change the
+% ^^A catcodes of certain characters like ``\texttt{@}'' in
+% ^^A \texttt{amstex.sty}. As a result the tests below would fail since
+% ^^A they assume non-active character tokens. Therefore we evaluate
+% ^^A \verb=\@nextchar= once thereby turning the first token of its
+% ^^A replacement text into a char. At this point here this should have
+% ^^A been the only char present in \verb=\@nextchar= which put into via a
+% ^^A \verb=\def=.
+% \begin{macrocode}
+ % \edef\@nextchar{\expandafter\string\@nextchar}%
+ % \@chnum
+ % \if \@nextchar c\z@ \else
+ % \if \@nextchar l\@ne \else
+ % \if \@nextchar r\tw@ \else
+% \end{macrocode}
+% ^^A If it is a different \textsf{token}, we know that the class was
+% ^^A not $0$. We assign the value $0$ to \verb=\@chnum= because this value
+% ^^A is needed for the \texttt{|}--\textsf{token}. Now we must check
+% ^^A the remaining classes. Note that the value of \verb=\@chnum= is
+% ^^A insignificant here for most classes.
+% \begin{macrocode}
+ % \z@ \@chclass
+ % \if\@nextchar |\@ne \else
+ % \if \@nextchar !6 \else
+ % \if \@nextchar @7 \else
+ % \if \@nextchar <8 \else
+ % \if \@nextchar >9 \else
+% \end{macrocode}
+% ^^A The remaining permitted \textsf{tokens} are \texttt{p},
+% ^^A \texttt{m} and \texttt{b} (class $10$).
+% \begin{macrocode}
+ % 10
+ % \@chnum
+ % \if \@nextchar m\thr@@\else
+ % \if \@nextchar p4 \else
+ % \if \@nextchar b5 \else
+% \end{macrocode}
+% ^^A Now the only remaining possibility is a forbidden \textsf{token},
+% ^^A so we choose class $0$ and number $0$ and give an error message.
+% ^^A Then we finish the macro by closing all \verb=\if='s.
+% \begin{macrocode}
+ % \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi
+ % \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{Multiple columns ($*$--form)}
+% ^^A
+% ^^A \begin{macro}{\@xexpast}
+% ^^A \begin{macro}{\the@toks}
+% ^^A \begin{macro}{\the@toksz}
+% ^^A \label{@xexpast} Now we discuss the macro that deletes all forms
+% ^^A of type \verb=*{=\textit{N\/}\verb=}{=\textit{String\/}\verb=}= from a user
+% ^^A preamble and replaces them with \textit{N} copies of
+% ^^A \textit{String}. Nested $*$--expressions are dealt with
+% ^^A correctly, that means $*$--expressions are not substituted if
+% ^^A they are in explicit braces, as in \verb=@{*}=.
+% ^^A
+% ^^A This macro is called via
+% ^^A \verb=\@xexpast=\meta{preamble}\verb=*0x\@@=.
+% ^^A The $*$--expression \verb=*0x= is being used to terminate the
+% ^^A recursion,
+% ^^A as we shall see later, and \verb=\@@= serves as an argument
+% ^^A delimiter. \verb=\@xexpast= has four arguments. The first
+% ^^A one is the part of the
+% ^^A user preamble before the first $*$--expression while the second
+% ^^A and third ones are the arguments of the first $*$--expression
+% ^^A (that is \textit{N} and \textit{String} in the notation mentioned
+% ^^A above).
+% ^^A The fourth argument is the rest of the preamble.
+% \begin{macrocode}
+ % \def\@xexpast#1*#2#3#4\@@{%
+% \end{macrocode}
+% ^^A The number of copies of \textit{String} (\verb=#2=) that are to be
+% ^^A produced will be saved in a \textsf{count} register.
+% \begin{macrocode}
+ % \@tempcnta #2
+% \end{macrocode}
+% ^^A We save the part of the preamble which does not
+% ^^A contain a $*$--form (\verb=#1=)
+% ^^A in a \PlainTeX\ \textsf{token} register.
+% ^^A We also save \textit{String} (\verb=#3=) using a \LaTeX\
+% ^^A \textsf{token} register.
+% \begin{macrocode}
+ % \toks@={#1}\@temptokena={#3}%
+% \end{macrocode}
+% ^^A Now we have to use a little trick to produce \textit{N} copies of
+% ^^A \textit{String}.
+% ^^A We could try \verb=\def\@tempa{#1}= and then
+% ^^A \textit{N} times \verb=\edef\@tempa{\@tempa#3}=. This would have the
+% ^^A undesired effect that all macros within \verb=#1= and \verb=#3=
+% ^^A would be expanded, although, for example, constructions like
+% ^^A \verb=@{..}= are not supposed to be changed.
+% ^^A That is why we \verb=\let= two control sequences to
+% ^^A be equivalent to \verb=\relax=.
+% \begin{macrocode}
+ % \let\the@toksz\relax \let\the@toks\relax
+% \end{macrocode}
+% ^^A Then we ensure that \verb=\@tempa= contains
+% ^^A \verb={\the@toksz\the@toks...\the@toks}= (the macro
+% ^^A \verb=\the@toks= exactly \textit{N\/} times) as substitution text.
+% \begin{macrocode}
+ % \def\@tempa{\the@toksz}%
+ % \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
+ % {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
+% \end{macrocode}
+% ^^A If \textit{N\/} was greater than zero we prepare for another call
+% ^^A of \verb=\@xexpast=. Otherwise we assume we have reached the end of
+% ^^A the user preamble, because we had appended \verb=*0x\@@= when we first
+% ^^A called \verb=\@xexpast=. In other words: if the user inserts
+% ^^A \verb=*{0}{..}= in his preamble, \LaTeX\ ignores the rest of it.
+% \begin{macrocode}
+ % \let \@tempb \@xexpast \else
+ % \let \@tempb \@xexnoop \fi
+% \end{macrocode}
+% ^^A Now we will make sure that the part of the user preamble, which
+% ^^A was already dealt with, will be saved again in \verb=\@tempa=.
+% \begin{macrocode}
+ % \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
+ % \edef\@tempa{\@tempa}%
+% \end{macrocode}
+% ^^A We have now evaluated the first $*$--expression, and the user
+% ^^A preamble up to this point
+% ^^A is saved in \verb=\@tempa=. We will put the contents of
+% ^^A \verb=\@tempa= and the rest of the user preamble together and work
+% ^^A on the result with \verb=\@tempb=. This macro either corresponds
+% ^^A to \verb=\@xexpast=, so that the next
+% ^^A $*$--expression is handled, or to the macro \verb=\@xexnoop=,
+% ^^A which only ends the recursion by deleting its argument.
+% \begin{macrocode}
+ % \expandafter \@tempb \@tempa #4\@@}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@xexnoop}
+% ^^A So the first big problem is solved. Now it is easy to
+% ^^A specify \verb=\@xexnoop=.
+% ^^A Its argument is delimited by \verb=\@@= and it simply expands to
+% ^^A nothing.
% \begin{macrocode}
- \or
+ % % \def\@xexnoop#1\@@{}
% \end{macrocode}
-% Any other case means that the arguments to \verb=@=, \texttt{!},
-% \texttt{<}, \texttt{>}, \texttt{p}, \texttt{m} or \texttt{b} have
-% been forgotten. So we report an error and ignore the last
-% \textsf{token}.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The insertion of declarations
+% ^^A (\texttt{>}, \texttt{<}, \texttt{!}, \texttt{@})}
+% ^^A
+% ^^A
+% ^^A The preamble will be enlarged with the help of \verb=\xdef=, but the
+% ^^A arguments of \texttt{>}, \texttt{<},~\texttt{!}\ and \texttt{@} are
+% ^^A not supposed to be expanded during the construction (we want an
+% ^^A implementation that doesn't need a \verb=\protect=). So we have to find a
+% ^^A way to inhibit the expansion of those arguments.
+% ^^A
+% ^^A We will solve this problem with \textsf{token} registers. We need
+% ^^A one register for every \texttt{!}\ and \texttt{@}, while we need two
+% ^^A for every \texttt{c}, \texttt{l}, \texttt{r}, \texttt{m}, \texttt{p}
+% ^^A or \texttt{b}. This limits the number of columns of a table because
+% ^^A there are only 256 \textsf{token} registers. But then, who needs
+% ^^A tables with more than 100 columns?
+% ^^A
+% ^^A One could also find a solution which only needs two or three
+% ^^A \textsf{token} registers by proceeding similarly as in the macro
+% ^^A \verb=\@xexpast= (see page \pageref{@xexpast}). The advantage of our
+% ^^A approach is the fact that we avoid some of the problems that arise
+% ^^A with the other method\footnote{Maybe there are also historical
+% ^^A reasons.}.
+% ^^A
+% ^^A So how do we proceed? Let us assume that we had \verb=!{foo}= in the
+% ^^A user preamble and say we saved \texttt{foo} in
+% ^^A \textsf{token} register $5$. Then we call
+% ^^A \verb=\@addtopreamble{\the@toks5}= where
+% ^^A \verb=\the@toks= is defined in a way that it does not expand
+% ^^A (for example it could be equivalent to \verb=\relax=). Every
+% ^^A following call
+% ^^A of \verb=\@addtopreamble= leaves \verb=\the@toks5= unchanged in
+% ^^A \verb=\@preamble=. If the construction of the preamble is completed
+% ^^A we change the definition of \verb=\the@toks= to
+% ^^A \verb=\the\toks= and expand \verb=\@preamble= for the last time.
+% ^^A During this process all parts of the form
+% ^^A \verb=\the@toks=\meta{Number}
+% ^^A will be substituted by the contents of the respective \textsf{token}
+% ^^A registers.
+% ^^A
+% ^^A As we can see from this informal discussion the construction of the
+% ^^A preamble has to take place within a group, so that the
+% ^^A \textsf{token} registers we use will be freed later on. For that
+% ^^A reason we keep all assignments to \verb=\@preamble= global; therefore the
+% ^^A replacement text of this macro will remain the same after we leave
+% ^^A the group.
+% ^^A
+% ^^A \begin{macro}{\count@}
+% ^^A We further need a \textsf{count} register to remember which
+% ^^A \textsf{token} register is to be used next. This will be
+% ^^A initialized with $-1$ if we want to begin with the \textsf{token}
+% ^^A register $0$. We use the \PlainTeX\ scratch register \verb=\count@=
+% ^^A because everything takes place locally. All we have to do is
+% ^^A insert \verb=\the@toks= \verb=\the= \verb=\count@= into the preamble.
+% ^^A \verb=\the@toks= will remain unchanged and \verb=\the\count@= expands into
+% ^^A the saved number.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\prepnext@tok}
+% ^^A The macro \verb=\prepnext@tok= is in charge of preparing the next
+% ^^A \textsf{token} register. For that purpose we increase
+% ^^A \verb=\count@= by $1$:
% \begin{macrocode}
- \else \@preamerr \@ne \fi
+ % \def\prepnext@tok{\advance \count@ \@ne
% \end{macrocode}
-% Now that the build-up of the preamble is almost finished we can
-% insert the \textsf{token} registers and therefore redefine
-% \verb=\the@toks=. The actual insertion, though, is performed
-% later.
+% ^^A Then we locally delete any contents the
+% ^^A \textsf{token} register might have.
% \begin{macrocode}
- \def\the@toks{\the\toks}}
+ % \toks\count@{}}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-% \subsubsection{The macros \texttt{\textbackslash @classz}
-% to \texttt{\textbackslash @classx}}
-%
-% The preamble is extended by the macros \verb=\@classz= to
-% \verb=\@classx= which are called by \verb=\@mkpream=
-% depending on \verb=\@lastchclass=
-% (i.e. the character class of the last \textsf{token}).
-% \begin{macro}{\@classx}
-% First we define =\@classx= because of its important r\^ole.
-% When it is called we find that the current
-% \textsf{token} is \texttt{p}, \texttt{m} or \texttt{b}.
-% That means that a new column has to start.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\save@decl}
+% ^^A During the construction of the preamble the current
+% ^^A \textsf{token} is always saved in the macro \verb=\@nextchar= (see the
+% ^^A definition of \verb=\@mkpream= on page \pageref{@mkpream}). The macro
+% ^^A \verb=\save@decl= saves it into the next free \textsf{token} register,
+% ^^A i.e.\ in \verb=\toks\count@=.
+% \begin{macrocode}
+ % \def\save@decl{\toks\count@ \expandafter{\@nextchar}}
+% \end{macrocode}
+% ^^A The reason for the use of \verb=\relax= is the following
+% ^^A hypothetical situation in the preamble:
+% ^^A \quad \verb=..\the\toks1\the\toks2..= \quad \TeX\ expands
+% ^^A \verb=\the\toks2= first in order to find out if the digit \verb=1=
+% ^^A is followed by other digits. E.g.\ a \verb=5= saved in the
+% ^^A \textsf{token} register $2$ would lead \TeX\ to insert the contents
+% ^^A of \textsf{token} register $15$ instead of $1$ later on.
+% ^^A
+% ^^A The example above referred to an older version of \verb=\save@decl= which
+% ^^A inserted a \verb=\relex= inside the token register. This is now moved to
+% ^^A the places where the actual token registers are inserted (look for
+% ^^A \verb=\the@toks=) because the old version would still make= @=
+% ^^A expressions to moving arguments since after expanding the second
+% ^^A register while looking for the end of the number the contents of the
+% ^^A token register is added so that later on the whole register will be
+% ^^A expanded. This serious bug was found after nearly two years
+% ^^A international use of this package by Johannes Braams.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A How does the situation look like, if we want to add another column
+% ^^A to the preamble, i.e.\ if we have found a \texttt{c}, \texttt{l},
+% ^^A \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in the user
+% ^^A preamble? In this case we have the problem of the \textsf{token}
+% ^^A register from \verb=>{..}= and \verb=<{..}= having to be inserted at this
+% ^^A moment because formatting instructions like \verb=\hfil= have to be set
+% ^^A around them. On the other hand it is not known yet, if any \verb=<{..}=
+% ^^A instruction will appear in the user preamble at all.
+% ^^A
+% ^^A We solve this problem by adding two \textsf{token} registers at a
+% ^^A time. This explains, why we have freed the \textsf{token} registers
+% ^^A in \verb=\prepnext@tok=.
+% ^^A
+% ^^A \begin{macro}{\insert@column}
+% ^^A \begin{macro}{\@sharp}
+% ^^A We now define the macro \verb=\insert@column= which will do
+% ^^A this work for us.
% \begin{macrocode}
-\def\@classx{%
+ % \def\insert@column{%
% \end{macrocode}
-% Depending on the value of \verb=\@lastchclass= different actions
-% must take place:
+% ^^A Here, we assume that the \textsf{count} register
+% ^^A \verb=\@tempcnta= has saved the value $\verb=\count@= - 1$.
% \begin{macrocode}
- \ifcase \@lastchclass
+ % \the@toks \the \@tempcnta
% \end{macrocode}
-% If the last character class was $0$ we separate the columns by
-% \verb=\hskip\col@sep= followed by \verb=&= and another
-% \verb=\hskip\col@sep=.
+% ^^A Next follows the \verb=#= sign which specifies the place
+% ^^A where the text of the column shall be inserted. To avoid
+% ^^A errors during the expansions in
+% ^^A \verb=\@addtopreamble= we hide this sign in the command
+% ^^A \verb=\@sharp= which is temporarily occupied with
+% ^^A \verb=\relax= during the build-up of the preamble.
+% ^^A To remove unwanted spaces before and after the column text, we set
+% ^^A an \verb=\ignorespaces= in front and a \verb=\unskip= afterwards.
% \begin{macrocode}
- \@acolampacol \or
+ % \ignorespaces \@sharp \unskip
% \end{macrocode}
-% If the last class was class $1$ --- that means that a vertical
-% line was
-% drawn, --- before this line a \verb=\hskip\col@sep= was inserted.
-% Therefore there has to be only a \verb=&= followed by
-% \verb=\hskip\col@sep=. But this \verb=&= may be inserted only
-% if this is not the first column. This process is controlled
-% by \verb=\if@firstamp= in the macro \verb=\addamp=.
+% ^^A Then the second \textsf{token} register follows whose number should
+% ^^A be saved in \verb=\count@=.
+% ^^A We make sure that there will be no further expansion after reading
+% ^^A the number, by finishing with \verb=\relax=. The case above is not
+% ^^A critical since it is ended by \verb=\ignorespaces=.
% \begin{macrocode}
- \@addamp \@acol \or
+ % \the@toks \the \count@ \relax}
% \end{macrocode}
-% Class $2$ is treated like class $0$ because \verb=<{...}= can only
-% follow after class $0$.
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The separation of columns}
+% ^^A
+% ^^A \begin{macro}{\@addamp}
+% ^^A In the preamble a \verb=&= has to be inserted between any two columns;
+% ^^A before the first column there should not be a \verb=&=. As the user
+% ^^A preamble may start with a \texttt{|} we have to remember somehow
+% ^^A if we have already inserted a \verb=#= (i.e.\ a column). This is done
+% ^^A with the boolean variable \verb=\if@firstamp= that we test in
+% ^^A \verb=\@addamp=, the macro that inserts the \verb=&=.
+% \begin{macrocode}
+ % % \newif \@iffirstamp
+ % % \def\@addamp{\if@firstamp \@firstampfalse
+ % % \else \@addtopreamble &\fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@acol}
+% ^^A \begin{macro}{\@acolampacol}
+% ^^A \begin{macro}{\col@sep}
+% ^^A We will now define some abbreviations for the extensions,
+% ^^A appearing most often in the preamble build-up.
+% ^^A Here \verb=\col@sep= is a \textsf{dimen} register which is set
+% ^^A equivalent to \verb=\arraycolsep= in an \textsf{array}--environment,
+% ^^A otherwise it is set equivalent to \verb=\tabcolsep=.
+% \begin{macrocode}
+ % \newdimen\col@sep
+ % \def\@acol{\@addtopreamble{\hskip\col@sep}}
+ % % \def\@acolampacol{\@acol\@addamp\@acol}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{The macro \texttt{\textbackslash @mkpream}}
+% ^^A
+% ^^A \begin{macro}{\@mkpream}
+% ^^A \begin{macro}{\the@toks}
+% ^^A \label{@mkpream}
+% ^^A Now we can define the macro which builds up the preamble for the
+% ^^A \verb=\halign=.
+% ^^A First we initialize \verb=\@preamble=, \verb=\@lastchclass=
+% ^^A and the boolean variable \verb=\if@firstamp=.
+% \begin{macrocode}
+ % \def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+% \end{macrocode}
+% ^^A During the build-up of the preamble we cannot directly use the
+% ^^A \verb=#= sign; this would lead to an error message in the next
+% ^^A \verb=\@addtopreamble= call.
+% ^^A Instead, we use the command \verb=\@sharp= at places where later
+% ^^A a \verb=#= will be.
+% ^^A This command is at first given the meaning \verb=\relax=;
+% ^^A therefore it will not be expanded when the preamble
+% ^^A is extended.
+% ^^A In the macro \verb=\@array=, shortly before the \verb=\halign=
+% ^^A is carried out, \verb=\@sharp= is given its final meaning.
+% ^^A
+% ^^A In a similar way,
+% ^^A we deal with the commands \verb=\@startpbox= and
+% ^^A \verb=\@endpbox=, although the reason is different here: these
+% ^^A macros expand in many \textsf{tokens} which would delay the
+% ^^A build-up of the preamble.
% \begin{macrocode}
- \@acolampacol \or
+ % \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
% \end{macrocode}
-% Class $3$ requires no actions because all things necessary have
-% been done by the preamble \textsf{token} \texttt{>}.
+% ^^A Now we remove possible $*$-forms in the user preamble with the
+% ^^A command \verb=\@xexpast=. As we already know, this command saves
+% ^^A its result in the macro \verb=\@tempa=.
% \begin{macrocode}
- \or
+ % \@xexpast #1*0x\@@
% \end{macrocode}
-% Class $4$ means that we are at the beginning of the preamble.
-% Therefore we start the preamble with \verb=\hskip\col@sep= and
-% then call \verb=\@firstampfalse=. This makes sure that a later
-% \verb=\@addamp= inserts the character
-% \verb=&= into the preamble.
+% ^^A Afterwards we initialize all registers and macros, that we need
+% ^^A for the build-up of the preamble.
+% ^^A Since we want to start with the \textsf{token} register $0$,
+% ^^A \verb=\count@= has to contain the value $-1$.
% \begin{macrocode}
- \@acol \@firstampfalse \or
+ % \count@\m@ne
+ % \let\the@toks\relax
% \end{macrocode}
-% For class $5$ \textsf{tokens} only the character \verb=&= is inserted
-% as a column separator. Therefore we call \verb=\@addamp=.
+% ^^A Then we call up \verb=\prepnext@tok= in order to prepare the
+% ^^A \textsf{token} register $0$ for use.
% \begin{macrocode}
- \@addamp
+ % \prepnext@tok
% \end{macrocode}
-% Other cases are impossible. For an example
-% $\verb=\@lastchclass= = 6$---as it might appear in a
-% preamble of the form \verb=...!p...=---\texttt{p} would have
-% been taken as an argument of \texttt{!}\ by \verb=\@testpach=.
+% ^^A To evaluate the user preamble (without stars) saved in
+% ^^A \verb=\@tempa= we use the \LaTeX--macro \verb=\@tfor=.
+% ^^A The strange appearing construction with \verb=\expandafter= is
+% ^^A based on the fact that we have to put the replacement text of
+% ^^A \verb=\@tempa= and not the macro \verb=\@tempa= to this
+% ^^A \LaTeX--macro.
% \begin{macrocode}
- \fi}
+ % \expandafter \@tfor \expandafter \@nextchar
+ % \expandafter :\expandafter =\@tempa \do
% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@classz}
-% If the character class of the last \textsf{token} is $0$ we have
-% \texttt{c}, \texttt{l}, \texttt{r} or an argument of \texttt{m},
-% \texttt{b} or\ \texttt{p}. In the first three cases the preamble
-% must be extended the same way as if we had class $10$. The
-% remaining two cases do not require any action because the space
-% needed was generated by the last \textsf{token} (i.e.\
-% \texttt{m}, \texttt{b} or \texttt{p}). Since \verb=\@lastchclass= has
-% the value $10$ at this point nothing happens when \verb=\@classx= is
-% called. So the macro \verb=\@chlassz= may start like this:
+% ^^A The body of this loop (the group after the \verb=\do=)
+% ^^A is executed for one \textsf{token} at a time, whereas
+% ^^A the current \textsf{token} is saved in \verb=\@nextchar=.
+% ^^A At first we evaluate the current \textsf{token} with the already
+% ^^A defined macro \verb=\@testpach=, i.e.\ we assign to
+% ^^A \verb=\@chclass= the character class and to \verb=\@chnum=
+% ^^A the character number of this \textsf{token}.
% \begin{macrocode}
-\def\@classz{\@classx
+ % {\@testpach
% \end{macrocode}
-% According to the definition of \verb=\insert@column= we must store
-% the number of the \textsf{token} register in which a preceding
-% \verb=>{..}= might have stored its argument into
-% \verb=\@tempcnta=.
+% ^^A Then we branch out depending on the value of \verb=\@chclass= into
+% ^^A different macros that extend the preamble respectively.
% \begin{macrocode}
- \@tempcnta \count@
+ % \ifcase \@chclass \@classz \or \@classi \or \@classii
+ % \or \save@decl \or \or \@classv \or \@classvi
+ % \or \@classvii \or \@classviii \or \@classix
+ % \or \@classx \fi
% \end{macrocode}
-% To have $\verb=\count@= = \verb=\@tmpcnta= + 1$ we prepare
-% the next \textsf{token} register.
+% ^^A Two cases deserve our special attention: Since the current
+% ^^A \textsf{token} cannot have the character class $4$ (start) we
+% ^^A have skipped this possibility. If the character class is $3$,
+% ^^A only the content of \verb=\@nextchar= has to be saved into the current
+% ^^A \textsf{token} register; therefore we call up \verb=\save@decl=
+% ^^A directly and save a macro name. After the preamble has been
+% ^^A extended we assign the value of \verb=\@chclass= to the counter
+% ^^A \verb=\@lastchclass= to assure that this information will be available
+% ^^A during the next run of the loop.
% \begin{macrocode}
- \prepnext@tok
+ % \@lastchclass\@chclass}%
% \end{macrocode}
-% Now the preamble must be extended with the column whose format
-% can be determined by \verb=\@chnum=.
+% ^^A After the loop has been finished space must still be added to
+% ^^A the created preamble, depending on the last \textsf{token}.
+% ^^A Depending on the value of \verb=\@lastchclass= we perform
+% ^^A the necessary operations.
% \begin{macrocode}
- \@addtopreamble{\ifcase \@chnum
+ % \ifcase\@lastchclass
% \end{macrocode}
-% If \verb=\@chnum= has the value $0$ a centered column has to be
-% generated.
-% So we begin with stretchable space.
+% ^^A If the last class equals $0$ we add a
+% ^^A \verb=\hskip \col@sep=.
% \begin{macrocode}
- \hfil
+ % \@acol \or
% \end{macrocode}
-% The command \verb=\d@llarbegin= follows expanding into \verb=\begingroup=
-% (in the \textsf{tabular}--environment) or into \verb=$=. Doing this
-% (provided an appropriate setting of \verb=\d@llarbegin=) we achieve
-% that the contents of the columns of an \textsf{array}--environment
-% are set in math mode while those of a \textsf{tabular}--environment
-% are set in LR mode.
+% ^^A If it equals $1$ we do not add any additional space so that the
+% ^^A horizontal lines do not exceed the vertical ones.
% \begin{macrocode}
- \d@llarbegin
+ % \or
% \end{macrocode}
-% Now we insert the contents of the two \textsf{token} registers
-% and the symbol
-% for the column entry (i.e.\ \verb=#= or
-% more precise \verb=\@sharp=) using \verb=\insert@column=.
+% ^^A Class $2$ is treated like class $0$ because a \verb=<{...}= can
+% ^^A only directly follow after class $0$.
% \begin{macrocode}
- \insert@column
+ % \@acol \or
% \end{macrocode}
-% We end this case with \verb=\d@llarend= and \verb=\hfil= where \verb=\d@llarend=
-% again is either \verb=$= or \verb=\endgroup=.
+% ^^A Most of the other possibilities can only appear if the user
+% ^^A preamble was defective. Class $3$ is not allowed since after a
+% ^^A \verb=>{..}= there must always follow a \texttt{c}, \texttt{l},
+% ^^A \texttt{r}, \texttt{p},\texttt{m} or \texttt{b}. We report an
+% ^^A error and ignore the declaration given by \verb={..}=.
% \begin{macrocode}
- \d@llarend \hfil \or
+ % \@preamerr \thr@@ \or
% \end{macrocode}
-% The templates for \texttt{l} and \texttt{r} (i.e.\ \verb=\@chnum= $1$
-% or $2$) are generated the same way. Since one \verb=\hfil= is
-% missing the text is moved to the relevant side.
-% The \verb=\kern\z@= is needed in case of an empty column
-% entry. Otherwise
-% the \verb=\unskip= in \verb=\insert@column= removes the
-% \verb=\hfil=. Changed to \verb=\hskip1sp= so that it interacts better with
-% \verb=\@bsphack=.
+% ^^A If \verb=\@lastchclass= is $4$ the user preamble has been empty.
+% ^^A To continue, we insert a \verb=#= in the preamble.
% \begin{macrocode}
- \hskip1sp\d@llarbegin \insert@column \d@llarend \hfil \or
- \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \or
+ % \@preamerr \tw@ \@addtopreamble\@sharp \or
% \end{macrocode}
-% The templates for \texttt{p}, \texttt{m} and \texttt{b} mainly
-% consist of a \textsf{box}. In case of \texttt{m} it is generated
-% by \verb=\vcenter=. This command is allowed only in math
-% mode. Therefore we start with a~\verb=$=.
+% ^^A Class $5$ is allowed again. In this case
+% ^^A (the user preamble ends with \verb=@{..}=) we need not
+% ^^A do anything.
% \begin{macrocode}
- $\vcenter%$ emacs
+ % \or
% \end{macrocode}
-% The part of the templates which is the same in all three cases
-% (\texttt{p}, \texttt{m} and \texttt{b})
-% is built by the macros \verb=\@startpbox= and
-% \verb=\@endpbox=. \verb=\@startpbox= has an argument:
-% the width of the column which is stored in the current
-% \textsf{token} (i.e.\ \verb=\@nextchar=).
-% Between these two macros we find the well known
-% \verb=\insert@column=.
+% ^^A Any other case means that the arguments to \verb=@=, \texttt{!},
+% ^^A \texttt{<}, \texttt{>}, \texttt{p}, \texttt{m} or \texttt{b} have
+% ^^A been forgotten. So we report an error and ignore the last
+% ^^A \textsf{token}.
% \begin{macrocode}
- \@startpbox{\@nextchar}\insert@column \@endpbox $\or%$ emacs
+ % \else \@preamerr \@ne \fi
% \end{macrocode}
-% The templates for \texttt{p} and \texttt{b} are generated in the
-% same way though we do not need the \verb=$= characters because we use
-% \verb=\vtop= or \verb=\vbox=.
+% ^^A Now that the build-up of the preamble is almost finished we can
+% ^^A insert the \textsf{token} registers and therefore redefine
+% ^^A \verb=\the@toks=. The actual insertion, though, is performed
+% ^^A later.
% \begin{macrocode}
- \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
- \vbox \@startpbox{\@nextchar}\insert@column \@endpbox
+ % \def\the@toks{\the\toks}}
% \end{macrocode}
-% Other values for \verb=\@chnum= are impossible. Therefore we
-% end the arguments to \verb=\@addtopreamble= and \verb=\ifcase=.
-% Before we come to the end of \verb=\@classz= we have to
-% prepare the next \textsf{token} register.
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The macros \texttt{\textbackslash @classz}
+% ^^A to \texttt{\textbackslash @classx}}
+% ^^A
+% ^^A The preamble is extended by the macros \verb=\@classz= to
+% ^^A \verb=\@classx= which are called by \verb=\@mkpream=
+% ^^A depending on \verb=\@lastchclass=
+% ^^A (i.e. the character class of the last \textsf{token}).
+% ^^A \begin{macro}{\@classx}
+% ^^A First we define =\@classx= because of its important r\^ole.
+% ^^A When it is called we find that the current
+% ^^A \textsf{token} is \texttt{p}, \texttt{m} or \texttt{b}.
+% ^^A That means that a new column has to start.
% \begin{macrocode}
- \fi}\prepnext@tok}
+ % \def\@classx{%
% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@classix}
-% In case of class $9$ (\texttt{>}--\textsf{token}) we first check
-% if the character class of the last
-% \textsf{token} was $3$. In this case we have a
-% user preamble of the form \verb=..>{...}>{...}..= which
-% is not allowed. We only give an error message and continue.
-% So the declarations defined by the first \verb=>{...}=
-% are ignored.
+% ^^A Depending on the value of \verb=\@lastchclass= different actions
+% ^^A must take place:
% \begin{macrocode}
-\def\@classix{\ifnum \@lastchclass = \thr@@
- \@preamerr \thr@@ \fi
+ % \ifcase \@lastchclass
% \end{macrocode}
-% Furthermore, we call up \verb=\@class10= because afterwards always a
-% new column is started by \texttt{c}, \texttt{l}, \texttt{r},
-% \texttt{p}, \texttt{m} or \texttt{b}.
+% ^^A If the last character class was $0$ we separate the columns by
+% ^^A \verb=\hskip\col@sep= followed by \verb=&= and another
+% ^^A \verb=\hskip\col@sep=.
% \begin{macrocode}
- \@classx}
+ % \@acolampacol \or
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@classviii}
-% If the current \textsf{token} is a \texttt{<} the last character
-% class must be $0$. In this case it is not necessary to extend the
-% preamble. Otherwise we output an error message, set \verb=\@chclass=
-% to $6$ and call \verb=\@classvi=. By doing this we achieve that
-% \texttt{<} is treated like \texttt{!}.
+% ^^A If the last class was class $1$ --- that means that a vertical
+% ^^A line was
+% ^^A drawn, --- before this line a \verb=\hskip\col@sep= was inserted.
+% ^^A Therefore there has to be only a \verb=&= followed by
+% ^^A \verb=\hskip\col@sep=. But this \verb=&= may be inserted only
+% ^^A if this is not the first column. This process is controlled
+% ^^A by \verb=\if@firstamp= in the macro \verb=\addamp=.
% \begin{macrocode}
-\def\@classviii{\ifnum \@lastchclass >\z@
- \@preamerr 4\@chclass 6 \@classvi \fi}
+ % \@addamp \@acol \or
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@arrayrule}
-% There is only one incompatibility with the original definition:
-% the definition of \verb=\@arrayrule=. In the original a line without
-% width\footnote{So the space between \texttt{cc} and \texttt{c|c}
-% is equal.} is created by multiple insertions of
-% \verb=\hskip .5\arrayrulewidth=.
-% We only insert a vertical line into the
-% preamble. This is done to prevent problems with \TeX's main
-% memory when generating tables with many vertical lines in them
-% (especially in the case of \textsf{floats}).
+% ^^A Class $2$ is treated like class $0$ because \verb=<{...}= can only
+% ^^A follow after class $0$.
% \begin{macrocode}
-\def\@arrayrule{\@addtopreamble \vline}
+ % \@acolampacol \or
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@classvii}
-% As a consequence it follows that in case of class $7$
-% (\verb=@= \textsf{token}) the preamble need not to be extended.
-% In the original definition $\verb=\@lastchclass= = 1$
-% is treated by inserting \verb=\hskip .5\arrayrulewidth=.
-% We only check if the last \textsf{token} was of class $3$ which is
-% forbidden.
+% ^^A Class $3$ requires no actions because all things necessary have
+% ^^A been done by the preamble \textsf{token} \texttt{>}.
% \begin{macrocode}
-\def\@classvii{\ifnum \@lastchclass = \thr@@
+ % \or
% \end{macrocode}
-% If this is true we output an error message and
-% ignore the declarations stored
-% by the last \verb=>{...}=, because these are overwritten
-% by the argument of \texttt{@}.
+% ^^A Class $4$ means that we are at the beginning of the preamble.
+% ^^A Therefore we start the preamble with \verb=\hskip\col@sep= and
+% ^^A then call \verb=\@firstampfalse=. This makes sure that a later
+% ^^A \verb=\@addamp= inserts the character
+% ^^A \verb=&= into the preamble.
% \begin{macrocode}
- \@preamerr \thr@@ \fi}
+ % \@acol \@firstampfalse \or
% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@classvi}
-% If the current \textsf{token} is a regular \texttt{!}\ and the
-% last class was $0$ or $2$ we extend the preamble with
-% \verb=\hskip\col@sep=. If the last \textsf{token} was of class $1$
-% (for instance \texttt{|}) we extend with \verb=\hskip \doublerulesep=
-% because the construction \verb=!{...}= has to be treated like
-% \texttt{|}.
+% ^^A For class $5$ \textsf{tokens} only the character \verb=&= is inserted
+% ^^A as a column separator. Therefore we call \verb=\@addamp=.
% \begin{macrocode}
-\def\@classvi{\ifcase \@lastchclass
- \@acol \or
- \@addtopreamble{\hskip \doublerulesep}\or
- \@acol \or
+ % \@addamp
% \end{macrocode}
-% Now \verb=\@preamerr...= should follow because a
-% user preamble of the form \verb=..>{..}!.= is not allowed.
-% To save memory we call \verb=\@classvii= instead which also
-% does what we want.
+% ^^A Other cases are impossible. For an example
+% ^^A $\verb=\@lastchclass= = 6$---as it might appear in a
+% ^^A preamble of the form \verb=...!p...=---\texttt{p} would have
+% ^^A been taken as an argument of \texttt{!}\ by \verb=\@testpach=.
% \begin{macrocode}
- \@classvii
+ % \fi}
% \end{macrocode}
-% If \verb=\@lastchclass= is $4$ or $5$ nothing has to be done.
-% Class $6$ to $10$ are not possible.
-% So we finish the macro.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classz}
+% ^^A If the character class of the last \textsf{token} is $0$ we have
+% ^^A \texttt{c}, \texttt{l}, \texttt{r} or an argument of \texttt{m},
+% ^^A \texttt{b} or\ \texttt{p}. In the first three cases the preamble
+% ^^A must be extended the same way as if we had class $10$. The
+% ^^A remaining two cases do not require any action because the space
+% ^^A needed was generated by the last \textsf{token} (i.e.\
+% ^^A \texttt{m}, \texttt{b} or \texttt{p}). Since \verb=\@lastchclass= has
+% ^^A the value $10$ at this point nothing happens when \verb=\@classx= is
+% ^^A called. So the macro \verb=\@chlassz= may start like this:
% \begin{macrocode}
- \fi}
+ % \def\@classz{\@classx
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@classii}
-% \begin{macro}{\@classiii}
-% In the case of character classes $2$ and $3$ (i.e.\ the argument
-% of \texttt{<} or \texttt{>}) we only have to store the current
-% \textsf{token} (\verb=\@nextchar=) into the corresponding
-% \textsf{token} register since the preparation and
-% insertion of these registers
-% are done by the macro \verb=\@classz=.
-% This is equivalent to calling \verb=\save@decl= in the case of
-% class $3$. To save command identifiers we do this call up
-% in the macro \verb=\@mkpream=.
-%
-% Class $2$ exhibits a more complicated situation: the
-% \textsf{token} registers have already been inserted by
-% \verb=\@classz=. So the value of \verb=\count@= is too high
-% by one. Therefore we decrease \verb=\count@= by $1$.
+% ^^A According to the definition of \verb=\insert@column= we must store
+% ^^A the number of the \textsf{token} register in which a preceding
+% ^^A \verb=>{..}= might have stored its argument into
+% ^^A \verb=\@tempcnta=.
% \begin{macrocode}
-\def\@classii{\advance \count@ \m@ne
+ % \@tempcnta \count@
% \end{macrocode}
-% Next we store the current \textsf{token} into the correct
-% \textsf{token} register by calling \verb=\save@decl= and then
-% increase the value of \verb=\count@= again. At this point we
-% can save memory once more (at the cost of time) if we use the
-% macro \verb=\prepnext@tok=.
+% ^^A To have $\verb=\count@= = \verb=\@tmpcnta= + 1$ we prepare
+% ^^A the next \textsf{token} register.
% \begin{macrocode}
- \save@decl\prepnext@tok}
+ % \prepnext@tok
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\@classv}
-% If the current \textsf{token} is of class $5$ then it is an
-% argument of a \texttt{@} \textsf{token}. It must be stored into a
-% \textsf{token} register.
+% ^^A Now the preamble must be extended with the column whose format
+% ^^A can be determined by \verb=\@chnum=.
% \begin{macrocode}
-\def\@classv{\save@decl
+ % \@addtopreamble{\ifcase \@chnum
% \end{macrocode}
-% We extend the preamble with a command which inserts this
-% \textsf{token} register into the preamble when its construction
-% is finished. The user expects that this argument is worked out in
-% math mode if it was used in an
-% \textsf{array}--environment. Therefore we surround it with
-% \verb=\d@llar...='s.
+% ^^A If \verb=\@chnum= has the value $0$ a centered column has to be
+% ^^A generated.
+% ^^A So we begin with stretchable space.
% \begin{macrocode}
- \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+ % \hfil
% \end{macrocode}
-% Finally we must prepare the next \textsf{token} register.
+% ^^A The command \verb=\d@llarbegin= follows expanding into \verb=\begingroup=
+% ^^A (in the \textsf{tabular}--environment) or into \verb=$=. Doing this
+% ^^A (provided an appropriate setting of \verb=\d@llarbegin=) we achieve
+% ^^A that the contents of the columns of an \textsf{array}--environment
+% ^^A are set in math mode while those of a \textsf{tabular}--environment
+% ^^A are set in LR mode.
% \begin{macrocode}
- \prepnext@tok}
+ % \d@llarbegin
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@classi}
-% In the case of class $0$ we were able to generate the necessary
-% space between columns by using the macro \verb=\@classx=.
-% Analogously the macro \verb=\@classvi= can be used for class $1$.
+% ^^A Now we insert the contents of the two \textsf{token} registers
+% ^^A and the symbol
+% ^^A for the column entry (i.e.\ \verb=#= or
+% ^^A more precise \verb=\@sharp=) using \verb=\insert@column=.
% \begin{macrocode}
-\def\@classi{\@classvi
+ % \insert@column
% \end{macrocode}
-% Depending on \verb=\@chnum= a vertical line
+% ^^A We end this case with \verb=\d@llarend= and \verb=\hfil= where \verb=\d@llarend=
+% ^^A again is either \verb=$= or \verb=\endgroup=.
% \begin{macrocode}
- \ifcase \@chnum \@arrayrule \or
+ % \d@llarend \hfil \or
% \end{macrocode}
-% or (in case of \verb=!{...}=) the current \textsf{token} --- stored
-% in \verb=\@nextchar= --- has to be inserted into the preamble.
-% This corresponds to calling \verb=\@classv=.
+% ^^A The templates for \texttt{l} and \texttt{r} (i.e.\ \verb=\@chnum= $1$
+% ^^A or $2$) are generated the same way. Since one \verb=\hfil= is
+% ^^A missing the text is moved to the relevant side.
+% ^^A The \verb=\kern\z@= is needed in case of an empty column
+% ^^A entry. Otherwise
+% ^^A the \verb=\unskip= in \verb=\insert@column= removes the
+% ^^A \verb=\hfil=. Changed to \verb=\hskip1sp= so that it interacts better with
+% ^^A \verb=\@bsphack=.
% \begin{macrocode}
- \@classv \fi}
+ % \hskip1sp\d@llarbegin \insert@column \d@llarend \hfil \or
+ % \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \or
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@startpbox}
-% In \verb=\@classz= the macro \verb=\@startpbox= is used.
-% The width of the \textsf{parbox} is passed as an argument.
-% \verb=\vcenter=, \verb=\vtop= or \verb=\vbox= are already in the
-% preamble. So we start with the braces for the wanted box.
+% ^^A The templates for \texttt{p}, \texttt{m} and \texttt{b} mainly
+% ^^A consist of a \textsf{box}. In case of \texttt{m} it is generated
+% ^^A by \verb=\vcenter=. This command is allowed only in math
+% ^^A mode. Therefore we start with a~\verb=$=.
% \begin{macrocode}
-\def\@startpbox#1{\bgroup
+ % $\vcenter%$ emacs
% \end{macrocode}
-% The argument is the width of the box. This information has to be
-% assigned to \verb=\hsize=.
-% Then we assign default values to several parameters used in a
-% \textsf{parbox}.
+% ^^A The part of the templates which is the same in all three cases
+% ^^A (\texttt{p}, \texttt{m} and \texttt{b})
+% ^^A is built by the macros \verb=\@startpbox= and
+% ^^A \verb=\@endpbox=. \verb=\@startpbox= has an argument:
+% ^^A the width of the column which is stored in the current
+% ^^A \textsf{token} (i.e.\ \verb=\@nextchar=).
+% ^^A Between these two macros we find the well known
+% ^^A \verb=\insert@column=.
% \begin{macrocode}
- \setlength\hsize{#1}\@arrayparboxrestore
+ % \@startpbox{\@nextchar}\insert@column \@endpbox $\or%$ emacs
% \end{macrocode}
-% Our main problem is to obtain the same distance between succeeding
-% lines of the \textsf{parbox}.
-% We have to remember that the distance between two \textsf{parboxes}
-% should be defined by \verb=\@arstrut=. That means that it can be
-% greater than the distance in a \textsf{parbox}.
-% Therefore it is not enough to set a \verb=\@arstrut= at the
-% beginning and at the end of the \textsf{parbox}. This would
-% dimension the distance
-% between first and second line and the distance between the two
-% last lines of the \textsf{parbox} wrongly.
-% To prevent this we set an invisible rule of height
-% \verb=\@arstrutbox=
-% at the beginning of the \textsf{parbox}. This has no effect on the
-% depth of the first line. At the end of the \textsf{parbox} we set
-% analogously another invisible rule which only affects the depth
-% of the last line. It is necessary to wait inserting this strut
-% until the paragraph actually starts to allow for things like
-% \verb=\parindent= changes via \verb=>{...}=.
+% ^^A The templates for \texttt{p} and \texttt{b} are generated in the
+% ^^A same way though we do not need the \verb=$= characters because we use
+% ^^A \verb=\vtop= or \verb=\vbox=.
% \begin{macrocode}
- \everypar{%
- \vrule \@height \ht\@arstrutbox \@width \z@
- \everypar{}}%
- }
+ % \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+ % \vbox \@startpbox{\@nextchar}\insert@column \@endpbox
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@endpbox}
-% If there are any declarations defined by \verb=>{...}=
-% and \verb=<{...}=
-% they now follow in the macro \verb=\@classz= --- the contents
-% of the column in between.
-% So the macro \verb=\@endpbox= must insert the \textsf{specialstrut}
-% mentioned earlier and then close the group opened by
-% \verb=\@startpbox=.
+% ^^A Other values for \verb=\@chnum= are impossible. Therefore we
+% ^^A end the arguments to \verb=\@addtopreamble= and \verb=\ifcase=.
+% ^^A Before we come to the end of \verb=\@classz= we have to
+% ^^A prepare the next \textsf{token} register.
% \begin{macrocode}
-\def\@endpbox{\@finalstrut\@arstrutbox \egroup\hfil}
+ % \fi}\prepnext@tok}
% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Building and calling \texttt{\textbackslash halign}}
-%
-% \begin{macro}{\@array}
-% After we have discussed the macros needed for the evaluation
-% of the user preamble we can define the macro \verb=\@array=
-% which uses these macros to create a \verb=\halign=.
-% It has two arguments. The first one is a position argument
-% which can be \texttt{t}, \texttt{b} or \texttt{c}; the
-% second one describes the wanted preamble,
-% e.g.\ it has the form \verb=|c|c|c|=.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classix}
+% ^^A In case of class $9$ (\texttt{>}--\textsf{token}) we first check
+% ^^A if the character class of the last
+% ^^A \textsf{token} was $3$. In this case we have a
+% ^^A user preamble of the form \verb=..>{...}>{...}..= which
+% ^^A is not allowed. We only give an error message and continue.
+% ^^A So the declarations defined by the first \verb=>{...}=
+% ^^A are ignored.
% \begin{macrocode}
-\def\@array[#1]#2{%
+ % \def\@classix{\ifnum \@lastchclass = \thr@@
+ % \@preamerr \thr@@ \fi
% \end{macrocode}
-% First we define a \textsf{strut} whose size basically corresponds
-% to a normal \textsf{strut} multiplied by the factor
-% \verb=\arraystretch=.
-% This \textsf{strut} is then inserted into every row and enforces
-% a minimal distance between two rows.
-% Nevertheless, when using horizontal lines, large letters
-% (like accented capital letters) still collide with such lines.
-% Therefore at first we add to the height of a normal \textsf{strut}
-% the value of the parameter \verb=\extrarowheight=.
+% ^^A Furthermore, we call up \verb=\@class10= because afterwards always a
+% ^^A new column is started by \texttt{c}, \texttt{l}, \texttt{r},
+% ^^A \texttt{p}, \texttt{m} or \texttt{b}.
% \begin{macrocode}
- \@tempdima \ht \strutbox
- \advance \@tempdima by\extrarowheight
- \setbox \@arstrutbox \hbox{\vrule
- \@height \arraystretch \@tempdima
- \@depth \arraystretch \dp \strutbox
- \@width \z@}%
+ % \@classx}
% \end{macrocode}
-% Then we open a group, in which the user preamble is evaluated by
-% the macro \verb=\@mkpream=. As we know this must happen locally.
-% This macro creates a preamble for a \verb=\halign= and saves
-% its result globally in the control sequence \verb=\@preamble=.
-% \begin{macrocode}
- \begingroup
- \@mkpream{#2}%
-% \end{macrocode}
-% We again redefine \verb=\@preamble= so that a call up of \verb=\@preamble=
-% now starts the \verb=\halign=. Thus also the arguments of \texttt{>},
-% \texttt{<}, \texttt{@} and \texttt{!}, saved in the
-% \textsf{token} registers are inserted into the preamble. The
-% \verb=\tabskip= at the beginning and end of the preamble is set to
-% \textsf{0pt} (in the beginning by the use of \verb=\ialign=). Also the
-% command \verb=\@arstrut= is build in, which inserts the
-% \verb=\@arstrutbox=, defined above. Of course, the opening brace after
-% \verb=\ialign= has to be implicit as it will be closed in \verb=\endarray=
-% or another macro.
-%
-% The \verb=\noexpand= in front of \verb=\ialign= does no harm in standard \LaTeX{}
-% and was added since some experimental support for using text glyphs in math
-% redefines \verb=\halign= with the result that is becomes expandable with
-% disastrous results in cases like this.
-% In the kernel definition for this macro the problem does
-% not surface because there \verb=\protect= is set (which is not necessary in this
-% implementation as there is no arbitrary user input that can get expanded) and
-% the experimental code made the redefinition robust. Whether this is the right
-% approach is open to question; consider the \verb=\noexpand= a courtesy to allow an
-% unsupported redefinition of a \TeX{} primitive for the moment (as people rely
-% on that experimental code).
-% \begin{macrocode}
- \xdef\@preamble{\noexpand \ialign \@halignto
- \bgroup \@arstrut \@preamble
- \tabskip \z@ \cr}%
-% \end{macrocode}
-% What we have not explained yet is the macro \verb=\@halignto=
-% that was just used. Depending on its replacement text the
-% \verb=\halign= becomes a \verb=\halign= \texttt{to} \meta{dimen}.
-% Now we close the group again. Thus
-% \verb=\@startpbox= and \verb=\@endpbox= as well as all
-% \textsf{token} registers get their former meaning back.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classviii}
+% ^^A If the current \textsf{token} is a \texttt{<} the last character
+% ^^A class must be $0$. In this case it is not necessary to extend the
+% ^^A preamble. Otherwise we output an error message, set \verb=\@chclass=
+% ^^A to $6$ and call \verb=\@classvi=. By doing this we achieve that
+% ^^A \texttt{<} is treated like \texttt{!}.
% \begin{macrocode}
- \endgroup
+ % \def\@classviii{\ifnum \@lastchclass >\z@
+ % \@preamerr 4\@chclass 6 \@classvi \fi}
% \end{macrocode}
-% To support the \texttt{delarray.sty} package we include a hook
-% into this part of the code which is a no-op in the main package.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@arrayrule}
+% ^^A There is only one incompatibility with the original definition:
+% ^^A the definition of \verb=\@arrayrule=. In the original a line without
+% ^^A width\footnote{So the space between \texttt{cc} and \texttt{c|c}
+% ^^A is equal.} is created by multiple insertions of
+% ^^A \verb=\hskip .5\arrayrulewidth=.
+% ^^A We only insert a vertical line into the
+% ^^A preamble. This is done to prevent problems with \TeX's main
+% ^^A memory when generating tables with many vertical lines in them
+% ^^A (especially in the case of \textsf{floats}).
+% \begin{macrocode}
+ % \def\@arrayrule{\@addtopreamble \vline}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classvii}
+% ^^A As a consequence it follows that in case of class $7$
+% ^^A (\verb=@= \textsf{token}) the preamble need not to be extended.
+% ^^A In the original definition $\verb=\@lastchclass= = 1$
+% ^^A is treated by inserting \verb=\hskip .5\arrayrulewidth=.
+% ^^A We only check if the last \textsf{token} was of class $3$ which is
+% ^^A forbidden.
% \begin{macrocode}
- \@arrayleft
+ % \def\@classvii{\ifnum \@lastchclass = \thr@@
% \end{macrocode}
-% Now we decide depending on the position argument in which
-% \textsf{box} the \verb=\halign= is to be put. (\verb=\vcenter= may be used
-% because we are in math mode.)
+% ^^A If this is true we output an error message and
+% ^^A ignore the declarations stored
+% ^^A by the last \verb=>{...}=, because these are overwritten
+% ^^A by the argument of \texttt{@}.
% \begin{macrocode}
- \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
+ % \@preamerr \thr@@ \fi}
% \end{macrocode}
-% Now another implicit opening brace appears; then definitions
-% which shall stay local follow. While constructing the
-% \verb=\@preamble= in \verb=\@mkpream= the \verb=#= sign must be
-% hidden in the macro \verb=\@sharp= which is \verb=\let= to
-% \verb=\relax= at that moment (see definition of \verb=\@mkpream=
-% on page~\pageref{@mkpream}).
-% All these now get their actual meaning.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classvi}
+% ^^A If the current \textsf{token} is a regular \texttt{!}\ and the
+% ^^A last class was $0$ or $2$ we extend the preamble with
+% ^^A \verb=\hskip\col@sep=. If the last \textsf{token} was of class $1$
+% ^^A (for instance \texttt{|}) we extend with \verb=\hskip \doublerulesep=
+% ^^A because the construction \verb=!{...}= has to be treated like
+% ^^A \texttt{|}.
% \begin{macrocode}
- \bgroup
- \let \@sharp ##\let \protect \relax
+ % \def\@classvi{\ifcase \@lastchclass
+ % \@acol \or
+ % \@addtopreamble{\hskip \doublerulesep}\or
+ % \@acol \or
% \end{macrocode}
-% With the above defined \textsf{struts} we fix down the distance
-% between rows by setting \verb=\lineskip= and \verb=\baselineskip=
-% to \textsf{0pt}. Since there have to be set \verb=$='s
-% around every column in the \textsf{array}--environment
-% the parameter \verb=\mathsurround= should
-% also be set to \textsf{0pt}. This prevents additional space between
-% the rows. The
-% \PlainTeX--macro \verb=\m@th= does this.
+% ^^A Now \verb=\@preamerr...= should follow because a
+% ^^A user preamble of the form \verb=..>{..}!.= is not allowed.
+% ^^A To save memory we call \verb=\@classvii= instead which also
+% ^^A does what we want.
% \begin{macrocode}
- \lineskip \z@
- \baselineskip \z@
- \m@th
+ % \@classvii
% \end{macrocode}
-% Beside, we have to assign a special meaning (which we still have
-% to specify) to the line separator \verb=\\=. We also have to
-% redefine the command \verb=\par= in such a way that empty lines in
-% \verb=\halign= cannot do any damage. We succeed in doing so
-% by choosing something that will disappear when expanding.
-% After that we only have to call up \verb=\@preamble= to
-% start the wanted \verb=\halign=.
+% ^^A If \verb=\@lastchclass= is $4$ or $5$ nothing has to be done.
+% ^^A Class $6$ to $10$ are not possible.
+% ^^A So we finish the macro.
% \begin{macrocode}
- \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
+ % \fi}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\arraybackslash}
-% Restore \verb=\\= for use in array and tabular environment (after
-% \verb=\raggedright= etc.).
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classii}
+% ^^A \begin{macro}{\@classiii}
+% ^^A In the case of character classes $2$ and $3$ (i.e.\ the argument
+% ^^A of \texttt{<} or \texttt{>}) we only have to store the current
+% ^^A \textsf{token} (\verb=\@nextchar=) into the corresponding
+% ^^A \textsf{token} register since the preparation and
+% ^^A insertion of these registers
+% ^^A are done by the macro \verb=\@classz=.
+% ^^A This is equivalent to calling \verb=\save@decl= in the case of
+% ^^A class $3$. To save command identifiers we do this call up
+% ^^A in the macro \verb=\@mkpream=.
+% ^^A
+% ^^A Class $2$ exhibits a more complicated situation: the
+% ^^A \textsf{token} registers have already been inserted by
+% ^^A \verb=\@classz=. So the value of \verb=\count@= is too high
+% ^^A by one. Therefore we decrease \verb=\count@= by $1$.
% \begin{macrocode}
-\def\arraybackslash{\let\\\tabularnewline}
+ % \def\@classii{\advance \count@ \m@ne
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\extrarowheight}
-% The \textsf{dimen} parameter used above also needs to be
-% allocated. As a default value we use \textsf{0pt}, to ensure
-% compatibility with standard \LaTeX.
+% ^^A Next we store the current \textsf{token} into the correct
+% ^^A \textsf{token} register by calling \verb=\save@decl= and then
+% ^^A increase the value of \verb=\count@= again. At this point we
+% ^^A can save memory once more (at the cost of time) if we use the
+% ^^A macro \verb=\prepnext@tok=.
% \begin{macrocode}
-\newdimen \extrarowheight
-\extrarowheight=0pt
+ % \save@decl\prepnext@tok}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@arstrut}
-% Now the insertion of \verb=\@arstrutbox= through \verb=\@arstut=
-% is easy since we know exactly in which mode \TeX\ is while working
-% on the \verb=\halign= preamble.
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@classv}
+% ^^A If the current \textsf{token} is of class $5$ then it is an
+% ^^A argument of a \texttt{@} \textsf{token}. It must be stored into a
+% ^^A \textsf{token} register.
% \begin{macrocode}
-\def\@arstrut{\unhcopy\@arstrutbox}
+ % \def\@classv{\save@decl
% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{The line separator \texttt{\textbackslash\textbackslash}}
-%
-% \begin{macro}{\@arraycr}
-% In the macro \verb=\@array= the line separator \verb=\\= is
-% \verb=\let= to the command \verb=\@arraycr=.
-% Its definition starts with a special brace which I have directly
-% copied from the original definition. It is
-% necessary, because the \verb=\futurlet= in \verb=\@ifnextchar=
-% might
-% expand a following \verb=&= \textsf{token} in a construction like
-% \verb=\\ &=. This would otherwise end the alignment template at a
-% wrong time. On the other hand we have to be careful to avoid
-% producing a real group, i.e.\ \verb={}=, because the command will also
-% be used for the array environment, i.e.\ in math mode. In that
-% case an extra \verb={}= would produce an ord atom which could mess up
-% the spacing. For this reason we use a combination that does not
-% really produce a group at all but modifies the master counter so
-% that a \verb=&= will not be considered belonging to the current
-% \verb=\halign= while we are looking for a \verb=*= or \verb=[=.
-% For further information see
-% \cite[Appendix D]{bk:knuth}.
+% ^^A We extend the preamble with a command which inserts this
+% ^^A \textsf{token} register into the preamble when its construction
+% ^^A is finished. The user expects that this argument is worked out in
+% ^^A math mode if it was used in an
+% ^^A \textsf{array}--environment. Therefore we surround it with
+% ^^A \verb=\d@llar...='s.
% \begin{macrocode}
-\def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi
+ % \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
% \end{macrocode}
-% Then we test whether the user is using the star form and ignore
-% a possible star (I also disagree with this procedure, because a
-% star does not make any sense here).
+% ^^A Finally we must prepare the next \textsf{token} register.
% \begin{macrocode}
- \@ifstar \@xarraycr \@xarraycr}
+ % \prepnext@tok}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@xarraycr}
-% In the command \verb=\@xarraycr= we test if an optional argument
-% exists.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classi}
+% ^^A In the case of class $0$ we were able to generate the necessary
+% ^^A space between columns by using the macro \verb=\@classx=.
+% ^^A Analogously the macro \verb=\@classvi= can be used for class $1$.
% \begin{macrocode}
-\def\@xarraycr{\@ifnextchar [%
+ % \def\@classi{\@classvi
% \end{macrocode}
-% If it does, we branch out into the macro \verb=\@argarraycr= if
-% not we close the special brace (mentioned above) and end the row
-% of the \verb=\halign= with a \verb=\cr=.
+% ^^A Depending on \verb=\@chnum= a vertical line
% \begin{macrocode}
- \@argarraycr {\ifnum 0=`{}\fi\cr}}
+ % \ifcase \@chnum \@arrayrule \or
% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@argarraycr}
-% If additional space is requested by the user this case is treated
-% in the macro \verb=\@argarraycr=. First we close the special brace
-% and then we test if the additional space is positive.
+% ^^A or (in case of \verb=!{...}=) the current \textsf{token} --- stored
+% ^^A in \verb=\@nextchar= --- has to be inserted into the preamble.
+% ^^A This corresponds to calling \verb=\@classv=.
% \begin{macrocode}
-\def\@argarraycr[#1]{\ifnum0=`{}\fi\ifdim #1>\z@
+ % \@classv \fi}
% \end{macrocode}
-% If this is the case we create an invisible vertical rule with
-% depth \verb=\dp\@arstutbox=${}+{}$\meta{wanted\ space}.
-% Thus we achieve that all vertical lines specified
-% in the user preamble by a \texttt{|} are now
-% generally drawn.
-% Then the row ends with a \verb=\cr=.
-%
-% If the space is negative we end the row at once with a \verb=\cr=
-% and move back up with a \verb=\vskip=.
-%
-% While testing these macros I found out that the
-% \verb=\endtemplate=
-% created by \verb=\cr= and \verb=&= is something like an
-% \verb=\outer= primitive and therefore it should not appear in
-% incomplete \verb=\if= statements. Thus the following solution was
-% chosen which hides the \verb=\cr= in other macros when \TeX\
-% is skipping conditional text.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@startpbox}
+% ^^A In \verb=\@classz= the macro \verb=\@startpbox= is used.
+% ^^A The width of the \textsf{parbox} is passed as an argument.
+% ^^A \verb=\vcenter=, \verb=\vtop= or \verb=\vbox= are already in the
+% ^^A preamble. So we start with the braces for the wanted box.
+% \begin{macrocode}
+ % \def\@startpbox#1{\bgroup
+% \end{macrocode}
+% ^^A The argument is the width of the box. This information has to be
+% ^^A assigned to \verb=\hsize=.
+% ^^A Then we assign default values to several parameters used in a
+% ^^A \textsf{parbox}.
+% \begin{macrocode}
+ % \setlength\hsize{#1}\@arrayparboxrestore
+% \end{macrocode}
+% ^^A Our main problem is to obtain the same distance between succeeding
+% ^^A lines of the \textsf{parbox}.
+% ^^A We have to remember that the distance between two \textsf{parboxes}
+% ^^A should be defined by \verb=\@arstrut=. That means that it can be
+% ^^A greater than the distance in a \textsf{parbox}.
+% ^^A Therefore it is not enough to set a \verb=\@arstrut= at the
+% ^^A beginning and at the end of the \textsf{parbox}. This would
+% ^^A dimension the distance
+% ^^A between first and second line and the distance between the two
+% ^^A last lines of the \textsf{parbox} wrongly.
+% ^^A To prevent this we set an invisible rule of height
+% ^^A \verb=\@arstrutbox=
+% ^^A at the beginning of the \textsf{parbox}. This has no effect on the
+% ^^A depth of the first line. At the end of the \textsf{parbox} we set
+% ^^A analogously another invisible rule which only affects the depth
+% ^^A of the last line. It is necessary to wait inserting this strut
+% ^^A until the paragraph actually starts to allow for things like
+% ^^A \verb=\parindent= changes via \verb=>{...}=.
+% \begin{macrocode}
+ % \everypar{%
+ % \vrule \@height \ht\@arstrutbox \@width \z@
+ % \everypar{}}%
+ % }
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@endpbox}
+% ^^A If there are any declarations defined by \verb=>{...}=
+% ^^A and \verb=<{...}=
+% ^^A they now follow in the macro \verb=\@classz= --- the contents
+% ^^A of the column in between.
+% ^^A So the macro \verb=\@endpbox= must insert the \textsf{specialstrut}
+% ^^A mentioned earlier and then close the group opened by
+% ^^A \verb=\@startpbox=.
+% \begin{macrocode}
+ % \def\@endpbox{\@finalstrut\@arstrutbox \egroup\hfil}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{Building and calling \texttt{\textbackslash halign}}
+% ^^A
+% ^^A \begin{macro}{\@array}
+% ^^A After we have discussed the macros needed for the evaluation
+% ^^A of the user preamble we can define the macro \verb=\@array=
+% ^^A which uses these macros to create a \verb=\halign=.
+% ^^A It has two arguments. The first one is a position argument
+% ^^A which can be \texttt{t}, \texttt{b} or \texttt{c}; the
+% ^^A second one describes the wanted preamble,
+% ^^A e.g.\ it has the form \verb=|c|c|c|=.
+% \begin{macrocode}
+ % \def\@array[#1]#2{%
+% \end{macrocode}
+% ^^A First we define a \textsf{strut} whose size basically corresponds
+% ^^A to a normal \textsf{strut} multiplied by the factor
+% ^^A \verb=\arraystretch=.
+% ^^A This \textsf{strut} is then inserted into every row and enforces
+% ^^A a minimal distance between two rows.
+% ^^A Nevertheless, when using horizontal lines, large letters
+% ^^A (like accented capital letters) still collide with such lines.
+% ^^A Therefore at first we add to the height of a normal \textsf{strut}
+% ^^A the value of the parameter \verb=\extrarowheight=.
+% \begin{macrocode}
+ % \@tempdima \ht \strutbox
+ % \advance \@tempdima by\extrarowheight
+ % \setbox \@arstrutbox \hbox{\vrule
+ % \@height \arraystretch \@tempdima
+ % \@depth \arraystretch \dp \strutbox
+ % \@width \z@}%
+% \end{macrocode}
+% ^^A Then we open a group, in which the user preamble is evaluated by
+% ^^A the macro \verb=\@mkpream=. As we know this must happen locally.
+% ^^A This macro creates a preamble for a \verb=\halign= and saves
+% ^^A its result globally in the control sequence \verb=\@preamble=.
+% \begin{macrocode}
+ % \begingroup
+ % \@mkpream{#2}%
+% \end{macrocode}
+% ^^A We again redefine \verb=\@preamble= so that a call up of \verb=\@preamble=
+% ^^A now starts the \verb=\halign=. Thus also the arguments of \texttt{>},
+% ^^A \texttt{<}, \texttt{@} and \texttt{!}, saved in the
+% ^^A \textsf{token} registers are inserted into the preamble. The
+% ^^A \verb=\tabskip= at the beginning and end of the preamble is set to
+% ^^A \textsf{0pt} (in the beginning by the use of \verb=\ialign=). Also the
+% ^^A command \verb=\@arstrut= is build in, which inserts the
+% ^^A \verb=\@arstrutbox=, defined above. Of course, the opening brace after
+% ^^A \verb=\ialign= has to be implicit as it will be closed in \verb=\endarray=
+% ^^A or another macro.
+% ^^A
+% ^^A The \verb=\noexpand= in front of \verb=\ialign= does no harm in standard \LaTeX{}
+% ^^A and was added since some experimental support for using text glyphs in math
+% ^^A redefines \verb=\halign= with the result that is becomes expandable with
+% ^^A disastrous results in cases like this.
+% ^^A In the kernel definition for this macro the problem does
+% ^^A not surface because there \verb=\protect= is set (which is not necessary in this
+% ^^A implementation as there is no arbitrary user input that can get expanded) and
+% ^^A the experimental code made the redefinition robust. Whether this is the right
+% ^^A approach is open to question; consider the \verb=\noexpand= a courtesy to allow an
+% ^^A unsupported redefinition of a \TeX{} primitive for the moment (as people rely
+% ^^A on that experimental code).
+% \begin{macrocode}
+ % \xdef\@preamble{\noexpand \ialign \@halignto
+ % \bgroup \@arstrut \@preamble
+ % \tabskip \z@ \cr}%
+% \end{macrocode}
+% ^^A What we have not explained yet is the macro \verb=\@halignto=
+% ^^A that was just used. Depending on its replacement text the
+% ^^A \verb=\halign= becomes a \verb=\halign= \texttt{to} \meta{dimen}.
+% ^^A Now we close the group again. Thus
+% ^^A \verb=\@startpbox= and \verb=\@endpbox= as well as all
+% ^^A \textsf{token} registers get their former meaning back.
+% \begin{macrocode}
+ % \endgroup
+% \end{macrocode}
+% ^^A To support the \texttt{delarray.sty} package we include a hook
+% ^^A into this part of the code which is a no-op in the main package.
+% \begin{macrocode}
+ % \@arrayleft
+% \end{macrocode}
+% ^^A Now we decide depending on the position argument in which
+% ^^A \textsf{box} the \verb=\halign= is to be put. (\verb=\vcenter= may be used
+% ^^A because we are in math mode.)
+% \begin{macrocode}
+ % \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
+% \end{macrocode}
+% ^^A Now another implicit opening brace appears; then definitions
+% ^^A which shall stay local follow. While constructing the
+% ^^A \verb=\@preamble= in \verb=\@mkpream= the \verb=#= sign must be
+% ^^A hidden in the macro \verb=\@sharp= which is \verb=\let= to
+% ^^A \verb=\relax= at that moment (see definition of \verb=\@mkpream=
+% ^^A on page~\pageref{@mkpream}).
+% ^^A All these now get their actual meaning.
+% \begin{macrocode}
+ % \bgroup
+ % \let \@sharp ##\let \protect \relax
+% \end{macrocode}
+% ^^A With the above defined \textsf{struts} we fix down the distance
+% ^^A between rows by setting \verb=\lineskip= and \verb=\baselineskip=
+% ^^A to \textsf{0pt}. Since there have to be set \verb=$='s
+% ^^A around every column in the \textsf{array}--environment
+% ^^A the parameter \verb=\mathsurround= should
+% ^^A also be set to \textsf{0pt}. This prevents additional space between
+% ^^A the rows. The
+% ^^A \PlainTeX--macro \verb=\m@th= does this.
+% \begin{macrocode}
+ % \lineskip \z@
+ % \baselineskip \z@
+ % \m@th
+% \end{macrocode}
+% ^^A Beside, we have to assign a special meaning (which we still have
+% ^^A to specify) to the line separator \verb=\\=. We also have to
+% ^^A redefine the command \verb=\par= in such a way that empty lines in
+% ^^A \verb=\halign= cannot do any damage. We succeed in doing so
+% ^^A by choosing something that will disappear when expanding.
+% ^^A After that we only have to call up \verb=\@preamble= to
+% ^^A start the wanted \verb=\halign=.
+% \begin{macrocode}
+ % \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\arraybackslash}
+% ^^A Restore \verb=\\= for use in array and tabular environment (after
+% ^^A \verb=\raggedright= etc.).
% \begin{macrocode}
- \expandafter\@xargarraycr\else
- \expandafter\@yargarraycr\fi{#1}}
+ % \def\arraybackslash{\let\\\tabularnewline}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@xargarraycr}
-% \begin{macro}{\@yargarraycr}
-% The following macros were already explained above.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\extrarowheight}
+% ^^A The \textsf{dimen} parameter used above also needs to be
+% ^^A allocated. As a default value we use \textsf{0pt}, to ensure
+% ^^A compatibility with standard \LaTeX.
% \begin{macrocode}
-\def\@xargarraycr#1{\unskip
- \@tempdima #1\advance\@tempdima \dp\@arstrutbox
- \vrule \@depth\@tempdima \@width\z@ \cr}
-\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
+ % \newdimen \extrarowheight
+ % \extrarowheight=0pt
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-% \subsubsection{Spanning several columns}
-%
-% \begin{macro}{\multicolumn}
-% If several columns should be held together with a special format
-% the command \verb=\multicolumn= must be used. It has three
-% arguments: the number of columns to be covered; the format for
-% the result column and the actual column entry.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@arstrut}
+% ^^A Now the insertion of \verb=\@arstrutbox= through \verb=\@arstut=
+% ^^A is easy since we know exactly in which mode \TeX\ is while working
+% ^^A on the \verb=\halign= preamble.
% \begin{macrocode}
-\long\def\multicolumn#1#2#3{%
+ % \def\@arstrut{\unhcopy\@arstrutbox}
% \end{macrocode}
-% First we combine the given number of columns into a single one;
-% then we start a new block so that the following definition is kept
-% local.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{The line separator \texttt{\textbackslash\textbackslash}}
+% ^^A
+% ^^A \begin{macro}{\@arraycr}
+% ^^A In the macro \verb=\@array= the line separator \verb=\\= is
+% ^^A \verb=\let= to the command \verb=\@arraycr=.
+% ^^A Its definition starts with a special brace which I have directly
+% ^^A copied from the original definition. It is
+% ^^A necessary, because the \verb=\futurlet= in \verb=\@ifnextchar=
+% ^^A might
+% ^^A expand a following \verb=&= \textsf{token} in a construction like
+% ^^A \verb=\\ &=. This would otherwise end the alignment template at a
+% ^^A wrong time. On the other hand we have to be careful to avoid
+% ^^A producing a real group, i.e.\ \verb={}=, because the command will also
+% ^^A be used for the array environment, i.e.\ in math mode. In that
+% ^^A case an extra \verb={}= would produce an ord atom which could mess up
+% ^^A the spacing. For this reason we use a combination that does not
+% ^^A really produce a group at all but modifies the master counter so
+% ^^A that a \verb=&= will not be considered belonging to the current
+% ^^A \verb=\halign= while we are looking for a \verb=*= or \verb=[=.
+% ^^A For further information see
+% ^^A \cite[Appendix D]{bk:knuth}.
+% \begin{macrocode}
+ % \def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi
+% \end{macrocode}
+% ^^A Then we test whether the user is using the star form and ignore
+% ^^A a possible star (I also disagree with this procedure, because a
+% ^^A star does not make any sense here).
+% \begin{macrocode}
+ % \@ifstar \@xarraycr \@xarraycr}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@xarraycr}
+% ^^A In the command \verb=\@xarraycr= we test if an optional argument
+% ^^A exists.
% \begin{macrocode}
- \multispan{#1}\begingroup
+ % \def\@xarraycr{\@ifnextchar [%
% \end{macrocode}
-% Since a \verb=\multicolumn= should only describe the format of a
-% result column, we redefine \verb=\@addamp= in such a way that one gets
-% an error message if one uses more than one \texttt{c},
-% \texttt{l}, \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in
-% the second argument. One should consider that this definition is
-% local to the build-up of the preamble; an \textsf{array}-- or
-% \textsf{tabular}--environment in the third argument of the
-% \verb=\multicolumn= is therefore worked through correctly as well.
+% ^^A If it does, we branch out into the macro \verb=\@argarraycr= if
+% ^^A not we close the special brace (mentioned above) and end the row
+% ^^A of the \verb=\halign= with a \verb=\cr=.
% \begin{macrocode}
- \def\@addamp{\if@firstamp \@firstampfalse \else
- \@preamerr 5\fi}%
+ % \@argarraycr {\ifnum 0=`{}\fi\cr}}
% \end{macrocode}
-% Then we evaluate the second argument with the help of
-% \verb=\@mkpream=.
-% Now we still have to insert the contents of the \textsf{token}
-% register into the \verb=\@preamble=, i.e.\ we have to say
-% \verb=\xdef\@preamble{\@preamble}=. This is achieved shorter by
-% writing:
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@argarraycr}
+% ^^A If additional space is requested by the user this case is treated
+% ^^A in the macro \verb=\@argarraycr=. First we close the special brace
+% ^^A and then we test if the additional space is positive.
+% \begin{macrocode}
+ % \def\@argarraycr[#1]{\ifnum0=`{}\fi\ifdim #1>\z@
+% \end{macrocode}
+% ^^A If this is the case we create an invisible vertical rule with
+% ^^A depth \verb=\dp\@arstutbox=${}+{}$\meta{wanted\ space}.
+% ^^A Thus we achieve that all vertical lines specified
+% ^^A in the user preamble by a \texttt{|} are now
+% ^^A generally drawn.
+% ^^A Then the row ends with a \verb=\cr=.
+% ^^A
+% ^^A If the space is negative we end the row at once with a \verb=\cr=
+% ^^A and move back up with a \verb=\vskip=.
+% ^^A
+% ^^A While testing these macros I found out that the
+% ^^A \verb=\endtemplate=
+% ^^A created by \verb=\cr= and \verb=&= is something like an
+% ^^A \verb=\outer= primitive and therefore it should not appear in
+% ^^A incomplete \verb=\if= statements. Thus the following solution was
+% ^^A chosen which hides the \verb=\cr= in other macros when \TeX\
+% ^^A is skipping conditional text.
+% \begin{macrocode}
+ % \expandafter\@xargarraycr\else
+ % \expandafter\@yargarraycr\fi{#1}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@xargarraycr}
+% ^^A \begin{macro}{\@yargarraycr}
+% ^^A The following macros were already explained above.
% \begin{macrocode}
- \@mkpream{#2}\@addtopreamble\@empty
+ % \def\@xargarraycr#1{\unskip
+ % \@tempdima #1\advance\@tempdima \dp\@arstrutbox
+ % \vrule \@depth\@tempdima \@width\z@ \cr}
+ % \def\@yargarraycr#1{\cr\noalign{\vskip #1}}
% \end{macrocode}
-% After the \verb=\@preamble= is created we forget all local
-% definitions and occupations of the \textsf{token} registers.
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{Spanning several columns}
+% ^^A
+% ^^A \begin{macro}{\multicolumn}
+% ^^A If several columns should be held together with a special format
+% ^^A the command \verb=\multicolumn= must be used. It has three
+% ^^A arguments: the number of columns to be covered; the format for
+% ^^A the result column and the actual column entry.
+% \begin{macrocode}
+ % \long\def\multicolumn#1#2#3{%
+% \end{macrocode}
+% ^^A First we combine the given number of columns into a single one;
+% ^^A then we start a new block so that the following definition is kept
+% ^^A local.
+% \begin{macrocode}
+ % \multispan{#1}\begingroup
+% \end{macrocode}
+% ^^A Since a \verb=\multicolumn= should only describe the format of a
+% ^^A result column, we redefine \verb=\@addamp= in such a way that one gets
+% ^^A an error message if one uses more than one \texttt{c},
+% ^^A \texttt{l}, \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in
+% ^^A the second argument. One should consider that this definition is
+% ^^A local to the build-up of the preamble; an \textsf{array}-- or
+% ^^A \textsf{tabular}--environment in the third argument of the
+% ^^A \verb=\multicolumn= is therefore worked through correctly as well.
+% \begin{macrocode}
+ % \def\@addamp{\if@firstamp \@firstampfalse \else
+ % \@preamerr 5\fi}%
+% \end{macrocode}
+% ^^A Then we evaluate the second argument with the help of
+% ^^A \verb=\@mkpream=.
+% ^^A Now we still have to insert the contents of the \textsf{token}
+% ^^A register into the \verb=\@preamble=, i.e.\ we have to say
+% ^^A \verb=\xdef\@preamble{\@preamble}=. This is achieved shorter by
+% ^^A writing:
+% \begin{macrocode}
+ % \@mkpream{#2}\@addtopreamble\@empty
+% \end{macrocode}
+% ^^A After the \verb=\@preamble= is created we forget all local
+% ^^A definitions and occupations of the \textsf{token} registers.
% \begin{macrocode}
- \endgroup
-% \end{macrocode}
-% In the special situation of \verb=\multicolumn= \verb=\@preamble=
-% is not needed as preamble for a \verb=\halign= but it is directly
-% inserted into our table. Thus instead of \verb=\sharp=
-% there has to be the column entry (\verb=#3=) wanted by the user.
-% \begin{macrocode}
- \def\@sharp{#3}%
-% \end{macrocode}
-% Now we can pass the \verb=\@preamble= to \TeX\ . For safety
-% we start with an \verb=\@arstrut=. This should usually be in the
-% template for the first column however we do not know if this
-% template was overwritten by our \verb=\multicolumn=.
-% We also add a \verb=\null= at the right end to prevent any following
-% \verb=\unskip= (for example from \verb=\\[..]=) to remove the \verb=\tabcolsep=.
-% \begin{macrocode}
- \@arstrut \@preamble
- \null
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \subsubsection{The Environment Definitions}
-%
-% After these preparations we are able to define the environments. They
-% only differ in the initialisations of \verb=\d@llar...=, \verb=\col@sep=
-% and \verb=\@halignto=.
-%
-% \begin{macro}{\@halignto}
-% \begin{macro}{\d@llarbegin}
-% \begin{macro}{\d@llarend}
-% \verb=\d@llar= has to be
-% locally asigned since otherwise nested \textsf{tabular} and \textsf{array}
-% environments (via \verb=\multicolumn=) are impossible.
-% For 25 years or so \verb=\@halignto= was set globally (to save space on the
-% save stack, but that was a mistake: if there is a tabular in the
-% output routine (e.g., in the running header) then that tabular is
-% able overwrite the \verb=\@halignto=
-% setting of a tabular in the main text resulting in a very weird error.
-% When the new font selection scheme is in force we have to
-% we surround all \verb=\halign= entries
-% with braces. See remarks in TUGboat 10\#2. Actually we are going
-% to use \verb=\begingroup= and \verb=\endgroup=. However, this is only
-% necessary when we are in text mode. In math the surrounding
-% dollar signs will already serve as the necessary extra grouping
-% level. Therefore we switch the settings of \verb=\d@llarbegin= and
-% \verb=\d@llarend= between groups and dollar signs.
-% \begin{macrocode}
-\let\d@llarbegin\begingroup
-\let\d@llarend\endgroup
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\array}
-% Our new definition of \verb=\array= then reads:
-% \begin{macrocode}
-\def\array{\col@sep\arraycolsep
- \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%$ emacs
-% \end{macrocode}
-% Since there might be an optional argument we call another
-% macro which is also used by the other environments.
-% \begin{macrocode}
- \@tabarray}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@tabarray}
-% This macro tests for a optional bracket and then calls up
-% \verb=\@array= or \verb=\@array[c]= (as default).
-% \begin{macrocode}
-\def\@tabarray{\@ifnextchar[{\@array}{\@array[c]}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\tabular}
-% \begin{macro}{\tabular*}
-% The environments \textsf{tabular} and \textsf{tabular$*$} differ
-% only in the initialisation of the command \verb=\@halignto=. Therefore
-% we define
-% \begin{macrocode}
-\def\tabular{\def\@halignto{}\@tabular}
-% \end{macrocode}
-% and analogously for the star form. We evaluate the argument first
-% using =\setlength= so that users of the \texttt{calc} package can
-% write code like\\ \verb=\begin{tabular*}{(\columnwidth-1cm)/2}...=
-% \begin{macrocode}
-\expandafter\def\csname tabular*\endcsname#1{%
- \setlength\dimen@{#1}%
- \edef\@halignto{to\the\dimen@}\@tabular}
+ % \endgroup
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@tabular}
-% The rest of the job is carried out by the \verb=\@tabular= macro:
-% \begin{macrocode}
-\def\@tabular{%
-% \end{macrocode}
-% First of all we have to make sure that we start out in
-% \textsf{hmode}. Otherwise we might find our table dangling by
-% itself on a line.
-% \begin{macrocode}
- \leavevmode
-% \end{macrocode}
-% It should be taken into consideration that the macro \verb=\@array=
-% must be called in math mode. Therefore we open a \textsf{box},
-% insert a \verb=$= and then assign the correct values to \verb=\col@sep= and
-% \verb=\d@llar...=.
-% \begin{macrocode}
- \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup% $ emacs
- \let\d@llarend\endgroup
-% \end{macrocode}
-% Now everything \textsf{tabular} specific is done and we are able to
-% call the \verb=\@tabarray= macro.
-% \begin{macrocode}
- \@tabarray}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\endarray}
-% When the processing of \textsf{array} is finished we have to
-% close the \verb=\halign=
-% and afterwards the surrounding \textsf{box} selected by
-% \verb=\@array=. To save \textsf{token} space we then redefine
-% \verb=\@preamble=
-% because its replacement text isn't longer needed.
-% \begin{macrocode}
-\def\endarray{\crcr \egroup \egroup \gdef\@preamble{}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\endtabular}
-% \begin{macro}{\endtabular*}
-% To end a \textsf{tabular} or \textsf{tabular$*$} environment we
-% call up \verb=\endarray=, close the math mode and then the surrounding
-% \verb=\hbox=.
-% \begin{macrocode}
-\def\endtabular{\endarray $\egroup}%$ emacs
-\expandafter\let\csname endtabular*\endcsname=\endtabular
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-% \subsubsection{Last minute definitions}
-%
-%
-% If this file is used as a package file we should \verb=\let= all macros
-% to \verb=\relax= that were used in the original but are no longer
-% necessary.
-% \begin{macrocode}
-\let\@ampacol=\relax \let\@expast=\relax
-\let\@arrayclassiv=\relax \let\@arrayclassz=\relax
-\let\@tabclassiv=\relax \let\@tabclassz=\relax
-\let\@arrayacol=\relax \let\@tabacol=\relax
-\let\@tabularcr=\relax \let\@@endpbox=\relax
-\let\@argtabularcr=\relax \let\@xtabularcr=\relax
-% \end{macrocode}
-%
-% \begin{macro}{\@preamerr}
-% We also have to redefine the error routine \verb=\@preamerr= since
-% new kind of errors are possible.
-% The code for this macro is not perfect yet;
-% it still needs too much memory.
-% \begin{macrocode}
-\def\@preamerr#1{\def\@tempd{{..} at wrong position: }%
- %\PackageError{array}{%
- \ClassError{memoir}{% changed in menoir
- \ifcase #1 Illegal pream-token (\@nextchar): `c' used\or %0
- Missing arg: token ignored\or %1
- Empty preamble: `l' used\or %2
- >\@tempd token ignored\or %3
- <\@tempd changed to !{..}\or %4
- Only one column-spec. allowed.\fi}\@ehc} %5
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \subsubsection
-% [Defining your own column specifiers]
-% {Defining your own column specifiers\footnotemark}
-%
-% \footnotetext{The code and the documentation in this section was
-% written by David. So far only the code from newarray was plugged
-% into array so that some parts of the documentation still claim
-% that this is newarray and even worse, some parts of the code are
-% unnecessarily doubled. This will go away in a future release. For
-% the moment we thought it would be more important to bring both
-% packages together.}
-%
-% \begin{macro}{\newcolumn}
-% In \texttt{newarray.sty} the macro for specifying new columns was
-% named \verb"\newcolumn". When the functionality was added to
-% \texttt{array.sty} the command was renamed \verb"\newcolumntype".
-% Initially both names were supported, but now (In versions of this
-% package distributed for \LaTeXe) the old name is not defined.
-% \end{macro}
-%
-% \begin{macro}{\newcolumntype}
-% As
-% described above, the \verb"\newcolumntype" macro gives users the chance
-% to define letters, to be used in the same way as the primitive
-% column specifiers, `c' `p' etc.
-% \begin{macrocode}
-\def\newcolumntype#1{%
-% \end{macrocode}
-% \verb"\NC@char" was added in V2.01 so that active characters, like "@" in
-% AMS\LaTeX\ may be used. This trick was stolen from \texttt{array.sty}
-% 2.0h. Note that we need to use the possibly active token,
-% \verb"#1", in several places, as that is the token that actually
-% appears in the preamble argument.
-% \begin{macrocode}
- \edef\NC@char{\string#1}%
-% \end{macrocode}
-% First we check whether there is already a definition for this column.
-% Unlike \verb"\newcommand" we give a warning rather than an error if it is
-% defined. If it is a new column, add \verb"\NC@do" \meta{column} to
-% the list \verb"\NC@list".
-% \begin{macrocode}
- \@ifundefined{NC@find@\NC@char}%
- {\@tfor\next:=<>clrmbp@!|\do{\if\noexpand\next\NC@char
- %\PackageWarning{array}%
- \@memwarn{Redefining primitive column \NC@char}\fi}% memoir change
- \NC@list\expandafter{\the\NC@list\NC@do#1}}%
- {%\PackageWarning{array}
- \@memwarn{Column \NC@char\space is already defined}}% memoir change
-% \end{macrocode}
-% Now we define a macro with an argument delimited by the new column
-% specifier, this is used to find occurrences of this specifier in the
-% user preamble.
-% \begin{macrocode}
- \@namedef{NC@find@\NC@char}##1#1{\NC@{##1}}%
-% \end{macrocode}
-% If an optional argument was not given, give a default argument of 0.
-% \begin{macrocode}
- \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\newcol@}
-% We can now define the macro which does the rewriting,
-% \verb"\@reargdef" takes the same arguments as \verb"\newcommand", but
-% does not check that the command is new. For a column, say `D' with
-% one argument, define a command \verb"\NC@rewrite@D" with one
-% argument, which recursively calls \verb"\NC@find" on the user preamble
-% after replacing the first token or group with the replacement text
-% specified in the \verb"\newcolumntype" command. \verb"\NC@find" will find the
-% next occurrence of `D' as it will be \verb"\let" equal to
-% \verb"\NC@find@D" by \verb"\NC@do".
-% \begin{macrocode}
-\def\newcol@#1[#2]#3{\expandafter\@reargdef
- \csname NC@rewrite@#1\endcsname[#2]{\NC@find#3}}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\NC@}
-% Having found an occurrence of the new column, save the preamble
-% before the column in \verb"\@temptokena", then check to see if we
-% are at the end of the preamble. (A dummy occurrence of the column
-% specifier will be placed at the end of the preamble by \verb"\NC@do".
-% \begin{macrocode}
-\def\NC@#1{%
- \@temptokena\expandafter{\the\@temptokena#1}\futurelet\next\NC@ifend}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\NC@ifend}
-% We can tell that we are at the end as \verb"\NC@do" will place a \verb"\relax"
-% after the dummy column.
+% ^^A In the special situation of \verb=\multicolumn= \verb=\@preamble=
+% ^^A is not needed as preamble for a \verb=\halign= but it is directly
+% ^^A inserted into our table. Thus instead of \verb=\sharp=
+% ^^A there has to be the column entry (\verb=#3=) wanted by the user.
% \begin{macrocode}
-\def\NC@ifend{%
+ % \def\@sharp{#3}%
% \end{macrocode}
-% If we are at the end, do nothing. (The whole preamble will now be in
-% \verb"\@temptokena".)
+% ^^A Now we can pass the \verb=\@preamble= to \TeX\ . For safety
+% ^^A we start with an \verb=\@arstrut=. This should usually be in the
+% ^^A template for the first column however we do not know if this
+% ^^A template was overwritten by our \verb=\multicolumn=.
+% ^^A We also add a \verb=\null= at the right end to prevent any following
+% ^^A \verb=\unskip= (for example from \verb=\\[..]=) to remove the \verb=\tabcolsep=.
% \begin{macrocode}
- \ifx\next\relax
+ % \@arstrut \@preamble
+ % \null
+ % \ignorespaces}
% \end{macrocode}
-% Otherwise set the flag \verb"\if@tempswa", and rewrite the column.
-% \verb"\expandafter" introduced 1n V2.01
-% \begin{macrocode}
- \else\@tempswatrue\expandafter\NC@rewrite\fi}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\NC@do}
-% If the user has specified `C' and `L' as new columns, the list of
-% rewrites (in the token register \verb"\NC@list") will look like
-% \verb"\NC@do *" \verb"\NC@do C" \verb"\NC@do L".
-% So we need to define \verb"\NC@do" as a one argument macro which
-% initialises the rewriting of the specified column. Let us assume that
-% `C' is the argument.
-% \begin{macrocode}
-\def\NC@do#1{%
-% \end{macrocode}
-% First we let \verb"\NC@rewrite" and \verb"\NC@find" be
-% \verb"\NC@rewrite@C" and \verb"\NC@find@C" respectively.
-% \begin{macrocode}
- \expandafter\let\expandafter\NC@rewrite
- \csname NC@rewrite@\string#1\endcsname
- \expandafter\let\expandafter\NC@find
- \csname NC@find@\string#1\endcsname
-% \end{macrocode}
-% Clear the token register \verb"\@temptokena" after putting the present
-% contents of the register in front of the token \verb"\NC@find". At the
-% end we place the tokens `\verb"C\relax"' which \verb"\NC@ifend" will use
-% to detect the end of the user preamble.
-% \begin{macrocode}
- \expandafter\@temptokena\expandafter{\expandafter}%
- \expandafter\NC@find\the\@temptokena#1\relax}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\showcols}
-% This macro is useful for debugging \verb"\newcolumntype" specifications,
-% it is the equivalent of the primitive \verb"\show" command for macro
-% definitions. All we need to do is locally redefine \verb"\NC@do" to take
-% its argument (say `C') and then \verb"\show" the (slightly modified)
-% definition of \verb"\NC@rewrite@C". Actually as the the list always
-% starts off with \verb"\NC@do *" and we do not want to print the
-% definition of the $*$-form, define \verb"\NC@do" to throw away the first
-% item in the list, and then redefine itself to print the rest of the
-% definitions.
-% \begin{macrocode}
-\def\showcols{{\def\NC@do##1{\let\NC@do\NC@show}\the\NC@list}}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\NC@show}
-% If the column `C' is defined as above, then
-% \verb"\show\NC@rewrite@C" would output\\
-% \verb"\long macro: ->\NC@find >{$}c<{$}".
-% We want to strip the \verb"long macro: ->" and the \verb"\NC@find". So first we
-% use \verb"\meaning" and then apply the macro \verb"\NC@strip" to the tokens so
-% produced and then \verb"\typeout" the required string.
-% \begin{macrocode}
-\def\NC@show#1{%
- \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip
- \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\NC@strip}
-% Delimit the arguments to \verb"\NC@strip" with `\texttt{:}', `\texttt{->}',
-% a space, and \verb"\@@" to pull out the required parts of the output from
-% \verb"\meaning".
-% \begin{macrocode}
-\def\NC@strip#1:#2->#3 #4\@@{#2 -> #4}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\NC@list}
-% Allocate the token register used for the rewrite list.
-% \begin{macrocode}
-\newtoks\NC@list
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{The $*$--form}
-% We view the $*$-form as a slight generalisation of the system
-% described in the previous subsection. The idea is to define a $*$
-% column by a command of the form:
-% \begin{verbatim}
-% \newcolumntype{*}[2]{%
-% \count@=#1\ifnum\count@>0
-% \advance\count@ by -1 #2*{\count@}{#2}\fi}
-% \end{verbatim}
-% \begin{macro}{\NC@rewrite@*}\label{NC@rewrite@*}
-% This does not work however as \verb"\newcolumntype" takes great care not
-% to expand anything in the preamble, and so the \verb"\if" is never
-% expanded. \verb"\newcolumntype" sets up various other parts of the
-% rewrite correctly though so we can define:
-% \begin{macrocode}
-\newcolumntype{*}[2]{}
-% \end{macrocode}
-% Now we must correct the definition of \verb"\NC@rewrite@*". The
-% following is probably more efficient than a direct translation of
-% the idea sketched above, we do not need to put a $*$ in the preamble
-% and call the rewrite recursively, we can just put \verb"#1" copies of
-% \verb"#2" into \verb"\@temptokena". (Nested $*$ forms will be expanded
-% when the whole rewrite list is expanded again, see \verb"\@mkpream")
-% \begin{macrocode}
-\long\@namedef{NC@rewrite@*}#1#2{%
-% \end{macrocode}
-% Store the number.
-% \begin{macrocode}
- \count@#1\relax
-% \end{macrocode}
-% Put \verb"#1" copies of \verb"#2" in the token register.
-% \begin{macrocode}
- \loop
- \ifnum\count@>\z@
- \advance\count@\m@ne
- \@temptokena\expandafter{\the\@temptokena#2}%
- \repeat
-% \end{macrocode}
-% \verb"\NC@do" will ensure that \verb"\NC@find" is \verb"\let" equal
-% to \verb"\NC@find@*".
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{The Environment Definitions}
+% ^^A
+% ^^A After these preparations we are able to define the environments. They
+% ^^A only differ in the initialisations of \verb=\d@llar...=, \verb=\col@sep=
+% ^^A and \verb=\@halignto=.
+% ^^A
+% ^^A \begin{macro}{\@halignto}
+% ^^A \begin{macro}{\d@llarbegin}
+% ^^A \begin{macro}{\d@llarend}
+% ^^A \verb=\d@llar= has to be
+% ^^A locally asigned since otherwise nested \textsf{tabular} and \textsf{array}
+% ^^A environments (via \verb=\multicolumn=) are impossible.
+% ^^A For 25 years or so \verb=\@halignto= was set globally (to save space on the
+% ^^A save stack, but that was a mistake: if there is a tabular in the
+% ^^A output routine (e.g., in the running header) then that tabular is
+% ^^A able overwrite the \verb=\@halignto=
+% ^^A setting of a tabular in the main text resulting in a very weird error.
+% ^^A When the new font selection scheme is in force we have to
+% ^^A we surround all \verb=\halign= entries
+% ^^A with braces. See remarks in TUGboat 10\#2. Actually we are going
+% ^^A to use \verb=\begingroup= and \verb=\endgroup=. However, this is only
+% ^^A necessary when we are in text mode. In math the surrounding
+% ^^A dollar signs will already serve as the necessary extra grouping
+% ^^A level. Therefore we switch the settings of \verb=\d@llarbegin= and
+% ^^A \verb=\d@llarend= between groups and dollar signs.
+% \begin{macrocode}
+ % \let\d@llarbegin\begingroup
+ % \let\d@llarend\endgroup
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\array}
+% ^^A Our new definition of \verb=\array= then reads:
% \begin{macrocode}
- \NC@find}
+ % \def\array{\col@sep\arraycolsep
+ % \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%$ emacs
% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Modifications to internal macros of \texttt{array.sty}}
-%
-% \begin{macro}{\@xexpast}
-% \begin{macro}{\@xexnoop}
-% These macros are used to expand $*$-forms in
-% \texttt{array.sty}. \verb"\let" them to \verb"\relax" to save space.
+% ^^A Since there might be an optional argument we call another
+% ^^A macro which is also used by the other environments.
% \begin{macrocode}
-\let\@xexpast\relax
-\let\@xexnoop\relax
+ % \@tabarray}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\save@decl}
-% We do not assume that the token register is free, we add the new
-% declarations to the front of the register. This is to allow user
-% preambles of the form, \verb">{foo}>{bar}..". Users are not encouraged to
-% enter such expressions directly, but they may result from the
-% rewriting of \verb"\newcolumntype"'s.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@tabarray}
+% ^^A This macro tests for a optional bracket and then calls up
+% ^^A \verb=\@array= or \verb=\@array[c]= (as default).
% \begin{macrocode}
-\def\save@decl{\toks \count@ = \expandafter\expandafter\expandafter
- {\expandafter\@nextchar\the\toks\count@}}
+ % \def\@tabarray{\@ifnextchar[{\@array}{\@array[c]}}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\@mkpream}
-% The main modification to \verb"\@mkpream" is to replace the call to
-% \verb"\@xexpast" (which expanded $*$-forms) by a loop which expands
-% all \verb"\newcolumntype" specifiers.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\tabular}
+% ^^A \begin{macro}{\tabular*}
+% ^^A The environments \textsf{tabular} and \textsf{tabular$*$} differ
+% ^^A only in the initialisation of the command \verb=\@halignto=. Therefore
+% ^^A we define
+% \begin{macrocode}
+ % \def\tabular{\def\@halignto{}\@tabular}
+% \end{macrocode}
+% ^^A and analogously for the star form. We evaluate the argument first
+% ^^A using =\setlength= so that users of the \texttt{calc} package can
+% ^^A write code like\\ \verb=\begin{tabular*}{(\columnwidth-1cm)/2}...=
+% ^^A \begin{macrocode}
+ % \expandafter\def\csname tabular*\endcsname#1{%
+ % \setlength\dimen@{#1}%
+ % \edef\@halignto{to\the\dimen@}\@tabular}
+% ^^A \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@tabular}
+% ^^A The rest of the job is carried out by the \verb=\@tabular= macro:
% \begin{macrocode}
-\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
- \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
+ % \def\@tabular{%
% \end{macrocode}
-% Now we remove possible $*$-forms and user-defined column
-% specifiers in the user preamble by repeatedly executing the list
-% \verb"\NC@list" until the re-writes have no more effect. The
-% expanded preamble will then be in the token register
-% \verb"\@temptokena". Actually we need to know at this point that
-% this is not \verb"\toks0".
+% ^^A First of all we have to make sure that we start out in
+% ^^A \textsf{hmode}. Otherwise we might find our table dangling by
+% ^^A itself on a line.
% \begin{macrocode}
- \@temptokena{#1}\@tempswatrue
- \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
+ % \leavevmode
% \end{macrocode}
-% Afterwards we initialize all registers and macros, that we need
-% for the build-up of the preamble.
+% ^^A It should be taken into consideration that the macro \verb=\@array=
+% ^^A must be called in math mode. Therefore we open a \textsf{box},
+% ^^A insert a \verb=$= and then assign the correct values to \verb=\col@sep= and
+% ^^A \verb=\d@llar...=.
% \begin{macrocode}
- \count@\m@ne
- \let\the@toks\relax
- \prepnext@tok
+ % \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup% $ emacs
+ % \let\d@llarend\endgroup
% \end{macrocode}
-% Having expanded all tokens defined using \verb"\newcolumntype" (including
-% \verb"*"), we evaluate the remaining tokens, which are saved in
-% \verb"\@temptokena". We use the \LaTeX--macro \verb"\@tfor" to inspect each
-% token in turn.
+% ^^A Now everything \textsf{tabular} specific is done and we are able to
+% ^^A call the \verb=\@tabarray= macro.
% \begin{macrocode}
- \expandafter \@tfor \expandafter \@nextchar
- \expandafter :\expandafter =\the\@temptokena \do
+ % \@tabarray}
% \end{macrocode}
-% \verb"\@testpatch" does not take an argument since \texttt{array.sty} 2.0h.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\endarray}
+% ^^A When the processing of \textsf{array} is finished we have to
+% ^^A close the \verb=\halign=
+% ^^A and afterwards the surrounding \textsf{box} selected by
+% ^^A \verb=\@array=. To save \textsf{token} space we then redefine
+% ^^A \verb=\@preamble=
+% ^^A because its replacement text isn't longer needed.
% \begin{macrocode}
- {\@testpach
- \ifcase \@chclass \@classz \or \@classi \or \@classii
- \or \save@decl \or \or \@classv \or \@classvi
- \or \@classvii \or \@classviii
+ % \def\endarray{\crcr \egroup \egroup \gdef\@preamble{}}
% \end{macrocode}
-% In \texttt{newarray.sty} class 9 is equivalent to class 10.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\endtabular}
+% ^^A \begin{macro}{\endtabular*}
+% ^^A To end a \textsf{tabular} or \textsf{tabular$*$} environment we
+% ^^A call up \verb=\endarray=, close the math mode and then the surrounding
+% ^^A \verb=\hbox=.
% \begin{macrocode}
- \or \@classx
- \or \@classx \fi
- \@lastchclass\@chclass}%
- \ifcase\@lastchclass
- \@acol \or
- \or
- \@acol \or
- \@preamerr \thr@@ \or
- \@preamerr \tw@ \@addtopreamble\@sharp \or
- \or
- \else \@preamerr \@ne \fi
- \def\the@toks{\the\toks}}
+ % \def\endtabular{\endarray $\egroup}%$ emacs
+ % \expandafter\let\csname endtabular*\endcsname=\endtabular
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@classix}
-% \texttt{array.sty} does not allow repeated \texttt{>}
-% declarations for the same column. This is allowed in
-% \texttt{newarray.sty} as documented in the introduction. Removing
-% the test for this case makes class 9 equivalent to class 10, and
-% so this macro is redundant. It is \verb"\let" to \verb"\relax" to save
-% space.
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection{Last minute definitions}
+% ^^A
+% ^^A
+% ^^A If this file is used as a package file we should \verb=\let= all macros
+% ^^A to \verb=\relax= that were used in the original but are no longer
+% ^^A necessary.
% \begin{macrocode}
-\let\@classix\relax
+ % \let\@ampacol=\relax \let\@expast=\relax
+ % \let\@arrayclassiv=\relax \let\@arrayclassz=\relax
+ % \let\@tabclassiv=\relax \let\@tabclassz=\relax
+ % \let\@arrayacol=\relax \let\@tabacol=\relax
+ % \let\@tabularcr=\relax \let\@@endpbox=\relax
+ % \let\@argtabularcr=\relax \let\@xtabularcr=\relax
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@classviii}
-% In \texttt{newarray.sty} explicitly allow class 2, as repeated
-% \texttt{<} expressions are accepted by this package.
+% ^^A
+% ^^A \begin{macro}{\@preamerr}
+% ^^A We also have to redefine the error routine \verb=\@preamerr= since
+% ^^A new kind of errors are possible.
+% ^^A The code for this macro is not perfect yet;
+% ^^A it still needs too much memory.
+% \begin{macrocode}
+ % \def\@preamerr#1{\def\@tempd{{..} at wrong position: }%
+ % %\PackageError{array}{%
+ % \ClassError{memoir}{% changed in menoir
+ % \ifcase #1 Illegal pream-token (\@nextchar): `c' used\or %0
+ % Missing arg: token ignored\or %1
+ % Empty preamble: `l' used\or %2
+ % >\@tempd token ignored\or %3
+ % <\@tempd changed to !{..}\or %4
+ % Only one column-spec. allowed.\fi}\@ehc} %5
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A
+% ^^A \subsubsection
+% ^^A [Defining your own column specifiers]
+% ^^A {Defining your own column specifiers\footnotemark}
+% ^^A
+% ^^A \footnotetext{The code and the documentation in this section was
+% ^^A written by David. So far only the code from newarray was plugged
+% ^^A into array so that some parts of the documentation still claim
+% ^^A that this is newarray and even worse, some parts of the code are
+% ^^A unnecessarily doubled. This will go away in a future release. For
+% ^^A the moment we thought it would be more important to bring both
+% ^^A packages together.}
+% ^^A
+% ^^A \begin{macro}{\newcolumn}
+% ^^A In \texttt{newarray.sty} the macro for specifying new columns was
+% ^^A named \verb"\newcolumn". When the functionality was added to
+% ^^A \texttt{array.sty} the command was renamed \verb"\newcolumntype".
+% ^^A Initially both names were supported, but now (In versions of this
+% ^^A package distributed for \LaTeXe) the old name is not defined.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\newcolumntype}
+% ^^A As
+% ^^A described above, the \verb"\newcolumntype" macro gives users the chance
+% ^^A to define letters, to be used in the same way as the primitive
+% ^^A column specifiers, `c' `p' etc.
+% \begin{macrocode}
+ % \def\newcolumntype#1{%
+% \end{macrocode}
+% ^^A \verb"\NC@char" was added in V2.01 so that active characters, like "@" in
+% ^^A AMS\LaTeX\ may be used. This trick was stolen from \texttt{array.sty}
+% ^^A 2.0h. Note that we need to use the possibly active token,
+% ^^A \verb"#1", in several places, as that is the token that actually
+% ^^A appears in the preamble argument.
+% \begin{macrocode}
+ % \edef\NC@char{\string#1}%
+% \end{macrocode}
+% ^^A First we check whether there is already a definition for this column.
+% ^^A Unlike \verb"\newcommand" we give a warning rather than an error if it is
+% ^^A defined. If it is a new column, add \verb"\NC@do" \meta{column} to
+% ^^A the list \verb"\NC@list".
+% \begin{macrocode}
+ % \@ifundefined{NC@find@\NC@char}%
+ % {\@tfor\next:=<>clrmbp@!|\do{\if\noexpand\next\NC@char
+ % %\PackageWarning{array}%
+ % \@memwarn{Redefining primitive column \NC@char}\fi}% memoir change
+ % \NC@list\expandafter{\the\NC@list\NC@do#1}}%
+ % {%\PackageWarning{array}
+ % \@memwarn{Column \NC@char\space is already defined}}% memoir change
+% \end{macrocode}
+% ^^A Now we define a macro with an argument delimited by the new column
+% ^^A specifier, this is used to find occurrences of this specifier in the
+% ^^A user preamble.
+% \begin{macrocode}
+ % \@namedef{NC@find@\NC@char}##1#1{\NC@{##1}}%
+% \end{macrocode}
+% ^^A If an optional argument was not given, give a default argument of 0.
+% \begin{macrocode}
+ % \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\newcol@}
+% ^^A We can now define the macro which does the rewriting,
+% ^^A \verb"\@reargdef" takes the same arguments as \verb"\newcommand", but
+% ^^A does not check that the command is new. For a column, say `D' with
+% ^^A one argument, define a command \verb"\NC@rewrite@D" with one
+% ^^A argument, which recursively calls \verb"\NC@find" on the user preamble
+% ^^A after replacing the first token or group with the replacement text
+% ^^A specified in the \verb"\newcolumntype" command. \verb"\NC@find" will find the
+% ^^A next occurrence of `D' as it will be \verb"\let" equal to
+% ^^A \verb"\NC@find@D" by \verb"\NC@do".
+% \begin{macrocode}
+ % \def\newcol@#1[#2]#3{\expandafter\@reargdef
+ % \csname NC@rewrite@#1\endcsname[#2]{\NC@find#3}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@}
+% ^^A Having found an occurrence of the new column, save the preamble
+% ^^A before the column in \verb"\@temptokena", then check to see if we
+% ^^A are at the end of the preamble. (A dummy occurrence of the column
+% ^^A specifier will be placed at the end of the preamble by \verb"\NC@do".
+% \begin{macrocode}
+ % \def\NC@#1{%
+ % \@temptokena\expandafter{\the\@temptokena#1}\futurelet\next\NC@ifend}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@ifend}
+% ^^A We can tell that we are at the end as \verb"\NC@do" will place a \verb"\relax"
+% ^^A after the dummy column.
+% \begin{macrocode}
+ % \def\NC@ifend{%
+% \end{macrocode}
+% ^^A If we are at the end, do nothing. (The whole preamble will now be in
+% ^^A \verb"\@temptokena".)
+% \begin{macrocode}
+ % \ifx\next\relax
+% \end{macrocode}
+% ^^A Otherwise set the flag \verb"\if@tempswa", and rewrite the column.
+% ^^A \verb"\expandafter" introduced 1n V2.01
+% \begin{macrocode}
+ % \else\@tempswatrue\expandafter\NC@rewrite\fi}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@do}
+% ^^A If the user has specified `C' and `L' as new columns, the list of
+% ^^A rewrites (in the token register \verb"\NC@list") will look like
+% ^^A \verb"\NC@do *" \verb"\NC@do C" \verb"\NC@do L".
+% ^^A So we need to define \verb"\NC@do" as a one argument macro which
+% ^^A initialises the rewriting of the specified column. Let us assume that
+% ^^A `C' is the argument.
+% \begin{macrocode}
+ % \def\NC@do#1{%
+% \end{macrocode}
+% ^^A First we let \verb"\NC@rewrite" and \verb"\NC@find" be
+% ^^A \verb"\NC@rewrite@C" and \verb"\NC@find@C" respectively.
+% \begin{macrocode}
+ % \expandafter\let\expandafter\NC@rewrite
+ % \csname NC@rewrite@\string#1\endcsname
+ % \expandafter\let\expandafter\NC@find
+ % \csname NC@find@\string#1\endcsname
+% \end{macrocode}
+% ^^A Clear the token register \verb"\@temptokena" after putting the present
+% ^^A contents of the register in front of the token \verb"\NC@find". At the
+% ^^A end we place the tokens `\verb"C\relax"' which \verb"\NC@ifend" will use
+% ^^A to detect the end of the user preamble.
% \begin{macrocode}
-\def\@classviii{\ifnum \@lastchclass >\z@\ifnum\@lastchclass=\tw@\else
- \@preamerr 4\@chclass 6 \@classvi \fi\fi}
+ % \expandafter\@temptokena\expandafter{\expandafter}%
+ % \expandafter\NC@find\the\@temptokena#1\relax}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@classv}
-% Class 5 is \texttt{@}-expressions (and is also called by class 1)
-% This macro was incorrect in Version~1. Now we do not expand the
-% \verb"@"-expression, but instead explicitly replace an
-% \verb"\extracolsep" command by an assignment to \verb"\tabskip" by a
-% method similar to the \verb"\newcolumntype" system described above.
-% \verb"\d@llarbegin" \verb"\d@llarend" were introduced in V2.01 to match
-% \texttt{array.sty} 2.0h.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\showcols}
+% ^^A This macro is useful for debugging \verb"\newcolumntype" specifications,
+% ^^A it is the equivalent of the primitive \verb"\show" command for macro
+% ^^A definitions. All we need to do is locally redefine \verb"\NC@do" to take
+% ^^A its argument (say `C') and then \verb"\show" the (slightly modified)
+% ^^A definition of \verb"\NC@rewrite@C". Actually as the the list always
+% ^^A starts off with \verb"\NC@do *" and we do not want to print the
+% ^^A definition of the $*$-form, define \verb"\NC@do" to throw away the first
+% ^^A item in the list, and then redefine itself to print the rest of the
+% ^^A definitions.
+% \begin{macrocode}
+ % \def\showcols{{\def\NC@do##1{\let\NC@do\NC@show}\the\NC@list}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@show}
+% ^^A If the column `C' is defined as above, then
+% ^^A \verb"\show\NC@rewrite@C" would output\\
+% ^^A \verb"\long macro: ->\NC@find >{$}c<{$}".
+% ^^A We want to strip the \verb"long macro: ->" and the \verb"\NC@find". So first we
+% ^^A use \verb"\meaning" and then apply the macro \verb"\NC@strip" to the tokens so
+% ^^A produced and then \verb"\typeout" the required string.
+% \begin{macrocode}
+ % \def\NC@show#1{%
+ % \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip
+ % \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@strip}
+% ^^A Delimit the arguments to \verb"\NC@strip" with `\texttt{:}', `\texttt{->}',
+% ^^A a space, and \verb"\@@" to pull out the required parts of the output from
+% ^^A \verb"\meaning".
+% \begin{macrocode}
+ % \def\NC@strip#1:#2->#3 #4\@@{#2 -> #4}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\NC@list}
+% ^^A Allocate the token register used for the rewrite list.
+% \begin{macrocode}
+ % \newtoks\NC@list
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \subsubsection{The $*$--form}
+% ^^A We view the $*$-form as a slight generalisation of the system
+% ^^A described in the previous subsection. The idea is to define a $*$
+% ^^A column by a command of the form:
+% ^^A \begin{verbatim}
+% ^^A \newcolumntype{*}[2]{%
+% ^^A \count@=#1\ifnum\count@>0
+% ^^A \advance\count@ by -1 #2*{\count@}{#2}\fi}
+% ^^A \end{verbatim}
+% ^^A \begin{macro}{\NC@rewrite@*}\label{NC@rewrite@*}
+% ^^A This does not work however as \verb"\newcolumntype" takes great care not
+% ^^A to expand anything in the preamble, and so the \verb"\if" is never
+% ^^A expanded. \verb"\newcolumntype" sets up various other parts of the
+% ^^A rewrite correctly though so we can define:
+% \begin{macrocode}
+ % \newcolumntype{*}[2]{}
+% \end{macrocode}
+% ^^A Now we must correct the definition of \verb"\NC@rewrite@*". The
+% ^^A following is probably more efficient than a direct translation of
+% ^^A the idea sketched above, we do not need to put a $*$ in the preamble
+% ^^A and call the rewrite recursively, we can just put \verb"#1" copies of
+% ^^A \verb"#2" into \verb"\@temptokena". (Nested $*$ forms will be expanded
+% ^^A when the whole rewrite list is expanded again, see \verb"\@mkpream")
+% \begin{macrocode}
+ % \long\@namedef{NC@rewrite@*}#1#2{%
+% \end{macrocode}
+% ^^A Store the number.
+% \begin{macrocode}
+ % \count@#1\relax
+% \end{macrocode}
+% ^^A Put \verb"#1" copies of \verb"#2" in the token register.
+% \begin{macrocode}
+ % \loop
+ % \ifnum\count@>\z@
+ % \advance\count@\m@ne
+ % \@temptokena\expandafter{\the\@temptokena#2}%
+ % \repeat
+% \end{macrocode}
+% ^^A \verb"\NC@do" will ensure that \verb"\NC@find" is \verb"\let" equal
+% ^^A to \verb"\NC@find@*".
+% \begin{macrocode}
+ % \NC@find}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \subsubsection{Modifications to internal macros of \texttt{array.sty}}
+% ^^A
+% ^^A \begin{macro}{\@xexpast}
+% ^^A \begin{macro}{\@xexnoop}
+% ^^A These macros are used to expand $*$-forms in
+% ^^A \texttt{array.sty}. \verb"\let" them to \verb"\relax" to save space.
% \begin{macrocode}
-\def\@classv{\save@decl
- \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
- \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
- \prepnext@tok}
+ % \let\@xexpast\relax
+ % \let\@xexnoop\relax
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\NC@ecs}
-% Rewrite the first occurrence of \verb"\extracolsep{1in}" to
-% \verb"\tabskip1in\relax". As a side effect discard any tokens after a
-% second \verb"\extracolsep", there is no point in the user entering two of
-% these commands anyway, so this is not really a restriction.
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\save@decl}
+% ^^A We do not assume that the token register is free, we add the new
+% ^^A declarations to the front of the register. This is to allow user
+% ^^A preambles of the form, \verb">{foo}>{bar}..". Users are not encouraged to
+% ^^A enter such expressions directly, but they may result from the
+% ^^A rewriting of \verb"\newcolumntype"'s.
+% \begin{macrocode}
+ % \def\save@decl{\toks \count@ = \expandafter\expandafter\expandafter
+ % {\expandafter\@nextchar\the\toks\count@}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \begin{macro}{\@mkpream}
+% ^^A The main modification to \verb"\@mkpream" is to replace the call to
+% ^^A \verb"\@xexpast" (which expanded $*$-forms) by a loop which expands
+% ^^A all \verb"\newcolumntype" specifiers.
+% \begin{macrocode}
+ % \def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+ % \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
+% \end{macrocode}
+% ^^A Now we remove possible $*$-forms and user-defined column
+% ^^A specifiers in the user preamble by repeatedly executing the list
+% ^^A \verb"\NC@list" until the re-writes have no more effect. The
+% ^^A expanded preamble will then be in the token register
+% ^^A \verb"\@temptokena". Actually we need to know at this point that
+% ^^A this is not \verb"\toks0".
+% \begin{macrocode}
+ % \@temptokena{#1}\@tempswatrue
+ % \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
+% \end{macrocode}
+% ^^A Afterwards we initialize all registers and macros, that we need
+% ^^A for the build-up of the preamble.
+% \begin{macrocode}
+ % \count@\m@ne
+ % \let\the@toks\relax
+ % \prepnext@tok
+% \end{macrocode}
+% ^^A Having expanded all tokens defined using \verb"\newcolumntype" (including
+% ^^A \verb"*"), we evaluate the remaining tokens, which are saved in
+% ^^A \verb"\@temptokena". We use the \LaTeX--macro \verb"\@tfor" to inspect each
+% ^^A token in turn.
+% \begin{macrocode}
+ % \expandafter \@tfor \expandafter \@nextchar
+ % \expandafter :\expandafter =\the\@temptokena \do
+% \end{macrocode}
+% ^^A \verb"\@testpatch" does not take an argument since \texttt{array.sty} 2.0h.
+% \begin{macrocode}
+ % {\@testpach
+ % \ifcase \@chclass \@classz \or \@classi \or \@classii
+ % \or \save@decl \or \or \@classv \or \@classvi
+ % \or \@classvii \or \@classviii
+% \end{macrocode}
+% ^^A In \texttt{newarray.sty} class 9 is equivalent to class 10.
+% \begin{macrocode}
+ % \or \@classx
+ % \or \@classx \fi
+ % \@lastchclass\@chclass}%
+ % \ifcase\@lastchclass
+ % \@acol \or
+ % \or
+ % \@acol \or
+ % \@preamerr \thr@@ \or
+ % \@preamerr \tw@ \@addtopreamble\@sharp \or
+ % \or
+ % \else \@preamerr \@ne \fi
+ % \def\the@toks{\the\toks}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classix}
+% ^^A \texttt{array.sty} does not allow repeated \texttt{>}
+% ^^A declarations for the same column. This is allowed in
+% ^^A \texttt{newarray.sty} as documented in the introduction. Removing
+% ^^A the test for this case makes class 9 equivalent to class 10, and
+% ^^A so this macro is redundant. It is \verb"\let" to \verb"\relax" to save
+% ^^A space.
% \begin{macrocode}
-\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}%
- \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi}
+ % \let\@classix\relax
% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Support for the \texttt{delarray.sty}}
-%
-% The \texttt{delarray.sty} package extends the array syntax by
-% supporting the notation of delimiters. To this end we extend the
-% array parsing mechanism to include a hook which can be used by this
-% (or another) package to do some additional parsing.
-%
-% \begin{macro}{\@tabarray}
-% This macro tests for an optional bracket and then calls up
-% \verb"\@@array" or \verb"\@@array[c]" (as default).
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classviii}
+% ^^A In \texttt{newarray.sty} explicitly allow class 2, as repeated
+% ^^A \texttt{<} expressions are accepted by this package.
% \begin{macrocode}
-\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
+ % \def\@classviii{\ifnum \@lastchclass >\z@\ifnum\@lastchclass=\tw@\else
+ % \@preamerr 4\@chclass 6 \@classvi \fi\fi}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\@@array}
-% This macro tests could then test an optional delimiter before the
-% left brace of the main preamble argument. Here in the main package
-% it simply is let to be \verb"\@array".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\@classv}
+% ^^A Class 5 is \texttt{@}-expressions (and is also called by class 1)
+% ^^A This macro was incorrect in Version~1. Now we do not expand the
+% ^^A \verb"@"-expression, but instead explicitly replace an
+% ^^A \verb"\extracolsep" command by an assignment to \verb"\tabskip" by a
+% ^^A method similar to the \verb"\newcolumntype" system described above.
+% ^^A \verb"\d@llarbegin" \verb"\d@llarend" were introduced in V2.01 to match
+% ^^A \texttt{array.sty} 2.0h.
+% \begin{macrocode}
+ % \def\@classv{\save@decl
+ % \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+ % \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+ % \prepnext@tok}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\NC@ecs}
+% ^^A Rewrite the first occurrence of \verb"\extracolsep{1in}" to
+% ^^A \verb"\tabskip1in\relax". As a side effect discard any tokens after a
+% ^^A second \verb"\extracolsep", there is no point in the user entering two of
+% ^^A these commands anyway, so this is not really a restriction.
% \begin{macrocode}
-\let\@@array\@array
+ % \def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}%
+ % \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\endarray}
-% \begin{macro}{\@arrayright}
-% We have to declare the hook we put into \verb"\@array" above.
-% A similar hook `\verb"\@arrayright"' will be inserted into the
-% \verb"\endarray" to gain control. Both defaults to empty.
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{Support for the \texttt{delarray.sty}}
+% ^^A
+% ^^A The \texttt{delarray.sty} package extends the array syntax by
+% ^^A supporting the notation of delimiters. To this end we extend the
+% ^^A array parsing mechanism to include a hook which can be used by this
+% ^^A (or another) package to do some additional parsing.
+% ^^A
+% ^^A \begin{macro}{\@tabarray}
+% ^^A This macro tests for an optional bracket and then calls up
+% ^^A \verb"\@@array" or \verb"\@@array[c]" (as default).
% \begin{macrocode}
-\def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}}
-\let\@arrayleft\@empty
-\let\@arrayright\@empty
+ % \def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsubsection{Support for \texttt{\textbackslash firsthline} and
-% \texttt{\textbackslash lasthline}}
-%
-% The Companion~\cite[p.137]{GOOSSENS94} suggests two additional
-% commands to control the alignments in case of tabulars with
-% horizontal lines. They are now added to this package.
-%
-% \begin{macro}{\extratabsurround}
-% The extra space around a table when \verb"\firsthline" or \verb"\lasthline"
-% are used.
+% ^^A \end{macro}
+% ^^A \begin{macro}{\@@array}
+% ^^A This macro tests could then test an optional delimiter before the
+% ^^A left brace of the main preamble argument. Here in the main package
+% ^^A it simply is let to be \verb"\@array".
% \begin{macrocode}
-\newlength{\extratabsurround}
-\setlength{\extratabsurround}{2pt}
+ % \let\@@array\@array
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\backup@length}
-% This register will be used internally by \verb"\firsthline" and
-% \verb"\lasthline".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\endarray}
+% ^^A \begin{macro}{\@arrayright}
+% ^^A We have to declare the hook we put into \verb"\@array" above.
+% ^^A A similar hook `\verb"\@arrayright"' will be inserted into the
+% ^^A \verb"\endarray" to gain control. Both defaults to empty.
+% \begin{macrocode}
+ % \def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}}
+ % \let\@arrayleft\@empty
+ % \let\@arrayright\@empty
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \subsubsection{Support for \texttt{\textbackslash firsthline} and
+% ^^A \texttt{\textbackslash lasthline}}
+% ^^A
+% ^^A The Companion~\cite[p.137]{GOOSSENS94} suggests two additional
+% ^^A commands to control the alignments in case of tabulars with
+% ^^A horizontal lines. They are now added to this package.
+% ^^A
+% ^^A \begin{macro}{\extratabsurround}
+% ^^A The extra space around a table when \verb"\firsthline" or \verb"\lasthline"
+% ^^A are used.
% \begin{macrocode}
-\newlength{\backup@length}
+ % \newlength{\extratabsurround}
+ % \setlength{\extratabsurround}{2pt}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\firsthline}
-% This code can probably be improved but for the moment it should
-% serve.
-%
-% We start by producing a single tabular row without any visible
-% content that will produce the external reference point in case
-% \verb"[t]" is used.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\backup@length}
+% ^^A This register will be used internally by \verb"\firsthline" and
+% ^^A \verb"\lasthline".
% \begin{macrocode}
-\newcommand{\firsthline}{%}} emacs
- \multicolumn1c{%
+ % \newlength{\backup@length}
% \end{macrocode}
-% Within this row we calculate \verb"\backup@length" to be the height
-% plus depth of a standard line. In addition we have to add the
-% width of the \verb"\hline", something that was forgotten in the
-% original definition.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\firsthline}
+% ^^A This code can probably be improved but for the moment it should
+% ^^A serve.
+% ^^A
+% ^^A We start by producing a single tabular row without any visible
+% ^^A content that will produce the external reference point in case
+% ^^A \verb"[t]" is used.
% \begin{macrocode}
- \global\backup@length\ht\@arstrutbox
- \global\advance\backup@length\dp\@arstrutbox
- \global\advance\backup@length\arrayrulewidth
+ % \newcommand{\firsthline}{%}} emacs
+ % \multicolumn1c{%
% \end{macrocode}
-% Finally we do want to make the height of this first line be a bit
-% larger than usual, for this we place the standard array strut
-% into it but raised by \verb"\extratabsurround"
+% ^^A Within this row we calculate \verb"\backup@length" to be the height
+% ^^A plus depth of a standard line. In addition we have to add the
+% ^^A width of the \verb"\hline", something that was forgotten in the
+% ^^A original definition.
% \begin{macrocode}
- \raise\extratabsurround\copy\@arstrutbox
+ % \global\backup@length\ht\@arstrutbox
+ % \global\advance\backup@length\dp\@arstrutbox
+ % \global\advance\backup@length\arrayrulewidth
% \end{macrocode}
-% Having done all this we end the line and back up by the value of
-% \verb"\backup@length" and then finally place our \verb"\hline". This should
-% place the line exactly at the right place but keep the reference
-% point of the whole tabular at the baseline of the first row.
+% ^^A Finally we do want to make the height of this first line be a bit
+% ^^A larger than usual, for this we place the standard array strut
+% ^^A into it but raised by \verb"\extratabsurround"
% \begin{macrocode}
- }\\[-\backup@length]\hline
-}
+ % \raise\extratabsurround\copy\@arstrutbox
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\lasthline}
-% For \verb"\lasthline" the situation is even worse and I got it
-% completely wrong initially.
-%
-% The problem in this case is that if the optional argument \verb"[b]"
-% is used we do want the reference point of the tabular be at the
-% baseline of the last row but at the same time do want the the
-% depth of this last line increased by \verb"\extratabsurround" without
-% changing the placement \verb"\hline".
-%
-% We start by placing the rule followed by an invisible row.
+% ^^A Having done all this we end the line and back up by the value of
+% ^^A \verb"\backup@length" and then finally place our \verb"\hline". This should
+% ^^A place the line exactly at the right place but keep the reference
+% ^^A point of the whole tabular at the baseline of the first row.
% \begin{macrocode}
-\newcommand{\lasthline}{\hline\multicolumn1c{%}} emacs
+ % }\\[-\backup@length]\hline
+ % }
% \end{macrocode}
-% We now calculate \verb"\backup@length" to be the height and depth of
-% two lines plus the width of the rule.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\lasthline}
+% ^^A For \verb"\lasthline" the situation is even worse and I got it
+% ^^A completely wrong initially.
+% ^^A
+% ^^A The problem in this case is that if the optional argument \verb"[b]"
+% ^^A is used we do want the reference point of the tabular be at the
+% ^^A baseline of the last row but at the same time do want the the
+% ^^A depth of this last line increased by \verb"\extratabsurround" without
+% ^^A changing the placement \verb"\hline".
+% ^^A
+% ^^A We start by placing the rule followed by an invisible row.
% \begin{macrocode}
- \global\backup@length2\ht\@arstrutbox
- \global\advance\backup@length2\dp\@arstrutbox
- \global\advance\backup@length\arrayrulewidth
+ % \newcommand{\lasthline}{\hline\multicolumn1c{%}} emacs
% \end{macrocode}
-% This will bring us back to the baseline of the second last row:
+% ^^A We now calculate \verb"\backup@length" to be the height and depth of
+% ^^A two lines plus the width of the rule.
% \begin{macrocode}
- }\\[-\backup@length]%
+ % \global\backup@length2\ht\@arstrutbox
+ % \global\advance\backup@length2\dp\@arstrutbox
+ % \global\advance\backup@length\arrayrulewidth
% \end{macrocode}
-% Thus if we now add another invisible row the reference point of
-% that row will be at the baseline of the last row (and will be the
-% reference for the whole tabular). Since this row is invisible we
-% can enlarge its depth by the desired amount.
+% ^^A This will bring us back to the baseline of the second last row:
% \begin{macrocode}
- \multicolumn1c{%
- \lower\extratabsurround\copy\@arstrutbox
- }%
-}
+ % }\\[-\backup@length]%
% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Getting the spacing around rules right}
-%
-% Beside a larger functionality \texttt{array.sty} has one
-% important difference to the standard \texttt{tabular} and
-% \texttt{array} environments: horizontal and vertical rules make a
-% table larger or wider, e.g., \verb=\doublerulesep= really denotes
-% the space between two rules and isn't measured from the middle of
-% the rules.
-%
-% \begin{macro}{\@xhline}
-% For vertical rules this is implemented by the definitions above,
-% for horizontal rules we have to take out the backspace.
+% ^^A Thus if we now add another invisible row the reference point of
+% ^^A that row will be at the baseline of the last row (and will be the
+% ^^A reference for the whole tabular). Since this row is invisible we
+% ^^A can enlarge its depth by the desired amount.
% \begin{macrocode}
-\CheckCommand*\@xhline{\ifx\reserved@a\hline
- \vskip\doublerulesep
- \vskip-\arrayrulewidth
- \fi
- \ifnum0=`{\fi}}
-\renewcommand*\@xhline{\ifx\reserved@a\hline
- \vskip\doublerulesep
- \fi
- \ifnum0=`{\fi}}
+ % \multicolumn1c{%
+ % \lower\extratabsurround\copy\@arstrutbox
+ % }%
+ % }
% \end{macrocode}
-% \end{macro}
-%
-%
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \subsubsection{Getting the spacing around rules right}
+% ^^A
+% ^^A Beside a larger functionality \texttt{array.sty} has one
+% ^^A important difference to the standard \texttt{tabular} and
+% ^^A \texttt{array} environments: horizontal and vertical rules make a
+% ^^A table larger or wider, e.g., \verb=\doublerulesep= really denotes
+% ^^A the space between two rules and isn't measured from the middle of
+% ^^A the rules.
+% ^^A
+% ^^A \begin{macro}{\@xhline}
+% ^^A For vertical rules this is implemented by the definitions above,
+% ^^A for horizontal rules we have to take out the backspace.
+% \begin{macrocode}
+ % \CheckCommand*\@xhline{\ifx\reserved@a\hline
+ % \vskip\doublerulesep
+ % \vskip-\arrayrulewidth
+ % \fi
+ % \ifnum0=`{\fi}}
+ % \renewcommand*\@xhline{\ifx\reserved@a\hline
+ % \vskip\doublerulesep
+ % \fi
+ % \ifnum0=`{\fi}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
% \begin{macrocode}
-%%%%%%%%%% end array.sty 2016/10/06 v2.4d %%%%%%%%%
-
+ % %%%%%%%%%% end array.sty 2016/10/06 v2.4d %%%%%%%%%
+ %
% \end{macrocode}
+% ^^A
+% ^^A
%
-%
+% \subsubsection{Class additions to Array}
+%
% \begin{macro}{\m@mold@addamp}
% \begin{macro}{\m@m@addamp}
% \begin{macro}{\@addamp}
@@ -16925,958 +16953,1000 @@
% \subsection{D column specifiers} \label{sec:dcolumns}
%
-% The description and code are essentially copied from the
-% \Lpack{dcolumn} package~\cite{DCOLUMN}.
%
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{cdolumn} package. Now replaced by requiring the packge instead.
% \begin{macrocode}
-%%%%%%%%%% Dcolumn package code %%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
-
+\RequirePackage{dcolumn}[2014/10/28]
% \end{macrocode}
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
%
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{dcolumn} and replaced it with requiring the \Lpack{dcolumn} package
+% instead.}
%
-% The \Lpack{dcolumn} package~\cite{DCOLUMN} defines \texttt{D}
-% to be a column specifier
-% with three arguments.\\
-% \verb?D?\marg{sep.tex}\marg{sep.dvi}\marg{decimal places}
-% for columns which are to be aligned on a `decimal point'.
-%
-%
-% The basic ideas behind these macros have been explained earlier.
-% However they use three
-% tricks which may be useful in other contexts.
-% \begin{itemize}
-% \item The separator is surrounded in extra \verb?{ }?, so that it is set
-% with \cs{mathord} spacing, otherwise, for instance a `,' would have
-% extra space after it.
-% \item The separator is not given its special definition by making it
-% active, as this would not work for an entry such as \verb?& .5 &?, as the
-% first token of an alignment entry is read \emph{before} the preamble
-% part, incase it is an \cs{omit}, in which case the preamble is to be
-% omitted. Instead we switch the mathcode to (hex) 8000, which makes the
-% token act as if it were active.
-% \item Although \verb?\mathcode`.="8000? makes \texttt{.} act as if it
-% were active, it is still not allowed in constructions such as
-% \verb?\def.{}?, even in math-mode, so we have to construct an active
-% version of the separator, this is done by making it the uppercase of
-% \verb?~?, and then using the construct\\
-% \verb?\uppercase{\def~}?\marg{definition}.\\
-% Note that the \meta{definition} is not uppercased, so the definition
-% can refer to the standard, non-active use of the separator.
-% \end{itemize}
-%
-% \begin{macro}{\DC@}
-% Set up uppercase tables as required, and then grab the first part of
-% the numerical argument into \cs{count@}.
+% ^^A The description and code are essentially copied from the
+% ^^A \Lpack{dcolumn} package~\cite{DCOLUMN}.
+% ^^A
% \begin{macrocode}
-\def\DC@#1#2#3{%
- \uccode`\~=`#1\relax
- \m@th
- \afterassignment\DC@x\count@#3\relax{#1}{#2}}
+ % %%%%%%%%%% Dcolumn package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DC@x}
-% If \cs{count@} is negative, centre on the decimal point. If it is
-% positive either \verb?#1? will be empty in which case bad out decimal
-% part to the number of digits specified by \cs{count@} or
-% it is none empty in which case \cs{count@} contains the
-% number of digits to the left of the point, and \verb?#1? contains a junk
-% token (probably \verb?.?) followed by the number of digits to the right
-% of the point. In either of these latter cases, \cs{DC@right} is used.
+% ^^A
+% ^^A
+% ^^A The \Lpack{dcolumn} package~\cite{DCOLUMN} defines \texttt{D}
+% ^^A to be a column specifier
+% ^^A with three arguments.\\
+% ^^A \verb?D?\marg{sep.tex}\marg{sep.dvi}\marg{decimal places}
+% ^^A for columns which are to be aligned on a `decimal point'.
+% ^^A
+% ^^A
+% ^^A The basic ideas behind these macros have been explained earlier.
+% ^^A However they use three
+% ^^A tricks which may be useful in other contexts.
+% ^^A \begin{itemize}
+% ^^A \item The separator is surrounded in extra \verb?{ }?, so that it is set
+% ^^A with \cs{mathord} spacing, otherwise, for instance a `,' would have
+% ^^A extra space after it.
+% ^^A \item The separator is not given its special definition by making it
+% ^^A active, as this would not work for an entry such as \verb?& .5 &?, as the
+% ^^A first token of an alignment entry is read \emph{before} the preamble
+% ^^A part, incase it is an \cs{omit}, in which case the preamble is to be
+% ^^A omitted. Instead we switch the mathcode to (hex) 8000, which makes the
+% ^^A token act as if it were active.
+% ^^A \item Although \verb?\mathcode`.="8000? makes \texttt{.} act as if it
+% ^^A were active, it is still not allowed in constructions such as
+% ^^A \verb?\def.{}?, even in math-mode, so we have to construct an active
+% ^^A version of the separator, this is done by making it the uppercase of
+% ^^A \verb?~?, and then using the construct\\
+% ^^A \verb?\uppercase{\def~}?\marg{definition}.\\
+% ^^A Note that the \meta{definition} is not uppercased, so the definition
+% ^^A can refer to the standard, non-active use of the separator.
+% ^^A \end{itemize}
+% ^^A
+% ^^A \begin{macro}{\DC@}
+% ^^A Set up uppercase tables as required, and then grab the first part of
+% ^^A the numerical argument into \cs{count@}.
% \begin{macrocode}
-\def\DC@x#1\relax#2#3{%
- \ifnum\z@>\count@
- \expandafter\DC@centre
- \else
- \expandafter\DC@right
- \fi
- {#2}{#3}{#1}}
+ % \def\DC@#1#2#3{%
+ % \uccode`\~=`#1\relax
+ % \m@th
+ % \afterassignment\DC@x\count@#3\relax{#1}{#2}}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DC@centre}
-% If centering on the decimal point, just need to box up the two halves.
-% \begin{macrocode}
-\def\DC@centre#1#2#3{%
- \let\DC@end\DC@endcentre
- \uppercase{\def~}{$\egroup\setbox\tw@=\hbox\bgroup${#2}}%$
- \setbox\tw@=\hbox{${\phantom{{#2}}}$}%
- \setbox\z@=\hbox\bgroup$\mathcode`#1="8000 }%$
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@x}
+% ^^A If \cs{count@} is negative, centre on the decimal point. If it is
+% ^^A positive either \verb?#1? will be empty in which case bad out decimal
+% ^^A part to the number of digits specified by \cs{count@} or
+% ^^A it is none empty in which case \cs{count@} contains the
+% ^^A number of digits to the left of the point, and \verb?#1? contains a junk
+% ^^A token (probably \verb?.?) followed by the number of digits to the right
+% ^^A of the point. In either of these latter cases, \cs{DC@right} is used.
+% \begin{macrocode}
+ % \def\DC@x#1\relax#2#3{%
+ % \ifnum\z@>\count@
+ % \expandafter\DC@centre
+ % \else
+ % \expandafter\DC@right
+ % \fi
+ % {#2}{#3}{#1}}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DC@endcentre}
-% and then pad out the smaller of the two boxes so there is the same
-% amount of stuff either side of the point.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@centre}
+% ^^A If centering on the decimal point, just need to box up the two halves.
% \begin{macrocode}
-\def\DC@endcentre{$\egroup%$
- \ifdim \wd\z@>\wd\tw@
- \setbox\tw@=\hbox to\wd\z@{\unhbox\tw@\hfill}%
- \else
- \setbox\z@=\hbox to\wd\tw@{\hfill\unhbox\z@}\fi
- \box\z@\box\tw@}
+ % \def\DC@centre#1#2#3{%
+ % \let\DC@end\DC@endcentre
+ % \uppercase{\def~}{$\egroup\setbox\tw@=\hbox\bgroup${#2}}%$
+ % \setbox\tw@=\hbox{${\phantom{{#2}}}$}%
+ % \setbox\z@=\hbox\bgroup$\mathcode`#1="8000 }%$
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DC@right}
-% This deals with both the cases where a specified number of decimal
-% places is given.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@endcentre}
+% ^^A and then pad out the smaller of the two boxes so there is the same
+% ^^A amount of stuff either side of the point.
+% \begin{macrocode}
+ % \def\DC@endcentre{$\egroup%$
+ % \ifdim \wd\z@>\wd\tw@
+ % \setbox\tw@=\hbox to\wd\z@{\unhbox\tw@\hfill}%
+ % \else
+ % \setbox\z@=\hbox to\wd\tw@{\hfill\unhbox\z@}\fi
+ % \box\z@\box\tw@}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@right}
+% ^^A This deals with both the cases where a specified number of decimal
+% ^^A places is given.
% \begin{macrocode}
-\def\DC@right#1#2#3{%
- \ifx\relax#3\relax
+ % \def\DC@right#1#2#3{%
+ % \ifx\relax#3\relax
% \end{macrocode}
-% If \verb?#3? is empty, add \cs{hfill} to right align the column, and
-% Just set \cs{DC@rl} to begin a group, so nothing fancy is done with
-% the whole number part.
+% ^^A If \verb?#3? is empty, add \cs{hfill} to right align the column, and
+% ^^A Just set \cs{DC@rl} to begin a group, so nothing fancy is done with
+% ^^A the whole number part.
% \begin{macrocode}
- \hfill
- \let\DC@rl\bgroup
- \else
+ % \hfill
+ % \let\DC@rl\bgroup
+ % \else
% \end{macrocode}
-% Otherwise set \cs{DC@rl} so that the whole number part is put in a
-% box \cs{count@} times as wide as a digit.
-% In order to share code with the other branch, then move \verb?#3? (the
-% number of decimal places) into \cs{count@} throwing away the `.' from
-% the user syntax.
+% ^^A Otherwise set \cs{DC@rl} so that the whole number part is put in a
+% ^^A box \cs{count@} times as wide as a digit.
+% ^^A In order to share code with the other branch, then move \verb?#3? (the
+% ^^A number of decimal places) into \cs{count@} throwing away the `.' from
+% ^^A the user syntax.
% \begin{macrocode}
- \edef\DC@rl{to\the\count@\dimen@ii\bgroup\hss\hfill}%
- \count@\@gobble#3\relax
- \fi
+ % \edef\DC@rl{to\the\count@\dimen@ii\bgroup\hss\hfill}%
+ % \count@\@gobble#3\relax
+ % \fi
% \end{macrocode}
-%
+% ^^A
% \begin{macrocode}
- \let\DC@end\DC@endright
+ % \let\DC@end\DC@endright
% \end{macrocode}
-% Box 2 contains the decimal part, set to \cs{dimen@} which is
-% calculated below to be \cs{count@} times the width of a digit, plus
-% the width of the `decimal point'.
+% ^^A Box 2 contains the decimal part, set to \cs{dimen@} which is
+% ^^A calculated below to be \cs{count@} times the width of a digit, plus
+% ^^A the width of the `decimal point'.
% \begin{macrocode}
- \uppercase{\def~}{$\egroup\setbox\tw@\hbox to\dimen@\bgroup${#2}}%
- \setbox\z@\hbox{$1$}\dimen@ii\wd\z@
- \dimen@\count@\dimen@ii
- \setbox\z@\hbox{${#2}$}\advance\dimen@\wd\z@
- \setbox\tw@\hbox to\dimen@{}%
+ % \uppercase{\def~}{$\egroup\setbox\tw@\hbox to\dimen@\bgroup${#2}}%
+ % \setbox\z@\hbox{$1$}\dimen@ii\wd\z@
+ % \dimen@\count@\dimen@ii
+ % \setbox\z@\hbox{${#2}$}\advance\dimen@\wd\z@
+ % \setbox\tw@\hbox to\dimen@{}%
% \end{macrocode}
-% Box 0 contains the whole number part, either just at its natural
-% size for right aligned columns, or set to (the old value of)
-% \cs{count@} times the width of a digit. \cs{DC@rl} defined above
-% determines the two cases.
+% ^^A Box 0 contains the whole number part, either just at its natural
+% ^^A size for right aligned columns, or set to (the old value of)
+% ^^A \cs{count@} times the width of a digit. \cs{DC@rl} defined above
+% ^^A determines the two cases.
% \begin{macrocode}
- \setbox\z@\hbox\DC@rl$\mathcode`#1="8000 }%$
+ % \setbox\z@\hbox\DC@rl$\mathcode`#1="8000 }%$
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DC@endright}
-% Just finish off the second box, and then put out both boxes.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\DC@endright}
+% ^^A Just finish off the second box, and then put out both boxes.
% \begin{macrocode}
-\def\DC@endright{$\hfil\egroup\box\z@\box\tw@}%$
+ % \def\DC@endright{$\hfil\egroup\box\z@\box\tw@}%$
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{D}
-% The user interface, define the {\tt D} column to take three arguments.
-% For special purposes, you may need to directly access \cs{DC@} rather
-% than the \verb?D? column, eg to get a bold version you could use
-%\begin{verbatim}
-% \newcolumntype{E}[3]{>{\boldmath\DC@{#1}{#2}{#3}}c<{\DC@end}}
-%\end{verbatim}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{D}
+% ^^A The user interface, define the {\tt D} column to take three arguments.
+% ^^A For special purposes, you may need to directly access \cs{DC@} rather
+% ^^A than the \verb?D? column, eg to get a bold version you could use
+% ^^A\begin{verbatim}
+% ^^A \newcolumntype{E}[3]{>{\boldmath\DC@{#1}{#2}{#3}}c<{\DC@end}}
+% ^^A\end{verbatim}
+% \begin{macrocode}
+ % \newcolumntype{D}[3]{>{\DC@{#1}{#2}{#3}}c<{\DC@end}}
+ %
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
% \begin{macrocode}
-\newcolumntype{D}[3]{>{\DC@{#1}{#2}{#3}}c<{\DC@end}}
-
+ % %%%%%%%%%% end Dcolumn package code %%%%%%%%%%%%%%%%%%%%%
+ %
% \end{macrocode}
-% \end{macro}
+% ^^A
%
-% \begin{macrocode}
-%%%%%%%%%% end Dcolumn package code %%%%%%%%%%%%%%%%%%%%%
-
-% \end{macrocode}
%
% \subsection{Support for delimeters}
%
-% The description and code are essentially from the
-% \Lpack{delarray} package~\cite{DELARRAY}, v1.01 1994/03/14.
-%
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{dearray} package. Now replaced by requiring the packge instead.
% \begin{macrocode}
-%%%%%%%%%% Delarray package code %%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
-
+\RequirePackage{delarray}[2014/10/28]
% \end{macrocode}
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
%
-%
-% The array syntax is extended by
-% supporting the notation of delimiters. To this end we extend the
-% array parsing mechanism to include a hook which can be used by this
-% (or another) package to do some additional parsing.
-%
-%
-% \begin{macro}{\@@array}
-% This macro tests for an optional delimiter before the left brace
-% of the main preamble argument. If there is no delimiter,
-% \cs{@arrayleft} and \cs{@arrayright} are made a no-ops, and
-% \cs{@array} is called with the positional argument. Otherwise
-% call \cs{@del@array}.
-% \begin{macrocode}
-\def\@@array[#1]{\@ifnextchar\bgroup
- {\let\@arrayleft\relax\let\@arrayright\relax\@array[#1]}%
- {\@del@array[#1]}}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\@del@array}
-% We now know that we have an {\tt array} (or {\tt tabular}) with
-% delimiters.
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{delarray} and replaced it with requiring the \Lpack{delarray} package
+% instead.}
+% ^^A
+% ^^A The description and code are essentially from the
+% ^^A \Lpack{delarray} package~\cite{DELARRAY}, v1.01 1994/03/14.
+% ^^A
% \begin{macrocode}
-\def\@del@array[#1]#2#3#4{%
+ % %%%%%%%%%% Delarray package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
% \end{macrocode}
-% The following line is completely redundant but it does catch errors
-% involving delimiters before the processing of the alignment begins.
-% A common error is likely to be omiting the `.' in a
-% \cs{cases}-type construction. This causes the first token of the
-% alignment to be gobbled, possibly causing lots of spurious errors
-% before the cause of the error, the missing delimiter, is discovered as
-% \cs{@arrayright} puts the alignment and the delimiters together.
+% ^^A
+% ^^A
+% ^^A The array syntax is extended by
+% ^^A supporting the notation of delimiters. To this end we extend the
+% ^^A array parsing mechanism to include a hook which can be used by this
+% ^^A (or another) package to do some additional parsing.
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\@@array}
+% ^^A This macro tests for an optional delimiter before the left brace
+% ^^A of the main preamble argument. If there is no delimiter,
+% ^^A \cs{@arrayleft} and \cs{@arrayright} are made a no-ops, and
+% ^^A \cs{@array} is called with the positional argument. Otherwise
+% ^^A call \cs{@del@array}.
% \begin{macrocode}
- \setbox\z@\hbox{$\left#2\right#4$}%
+ % \def\@@array[#1]{\@ifnextchar\bgroup
+ % {\let\@arrayleft\relax\let\@arrayright\relax\@array[#1]}%
+ % {\@del@array[#1]}}
% \end{macrocode}
-% In the case of a `c' argument we do not need to rebox the alignment,
-% so we can define \cs{@arrayleft} and \cs{@arrayright} just to
-% insert the delimiters.
+% ^^A \end{macro}
+% ^^A \begin{macro}{\@del@array}
+% ^^A We now know that we have an {\tt array} (or {\tt tabular}) with
+% ^^A delimiters.
% \begin{macrocode}
- \if#1c\def\@arrayleft{\left#2}\def\@arrayright{\right#4}%
+ % \def\@del@array[#1]#2#3#4{%
% \end{macrocode}
-% Otherwise we (should) have a {\tt[t]} or {\tt[b]} argument, so first we
-% store the alignment, without delimiters in box0.
+% ^^A The following line is completely redundant but it does catch errors
+% ^^A involving delimiters before the processing of the alignment begins.
+% ^^A A common error is likely to be omiting the `.' in a
+% ^^A \cs{cases}-type construction. This causes the first token of the
+% ^^A alignment to be gobbled, possibly causing lots of spurious errors
+% ^^A before the cause of the error, the missing delimiter, is discovered as
+% ^^A \cs{@arrayright} puts the alignment and the delimiters together.
% \begin{macrocode}
- \else\def\@arrayleft{\setbox\z@}%
+ % \setbox\z@\hbox{$\left#2\right#4$}%
% \end{macrocode}
-% Then after the alignment is finished:
+% ^^A In the case of a `c' argument we do not need to rebox the alignment,
+% ^^A so we can define \cs{@arrayleft} and \cs{@arrayright} just to
+% ^^A insert the delimiters.
% \begin{macrocode}
- \def\@arrayright{%
+ % \if#1c\def\@arrayleft{\left#2}\def\@arrayright{\right#4}%
% \end{macrocode}
-% Calculate the amount the box needs to be lowered (this will be
-% negative in the case of \verb?[b]?). A little bit of arithmetic cf.\
-% \theTeXbook, Appendix G, rule 8. We calculate the amount this
-% way, rather than just taking the difference between the depth of box0
-% and the depth of the box defined below, as the depth of that box may
-% be affected by the delimiters if \cs{delimitershortfall} or
-% \cs{delimiterfactor} have non-standard values.
+% ^^A Otherwise we (should) have a {\tt[t]} or {\tt[b]} argument, so first we
+% ^^A store the alignment, without delimiters in box0.
% \begin{macrocode}
- \dimen@=\dp\z@
- \advance\dimen@-\ht\z@
- \divide \dimen@ by \tw@
- \advance\dimen@ by\fontdimen22 \textfont\tw@
+ % \else\def\@arrayleft{\setbox\z@}%
% \end{macrocode}
-% Now lower the alignment and the delimiters into place.
+% ^^A Then after the alignment is finished:
% \begin{macrocode}
- \lower\dimen@\hbox{$\left#2\vcenter{\unvbox\z@}\right#4$}}%
+ % \def\@arrayright{%
% \end{macrocode}
-% End the \verb?\if#1c?
+% ^^A Calculate the amount the box needs to be lowered (this will be
+% ^^A negative in the case of \verb?[b]?). A little bit of arithmetic cf.\
+% ^^A \theTeXbook, Appendix G, rule 8. We calculate the amount this
+% ^^A way, rather than just taking the difference between the depth of box0
+% ^^A and the depth of the box defined below, as the depth of that box may
+% ^^A be affected by the delimiters if \cs{delimitershortfall} or
+% ^^A \cs{delimiterfactor} have non-standard values.
% \begin{macrocode}
- \fi
+ % \dimen@=\dp\z@
+ % \advance\dimen@-\ht\z@
+ % \divide \dimen@ by \tw@
+ % \advance\dimen@ by\fontdimen22 \textfont\tw@
% \end{macrocode}
-% Now that we have defined \cs{@arrayleft} and \cs{@arrayright}, call
-% \cs{@array}.
+% ^^A Now lower the alignment and the delimiters into place.
% \begin{macrocode}
- \@array[#1]{#3}}
+ % \lower\dimen@\hbox{$\left#2\vcenter{\unvbox\z@}\right#4$}}%
% \end{macrocode}
-% \end{macro}
-%
-%
+% ^^A End the \verb?\if#1c?
% \begin{macrocode}
-%%%%%%%%%% end Delarray package code %%%%%%%%%%%%%%%%%%%%%
-
+ % \fi
% \end{macrocode}
-%
-% \subsection{The tabularx environment}
-%
-% The code and description are essentially from David Carlisle's
-% \Lpack{tabularx} package~\cite{TABULARX}, v2.07 1999/01/07.
-%
+% ^^A Now that we have defined \cs{@arrayleft} and \cs{@arrayright}, call
+% ^^A \cs{@array}.
% \begin{macrocode}
-%%%%%%%%%% Tabularx package code %%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
-
-%%% This is a carbon copy of the tabularx dtx sources for v2.11,
-%%% 2016/02/03 with two changes: error messages mention the class
-%%% instead of tabularx.
-
-%%%%%%%%%% Tabularx package code v2.11 2016/02/03 %%%%%%%%%%%%%%%%%%%%%
-
+ % \@array[#1]{#3}}
% \end{macrocode}
-%
-%
-%
-% The \Lpack{tabularx} package~\cite{TABULARX} implements a version of the \texttt{tabular}
-% environment in which the widths of certain columns are calculated so
-% that the table is is a specified width. The columns that may stretch are
-% marked by an \texttt{X} in the preamble argument.
-%
-% What follows is a carbon copy of the contents of \texttt{tabularx.dtx} with small changes: (1) We make errors/warnings
-% mention the class instead of \texttt{tabularx}, (2) we strip \texttt{tabularx} related \cs{changes} macros, (3) we
-% remove loading the \Lpack{array} package, as we already come with a copy.
-%
-% First some registers etc.\ that we need.
+% ^^A \end{macro}
+% ^^A
+% ^^A
% \begin{macrocode}
-\newdimen\TX@col@width
-\newdimen\TX@old@table
-\newdimen\TX@old@col
-\newdimen\TX@target
-\newdimen\TX@delta
-\newcount\TX@cols
-\newif\ifTX@
+ % %%%%%%%%%% end Delarray package code %%%%%%%%%%%%%%%%%%%%%
+ %
% \end{macrocode}
+% ^^A
%
-% Now a trick to get the body of an environment into a token register, without doing any expansion. This does not do any
-% real checking of nested environments, so if you should need to nest one {\ttfamily tabularx} inside another, the inner
-% one must be surrounded by \verb+{ }+.
%
-% \begin{macro}{\tabularx}
-% Prior to (\texttt{tabularx}) v1.06, this macro took two arguments, which were saved in
-% separate registers before the table body was saved by \verb+\TX@get@body+.
-% Unfortunately this disables the \verb|[t]| optional argument. Now just save
-% the width specification separately, then clear the token register
-% \verb|\toks@|.
-% Finally call \verb|\TX@get@body| to begin saving the body of the table.
-% The \verb|{\ifnum0=`}\fi| was added at (tabularx) v1.03, to allow \Lenv{tabularx} to appear
-% inside a \verb|\halign|.^^A
-% \setbox0=\hbox{\footnotesize"\iffalse{\fi\ifnum0=`}\fi"}^^A
-% \setbox2=\hbox{\footnotesize"\ifnum0=`{}\fi"}^^A
-% \footnote{This adds an extra level of grouping,
-% which is not really needed. Instead, I could use \box0\ here, and
-% \box2\ below, however the code here would then have to be moved after
-% the first line, because of the footnote to page 386 of the \TeX{}Book,
-% and I do not think I should be writing code that is so obscure as to
-% be documented in a footnote in an appendix called ``Dirty Tricks''!}
+% \subsection{The tabularx environment}
%
-% This mechanism of grabbing an environment body does have the
-% disadvantage (shared with the AMS alignment environments) that you
-% can not make extension environments by code such as
-%\begin{verbatim}
-%\newenvironment{foo}{\begin{tabularx}{XX}}{\end{tabularx}}
-%\end{verbatim}
-% as the code is looking for a literal string \verb"\end{tabularx}" to stop
-% scanning. Since version (tabularx) 2.02, one may avoid this problem by using
-% \verb|\tabularx| and \verb|\endtabularx| directly in the definition:
-%\begin{verbatim}
-%\newenvironment{foo}{\tabularx{XX}}{\endtabularx}
-%\end{verbatim}
-% The scanner now looks for the end of the current environment (\verb|foo| in
-% this example.) There are some restrictions on this usage, the
-% principal one being that \verb|\endtabularx| must not be inside any \verb"{ }" pairs
-% ao that the code before \verb"\endtabularx" may be extracted and added to the table body
-% (prior to version (tabularx) 2.09 \verb"\endtabularx" had to be
-% the \emph{first} token of the `end code' of the environment).
-% \begin{macrocode}
-\def\tabularx#1{%
-% \end{macrocode}
-% Allow \verb"\tabularx" \verb"\endtabularx" (but not \verb"\begin{tabularx}"
-% \verb"\end{tabularx}") to be used in \verb"\newenvironment" definitions.
-% \begin{macrocode}
-\edef\TX@{\@currenvir}%
- {\ifnum0=`}\fi
-% \end{macrocode}
-% \verb"\relax" added at v1.05 so that non-expandable length tokens, like
-% \verb"\textwidth" do not generate an extra space, and an overfull box.
-% \verb"\relax" removed again at v4.09 in favour of \verb"\setlength" so if you
-% use the calc package you can use a width of \verb"(\textwidth-12pt)/2".
+% Here ealier versions of the class had an embedded copy of the
+% \Lpack{tabularx} package. Now replaced by requiring the packge instead.
% \begin{macrocode}
- \setlength\TX@target{#1}%
- \TX@typeout{Target width: #1 = \the\TX@target.}%
- \toks@{}\TX@get@body}
+\RequirePackage{tabularx}[2016/02/03]
% \end{macrocode}
-% \end{macro}
+% The embeded copy is outcommented for now and will be removed in a
+% later version.
%
+% \changes{v3.7h}{2018/09/06}{Outcommented the embedded copy of
+% \Lpack{tabularx} and replaced it with requiring the \Lpack{tabularx} package
+% instead.}
-% \begin{macro}{\endtabularx}
-% This does not do very much\ldots
-% \begin{macrocode}
-\let\endtabularx\relax
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@get@body}
-% Place all tokens as far as the first \verb"\end" into a token register.
-% Then call \verb"\TX@find@end" to see if we are at \verb"\end{tabularx}".
-% \begin{macrocode}
-\long\def\TX@get@body#1\end
- {\toks@\expandafter{\the\toks@#1}\TX@find@end}
-% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\TX@find@end}
-% If we are at \verb"\end{tabularx}", call \verb"\TX@endtabularx", otherwise
-% add \verb"\end{...}" to the register, and call \verb"\TX@get@body" again.
+% ^^A The code and description are essentially from David Carlisle's
+% ^^A \Lpack{tabularx} package~\cite{TABULARX}, v2.07 1999/01/07.
+% ^^A
% \begin{macrocode}
-\def\TX@find@end#1{%
- \def\@tempa{#1}%
- \ifx\@tempa\TX@\expandafter\TX@endtabularx
- \else\toks@\expandafter
- {\the\toks@\end{#1}}\expandafter\TX@get@body\fi}
+ % %%%%%%%%%% Tabularx package code %%%%%%%%%%%%%%%%%%%%%
+ % %%%%%%%%%% With acknowledgements to David Carlisle %%%%%%%%%%%%%%%%%%%%%
+ %
+ % %%% This is a carbon copy of the tabularx dtx sources for v2.11,
+ % %%% 2016/02/03 with two changes: error messages mention the class
+ % %%% instead of tabularx.
+ %
+ % %%%%%%%%%% Tabularx package code v2.11 2016/02/03 %%%%%%%%%%%%%%%%%%%%%
+ %
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@find@endtabularxa}
-% split up the end code, and extract the part that lives in the table body.
+% ^^A
+% ^^A
+% ^^A
+% ^^A The \Lpack{tabularx} package~\cite{TABULARX} implements a version of the \texttt{tabular}
+% ^^A environment in which the widths of certain columns are calculated so
+% ^^A that the table is is a specified width. The columns that may stretch are
+% ^^A marked by an \texttt{X} in the preamble argument.
+% ^^A
+% ^^A What follows is a carbon copy of the contents of \texttt{tabularx.dtx} with small changes: (1) We make errors/warnings
+% ^^A mention the class instead of \texttt{tabularx}, (2) we strip \texttt{tabularx} related \cs{changes} macros, (3) we
+% ^^A remove loading the \Lpack{array} package, as we already come with a copy.
+% ^^A
+% ^^A First some registers etc.\ that we need.
% \begin{macrocode}
-\long\def\TX@find@endtabularxa
- #1\endtabularx#2\endtabularx#3\TX@find@endtabularxa{%
- \ifx\TX@#2\relax\else
- \toks@\expandafter{\the\toks@#1}%
- \fi}
+ % \newdimen\TX@col@width
+ % \newdimen\TX@old@table
+ % \newdimen\TX@old@col
+ % \newdimen\TX@target
+ % \newdimen\TX@delta
+ % \newcount\TX@cols
+ % \newif\ifTX@
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\TX@find@endtabularxb}
-% split up the end code, and extract the part that lives outside the table body.
+% ^^A
+% ^^A Now a trick to get the body of an environment into a token register, without doing any expansion. This does not do any
+% ^^A real checking of nested environments, so if you should need to nest one {\ttfamily tabularx} inside another, the inner
+% ^^A one must be surrounded by \verb+{ }+.
+% ^^A
+% ^^A \begin{macro}{\tabularx}
+% ^^A Prior to (\texttt{tabularx}) v1.06, this macro took two arguments, which were saved in
+% ^^A separate registers before the table body was saved by \verb+\TX@get@body+.
+% ^^A Unfortunately this disables the \verb|[t]| optional argument. Now just save
+% ^^A the width specification separately, then clear the token register
+% ^^A \verb|\toks@|.
+% ^^A Finally call \verb|\TX@get@body| to begin saving the body of the table.
+% ^^A The \verb|{\ifnum0=`}\fi| was added at (tabularx) v1.03, to allow \Lenv{tabularx} to appear
+% ^^A inside a \verb|\halign|.^^A
+% ^^A \setbox0=\hbox{\footnotesize"\iffalse{\fi\ifnum0=`}\fi"}^^A
+% ^^A \setbox2=\hbox{\footnotesize"\ifnum0=`{}\fi"}^^A
+% ^^A \footnote{This adds an extra level of grouping,
+% ^^A which is not really needed. Instead, I could use \box0\ here, and
+% ^^A \box2\ below, however the code here would then have to be moved after
+% ^^A the first line, because of the footnote to page 386 of the \TeX{}Book,
+% ^^A and I do not think I should be writing code that is so obscure as to
+% ^^A be documented in a footnote in an appendix called ``Dirty Tricks''!}
+% ^^A
+% ^^A This mechanism of grabbing an environment body does have the
+% ^^A disadvantage (shared with the AMS alignment environments) that you
+% ^^A can not make extension environments by code such as
+% ^^A\begin{verbatim}
+% ^^A\newenvironment{foo}{\begin{tabularx}{XX}}{\end{tabularx}}
+% ^^A\end{verbatim}
+% ^^A as the code is looking for a literal string \verb"\end{tabularx}" to stop
+% ^^A scanning. Since version (tabularx) 2.02, one may avoid this problem by using
+% ^^A \verb|\tabularx| and \verb|\endtabularx| directly in the definition:
+% ^^A\begin{verbatim}
+% ^^A\newenvironment{foo}{\tabularx{XX}}{\endtabularx}
+% ^^A\end{verbatim}
+% ^^A The scanner now looks for the end of the current environment (\verb|foo| in
+% ^^A this example.) There are some restrictions on this usage, the
+% ^^A principal one being that \verb|\endtabularx| must not be inside any \verb"{ }" pairs
+% ^^A ao that the code before \verb"\endtabularx" may be extracted and added to the table body
+% ^^A (prior to version (tabularx) 2.09 \verb"\endtabularx" had to be
+% ^^A the \emph{first} token of the `end code' of the environment).
+% \begin{macrocode}
+ % \def\tabularx#1{%
+% \end{macrocode}
+% ^^A Allow \verb"\tabularx" \verb"\endtabularx" (but not \verb"\begin{tabularx}"
+% ^^A \verb"\end{tabularx}") to be used in \verb"\newenvironment" definitions.
+% \begin{macrocode}
+ % \edef\TX@{\@currenvir}%
+ % {\ifnum0=`}\fi
+% \end{macrocode}
+% ^^A \verb"\relax" added at v1.05 so that non-expandable length tokens, like
+% ^^A \verb"\textwidth" do not generate an extra space, and an overfull box.
+% ^^A \verb"\relax" removed again at v4.09 in favour of \verb"\setlength" so if you
+% ^^A use the calc package you can use a width of \verb"(\textwidth-12pt)/2".
+% \begin{macrocode}
+ % \setlength\TX@target{#1}%
+ % \TX@typeout{Target width: #1 = \the\TX@target.}%
+ % \toks@{}\TX@get@body}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\endtabularx}
+% ^^A This does not do very much\ldots
% \begin{macrocode}
-\long\def\TX@find@endtabularxb
- #1\endtabularx#2\endtabularx#3\TX@find@endtabularxb{%
- \ifx\TX@#2%
- \expandafter\@firstoftwo
- \else
- \expandafter\@secondoftwo
- \fi
- {#1}{#2}}
+ % \let\endtabularx\relax
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@find@endtabularxbb}
-% Helper to avoid needing 15 consecutive \verb"\expandafter"
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@get@body}
+% ^^A Place all tokens as far as the first \verb"\end" into a token register.
+% ^^A Then call \verb"\TX@find@end" to see if we are at \verb"\end{tabularx}".
% \begin{macrocode}
-\def\TX@find@endtabularxbb{%
- \expandafter\expandafter\expandafter
- \TX@find@endtabularxb
-}
+ % \long\def\TX@get@body#1\end
+ % {\toks@\expandafter{\the\toks@#1}\TX@find@end}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@}
-% The string {\ttfamily tabularx} as a macro for testing with \verb"\ifx".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@find@end}
+% ^^A If we are at \verb"\end{tabularx}", call \verb"\TX@endtabularx", otherwise
+% ^^A add \verb"\end{...}" to the register, and call \verb"\TX@get@body" again.
% \begin{macrocode}
-\def\TX@{tabularx}
+ % \def\TX@find@end#1{%
+ % \def\@tempa{#1}%
+ % \ifx\@tempa\TX@\expandafter\TX@endtabularx
+ % \else\toks@\expandafter
+ % {\the\toks@\end{#1}}\expandafter\TX@get@body\fi}
% \end{macrocode}
-% \end{macro}
-%
-% Now that all the parts of the table specification are stored in
-% registers, we can begin the work of setting the table.
-%
-% The algorithm for finding the correct column widths is as follows.
-% Firstly set the table with each {\ttfamily X} column the width of the
-% final table. Assuming that there is at least one {\ttfamily X} column,
-% this will produce a table that is too wide. Divide the excess width by
-% the number of {\ttfamily X} columns, and reduce the column width by
-% this amount. Reset the table. If the table is not now the correct
-% width, a \verb"\multicolumn" entry must be `hiding' one of the {\ttfamily
-% X} columns, and so there is one less {\ttfamily X} column affecting
-% the width of the table. So we reduce by 1 the number of X columns and
-% repeat the process.
-%
-% \begin{macro}{\TX@endtabularx}
-% Although I have tried to make {\ttfamily tabularx} look like an
-% environment, it is in fact a command, all the work is done by this
-% macro.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@find@endtabularxa}
+% ^^A split up the end code, and extract the part that lives in the table body.
% \begin{macrocode}
-\def\TX@endtabularx{%
- \expandafter\expandafter\expandafter
- \TX@find@endtabularxa\csname end\TX@\endcsname
- \endtabularx\TX@\endtabularx\TX@find@endtabularxa
+ % \long\def\TX@find@endtabularxa
+ % #1\endtabularx#2\endtabularx#3\TX@find@endtabularxa{%
+ % \ifx\TX@#2\relax\else
+ % \toks@\expandafter{\the\toks@#1}%
+ % \fi}
% \end{macrocode}
-% Define the {\ttfamily X} column, with an internal version of the
-% \verb"\newcolumntype" command. The \verb"\expandafter" commands enable
-% \verb"\NC@newcol" to get the {\em expansion} of\\
-% \verb"\tabularxcolumn{\TX@col@width}" as its
-% argument. This will be the definition of an {\ttfamily X} column, as
-% discussed in section 4.
+% ^^A \end{macro}
+% ^^A \begin{macro}{\TX@find@endtabularxb}
+% ^^A split up the end code, and extract the part that lives outside the table body.
% \begin{macrocode}
- \expandafter\TX@newcol\expandafter{\tabularxcolumn{\TX@col@width}}%
+ % \long\def\TX@find@endtabularxb
+ % #1\endtabularx#2\endtabularx#3\TX@find@endtabularxb{%
+ % \ifx\TX@#2%
+ % \expandafter\@firstoftwo
+ % \else
+ % \expandafter\@secondoftwo
+ % \fi
+ % {#1}{#2}}
% \end{macrocode}
-% Initialise the column width, and the number of {\ttfamily X} columns.
-% The number of {\ttfamily X} columns is set to one, which means that
-% the initial count will be one too high, but this value is decremented
-% before it is used in the main loop.
-%
-% Since v1.02, switch the definition of \verb"\verb".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@find@endtabularxbb}
+% ^^A Helper to avoid needing 15 consecutive \verb"\expandafter"
% \begin{macrocode}
- \let\verb\TX@verb
+ % \def\TX@find@endtabularxbb{%
+ % \expandafter\expandafter\expandafter
+ % \TX@find@endtabularxb
+ % }
% \end{macrocode}
-% Since v1.05, save the values of all \LaTeX\ counters, the list
-% \verb"\cl@@ckpt" contains the names of all the \LaTeX\ counters that have
-% been defined so far. We expand \verb"\setcounter" at this point, as it
-% results in fewer tokens being stored in \verb"\TX@ckpt", but the actual
-% resetting of the counters occurs when \verb"\TX@ckpt" is expanded after
-% each trial run.
-% Actually since v1.07, use something equivalent to the expansion of the
-% original definition of \verb"\setcounter", so that \verb"tabularx" works in
-% conjunction with \verb"calc.sty".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@}
+% ^^A The string {\ttfamily tabularx} as a macro for testing with \verb"\ifx".
% \begin{macrocode}
- \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
- \edef\TX@ckpt{\cl@@ckpt}%
- \let\@elt\relax
- \TX@old@table\maxdimen
- \TX@col@width\TX@target
- \global\TX@cols\@ne
+ % \def\TX@{tabularx}
% \end{macrocode}
-% Typeout some headings (unless this is disabled).
-% \begin{macrocode}
- \TX@typeout@
- {\@spaces Table Width\@spaces Column Width\@spaces X Columns}%
+% ^^A \end{macro}
+% ^^A
+% ^^A Now that all the parts of the table specification are stored in
+% ^^A registers, we can begin the work of setting the table.
+% ^^A
+% ^^A The algorithm for finding the correct column widths is as follows.
+% ^^A Firstly set the table with each {\ttfamily X} column the width of the
+% ^^A final table. Assuming that there is at least one {\ttfamily X} column,
+% ^^A this will produce a table that is too wide. Divide the excess width by
+% ^^A the number of {\ttfamily X} columns, and reduce the column width by
+% ^^A this amount. Reset the table. If the table is not now the correct
+% ^^A width, a \verb"\multicolumn" entry must be `hiding' one of the {\ttfamily
+% ^^A X} columns, and so there is one less {\ttfamily X} column affecting
+% ^^A the width of the table. So we reduce by 1 the number of X columns and
+% ^^A repeat the process.
+% ^^A
+% ^^A \begin{macro}{\TX@endtabularx}
+% ^^A Although I have tried to make {\ttfamily tabularx} look like an
+% ^^A environment, it is in fact a command, all the work is done by this
+% ^^A macro.
+% \begin{macrocode}
+ % \def\TX@endtabularx{%
+ % \expandafter\expandafter\expandafter
+ % \TX@find@endtabularxa\csname end\TX@\endcsname
+ % \endtabularx\TX@\endtabularx\TX@find@endtabularxa
+% \end{macrocode}
+% ^^A Define the {\ttfamily X} column, with an internal version of the
+% ^^A \verb"\newcolumntype" command. The \verb"\expandafter" commands enable
+% ^^A \verb"\NC@newcol" to get the {\em expansion} of\\
+% ^^A \verb"\tabularxcolumn{\TX@col@width}" as its
+% ^^A argument. This will be the definition of an {\ttfamily X} column, as
+% ^^A discussed in section 4.
+% \begin{macrocode}
+ % \expandafter\TX@newcol\expandafter{\tabularxcolumn{\TX@col@width}}%
+% \end{macrocode}
+% ^^A Initialise the column width, and the number of {\ttfamily X} columns.
+% ^^A The number of {\ttfamily X} columns is set to one, which means that
+% ^^A the initial count will be one too high, but this value is decremented
+% ^^A before it is used in the main loop.
+% ^^A
+% ^^A Since v1.02, switch the definition of \verb"\verb".
+% \begin{macrocode}
+ % \let\verb\TX@verb
+% \end{macrocode}
+% ^^A Since v1.05, save the values of all \LaTeX\ counters, the list
+% ^^A \verb"\cl@@ckpt" contains the names of all the \LaTeX\ counters that have
+% ^^A been defined so far. We expand \verb"\setcounter" at this point, as it
+% ^^A results in fewer tokens being stored in \verb"\TX@ckpt", but the actual
+% ^^A resetting of the counters occurs when \verb"\TX@ckpt" is expanded after
+% ^^A each trial run.
+% ^^A Actually since v1.07, use something equivalent to the expansion of the
+% ^^A original definition of \verb"\setcounter", so that \verb"tabularx" works in
+% ^^A conjunction with \verb"calc.sty".
+% \begin{macrocode}
+ % \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
+ % \edef\TX@ckpt{\cl@@ckpt}%
+ % \let\@elt\relax
+ % \TX@old@table\maxdimen
+ % \TX@col@width\TX@target
+ % \global\TX@cols\@ne
+% \end{macrocode}
+% ^^A Typeout some headings (unless this is disabled).
+% \begin{macrocode}
+ % \TX@typeout@
+ % {\@spaces Table Width\@spaces Column Width\@spaces X Columns}%
% \end{macrocode}%
-% First attempt. Modify the {\ttfamily X} definition to count {\ttfamily
-% X} columns.
+% ^^A First attempt. Modify the {\ttfamily X} definition to count {\ttfamily
+% ^^A X} columns.
% \begin{macrocode}
- \TX@trial{\def\NC@rewrite@X{%
- \global\advance\TX@cols\@ne\NC@find p{\TX@col@width}}}%
+ % \TX@trial{\def\NC@rewrite@X{%
+ % \global\advance\TX@cols\@ne\NC@find p{\TX@col@width}}}%
% \end{macrocode}
-% Repeatedly decrease column width until table is the correct width,
-% or stops shrinking, or the columns become two narrow.
-% If there are no multicolumn entries, this will only take one attempt.
+% ^^A Repeatedly decrease column width until table is the correct width,
+% ^^A or stops shrinking, or the columns become two narrow.
+% ^^A If there are no multicolumn entries, this will only take one attempt.
% \begin{macrocode}
- \loop
- \TX@arith
- \ifTX@
- \TX@trial{}%
- \repeat
-% \end{macrocode}
-% One last time, with warnings back on (see appendix D)
-% use {\ttfamily tabular*} to put it in a box of the right size, in case
-% the algorithm failed to find the correct size.
-%
-% Since v1.04, locally make \verb"\footnotetext" save its argument in a token
-% register.
-% Since v1.06, \verb"\toks@" contains the preamble specification,
-% and possible optional argument, as well as the table body.
-% \begin{macrocode}
- {\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext
- \csname tabular*\expandafter\endcsname\expandafter\TX@target
- \the\toks@
- \csname endtabular*\endcsname}%
-% \end{macrocode}
-% Now the alignment is finished, and the \verb"}" has restored the original
-% meaning of \verb"\@footnotetext" expand the register \verb"\TX@ftn" which will
-% execute a series of\\
-% \verb"\footnotetext["\meta{num}\verb"]{"\meta{note}\verb"}"\\
-% commands. We need to be careful about clearing the register as we may
-% be inside a nested {\ttfamily tabularx}.
-% \begin{macrocode}
- \global\TX@ftn\expandafter{\expandafter}\the\TX@ftn
-% \end{macrocode}
-% Now finish off the {\ttfamily tabularx} environment. Note that we need
-% \verb"\end{tabularx}" here as the \verb"\end{tabularx}" in the user's
-% file is never expanded. Now use \verb"\TX@" rather than \verb"tabularx".
-%
-% We also need to finish off the group started by \verb"{\ifnum0=`}\fi" in
-% the macro \verb"\tabularx".
-% \begin{macrocode}
- \ifnum0=`{\fi}%
- \expandafter\expandafter\expandafter
- \TX@find@endtabularxbb
- \expandafter\end\expandafter{\TX@}%
- \endtabularx\TX@\endtabularx\TX@find@endtabularxb
-}
+ % \loop
+ % \TX@arith
+ % \ifTX@
+ % \TX@trial{}%
+ % \repeat
% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\TX@arith}
-% Calculate the column width for the next try, setting the flag
-% \verb"\ifTX@" to false if the loop should be aborted.
-% \begin{macrocode}
-\def\TX@arith{%
- \TX@false
- \@tempdimb\maxdimen
- \divide\@tempdimb\TX@cols
- \ifdim\TX@col@width>\@tempdimb
- \TX@typeout@{Don't exceed \maxdimen}%
- \wd\@tempboxa\maxdimen
- \fi
- \ifdim\TX@old@table=\wd\@tempboxa
-% \end{macrocode}
-% If we have reduced the column width, but the table width has not
-% changed, we stop the loop, and output the table (which will cause an
-% over-full alignment) with the previous value of \verb"\TX@col@width".
+% ^^A One last time, with warnings back on (see appendix D)
+% ^^A use {\ttfamily tabular*} to put it in a box of the right size, in case
+% ^^A the algorithm failed to find the correct size.
+% ^^A
+% ^^A Since v1.04, locally make \verb"\footnotetext" save its argument in a token
+% ^^A register.
+% ^^A Since v1.06, \verb"\toks@" contains the preamble specification,
+% ^^A and possible optional argument, as well as the table body.
+% \begin{macrocode}
+ % {\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext
+ % \csname tabular*\expandafter\endcsname\expandafter\TX@target
+ % \the\toks@
+ % \csname endtabular*\endcsname}%
+% \end{macrocode}
+% ^^A Now the alignment is finished, and the \verb"}" has restored the original
+% ^^A meaning of \verb"\@footnotetext" expand the register \verb"\TX@ftn" which will
+% ^^A execute a series of\\
+% ^^A \verb"\footnotetext["\meta{num}\verb"]{"\meta{note}\verb"}"\\
+% ^^A commands. We need to be careful about clearing the register as we may
+% ^^A be inside a nested {\ttfamily tabularx}.
+% \begin{macrocode}
+ % \global\TX@ftn\expandafter{\expandafter}\the\TX@ftn
+% \end{macrocode}
+% ^^A Now finish off the {\ttfamily tabularx} environment. Note that we need
+% ^^A \verb"\end{tabularx}" here as the \verb"\end{tabularx}" in the user's
+% ^^A file is never expanded. Now use \verb"\TX@" rather than \verb"tabularx".
+% ^^A
+% ^^A We also need to finish off the group started by \verb"{\ifnum0=`}\fi" in
+% ^^A the macro \verb"\tabularx".
% \begin{macrocode}
- \TX@col@width\TX@old@col
- \TX@typeout@{Reached minimum width, backing up.}%
- \else
+ % \ifnum0=`{\fi}%
+ % \expandafter\expandafter\expandafter
+ % \TX@find@endtabularxbb
+ % \expandafter\end\expandafter{\TX@}%
+ % \endtabularx\TX@\endtabularx\TX@find@endtabularxb
+ % }
% \end{macrocode}
-% Otherwise calculate the amount by which the current table is too wide.
-% \begin{macrocode}
- \dimen@\wd\@tempboxa
- \advance\dimen@ -\TX@target
- \ifdim\dimen@<\TX@delta
+% ^^A \end{macro}
+% ^^A
+% ^^A
+% ^^A \begin{macro}{\TX@arith}
+% ^^A Calculate the column width for the next try, setting the flag
+% ^^A \verb"\ifTX@" to false if the loop should be aborted.
+% \begin{macrocode}
+ % \def\TX@arith{%
+ % \TX@false
+ % \@tempdimb\maxdimen
+ % \divide\@tempdimb\TX@cols
+ % \ifdim\TX@col@width>\@tempdimb
+ % \TX@typeout@{Don't exceed \maxdimen}%
+ % \wd\@tempboxa\maxdimen
+ % \fi
+ % \ifdim\TX@old@table=\wd\@tempboxa
% \end{macrocode}
-% If this amount is less than \verb"\TX@delta", stop. (\verb"\TX@delta"
-% should be non-zero otherwise we may miss the target due to rounding
-% error.)
+% ^^A If we have reduced the column width, but the table width has not
+% ^^A changed, we stop the loop, and output the table (which will cause an
+% ^^A over-full alignment) with the previous value of \verb"\TX@col@width".
% \begin{macrocode}
- \TX@typeout@{Reached target.}%
- \else
+ % \TX@col@width\TX@old@col
+ % \TX@typeout@{Reached minimum width, backing up.}%
+ % \else
% \end{macrocode}
-% Reduce the number of effective {\ttfamily X} columns by one. (Checking
-% that we do not get 0, as this would produce an error later.) Then
-% divide excess width by the number of effective columns, and calculate
-% the new column width. Temporarily store this value (times $-1$) in
-% \verb"\dimen@".
+% ^^A Otherwise calculate the amount by which the current table is too wide.
% \begin{macrocode}
- \ifnum\TX@cols>\@ne
- \advance\TX@cols\m@ne
- \fi
- \divide\dimen@\TX@cols
- \advance\dimen@ -\TX@col@width
- \ifdim \dimen@ >\z@
-% \end{macrocode}
-% If the new width would be too narrow, abort the loop. At the moment
-% too narrow, means less than 0\,pt!
-%
-% Prior to v2.03, if the loop was aborted here, the X columns were left
-% with the width of the previous run, but this may make the table far
-% too wide as initial guesses are always too big. Now force to
-% \verb"\TX@error@width" which defaults to be 1em. If you want to
-% get the old behaviour stick\\
-% \verb"\renewcommand\TX@error@width{\TX@col@width}"\\
-% in a package file loaded after \textsf{tabularx}.
-% \begin{macrocode}
- %\PackageWarning{tabularx}%
- \@memwarn{X Columns too narrow (table too wide)\MessageBreak}% <-- change here
- \TX@col@width\TX@error@width\relax
- \else
+ % \dimen@\wd\@tempboxa
+ % \advance\dimen@ -\TX@target
+ % \ifdim\dimen@<\TX@delta
% \end{macrocode}
-% Otherwise save the old settings, and set the new column width. Set the
-% flag to true so that the table will be set, and the loop will be
-% executed again.
+% ^^A If this amount is less than \verb"\TX@delta", stop. (\verb"\TX@delta"
+% ^^A should be non-zero otherwise we may miss the target due to rounding
+% ^^A error.)
% \begin{macrocode}
- \TX@old@col\TX@col@width
- \TX@old@table\wd\@tempboxa
- \TX@col@width-\dimen@
- \TX@true
- \fi
- \fi
- \fi}
+ % \TX@typeout@{Reached target.}%
+ % \else
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@error@width}
-% If the calculated width is negative, use this instead.
+% ^^A Reduce the number of effective {\ttfamily X} columns by one. (Checking
+% ^^A that we do not get 0, as this would produce an error later.) Then
+% ^^A divide excess width by the number of effective columns, and calculate
+% ^^A the new column width. Temporarily store this value (times $-1$) in
+% ^^A \verb"\dimen@".
% \begin{macrocode}
-\def\TX@error@width{1em}
+ % \ifnum\TX@cols>\@ne
+ % \advance\TX@cols\m@ne
+ % \fi
+ % \divide\dimen@\TX@cols
+ % \advance\dimen@ -\TX@col@width
+ % \ifdim \dimen@ >\z@
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@delta}
-% Accept a table that is within \verb"\hfuzz" of the correct width.
-% \begin{macrocode}
-\TX@delta\hfuzz
+% ^^A If the new width would be too narrow, abort the loop. At the moment
+% ^^A too narrow, means less than 0\,pt!
+% ^^A
+% ^^A Prior to v2.03, if the loop was aborted here, the X columns were left
+% ^^A with the width of the previous run, but this may make the table far
+% ^^A too wide as initial guesses are always too big. Now force to
+% ^^A \verb"\TX@error@width" which defaults to be 1em. If you want to
+% ^^A get the old behaviour stick\\
+% ^^A \verb"\renewcommand\TX@error@width{\TX@col@width}"\\
+% ^^A in a package file loaded after \textsf{tabularx}.
+% \begin{macrocode}
+ % %\PackageWarning{tabularx}%
+ % \@memwarn{X Columns too narrow (table too wide)\MessageBreak}% <-- change here
+ % \TX@col@width\TX@error@width\relax
+ % \else
+% \end{macrocode}
+% ^^A Otherwise save the old settings, and set the new column width. Set the
+% ^^A flag to true so that the table will be set, and the loop will be
+% ^^A executed again.
+% \begin{macrocode}
+ % \TX@old@col\TX@col@width
+ % \TX@old@table\wd\@tempboxa
+ % \TX@col@width-\dimen@
+ % \TX@true
+ % \fi
+ % \fi
+ % \fi}
% \end{macrocode}
-% \end{macro}
-%
-% Initialise the {\ttfamily X} column. The definition can be empty here,
-% as it is set for each {\ttfamily tabularx} environment.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@error@width}
+% ^^A If the calculated width is negative, use this instead.
% \begin{macrocode}
-\newcolumntype{X}{}
+ % \def\TX@error@width{1em}
% \end{macrocode}
-%
-% \begin{macro}{\tabularxcolumn}
-% The default definition of {\ttfamily X} is \verb"p{#1}".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@delta}
+% ^^A Accept a table that is within \verb"\hfuzz" of the correct width.
% \begin{macrocode}
-\def\tabularxcolumn#1{p{#1}}
+ % \TX@delta\hfuzz
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@newcol}
-% A little macro just used to cut down the number of \verb"\expandafter"
-% commands needed.
+% ^^A \end{macro}
+% ^^A
+% ^^A Initialise the {\ttfamily X} column. The definition can be empty here,
+% ^^A as it is set for each {\ttfamily tabularx} environment.
% \begin{macrocode}
-\def\TX@newcol{\newcol@{X}[0]}
+ % \newcolumntype{X}{}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@trial}
-% Make a test run.
+% ^^A
+% ^^A \begin{macro}{\tabularxcolumn}
+% ^^A The default definition of {\ttfamily X} is \verb"p{#1}".
% \begin{macrocode}
-\def\TX@trial#1{%
- \setbox\@tempboxa\hbox{%
+ % \def\tabularxcolumn#1{p{#1}}
% \end{macrocode}
-% Any extra commands. This is used on the first run to count the number
-% of {\ttfamily X} columns.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@newcol}
+% ^^A A little macro just used to cut down the number of \verb"\expandafter"
+% ^^A commands needed.
% \begin{macrocode}
- #1\relax
+ % \def\TX@newcol{\newcol@{X}[0]}
% \end{macrocode}
-% Since v1.04, make \verb"\footnotetext" gobble its arguments. Also locally
-% clear \verb"\TX@vwarn" so that the warning is generated by the {\ttfamily
-% final} run, and does not appear in the middle of the table if
-% \verb"\tracingtabularx".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@trial}
+% ^^A Make a test run.
% \begin{macrocode}
- \let\@footnotetext\TX@trial@ftn
- \let\TX@vwarn\@empty
+ % \def\TX@trial#1{%
+ % \setbox\@tempboxa\hbox{%
% \end{macrocode}
-% Do not nest {\ttfamily tabularx} environments during trial runs. This
-% would waste time, and the global setting of \verb"\TX@cols" would break the
-% algorithm.
+% ^^A Any extra commands. This is used on the first run to count the number
+% ^^A of {\ttfamily X} columns.
% \begin{macrocode}
- \expandafter\let\expandafter\tabularx\csname tabular*\endcsname
- \expandafter\let\expandafter\endtabularx\csname endtabular*\endcsname
+ % #1\relax
% \end{macrocode}
-% Added at v1.05: disable \verb"\write"s during a trial run. This trick is
-% from the \TeX{}Book.\footnote{Actually the \TeX{}Book trick does
-% not work correctly, so changed for v2.05.}
+% ^^A Since v1.04, make \verb"\footnotetext" gobble its arguments. Also locally
+% ^^A clear \verb"\TX@vwarn" so that the warning is generated by the {\ttfamily
+% ^^A final} run, and does not appear in the middle of the table if
+% ^^A \verb"\tracingtabularx".
% \begin{macrocode}
- \def\write{\begingroup
- \def\let{\afterassignment\endgroup\toks@}%
- \afterassignment\let\count@}%
+ % \let\@footnotetext\TX@trial@ftn
+ % \let\TX@vwarn\@empty
% \end{macrocode}
-% Turn off warnings (see appendix D). Also prevent them being turned
-% back on by setting the parameter names to be registers.
+% ^^A Do not nest {\ttfamily tabularx} environments during trial runs. This
+% ^^A would waste time, and the global setting of \verb"\TX@cols" would break the
+% ^^A algorithm.
% \begin{macrocode}
- \hbadness\@M
- \hfuzz\maxdimen
- \let\hbadness\@tempcnta
- \let\hfuzz\@tempdima
+ % \expandafter\let\expandafter\tabularx\csname tabular*\endcsname
+ % \expandafter\let\expandafter\endtabularx\csname endtabular*\endcsname
% \end{macrocode}
-% Make the table, and finish the hbox.
-% Since v1.06, \verb"\toks@" contains the preamble specification,
-% and possible optional argument, as well as the table body.
+% ^^A Added at v1.05: disable \verb"\write"s during a trial run. This trick is
+% ^^A from the \TeX{}Book.\footnote{Actually the \TeX{}Book trick does
+% ^^A not work correctly, so changed for v2.05.}
% \begin{macrocode}
- \expandafter\tabular\the\toks@
- \endtabular}%
+ % \def\write{\begingroup
+ % \def\let{\afterassignment\endgroup\toks@}%
+ % \afterassignment\let\count@}%
% \end{macrocode}
-% Since v1.05 reset all \LaTeX\ counters, by executing \verb"\TX@ckpt".
+% ^^A Turn off warnings (see appendix D). Also prevent them being turned
+% ^^A back on by setting the parameter names to be registers.
% \begin{macrocode}
- \TX@ckpt
+ % \hbadness\@M
+ % \hfuzz\maxdimen
+ % \let\hbadness\@tempcnta
+ % \let\hfuzz\@tempdima
% \end{macrocode}
-% Print some statistics.
-% Added \verb"\TX@align" in v1.05, to line up the columns.
+% ^^A Make the table, and finish the hbox.
+% ^^A Since v1.06, \verb"\toks@" contains the preamble specification,
+% ^^A and possible optional argument, as well as the table body.
% \begin{macrocode}
- \TX@typeout@{\@spaces
- \expandafter\TX@align
- \the\wd\@tempboxa\space\space\space\space\space\@@
- \expandafter\TX@align
- \the\TX@col@width\space\space\space\space\space\@@
- \@spaces\the\TX@cols}}
+ % \expandafter\tabular\the\toks@
+ % \endtabular}%
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@align}
-% Macro added at v1.05, to improve the printing of the tracing info.
+% ^^A Since v1.05 reset all \LaTeX\ counters, by executing \verb"\TX@ckpt".
% \begin{macrocode}
-\def\TX@align#1.#2#3#4#5#6#7#8#9\@@{%
- \ifnum#1<10 \space\fi
- \ifnum#1<100 \space\fi
- \ifnum#1<\@m\space\fi
- \ifnum#1<\@M\space\fi
- #1.#2#3#4#5#6#7#8\space\space}
+ % \TX@ckpt
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\arraybackslash}
-% \verb"\\" hack.
+% ^^A Print some statistics.
+% ^^A Added \verb"\TX@align" in v1.05, to line up the columns.
% \begin{macrocode}
-\ifx\arraybackslash\@undefined
-\def\arraybackslash{\let\\\tabularnewline}
-\fi
+ % \TX@typeout@{\@spaces
+ % \expandafter\TX@align
+ % \the\wd\@tempboxa\space\space\space\space\space\@@
+ % \expandafter\TX@align
+ % \the\TX@col@width\space\space\space\space\space\@@
+ % \@spaces\the\TX@cols}}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tracingtabularx}
-% Print statistics on column and table widths.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@align}
+% ^^A Macro added at v1.05, to improve the printing of the tracing info.
% \begin{macrocode}
-\def\tracingtabularx{%
- %\def\TX@typeout{\PackageWarningNoLine{tabularx}}%
- \def\TX@typeout{\ClassWarningNoLine{memoir}}% <--- changed
- \def\TX@typeout@##1{\typeout{(tabularx) ##1}}}
+ % \def\TX@align#1.#2#3#4#5#6#7#8#9\@@{%
+ % \ifnum#1<10 \space\fi
+ % \ifnum#1<100 \space\fi
+ % \ifnum#1<\@m\space\fi
+ % \ifnum#1<\@M\space\fi
+ % #1.#2#3#4#5#6#7#8\space\space}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@typeout}
-% The default is to be to be quiet
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\arraybackslash}
+% ^^A \verb"\\" hack.
% \begin{macrocode}
-\let\TX@typeout\@gobble
-\let\TX@typeout@\@gobble
+ % \ifx\arraybackslash\@undefined
+ % \def\arraybackslash{\let\\\tabularnewline}
+ % \fi
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@ftn}
-% A token register for saving footnote texts.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\tracingtabularx}
+% ^^A Print statistics on column and table widths.
% \begin{macrocode}
-\newtoks\TX@ftn
+ % \def\tracingtabularx{%
+ % %\def\TX@typeout{\PackageWarningNoLine{tabularx}}%
+ % \def\TX@typeout{\ClassWarningNoLine{memoir}}% <--- changed
+ % \def\TX@typeout@##1{\typeout{(tabularx) ##1}}}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@ftntext}
-% \begin{macro}{\TX@xftntext}
-% Inside the alignment just save up the footnote text in a token
-% register.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@typeout}
+% ^^A The default is to be to be quiet
% \begin{macrocode}
-\long\def\TX@ftntext#1{%
- \edef\@tempa{\the\TX@ftn\noexpand\footnotetext
- [\the\csname c@\@mpfn\endcsname]}%
- \global\TX@ftn\expandafter{\@tempa{#1}}}%
-\long\def\TX@xftntext[#1]#2{%
- \global\TX@ftn\expandafter{\the\TX@ftn\footnotetext[#1]{#2}}}
+ % \let\TX@typeout\@gobble
+ % \let\TX@typeout@\@gobble
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\TX@trial@ftn}
-% On trial runs, gobble footnote texts.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@ftn}
+% ^^A A token register for saving footnote texts.
% \begin{macrocode}
-\long\def\TX@trial@ftn#1{}
+ % \newtoks\TX@ftn
% \end{macrocode}
-% \end{macro}
-%
-% This last section was added at Version 1.02. Previous versions
-% documented the fact that \verb"\verb" did not work inside {\ttfamily
-% tabularx}, but that did not stop people using it! This usually put
-% \LaTeX\ into an irrecoverable error position, with error messages that
-% did not mention the cause of the error. The `poor man's \verb"\verb"' (and
-% \verb"\verb*") defined here is based on page 382 of the \TeX{}Book. As
-% explained there, doing verbatim this way means that spaces are not
-% treated correctly, and so \verb"\verb*" may well be useless, however I
-% consider this section of code to be error-recovery, rather than a real
-% implementation of verbatim.
-%
-% The mechanism is quite general, and any macro which wants to allow a
-% form of \verb"\verb" to be used within its argument may
-% \verb"\let\verb=\TX@verb". (Making sure to restore the real definition
-% later!)
-%
-% \verb"\verb" and \verb"\verb*" are subject to the following restrictions:
-% \begin{enumerate}
-% \item Spaces in the argument are not read verbatim, but may be skipped
-% according to \TeX's usual rules.
-% \item Spaces will be added to the output after control words, even if
-% they were not present in the input.
-% \item Unless the argument is a single space, any trailing space,
-% whether in the original argument, or added as in (2),
-% will be omitted.
-% \item The argument must not end with \verb"\", so \verb"\verb|\|" is not
-% allowed, however, because of (3), \verb"\verb|\ |" produces
-% \verb"\".
-% \item The argument must be balanced with respect to \verb"{" and \verb"}". So
-% \verb"\verb|{|" is not allowed.
-% \item A comment character like \verb"%" will not appear verbatim. It will
-% act as usual, commenting out the rest of the input line!
-% \item The combinations \verb"?`" and \verb"!`" will appear as
-% {\ttfamily?`} and {\ttfamily!`} if the {\ttfamily cmtt} font is
-% being used.
-% \end{enumerate}
-%
-% \begin{macro}{\TX@verb}
-% The internal definition of \verb"\verb". Spaces will be replaced by \verb"~", so
-% for the star-form, \verb"\let" \verb"~" be \verb*| |, which we obtain as
-% \verb"\uppercase{*}". Use \verb"{\ifnum0=`}\fi" rather than \verb"\bgroup" to allow
-% \verb"&" to appear in the argument.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@ftntext}
+% ^^A \begin{macro}{\TX@xftntext}
+% ^^A Inside the alignment just save up the footnote text in a token
+% ^^A register.
+% \begin{macrocode}
+ % \long\def\TX@ftntext#1{%
+ % \edef\@tempa{\the\TX@ftn\noexpand\footnotetext
+ % [\the\csname c@\@mpfn\endcsname]}%
+ % \global\TX@ftn\expandafter{\@tempa{#1}}}%
+ % \long\def\TX@xftntext[#1]#2{%
+ % \global\TX@ftn\expandafter{\the\TX@ftn\footnotetext[#1]{#2}}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@trial@ftn}
+% ^^A On trial runs, gobble footnote texts.
% \begin{macrocode}
-{\uccode`\*=`\ %
-\uppercase{\gdef\TX@verb{%
- \leavevmode\null\TX@vwarn
- {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
- \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
+ % \long\def\TX@trial@ftn#1{}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@vb}
-% Get the `almost verbatim' text using \verb"\meaning". The `\verb"!"' is added to
-% the front of the user supplied text, to ensure that the whole argument
-% does not consist of a single \verb"{ }" group. \TeX\ would strip the outer
-% braces from such a group. The `\verb"!"' will be removed later.
-%
-% Originally I followed Knuth, and had \verb"\def\@tempa{##1}", however this
-% did not allow \verb"#" to appear in the argument. So in v1.04, I changed
-% this to to use a token register, and \verb"\edef". This allows \verb"#" appear,
-% but makes each one appear twice!, so later we loop through, replacing
-% \verb"##" by \verb"#".
+% ^^A \end{macro}
+% ^^A
+% ^^A This last section was added at Version 1.02. Previous versions
+% ^^A documented the fact that \verb"\verb" did not work inside {\ttfamily
+% ^^A tabularx}, but that did not stop people using it! This usually put
+% ^^A \LaTeX\ into an irrecoverable error position, with error messages that
+% ^^A did not mention the cause of the error. The `poor man's \verb"\verb"' (and
+% ^^A \verb"\verb*") defined here is based on page 382 of the \TeX{}Book. As
+% ^^A explained there, doing verbatim this way means that spaces are not
+% ^^A treated correctly, and so \verb"\verb*" may well be useless, however I
+% ^^A consider this section of code to be error-recovery, rather than a real
+% ^^A implementation of verbatim.
+% ^^A
+% ^^A The mechanism is quite general, and any macro which wants to allow a
+% ^^A form of \verb"\verb" to be used within its argument may
+% ^^A \verb"\let\verb=\TX@verb". (Making sure to restore the real definition
+% ^^A later!)
+% ^^A
+% ^^A \verb"\verb" and \verb"\verb*" are subject to the following restrictions:
+% ^^A \begin{enumerate}
+% ^^A \item Spaces in the argument are not read verbatim, but may be skipped
+% ^^A according to \TeX's usual rules.
+% ^^A \item Spaces will be added to the output after control words, even if
+% ^^A they were not present in the input.
+% ^^A \item Unless the argument is a single space, any trailing space,
+% ^^A whether in the original argument, or added as in (2),
+% ^^A will be omitted.
+% ^^A \item The argument must not end with \verb"\", so \verb"\verb|\|" is not
+% ^^A allowed, however, because of (3), \verb"\verb|\ |" produces
+% ^^A \verb"\".
+% ^^A \item The argument must be balanced with respect to \verb"{" and \verb"}". So
+% ^^A \verb"\verb|{|" is not allowed.
+% ^^A \item A comment character like \verb"%" will not appear verbatim. It will
+% ^^A act as usual, commenting out the rest of the input line!
+% ^^A \item The combinations \verb"?`" and \verb"!`" will appear as
+% ^^A {\ttfamily?`} and {\ttfamily!`} if the {\ttfamily cmtt} font is
+% ^^A being used.
+% ^^A \end{enumerate}
+% ^^A
+% ^^A \begin{macro}{\TX@verb}
+% ^^A The internal definition of \verb"\verb". Spaces will be replaced by \verb"~", so
+% ^^A for the star-form, \verb"\let" \verb"~" be \verb*| |, which we obtain as
+% ^^A \verb"\uppercase{*}". Use \verb"{\ifnum0=`}\fi" rather than \verb"\bgroup" to allow
+% ^^A \verb"&" to appear in the argument.
+% \begin{macrocode}
+ % {\uccode`\*=`\ %
+ % \uppercase{\gdef\TX@verb{%
+ % \leavevmode\null\TX@vwarn
+ % {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
+ % \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
+% \end{macrocode}
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@vb}
+% ^^A Get the `almost verbatim' text using \verb"\meaning". The `\verb"!"' is added to
+% ^^A the front of the user supplied text, to ensure that the whole argument
+% ^^A does not consist of a single \verb"{ }" group. \TeX\ would strip the outer
+% ^^A braces from such a group. The `\verb"!"' will be removed later.
+% ^^A
+% ^^A Originally I followed Knuth, and had \verb"\def\@tempa{##1}", however this
+% ^^A did not allow \verb"#" to appear in the argument. So in v1.04, I changed
+% ^^A this to to use a token register, and \verb"\edef". This allows \verb"#" appear,
+% ^^A but makes each one appear twice!, so later we loop through, replacing
+% ^^A \verb"##" by \verb"#".
% \begin{macrocode}
-\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
- \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
+ % \def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
+ % \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@v}
-% Strip the initial segment of the \verb"\meaning", including the `\verb"!"'
-% added earlier.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@v}
+% ^^A Strip the initial segment of the \verb"\meaning", including the `\verb"!"'
+% ^^A added earlier.
% \begin{macrocode}
-\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
+ % \def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
% \end{macrocode}
-% \end{macro}
-%
-% As explained above we are going to replace \verb"##" pairs by \verb"#". To do
-% this we need non-special \verb"#" tokens. Make \verb"*" into a parameter
-% token so that we can define macros with arguments. The normal meanings
-% will be restored by the \verb"\endgroup" later.
+% ^^A \end{macro}
+% ^^A
+% ^^A As explained above we are going to replace \verb"##" pairs by \verb"#". To do
+% ^^A this we need non-special \verb"#" tokens. Make \verb"*" into a parameter
+% ^^A token so that we can define macros with arguments. The normal meanings
+% ^^A will be restored by the \verb"\endgroup" later.
% \begin{macrocode}
-\begingroup
-\catcode`\*=\catcode`\#
-\catcode`\#=12
+ % \begingroup
+ % \catcode`\*=\catcode`\#
+ % \catcode`\#=12
% \end{macrocode}
-%
-% \begin{macro}{\TX@vfirst}
-% As a special case, prevent the first character from being dropped.
-% This makes \verb"\verb*| |" produce \verb*| |. Then call \verb"\TX@v@".
-% This is slightly tricky since v1.04, as I have to ensure that an
-% actual \verb"#" rather than a command \verb"\let" to \verb"#" is passed on if the
-% first character is \verb"#".
-% \begin{macrocode}
-\gdef\TX@vfirst{%
- \if\@tempa#%
- \def\@tempb{\TX@v@#}%
- \else
- \let\@tempb\TX@v@
- \if\@tempa\space~\else\@tempa\fi
- \fi
- \@tempb}
+% ^^A
+% ^^A \begin{macro}{\TX@vfirst}
+% ^^A As a special case, prevent the first character from being dropped.
+% ^^A This makes \verb"\verb*| |" produce \verb*| |. Then call \verb"\TX@v@".
+% ^^A This is slightly tricky since v1.04, as I have to ensure that an
+% ^^A actual \verb"#" rather than a command \verb"\let" to \verb"#" is passed on if the
+% ^^A first character is \verb"#".
+% \begin{macrocode}
+ % \gdef\TX@vfirst{%
+ % \if\@tempa#%
+ % \def\@tempb{\TX@v@#}%
+ % \else
+ % \let\@tempb\TX@v@
+ % \if\@tempa\space~\else\@tempa\fi
+ % \fi
+ % \@tempb}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@v@}
-% Loop through the \verb"\meaning", replacing all spaces by \verb"~". If the last
-% character is a space it is dropped, so that \verb"\verb*|\LaTeX|" produces
-% \verb"\LaTeX" not \verb*|\LaTeX |. The rewritten tokens are then further
-% processed to replace \verb"##" pairs.
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@v@}
+% ^^A Loop through the \verb"\meaning", replacing all spaces by \verb"~". If the last
+% ^^A character is a space it is dropped, so that \verb"\verb*|\LaTeX|" produces
+% ^^A \verb"\LaTeX" not \verb*|\LaTeX |. The rewritten tokens are then further
+% ^^A processed to replace \verb"##" pairs.
% \begin{macrocode}
-\gdef\TX@v@*1 *2{%
- \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
+ % \gdef\TX@v@*1 *2{%
+ % \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\TX@v@hash}
-% The inner loop, replacing \verb"##" by \verb"#".
+% ^^A \end{macro}
+% ^^A
+% ^^A \begin{macro}{\TX@v@hash}
+% ^^A The inner loop, replacing \verb"##" by \verb"#".
% \begin{macrocode}
-\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
+ % \gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
% \end{macrocode}
-% \end{macro}
-%
-% As promised, we now restore the normal meanings of \verb"#" and \verb"*".
+% ^^A \end{macro}
+% ^^A
+% ^^A As promised, we now restore the normal meanings of \verb"#" and \verb"*".
% \begin{macrocode}
-\endgroup
+ % \endgroup
% \end{macrocode}
-%
-% \begin{macro}{\TX@vwarn}
-% Warn the user the first time this \verb"\verb" is used.
+% ^^A
+% ^^A \begin{macro}{\TX@vwarn}
+% ^^A Warn the user the first time this \verb"\verb" is used.
% \begin{macrocode}
-\def\TX@vwarn{%
- \@warning{\noexpand\verb may be unreliable inside tabularx}%
- \global\let\TX@vwarn\@empty}
+ % \def\TX@vwarn{%
+ % \@warning{\noexpand\verb may be unreliable inside tabularx}%
+ % \global\let\TX@vwarn\@empty}
% \end{macrocode}
-% \end{macro}
+% ^^A \end{macro}
% \begin{macrocode}
-
-%%%%%%%%%% end Tabularx package code v2.11 %%%%%%%%%%%%%%%%%%%%%
-
-
-
-
+ %
+ % %%%%%%%%%% end Tabularx package code v2.11 %%%%%%%%%%%%%%%%%%%%%
+ %
+ %
+ %
+ %
% \end{macrocode}
-%
-% At this point we had better stop anyone trying to load the several
-% tabular-related packages (as effectively they are already loaded).
+% ^^A
+% ^^A At this point we had better stop anyone trying to load the several
+% ^^A tabular-related packages (as effectively they are already loaded).
% \begin{macrocode}
-%%\@memfakeusepackage{array}
-%%\@memfakeusepackage{dcolumn}
-%%\@memfakeusepackage{delarray}
-%%\@memfakeusepackage{tabularx}
-
+ % %%\@memfakeusepackage{array}
+ % %%\@memfakeusepackage{dcolumn}
+ % %%\@memfakeusepackage{delarray}
+ % %%\@memfakeusepackage{tabularx}
+ %
% \end{macrocode}
-%
-%
+% ^^A
+% ^^A
%
% \subsection{Fear's rules}
%
@@ -36060,20 +36130,28 @@
% v2.4b (2005) and c (2008) are some copyright years.}
% \changes{v3.7g}{2018/03/05}{Embedded the latest version of the
% \Lpack{array} package}
+% \changes{v3.7h}{2018/09/06}{\Lpack{array} no longer embedded,
+% required instead}
% \begin{macrocode}
-\EmulatedPackage{array}[2016/10/06]
+ % \EmulatedPackage{array}[2016/10/06]
\EmulatedPackage{booktabs}[2016/05/16]
\EmulatedPackage{ccaption}[2008/07/23]
\EmulatedPackage{changepage}[2008/07/23]
\EmulatedPackage{chngcntr}[2008/07/23]
\EmulatedPackage{chngpage}[2008/07/23]
\EmulatedPackage{crop}
-\EmulatedPackage{dcolumn}[2008/07/23]
+% \end{macrocode}
+% \changes{v3.7h}{2018/09/06}{\Lpack{dcolumn} is no longer embedded,
+% emulation removed. We require it instead}
+% \begin{macrocode}
+ % \EmulatedPackage{dcolumn}[2008/07/23]
% \end{macrocode}
% \changes{v3.7g}{2018/03/06}{Adjusted the date for \Lpack{delarray},
% the code is the same}
+% \changes{v3.7h}{2018/09/06}{\Lpack{delarray} is no longer embedded,
+% emulation removed. We require it instead}
% \begin{macrocode}
-\EmulatedPackage{delarray}[2014/10/28]
+ % \EmulatedPackage{delarray}[2014/10/28]
\EmulatedPackage{enumerate}[2008/07/23]
\EmulatedPackage{epigraph}[2008/07/23]
%%%%%\EmulatedPackage{framed}[2008/07/23]
@@ -36100,8 +36178,10 @@
\EmulatedPackage{showidx}[2008/07/23]
% \end{macrocode}
% \changes{v3.7g}{2018/03/02}{Updated the embedded version of \Lpack{tabularx} to v2.11 2016/02/03}
+% \changes{v3.7h}{2018/09/08}{\Lpack{tabularx} is no longer emulated,
+% but a required package}
% \begin{macrocode}
-\EmulatedPackage{tabularx}[2016/02/03]
+ % \EmulatedPackage{tabularx}[2016/02/03]
\EmulatedPackage{titleref}[2008/07/23]
\EmulatedPackage{titling}[2008/07/23]
\EmulatedPackage{tocbibind}[2008/07/23]