123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- \documentclass{article}
- \usepackage{mdwtab}
- \errorcontextlines 999
- \showboxbreadth\maxdimen
- \showboxdepth=2
- \makeatletter
- % --- Switch allocations ---
- \newif\if@fleqn
- \newif\if@leqno
- % --- Dimen allocations ---
- \newdimen\eqa@thiscolwd
- \newdimen\eqa@maxcolwd
- \newdimen\eqa@maxeqwd
- \newdimen\eqa@maxcoleqwd
- % --- Main environments ---
- \def\equations{%
- \def\eqa@defnumber{(\theequation)\stepcounter{equation}}%
- \let\eqa@defmarker\eqa@fullmarker%
- \eqa@equations%
- }
- \def\endequations{%
- \\%
- \noalign{\global\dimen@i\prevdepth}%
- \multispan\tab@columns\hfill\vrule\@depth\dimen@i\cr%
- \egroup%
- \eqa@offsetcalc%
- \egroup%
- \eqa@restore%
- {\scrollmode\showbox\z@}%
- }
- \def\eqa@equations#1{%
- %
- % Set up restoring of things.
- %
- \toks@\expandafter{\eqa@number}%
- \toks\tw@\expandafter{\eqa@marker}%
- \edef\eqa@restore{%
- \gdef\noexpand\eqa@number{\the\toks@}%
- \gdef\noexpand\eqa@marker{\the\toks\tw@}%
- \eqa@maxcolwd\the\eqa@maxcolwd%
- \eqa@maxcoleqwd\the\eqa@maxcoleqwd%
- \eqa@maxeqwd\the\eqa@maxeqwd%
- }%
- %
- % Initialise numbering things.
- %
- \global\let\eqa@number\eqa@defnumber%
- \global\let\eqa@marker\eqa@defmarker%
- \let\eqa@markpen\@ne%
- %
- % Parse the preamble string. Put measuring things in the right places.
- %
- \tab@initread%
- \def\tab@tabtext{&\tabskip\z@skip}%
- \if@leqno%
- \tab@append\tab@preamble{\let\eqa@measure\eqa@domeasure}%
- \fi%
- \def\eqa@seteqcol##1{%
- \def\eqa@eqcol{##1}
- \if@leqno\let\eqa@seteqcol\relax\fi%
- }%
- \colset{equations}%
- \tab@doreadpream{#1}%
- \if@leqno\else%
- \tab@prepend\tab@pretext{\let\eqa@measure\eqa@domeasure}%
- \fi%
- \tab@readpreamble{}%
- %
- % Setting the newline command and some other initialisation.
- %
- \let\\\eqa@cr%
- \global\eqa@maxcolwd\z@%
- \global\eqa@maxcoleqwd\z@%
- \global\eqa@maxeqwd\z@%
- %
- % Start the box. Hacking to make \prevdepth work properly.
- %
- \setbox\z@\vbox\expandafter\bgroup%
- \expandafter\prevdepth\the\prevdepth%
- \relax%
- %
- % And now the alignment.
- %
- \tabskip\z@skip%
- \halign\expandafter\bgroup\the\tab@preamble\cr%
- }
- % --- Column building things ---
- \def\eqa@aligncol#1#2#3{%
- \eqa@seteqcol{#1}%
- \ifx l#1\eqa@aligncol@i{#2#3}{#2\hfil}\else%
- \ifx c#1\eqa@aligncol@i{\hfil#2#3}{#3#2\hfil}\else%
- \ifx r#1\eqa@aligncol@i{\hfil#2}{#3#2}%
- \fi\fi\fi%
- }
- \def\eqa@aligncol@i#1#2{%
- \tabcoltype%
- {\setbox\z@\hbox\bgroup#1}%
- {#2\egroup\eqa@measure}%
- }
- \colpush{equations}
- \coldef l{\eqa@aligncol l${{}}}
- \coldef c{\eqa@aligncol c${{}}}
- \coldef r{\eqa@aligncol r${{}}}
- \coldef M#1{\eqa@aligncol{#1}${{}}}
- \coldef T#1{\eqa@aligncol{#1}{}{}}
- \colpop
- % --- Equation measuring macros ---
- \let\eqa@number\relax
- \let\eqa@marker\relax
- \def\eqnumber#1{%
- \global\let\eqa@marker\eqa@fullmarker%
- \gdef\eqa@number{#1}%
- }
- \def\nonumber{%
- \global\let\eqa@marker\eqa@nonummarker%
- \global\let\eqa@number\@empty%
- }
- \def\eqa@measure{\unhbox\z@}
- \def\eqa@domeasure{%
- \global\eqa@thiscolwd\wd\z@%
- \ifdim\eqa@maxcolwd<\eqa@thiscolwd%
- \global\eqa@maxcolwd\eqa@thiscolwd%
- \fi%
- \unhbox\z@%
- }
- % --- The newline command ---
- \def\eqa@cr{\tab@cr\eqa@cr@i\z@\@M}
- \def\eqa@cr@i#1#2{%
- \cr%
- \noalign{%
- \eqa@marker{#1}{#2}%
- \global\let\eqa@number\eqa@defnumber%
- \global\let\eqa@marker\eqa@defmarker%
- \penalty\eqa@markpen%
- }%
- }
- \def\eqa@fullmarker#1#2{%
- \dimen@\prevdepth%
- \vskip\eqa@thiscolwd%
- \penalty#2%
- \skip@#1\advance\skip@\jot%
- \vskip\skip@%
- \setbox\z@\hbox{\eqa@number}%
- \dimen@\eqa@thiscolwd\advance\dimen@\wd\z@%
- \ifdim\dimen@\eqa@maxcoleqwd<\dimen@%
- \global\eqa@maxcoleqwd\dimen@%
- \global\eqa@maxeqwd\wd\z@%
- \fi%
- \nointerlineskip\hb@xt@\z@{\hbox{\eqa@number}}%
- \prevdepth\dimen@%
- }
- \def\eqa@nonummarker#1#2{%
- \penalty#2%
- \skip@#1\advance\skip@\jot%
- \vskip\skip@%
- \penalty\eqa@markpen%
- }
- % --- Offset calculation ---
- %
- % This stuff is sort of like the standard offset calculation, only it's
- % different.
- \def\eqa@offsetcalc{%
- \setbox\z@\lastbox%
- \unskip%
- \csname eqa@calc:\eqa@eqcol\expandafter\noexpand\if@leqno\endcsname%
- }
- \@namedef{eqa@calc:l\noexpand\iffalse}{%
-
- % --- Test document ---
- \makeatother
- \begin{document}
- \setcounter{equation}{23}
- \begin{equations}{rrl}
- x &= y^2 +& z^2 \\
- x-y &= 3y^2 -& 2z^2
- \end{equations}
- \end{document}
|