\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 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, || % 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 % || 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 % %<+driver>\documentclass{article} %<+driver>\usepackage{doc} %<+driver>\usepackage{eqnarray} %<+driver>\begin{document} %<+driver> \DocInput{eqnarray.dtx} %<+driver>\end{document} %\fi \endinput