| 1 | % \begin{meta-comment} |
| 2 | % |
| 3 | % $Id: mdwmath.dtx,v 1.2 2003/09/05 16:14:36 mdw Exp $ |
| 4 | % |
| 5 | % Various nicer mathematical things |
| 6 | % |
| 7 | % (c) 2003 Mark Wooding |
| 8 | % |
| 9 | % \end{meta-comment} |
| 10 | % |
| 11 | % \begin{meta-comment} <general public licence> |
| 12 | %% |
| 13 | %% mdwmath package -- various nicer mathematical things |
| 14 | %% Copyright (c) 2003 Mark Wooding |
| 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} |
| 35 | %<+package> [2003/08/25 1.3 Nice mathematical things] |
| 36 | %<+oldeqnarray>\NeedsTeXFormat{LaTeX2e} |
| 37 | %<+oldeqnarray>\ProvidesPackage{eqnarray} |
| 38 | %<+oldeqnarray> [1996/04/11 1.1 Old enhanced eqnarray] |
| 39 | % \end{meta-comment} |
| 40 | % |
| 41 | % \CheckSum{729} |
| 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} |
| 66 | %\describespackage{eqnarray} |
| 67 | \ignoreenv{old-eqnarray} |
| 68 | %\unignoreenv{old-eqnarray} |
| 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 | % |
| 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 |
| 186 | % \DescribeMacro\jacobi |
| 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} |
| 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}. \] |
| 207 | % The command |\d| command is fixed to typeset a `$\d$'. (In text mode, |
| 208 | % |\d{x}| still typesets `\d{x}'.) |
| 209 | % |
| 210 | % \subsection{New operator names} |
| 211 | % |
| 212 | % \DescribeMacro\keys |
| 213 | % \DescribeMacro\dom |
| 214 | % \DescribeMacro\ran |
| 215 | % \DescribeMacro\supp |
| 216 | % \DescribeMacro\lcm |
| 217 | % \DescribeMacro\ord |
| 218 | % \DescribeMacro\poly |
| 219 | % \DescribeMacro\negl |
| 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" \\ |
| 223 | % $\supp$ & "\supp" & $\lcm$ & "\lcm" & $\ord$ & "\ord" \\ |
| 224 | % $\poly$ & "\poly" & $\negl$ & "\negl" |
| 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 |
| 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$. |
| 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 |
| 248 | % \DescribeMacro\gf |
| 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| |
| 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|. |
| 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 = \\ |
| 387 | % & a+b+c+d+e+{} \\ |
| 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> |
| 427 | \RequirePackage{amssymb} |
| 428 | \RequirePackage{mdwkey} |
| 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}}} |
| 693 | \def\d{% |
| 694 | \ifmmode\mathord{\operator@font d}% |
| 695 | \else\expandafter\a\expandafter d\fi% |
| 696 | } |
| 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} |
| 725 | % \begin{macro}{\poly} |
| 726 | % \begin{macro}{\negl} |
| 727 | % \begin{macro}{\ord} |
| 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} |
| 737 | \def\poly{\mathop{\operator@font poly}\nolimits} |
| 738 | \def\negl{\mathop{\operator@font negl}\nolimits} |
| 739 | \def\ord{\mathop{\operator@font ord}\nolimits} |
| 740 | % \end{macrocode} |
| 741 | % |
| 742 | % \end{macro} |
| 743 | % \end{macro} |
| 744 | % \end{macro} |
| 745 | % \end{macro} |
| 746 | % \end{macro} |
| 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} |
| 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} |
| 894 | % \begin{macro}{\gf} |
| 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}} |
| 906 | \def\gf#1{\F_{#1}} |
| 907 | %\def\gf#1{\mathrm{GF}({#1})} |
| 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} |
| 917 | % \end{macro} |
| 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 | % |
| 1041 | % The vertical mode case is simpler, but less universal. It copes with |
| 1042 | % relatively simple cases only. |
| 1043 | % |
| 1044 | % A |\qed| commend ends the paragraph. |
| 1045 | % |
| 1046 | % \begin{macrocode} |
| 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% |
| 1063 | } |
| 1064 | \def\qedrule{{% |
| 1065 | \dimen@\ht\strutbox% |
| 1066 | \advance\dimen@\dp\strutbox% |
| 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}% |
| 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 |