fpc/docs/packages/mdwtools/mathenv.tex
1998-09-21 10:15:33 +00:00

213 lines
4.2 KiB
TeX

\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}