\def\fileversion{1.3}
\def\filedate{December 1, 2010}
\def\docdate{December 1, 2010}
%
% \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
%    Version 1.3: \def\filedate{December 1, 2010}
%                 \def\docdate{December 1, 2010}
%                 The new command \eqnnum gives customizable equation numbers.
%                 This package is published under the terms of the GPL
% \fi
%
% \title{The |equationarray| environment}
% \author{Roland Winkler\\ \normalsize
%         |rwinkler@niu.edu|}
% \date{\filedate\quad v\fileversion}
% \maketitle
% \begin{abstract}\noindent 
%   This package provides the |equationarray| environment. It combines
%   the line numbering of the |eqnarray| and the more flexible
%   formatting features of the |array| environment. It requires the
%   |array| package. 
% 
%   This package is published under the terms of the GNU General
%   Public License as published by the Free Software Foundation,
%   either version 3 of the License, or (at your option) any later
%   version.
% \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.\footnote{Nevertheless it is often easier to use the
% |equationarray*| environment than both an |equation| plus an |array|
% environment. Moreover a page break is possible between two lines of the
% |equationarray|.} If the equations aren't to be aligned with
% each other, then the |equation| environment is preferred.
%
% A first version of the |equationarray| environment was written by
% Tony Li, University of Southern California, |<tli@sargas.usc.edu>|
% starting 6/15/1988. The current version has been completely
% rewritten in order to make it compatible with Frank Mittelbach's
% |array| environment, i.e., it should be possible to use all features
% of the |array| environment. If you find a bug (see below!) or if you
% make any improvements, I'd like to hear about them.
%
% \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) & = & \psi (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) & = & \psi (0) \exp [i(E+E_0)t]
% \end{equationarray}
% %
% An |equationarray| behaves very much like an |array|. For example,
% |equationarray| accepts the same tokens for defining columns, and
% new column types can be defined with |\newcolumntype|. One can use
% |\multicolumn|, |\hline|, |\cline|, and |\vline|. Moreover,
% |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''. To decrease
%  the spacing between two columns 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 more convenient than having many lines
% with |\nonumber|.) Inside the |equationarray| and |equationarray*|
% environments, there is also the macro |\eqnnum| available. It takes
% one argument that is used as the equation number for the current
% line. The normal line number is always suppressed in such a line.
% 
% The default is that without the |fleqn| option the equations are
% centered. With the |fleqn| option they are left-justified, indented
% by |\mathindent|.\footnote{Thanks to Piet van Oostrum
%  |<piet@cs.ruu.nl>| who added the code which is necessary for the
%  |fleqn| option.} With the optional argument |[l]| or |[r]| the
% |equationarray| will appear flushleft or flushright, with the option
% |[c]| the |equationarray| will be centered, e.g.\
% |\begin{equationarray}[l]{rclll}|.
% 
% \section{Bugs}
% 
% Compared with |array| the |equationarray| uses slightly extended
% versions of |\@classz| and |\multicolumn| because it must count the
% columns. Each time you insert a |&| the counter |\@eqcnt| is
% increased by one. |\multicolumn| increases |\@eqcnt| according to
% the number of |\span|ed columns. Thus if you have an |array| within
% the |equationarray| environment and in that line of the
% |equationarray| you have less |&|'s than columns defined in the
% preamble, then the line numbering will be not flushright but further
% to the left.
% 
% In that case you can either fill up the end of the line with extra
% |&|'s (straightforward) or you can put the original definition of
% |\@classz| and |\multicolumn| within the definition of the |array|
% command.
% 
% \section{License}
% 
% This \LaTeX package is free software: you can redistribute it
% and/or modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation, either version 3 of
% the License, or (at your option) any later version.
% 
% This package is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
% 
% The GNU General Public License is available at\\
% \texttt{http://www.gnu.org/licenses/gpl.html}
%
% \section{The code}
%
%\iffalse
%<*style>
%\fi
%    \begin{macrocode}
  \typeout{equationarray \fileversion\space<\filedate>}
  % \typeout{English documentation\space\space<\docdate>}
  \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{eqnarray}
%    \end{macrocode}
% |equationarray| can't do anything if we don't have 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}%
%    \end{macrocode}
% The macro |\eqnnum| initializes |\@eqnarrnum| and suppresses
% ordinary equation numbering.
%    \begin{macrocode}
 \def\eqnnum##1{\global\@eqnswfalse\gdef\@eqnarrnum{##1}}
 \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}
% The main idea about the |equationarray| is the following: The
% counter |\@eqargcnt| counts the number of columns defined in the
% preamble. In each line of the |equationarray|, the counter
% |\@eqcnt| counts the number of |&| which have been introduced
% explicitely by the user. By comparing these counters we can
% silently fill every line of the |equationarray| with exactly
% |\@eqargcnt| copies of |&| before we insert the equation
% number. See also the \TeX book, Exercise 22.9.
%    \begin{macrocode}
\newcount\@eqargcnt  % counts number of columns
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@equationarray}
%    \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}
% \end{macro}
%
% \begin{macro}{\@eqnarrnum}
% The macro |\@eqnarrnum| holds a customized equation number.
% This macro is initialized via the macro |\eqnnum|.
%    \begin{macrocode}
\let\@eqnarrnum\relax
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@zequationcr}
% 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
%    \end{macrocode}
% Either we insert the regular equation number or the customized one.
%    \begin{macrocode}
   \if@eqnsw\@eqnnum\stepcounter{equation}\else
     \@eqnarrnum\global\let\@eqnarrnum\relax\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{eqnarray}
%<+driver>\begin{document}
%<+driver>  \DocInput{eqnarray.dtx}
%<+driver>\end{document}
%\fi
\endinput
