\def\fileversion{1.2a}
\def\filedate{17 July 1997}
\def\docdate{17 July 1997}
%
% \MakeShortVerb{\|}
%
% \iffalse
%    Version 1.1: \def\filedate{jan 1993}, \def\docdate{9 jan 1995}
%    Version 1.2: Piet van Oostrum <piet@cs.ruu.nl> added the code which
%                 is necessary for the |fleqn| option.
%                 \def\filedate{17 May 1995} \def\docdate{17 May 1995}
%    Version 1.2a: \def\filedate{17 July 1997}, \def\docdate{17 July 1997}
%                 Apart from a statement \RequirePackage{array} no
%                 modifications have been made in the style file itself.
%                 I improved the documentation and I packed
%                 everything into an easier-to-use dtx file
% \fi
%
% \title{The |equationarray| environment}
% \author{Roland Winkler\\ \normalsize
%         |roland.winkler@physik.uni-regensburg.de|}
% \maketitle
% \begin{abstract}\noindent
% The |equationarray| combines the line numbering of the |eqnarray|
% and the more flexible formatting features of the |array| environment.
% This package requires the |array| package.
% \end{abstract}
%
% \section{Introduction}
%
% Problem: The |eqnarray| environment is too restrictive because it is
% only prepared to accept three part equations.  Some applications
% require more sophisticated mathematics, so three parts aren't
% enough.  Simultaneously, we would like to have our equations
% numbered.  If the equations aren't to be numbered, then the |array|
% environment suffices. (Nevertheless it is often easier to use the
% |equationarray*| environment than both an |equation| plus an |array| 
% environment.)  If the equations aren't to be aligned with
% each other, then the |equation| environment is preferred.
%
% The following is a new version of Tony Li's |equationarray|
% environment modified such that it is compatible with Frank Mittelbach's
% |array| environment, i.e. it should be possible to use all options
% of the |array| environment. If you find a bug (see below!) or
% if you make any improvements, I'd like to hear about them.
%
% When writing the |equationarray| environment I used the
% version v2.1b of the |array| environment. The original version of
% |equationarray| was written by Tony Li, University of Southern
% California, tli@sargas.usc.edu starting 6/15/88.
%
% I know that my documentation of the |equationarray| environment is
% rather short. So if you think that it would be
% useful to have a better documentation please let me know.
%
%
% \section{Example}
%
% We give a short example for the use of |equationarray|. The
% text is
% %
% \begin{verbatim}
% \newcolumntype{e}{@{\quad}}
% \arraycolsep 0.2em
% \begin{equationarray}{p{2.5em}erclecercl}
% now: & - i\partial_t \psi & = & H\,\psi & \Rightarrow
% & \psi (t) & = & \psi (0) \exp (iEt) \\[3ex]
% then: & - i\partial_t \psi & = & (H+E_0) \,\psi & \Rightarrow
% & \psi (t+t_0) & = & \psi (t_0) \exp [i(E+E_0)t]
% \end{equationarray}
% \end{verbatim}
% %
% \noindent and we obtain
% %
% \newcolumntype{e}{@{\quad}}
% \arraycolsep 0.2em
% \begin{equationarray}{p{2.5em}erclecercl}
% now: & - i\partial_t \psi & = & H\,\psi & \Rightarrow
% & \psi (t) & = & \psi (0) \exp (iEt) \\[3ex]
% then: & - i\partial_t \psi & = & (H+E_0) \,\psi & \Rightarrow
% & \psi (t+t_0) & = & \psi (t_0) \exp [i(E+E_0)t]
% \end{equationarray}
% %
% An |equationarray| behaves very much like an |array|.
% For example, |equationarray| takes the same tokens for defining
% columns, and new column types can be defined with
% |\newcolumntype|. One can use |\multicolumn|, |\hline|, |\cline|,
% and |\vline|, and |equationarray| makes use of |\arraycolsep|,
% |\extracolsep|, and |\extrarowheight|.\footnote{Some people don't
% like the large spacing between the columns of the standard
% |eqnarray|. Don't be surprised that |equationarray| seems to have
% the same ``bug''. You just have to change the value of
% $\tt\backslash$|arraycolsep|, see the example above.} In an 
% |equationarray| all these things have the same meaning like in
% an |array|. The main difference is that
% by default each entry of an |equationarray| is displayed with
% |\displaystyle| whereas |array| uses |\textstyle|.
% One can avoid page breaks between two lines by using the
% star-version |\\*|. There is also the star-version |equationarray*|
% which has usually no line numbers. But if for a particular line you
% still want a line number, you can use |\yesnumber|. (I find this
% easier than many lines with |\nonumber|.) With the options |[l]|
% or |[r]| the |equationarray| will appear flushleft or flushright,
% with the options |[c]| the |equationarray| will be centered,
% e.g. |\begin{equationarray}[l]{rclll}|. The default will be centering
% without the |fleqn| option and left-justified, indented by |\mathindent|
% with the |fleqn| option. Thanks to Piet van Oostrum |<piet@cs.ruu.nl>|
% who added the code which is necessary for the |fleqn| option.
%
% \section{Bugs}
%
% The equationarray has a slightly modified version of
% |\multicolumn| because we must count the |\span|ed columns. Thus
% if you have |\multicolumn| within an |array| within the
% |equationarray| environment, then you might run into difficulties
% if you have a line with less |&|'s than columns defined in the preamble.
%
% Thus you can either fill up the end of a half empty line with
% extra |&|'s or you can put the original definition of
% |\multicolumn| within the definition of the |array| command.
% 
%  \section{The code}
%
%\iffalse
%<*style>
%\fi
%    \begin{macrocode}
\typeout{equationarray \fileversion\space<\filedate>}
\typeout{English documentation\space\space<\docdate>}
%    \end{macrocode}
%
%    |equationarray| can't do anything if one doesn't provide the
%    |array| package.
%    \begin{macrocode}
\RequirePackage{array}
%    \end{macrocode}
%
%    Process the |fleqn| option.
%    \begin{macrocode}
\def\eqnarr@left{\@centering}
\let\eqnarr@opts\relax
\DeclareOption{fleqn}{
  \def\eqnarr@left{\mathindent}
  \def\eqnarr@opts{\displaywidth\linewidth
                   \advance\displaywidth-\mathindent} }
\ProcessOptions 
%    \end{macrocode}
%
% \begin{macro}{\equationarray}
%    \begin{macrocode}
\def\equationarray{%
 \col@sep\arraycolsep
 \def\d@llarbegin{$\displaystyle}%
 \def\d@llarend{$}%
 \stepcounter{equation}%
 \let\@currentlabel=\theequation
 \set@eqnsw \global\@eqcnt\z@ \global\@eqargcnt\z@
 \let\@classz\@eqnclassz
%    \end{macrocode}
% We need an extended definition of |\multicolumn| which increases
% the counter |\@eqcnt| according to the number of columns covered
% by |\multicolumn|.
%    \begin{macrocode}
 \def\multicolumn##1##2##3{\@eqnmulticolumn{##1}{##2}{##3}%
                           \global\advance\@eqcnt##1
                           \global\advance\@eqcnt\m@ne}%
 \def\@halignto{to\displaywidth}%
 \@ifnextchar[{\@equationarray}{\@equationarray[.]}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@eqnmulticolumn}
% |\@eqnmulticolumn| equals the original version of |\multicolumn|.
%    \begin{macrocode}
\let\@eqnmulticolumn=\multicolumn
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\nonumber,\yesnumber}
% Note, that |\nonumber| is already defined in standard latex.tex
%    \begin{macrocode}
% \def\nonumber{\global\@eqnswfalse}
\def\yesnumber{\global\@eqnswtrue}
\let\set@eqnsw=\yesnumber
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@amper}
% We need a macro for |&| that expands at the right time.
%    \begin{macrocode}
\def\@amper{&}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@eqargcnt}
% We must count the number of columns defined in the preamble so
% that we can fill every line with exactly |\@eqargcnt| copies of
% |&| before we insert the equation number.
%    \begin{macrocode}
\newcount\@eqargcnt  % counts number of columns
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@equationarray}
% The definition of |\@equationarray| follows the \TeX book,
% Exercise 22.9
%    \begin{macrocode}
\def\@equationarray[#1]#2{%
     \eqnarr@opts
     \@tempdima \ht \strutbox
     \advance \@tempdima by\extrarowheight
     \setbox\@arstrutbox=\hbox{\vrule
               \@height\arraystretch \@tempdima
               \@depth\arraystretch \dp \strutbox
               \@width\z@}%
     \gdef\advance@eqargcnt{\global\advance\@eqargcnt\@ne}%
     \begingroup
     \@mkpream{#2}%
     \xdef\@preamble{%
      \if #1l\tabskip\z@ \else\if #1r\tabskip\@centering
                         \else\if #1c\tabskip\@centering
                         \else\tabskip\eqnarr@left \fi\fi\fi
      \halign \@halignto
      \bgroup \tabskip\z@ \@arstrut \@preamble
      \if #1l\tabskip\@centering \else\if #1r\tabskip\z@
                                 \else\tabskip\@centering \fi\fi
%    \end{macrocode}
%
% Here we need an extra column for the equation-number
%
%    \begin{macrocode}
      \@amper\llap{\@sharp}\tabskip\z@\cr}%
     \endgroup
     \gdef\advance@eqargcnt{}%
     \bgroup
     \let\@sharp## \let\protect\relax
     \m@th   \let\\=\@equationcr
     \let\par\@empty
     $$                            % $$ BRACE MATCHING HACK
     \lineskip \z@
     \baselineskip \z@
     \@preamble}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@eqnclassz}
% |\@eqnclassz| does the same thing as |\@classz| except that we add\\
% |\advance@eqargcnt|
%    \begin{macrocode}
\def\@eqnclassz{\@classx
   \@tempcnta \count@
   \advance@eqargcnt
   \prepnext@tok
   \@addtopreamble{%
      \global\advance\@eqcnt\@ne
      \ifcase \@chnum
      \hfil \d@llarbegin \insert@column \d@llarend\hfil \or
      \d@llarbegin \insert@column \d@llarend \hfil \or
      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or
      $\vcenter
      \@startpbox{\@nextchar}\insert@column \@endpbox $\or
      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox
      \fi}\prepnext@tok}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\endequationarray}
%    \begin{macrocode}
\def\endequationarray{\@zequationcr
   \egroup
   \global\advance\c@equation\m@ne $$  % $$ BRACE MATCHING HACK
   \egroup\global\@ignoretrue
   \gdef\@preamble{}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@equationcr}
% If we have |\\*| the command |\@equationcr| avoids page breaks
%    \begin{macrocode}
\def\@equationcr{${\ifnum0=`}\fi\@ifstar{\global\@eqpen\@M
    \@xequationcr}{\global\@eqpen\interdisplaylinepenalty
                   \@xequationcr}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@xequationcr}
%    \begin{macrocode}
\def\@xequationcr{%
    \@ifnextchar[{\@argequationcr}{\ifnum0=`{\fi}${}%
    \@zequationcr}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@argequationcr}
%    \begin{macrocode}
\def\@argequationcr[#1]{\ifnum0=`{\fi}${}\ifdim #1>\z@
   \@xargequationcr{#1}\else
   \@yargequationcr{#1}\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@xargequationcr}
%    \begin{macrocode}
\def\@xargequationcr#1{\unskip
   \@tempdima #1\advance\@tempdima \dp \@arstrutbox
   \vrule \@depth\@tempdima \@width\z@
   \@zequationcr\noalign{\penalty\@eqpen}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@yargequationcr}
%    \begin{macrocode}
\def\@yargequationcr#1{%
   \@zequationcr\noalign{\penalty\@eqpen\vskip #1}}
%    \end{macrocode}
%
% We add |&\omit| for those columns that will remain empty.
% Note that without |\omit| we already have |\advance\@eqcnt\@ne| in
% the preamble.
%
%    \begin{macrocode}
\def\@zequationcr{\@whilenum\@eqcnt <\@eqargcnt
   \do{\@amper\omit\global\advance\@eqcnt\@ne}%
%    \end{macrocode}
% We add an extra alignment tab for the equationnumber
%    \begin{macrocode}
   \@amper
   \if@eqnsw\@eqnnum\stepcounter{equation}\fi
   \set@eqnsw\global\@eqcnt\z@\cr}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\equationarray*}
% Finally we define the |equationarray*| environment. It does exactly
% the same thing as |\equationarray| except that we |\let| the command
% |\set@eqnsw| equal |\nonumber|
%    \begin{macrocode}
\@namedef{equationarray*}{%
   \let\set@eqnsw=\nonumber \equationarray}
\@namedef{endequationarray*}{\endequationarray}
%    \end{macrocode}
% \end{macro}
%\iffalse
%</style>
%<+driver>\documentclass{article}
%<+driver>\usepackage{doc}
%<+driver>\usepackage{array}
%<+driver>\usepackage{eqnarray}
%<+driver>\begin{document}
%<+driver>  \DocInput{eqnarray.dtx}
%<+driver>\end{document}
%\fi
\endinput
