infra: Expunge revision history clutter.
[mdwtools] / mdwmath.dtx
CommitLineData
86f6a31e 1% \begin{meta-comment}
2%
4a655c6f 3% $Id: mdwmath.dtx,v 1.2 2003/09/05 16:14:36 mdw Exp $
86f6a31e 4%
5% Various nicer mathematical things
6%
4a655c6f 7% (c) 2003 Mark Wooding
86f6a31e 8%
86f6a31e 9% \end{meta-comment}
10%
11% \begin{meta-comment} <general public licence>
12%%
13%% mdwmath package -- various nicer mathematical things
4a655c6f 14%% Copyright (c) 2003 Mark Wooding
86f6a31e 15%%
16%% This program is free software; you can redistribute it and/or modify
17%% it under the terms of the GNU General Public License as published by
18%% the Free Software Foundation; either version 2 of the License, or
19%% (at your option) any later version.
20%%
21%% This program is distributed in the hope that it will be useful,
22%% but WITHOUT ANY WARRANTY; without even the implied warranty of
23%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24%% GNU General Public License for more details.
25%%
26%% You should have received a copy of the GNU General Public License
27%% along with this program; if not, write to the Free Software
28%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29%%
30% \end{meta-comment}
31%
32% \begin{meta-comment} <Package preamble>
33%<+package>\NeedsTeXFormat{LaTeX2e}
34%<+package>\ProvidesPackage{mdwmath}
4a655c6f 35%<+package> [2003/08/25 1.3 Nice mathematical things]
86f6a31e 36%<+oldeqnarray>\NeedsTeXFormat{LaTeX2e}
37%<+oldeqnarray>\ProvidesPackage{eqnarray}
38%<+oldeqnarray> [1996/04/11 1.1 Old enhanced eqnarray]
39% \end{meta-comment}
40%
4a655c6f 41% \CheckSum{729}
86f6a31e 42%% \CharacterTable
43%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
44%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
45%% Digits \0\1\2\3\4\5\6\7\8\9
46%% Exclamation \! Double quote \" Hash (number) \#
47%% Dollar \$ Percent \% Ampersand \&
48%% Acute accent \' Left paren \( Right paren \)
49%% Asterisk \* Plus \+ Comma \,
50%% Minus \- Point \. Solidus \/
51%% Colon \: Semicolon \; Less than \<
52%% Equals \= Greater than \> Question mark \?
53%% Commercial at \@ Left bracket \[ Backslash \\
54%% Right bracket \] Circumflex \^ Underscore \_
55%% Grave accent \` Left brace \{ Vertical bar \|
56%% Right brace \} Tilde \~}
57%%
58%
59% \begin{meta-comment}
60%
61%<*driver>
62\input{mdwtools}
63\let\opmod\pmod
64\usepackage{amssymb}
65\describespackage{mdwmath}
4a655c6f 66%\describespackage{eqnarray}
86f6a31e 67\ignoreenv{old-eqnarray}
4a655c6f 68%\unignoreenv{old-eqnarray}
86f6a31e 69\mdwdoc
70%</driver>
71%
72% \end{meta-comment}
73%
74% \section{User guide}
75%
76% \subsection{Square root typesetting}
77%
78% \DescribeMacro{\sqrt}
79% The package supplies a star variant of the |\sqrt| command which omits the
80% vinculum over the operand (the line over the top). While this is most
81% useful in simple cases like $\sqrt*{2}$ it works for any size of operand.
82% The package also re-implements the standard square root command so that it
83% positions the root number rather better.
84%
85% \begin{figure}
86% \begin{demo}[w]{Examples of the new square root command}
87%\[ \sqrt*{2} \quad \mbox{rather than} \quad \sqrt{2} \]
88%\[ \sqrt*[3]{2} \quad \mbox{ rather than } \quad \sqrt[3]{2} \]
89%\[ \sqrt{x^3 + \sqrt*[y]{\alpha}} - \sqrt*[n+1]{a} \]
90%\[ x = \sqrt*[3]{\frac{3y}{7}} \]
91%\[ q = \frac{2\sqrt*{2}}{5}+\sqrt[\frac{n+1}{2}]{2x^2+3xy-y^2} \]
92% \end{demo}
93% \end{figure}
94%
95% [Note that omission of the vinculum was originally a cost-cutting exercise
96% because the radical symbol can just fit in next to its operand and
97% everything ends up being laid out along a line. However, I find that the
98% square root without vinculum is less cluttered, so I tend to use it when
99% it doesn't cause ambiguity.]
100%
101% \subsection{Modular arithmetic}
102%
103% In standard maths mode, there's too much space before the parentheses in
104% the output of the |\pmod| command. Suppose that $x \equiv y^2 \opmod n$:
105% then the spacing looks awful. Go on, admit it.
106%
107% It looks OK in a display. For example, if
108% \[ c \equiv m^e \opmod n \]
109% then it's fine. The package redefines the |\pmod| command to do something
110% more sensible. So now $c^d \equiv m^{ed} \equiv m \pmod n$ and all looks
111% fine.
112%
113% \subsection{Some maths symbols you already have}
114%
115% \DescribeMacro\bitor
116% \DescribeMacro\bitand
117% \DescribeMacro\dblor
118% \DescribeMacro\dbland
119% Having just tried to do some simple things, I've found that there are maths
120% symbols missing. Here they are, in all their glory:
121% \begin{center} \unverb\| \begin{tabular}{cl|cl|cl}
122% $\&$ & "\&" & $\bitor$ & "\bitor" & $\dbland$ & "\dbland" \\
123% $\bitand$ & "\bitand" & $\dblor$ & "\dblor" &
124% \end{tabular} \end{center}
125%
126% \DescribeMacro\xor
127% \DescribeMacro\cat
128% I also set up the |\xor| command to typeset `$\xor$', which is commonly
129% used to represent the bitsize exclusive-or operation among cryptographers.
130% The command |\cat| typesets `$\cat$', which is a common operator indicating
131% concatenation of strings.
132%
133% \DescribeMacro\lsl
134% \DescribeMacro\lsr
135% \DescribeMacro\rol
136% \DescribeMacro\ror
137% The commands |\lsl| and |\lsr| typeset binary operators `$\lsl$' and
138% `$\lsr$' respectively, and |\rol| and |\ror| typeset `$\rol$' and `$\ror$'.
139% Note that these are spaced as binary operators, rather than relations.
140%
141% \DescribeMacro\compose
142% \DescribeMacro\implies
143% \DescribeMacro\vect
144% The |\compose| command typesets `$\compose$', which is usually used to
145% denote function composition. The |\implies| command is made to typeset
146% `$\implies$'. And \syntax{"\\vect{"<x>"}"} typesets `$\vect{x}$'.
147%
148% \DescribeMacro\statclose
149% \DescribeMacro\compind
150% The |\statclose| command typesets `$\statclose$', which indicates
151% `statistical closeness' of probability distributions; |\compind| typesets
152% `$\compind$', which indicates computational indistinguishability.
153%
4a655c6f 154% \subsection{Fractions}
155%
156% \DescribeMacro\fracdef
157% We provide a general fraction system, a little tiny bit like
158% \package{amsmath}'s |\genfrac|. Say
159% \syntax{"\\fracdef{"<name>"}{"<frac-params>"}"} to define a new
160% |\frac|-like operator. The \<frac-params> are a comma-separated list of
161% parameters:
162% \begin{description}
163% \item[\lit*{line}] Include a horizontal line between the top and bottom
164% (like |\frac|).
165% \item[\lit*{line=}\<length>] Include a horizontal line with width
166% \<length>.
167% \item[\lit*{noline}] Don't include a line (like |\binom|).
168% \item[\lit*{leftdelim=}\<delim>] Use \<delim> as the left-hand delimiter.
169% \item[\lit*{rightdelim=}\<delim>] Use \<delim> as the right-hand delimiter.
170% \item[\lit*{nodelims}] Don't include delimiters.
171% \item[\lit*{style=}\<style>] Typeset the fraction in \<style>, which is one
172% of |display|, |text|, |script| or |scriptscript|.
173% \item[\lit*{style}] Use the prevailing style for the fraction.
174% \item[\lit*{innerstyle=}\<style>] Typeset the \emph{components} of the
175% fraction in \<style>.
176% \item[\lit*{innerstyle}] Typeset the fraction components according to the
177% prevailing style.
178% \end{description}
179% The commands created by |\fracdef| have the following syntax:
180% \syntax{<name>"["<frac-params>"]{"<top>"}{"<bottom>"}"}. Thus, you can use
181% the optional argument to `tweak' the fraction if necessary. This isn't
182% such a good idea to do often.
183%
184% \DescribeMacro\frac
185% \DescribeMacro\binom
86f6a31e 186% \DescribeMacro\jacobi
4a655c6f 187% The macros |\frac|, |\binom| and |\jacobi| are defined using |\fracdef|.
188% They typset $\frac{x}{y}$, $\binom{n}{k}$ and $\jacobi{x}{n}$ respectively.
189% (The last may be of use to number theorists talking about Jacobi or
190% Lagrange symbols.)
191%
192% By way of example, these commands were defined using
193%\begin{verbatim}
194%\fracdef\frac{nodelims, line}
195%\fracdef\binom{leftdelim = (, rightdelim = ), noline}
196%\fracdef\jacobi{leftdelim = (, rightdelim = ), line}
197%\end{verbatim}
86f6a31e 198%
199% \subsection{Rant about derivatives}
200%
201% \DescribeMacro\d
202% There is a difference between UK and US typesetting of derivatives.
203% Americans typeset
204% \[ \frac{dy}{dx} \]
205% while the British want
206% \[ \frac{\d y}{\d x}. \]
4a655c6f 207% The command |\d| command is fixed to typeset a `$\d$'. (In text mode,
208% |\d{x}| still typesets `\d{x}'.)
86f6a31e 209%
210% \subsection{New operator names}
211%
212% \DescribeMacro\keys
213% \DescribeMacro\dom
214% \DescribeMacro\ran
215% \DescribeMacro\supp
216% \DescribeMacro\lcm
4a655c6f 217% \DescribeMacro\ord
218% \DescribeMacro\poly
219% \DescribeMacro\negl
86f6a31e 220% A few esoteric new operator names are supplied.
221% \begin{center} \unverb\| \begin{tabular}{cl|cl|cl}
222% $\keys$ & "\keys" & $\dom$ & "\dom" & $\ran$ & "\ran" \\
4a655c6f 223% $\supp$ & "\supp" & $\lcm$ & "\lcm" & $\ord$ & "\ord" \\
224% $\poly$ & "\poly" & $\negl$ & "\negl"
86f6a31e 225% \end{tabular} \end{center}
226% I think |\lcm| ought to be self-explanatory. The |\dom| and |\ran|
227% operators pick out the domain and range of a function, respectively; thus,
228% if $F\colon X \to Y$ is a function, then $\dom F = X$ and $\ran F = Y$.
229% The \emph{support} of a probability distribution $\mathcal{D}$ is the set
230% of objects with nonzero probability; i.e., $\supp{D} = \{\, x \in
4a655c6f 231% \dom\mathcal{D} \mid \mathcal{D}(x) > 0 \,\}$. If $g \in G$ is a group
232% element then $\ord g$ is the \emph{order} of $g$; i.e., the smallest
233% positive integer $i$ where $g^i$ is the identity element, or $0$ if there
234% is no such $i$. $\poly(n)$ is some polynomial function of $n$. A function
235% $\nu(\cdot)$ is \emph{negligible} if, for every polynomial function
236% $p(\cdot)$, there is an integer $N$ such that $\nu(n) < 1/p(n)$ for all $n
237% > N$; $\negl(n)$ is some negligible function of $n$.
86f6a31e 238%
239% \subsection{Standard set names}
240%
241% \DescribeMacro\Z
242% \DescribeMacro\Q
243% \DescribeMacro\R
244% \DescribeMacro\C
245% \DescribeMacro\N
246% \DescribeMacro\F
247% \DescribeMacro\powerset
4a655c6f 248% \DescribeMacro\gf
86f6a31e 249% If you have a |\mathbb| command defined, the following magic is revealed:
250% \begin{center} \unverb\| \begin{tabular}{cl|cl|cl}
251% $\Z$ & "\Z" & $\Q$ & "\Q" & $\R$ & "\R" \\
252% $\N$ & "\N" & $\F$ & "\F" & $\C$ & "\C"
253% \end{tabular} \end{center}
254% which are handy for various standard sets of things. Also the |\powerset|
4a655c6f 255% command typesets `$\powerset$', and \syntax{"\\gf{"<q>"}"}, which by default
256% typesets $\gf{\syntax{<q>}}$ but you might choose to have it set
257% $\mathrm{GF}(\syntax{<q>})$ intead.
258%
259% \subsection{Biggles}
260%
261% \DescribeMacro\bbigg
262% \DescribeMacro\bbiggl
263% \DescribeMacro\bbiggr
264% \DescribeMacro\bbiggm
265% The |\bbigg| commands generalizes the Plain \TeX\ |\bigg| family of
266% macros. |\bbigg| produces an `ordinary' symbol; |\bbiggl| and |\bbiggr|
267% produce left and right delimiters; and |\bbiggm| produces a relation. They
268% produce symbols whose size is related to the prevailing text size -- so
269% they adjust correctly in chapter headings, for example.
270%
271% The syntax is straightforward:
272% \syntax{"\\"<bigop>"["$a$"]{"$n$"}{"<delim>"}"}. Describing it is a bit
273% trickier. The size is based on the current |\strut| height. If |\strut|
274% has a height of $h$ and a depth of $d$, then the delimiter produced has a
275% height of $n \times (h + d + a)$.
276%
277% The old |\big| commands have been redefined in terms of |\bbigg|.
86f6a31e 278%
279% \subsection{The `QED' symbol}
280%
281% \DescribeMacro\qed
282% \DescribeMacro\qedrule
283% For use in proofs of theorems, we provide a `QED' symbol which behaves well
284% under bizarre line-splitting conditions. To use it, just say |\qed|. The
285% little `\qedrule' symbol is available on its own, by saying |\qedrule|.
286% This also sets |\qedsymbol| if it's not set already.
287% \qed
288%
289% \begin{ignore}
290% There used to be an eqnarray here, but that's migrated its way into the
291% \package{mdwtab} package. Maybe the original version, without dependency
292% on \package{mdwtab} ought to be releasable separately. I'll keep it around
293% just in case.
294%
295% The following is the documentation for the original version. There's an
296% updated edition in \package{mdwtab}.
297% \end{ignore}
298%
299% \begin{old-eqnarray}
300%
301% \subsection{A new \env{eqnarray} environment}
302%
303% \LaTeX's built-in \env{eqnarray} is horrible -- it puts far too much space
304% between the items in the array. This environment is rather nearer to the
305% \env{amsmath} \env{align} environments, although rather less capable.
306%
307% \bigskip
308% \DescribeEnv{eqnarray}
309% {\synshorts
310% \setbox0\hbox{"\\begin{eqnarray}["<preamble>"]" \dots "\\end{eqnarray}"}
311% \leavevmode \hskip-\parindent \fbox{\box0}
312% }
313% \smallskip
314%
315% The new version of \env{eqnarray} tries to do everything which you really
316% want it to. The \synt{preamble} string allows you to define the column
317% types in a vaguely similar way to the wonderful \env{tabular} environment.
318% The types provided (and it's easy-ish to add more) are:
319%
320% \def\ch{\char`}
321% \begin{description} \def\makelabel{\hskip\labelsep\normalfont\ttfamily}
322% \item [r] Right aligned equation
323% \item [c] Centre-aligned equation
324% \item [l] Left aligned equation
325% \item [\textrm{\texttt{Tr}, \texttt{Tc} and \texttt{Tl}}] Right, centre and
326% left aligned text (not maths)
327% \item [L] Left aligned zero-width equation
328% \item [x] Centred entire equation
329% \item [:] Big gap separating sets of equations
330% \item [q] Quad space
331% \item [>\ch\{\synt{text}\ch\}] Insert text before column
332% \item [<\ch\{\synt{text}\ch\}] Insert text after column
333% \end{description}
334%
335% Some others are also defined: don't use them because they do complicated
336% things which are hard to explain and they aren't much use anyway.
337%
338% The default preamble, if you don't supply one of your own, is \lit{rcl}.
339% Most of the time, \lit{rl} is sufficient, although compatibility is more
340% important to me.
341%
342% By default, there is no space between columns, which makes formul\ae\ in an
343% \env{eqnarray} environment look just like formul\ae\ typeset on their own,
344% except that things get aligned in columns. This is where the default
345% \env{eqnarray} falls down: it leaves |\arraycolsep| space between each
346% column making the thing look horrible.
347%
348% An example would be good here, I think. This one's from exercise 22.9 of
349% the \textit{\TeX book}.
350%
351% \begin{demo}[w]{Simultaneous equations}
352%\begin{eqnarray}[rcrcrcrl]
353% 10w & + & 3x & + & 3y & + & 18z & = 1 \\
354% 6w & - & 17x & & & - & 5z & = 2
355%\end{eqnarray}
356% \end{demo}
357%
358% Choosing a more up-to-date example, here's one demonstrating the \lit{:}
359% column specifier from the \textit{\LaTeX\ Companion}.
360%
361% \begin{demo}[w]{Lots of equations}
362%\begin{eqnarray}[rl:rl:l]
363% V_i &= v_i - q_i v_j, & X_i &= x_i - q_i x_j, &
364% U_i = u_i, \qquad \mbox{for $i \ne j$} \label{eq:A} \\
365% V_j &= v_j, & X_j &= x_j &
366% U_j u_j + \sum_{i \ne j} q_i u_i.
367%\end{eqnarray}
368% \end{demo}
369%
370% We can make things more interesting by adding a plain text column. Here we
371% go:
372%
373% \begin{demo}[w]{Plain text column}
374%\begin{eqnarray}[rlqqTl]
375% x &= y & by (\ref{eq:A}) \\
376% x' &= y' & by definition \\
377% x + x' &= y + y' & by Axiom~1
378%\end{eqnarray}
379% \end{demo}
380%
381% The new features also mean that you don't need to mess about with
382% |\lefteqn| any more. This is handled by the \lit{L} column type:
383%
384% \begin{demo}{Splitting example}
385%\begin{eqnarray*}[Ll]
386% w+x+y+z = \\
4a655c6f 387% & a+b+c+d+e+{} \\
86f6a31e 388% & f+g+h+i+j
389%\end{eqnarray*}
390% \end{demo}
391%
392% Finally, just to prove that the spacing's right at last, here's another one
393% from the \textit{Companion}.
394%
395% \begin{demo}{Spacing demonstration}
396%\begin{equation}
397% x^2 + y^2 = z^2
398%\end{equation}
399%\begin{eqnarray}[rl]
400% x^2 + y^2 &= z^2 \\
401% y^2 &< z^2
402%\end{eqnarray}
403% \end{demo}
404%
405% Well, that was easy enough. Now on to numbering. As you've noticed, the
406% equations above are numbered. You can use the \env{eqnarray$*$}
407% environment to turn off the numbering in the whole environment, or say
408% |\nonumber| on a line to suppress numbering of that one in particular.
409% More excitingly, you can say \syntax{"\\nonumber["<text>"]"} to choose
410% what text to display.
411%
412% A note for cheats: you can use the sparkly new \env{eqnarray} for simple
413% equations simply by specifying \lit{x} as the column description. Who
414% needs \AmSTeX? |;-)|
415%
416% \end{old-eqnarray}
417%
418% \implementation
419%
420% \section{Implementation}
421%
422% This isn't really complicated (honest) although it is a lot hairier than I
423% think it ought to be.
424%
425% \begin{macrocode}
426%<*package>
4a655c6f 427\RequirePackage{amssymb}
428\RequirePackage{mdwkey}
86f6a31e 429% \end{macrocode}
430%
431% \subsection{Square roots}
432%
433% \subsubsection{Where is the square root sign?}
434%
435% \LaTeX\ hides the square root sign away somewhere without telling anyone
436% where it is. I extract it forcibly by peeking inside the |\sqrtsign| macro
437% and scrutinising the contents. Here we go: prepare for yukkiness.
438%
439% \begin{macrocode}
440\newcount\sq@sqrt \begingroup \catcode`\|0 \catcode`\\12
441|def|sq@readrad#1"#2\#3|relax{|global|sq@sqrt"#2|relax}
442|expandafter|sq@readrad|meaning|sqrtsign|relax |endgroup
443\def\sq@delim{\delimiter\sq@sqrt\relax}
444% \end{macrocode}
445%
446% \subsubsection{Drawing fake square root signs}
447%
448% \TeX\ absolutely insists on drawing square root signs with a vinculum over
449% the top. In order to get the same effect, we have to attempt to emulate
450% \TeX's behaviour.
451%
452% \begin{macro}{\sqrtdel}
453%
454% This does the main job of typesetting a vinculum-free radical.\footnote{^^A
455% Note for chemists: this is nothing to do with short-lived things which
456% don't have their normal numbers of electrons. And it won't reduce the
457% appearance of wrinkles either.}
458% It's more or less a duplicate of what \TeX\ does internally, so it might be
459% a good plan to have a copy of Appendix~G open while you examine this.
460%
461% We start off by using |\mathpalette| to help decide how big things should
462% be.
463%
464% \begin{macrocode}
465\def\sqrtdel{\mathpalette\sqrtdel@i}
466% \end{macrocode}
467%
468% Read the contents of the radical into a box, so we can measure it.
469%
470% \begin{macrocode}
471\def\sqrtdel@i#1#2{%
472 \setbox\z@\hbox{$\m@th#1#2$}% %%% Bzzzt -- uncramps the mathstyle
473% \end{macrocode}
474%
475% Now try and sort out the values needed in this calculation. We'll assume
476% that $\xi_8$ is 0.6\,pt, the way it usually is. Next try to work out the
477% value of $\varphi$.
478%
479% \begin{macrocode}
480 \ifx#1\displaystyle%
481 \@tempdima1ex%
482 \else%
483 \@tempdima.6\p@%
484 \fi%
485% \end{macrocode}
486%
487% That was easy. Now for $\psi$.
488%
489% \begin{macrocode}
490 \@tempdimb.6\p@%
491 \advance\@tempdimb.25\@tempdima%
492% \end{macrocode}
493%
494% Build the `delimiter' in a box of height $h(x)+d(x)+\psi+\xi_8$, as
495% requested. Box~2 will do well for this purpose.
496%
497% \begin{macrocode}
498 \dimen@.6\p@%
499 \advance\dimen@\@tempdimb%
500 \advance\dimen@\ht\z@%
501 \advance\dimen@\dp\z@%
502 \setbox\tw@\hbox{%
503 $\left\sq@delim\vcenter to\dimen@{}\right.\n@space$%
504 }%
505% \end{macrocode}
506%
507% Now we need to do some more calculating (don't you hate it?). As far as
508% Appendix~G is concerned, $\theta=h(y)=0$, because we want no rule over the
509% top.
510%
511% \begin{macrocode}
512 \@tempdima\ht\tw@%
513 \advance\@tempdima\dp\tw@%
514 \advance\@tempdima-\ht\z@%
515 \advance\@tempdima-\dp\z@%
516 \ifdim\@tempdima>\@tempdimb%
517 \advance\@tempdima\@tempdimb%
518 \@tempdimb.5\@tempdima%
519 \fi%
520% \end{macrocode}
521%
522% Work out how high to raise the radical symbol. Remember that Appendix~G
523% thinks that the box has a very small height, although this is untrue here.
524%
525% \begin{macrocode}
526 \@tempdima\ht\z@%
527 \advance\@tempdima\@tempdimb%
528 \advance\@tempdima-\ht\tw@%
529% \end{macrocode}
530%
531% Build the output (finally). The brace group is there to turn the output
532% into a mathord, one of the few times that this is actually desirable.
533%
534% \begin{macrocode}
535 {\raise\@tempdima\box\tw@\vbox{\kern\@tempdimb\box\z@}}%
536}
537% \end{macrocode}
538%
539% \end{macro}
540%
541% \subsubsection{The new square root command}
542%
543% This is where we reimplement all the square root stuff. Most of this stuff
544% comes from the \PlainTeX\ macros, although some is influenced by \AmSTeX\
545% and \LaTeXe, and some is original. I've tried to make the spacing vaguely
546% automatic, so although it's not configurable like \AmSTeX's version, the
547% output should look nice more of the time. Maybe.
548%
549% \begin{macro}{\sqrt}
550%
551% \LaTeX\ says this must be robust, so we make it robust. The first thing to
552% do is to see if there's a star and pass the appropriate squareroot-drawing
553% command on to the rest of the code.
554%
555% \begin{macrocode}
556\DeclareRobustCommand\sqrt{\@ifstar{\sqrt@i\sqrtdel}{\sqrt@i\sqrtsign}}
557% \end{macrocode}
558%
559% Now we can sort out an optional argument to be displayed on the root.
560%
561% \begin{macrocode}
562\def\sqrt@i#1{\@ifnextchar[{\sqrt@ii{#1}}{\sqrt@iv{#1}}}
563% \end{macrocode}
564%
565% Stages~2 and~3 below are essentially equivalents of \PlainTeX's
566% |\root|\dots|\of| and |\r@@t|. Here we also find the first wrinkle: the
567% |\rootbox| used to store the number is spaced out on the left if necessary.
568% There's a backspace after the end so that the root can slip underneath, and
569% everything works out nicely. Unfortunately size is fixed here, although
570% doesn't actually seem to matter.
571%
572% \begin{macrocode}
573\def\sqrt@ii#1[#2]{%
574 \setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#2}$}%
575 \ifdim\wd\rootbox<6\p@%
576 \setbox\rootbox\hb@xt@6\p@{\hfil\unhbox\rootbox}%
577 \fi%
578 \mathpalette{\sqrt@iii{#1}}%
579}
580% \end{macrocode}
581%
582% Now we can actually build everything. Note that the root is raised by its
583% depth -- this prevents a common problem with letters with descenders.
584%
585% \begin{macrocode}
586\def\sqrt@iii#1#2#3{%
587 \setbox\z@\hbox{$\m@th#2#1{#3}$}%
588 \dimen@\ht\z@%
589 \advance\dimen@-\dp\z@%
590 \dimen@.6\dimen@%
591 \advance\dimen@\dp\rootbox%
592 \mkern-3mu%
593 \raise\dimen@\copy\rootbox%
594 \mkern-10mu%
595 \box\z@%
596}
597% \end{macrocode}
598%
599% Finally handle a non-numbered root. We read the rooted text in as an
600% argument, to stop problems when people omit the braces. (\AmSTeX\ does
601% this too.)
602%
603% \begin{macrocode}
604\def\sqrt@iv#1#2{#1{#2}}
605% \end{macrocode}
606%
607% \end{macro}
608%
609% \begin{macro}{\root}
610%
611% We also re-implement \PlainTeX's |\root| command, just in case someone uses
612% it, and supply a star-variant. This is all very trivial.
613%
614% \begin{macrocode}
615\def\root{\@ifstar{\root@i\sqrtdel}{\root@i\sqrtsign}}
616\def\root@i#1#2\of{\sqrt@ii{#1}[#2]}
617% \end{macrocode}
618%
619% \end{macro}
620%
621% \subsection{Modular programming}
622%
623% \begin{macro}{\pmod}
624%
625% Do some hacking if not |\ifouter|.
626%
627% \begin{macrocode}
628\def\pmod#1{%
629 \ifinner\;\else\allowbreak\mkern18mu\fi%
630 ({\operator@font mod}\,\,#1)%
631}
632% \end{macrocode}
633%
634% \end{macro}
635%
636% \subsection{Some magic new maths characters}
637%
638% \begin{macro}{\bitor}
639% \begin{macro}{\bitand}
640% \begin{macro}{\dblor}
641% \begin{macro}{\dbland}
642% \begin{macro}{\xor}
643% \begin{macro}{\lor}
644% \begin{macro}{\ror}
645% \begin{macro}{\lsl}
646% \begin{macro}{\lsr}
647%
648% The new boolean operators.
649%
650% \begin{macrocode}
651\DeclareMathSymbol{&}{\mathbin}{operators}{`\&}
652\DeclareMathSymbol{\bitand}{\mathbin}{operators}{`\&}
653\def\bitor{\mathbin\mid}
654\def\dblor{\mathbin{\mid\mid}}
655\def\dbland{\mathbin{\mathrel\bitand\mathrel\bitand}}
656\let\xor\oplus
657\def\lsl{\mathbin{<\!\!<}}
658\def\lsr{\mathbin{>\!\!>}}
659\def\rol{\mathbin{<\!\!<\!\!<}}
660\def\ror{\mathbin{>\!\!>\!\!>}}
661\AtBeginDocument{\ifx\lll\@@undefined\else
662 \def\lsl{\mathbin{\ll}}
663 \def\lsr{\mathbin{\gg}}
664 \def\rol{\mathbin{\lll}}
665 \def\ror{\mathbin{\ggg}}
666\fi}
667% \end{macrocode}
668%
669% \end{macro}
670% \end{macro}
671% \end{macro}
672% \end{macro}
673% \end{macro}
674% \end{macro}
675% \end{macro}
676% \end{macro}
677% \end{macro}
678%
679% \begin{macro}{\cat}
680% \begin{macro}{\compose}
681% \begin{macro}{\implies}
682% \begin{macro}{\vect}
683% \begin{macro}{\d}
684% \begin{macro}{\jacobi}
685%
686% A mixed bag of stuff.
687%
688% \begin{macrocode}
689\def\cat{\mathbin{\|}}
690\let\compose\circ
691\def\implies{\Rightarrow}
692\def\vect#1{\mathord{\mathbf{#1}}}
4a655c6f 693\def\d{%
694 \ifmmode\mathord{\operator@font d}%
695 \else\expandafter\a\expandafter d\fi%
696}
86f6a31e 697\def\jacobi#1#2{{{#1}\overwithdelims()#2}}
698% \end{macrocode}
699%
700% \end{macro}
701% \end{macro}
702% \end{macro}
703% \end{macro}
704% \end{macro}
705% \end{macro}
706%
707% \begin{macro}{\statclose}
708% \begin{macro}{\compind}
709%
710% Fancy new relations for probability distributions.
711%
712% \begin{macrocode}
713\def\statclose{\mathrel{\mathop{=}\limits^{\scriptscriptstyle s}}}
714\def\compind{\mathrel{\mathop{\approx}\limits^{\scriptscriptstyle c}}}
715% \end{macrocode}
716%
717% \end{macro}
718% \end{macro}
719%
720% \begin{macro}{\keys}
721% \begin{macro}{\dom}
722% \begin{macro}{\ran}
723% \begin{macro}{\supp}
724% \begin{macro}{\lcm}
4a655c6f 725% \begin{macro}{\poly}
726% \begin{macro}{\negl}
727% \begin{macro}{\ord}
86f6a31e 728%
729% And the new operator names.
730%
731% \begin{macrocode}
732\def\keys{\mathop{\operator@font keys}\nolimits}
733\def\dom{\mathop{\operator@font dom}\nolimits}
734\def\ran{\mathop{\operator@font ran}\nolimits}
735\def\supp{\mathop{\operator@font supp}\nolimits}
736\def\lcm{\mathop{\operator@font lcm}\nolimits}
4a655c6f 737\def\poly{\mathop{\operator@font poly}\nolimits}
738\def\negl{\mathop{\operator@font negl}\nolimits}
739\def\ord{\mathop{\operator@font ord}\nolimits}
86f6a31e 740% \end{macrocode}
741%
742% \end{macro}
743% \end{macro}
744% \end{macro}
745% \end{macro}
746% \end{macro}
4a655c6f 747% \end{macro}
748% \end{macro}
749% \end{macro}
750%
751% \subsection{Fractions}
752%
753% \begin{macro}{\@frac@parse}
754%
755% \syntax{"\\@frac@parse{"<stuff>"}{"<frac-params>"}"} -- run \<stuff>
756% passing it three arguments: an infix fraction-making command, the `outer'
757% style, and the `inner' style.
758%
759% This is rather tricky. We clear a load of parameters, parse the parameter
760% list, and then build a token list containing the right stuff. Without the
761% token list fiddling, we end up expanding things at the wrong times -- for
762% example, |\{| expands to something terribly unpleasant in a document
763% preamble.
764%
765% All of the nastiness is contained in a group.
766%
767% \begin{macrocode}
768\def\@frac@parse#1#2{%
769 \begingroup%
770 \let\@wd\@empty\def\@ldel{.}\def\@rdel{.}%
771 \def\@op{over}\let\@dim\@empty\@tempswafalse%
772 \let\@is\@empty\let\@os\@empty%
773 \mkparse{mdwmath:frac}{#2}%
774 \toks\tw@{\endgroup#1}%
775 \toks@\expandafter{\csname @@\@op\@wd\endcsname}%
776 \if@tempswa%
777 \toks@\expandafter{\the\expandafter\toks@\@ldel}%
778 \toks@\expandafter{\the\expandafter\toks@\@rdel}%
779 \fi%
780 \expandafter\toks@\expandafter{\the\expandafter\toks@\@dim}%
781 \toks@\expandafter{\the\toks\expandafter\tw@\expandafter{\the\toks@}}
782 \toks@\expandafter{\the\expandafter\toks@\expandafter{\@os}}
783 \toks@\expandafter{\the\expandafter\toks@\expandafter{\@is}}
784 \the\toks@%
785}
786% \end{macrocode}
787%
788% The keyword definitions are relatively straightforward now. The error
789% handling for \textsf{style} and \textsf{innerstyle} could do with
790% improvement.
791%
792% \begin{macrocode}
793\def\@frac@del#1#2{\def\@wd{withdelims}\@tempswatrue\def#1{#2}}
794\mkdef{mdwmath:frac}{leftdelim}{\@frac@del\@ldel{#1}}
795\mkdef{mdwmath:frac}{rightdelim}{\@frac@del\@rdel{#1}}
796\mkdef{mdwmath:frac}{nodelims}*{\let\@wd\@empty\@tempswafalse}
797\mkdef{mdwmath:frac}{line}{%
798 \def\@op{above}\setlength\dimen@{#1}\edef\@dim{\the\dimen@\space}%
799}
800\mkdef{mdwmath:frac}{line}*{\def\@op{over}\let\@dim\@empty}
801\mkdef{mdwmath:frac}{noline}*{\def\@op{atop}\let\@dim\@empty}
802\def\@frac@style#1#2{%
803 \ifx\q@delim#2\q@delim\let#1\@empty%
804 \else%
805 \expandafter\ifx\csname #2style\endcsname\relax%
806 \PackageError{mdwmath}{Bad maths style `#2'}\@ehc%
807 \else%
808 \edef#1{\csname#2style\endcsname}%
809 \fi%
810 \fi%
811}
812\mkdef{mdwmath:frac}{style}[]{\@frac@style\@os{#1}}
813\mkdef{mdwmath:frac}{innerstyle}[]{\@frac@style\@is{#1}}
814% \end{macrocode}
815%
816% \end{macro}
817%
818% \begin{macro}{\fracdef}
819%
820% Here's where the rest of the pain is. We do a preliminary parse of the
821% parameters and `compile' the result into the output macro. If there's no
822% optional argument, then we don't need to do any really tedious formatting
823% at the point of use.
824%
825% \begin{macrocode}
826\def\fracdef#1#2{\@frac@parse{\fracdef@i{#1}{#2}}{#2}}
827\def\fracdef@i#1#2#3#4#5{\def#1{\@frac@do{#2}{#3}{#4}{#5}}}
828\def\@frac@do#1#2#3#4{%
829 \@ifnextchar[{\@frac@complex{#1}}{\@frac@simple{#2}{#3}{#4}}%
830}
831\def\@frac@complex#1[#2]{\@frac@parse\@frac@simple{#1,#2}}
832\def\@frac@simple#1#2#3#4#5{{#2{{#3#4}#1{#3#5}}}}
833% \end{macrocode}
834%
835% \end{macro}
836%
837% \begin{macro}{\frac@fix}
838% \begin{macro}{\@@over}
839% \begin{macro}{\@@atop}
840% \begin{macro}{\@@above}
841% \begin{macro}{\@@overwithdelims}
842% \begin{macro}{\@@atopwithdelims}
843% \begin{macro}{\@@abovewithdelims}
844%
845% Finally, we need to fix up |\@@over| and friends. Maybe \package{amsmath}
846% has hidden the commands away somewhere unhelpful. If not, we make the
847% requisite copies.
848%
849% \begin{macrocode}
850\def\q@delim{\q@delim}
851\def\frac@fix#1{\expandafter\frac@fix@i\string#1\q@delim}
852\def\frac@fix@i#1#2\q@delim{\frac@fix@ii{#2}\frac@fix@ii{#2withdelims}}
853\def\frac@fix@ii#1{%
854 \expandafter\ifx\csname @@#1\endcsname\relax%
855 \expandafter\let\csname @@#1\expandafter\endcsname\csname#1\endcsname%
856 \fi%
857}
858\frac@fix\over \frac@fix\atop \frac@fix\above
859% \end{macrocode}
860%
861% \end{macro}
862% \end{macro}
863% \end{macro}
864% \end{macro}
865% \end{macro}
866% \end{macro}
867% \end{macro}
868%
869% \begin{macro}{\frac}
870% \begin{macro}{\binom}
871% \begin{macro}{\jacobi}
872%
873% And finally, we define the fraction-making commands.
874%
875% \begin{macrocode}
876\fracdef\frac{nodelims, line}
877\fracdef\binom{leftdelim = (, rightdelim = ), noline}
878\fracdef\jacobi{leftdelim = (, rightdelim = ), line}
879% \end{macrocode}
880%
881% \end{macro}
882% \end{macro}
883% \end{macro}
86f6a31e 884%
885% \subsection{Blackboard bold stuff}
886%
887% \begin{macro}{\Z}
888% \begin{macro}{\Q}
889% \begin{macro}{\R}
890% \begin{macro}{\C}
891% \begin{macro}{\N}
892% \begin{macro}{\F}
893% \begin{macro}{\powerset}
4a655c6f 894% \begin{macro}{\gf}
86f6a31e 895%
896% First of all, the signs.
897%
898% \begin{macrocode}
899\def\Z{\mathbb{Z}}
900\def\Q{\mathbb{Q}}
901\def\R{\mathbb{R}}
902\def\C{\mathbb{C}}
903\def\N{\mathbb{N}}
904\def\F{\mathbb{F}}
905\def\powerset{\mathbb{P}}
4a655c6f 906\def\gf#1{\F_{#1}}
907%\def\gf#1{\mathrm{GF}({#1})}
86f6a31e 908% \end{macrocode}
909%
910% \end{macro}
911% \end{macro}
912% \end{macro}
913% \end{macro}
914% \end{macro}
915% \end{macro}
916% \end{macro}
4a655c6f 917% \end{macro}
86f6a31e 918%
919% And now, define |\mathbb| if it's not there already.
920%
921% \begin{macrocode}
922\AtBeginDocument{\ifx\mathbb\@@undefined\let\mathbb\mathbf\fi}
923% \end{macrocode}
924%
925% \subsection{Biggles}
926%
927% Now for some user-controlled delimiter sizing. The standard bigness of
928% plain \TeX's delimiters are all right, but it's a little limiting.
929%
930% The biggness of delimiters is based on the size of the current |\strut|,
931% which \LaTeX\ keeps up to date all the time. This will make the various
932% delimiters grow in proportion when the text gets bigger. Actually, I'm
933% not sure that this is exactly right -- maybe it should be nonlinear,
934%
935% \begin{macro}{\bbigg}
936% \begin{macro}{\bbiggl}
937% \begin{macro}{\bbiggr}
938% \begin{macro}{\bbiggm}
939%
940% This is where the bigness is done. This is more similar to the plain \TeX\
941% big delimiter stuff than to the \package{amsmath} stuff, although there's
942% not really a lot of difference.
943%
944% The two arguments are a multiplier for the delimiter size, and a small
945% increment applied \emph{before} the multiplication (which is optional).
946%
947% This is actually a front for a low-level interface which can be called
948% directly for efficiency.
949%
950% \begin{macrocode}
951\def\bbigg{\@bbigg\mathord} \def\bbiggl{\@bbigg\mathopen}
952\def\bbiggr{\@bbigg\mathclose} \def\bbiggm{\@bbigg\mathrel}
953% \end{macrocode}
954%
955% \end{macro}
956% \end{macro}
957% \end{macro}
958% \end{macro}
959%
960% \begin{macro}{\@bbigg}
961%
962% This is an optional argument parser providing a front end for the main
963% macro |\bbigg@|.
964%
965% \begin{macrocode}
966\def\@bbigg#1{\@ifnextchar[{\@bigg@i{#1}}{\@bigg@i{#1}[\z@]}}
967\def\@bigg@i#1[#2]#3#4{#1{\bbigg@{#2}{#3}{#4}}}
968% \end{macrocode}
969%
970% \end{macro}
971%
972% \begin{macro}{\bbigg@}
973%
974% This is it, at last. The arguments are as described above: an addition
975% to be made to the strut height, and a multiplier. Oh, and the delimiter,
976% of course.
977%
978% This is a bit messy. The smallest `big' delimiter, |\big|, is the same
979% height as the current strut box. Other delimiters are~$1\frac12$, $2$
980% and~$2\frac12$ times this height. I'll set the height of the delimiter by
981% putting in a |\vcenter| of the appropriate size.
982%
983% Given an extra height~$x$, a multiplication factor~$f$ and a strut
984% height~$h$ and depth~$d$, I'll create a vcenter with total height
985% $f(h+d+x)$. Easy, isn't it?
986%
987% \begin{macrocode}
988\def\bbigg@#1#2#3{%
989 {\hbox{$%
990 \dimen@\ht\strutbox\advance\dimen@\dp\strutbox%
991 \advance\dimen@#1%
992 \dimen@#2\dimen@%
993 \left#3\vcenter to\dimen@{}\right.\n@space%
994 $}}%
995}
996% \end{macrocode}
997%
998% \end{macro}
999%
1000% \begin{macro}{\big}
1001% \begin{macro}{\Big}
1002% \begin{macro}{\bigg}
1003% \begin{macro}{\Bigg}
1004%
1005% Now for the easy macros.
1006%
1007% \begin{macrocode}
1008\def\big{\bbigg@\z@\@ne}
1009\def\Big{\bbigg@\z@{1.5}}
1010\def\bigg{\bbigg@\z@\tw@}
1011\def\Bigg{\bbigg@\z@{2.5}}
1012% \end{macrocode}
1013%
1014% \end{macro}
1015% \end{macro}
1016% \end{macro}
1017% \end{macro}
1018%
1019% \subsection{The `QED' symbol}
1020%
1021% \begin{macro}{\qed}
1022% \begin{macro}{\qedrule}
1023% \begin{macro}{\qedsymbol}
1024%
1025% This is fairly simple. Just be careful will the glue and penalties. The
1026% size of the little box is based on the current font size.
1027%
1028% The horizontal list constructed by the macro is like this:
1029%
1030% \begin{itemize}
1031% \item A |\quad| of space. This might get eaten if there's a break here or
1032% before. That's OK, though.
1033% \item An empty box, to break a run of discardable items.
1034% \item A |\penalty 10000| to ensure that the spacing glue isn't discarded.
1035% \item |\hfill| glue to push the little rule to the end of the line.
1036% \item A little square rule `\qedrule', with some small kerns around it.
1037% \item A glue item to counter the effect of glue added at the paragraph
1038% boundary.
1039% \end{itemize}
1040%
4a655c6f 1041% The vertical mode case is simpler, but less universal. It copes with
1042% relatively simple cases only.
1043%
86f6a31e 1044% A |\qed| commend ends the paragraph.
1045%
1046% \begin{macrocode}
4a655c6f 1047\def\qed{%
1048 \ifvmode%
1049 \unskip%
1050 \setbox\z@\hb@xt@\linewidth{\hfil\strut\qedsymbol}%
1051 \prevdepth-\@m\p@%
1052 \ifdim\prevdepth>\dp\strutbox%
1053 \dimen@\prevdepth\advance\dimen@-\dp\strutbox%
1054 \kern-\dimen@%
1055 \fi%
1056 \penalty\@M\vskip-\baselineskip\box\z@%
1057 \else%
1058 \unskip%
1059 \penalty\@M\hfill%
1060 \hbox{}\penalty200\quad%
1061 \hbox{}\penalty\@M\hfill\qedsymbol\hskip-\parfillskip\par%
1062 \fi%
86f6a31e 1063}
1064\def\qedrule{{%
1065 \dimen@\ht\strutbox%
4a655c6f 1066 \advance\dimen@\dp\strutbox%
86f6a31e 1067 \dimen@ii1ex%
1068 \advance\dimen@-\dimen@ii%
1069 \divide\dimen@\tw@%
1070 \advance\dimen@-\dp\strutbox%
1071 \advance\dimen@\dimen@ii%
1072 \advance\dimen@ii-\dimen@%
1073 \kern\p@%
1074 \vrule\@width1ex\@height\dimen@\@depth\dimen@ii%
1075 \kern\p@%
1076}}
1077\providecommand\qedsymbol{\qedrule}
1078% \end{macrocode}
1079%
1080% \end{macro}
1081% \end{macro}
1082% \end{macro}
1083%
1084% \begin{ignore}
1085% The following is the original definition of the enhanced eqnarray
1086% environment. It's not supported, although if you can figure out how to
1087% extract it, it's all yours.
1088% \end{ignore}
1089%
1090% \begin{old-eqnarray}
1091%
1092% \subsection{The sparkly new \env{eqnarray}}
1093%
1094% Start off by writing a different package.
1095%
1096% \begin{macrocode}
1097%</package>
1098%<*oldeqnarray>
1099% \end{macrocode}
1100%
1101% \subsubsection{Options handling}
1102%
1103% We need to be able to cope with \textsf{fleqn} and \textsf{leqno} options.
1104% This will adjust our magic modified \env{eqnarray} environment
1105% appropriately.
1106%
1107% \begin{macrocode}
1108\newif\if@fleqn
1109\newif\if@leqno
1110\DeclareOption{fleqn}{\@fleqntrue}
1111\DeclareOption{leqno}{\@leqnotrue}
1112\ProcessOptions
1113% \end{macrocode}
1114%
1115% This is all really different to the \LaTeX\ version. I've looked at the
1116% various \env{tabular} implementations, the original \env{eqnarray} and the
1117% \textit{\TeX book} to see how best to do this, and then went my own way.
1118% If it doesn't work it's all my fault.
1119%
1120% \subsubsection{Some useful registers}
1121%
1122% The old \LaTeX\ version puts the equation numbers in by keeping a count of
1123% where it is in the alignment. Since I don't know how may columns there are
1124% going to be, I'll just use a switch in the preamble to tell me to stop
1125% tabbing.
1126%
1127% \begin{macrocode}
1128\newif\if@eqalast
1129% \end{macrocode}
1130%
1131% Now define some useful length parameters. First allocate them:
1132%
1133% \begin{macrocode}
1134\newskip\eqaopenskip
1135\newskip\eqacloseskip
1136\newskip\eqacolskip
1137\newskip\eqainskip
1138% \end{macrocode}
1139%
1140% Now assign some default values. Users can play with these if they really
1141% want although I can't see the point myself.
1142%
1143% \begin{macrocode}
1144\if@fleqn
1145 \AtBeginDocument{\eqaopenskip\leftmargini}
1146\else
1147 \eqaopenskip\@centering
1148\fi
1149\eqacloseskip\@centering
1150\eqacolskip\@centering
1151\eqainskip\z@
1152% \end{macrocode}
1153%
1154% We allow the user to play with the style if this is really wanted. I dunno
1155% why, really. Maybe someone wants very small alignments.
1156%
1157% \begin{macrocode}
1158\let\eqa@style\displaystyle
1159% \end{macrocode}
1160%
1161% \subsubsection{The main environments}
1162%
1163% We define the toplevel commands here. They just add in default arguments
1164% and then call |\@eqnarray| with a preamble string. The only difference is
1165% the last column they add in -- \env{eqnarray$*$} throws away the last
1166% column by sticking it in box~0. (I used to |\@gobble| it but that caused
1167% the |\cr| to be lost.)
1168%
1169% \begin{macrocode}
1170\def\eqnarray{\@ifnextchar[\eqnarray@i{\eqnarray@i[rcl]}}
1171\def\eqnarray@i[#1]{%
1172 \@eqnarray{#1!{\hb@xt@\z@{\hss##}\tabskip\z@}}
1173}
1174\@namedef{eqnarray*}{\@ifnextchar[\eqnarray@s@i{\eqnarray@s@i[rcl]}}
1175\def\eqnarray@s@i[#1]{%
1176 \@eqnarray{#1!{\nonumber\setbox\z@\hbox{##}\tabskip\z@}}%
1177}
1178% \end{macrocode}
1179%
1180% \subsubsection{Set up the initial display}
1181%
1182% \begin{macro}{\@eqnarray}
1183%
1184% The |\@eqnarray| command does most of the initial work. It sets up some
1185% flags and things, builds the |\halign| preamble, and returns.
1186%
1187% \begin{macrocode}
1188\def\@eqnarray#1{%
1189% \end{macrocode}
1190%
1191% Start playing with the counter here. The original does some icky internal
1192% playing, which isn't necessary. The |\if@eqnsw| switch is |true| if the
1193% user hasn't supplied an equation number. The |\if@eqalast| switch is
1194% |true| in the final equation-number column.
1195%
1196% \begin{macrocode}
1197 \refstepcounter{equation}%
1198 \@eqalastfalse%
1199 \global\@eqnswtrue%
1200 \m@th%
1201% \end{macrocode}
1202%
1203% Set things up for the |\halign| which is coming up.
1204%
1205% \begin{macrocode}
1206 \openup\jot%
1207 \tabskip\eqaopenskip%
1208 \let\\\@eqncr%
1209 \everycr{}%
1210 $$%
1211% \end{macrocode}
1212%
1213% We'll build the real |\halign| and preamble in a token register. All we
1214% need to do is stuff the header in the token register, clear a switch
1215% (that'll be explained later), parse the preamble and then expand the
1216% tokens we collected. Easy, no?
1217%
1218% \begin{macrocode}
1219 \toks@{\halign to\displaywidth\bgroup}%
1220 \@tempswafalse%
1221 \eqa@preamble#1\end%
1222 \the\toks@\cr%
1223}
1224% \end{macrocode}
1225%
1226% \end{macro}
1227%
1228% \subsubsection{Parsing the preamble}
1229%
1230% All this actually involves is reading the next character and building a
1231% command from it. That can pull off an argument if it needs it. Just make
1232% sure we don't fall off the end and we'll be OK.
1233%
1234% \begin{macrocode}
1235\def\eqa@preamble#1{%
1236 \ifx\end#1\else\csname eqa@char@#1\expandafter\endcsname\fi%
1237}
1238% \end{macrocode}
1239%
1240% Adding stuff to the preamble tokens is a simple matter of using
1241% |\expandafter| in the correct way.\footnote{^^A
1242% I have no idea why \LaTeX\ uses \cmd\edef\ for building its preamble. It
1243% seems utterly insane to me -- the amount of bodgery that \env{tabular}
1244% has to go through to make everything expand at the appropriate times is
1245% scary. Maybe Messrs~Lamport and Mittelbach just forgot about token
1246% registers when they were writing the code. Maybe I ought to rewrite the
1247% thing properly some time. Sigh.
1248%
1249% As a sort of postscript to the above, I \emph{have} rewritten the
1250% \env{tabular} environment, and made a damned fine job of it, in my
1251% oh-so-humble opinion. All this \env{eqnarray} stuff has been remoulded
1252% in terms of the generic column-defining things in \package{mdwtab}.
1253% You're reading the documentation of the old version, which isn't
1254% supported any more, so any bugs here are your own problem.}
1255%
1256% \begin{macrocode}
1257\def\eqa@addraw#1{\expandafter\toks@\expandafter{\the\toks@#1}}
1258% \end{macrocode}
1259%
1260% Now for some cleverness again. In order to put all the right bits of
1261% |\tabskip| glue in the right places we must \emph{not} terminate each
1262% column until we know what the next one is. We set |\if@tempswa| to be
1263% |true| if there's a column waiting to be closed (so it's initially
1264% |false|). The following macro adds a column correctly, assuming we're in
1265% a formula. Other column types make their own arrangements.
1266%
1267% \begin{macrocode}
1268\def\eqa@add#1{%
1269 \if@tempswa%
1270 \eqa@addraw{\tabskip\eqainskip&#1}%
1271 \else%
1272 \eqa@addraw{#1}%
1273 \fi%
1274 \@tempswatrue%
1275}
1276% \end{macrocode}
1277%
1278% Now to defining column types. Let's define a macro which allows us to
1279% define column types:
1280%
1281% \begin{macrocode}
1282\def\eqa@def#1{\expandafter\def\csname eqa@char@#1\endcsname}
1283% \end{macrocode}
1284%
1285% Now we can define the column types. Each column type must loop back to
1286% |\eqa@preamble| once it's finished, to read the rest of the preamble
1287% string. Note the positioning of ord atoms in the stuff below. This will
1288% space out relations and binops correctly when they occur at the edges of
1289% columns, and won't affect ord atoms at the edges, because ords pack
1290% closely.
1291%
1292% First the easy onces. Just stick |\hfil| in the right places and
1293% everything will be all right.
1294%
1295% \begin{macrocode}
1296\eqa@def r{\eqa@add{\hfil$\eqa@style##{}$}\eqa@preamble}
1297\eqa@def c{\eqa@add{\hfil$\eqa@style{}##{}$\hfil}\eqa@preamble}
1298\eqa@def l{\eqa@add{$\eqa@style{}##$\hfil}\eqa@preamble}
1299\eqa@def x{\eqa@add{\hfil$\eqa@style##$\hfil}\eqa@preamble}
1300% \end{macrocode}
1301%
1302% Now for the textual ones. This is also fairly easy.
1303%
1304% \begin{macrocode}
1305\eqa@def T#1{%
1306 \eqa@add{}%
1307 \if#1l\else\eqa@addraw{\hfil}\fi%
1308 \eqa@addraw{##}%
1309 \if#1r\else\eqa@addraw{\hfil}\fi%
1310 \eqa@preamble%
1311}
1312% \end{macrocode}
1313%
1314% Sort of split types of equations. I mustn't use |\rlap| here, or
1315% everything goes wrong -- |\\| doesn't get noticed by \TeX\ in the same way
1316% as |\cr| does.
1317%
1318% \begin{macrocode}
1319\eqa@def L{\eqa@add{\hb@xt@\z@{$\eqa@style##$\hss}\qquad}\eqa@preamble}
1320% \end{macrocode}
1321%
1322% The \lit{:} column type is fairly simple. We set |\tabskip| up to make
1323% lots of space and close the current column, because there must be one.^^A
1324% \footnote{This is an assumption.}
1325%
1326% \begin{macrocode}
1327\eqa@def :{%
1328 \eqa@addraw{\tabskip\eqacolskip&}\@tempswafalse\eqa@preamble%
1329}
1330\eqa@def q{\eqa@add{\quad}\@tempswafalse\eqa@preamble}
1331% \end{macrocode}
1332%
1333% The other column types just insert given text in an appropriate way.
1334%
1335% \begin{macrocode}
1336\eqa@def >#1{\eqa@add{#1}\@tempswafalse\eqa@preamble}
1337\eqa@def <#1{\eqa@addraw{#1}\eqa@preamble}
1338% \end{macrocode}
1339%
1340% Finally, the magical \lit{!} column type, which sets the equation number.
1341% We set up the |\tabskip| glue properly, tab on, and set the flag which
1342% marks the final column.
1343%
1344% \begin{macrocode}
1345\eqa@def !#1{%
1346 \eqa@addraw{\tabskip\eqacloseskip&\@eqalasttrue#1}\eqa@preamble%
1347}
1348% \end{macrocode}
1349%
1350% \subsubsection{Newline codes}
1351%
1352% Newline sequences (|\\|) get turned into calls of |\@eqncr|. The job is
1353% fairly simple, really. However, to avoid reading `|&|' characters
1354% prematurely, we set up a magic brace (from the \package{array} package --
1355% this avoids creating ord atoms and other nastyness).
1356%
1357% \begin{macrocode}
1358\def\@eqncr{%
1359 \iffalse{\fi\ifnum0=`}\fi%
1360 \@ifstar{\eqacr@i{\@M}}{\eqacr@i{\interdisplaylinepenalty}}%
1361}
1362\def\eqacr@i#1{\@ifnextchar[{\eqacr@ii{#1}}{\eqacr@ii{#1}[\z@]}}
1363\def\eqacr@ii#1[#2]{%
1364 \ifnum0=`{}\fi%
1365 \eqa@eqnum%
1366 \noalign{\penalty#1\vskip#2\relax}%
1367}
1368% \end{macrocode}
1369%
1370% \subsubsection{Setting equation numbers}
1371%
1372% Before we start, we need to generalise the flush-left number handling bits.
1373% The macro |\eqa@eqpos| will put its argument in the right place.
1374%
1375% \begin{macrocode}
1376\if@leqno
1377 \def\eqa@eqpos#1{%
1378 \hb@xt@.01\p@{}\rlap{\normalfont\normalcolor\hskip-\displaywidth#1}%
1379 }
1380\else
1381 \def\eqa@eqpos#1{\normalfont\normalcolor#1}
1382\fi
1383% \end{macrocode}
1384%
1385% First we need to move into the right column. Then we just set the equation
1386% number appropriately. There is some subtlety here, ish. The |\relax| is
1387% important, to delay expansion of the |\if|\dots\ until the new column has
1388% been started. The two helper macros are important too, to hide `|&|'s and
1389% `|\cr|'s from \TeX's scanner until the right time.
1390%
1391% \begin{macrocode}
1392\def\eqa@eqnum{%
1393 \relax%
1394 \if@eqalast\expandafter\eqa@eqnum@i\else\expandafter\eqa@eqnum@ii\fi%
1395}
1396\def\eqa@eqnum@i{%
1397 \if@eqnsw%
1398 \eqa@eqpos{(\theequation)}\stepcounter{equation}%
1399 \else%
1400 \eqa@eqpos\eqa@number%
1401 \fi%
1402 \global\@eqnswtrue%
1403 \cr%
1404}
1405\def\eqa@eqnum@ii{&\eqa@eqnum}
1406% \end{macrocode}
1407%
1408% \subsubsection{Numbering control}
1409%
1410% This is trivial. We set the |\if@eqnsw| flag to be |false| and store the
1411% text in a macro.
1412%
1413% \begin{macrocode}
1414\let\nonumber\relax
1415\newcommand\nonumber[1][]{\global\@eqnswfalse\global\def\eqa@number{#1}}
1416% \end{macrocode}
1417%
1418% \subsubsection{Closing the environments off}
1419%
1420% This is really easy. Set the final equation number, close the |\halign|,
1421% tidy up the equation counter (it's been stepped once too many times) and
1422% close the display.
1423%
1424% \begin{macrocode}
1425\def\endeqnarray{%
1426 \eqa@eqnum%
1427 \egroup%
1428 \global\advance\c@equation\m@ne%
1429 $$%
1430 \global\@ignoretrue%
1431}
1432\expandafter\let\csname endeqnarray*\endcsname\endeqnarray
1433% \end{macrocode}
1434%
1435% Now start up the other package again.
1436%
1437% \begin{macrocode}
1438%</oldeqnarray>
1439%<*package>
1440% \end{macrocode}
1441%
1442% \end{old-eqnarray}
1443%
1444% That's all there is. Byebye.
1445%
1446% \begin{macrocode}
1447%</package>
1448% \end{macrocode}
1449%
1450% \hfill Mark Wooding, \today
1451%
1452% \Finale
1453\endinput