% \iffalse
%% File: delarray.dtx Copyright (C) 1991-1994 David Carlisle
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{delarray}
%<package>         [1994/03/14 v1.01 array delimiter package (DPC)]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{delarray}
\GetFileInfo{delarray.sty}
\begin{document}
\title{The \textsf{delarray} package\thanks{This file
        has version number \fileversion, last
        revised \filedate.}}
\author{David Carlisle\\carlisle@cs.man.ac.uk}
\date{\filedate}
 \maketitle
 \DocInput{delarray.dtx}
\end{document}
%</driver>
% \fi
%
%
% \changes{v1.00}{1992/07/06}
%    {Initial version after merging of newarray.sty to array.sty}
%
% \changes{v1.01}{1994/03/14}
%    {Update to LaTeX2e}
%
% \CheckSum{64}
%
% \section{Examples}
%
%
% The addition to {\tt array.sty} added in {\tt delarray.sty} is
% a system of implicit |\left| |\right| pairs. If you want an array
% surrounded by parentheses, you can enter:\\
% |\begin{array}({cc})| \ldots
% \[  \begin{array}({cc})a&b\\c&d\end{array}   \]
%
% Similarly if an environment equivalent to \PlainTeX's |\cases| could
% be defined by:\\
% |\begin{array}\{{lL}.| \ldots
%
% \newcolumntype{L}{>{$}l<{$}}
% \[  f(x)=\begin{array}\{{lL}.
%           0        &if $x=0$\\
%           \sin(x)/x&otherwise
%           \end{array}  \]
% Here |L| is supposed to denote a column of left aligned L-R text. It
% may be defined via: |\newcolumntype{L}{>{$}l<{$}}|, as discussed in
% {\tt array.sty}.
% Note that as the delimiters must always be used in pairs, the  `|.|'
% must be used to denote a  `null delimiter'.
%
% This feature is especially useful if the |[t]| or |[b]|
% arguments are also used. In these cases the result is not equivalent
% to surrounding the environment by |\left|\ldots|\right|, as
% can be seen from the following example:
% \[
% \begin{array}[t]({c}) 1\\2\\3 \end{array}
% \begin{array}[c]({c}) 1\\2\\3 \end{array}
% \begin{array}[b]({c}) 1\\2\\3 \end{array}
% \quad\mbox{not}\quad
% \left(\begin{array}[t]{c} 1\\2\\3 \end{array}\right)
% \left(\begin{array}[c]{c} 1\\2\\3 \end{array}\right)
% \left(\begin{array}[b]{c} 1\\2\\3 \end{array}\right)
% \]
% \begin{verbatim}
% \begin{array}[t]({c}) 1\\2\\3 \end{array}
% \begin{array}[c]({c}) 1\\2\\3 \end{array}
% \begin{array}[b]({c}) 1\\2\\3 \end{array}
% \quad\mbox{not}\quad
% \left(\begin{array}[t]{c} 1\\2\\3 \end{array}\right)
% \left(\begin{array}[c]{c} 1\\2\\3 \end{array}\right)
% \left(\begin{array}[b]{c} 1\\2\\3 \end{array}\right)
% \end{verbatim}
%
%
% \StopEventually{}
%
% \section{The Macros}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{array}[1994/02/03]
%    \end{macrocode}
%
% \begin{macro}{\@tabarray}
%    This macro tests for an optional bracket and then calls up
%    |\@@array| or |\@@array[c]| (as default).
%    \begin{macrocode}
\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@@array}
%    This macro tests for an optional delimiter before the left brace
%    of the main preamble argument. If there is no delimiter,
%    |\@arrayleft| and |\@arrayright| are made a no-ops, and
%    |\@array| is called with the positional argument. Otherwise
%    call |\@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.
%    \begin{macrocode}
\def\@del@array[#1]#2#3#4{%
%    \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
% |\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
% |\@arrayright| puts the alignment and the delimiters together.
%    \begin{macrocode}
  \setbox\z@\hbox{$\left#2\right#4$}%
%    \end{macrocode}
% In the case of a `c' argument we do not need to rebox the alignment,
% so we can define |\@arrayleft| and |\@arrayright| just to
% insert the delimiters.
%    \begin{macrocode}
  \if#1c\def\@arrayleft{\left#2}\def\@arrayright{\right#4}%
%    \end{macrocode}
% Otherwise we (should) have a {\tt[t]} or {\tt[b]} argument, so first we
% store the alignment, without delimiters in box0.
%    \begin{macrocode}
  \else\def\@arrayleft{\setbox\z@}%
%    \end{macrocode}
% Then after the alignment is finished:
%    \begin{macrocode}
  \def\@arrayright{%
%    \end{macrocode}
% Calculate the amount the box needs to be lowered (this will be
% negative in the case of |[b]|). A little bit of arithmetic cf.\
% the \TeX{}Book, 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 |\delimitershortfall| or
% |\delimiterfactor| have non-standard values.
%    \begin{macrocode}
     \dimen@=\dp\z@
     \advance\dimen@-\ht\z@
     \divide \dimen@ by \tw@
     \advance\dimen@ by\fontdimen22 \textfont\tw@
%    \end{macrocode}
% Now lower the alignment and the delimiters into place.
%    \begin{macrocode}
     \lower\dimen@\hbox{$\left#2\vcenter{\unvbox\z@}\right#4$}}%
%    \end{macrocode}
% End the |\if#1c|
%    \begin{macrocode}
  \fi
%    \end{macrocode}
% Now that we have defined |\@arrayleft| and |\@arrayright|, call
% |\@array|.
%    \begin{macrocode}
  \@array[#1]{#3}}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
%
% \subsection{newarray.sty}
% All the features of the old {\tt newarray} style option have been
% merged into the {\tt array} or {\tt delarray} options.
% \changes{v1.00}{1992/07/06}
%    {Stop generating a `shell' newarray.sty}
%
%
% \Finale
\endinput
