\def\fileversion{1.2} \def\filedate{17 May 1995} \def\docdate{17 May 1995} % % \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} % \fi % % \title{The |equationarray| environment} % \author{Roland Winkler\\ \normalsize % |roland.winkler@physik.uni-regensburg.de|} % \maketitle % \begin{abstract}\noindent % The |equationarray| combines the |eqnarray| and the |array| environment. % \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 -- but maybe nobody else might like to use it and % even this work was superfluous. 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}{@{}} % \begin{equationarray}{rclel} % \phi & = & \sum \bigg( & \frac{xxxxxxxxxx}{\phi} % \nonumber\\*[3ex] % & & & + \frac{yyyyyyyyyy}{\phi} \bigg) \\[4ex] % & = & \multicolumn{2}{l}{ \frac{zzzzzzzzzz}{\phi} } % \end{equationarray} % \end{verbatim} % % % and we obtain (usually my formulas are much longer $\ldots$) % % % \newcolumntype{e}{@{}} % \begin{equationarray}{rclel} % \phi & = & \sum \bigg( & \frac{xxxxxxxxxx}{\phi} % \nonumber\\*[3ex] % & & & + \frac{yyyyyyyyyy}{\phi} \bigg) \\[4ex] % & = & \multicolumn{2}{l}{ \frac{zzzzzzzzzz}{\phi} } % \end{equationarray} % % % One can avoid pagebreaks between two lines by using the % star-version |\\*|. There is also the star-version |equationarray*| % which has usually no linenumbers. But if for a particular line you % still want a linenumber, 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 || % 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} % % \begin{macrocode} \typeout{equationarray \fileversion\space<\filedate>} \typeout{English documentation\space\space<\docdate>} % \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 \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 pagebreaks % \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} % \endinput