% \iffalse
%%
%% File `tabularew.dtx'.
%% Copyright (C) 2009 Diego Saba
%% This file may be distributed under the terms of the LPPL.
%%
%
%<*dtx>
          \ProvidesFile{tabularew.dtx}
%</dtx>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{tabularew}
% \fi
%         \ProvidesFile{tabularew.dtx}
          [2009/05/23 v0.1 tabularew package (DPC)]
%
% \iffalse
%<*driver>
\documentclass{ltxdoc}
\usepackage{tabularew}
\EnableCrossrefs
\CodelineIndex
\GetFileInfo{tabularew.dtx}
\title{The \textsf{tabularew} package\thanks{This file
         has version number \fileversion, last
         revised \filedate.}}
\author{Diego Saba}
\date{\filedate}
\RecordChanges
\begin{document}
\maketitle
\DocInput{tabularew.dtx}
\PrintChanges
\end{document}
%</driver>
% \fi
% \CheckSum{458}
%
% \MakeShortVerb{\"}
% \def\<#1>{$\langle$#1\/$\rangle$}%
%
% \def\dataa{\ignorespaces
%   1&7,4&2,9&0,83&0,83&37,0&54,7&30,7&1,2\\
%   2&59,9&8,9&0,83&0,83&4,61&17,9&4,46&1,2\\
%   3&64,0&7,5&0,83&0,83&4,31&21,1&4,22&1,2\\
%   4&46,3&4,8&0,83&0,83&5,95&33,5&5,86&1,2\\
%   5&48,4&6,8&0,83&0,83&5,70&23,3&5,53&1,2
%   }
% \def\datab{\ignorespaces
%   1&7&,4&2&,9&0&,83&0&,83&37&,0&54&,7&30&,7&1&,2\\
%   2&59&,9&8&,9&0&,83&0&,83&4&,61&17&,9&4&,46&1&,2\\
%   3&64&,0&7&,5&0&,83&0&,83&4&,31&21&,1&4&,22&1&,2\\
%   4&46&,3&4&,8&0&,83&0&,83&5&,95&33&,5&5&,86&1&,2\\
%   5&48&,4&6&,8&0&,83&0&,83&5&,70&23&,3&5&,53&1&,2
%   }
%
% \begin{abstract}
%
% This article proposes an extended implementation of the \LaTeX\
% \textsf{tabular} environment. It adds a new command to gain access
% to a quantity, called here the \emph{excess width}, involved in
% the process of
% calculating the column widths. This allows to modify the default
% algorithm, that produces undesirable effects in some circumstances.
%
% The same extension can easily be added in the future to the similar
% \textsf{array} environment and to the star forms of both.
%
% This extension evaluates the whole table three times. It consumes
% more resources than the standard environment and cannot be made 100\%
% compatible, as it conceptually should.
%
% \end{abstract}
%
%
% \section{Introduction}
%
% This package extends the implementation of the \textsf{tabular}
% environment contained in the \textsf{array} package. More
% information can be found in \cite{bk:companion}.
%
% Let us start with an example. Suppose that you have to modify
% the following table, in order to align the decimal separators.
%
% \begin{center}
%   \begin{tabular}{*{9}{c}}
%     sez. &
%     $\sigma$ &
%     $\tau$ &
%     $\beta_{\mathrm{pl},\sigma}$ &
%     $\beta_{\mathrm{pl},\tau}$ &
%     $S_{\mathrm{pl},\sigma}$ &
%     $S_{\mathrm{pl},\tau}$ &
%     $S_{\mathrm{pl}}$ &
%     $S_{\mathrm{pl,am}}$ \\[-.2\normalbaselineskip]
%     &
%     \scriptsize [MPa] &
%     \scriptsize [MPa] \\[.2\normalbaselineskip]
%     \hline
%     \hbox{\vrule height .9\normalbaselineskip width0pt}\dataa
%   \end{tabular}
% \end{center}
%
% This can be done using a well known stratagem:
% each number can be split so that the integer part belongs to a column,
% and the separator sign and the fractional part belong to the following
% column. The labels must now span two columns.
%
% The code will change accordingly:
%
% \begin{center}
%   \begin{tabular}{m{.4\textwidth}@{}c@{}m{.5\textwidth}}
%     "\begin{tabular}{*{9}{c}}" \par
%     "  sez. &" \par
%     "  $\sigma$ &" \par
%     "  $\tau$ &" \par
%     "  "~\dots \par
%     "  \hline" \par
%     "  1 & 7,4 & 2,9 &"~\dots \par
%     "  "~\dots \par
%     "\end{tabular}"        
%     &
%     $\Rightarrow$
%     &
%     "\begin{tabular}{c*{8}{r@{}l}}" \par
%     "  sez. &" \par
%     "  \multicolumn{2}{c}{$\sigma$} &" \par
%     "  \multicolumn{2}{c}{$\tau$} &" \par
%     "  "~\dots \par
%     "  \hline" \par
%     "  1 & 7&,4 & 2&,9 &"~\dots \par
%     "  "~\dots \par
%     "\end{tabular}"
%   \end{tabular}
% \end{center}
%
% The result is probably unexpected:
%
% \begin{center}
%   \begin{tabular}{c*{8}{r@{}l}}
%     sez. &
%     \multicolumn{2}{c}{$\sigma$} &
%     \multicolumn{2}{c}{$\tau$} &
%     \multicolumn{2}{c}{$\beta_{\mathrm{pl},\sigma}$} &
%     \multicolumn{2}{c}{$\beta_{\mathrm{pl},\tau}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl},\sigma}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl},\tau}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl}}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl,am}}$} \\[-.2\normalbaselineskip]
%     &
%     \multicolumn{2}{c}{\scriptsize [MPa]} &
%     \multicolumn{2}{c}{\scriptsize [MPa]} \\[.2\normalbaselineskip]
%     \hline
%     \hbox{\vrule height .9\normalbaselineskip width0pt}\datab
%   \end{tabular}
% \end{center}
%
% Note that the last label is not centered on its data: it is aligned
% to the left and hangs to the right. The same is true of the third label.
% Actually, seven of the nine labels are wider than their data, though some
% of them by very little.
% When a |\multicolumn| is wider than the columns it spans, it is aligned
% to the left, disregarding the alignment directive.
%
% The intent was to center all the labels, like this:
% \newcolumntype{w}{>{\spew{.5}{+1}}}
% \begin{center}
%   \begin{tabularew}{c*{8}{wr@{}l}}
%     sez. &
%     \multicolumn{2}{c}{$\sigma$} &
%     \multicolumn{2}{c}{$\tau$} &
%     \multicolumn{2}{c}{$\beta_{\mathrm{pl},\sigma}$} &
%     \multicolumn{2}{c}{$\beta_{\mathrm{pl},\tau}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl},\sigma}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl},\tau}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl}}$} &
%     \multicolumn{2}{c}{$S_{\mathrm{pl,am}}$} \\[-.2\normalbaselineskip]
%     &
%     \multicolumn{2}{c}{\scriptsize [MPa]} &
%     \multicolumn{2}{c}{\scriptsize [MPa]} \\[.2\normalbaselineskip]
%     \hline
%     \hbox{\vrule height .9\normalbaselineskip width0pt}%
%     \datab
%   \end{tabularew}
% \end{center}
%
% To understand the reason of this behaviour, and the difficulty to
% ``correct'' it, the algorithm used by \LaTeX\ and by the underlying
% \TeX\ to compute the column widths must be examined in greater detail.
%
% The column widths are first calculated without
% considering
% the |\multicolumn| cells, unless they span just one column and so
% are ``fake'' |\multicolumn|s. Let us call the result of this first
% computation the \emph{intrinsic width} of a column. Then each
% |\multicolumn| in turn is taken into consideration. If it is
% wider than the columns it spans, comprehensive of the space
% between adjacent columns, the last column
% is widened to accommodate the |\multicolumn|.
% The order matters:
% first the |\multicolumn|s that end at the second column are
% considered, then those that end at the third column, and so on.
% Let us call the column widths so obtained the
% \emph{extrinsic widths}.
% The difference between the extrinsic width and the intrinsic width is
% the \emph{excess width}\footnote{Other names that I have considered are
% \emph{proper}, \emph{inherent}, \emph{implicit}, \emph{essential},
% \emph{innate} for \emph{intrinsic} and \emph{relational},
% \emph{explicit}, \emph{accidental}, \emph{acquired} for
% \emph{extrinsic}.}.
%
% The \textsf{tabular} environment relies on the \TeX\ primitive
% |\halign|, from which it inherits the algorithm. It is
% explained in a different and more formal way in
% The~\TeX book~\cite[page~235]{bk:texbook}, but the result is
% the same.
%
% This algorithm sometimes produces undesirable effects, as the
% example above shows and Donald Knuth
% himself points out~\cite[\textit{ibidem}]{bk:texbook}.
%
%
% \section{Features}
%
% The \textsf{tabularew} environment has the same syntax as the
% \textsf{tabular} environment, and should behave in the same
% way, except for the new features (and a new bunch of incompatibilities
% and bugs \dots).
% \begin{quote}
%   "\begin{tabularew}"\marg{pream}" " \ldots\ "\end{tabularew}"
% \end{quote}
%
% \DescribeMacro\GetExcessWidth
% In the body of the environment a new command is available.
% \begin{quote}
%   |\GetExcessWidth|\marg{column} \\
%   \<\textit{column}>\ $\longrightarrow$~%
%     \<optional sign>\ \<number>
% \end{quote}
% The \<\textit{column}> indication can be absolute or relative to
% the current position. It is relative if
% the first character is `\texttt{+}' or
% `\texttt{-}', otherwise it is absolute\footnote{I cannot see
% a useful application for the `\texttt{-}' form, but it was natural
% to include it.}.
% \DescribeMacro\ExcessWidth
% Its effect is to set the dimension register |\ExcessWidth| to
% the excess width of \<\textit{column}>.
%
% \DescribeMacro\spew
% The command\footnote{The name stands for \emph{add a \textsc{sp}ace
% proportional to the \textsc{e}xcess \textsc{w}idth}, but the effect
% seems a bit unfortunate.}
% \begin{quote}
%   "\spew"\marg{factor}\marg{column}
% \end{quote}
% is just a shorthand for the idiom
% \begin{quote}
%   "\GetExcessWidth"\marg{column}"\hspace{"\<\textit{factor}>"\ExcessWidth}"
% \end{quote}
%
% Since there is no way to access the widths directly during
% the evaluation of a table, a trick must be used.
% The table is evaluated three times. During the first pass
% every call to |\GetExcessWidth| sets |\ExcessWidth| to
% a null length and every call to
% |\multicolumn| generates an empty cell; thus the \emph{intrinsic widths}
% are collected.
% The second pass restores the normal behaviour of |\multicolumn|; the
% \emph{extrinsic widths} are collected and the \emph{excess widths}
% calculated.
% In the third and last pass every call to |\ExcessWidth| returns the
% requested measure.
%
% The column widths can change between the second and third pass,
% but the total width of the table will not,
% if |\spew| is used in the following way, that is the
% way I had in mind when this package was conceived.
%
% When there is a |\multicolumn| cell, the columns crossed by it
% form a group. It is sometimes
% useful to access the excess width of the \emph{last} column of the
% group from within the preceding columns \emph{of the same group}.
% Moreover, the sum of the spaces |\spew|ed in each of the preceding
% columns should not exceed the excess width of the last column; that is,
% the sum of all the \<\textit{factor}> arguments should not exceed one.
% In this way the net result is to redistribute the excess width in a
% flexible way among the group of columns.
%
% \DescribeMacro\CurrentColumn
% \DescribeMacro\NumberOfColumns
% The two counters |\CurrentColumn| and |\NumberOfColumns| need not
% normally be used explicitly, since |\GetExcessWidth| makes use
% of them behind the scenes. Nonetheless I decided to expose them too
% to the user. They should only be read and not assigned to.
%
%
% \section{Example}
%
% The ``correct'' table shown in the introduction was obtained by
% \begin{quote}
%   "\begin{tabularew}{c*{8}{>{\spew{.5}{+1}}r@{}l}}" \\
%   "  sez. &" \\
%   "  \multicolumn{2}{c}{$\sigma$} &" \\
%   "  \multicolumn{2}{c}{$\tau$} &" \\
%   "  "~\dots \\
%   "  \hline" \\
%   "  1 & 7&,4 & 2&,9 &"~\dots \\
%   "  "~\dots \\
%   "\end{tabularew}"
% \end{quote}
%
%
% \StopEventually{
% \begin{thebibliography}{1}
%    \bibitem{bk:companion} \textsc{M.~Goossens}, \textsc{F.~Mittelbach}
%       and \textsc{A.~Samarin}.
%       \newblock The \LaTeX{} Companion.
%       \newblock
%       Addison-Wesley, Reading, Massachusetts, 1994.
%    \bibitem{bk:texbook}  \textsc{D. E. Knuth}.
%       \newblock  The \TeX{}book (Computers \& Typesetting Volume A).
%       \newblock
%       Addison-Wesley, Reading, Massachusetts, 1986.
% \end{thebibliography}
% \PrintChanges
% }
%
%
% \clearpage
% \section{The Code}
%
% I have succeeded in writing this code, thanks to David Carlisle's
% \textsf{tabulary} environment and his well-commented code.
% I have boldly and shamelessly copied it, without even fully
% understanding it, and modified it to suite my needs.
%
% To simplify things, I have eliminated the |\verb| and \textsf{colortbl}
% support (at least for the moment).
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{array}
%    \end{macrocode}
%
%    \begin{macrocode}
\catcode`\Z=14
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareOption{debugshow}{\catcode`\Z=9\relax}
%    \end{macrocode}
%
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode}
%    
% \begin{macro}{\ExcessWidth}
% \begin{macro}{\CurrentColumn}
% \begin{macro}{\NumberOfColumns}
% Allocate the registers for the user interface.
%    \begin{macrocode}
\newdimen\ExcessWidth
\newcount\CurrentColumn
\newcount\NumberOfColumns
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\tabularew}
% \begin{macro}{\TEW@get@body}
% \begin{macro}{\TEW@find@end}
% \begin{macro}{\endtabularew}
% The \textsf{tabularew} environment uses the same mechanism of grabbing
% its body as \textsf{tabulary}, \textsf{tabularx}, and the AMS alignment
% environments.
% The use of "{\ifnum0=`}\fi" to begin a grouping and of "\ifnum0=`{\fi}"
% to end it is discussed in \textsf{tabularx}. See also
% The \TeX book \cite[page 385]{bk:texbook}.
% It is needed to allow the environment inside an alignment.
%    \begin{macrocode}
\def\tabularew{%
  \edef\TEW@{\@currenvir}%
  {\ifnum0=`}\fi
  \TEW@setup
  \toks@{}\TEW@get@body}
%    \end{macrocode}

%    \begin{macrocode}
\long\def\TEW@get@body#1\end
  {\toks@\expandafter{\the\toks@#1}\TEW@find@end}
%    \end{macrocode}

%    \begin{macrocode}
\def\TEW@find@end#1{%
  \def\@tempa{#1}%
  \ifx\@tempa\TEW@\def\@tempa{\end{#1}}\expandafter\@tempa
  \else\toks@\expandafter
    {\the\toks@\end{#1}}\expandafter\TEW@get@body\fi}
%    \end{macrocode}

%    \begin{macrocode}
\def\endtabularew{%
Z \message{^^J^^JEW Table - first pass^^J}%
  \TEW@firstpass
Z \message{\@spaces\@spaces\space - second pass^^J}%
  \TEW@secondpass
Z \message{\@spaces\@spaces\space - last pass^^J}%
  \TEW@lastpass
  \TEW@cleanup
  \ifnum0=`{\fi}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

% \begin{macro}{\TEW@setup}
% Save locally all the things that \textsf{tabularew} will assign to
% globally. The values will be restored at the end by |\TEW@cleanup|.
%    \begin{macrocode}
\def\TEW@setup{%
  \edef\@restorecounters{%
    \global\NumberOfColumns\the\NumberOfColumns
    \global\CurrentColumn\the\NumberOfColumns\relax}%
%    \end{macrocode}
% The excess widths are stored as macro definitions because
% this way is easier, and probably more efficient, than dealing with
% an ``array'' of dimension registers.
%    \begin{macrocode}
  \count@\z@
  \@tempswatrue
  \@whilesw\if@tempswa\fi{%
    \advance\count@\@ne
    \expandafter\ifx\csname TEW@\the\count@\endcsname\relax
      \@tempswafalse
    \else
      \expandafter\let\csname TEW@S\the\count@
        \expandafter\endcsname\csname TEW@\the\count@\endcsname
    \fi}%
%    \end{macrocode}
% These will only change locally.
%    \begin{macrocode}
  \let\@arraycr\TEW@arraycr
  \let\multicolumn\TEW@multicolumn
  \ExcessWidth\z@
%    \end{macrocode}
% This will only exist locally. But I'm not sure of this choice.
%    \begin{macrocode}
  \let\spew\TEW@spew
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@cleanup}
%    \begin{macrocode}
\def\TEW@cleanup{%
  \count@\z@
  \@tempswatrue
  \@whilesw\if@tempswa\fi{%
    \advance\count@\@ne
    \expandafter\ifx\csname TEW@S\the\count@\endcsname\relax
      \@tempswafalse
    \else
      \global\expandafter\let\csname TEW@\the\count@
        \expandafter\endcsname\csname TEW@S\the\count@\endcsname
    \fi}%
  \@restorecounters
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@firstpass}
% Build a table that will never show up and
% is built in a special way with the purpose of taking measures.
% |\ExcessWidth| is null and |\multicolumn|s are empty.
% The \emph{intrinsic widths} are collected.
%    \begin{macrocode}
\def\TEW@firstpass{%
  \let\multicolumn\TEW@multicolumnempty
  \TEW@tabsample
  \let\multicolumn\TEW@multicolumn
  \let\@computation\TEW@firstcomp
  \TEW@measure
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@secondpass}
% Now |\multicolumn|s are honoured and
% the \emph{extrinsic widths} are collected.
%    \begin{macrocode}
\def\TEW@secondpass{%
  \TEW@tabsample
  \let\@computation\TEW@secondcomp
  \TEW@measure
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@lastpass}
% Just build the real table.
%    \begin{macrocode}
\def\TEW@lastpass{%
  \TEW@tabfinal
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@tabsample}
% Add a row at the end of the table that won't affect the
% column widths. This row will later be analyzed to collect
% the widths. The last row provided by the user can't serve
% this purpose because it could contain multicolumns or be
% hidden by an hline.
%    \begin{macrocode}
\def\TEW@tabsample{%
  \let\GetExcessWidth\@GetExcessWidthz@
  \let\@mkpream\TEW@mkpream
  \setbox\z@\hbox{%
  \gdef\@halignto{}%
  \col@sep\tabcolsep
  \let\d@llarbegin\begingroup\let\d@llarend\endgroup
    \expandafter\TEW@tabarray\the\toks@
      \crcr\omit
      {\count@\NumberOfColumns
        \xdef\TEW@save@row{}%
        \loop
          \advance\count@\m@ne
        \ifnum\count@>\z@
          \xdef\TEW@save@row{\TEW@save@row&\omit}%
        \repeat}%
      \TEW@save@row
      \endarray
    \global\setbox\@ne\lastbox
    }%
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@tabfinal}
% This mimics a regular \textsf{tabular}, the only difference
% being that |\CurrentColumn| is updated before evaluating
% the content of each cell and the command |\GetExcessWidth| is
% made available.
%    \begin{macrocode}
\def\TEW@tabfinal{%
  \leavevmode
  \let\GetExcessWidth\@GetExcessWidth
  \let\@mkpream\TEW@mkpream
  \gdef\@halignto{}%
  \col@sep\tabcolsep
  \let\d@llarbegin\begingroup\let\d@llarend\endgroup
  \expandafter\TEW@tabarray\the\toks@\endarray}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@tabarray}
% \begin{macro}{\TEW@array}
% Handle the optional position argument.
%    \begin{macrocode}
\def\TEW@tabarray{\@ifnextchar[{\TEW@array}{\@array[t]}}
%    \end{macrocode}

%    \begin{macrocode}
\def\TEW@array[#1]{\@array[t]}
%    \end{macrocode}
% \end{macro}
% \end{macro}

% \begin{macro}{\TEW@@mkpream}
% \begin{macro}{\TEW@@arraycr}
% \begin{macro}{\TEW@@multicolumn}
% Saved versions.
%    \begin{macrocode}
\let\TEW@@mkpream\@mkpream
\let\TEW@@arraycr\@arraycr
\let\TEW@@multicolumn\multicolumn
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}

% \begin{macro}{\TEW@mkpream}
% This is a one-shot customized version, that redifines itself
% to the regular version. It's not clear to me why this is
% needed. Maybe because the regular version is used to process
% the multicolumns' preambles?
%    \begin{macrocode}
\def\TEW@mkpream{%
  \global\NumberOfColumns\@ne
  \global\CurrentColumn\@ne
  \let\@addamp\TEW@addamp
  \global\let\@mkpream\TEW@@mkpream % needed!
  \TEW@@mkpream}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@arraycr}
%    \begin{macrocode}
\def\TEW@arraycr{%
  \global\CurrentColumn\@ne
  \TEW@@arraycr
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@multicolumn}
% For the multicolumn mechanism to work, the first token of the
% expansion must be |\omit|.
%    \begin{macrocode}
\long\def\TEW@multicolumn#1#2#3{%
  % Can't place anything before \omit
  \TEW@@multicolumn{#1}{#2}{\global\advance\CurrentColumn\@ne#3}%
  \global\advance\CurrentColumn#1%
  \global\advance\CurrentColumn\m@ne
  \ignorespaces}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@multicolumnempty}
% To behave exactly as explained in the introduction, the special case
% of a ``fake'' multicolumn should be dealt with. I don't think this
% would give any practical advantage, though.
%    \begin{macrocode}
\long\def\TEW@multicolumnempty#1#2#3{\multispan#1\relax}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@addamp}
% During the evaluation of |\@mkpream|, while processing the pramble,
% each `\texttt{\&}' increases |\NumberOfColumns|. After that, it will
% keep it's value. During the evaluation of |\@preamble|, while
% building a row, each `\texttt{\&}' increases |\CurrentColumn|.
% The latter is reset at the end of each row when
% |\@arraycr| is evaluated.
%    \begin{macrocode}
\def\TEW@addamp{%
  \if@firstamp\@firstampfalse
  \else
    \global\advance\NumberOfColumns\@ne
    \expandafter\def\expandafter\@preamble\expandafter{\@preamble
      &\global\advance\CurrentColumn\@ne}%
  \fi
  }%
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@measure}
% Take the last row apart, unbox it, take each cell in turn
% and note its width.
%    \begin{macrocode}
\def\TEW@measure{%
  \setbox\z@\vbox{\unvbox\@ne\unskip\global\setbox\@ne\lastbox}%
  \setbox\tw@\hbox{%
    \count@\NumberOfColumns
    \unhbox\@ne
    \loop
      \unskip
      \setbox\tw@\lastbox
    \ifhbox\tw@
      \@computation{\wd\tw@}%
      \advance\count@\m@ne
    \repeat
    }%
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@firstcomp}
% The argument is stored in the database.
%    \begin{macrocode}
\def\TEW@firstcomp#1{%
Z \message{Col \the\count@: Intrinsic Width=\the#1^^J}%
  \TEW@width\xdef{\the#1}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@secondcomp}
% The argument is used to compute the excess width which is then stored
% in the database.
%    \begin{macrocode}
\def\TEW@secondcomp#1{%
  \TEW@width\dimen@
  \advance\dimen@-#1%
  \multiply\dimen@\m@ne
Z \message{Col \the\count@: Excess width=\the\dimen@^^J}%
  \TEW@width\xdef{\the\dimen@}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@width}
% A shorthand.
%    \begin{macrocode}
\def\TEW@width#1{%
  \expandafter#1\csname TEW@\the\count@\endcsname}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\@GetExcessWidth}
% Look up the excess widths database.
%    \begin{macrocode}
\def\@GetExcessWidth#1{%
  \count@\CurrentColumn
%    \end{macrocode}
% Process the optional sign. Need
% to |\relax| at the end of the assignment, to prevent the following
% token from
% being expanded too early.
%    \begin{macrocode}
  \@ifnextchar+{\advance\count@}{%
    \@ifnextchar-{\advance\count@}{\count@}}#1\relax
%    \end{macrocode}
% Check that the column exists.
%    \begin{macrocode}
  \@tempswafalse
  \ifnum\count@>\z@
    \ifnum\count@>\NumberOfColumns
    \else\@tempswatrue
    \fi\fi
%    \end{macrocode}
% Retrieve the datum.
%    \begin{macrocode}
  \if@tempswa\TEW@width\ExcessWidth
  \else\ExcessWidth\z@
    \TEW@warn{nonexistent column \the\count@, assuming EW=0pt}%
  \fi
Z \message{EW in col. \the\CurrentColumn\space references
Z   col. \the\count@: \the\ExcessWidth^^J}%
  }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\@GetExcessWidthz@}
% To be used in the first two passes, when the excess widths are still
% unknown.
%    \begin{macrocode}
\def\@GetExcessWidthz@#1{\ExcessWidth\z@}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@spew}
% A useful shorthand.
%    \begin{macrocode}
\def\TEW@spew#1#2{\GetExcessWidth{#2}\hspace{#1\ExcessWidth}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\TEW@warn}
% Warning messages.
%    \begin{macrocode}
\def\TEW@warn{%
  \PackageWarning{tabularew}}
%    \end{macrocode}
% \end{macro}

%    \begin{macrocode}
\catcode`\Z=11
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
% \PrintIndex
% \Finale
%