home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / unixtex-6.1b-bin0.lha / lib / texmf / tex / plain / eplain.tex next >
Encoding:
Text File  |  1996-10-12  |  75.6 KB  |  2,302 lines

  1. %% @texfile{
  2. %%   author = "Karl Berry",
  3. %%   version = "2.6",
  4. %%   date = "Mon May  2 07:48:18 EDT 1994",
  5. %%   filename = "eplain.tex",
  6. %%   email = "karl@cs.umb.edu",
  7. %%   address = "135 Center Hill Rd. // Plymouth, MA 02360"
  8. %%   checksum = "2301    5656   77376",
  9. %%   codetable = "ISO/ASCII",
  10. %%   supported = "yes",
  11. %%   docstring = "This file defines macros that extend and expand on
  12. %%                plain TeX. eplain.tex is eplain.tex and the other
  13. %%                source files with comments stripped; see the original
  14. %%                files for author credits, etc.  And please base diffs
  15. %%                or other contributions on eplain.tex, not the
  16. %%                stripped-down eplain.tex.",
  17. %% }
  18. \def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
  19. \chardef\letter = 11
  20. \chardef\other = 12
  21. \edef\leftdisplays{\the\catcode`@}%
  22. \catcode`@ = \letter
  23. \let\@eplainoldatcode = \leftdisplays
  24. \toksdef\toks@ii = 2
  25. \def\uncatcodespecials{%
  26.    \def\do##1{\catcode`##1 = \other}%
  27.    \dospecials
  28. }%
  29. {%
  30.    \makeactive\^^M %
  31.    \long\gdef\letreturn#1{\let^^M = #1}%
  32. }%
  33. \let\@eattoken = \relax  % Define this, so \eattoken can be used in \edef.
  34. \def\eattoken{\let\@eattoken = }%
  35. \def\gobble#1{}%
  36. \def\gobbletwo#1#2{}%
  37. \def\gobblethree#1#2#3{}%
  38. \def\identity#1{#1}%
  39. \def\ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}%
  40. \def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
  41. \def\@gobblemeaning#1:->{}%
  42. \def\sanitize{\expandafter\@gobblemeaning\meaning}%
  43. \def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}%
  44. \def\csn#1{\csname#1\endcsname}%
  45. \def\ece#1#2{\expandafter#1\csname#2\endcsname}%
  46. \def\expandonce{\expandafter\noexpand}%
  47. \let\@plainwlog = \wlog
  48. \let\wlog = \gobble
  49. \newlinechar = `^^J
  50. \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
  51. \def\loggingall{\tracingcommands\tw@\tracingstats\tw@
  52.    \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
  53.    \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
  54.    \showboxbreadth\maxdimen\showboxdepth\maxdimen
  55. }%
  56. \def\tracingboxes{\showboxbreadth = \maxdimen \showboxdepth = \maxdimen}%
  57. \def\gtracingoff{\begingroup \globaldefs = 1 \tracingoff \endgroup}%
  58. \def\tracingoff{\tracingonline\z@\tracingcommands\z@\tracingstats\z@
  59.   \tracingpages\z@\tracingoutput\z@\tracinglostchars\z@
  60.   \tracingmacros\z@\tracingparagraphs\z@\tracingrestores\z@
  61.   \showboxbreadth5 \showboxdepth3
  62. }%
  63. \begingroup
  64.   \catcode`\{ = 12 \catcode`\} = 12
  65.   \catcode`\[ = 1 \catcode`\] = 2
  66.   \gdef\lbracechar[{]%
  67.   \gdef\rbracechar[}]%
  68.   \catcode`\% = \other
  69.   \gdef\percentchar[%]\endgroup
  70. \def^^L{\par}%
  71. \def\vpenalty{\ifhmode\par\fi \penalty}%
  72. \def\hpenalty{\ifvmode\leavevmode\fi \penalty}%
  73. \def\iterate{%
  74.   \let\next\relax
  75.   \body
  76.   \let\next\iterate
  77.   \fi
  78.   \next
  79. }%
  80. \def\edefappend#1#2{%
  81.   \toks@ = \expandafter{#1}%
  82.   \edef#1{\the\toks@ #2}%
  83. }%
  84. \long\def\hookprepend{\@hookassign{\the\toks@ii \the\toks@}}%
  85. \long\def\hookappend{\@hookassign{\the\toks@ \the\toks@ii}}%
  86. \let\hookaction = \hookappend % either one should be ok
  87. \long\def\@hookassign#1#2#3{%
  88.   \expandafter\ifx\csname @#2hook\endcsname \relax
  89.     \toks@ = {}%
  90.   \else
  91.     \expandafter\let\expandafter\temp \csname @#2hook\endcsname
  92.     \toks@ = \expandafter{\temp}%
  93.   \fi
  94.   \toks2 = {#3}% Don't expand the argument all the way.
  95.   \ece\edef{@#2hook}{#1}%
  96. }%
  97. \long\def\hookactiononce#1#2{%
  98.   \edefappend#2{\global\let\noexpand#2\relax}
  99.   \hookaction{#1}#2%
  100. }%
  101. \def\hookrun#1{%
  102.   \expandafter\ifx\csname @#1hook\endcsname \relax \else
  103.     \def\temp{\csname @#1hook\endcsname}%
  104.     \expandafter\temp
  105.   \fi
  106. }%
  107. \def\setproperty#1#2#3{\ece\edef{#1@p#2}{#3}}%
  108. \def\getproperty#1#2{%
  109.   \expandafter\ifx\csname#1@p#2\endcsname\relax
  110.   \else \csname#1@p#2\endcsname
  111.   \fi
  112. }%
  113. \ifx\@undefinedmessage\@undefined
  114.   \def\@undefinedmessage
  115.     {No .aux file; I won't warn you about undefined labels.}%
  116. \fi
  117. %% @texfile{
  118. %%   author = "Karl Berry and Oren Patashnik",
  119. %%   version = "0.99j",
  120. %%   date = "14 Mar 1992",
  121. %%   filename = "btxmac.tex",
  122. %%   address = "Please use electronic mail",
  123. %%   checksum = "834    4503   33061",
  124. %%   email = "opbibtex@cs.stanford.edu",
  125. %%   codetable = "ISO/ASCII",
  126. %%   supported = "yes",
  127. %%   docstring = "Defines macros that make BibTeX work with plain TeX",
  128. %% }
  129. \edef\cite{\the\catcode`@}%
  130. \catcode`@ = 11
  131. \let\@oldatcatcode = \cite
  132. \chardef\@letter = 11
  133. \chardef\@other = 12
  134. \def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}%
  135. \@innerdef\@innernewcount{newcount}%
  136. \@innerdef\@innernewdimen{newdimen}%
  137. \@innerdef\@innernewif{newif}%
  138. \@innerdef\@innernewwrite{newwrite}%
  139. \def\@gobble#1{}%
  140. \ifx\inputlineno\@undefined
  141.    \let\@linenumber = \empty % Pre-3.0.
  142. \else
  143.    \def\@linenumber{\the\inputlineno:\space}%
  144. \fi
  145. \def\@futurenonspacelet#1{\def\cs{#1}%
  146.    \afterassignment\@stepone\let\@nexttoken=
  147. }%
  148. \begingroup % The grouping here avoids stepping on an outside use of `\\'.
  149. \def\\{\global\let\@stoken= }%
  150. \\ % now \@stoken is a space token (\\ is a control symbol, so that
  151. \endgroup
  152. \def\@stepone{\expandafter\futurelet\cs\@steptwo}%
  153. \def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree
  154.    \else\let\@@next=\@nexttoken\fi \@@next}%
  155. \def\@stepthree{\afterassignment\@stepone\let\@@next= }%
  156. \def\@getoptionalarg#1{%
  157.    \let\@optionaltemp = #1%
  158.    \let\@optionalnext = \relax
  159.    \@futurenonspacelet\@optionalnext\@bracketcheck
  160. }%
  161. \def\@bracketcheck{%
  162.    \ifx [\@optionalnext
  163.       \expandafter\@@getoptionalarg
  164.    \else
  165.       \let\@optionalarg = \empty
  166.       \expandafter\@optionaltemp
  167.    \fi
  168. }%
  169. \def\@@getoptionalarg[#1]{%
  170.    \def\@optionalarg{#1}%
  171.    \@optionaltemp
  172. }%
  173. \def\@nnil{\@nil}%
  174. \def\@fornoop#1\@@#2#3{}%
  175. \def\@for#1:=#2\do#3{%
  176.    \edef\@fortmp{#2}%
  177.    \ifx\@fortmp\empty \else
  178.       \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}%
  179.    \fi
  180. }%
  181. \def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
  182.        #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi
  183. }%
  184. \def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
  185.        \let\@nextwhile=\@fornoop \else
  186.       #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}%
  187. }%
  188. \@innernewif\if@fileexists
  189. \def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}%
  190. \def\@finishtestfileexistence#1{%
  191.    \begingroup
  192.       \def\extension{#1}%
  193.       \immediate\openin0 =
  194.          \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi
  195.          \ifx\extension\empty \else .#1\fi
  196.          \space
  197.       \ifeof 0
  198.          \global\@fileexistsfalse
  199.       \else
  200.          \global\@fileexiststrue
  201.       \fi
  202.       \immediate\closein0
  203.    \endgroup
  204. }%
  205. \toks0 = {%
  206. \def\bibliographystyle#1{%
  207.    \@readauxfile
  208.    \@writeaux{\string\bibstyle{#1}}%
  209. }%
  210. \let\bibstyle = \@gobble
  211. \let\bblfilebasename = \jobname
  212. \def\bibliography#1{%
  213.    \@readauxfile
  214.    \@writeaux{\string\bibdata{#1}}%
  215.    \@testfileexistence[\bblfilebasename]{bbl}%
  216.    \if@fileexists
  217.       \nobreak
  218.       \@readbblfile
  219.    \fi
  220. }%
  221. \let\bibdata = \@gobble
  222. \def\nocite#1{%
  223.    \@readauxfile
  224.    \@writeaux{\string\citation{#1}}%
  225. }%
  226. \@innernewif\if@notfirstcitation
  227. \def\cite{\@getoptionalarg\@cite}%
  228. \def\@cite#1{%
  229.    \let\@citenotetext = \@optionalarg
  230.    \printcitestart
  231.    \nocite{#1}%
  232.    \@notfirstcitationfalse
  233.    \@for \@citation :=#1\do
  234.    {%
  235.       \expandafter\@onecitation\@citation\@@
  236.    }%
  237.    \ifx\empty\@citenotetext\else
  238.       \printcitenote{\@citenotetext}%
  239.    \fi
  240.    \printcitefinish
  241. }%
  242. \def\@onecitation#1\@@{%
  243.    \if@notfirstcitation
  244.       \printbetweencitations
  245.    \fi
  246.    \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax
  247.       \if@citewarning
  248.          \message{\@linenumber Undefined citation `#1'.}%
  249.       \fi
  250.       \expandafter\gdef\csname\@citelabel{#1}\endcsname{%
  251.          {\tt
  252.             \escapechar = -1
  253.             \nobreak\hskip0pt
  254.             \expandafter\string\csname#1\endcsname
  255.             \nobreak\hskip0pt
  256.          }%
  257.       }%
  258.    \fi
  259.    \@printcitelabel{#1}%
  260.    \@notfirstcitationtrue
  261. }%
  262. \def\@printcitelabel#1{%
  263.    \csname\@citelabel{#1}\endcsname
  264. }%
  265. \def\@citelabel#1{b@#1}%
  266. \def\@citedef#1#2{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}%
  267. \def\@readbblfile{%
  268.    \ifx\@itemnum\@undefined
  269.       \@innernewcount\@itemnum
  270.    \fi
  271.    \begingroup
  272.       \ifx\begin\undefined
  273.          \def\begin##1##2{%
  274.             \setbox0 = \hbox{\biblabelcontents{##2}}%
  275.             \biblabelwidth = \wd0
  276.          }%
  277.          \let\end = \@gobble % The arg is `thebibliography' again.
  278.       \fi
  279.       \@itemnum = 0
  280.       \def\bibitem{\@getoptionalarg\@bibitem}%
  281.       \def\@bibitem{%
  282.          \ifx\@optionalarg\empty
  283.             \expandafter\@numberedbibitem
  284.          \else
  285.             \expandafter\@alphabibitem
  286.          \fi
  287.       }%
  288.       \def\@alphabibitem##1{%
  289.          \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}%
  290.          \ifx\biblabelprecontents\@undefined
  291.             \let\biblabelprecontents = \relax
  292.          \fi
  293.          \ifx\biblabelpostcontents\@undefined
  294.             \let\biblabelpostcontents = \hss
  295.          \fi
  296.          \@finishbibitem{##1}%
  297.       }%
  298.       \def\@numberedbibitem##1{%
  299.          \advance\@itemnum by 1
  300.          \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}%
  301.          \ifx\biblabelprecontents\@undefined
  302.             \let\biblabelprecontents = \hss
  303.          \fi
  304.          \ifx\biblabelpostcontents\@undefined
  305.             \let\biblabelpostcontents = \relax
  306.          \fi
  307.          \@finishbibitem{##1}%
  308.       }%
  309.       \def\@finishbibitem##1{%
  310.          \biblabelprint{\csname\@citelabel{##1}\endcsname}%
  311.          \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
  312.          \ignorespaces
  313.       }%
  314.       \let\em = \bblem
  315.       \let\newblock = \bblnewblock
  316.       \let\sc = \bblsc
  317.       \frenchspacing
  318.       \clubpenalty = 4000 \widowpenalty = 4000
  319.       \tolerance = 10000 \hfuzz = .5pt
  320.       \everypar = {\hangindent = \biblabelwidth
  321.                       \advance\hangindent by \biblabelextraspace}%
  322.       \bblrm
  323.       \parskip = 1.5ex plus .5ex minus .5ex
  324.       \biblabelextraspace = .5em
  325.       \bblhook
  326.       \input \bblfilebasename.bbl
  327.    \endgroup
  328. }%
  329. \@innernewdimen\biblabelwidth
  330. \@innernewdimen\biblabelextraspace
  331. \def\biblabelprint#1{%
  332.    \noindent
  333.    \hbox to \biblabelwidth{%
  334.       \biblabelprecontents
  335.       \biblabelcontents{#1}%
  336.       \biblabelpostcontents
  337.    }%
  338.    \kern\biblabelextraspace
  339. }%
  340. \def\biblabelcontents#1{{\bblrm [#1]}}%
  341. \def\bblrm{\rm}%
  342. \def\bblem{\it}%
  343. \def\bblsc{\ifx\@scfont\@undefined
  344.               \font\@scfont = cmcsc10
  345.            \fi
  346.            \@scfont
  347. }%
  348. \def\bblnewblock{\hskip .11em plus .33em minus .07em }%
  349. \let\bblhook = \empty
  350. \def\printcitestart{[}%         left bracket
  351. \def\printcitefinish{]}%        right bracket
  352. \def\printbetweencitations{, }% comma, space
  353. \def\printcitenote#1{, #1}%     comma, space, note (if it exists)
  354. \let\citation = \@gobble
  355. \@innernewcount\@numparams
  356. \def\newcommand#1{%
  357.    \def\@commandname{#1}%
  358.    \@getoptionalarg\@continuenewcommand
  359. }%
  360. \def\@continuenewcommand{%
  361.    \@numparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
  362.    \@newcommand
  363. }%
  364. \def\@newcommand#1{%
  365.    \def\@startdef{\expandafter\edef\@commandname}%
  366.    \ifnum\@numparams=0
  367.       \let\@paramdef = \empty
  368.    \else
  369.       \ifnum\@numparams>9
  370.          \errmessage{\the\@numparams\space is too many parameters}%
  371.       \else
  372.          \ifnum\@numparams<0
  373.             \errmessage{\the\@numparams\space is too few parameters}%
  374.          \else
  375.             \edef\@paramdef{%
  376.                \ifcase\@numparams
  377.                   \empty  No arguments.
  378.                \or ####1%
  379.                \or ####1####2%
  380.                \or ####1####2####3%
  381.                \or ####1####2####3####4%
  382.                \or ####1####2####3####4####5%
  383.                \or ####1####2####3####4####5####6%
  384.                \or ####1####2####3####4####5####6####7%
  385.                \or ####1####2####3####4####5####6####7####8%
  386.                \or ####1####2####3####4####5####6####7####8####9%
  387.                \fi
  388.             }%
  389.          \fi
  390.       \fi
  391.    \fi
  392.    \expandafter\@startdef\@paramdef{#1}%
  393. }%
  394. }%
  395. \ifx\nobibtex\@undefined \the\toks0 \fi
  396. \def\@readauxfile{%
  397.    \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined
  398.       \global\@auxfiledonetrue
  399.       \@testfileexistence{aux}%
  400.       \if@fileexists
  401.          \begingroup
  402.             \endlinechar = -1
  403.             \catcode`@ = 11
  404.             \input \jobname.aux
  405.          \endgroup
  406.       \else
  407.          \message{\@undefinedmessage}%
  408.          \global\@citewarningfalse
  409.       \fi
  410.       \immediate\openout\@auxfile = \jobname.aux
  411.    \fi
  412. }%
  413. \newif\if@auxfiledone
  414. \ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi
  415. \@innernewwrite\@auxfile
  416. \def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}%
  417. \ifx\@undefinedmessage\@undefined
  418.    \def\@undefinedmessage{No .aux file; I won't give you warnings about
  419.                           undefined citations.}%
  420. \fi
  421. \@innernewif\if@citewarning
  422. \ifx\noauxfile\@undefined \@citewarningtrue\fi
  423. \catcode`@ = \@oldatcatcode
  424. \let\auxfile = \@auxfile
  425. \let\for = \@for
  426. \let\futurenonspacelet = \@futurenonspacelet
  427. \def\iffileexists{\if@fileexists}%
  428. \let\innerdef = \@innerdef
  429. \let\innernewcount = \@innernewcount
  430. \let\innernewdimen = \@innernewdimen
  431. \let\innernewif = \@innernewif
  432. \let\innernewwrite = \@innernewwrite
  433. \let\linenumber = \@linenumber
  434. \let\readauxfile = \@readauxfile
  435. \let\spacesub = \@spacesub
  436. \let\testfileexistence = \@testfileexistence
  437. \let\writeaux = \@writeaux
  438. \def\innerinnerdef#1{\expandafter\innerdef\csname inner#1\endcsname{#1}}%
  439. \innerinnerdef{newbox}%
  440. \innerinnerdef{newfam}%
  441. \innerinnerdef{newhelp}%
  442. \innerinnerdef{newinsert}%
  443. \innerinnerdef{newlanguage}%
  444. \innerinnerdef{newmuskip}%
  445. \innerinnerdef{newread}%
  446. \innerinnerdef{newskip}%
  447. \innerinnerdef{newtoks}%
  448. \def\immediatewriteaux#1{%
  449.   \ifx\noauxfile\@undefined
  450.     \immediate\write\@auxfile{#1}%
  451.   \fi
  452. }%
  453. \begingroup
  454.    \makeactive\^^M \makeactive\ % No spaces or ^^M's from here on.
  455. \gdef\obeywhitespace{%
  456. \makeactive\^^M\def^^M{\par\futurelet\next\@finishobeyedreturn}%
  457. \makeactive\ \let =\ %
  458. \aftergroup\@removebox%
  459. \futurelet\next\@finishobeywhitespace%
  460. }%
  461. \gdef\@finishobeywhitespace{{%
  462. \ifx\next %
  463. \aftergroup\@obeywhitespaceloop%
  464. \else\ifx\next^^M%
  465. \aftergroup\gobble%
  466. \fi\fi}}%
  467. \gdef\@finishobeyedreturn{%
  468. \ifx\next^^M\vskip\blanklineskipamount\fi%
  469. \indent%
  470. }%
  471. \endgroup
  472. \def\@obeywhitespaceloop#1{\futurelet\next\@finishobeywhitespace}%
  473. \def\@removebox{%
  474.   \ifhmode
  475.     \setbox0 = \lastbox
  476.     \ifdim\wd0=\parindent
  477.       \setbox2 = \hbox{\unhbox0}%
  478.       \ifdim\wd2=0pt
  479.         \ignorespaces
  480.       \else
  481.         \box2 % Put it back: it wasn't empty.
  482.       \fi
  483.     \else
  484.        \box0 % Put it back: it wasn't the right width.
  485.     \fi
  486.   \fi
  487. }%
  488. \newskip\blanklineskipamount
  489. \blanklineskipamount = 0pt
  490. \def\frac#1/#2{\leavevmode
  491.    \kern.1em \raise .5ex \hbox{\the\scriptfont0 #1}%
  492.    \kern-.1em $/$%
  493.    \kern-.15em \lower .25ex \hbox{\the\scriptfont0 #2}%
  494. }%
  495. \newdimen\hruledefaultheight  \hruledefaultheight = 0.4pt
  496. \newdimen\hruledefaultdepth   \hruledefaultdepth = 0.0pt
  497. \newdimen\vruledefaultwidth   \vruledefaultwidth = 0.4pt
  498. \def\ehrule{\hrule height\hruledefaultheight depth\hruledefaultdepth}%
  499. \def\evrule{\vrule width\vruledefaultwidth}%
  500. %%% ====================================================================
  501. %%%  @TeX-style-file{
  502. %%%     author          = "Nelson H. F. Beebe",
  503. %%%     version         = "1.09",
  504. %%%     date            = "16 March 1993",
  505. %%%     time            = "10:08:05 MST",
  506. %%%     filename        = "texnames.sty",
  507. %%%     address         = "Center for Scientific Computing
  508. %%%                        Department of Mathematics
  509. %%%                        South Physics Building
  510. %%%                        University of Utah
  511. %%%                        Salt Lake City, UT 84112
  512. %%%                        USA
  513. %%%                        Tel: (801) 581-5254
  514. %%%                        FAX: (801) 581-4148",
  515. %%%     checksum        = "15888 291 1374 12268",
  516. %%%     email           = "beebe@magna.math.utah.edu (Internet)",
  517. %%%     codetable       = "ISO/ASCII",
  518. %%%     keywords        = "TeX names",
  519. %%%     supported       = "yes",
  520. %%%     docstring       = "This style file for AmSTeX, LaTeX, and TeX
  521. %%%                        defines macros for the names of TeX
  522. %%%                        and METAFONT programs, in several
  523. %%%                        letter-case variants:
  524. %%%
  525. %%%                        \AMSTEX, \AMSTeX, \AmSTeX
  526. %%%                        \BIBTEX, \BIBTeX, \BibTeX
  527. %%%                        \LAMSTeX, \LAmSTeX
  528. %%%                        \LaTeX, \LATEX
  529. %%%                        \METAFONT, \MF
  530. %%%                        \SLITEX, \SLITeX, \SLiTeX, \SliTeX
  531. %%%
  532. %%%                        It will NOT redefine any macro that
  533. %%%                        already exists, so it can be included
  534. %%%                        harmlessly after other style files.
  535. %%%
  536. %%%                        In AmSTeX or Plain TeX, just do
  537. %%%
  538. %%%                        \input texnames.sty
  539. %%%
  540. %%%                        In LaTeX, do
  541. %%%
  542. %%%                        \documentstyle[...,texnames]{...}
  543. %%%
  544. %%%                        This file grew out of original work by
  545. %%%
  546. %%%                        Richard Furuta
  547. %%%                        Department of Computer Science
  548. %%%                        University of Maryland
  549. %%%                        College Park, MD  20742
  550. %%%
  551. %%%                        furuta@mimsy.umd.edu
  552. %%%                        seismo!umcp-cs!furuta
  553. %%%
  554. %%%                        22 October 1986, first release (1.00)
  555. %%%
  556. %%%                        1 April 1987 (1.01): Modified by William
  557. %%%                        LeFebvre, Rice University to include
  558. %%%                        definitions for BibTeX and SLiTeX, as they
  559. %%%                        appear in the LaTeX Local User's Guide
  560. %%%                        template (the file latex/local.tex in
  561. %%%                        standard distributions)
  562. %%%
  563. %%%                        26 October 1991 (1.02): Modified by
  564. %%%                        Nelson H. F. Beebe <beebe@math.utah.edu> to
  565. %%%                        add several new macro names, and adapt for
  566. %%%                        use with Plain TeX and AmSTeX.
  567. %%%
  568. %%%                        26 October 1991 (1.03): Add \LaTeX and
  569. %%%                        \LATEX
  570. %%%
  571. %%%                        25 November 1991 (1.04): Add \LamSTeX
  572. %%%                        and \LAMSTeX
  573. %%%
  574. %%%                        27 January 1991 (1.05 and 1.06): Add slanted
  575. %%%                        font support for \MF.  Make several comment
  576. %%%                        changes.  Add a couple of missing % at end
  577. %%%                        of line, and replace blank lines by empty
  578. %%%                        comments.
  579. %%%
  580. %%%                        30 December 1992 (1.07): Use \TeX in
  581. %%%                        definitions of \BibTeX and \LaTeX.  Remove
  582. %%%                        occurrences of \rm.  Change \sc to use
  583. %%%                        \scriptfont instead of hardwiring cmcsc10.
  584. %%%                        Use \cal for \LAMSTeX.
  585. %%%
  586. %%%                1 March 1993 (1.08): Consolidate \ifx's onto
  587. %%%                single lines for brevity.  Add
  588. %%%                \spacefactor1000 to definitions for \TeX and \MF.
  589. %%%
  590. %%%                        16 March 1993 (1.09): Add \AmS, \AMS, \AmSLaTeX,
  591. %%%                        and \AMSLaTeX.
  592. %%%
  593. %%%                        The checksum field above contains a CRC-16
  594. %%%                        checksum as the first value, followed by the
  595. %%%                        equivalent of the standard UNIX wc (word
  596. %%%                        count) utility output of lines, words, and
  597. %%%                        characters.  This is produced by Robert
  598. %%%                        Solovay's checksum utility.",
  599. %%%
  600. %%%  }
  601. %%% ====================================================================
  602. \ifx\sc\undefined
  603.     \def\sc{%
  604.       \expandafter\ifx\the\scriptfont\fam\nullfont
  605.         \font\temp = cmr7 \temp
  606.       \else
  607.         \the\scriptfont\fam
  608.       \fi
  609.       \def\uppercasesc{\char\uccode`}%
  610.     }%
  611. \fi
  612. \ifx\uppercasesc\undefined
  613.   \let\uppercasesc = \relax
  614. \fi
  615. \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\spacefactor1000 }%
  616. \ifx\AmS\undefined
  617.     \def\AmS{{\the\textfont2 A}\kern-.1667em\lower.5ex\hbox
  618.         {\the\textfont2 M}\kern-.125em{\the\textfont2 S}}
  619. \fi
  620. \ifx\AMS\undefined \let\AMS=\AmS \fi
  621. \ifx\AmSLaTeX\undefined
  622.     \def\AmSLaTeX{\AmS-\LaTeX}
  623. \fi
  624. \ifx\AMSLaTeX\undefined \let\AMSLaTeX=\AmSLaTeX \fi
  625. \ifx\AmSTeX\undefined
  626.     \def\AmSTeX{$\cal A$\kern-.1667em\lower.5ex\hbox{$\cal M$}%
  627.             \kern-.125em$\cal S$-\TeX}%
  628. \fi
  629. \ifx\AMSTEX\undefined \let\AMSTEX=\AmSTeX \fi
  630. \ifx\AMSTeX\undefined \let\AMSTeX=\AmSTeX \fi
  631. \ifx\BibTeX\undefined
  632.     \def\BibTeX{B{\sc \uppercasesc i\kern-.025em \uppercasesc b}\kern-.08em
  633.                 \TeX}%
  634. \fi
  635. \ifx\BIBTeX\undefined \let\BIBTeX=\BibTeX \fi
  636. \ifx\BIBTEX\undefined \let\BIBTEX=\BibTeX \fi
  637. \ifx\LAMSTeX\undefined
  638.     \def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em\the\scriptfont2 A}%
  639.                  \kern-.2em\lower.376ex\hbox{\the\textfont2 M}%
  640.                  \kern-.125em {\the\textfont2 S}-\TeX}%
  641. \fi
  642. \ifx\LamSTeX\undefined \let\LamSTeX=\LAMSTeX \fi
  643. \ifx\LAmSTeX\undefined \let\LAmSTeX=\LAMSTeX \fi
  644. \ifx\LaTeX\undefined
  645.     \def\LaTeX{L\kern-.36em\raise.3ex\hbox{\sc \uppercasesc a}\kern-.15em\TeX}%
  646. \fi
  647. \ifx\LATEX\undefined \let\LATEX=\LaTeX \fi
  648. \ifx\MF\undefined
  649.     \ifx\manfnt\undefined
  650.             \font\manfnt=logo10
  651.     \fi
  652.     \ifx\manfntsl\undefined
  653.             \font\manfntsl=logosl10
  654.     \fi
  655.     \def\MF{{\ifdim\fontdimen1\font>0pt \let\manfnt = \manfntsl \fi
  656.       {\manfnt META}\-{\manfnt FONT}}\spacefactor1000 }%
  657. \fi
  658. \ifx\METAFONT\undefined \let\METAFONT=\MF \fi
  659. \ifx\SLITEX\undefined
  660.     \def\SLITEX{S\kern-.065em L\kern-.18em\raise.32ex\hbox{i}\kern-.03em\TeX}%
  661. \fi
  662. \ifx\SLiTeX\undefined \let\SLiTeX=\SLITEX \fi
  663. \ifx\SliTeX\undefined \let\SliTeX=\SLITEX \fi
  664. \ifx\SLITeX\undefined \let\SLITeX=\SLITEX \fi
  665. %%%  @texfile{
  666. %%%     author          = "Philip Taylor",
  667. %%%     version         = "3.04",
  668. %%%     date            = "25 July 1992",
  669. %%%     time            = "17:07 EDT",
  670. %%%     filename        = "path.sty",
  671. %%%     address         = "The Computer Centre
  672. %%%                        RHBNC, University of London
  673. %%%                        Egham Hill
  674. %%%                        Egham, Surrey TW20 0EX, ENGLAND",
  675. %%%     telephone       = "Tel:   +44 784 443172",
  676. %%%     FAX             = "Fax:   +44 784 434348",
  677. %%%     checksum        = "41143 321 1758 13526",
  678. %%%     email           = "P.Taylor@Vax.Rhbnc.Ac.Uk (Internet)",
  679. %%%     codetable       = "ISO/ASCII",
  680. %%%     keywords        = "file name, filename, path name, pathname,
  681. %%%                        discretionary, discretionaries",
  682. %%%     supported       = "yes",
  683. %%%     docstring       = {Computer filenames, host names, and e-mail
  684. %%%                        addresses tend to be long strings that
  685. %%%                        cause line breaking problems for TeX.
  686. %%%                        Sometimes rather long strings are
  687. %%%                        encountered; here are two examples:
  688. %%%
  689. %%% Friesland%rz.informatik.uni-hamburg.dbp.de%germany.csnet@relay.cs.net
  690. %%%
  691. %%%                        mighty-mouse-gw.scrc.symbolics.com
  692. %%%
  693. %%%                        This file defines a macro, \path|...|,
  694. %%%                        similar to LaTeX's \verb|...| macro, that
  695. %%%                        sets the text in the typewriter font,
  696. %%%                        allowing hyphen-less line breaks at
  697. %%%                        punctuation characters.
  698. %%%
  699. %%%                        The default set of punctuation characters is
  700. %%%                        defined as
  701. %%%
  702. %%%                        \discretionaries |~!@$%^&*()_+`-=#{"}[]:;'<>,.?\/|
  703. %%%
  704. %%%                        However, you can change it as needed, for example:
  705. %%%
  706. %%%                        \discretionaries +@%!.+
  707. %%%
  708. %%%                        would assign to it the set @ % ! . which
  709. %%%                        commonly occur in electronic mail addresses.
  710. %%%
  711. %%%                        The delimiter characters surrounding the
  712. %%%                        arguments to \discretionaries and \path
  713. %%%                        will normally be a punctuation character not
  714. %%%                        found in the argument, and not otherwise
  715. %%%                        significant to TeX.  In particular, backslash
  716. %%%                        cannot be used as a delimiter.  In the rare
  717. %%%                        event that this is required, set
  718. %%%
  719. %%%                        \specialpathdelimiterstrue
  720. %%%
  721. %%%                        This practice is not recommended, because TeX
  722. %%%                        then runs about four times slower while it is
  723. %%%                        typesetting \path\...\ requests.
  724. %%%                        \specialpathdelimitersfalse is the normal
  725. %%%                        setting.
  726. %%%
  727. %%%                        This file may be used in Plain TeX or AmSTeX by
  728. %%%
  729. %%%                        \input path.sty
  730. %%%
  731. %%%                        and in LaTeX by
  732. %%%
  733. %%%                        \documentstyle[...,path,...]{...}
  734. %%%
  735. %%%                        The checksum field above contains a CRC-16
  736. %%%                        checksum as the first value, followed by the
  737. %%%                        equivalent of the standard UNIX wc (word
  738. %%%                        count) utility output of lines, words, and
  739. %%%                        characters.  This is produced by Robert
  740. %%%                        Solovay's checksum utility.}
  741. %%%  }
  742. \edef\path{\the\catcode`@}%
  743. \catcode`@ = 11
  744. \let\@oldatcatcode = \path
  745. \newcount \c@tcode
  746. \newcount \c@unter
  747. \newif \ifspecialpathdelimiters
  748. \begingroup
  749. \catcode `\ = 10
  750. \gdef \passivesp@ce { }%
  751. \catcode `\ = 13\relax%
  752. \gdef\activesp@ce{ }%
  753. \endgroup
  754. \def \discretionaries % <delim> <chars> <delim>
  755.     {\begingroup
  756.         \c@tcodes = 13
  757.         \discr@tionaries
  758.     }%
  759. \def \discr@tionaries #1% <delim>
  760.     {\def \discr@ti@naries ##1#1% <chars> <delim>
  761.          {\endgroup
  762.           \def \discr@ti@n@ries ####1% <char> or <delim>
  763.               {\if   \noexpand ####1\noexpand #1%
  764.                      \let \n@xt = \relax
  765.                \else
  766.                      \catcode `####1 = 13
  767.                      \def ####1{\discretionary
  768.                                   {\char `####1}{}{\char `####1}}%
  769.                      \let \n@xt = \discr@ti@n@ries
  770.                \fi
  771.                \n@xt
  772.               }%
  773.           \def \discr@ti@n@ri@s {\discr@ti@n@ries ##1#1}%
  774.          }%
  775.      \discr@ti@naries
  776.     }%
  777. \let\pathafterhook = \relax
  778. \def \path
  779.     {\ifspecialpathdelimiters
  780.         \begingroup
  781.         \c@tcodes = 12
  782.         \def \endp@th {\endgroup \endgroup \pathafterhook}%
  783.      \else
  784.         \def \endp@th {\endgroup \pathafterhook}%
  785.      \fi
  786.      \p@th
  787.     }%
  788. \def \p@th #1% <delim>
  789.     {\begingroup
  790.         \tt
  791.         \c@tcode = \catcode `#1
  792.         \discr@ti@n@ri@s
  793.         \catcode `\ = \active
  794.         \expandafter \edef \activesp@ce {\passivesp@ce \hbox {}}%
  795.         \catcode `#1 = \c@tcode
  796.         \def \p@@th ##1#1% <chars> <delim>
  797.             {\leavevmode \hbox {}##1%
  798.              \endp@th
  799.             }%
  800.      \p@@th
  801.     }%
  802. \def \c@tcodes {\afterassignment \c@tc@des \c@tcode}%
  803. \def \c@tc@des
  804.     {\c@unter = 0
  805.      \loop
  806.             \ifnum \catcode \c@unter = \c@tcode
  807.             \else
  808.                 \catcode \c@unter = \c@tcode
  809.             \fi
  810.      \ifnum \c@unter < 255
  811.             \advance \c@unter by 1
  812.      \repeat
  813.      \catcode `\ = 10
  814.     }%
  815. \catcode `\@ = \@oldatcatcode
  816. \discretionaries |~!@$%^&*()_+`-=#{}[]:";'<>,.?\/|%
  817. \def\blackbox{\vrule height .8ex width .6ex depth -.2ex \relax}% square bullet
  818. \def\makeblankbox#1#2{%
  819.   \ifvoid0
  820.     \errhelp = \@makeblankboxhelp
  821.     \errmessage{Box 0 is void}%
  822.   \fi
  823.   \hbox{\lower\dp0
  824.     \vbox{\hidehrule{#1}{#2}%
  825.       \kern -#1% overlap rules
  826.       \hbox to \wd0{\hidevrule{#1}{#2}%
  827.         \raise\ht0\vbox to #1{}% vrule height
  828.         \lower\dp0\vtop to #1{}% vrule depth
  829.         \hfil\hidevrule{#2}{#1}%
  830.       }%
  831.       \kern-#1\hidehrule{#2}{#1}%
  832.     }%
  833.   }%
  834. }%
  835. \newhelp\@makeblankboxhelp{Assigning to the dimensions of a void^^J%
  836.   box has no effect.  Do `\string\setbox0=\string\null' before you^^J%
  837.   define its dimensions.}%
  838. \def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2 \kern-#2}%
  839. \def\hidevrule#1#2{%
  840.   \kern-#1%
  841.   \dimen@=#1\advance\dimen@ by #2%
  842.   \vrule width\dimen@
  843.   \kern-#2%
  844. }%
  845. \newdimen\boxitspace \boxitspace = 3pt
  846. \long\def\boxit#1{%
  847.   \vbox{%
  848.     \ehrule
  849.     \hbox{%
  850.       \evrule
  851.       \kern\boxitspace
  852.       \vbox{\kern\boxitspace \parindent = 0pt #1\kern\boxitspace}%
  853.       \kern\boxitspace
  854.       \evrule
  855.     }%
  856.     \ehrule
  857.   }%
  858. }%
  859. \def\numbername#1{\ifcase#1%
  860.    zero%
  861.    \or one%
  862.    \or two%
  863.    \or three%
  864.    \or four%
  865.    \or five%
  866.    \or six%
  867.    \or seven%
  868.    \or eight%
  869.    \or nine%
  870.    \or ten%
  871.    \or #1%
  872.    \fi
  873. }%
  874. \let\@plainnewif = \newif
  875. \let\@plainnewdimen = \newdimen
  876. \let\newif = \innernewif
  877. \let\newdimen = \innernewdimen
  878. \edef\@eplainoldandcode{\the\catcode`& }%
  879. \catcode`& = 11
  880. \toks0 = {%
  881. \edef\thinlines{\the\catcode`@ }%
  882. \catcode`@ = 11
  883. \let\@oldatcatcode = \thinlines
  884. \edef\@oldandcatcode{\the\catcode`& }%
  885. \catcode`& = 11
  886. \def\&whilenoop#1{}%
  887. \def\&whiledim#1\do #2{\ifdim #1\relax#2\&iwhiledim{#1\relax#2}\fi}%
  888. \def\&iwhiledim#1{\ifdim #1\let\&nextwhile=\&iwhiledim 
  889.         \else\let\&nextwhile=\&whilenoop\fi\&nextwhile{#1}}%
  890. \newif\if&negarg
  891. \newdimen\&wholewidth
  892. \newdimen\&halfwidth
  893. \font\tenln=line10
  894. \def\thinlines{\let\&linefnt\tenln \let\&circlefnt\tencirc
  895.   \&wholewidth\fontdimen8\tenln \&halfwidth .5\&wholewidth}%
  896. \def\thicklines{\let\&linefnt\tenlnw \let\&circlefnt\tencircw
  897.   \&wholewidth\fontdimen8\tenlnw \&halfwidth .5\&wholewidth}%
  898. \def\drawline(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax \&linelen=#3\relax
  899.   \ifnum\&xarg =0 \&vline \else \ifnum\&yarg =0 \&hline \else \&sline\fi\fi}%
  900. \def\&sline{\leavevmode
  901.   \ifnum\&xarg< 0 \&negargtrue \&xarg -\&xarg \&yyarg -\&yarg
  902.   \else \&negargfalse \&yyarg \&yarg \fi
  903.   \ifnum \&yyarg >0 \&tempcnta\&yyarg \else \&tempcnta -\&yyarg \fi
  904.   \ifnum\&tempcnta>6 \&badlinearg \&yyarg0 \fi
  905.   \ifnum\&xarg>6 \&badlinearg \&xarg1 \fi
  906.   \setbox\&linechar\hbox{\&linefnt\&getlinechar(\&xarg,\&yyarg)}%
  907.   \ifnum \&yyarg >0 \let\&upordown\raise \&clnht\z@
  908.   \else\let\&upordown\lower \&clnht \ht\&linechar\fi
  909.   \&clnwd=\wd\&linechar
  910.   \&whiledim \&clnwd <\&linelen \do {%
  911.     \&upordown\&clnht\copy\&linechar
  912.     \advance\&clnht \ht\&linechar
  913.     \advance\&clnwd \wd\&linechar
  914.   }%
  915.   \advance\&clnht -\ht\&linechar
  916.   \advance\&clnwd -\wd\&linechar
  917.   \&tempdima\&linelen\advance\&tempdima -\&clnwd
  918.   \&tempdimb\&tempdima\advance\&tempdimb -\wd\&linechar
  919.   \hskip\&tempdimb \multiply\&tempdima \@m
  920.   \&tempcnta \&tempdima \&tempdima \wd\&linechar \divide\&tempcnta \&tempdima
  921.   \&tempdima \ht\&linechar \multiply\&tempdima \&tempcnta
  922.   \divide\&tempdima \@m
  923.   \advance\&clnht \&tempdima
  924.   \ifdim \&linelen <\wd\&linechar \hskip \wd\&linechar
  925.   \else\&upordown\&clnht\copy\&linechar\fi}%
  926. \def\&hline{\vrule height \&halfwidth depth \&halfwidth width \&linelen}%
  927. \def\&getlinechar(#1,#2){\&tempcnta#1\relax\multiply\&tempcnta 8
  928.   \advance\&tempcnta -9 \ifnum #2>0 \advance\&tempcnta #2\relax\else
  929.   \advance\&tempcnta -#2\relax\advance\&tempcnta 64 \fi
  930.   \char\&tempcnta}%
  931. \def\drawvector(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax
  932.   \&tempcnta \ifnum\&xarg<0 -\&xarg\else\&xarg\fi
  933.   \ifnum\&tempcnta<5\relax \&linelen=#3\relax
  934.     \ifnum\&xarg =0 \&vvector \else \ifnum\&yarg =0 \&hvector
  935.     \else \&svector\fi\fi\else\&badlinearg\fi}%
  936. \def\&hvector{\ifnum\&xarg<0 \rlap{\&linefnt\&getlarrow(1,0)}\fi \&hline
  937.   \ifnum\&xarg>0 \llap{\&linefnt\&getrarrow(1,0)}\fi}%
  938. \def\&vvector{\ifnum \&yarg <0 \&downvector \else \&upvector \fi}%
  939. \def\&svector{\&sline
  940.   \&tempcnta\&yarg \ifnum\&tempcnta <0 \&tempcnta=-\&tempcnta\fi
  941.   \ifnum\&tempcnta <5 
  942.     \if&negarg\ifnum\&yarg>0                   % 3d quadrant; dp > 0
  943.       \llap{\lower\ht\&linechar\hbox to\&linelen{\&linefnt
  944.         \&getlarrow(\&xarg,\&yyarg)\hss}}\else % 4th quadrant; ht > 0
  945.       \llap{\hbox to\&linelen{\&linefnt\&getlarrow(\&xarg,\&yyarg)\hss}}\fi
  946.     \else\ifnum\&yarg>0                        % 1st quadrant; ht > 0
  947.       \&tempdima\&linelen \multiply\&tempdima\&yarg
  948.       \divide\&tempdima\&xarg \advance\&tempdima-\ht\&linechar
  949.       \raise\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\else
  950.       \&tempdima\&linelen \multiply\&tempdima-\&yarg % 2d quadrant; dp > 0
  951.       \divide\&tempdima\&xarg
  952.       \lower\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\fi\fi
  953.   \else\&badlinearg\fi}%
  954. \def\&getlarrow(#1,#2){\ifnum #2 =\z@ \&tempcnta='33\else
  955. \&tempcnta=#1\relax\multiply\&tempcnta \sixt@@n \advance\&tempcnta
  956. -9 \&tempcntb=#2\relax\multiply\&tempcntb \tw@
  957. \ifnum \&tempcntb >0 \advance\&tempcnta \&tempcntb\relax
  958. \else\advance\&tempcnta -\&tempcntb\advance\&tempcnta 64
  959. \fi\fi\char\&tempcnta}%
  960. \def\&getrarrow(#1,#2){\&tempcntb=#2\relax
  961. \ifnum\&tempcntb < 0 \&tempcntb=-\&tempcntb\relax\fi
  962. \ifcase \&tempcntb\relax \&tempcnta='55 \or 
  963. \ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
  964. 24 \advance\&tempcnta -6 \else \ifnum #1=3 \&tempcnta=49
  965. \else\&tempcnta=58 \fi\fi\or 
  966. \ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
  967. 24 \advance\&tempcnta -3 \else \&tempcnta=51\fi\or 
  968. \&tempcnta=#1\relax\multiply\&tempcnta
  969. \sixt@@n \advance\&tempcnta -\tw@ \else
  970. \&tempcnta=#1\relax\multiply\&tempcnta
  971. \sixt@@n \advance\&tempcnta 7 \fi\ifnum #2<0 \advance\&tempcnta 64 \fi
  972. \char\&tempcnta}%
  973. \def\&vline{\ifnum \&yarg <0 \&downline \else \&upline\fi}%
  974. \def\&upline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
  975.    height \&linelen depth \z@\hss}}%
  976. \def\&downline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
  977.    height \z@ depth \&linelen \hss}}%
  978. \def\&upvector{\&upline\setbox\&tempboxa\hbox{\&linefnt\char'66}\raise 
  979.      \&linelen \hbox to\z@{\lower \ht\&tempboxa\box\&tempboxa\hss}}%
  980. \def\&downvector{\&downline\lower \&linelen
  981.       \hbox to \z@{\&linefnt\char'77\hss}}%
  982. \def\&badlinearg{\errmessage{Bad \string\arrow\space argument.}}%
  983. \thinlines
  984. \countdef\&xarg     0
  985. \countdef\&yarg     2
  986. \countdef\&yyarg    4
  987. \countdef\&tempcnta 6
  988. \countdef\&tempcntb 8
  989. \dimendef\&linelen  0
  990. \dimendef\&clnwd    2
  991. \dimendef\&clnht    4
  992. \dimendef\&tempdima 6
  993. \dimendef\&tempdimb 8
  994. \chardef\@arrbox    0
  995. \chardef\&linechar  2
  996. \chardef\&tempboxa  2           % \&linechar and \&tempboxa don't interfere.
  997. \let\lft^%
  998. \let\rt_% distinguish between \rt and \lft
  999. \newif\if@pslope % test for positive slope
  1000. \def\@findslope(#1,#2){\ifnum#1>0
  1001.   \ifnum#2>0 \@pslopetrue \else\@pslopefalse\fi \else
  1002.   \ifnum#2>0 \@pslopefalse \else\@pslopetrue\fi\fi}%
  1003. \def\generalsmap(#1,#2){\getm@rphposn(#1,#2)\plnmorph\futurelet\next\addm@rph}%
  1004. \def\sline(#1,#2){\setbox\@arrbox=\hbox{\drawline(#1,#2){\sarrowlength}}%
  1005.   \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
  1006. \def\arrow(#1,#2){\setbox\@arrbox=\hbox{\drawvector(#1,#2){\sarrowlength}}%
  1007.   \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
  1008. \newif\ifd@@blearr
  1009. \def\bisline(#1,#2){\@findslope(#1,#2)%
  1010.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  1011.   \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
  1012.     \rlap{\drawline(#1,#2){\sarrowlength}}%
  1013.       \hskip\@hchannel\hbox{\drawline(#1,#2){\sarrowlength}}}%
  1014.   \d@@blearrtrue\generalsmap(#1,#2)}%
  1015. \def\biarrow(#1,#2){\@findslope(#1,#2)%
  1016.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  1017.   \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
  1018.     \rlap{\drawvector(#1,#2){\sarrowlength}}%
  1019.       \hskip\@hchannel\hbox{\drawvector(#1,#2){\sarrowlength}}}%
  1020.   \d@@blearrtrue\generalsmap(#1,#2)}%
  1021. \def\adjarrow(#1,#2){\@findslope(#1,#2)%
  1022.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  1023.   \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
  1024.     \rlap{\drawvector(#1,#2){\sarrowlength}}%
  1025.       \hskip\@hchannel\hbox{\drawvector(-#1,-#2){\sarrowlength}}}%
  1026.   \d@@blearrtrue\generalsmap(#1,#2)}%
  1027. \newif\ifrtm@rph
  1028. \def\@shiftmorph#1{\hbox{\setbox0=\hbox{$\scriptstyle#1$}%
  1029.   \setbox1=\hbox{\hskip\@hm@rphshift\raise\@vm@rphshift\copy0}%
  1030.   \wd1=\wd0 \ht1=\ht0 \dp1=\dp0 \box1}}%
  1031. \def\@hm@rphshift{\ifrtm@rph
  1032.   \ifdim\hmorphposnrt=\z@\hmorphposn\else\hmorphposnrt\fi \else
  1033.   \ifdim\hmorphposnlft=\z@\hmorphposn\else\hmorphposnlft\fi \fi}%
  1034. \def\@vm@rphshift{\ifrtm@rph
  1035.   \ifdim\vmorphposnrt=\z@\vmorphposn\else\vmorphposnrt\fi \else
  1036.   \ifdim\vmorphposnlft=\z@\vmorphposn\else\vmorphposnlft\fi \fi}%
  1037. \def\addm@rph{\ifx\next\lft\let\temp=\lftmorph\else
  1038.   \ifx\next\rt\let\temp=\rtmorph\else\let\temp\relax\fi\fi \temp}%
  1039. \def\plnmorph{\dimen1\wd\@arrbox \ifdim\dimen1<\z@ \dimen1-\dimen1\fi
  1040.   \vcenter{\box\@arrbox}}%
  1041. \def\lftmorph\lft#1{\rtm@rphfalse \setbox0=\@shiftmorph{#1}%
  1042.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  1043.   \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss % \dimen1=\wd\@arrbox
  1044.     \llap{\box0}\hss}\hskip\@hmorphdflt}\futurelet\next\addm@rph}%
  1045. \def\rtmorph\rt#1{\rtm@rphtrue \setbox0=\@shiftmorph{#1}%
  1046.   \if@pslope \let\@upordown\lower \else \let\@upordown\raise\fi
  1047.   \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss
  1048.     \rlap{\box0}\hss}\hskip-\@hmorphdflt}\futurelet\next\addm@rph}%
  1049. \def\getm@rphposn(#1,#2){\ifd@@blearr \dimen@\morphdist \advance\dimen@ by
  1050.   .5\channelwidth \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\dimen@}\else
  1051.   \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\morphdist}\fi}%
  1052. \def\getch@nnel(#1,#2){\ifdim\hchannel=\z@ \ifdim\vchannel=\z@
  1053.     \@getshift(#1,#2){\@hchannel}{\@vchannel}{\channelwidth}%
  1054.     \else \@hchannel\hchannel \@vchannel\vchannel \fi
  1055.   \else \@hchannel\hchannel \@vchannel\vchannel \fi}%
  1056. \def\@getshift(#1,#2)#3#4#5{\dimen@ #5\relax
  1057.   \&xarg #1\relax \&yarg #2\relax
  1058.   \ifnum\&xarg<0 \&xarg -\&xarg \fi
  1059.   \ifnum\&yarg<0 \&yarg -\&yarg \fi
  1060.   \ifnum\&xarg<\&yarg \&negargtrue \&yyarg\&xarg \&xarg\&yarg \&yarg\&yyarg\fi
  1061.   \ifcase\&xarg \or  % There is no case 0
  1062.     \ifcase\&yarg    % case 1
  1063.       \dimen@i \z@ \dimen@ii \dimen@ \or % case (1,0)
  1064.       \dimen@i .7071\dimen@ \dimen@ii .7071\dimen@ \fi \or
  1065.     \ifcase\&yarg    % case 2
  1066.       \or % case 0,2 wrong
  1067.       \dimen@i .4472\dimen@ \dimen@ii .8944\dimen@ \fi \or
  1068.     \ifcase\&yarg    % case 3
  1069.       \or % case 0,3 wrong
  1070.       \dimen@i .3162\dimen@ \dimen@ii .9486\dimen@ \or
  1071.       \dimen@i .5547\dimen@ \dimen@ii .8321\dimen@ \fi \or
  1072.     \ifcase\&yarg    % case 4
  1073.       \or % case 0,2,4 wrong
  1074.       \dimen@i .2425\dimen@ \dimen@ii .9701\dimen@ \or\or
  1075.       \dimen@i .6\dimen@ \dimen@ii .8\dimen@ \fi \or
  1076.     \ifcase\&yarg    % case 5
  1077.       \or % case 0,5 wrong
  1078.       \dimen@i .1961\dimen@ \dimen@ii .9801\dimen@ \or
  1079.       \dimen@i .3714\dimen@ \dimen@ii .9284\dimen@ \or
  1080.       \dimen@i .5144\dimen@ \dimen@ii .8575\dimen@ \or
  1081.       \dimen@i .6247\dimen@ \dimen@ii .7801\dimen@ \fi \or
  1082.     \ifcase\&yarg    % case 6
  1083.       \or % case 0,2,3,4,6 wrong
  1084.       \dimen@i .1645\dimen@ \dimen@ii .9864\dimen@ \or\or\or\or
  1085.       \dimen@i .6402\dimen@ \dimen@ii .7682\dimen@ \fi \fi
  1086.   \if&negarg \&tempdima\dimen@i \dimen@i\dimen@ii \dimen@ii\&tempdima\fi
  1087.   #3\dimen@i\relax #4\dimen@ii\relax }%
  1088. \catcode`\&=4  % Back to alignment tab
  1089. }%
  1090. \catcode`& = 4
  1091. \toks2 = {%
  1092. \catcode`\&=4  % Back to alignment tab
  1093. \def\generalhmap{\futurelet\next\@generalhmap}%
  1094. \def\@generalhmap{\ifx\next^ \let\temp\generalhm@rph\else
  1095.   \ifx\next_ \let\temp\generalhm@rph\else \let\temp\m@kehmap\fi\fi \temp}%
  1096. \def\generalhm@rph#1#2{\ifx#1^
  1097.     \toks@=\expandafter{\the\toks@#1{\rtm@rphtrue\@shiftmorph{#2}}}\else
  1098.     \toks@=\expandafter{\the\toks@#1{\rtm@rphfalse\@shiftmorph{#2}}}\fi
  1099.   \generalhmap}%
  1100. \def\m@kehmap{\mathrel{\smash{\the\toks@}}}%
  1101. \def\mapright{\toks@={\mathop{\vcenter{\smash{\drawrightarrow}}}\limits}%
  1102.   \generalhmap}%
  1103. \def\mapleft{\toks@={\mathop{\vcenter{\smash{\drawleftarrow}}}\limits}%
  1104.   \generalhmap}%
  1105. \def\bimapright{\toks@={\mathop{\vcenter{\smash{\drawbirightarrow}}}\limits}%
  1106.   \generalhmap}%
  1107. \def\bimapleft{\toks@={\mathop{\vcenter{\smash{\drawbileftarrow}}}\limits}%
  1108.   \generalhmap}%
  1109. \def\adjmapright{\toks@={\mathop{\vcenter{\smash{\drawadjrightarrow}}}\limits}%
  1110.   \generalhmap}%
  1111. \def\adjmapleft{\toks@={\mathop{\vcenter{\smash{\drawadjleftarrow}}}\limits}%
  1112.   \generalhmap}%
  1113. \def\hline{\toks@={\mathop{\vcenter{\smash{\drawhline}}}\limits}%
  1114.   \generalhmap}%
  1115. \def\bihline{\toks@={\mathop{\vcenter{\smash{\drawbihline}}}\limits}%
  1116.   \generalhmap}%
  1117. \def\drawrightarrow{\hbox{\drawvector(1,0){\harrowlength}}}%
  1118. \def\drawleftarrow{\hbox{\drawvector(-1,0){\harrowlength}}}%
  1119. \def\drawbirightarrow{\hbox{\raise.5\channelwidth
  1120.   \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
  1121.   \llap{\drawvector(1,0){\harrowlength}}}}%
  1122. \def\drawbileftarrow{\hbox{\raise.5\channelwidth
  1123.   \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
  1124.   \llap{\drawvector(-1,0){\harrowlength}}}}%
  1125. \def\drawadjrightarrow{\hbox{\raise.5\channelwidth
  1126.   \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
  1127.   \llap{\drawvector(1,0){\harrowlength}}}}%
  1128. \def\drawadjleftarrow{\hbox{\raise.5\channelwidth
  1129.   \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
  1130.   \llap{\drawvector(-1,0){\harrowlength}}}}%
  1131. \def\drawhline{\hbox{\drawline(1,0){\harrowlength}}}%
  1132. \def\drawbihline{\hbox{\raise.5\channelwidth
  1133.   \hbox{\drawline(1,0){\harrowlength}}\lower.5\channelwidth
  1134.   \llap{\drawline(1,0){\harrowlength}}}}%
  1135. \def\generalvmap{\futurelet\next\@generalvmap}%
  1136. \def\@generalvmap{\ifx\next\lft \let\temp\generalvm@rph\else
  1137.   \ifx\next\rt \let\temp\generalvm@rph\else \let\temp\m@kevmap\fi\fi \temp}%
  1138. \toksdef\toks@@=1
  1139. \def\generalvm@rph#1#2{\ifx#1\rt % append
  1140.     \toks@=\expandafter{\the\toks@
  1141.       \rlap{$\vcenter{\rtm@rphtrue\@shiftmorph{#2}}$}}\else % prepend
  1142.     \toks@@={\llap{$\vcenter{\rtm@rphfalse\@shiftmorph{#2}}$}}%
  1143.     \toks@=\expandafter\expandafter\expandafter{\expandafter\the\expandafter
  1144.       \toks@@ \the\toks@}\fi \generalvmap}%
  1145. \def\m@kevmap{\the\toks@}%
  1146. \def\mapdown{\toks@={\vcenter{\drawdownarrow}}\generalvmap}%
  1147. \def\mapup{\toks@={\vcenter{\drawuparrow}}\generalvmap}%
  1148. \def\bimapdown{\toks@={\vcenter{\drawbidownarrow}}\generalvmap}%
  1149. \def\bimapup{\toks@={\vcenter{\drawbiuparrow}}\generalvmap}%
  1150. \def\adjmapdown{\toks@={\vcenter{\drawadjdownarrow}}\generalvmap}%
  1151. \def\adjmapup{\toks@={\vcenter{\drawadjuparrow}}\generalvmap}%
  1152. \def\vline{\toks@={\vcenter{\drawvline}}\generalvmap}%
  1153. \def\bivline{\toks@={\vcenter{\drawbivline}}\generalvmap}%
  1154. \def\drawdownarrow{\hbox to5pt{\hss\drawvector(0,-1){\varrowlength}\hss}}%
  1155. \def\drawuparrow{\hbox to5pt{\hss\drawvector(0,1){\varrowlength}\hss}}%
  1156. \def\drawbidownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
  1157.   \hskip\channelwidth\hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
  1158. \def\drawbiuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
  1159.   \hskip\channelwidth\hbox{\drawvector(0,1){\varrowlength}}\hss}}%
  1160. \def\drawadjdownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
  1161.   \hskip\channelwidth\lower\varrowlength
  1162.   \hbox{\drawvector(0,1){\varrowlength}}\hss}}%
  1163. \def\drawadjuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
  1164.   \hskip\channelwidth\raise\varrowlength
  1165.   \hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
  1166. \def\drawvline{\hbox to5pt{\hss\drawline(0,1){\varrowlength}\hss}}%
  1167. \def\drawbivline{\hbox to5pt{\hss\hbox{\drawline(0,1){\varrowlength}}%
  1168.   \hskip\channelwidth\hbox{\drawline(0,1){\varrowlength}}\hss}}%
  1169. \def\commdiag#1{\null\,
  1170.   \vcenter{\commdiagbaselines
  1171.   \m@th\ialign{\hfil$##$\hfil&&\hfil$\mkern4mu ##$\hfil\crcr
  1172.       \mathstrut\crcr\noalign{\kern-\baselineskip}
  1173.       #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}%
  1174. \def\commdiagbaselines{\baselineskip15pt \lineskip3pt \lineskiplimit3pt }%
  1175. \def\gridcommdiag#1{\null\,
  1176.   \vcenter{\offinterlineskip
  1177.   \m@th\ialign{&\vbox to\vgrid{\vss
  1178.     \hbox to\hgrid{\hss\smash{$##$}\hss}}\crcr
  1179.       \mathstrut\crcr\noalign{\kern-\vgrid}
  1180.       #1\crcr\mathstrut\crcr\noalign{\kern-.5\vgrid}}}\,}%
  1181. \newdimen\harrowlength \harrowlength=60pt
  1182. \newdimen\varrowlength \varrowlength=.618\harrowlength
  1183. \newdimen\sarrowlength \sarrowlength=\harrowlength
  1184. \newdimen\hmorphposn \hmorphposn=\z@
  1185. \newdimen\vmorphposn \vmorphposn=\z@
  1186. \newdimen\morphdist  \morphdist=4pt
  1187. \dimendef\@hmorphdflt 0       % These two dimensions are
  1188. \dimendef\@vmorphdflt 2       % defined by \getm@rphposn
  1189. \newdimen\hmorphposnrt  \hmorphposnrt=\z@
  1190. \newdimen\hmorphposnlft \hmorphposnlft=\z@
  1191. \newdimen\vmorphposnrt  \vmorphposnrt=\z@
  1192. \newdimen\vmorphposnlft \vmorphposnlft=\z@
  1193. \let\hmorphposnup=\hmorphposnrt
  1194. \let\hmorphposndn=\hmorphposnlft
  1195. \let\vmorphposnup=\vmorphposnrt
  1196. \let\vmorphposndn=\vmorphposnlft
  1197. \newdimen\hgrid \hgrid=15pt
  1198. \newdimen\vgrid \vgrid=15pt
  1199. \newdimen\hchannel  \hchannel=0pt
  1200. \newdimen\vchannel  \vchannel=0pt
  1201. \newdimen\channelwidth \channelwidth=3pt
  1202. \dimendef\@hchannel 0         % Defined via the
  1203. \dimendef\@vchannel 2         % macro \getch@nnel
  1204. \catcode`& = \@oldandcatcode
  1205. \catcode`@ = \@oldatcatcode
  1206. }%
  1207. \let\newif = \@plainnewif
  1208. \let\newdimen = \@plainnewdimen
  1209. \ifx\noarrow\@undefined \the\toks0 \the\toks2 \fi
  1210. \catcode`& = \@eplainoldandcode
  1211. \def\environment#1{%
  1212.    \ifx\@groupname\@undefined\else
  1213.       \errhelp = \@unnamedendgrouphelp
  1214.       \errmessage{`\@groupname' was not closed by \string\endenvironment}%
  1215.    \fi
  1216.    \edef\@groupname{#1}%
  1217.    \begingroup
  1218.       \let\@groupname = \@undefined
  1219. }%
  1220. \def\endenvironment#1{%
  1221.    \endgroup
  1222.    \edef\@thearg{#1}%
  1223.    \ifx\@groupname\@thearg
  1224.    \else
  1225.       \ifx\@groupname\@undefined
  1226.          \errhelp = \@isolatedendenvironmenthelp
  1227.          \errmessage{Isolated \string\endenvironment\space for `#1'}%
  1228.       \else
  1229.          \errhelp = \@mismatchedenvironmenthelp
  1230.          \errmessage{Environment `#1' ended, but `\@groupname' started}%
  1231.          \endgroup % Probably a typo in the names.
  1232.       \fi
  1233.    \fi
  1234.    \let\@groupname = \@undefined
  1235. }%
  1236. \newhelp\@unnamedendgrouphelp{Most likely, you just forgot an^^J%
  1237.    \string\endenvironment.  Maybe you should try inserting another^^J%
  1238.    \string\endgroup to recover.}%
  1239. \newhelp\@isolatedendenvironmenthelp{You ended an environment X, but^^J%
  1240.    no \string\environment{X} to start it is anywhere in sight.^^J%
  1241.    You might also be at an \string\endenvironment\space that would match^^J%
  1242.    a \string\begingroup, i.e., you forgot an \string\endgroup.}%
  1243. \newhelp\@mismatchedenvironmenthelp{You started an environment named X, but^^J%
  1244.    you ended one named Y.  Maybe you made a typo in one^^J%
  1245.    or the other of the names?}%
  1246. \newif\ifenvironment
  1247. \def\checkenv{\ifenvironment \errhelp = \@interwovenenvhelp
  1248.    \errmessage{Interwoven environments}%
  1249.    \egroup \fi
  1250. }%
  1251. \newhelp\@interwovenenvhelp{Perhaps you forgot to end the previous^^J%
  1252.    environment? I'm finishing off the current group,^^J%
  1253.    hoping that will fix it.}%
  1254. \newtoks\previouseverydisplay
  1255. \newdimen\leftdisplayindent
  1256. \newif\if@leftdisplays
  1257. \def\leftdisplays{%
  1258.   \if@leftdisplays\else
  1259.     \previouseverydisplay = \everydisplay
  1260.     \everydisplay = {\the\previouseverydisplay \leftdisplaysetup}%
  1261.     \let\@save@maybedisableeqno = \@maybedisableeqno
  1262.     \let\@saveeqno = \eqno
  1263.     \let\@saveleqno = \leqno
  1264.     \let\@saveeqalignno = \eqalignno
  1265.     \let\@saveleqalignno = \leqalignno
  1266.     \let\@maybedisableeqno = \relax
  1267.     \def\eqno{\hfill\textstyle\enspace}%
  1268.     \def\leqno{%
  1269.       \hfill
  1270.       \hbox to0pt\bgroup
  1271.         \kern-\displaywidth
  1272.         \kern-\displayindent
  1273.         $\aftergroup\@leftleqnoend
  1274.     }%
  1275.     \@redefinealignmentdisplays
  1276.     \@leftdisplaystrue
  1277.   \fi
  1278. }%
  1279. \def\centereddisplays{%
  1280.   \if@leftdisplays
  1281.     \everydisplay = \previouseverydisplay
  1282.     \let\@maybedisableeqno = \@save@maybedisableeqno
  1283.     \let\eqno = \@saveeqno
  1284.     \let\leqno = \@saveleqno
  1285.     \let\eqalignno = \@saveeqalignno
  1286.     \let\leqalignno = \@saveleqalignno
  1287.     \@leftdisplaysfalse
  1288.   \fi
  1289. }%
  1290. \def\leftdisplaysetup{%
  1291.   \hbox to\displaywidth\bgroup
  1292.     \strut
  1293.     \dimen@ = \parindent
  1294.       \advance\dimen@ by \leftdisplayindent 
  1295.       \advance\dimen@ by \leftskip
  1296.     \hskip\dimen@
  1297.     \advance\displayindent by \dimen@
  1298.     \advance\displaywidth by -\parindent
  1299.       \advance\displaywidth by -\leftdisplayindent
  1300.       \advance\displaywidth by -\leftskip
  1301.     $%
  1302.     \advance\hsize by -\displayindent
  1303.     \aftergroup\@lefteqend
  1304.     \displaystyle
  1305. }%
  1306. \def\@lefteqend{\hfil\egroup$}% gets inserted between the ending $$
  1307. \def\@leftleqnoend{\hss \egroup$}%
  1308. \def\@redefinealignmentdisplays{%
  1309.   \def\displaylines##1{\displ@y
  1310.     \vcenter{%
  1311.       \halign{\hbox to\displaywidth{$\@lign\displaystyle####\hfil$\hfil}\crcr
  1312.               ##1\crcr}}}%
  1313.   \def\eqalignno##1{\displ@y
  1314.     \let\noalign = \@lefteqalignonoalign
  1315.     \vcenter{%
  1316.       \halign to\displaywidth{%
  1317.          \hfil $\@lign\displaystyle{####}$\tabskip\z@skip
  1318.         &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
  1319.         &\llap{$\@lign####$}\tabskip\z@skip\crcr
  1320.         ##1\crcr}}}%
  1321.   \def\leqalignno##1{\displ@y
  1322.     \let\eqno = \relax
  1323.     \vcenter{%
  1324.       \halign to\displaywidth{%
  1325.          \hfil$\@lign\displaystyle{####}$\tabskip\z@skip
  1326.         &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
  1327.         &\kern-\displaywidth
  1328.          \rlap{\kern-\displayindent $\@lign####$}%
  1329.          \tabskip\displaywidth\crcr
  1330.         ##1\crcr}}}%
  1331. }%
  1332. \let\@primitivenoalign = \noalign
  1333. \newtoks\@everynoalign
  1334. \def\@lefteqalignonoalign#1{%
  1335.   \@primitivenoalign{%
  1336.     \advance\leftskip by -\parindent
  1337.     \advance\leftskip by -\leftdisplayindent
  1338.     \parskip = 0pt
  1339.     \parindent = 0pt
  1340.     \the\@everynoalign
  1341.     #1%
  1342.   }%
  1343. }%
  1344. \def\monthname{%
  1345.    \ifcase\month
  1346.       \or Jan\or Feb\or Mar\or Apr\or May\or Jun%
  1347.       \or Jul\or Aug\or Sep\or Oct\or Nov\or Dec%
  1348.    \fi
  1349. }%
  1350. \def\fullmonthname{%
  1351.    \ifcase\month
  1352.       \or January\or February\or March\or April\or May\or June%
  1353.       \or July\or August\or September\or October\or November\or December%
  1354.    \fi
  1355. }%
  1356. \def\timestring{\begingroup
  1357.    \count0 = \time
  1358.    \divide\count0 by 60
  1359.    \count2 = \count0   % The hour, from zero to 23.
  1360.    \count4 = \time
  1361.    \multiply\count0 by 60
  1362.    \advance\count4 by -\count0   % The minute, from zero to 59.
  1363.    \ifnum\count4<10
  1364.       \toks1 = {0}%
  1365.    \else
  1366.       \toks1 = {}%
  1367.    \fi
  1368.    \ifnum\count2<12
  1369.       \toks0 = {a.m.}%
  1370.    \else
  1371.       \toks0 = {p.m.}%
  1372.       \advance\count2 by -12
  1373.    \fi
  1374.    \ifnum\count2=0
  1375.       \count2 = 12
  1376.    \fi
  1377.    \number\count2:\the\toks1 \number\count4 \thinspace \the\toks0
  1378. \endgroup}%
  1379. \def\timestamp{\number\day\space\monthname\space\number\year\quad\timestring}%
  1380. \def\today{\the\day\ \fullmonthname\ \the\year}%
  1381. \newskip\abovelistskipamount      \abovelistskipamount = .5\baselineskip
  1382.   \newcount\abovelistpenalty      \abovelistpenalty    = 10000
  1383.   \def\abovelistskip{\vpenalty\abovelistpenalty \vskip\abovelistskipamount}%
  1384. \newskip\interitemskipamount      \interitemskipamount = 0pt
  1385.   \newcount\belowlistpenalty      \belowlistpenalty    = -50
  1386.   \def\belowlistskip{\vpenalty\belowlistpenalty \vskip\belowlistskipamount}%
  1387. \newskip\belowlistskipamount      \belowlistskipamount = .5\baselineskip
  1388.   \newcount\interitempenalty      \interitempenalty    = 0
  1389.   \def\interitemskip{\vpenalty\interitempenalty \vskip\interitemskipamount}%
  1390. \newdimen\listleftindent    \listleftindent = 0pt
  1391. \newdimen\listrightindent   \listrightindent = 0pt        
  1392. \let\listmarkerspace = \enspace
  1393. \newtoks\everylist
  1394. \def\listcompact{\interitemskipamount = 0pt \relax}%
  1395. \newdimen\@listindent
  1396. \def\beginlist{%
  1397.   \abovelistskip
  1398.   \@listindent = \parindent
  1399.   \advance\@listindent by \listleftindent
  1400.   \advance\leftskip by \@listindent
  1401.   \advance\rightskip by \listrightindent
  1402.   \itemnumber = 1
  1403.   \the\everylist
  1404. }%
  1405. \def\li{\@getoptionalarg\@finli}%
  1406. \def\@finli{%
  1407.   \ifx\@optionalarg\empty \else
  1408.     \expandafter\writeitemxref\expandafter{\@optionalarg}%
  1409.   \fi
  1410.   \ifnum\itemnumber=1 \else \interitemskip \fi
  1411.   \printitem
  1412.   \advance\itemnumber by 1
  1413.   \advance\itemletter by 1
  1414.   \advance\itemromannumeral by 1
  1415.   \ignorespaces
  1416. }%
  1417. \def\writeitemxref#1{\definexref{#1}\marker{item}}%
  1418. \def\printitem{%
  1419.   \par
  1420.   \vskip-\parskip
  1421.   \noindent
  1422.   \printmarker\marker
  1423. }%
  1424. \def\printmarker#1{\llap{\marker \enspace}}%
  1425. \def\endlist{\belowlistskip}%
  1426. \newcount\numberedlistdepth
  1427. \newcount\itemnumber
  1428. \newcount\itemletter
  1429. \newcount\itemromannumeral
  1430. \def\numberedmarker{%
  1431.   \ifcase\numberedlistdepth
  1432.       (impossible)%
  1433.   \or \printitemnumber
  1434.   \or \printitemletter
  1435.   \or \printitemromannumeral
  1436.   \else *%
  1437.   \fi
  1438. }%
  1439. \def\printitemnumber{\number\itemnumber}%
  1440. \def\printitemletter{\char\the\itemletter}%
  1441. \def\printitemromannumeral{\romannumeral\itemromannumeral}%
  1442. \def\numberedprintmarker#1{\llap{#1) \listmarkerspace}}%
  1443. \def\numberedlist{\environment{@numbered-list}%
  1444.   \advance\numberedlistdepth by 1
  1445.   \itemletter = `a
  1446.   \itemromannumeral = 1
  1447.   \beginlist
  1448.   \let\marker = \numberedmarker
  1449.   \let\printmarker = \numberedprintmarker
  1450. }%
  1451. \def\endnumberedlist{%
  1452.   \par
  1453.   \endenvironment{@numbered-list}%
  1454.   \endlist
  1455. }%
  1456. \let\orderedlist = \numberedlist
  1457. \let\endorderedlist = \endnumberedlist
  1458. \newcount\unorderedlistdepth
  1459. \def\unorderedmarker{%
  1460.   \ifcase\unorderedlistdepth
  1461.       (impossible)%
  1462.   \or \blackbox
  1463.   \or ---%
  1464.   \else *%
  1465.   \fi
  1466. }%
  1467. \def\unorderedprintmarker#1{\llap{#1\listmarkerspace}}%
  1468. \def\unorderedlist{\environment{@unordered-list}%
  1469.   \advance\unorderedlistdepth by 1
  1470.   \beginlist
  1471.   \let\marker = \unorderedmarker
  1472.   \let\printmarker = \unorderedprintmarker
  1473. }%
  1474. \def\endunorderedlist{%
  1475.   \par
  1476.   \endenvironment{@unordered-list}%
  1477.   \endlist
  1478. }%
  1479. \def\listing#1{%
  1480.    \par \begingroup
  1481.    \@setuplisting
  1482.    \setuplistinghook
  1483.    \input #1
  1484.    \endgroup
  1485. }%
  1486. \let\setuplistinghook = \relax
  1487. \def\linenumberedlisting{%
  1488.   \ifx\lineno\undefined \innernewcount\lineno \fi
  1489.   \lineno = 0
  1490.   \everypar = {\advance\lineno by 1 \printlistinglineno}%
  1491. }%
  1492. \def\printlistinglineno{\llap{[\the\lineno]\quad}}%
  1493. \def\listingfont{\tt}%
  1494. \def\@setuplisting{%
  1495.    \uncatcodespecials
  1496.    \obeywhitespace
  1497.    \makeactive\`
  1498.    \makeactive\^^I
  1499.    \def^^L{\vfill\eject}%
  1500.    \parskip = 0pt
  1501.    \listingfont
  1502. }%
  1503. {%
  1504.    \makeactive\`
  1505.    \gdef`{\relax\lq}% Defeat ligatures.
  1506. }%
  1507. {%
  1508.    \makeactive\^^I
  1509.    \gdef^^I{\hskip8\fontdimen2\font \relax}%
  1510. }%
  1511. \def\verbatimescapechar#1{%
  1512.   \gdef\@makeverbatimescapechar{%
  1513.     \@makeverbatimdoubleescape #1%
  1514.     \catcode`#1 = 0
  1515.   }%
  1516. }%
  1517. \def\@makeverbatimdoubleescape#1{%
  1518.   \catcode`#1 = \other
  1519.   \begingroup
  1520.     \lccode`\* = `#1%
  1521.     \lowercase{\endgroup \ece\def*{*}}%
  1522. }%
  1523. \verbatimescapechar\|  % initially escapechar is |
  1524. \def\verbatim{\begingroup
  1525.   \uncatcodespecials
  1526.   \obeywhitespace
  1527.   \makeactive\` % make space character a single space, not stretchable
  1528.   \@makeverbatimescapechar
  1529.   \tt}
  1530. \let\endverbatim = \endgroup
  1531. \def\definecontentsfile#1{%
  1532.   \ece\innernewwrite{#1file}%
  1533.   \ece\innernewif{if@#1fileopened}%
  1534.   \ece\let{#1filebasename} = \jobname
  1535.   \ece\def{open#1file}{\opencontentsfile{#1}}%
  1536.   \ece\def{write#1entry}{\writecontentsentry{#1}}%
  1537.   \ece\def{writenumbered#1entry}{\writenumberedcontentsentry{#1}}%
  1538.   \ece\innernewif{ifrewrite#1file} \csname rewrite#1filetrue\endcsname
  1539.   \ece\def{read#1file}{\readcontentsfile{#1}}%
  1540. }%
  1541. \definecontentsfile{toc}%
  1542. \def\opencontentsfile#1{%
  1543.   \csname if@#1fileopened\endcsname \else
  1544.      \ece{\immediate\openout}{#1file} = \csname #1filebasename\endcsname.#1
  1545.      \ece\global{@#1fileopenedtrue}%
  1546.   \fi
  1547. }%
  1548. \def\writecontentsentry#1#2#3{\writenumberedcontentsentry{#1}{#2}{#3}{}}%
  1549. \def\writenumberedcontentsentry#1#2#3#4{%
  1550.   \csname ifrewrite#1file\endcsname
  1551.     \csname open#1file\endcsname
  1552.     \toks0 = {\expandafter\noexpand \csname #1#2entry\endcsname}%
  1553.     \def\temp{#3}%
  1554.     \toks2 = \expandafter{#4}%
  1555.     \edef\cs{\the\toks2}%
  1556.     \edef\@wr{%
  1557.       \write\csname #1file\endcsname{%
  1558.         \the\toks0 % the \toc...entry control sequence
  1559.         {\sanitize\temp}% the text
  1560.         \ifx\empty\cs\else {\sanitize\cs}\fi % A secondary number, or nothing:
  1561.         {\noexpand\folio}% the page number
  1562.       }%
  1563.     }%
  1564.     \@wr
  1565.   \fi
  1566.   \ignorespaces
  1567. }%
  1568. \def\readcontentsfile#1{%
  1569.    \edef\temp{%
  1570.      \noexpand\testfileexistence[\csname #1filebasename\endcsname]{toc}%
  1571.    }\temp
  1572.    \if@fileexists
  1573.       \input \csname #1filebasename\endcsname.#1\relax
  1574.       \csname ifrewrite#1file\endcsname \csname open#1file\endcsname \endif
  1575.    \fi
  1576. }%
  1577. \def\endif{\fi}%
  1578. \def\tocchapterentry#1#2{\line{\bf #1 \dotfill\ #2}}%
  1579. \def\tocsectionentry#1#2{\line{\quad\sl #1 \dotfill\ \rm #2}}%
  1580. \def\tocsubsectionentry#1#2{\line{\qquad\rm #1 \dotfill\ #2}}%
  1581. \let\ifxrefwarning = \iftrue
  1582. \def\xrefwarningtrue{\@citewarningtrue \let\ifxrefwarning = \iftrue}%
  1583. \def\xrefwarningfalse{\@citewarningfalse \let\ifxrefwarning = \iffalse}%
  1584. \begingroup
  1585.   \catcode`\_ = 8
  1586.   \gdef\xrlabel#1{#1_x}%
  1587. \endgroup
  1588. \def\xrdef#1{\definexref{#1}{\noexpand\folio}{page}}%
  1589. \def\definexref#1#2#3{%
  1590.   \edef\temp{#1}%
  1591.   \readauxfile
  1592.   \edef\@wr{\noexpand\writeaux{\string\@definelabel{\temp}{#2}{#3}}}%
  1593.   \@wr
  1594.   \ignorespaces
  1595. }%
  1596. \def\@definelabel#1#2#3{%
  1597.   \expandafter\gdef\csname\xrlabel{#1}\endcsname{#2}%
  1598.   \global\setproperty{\xrlabel{#1}}{class}{#3}%
  1599. }%
  1600. \def\xrefn#1{%
  1601.   \readauxfile
  1602.   \expandafter \ifx\csname\xrlabel{#1}\endcsname\relax
  1603.     \if@citewarning
  1604.        \message{\linenumber Undefined label `#1'.}%
  1605.     \fi
  1606.     \expandafter\def\csname\xrlabel{#1}\endcsname{%
  1607.       `{\tt
  1608.         \escapechar = -1
  1609.         \expandafter\string\csname#1\endcsname
  1610.       }'%
  1611.     }%
  1612.   \fi
  1613.   \csname\xrlabel{#1}\endcsname % Always produce something.
  1614. }%
  1615. \let\refn = \xrefn
  1616. \def\xref{p.\thinspace\xrefn}%
  1617. \def\@maybewarnref{%
  1618.   \ifundefined{amsppt.sty}%
  1619.   \else
  1620.     \message{Warning: amsppt.sty and Eplain both define \string\ref. See
  1621.              the Eplain manual.}%
  1622.     \let\amsref = \ref
  1623.   \fi
  1624.   \let\ref = \eplainref
  1625.   \ref
  1626. }
  1627. \let\ref = \@maybewarnref
  1628. \def\eplainref{\@generalref{}}%
  1629. \def\refs{\@generalref s}%
  1630. \def\@generalref#1#2{%
  1631.   \readauxfile
  1632.   \edef\temp{\getproperty{\xrlabel{#2}}{class}}%
  1633.   \expandafter\ifx\csname \temp word\endcsname\relax \else
  1634.     \csname \temp word\endcsname
  1635.     #1\penalty\@M \ 
  1636.   \fi
  1637.   \refn{#2}%
  1638. }%
  1639. \newcount\eqnumber
  1640. \newcount\subeqnumber
  1641. \def\eqdefn{\@getoptionalarg\@fineqdefn}%
  1642. \def\@fineqdefn#1{%
  1643.   \ifx\@optionalarg\empty
  1644.     \global\advance\eqnumber by 1
  1645.     \def\temp{\eqconstruct{\number\eqnumber}}%
  1646.   \else
  1647.     \def\temp{\noexpand\@optionalarg}%
  1648.   \fi
  1649.   \global\subeqnumber = 0
  1650.   \gdef\@currenteqlabel{#1}%
  1651.   \toks0 = \expandafter{\@currenteqlabel}%
  1652.   \begingroup
  1653.     \def\eqrefn{\noexpand\eqrefn}%
  1654.     \edef\temp{\noexpand\@eqdefn{\the\toks0}{\temp}}%
  1655.     \temp
  1656.   \endgroup
  1657. }%
  1658. \def\eqsubdefn#1{%
  1659.   \global\advance\subeqnumber by 1
  1660.   \toks0 = {#1}%
  1661.   \toks2 = \expandafter{\@currenteqlabel}%
  1662.   \begingroup
  1663.     \def\eqrefn{\noexpand\eqrefn}%
  1664.     \def\eqsubreftext{\noexpand\eqsubreftext}%
  1665.     \edef\temp{%
  1666.       \noexpand\@eqdefn
  1667.         {\the\toks0}%
  1668.         {\eqsubreftext{\eqrefn{\the\toks2}}{\the\subeqnumber}}%
  1669.     }%
  1670.     \temp           
  1671.   \endgroup
  1672. }%
  1673. \def\@eqdefn#1#2{%
  1674.   \definexref{#1}{#2}{eq}%
  1675.   \@definelabel{#1}{#2}{eq}%
  1676. }%
  1677. \def\eqdef{\@getoptionalarg\@fineqdef}%
  1678. \def\@fineqdef{%
  1679.   \toks0 = \expandafter{\@optionalarg}%
  1680.   \edef\temp{\noexpand\@eqdef{\noexpand\eqdefn[\the\toks0]}}%
  1681.   \temp
  1682. }%
  1683. \def\eqsubdef{\@eqdef\eqsubdefn}%
  1684. \def\@eqdef#1#2{%
  1685.   #1{#2}% Define the label.
  1686.   \@maybedisableeqno
  1687.   \eqno \eqref{#2}% Print the text.
  1688.   \@mayberestoreeqno
  1689.   \ignorespaces
  1690. }%
  1691. \let\@mayberestoreeqno = \relax
  1692. \def\@maybedisableeqno{%
  1693.   \ifinner
  1694.     \global\let\eqno = \relax
  1695.     \global\let\@mayberestoreeqno = \@restoreeqno
  1696.   \fi
  1697. }%
  1698. \let\@primitiveeqno = \eqno
  1699. \def\@restoreeqno{%
  1700.   \global\let\eqno = \@primitiveeqno
  1701.   \global\let\@mayberestoreeqno = \empty
  1702. }%
  1703. \let\eqrefn = \xrefn
  1704. \def\eqref#1{\eqprint{\eqrefn{#1}}}%
  1705. \let\eqconstruct = \identity
  1706. \def\eqprint#1{(#1)}%
  1707. \def\eqsubreftext#1#2{#1.#2}%
  1708. \let\extraidxcmdsuffixes = \empty
  1709. \outer\def\defineindex#1{%
  1710.   \def\@idxprefix{#1}%
  1711.   \for\@idxcmd:=,marked,submarked,name%
  1712.                 \extraidxcmdsuffixes\do
  1713.   {%
  1714.     \@defineindexcmd\@idxcmd
  1715.   }%
  1716.   \ece\innernewwrite{@#1indexfile}%
  1717.   \ece\innernewif{if@#1indexfileopened}%
  1718. }%
  1719. \newif\ifsilentindexentry
  1720. \def\@defineindexcmd#1{%
  1721.   \@defineoneindexcmd{s}{#1}\silentindexentrytrue
  1722.   \@defineoneindexcmd{}{#1}\silentindexentryfalse
  1723. }%
  1724. \def\@defineoneindexcmd#1#2#3{%
  1725.   \toks@ = {#3}%
  1726.   \edef\temp{%
  1727.     \def
  1728.       \expandonce\csname#1\@idxprefix dx#2\endcsname % e.g., \idx or \sidxname.
  1729.       {\def\noexpand\@idxprefix{\@idxprefix}% define \@idxprefix
  1730.        \expandonce\csname @@#1idx#2\endcsname
  1731.       }%
  1732.     \def
  1733.       \expandonce\csname @@#1idx#2\endcsname{% e.g., \@@idx
  1734.         \the\toks@
  1735.         \noexpand\@idxgetrange\expandonce\csname @#1idx#2\endcsname
  1736.       }%
  1737.   }%
  1738.   \temp
  1739. }%
  1740. \let\indexfilebasename = \jobname
  1741. \def\@idxwrite#1#2{%
  1742.   \csname if@\@idxprefix indexfileopened\endcsname \else
  1743.     \expandafter\immediate\openout\csname @\@idxprefix indexfile\endcsname =
  1744.       \indexfilebasename.\@idxprefix dx
  1745.     \expandafter\global\csname @\@idxprefix indexfileopenedtrue\endcsname
  1746.   \fi
  1747.   \def\temp{#1}%
  1748.   \edef\@wr{%
  1749.     \expandafter\write\csname @\@idxprefix indexfile\endcsname{%
  1750.       \string\indexentry
  1751.       {\sanitize\temp}%
  1752.       {\noexpand#2}%
  1753.     }%
  1754.   }%
  1755.   \@wr
  1756.   \ifindexproofing \insert\@indexproof{\indexproofterm{#1}}\fi
  1757.   \hookrun{afterindexterm}%
  1758.   \ifsilentindexentry \expandafter\ignorespaces\fi
  1759. }%
  1760. \newif\ifindexproofing
  1761. \newinsert\@indexproof
  1762. \dimen\@indexproof = \maxdimen                  % No limit on number of terms.
  1763. \count\@indexproof = 0  \skip\@indexproof = 0pt % They take up no space.
  1764. \font\indexprooffont = cmtt8
  1765. \def\indexproofterm#1{\hbox{\strut \indexprooffont #1}}%
  1766. \let\@plainmakeheadline = \makeheadline
  1767. \def\makeheadline{%
  1768.   \indexproofunbox
  1769.   \@plainmakeheadline
  1770. }%
  1771. \def\indexsetmargins{%
  1772.   \ifx\undefined\outsidemargin
  1773.     \dimen@ = 1in
  1774.     \advance\dimen@ by \hoffset
  1775.     \edef\outsidemargin{\the\dimen@}%
  1776.     \let\insidemargin = \outsidemargin
  1777.   \fi
  1778. }%
  1779. \def\indexproofunbox{%
  1780.   \ifvoid\@indexproof\else
  1781.     \indexsetmargins
  1782.     \rlap{%
  1783.       \kern\hsize
  1784.       \ifodd\pageno \kern\outsidemargin \else \kern\insidemargin \fi
  1785.       \vbox to 0pt{\unvbox\@indexproof\vss}%
  1786.     }%
  1787.   \fi
  1788. }%
  1789. \def\idxrangebeginword{begin}%
  1790. \def\idxbeginrangemark{(}% the corresponding magic char to go in the idx file
  1791. \def\idxrangeendword{end}%
  1792. \def\idxendrangemark{)}%
  1793. \def\idxseecmdword{see}%
  1794. \def\idxseealsocmdword{seealso}%
  1795. \newif\if@idxsee
  1796. \let\@idxseenterm = \relax
  1797. \def\idxpagemarkupcmdword{pagemarkup}%
  1798. \let\@idxpagemarkup = \relax
  1799. \def\@idxgetrange#1{%
  1800.   \let\@idxrangestr = \empty
  1801.   \let\@afteridxgetrange = #1%
  1802.   \@getoptionalarg\@finidxgetopt
  1803. }%
  1804. \def\@finidxgetopt{%
  1805.   \for\@idxarg:=\@optionalarg\do{%
  1806.     \expandafter\@idxcheckpagemarkup\@idxarg=,%
  1807.     \ifx\@idxarg\idxrangebeginword
  1808.       \def\@idxrangestr{\idxencapoperator\idxbeginrangemark}%
  1809.     \else
  1810.       \ifx\@idxarg\idxrangeendword
  1811.         \def\@idxrangestr{\idxencapoperator\idxendrangemark}%
  1812.       \else
  1813.         \ifx\@idxarg\idxseecmdword
  1814.           \def\@idxpagemarkup{indexsee}%
  1815.           \@idxseetrue
  1816.         \else
  1817.           \ifx\@idxarg\idxseealsocmdword
  1818.             \def\@idxpagemarkup{indexseealso}%
  1819.             \@idxseetrue
  1820.           \else
  1821.              \ifx\@idxpagemarkup\relax
  1822.                \errmessage{Unrecognized index option `\@idxarg'}%
  1823.              \fi
  1824.           \fi
  1825.         \fi
  1826.       \fi
  1827.     \fi
  1828.   }%
  1829.   \@afteridxgetrange
  1830. }%
  1831. \def\@idxcheckpagemarkup#1=#2,{%
  1832.   \def\temp{#1}%
  1833.   \ifx\temp\idxpagemarkupcmdword
  1834.     \if ,#2, % If #2 is empty, complain.
  1835.       \errmessage{Missing markup command to `pagemarkup'}%
  1836.     \else
  1837.       \def\temp##1={##1}%
  1838.       \edef\@idxpagemarkup{\temp\string#2}%
  1839.     \fi
  1840.   \fi
  1841. }%
  1842. \def\idxsubentryseparator{!}%
  1843. \def\idxencapoperator{|}%
  1844. \def\idxmaxpagenum{99999}%
  1845. \newtoks\@idxmaintoks
  1846. \newtoks\@idxsubtoks
  1847. \def\@idxtokscollect{%
  1848.   \edef\temp{\the\@idxsubtoks}%
  1849.   \edef\@indexentry{%
  1850.     \the\@idxmaintoks
  1851.     \ifx\temp\empty\else \idxsubentryseparator\the\@idxsubtoks \fi
  1852.     \@idxrangestr
  1853.   }%
  1854.   \if@idxsee
  1855.     \@idxseefalse % Reset so the next term won't be a `see'.
  1856.     \edef\temp{\noexpand\@finidxtokscollect{\idxmaxpagenum}}%
  1857.   \else
  1858.     \def\temp{\@finfinidxtokscollect\folio}%
  1859.   \fi
  1860.   \temp
  1861. }%
  1862. \def\@finidxtokscollect#1#2{%
  1863.   \def\@idxseenterm{#2}%
  1864.   \@finfinidxtokscollect{#1}%
  1865. }%
  1866. \def\@finfinidxtokscollect#1{%
  1867.   \ifx\@idxpagemarkup\relax \else
  1868.     \toks@ = \expandafter{\@indexentry}%
  1869.     \edef\@indexentry{\the\toks@ \idxencapoperator \@idxpagemarkup}%
  1870.     \let\@idxpagemarkup = \relax
  1871.   \fi
  1872.   \ifx\@idxseenterm\relax \else
  1873.     \toks@ = \expandafter{\@indexentry}%
  1874.     \edef\@indexentry{\the\toks@{\sanitize\@idxseenterm}}%
  1875.     \let\@idxseenterm = \relax
  1876.   \fi
  1877.   \expandafter\@idxwrite\expandafter{\@indexentry}{#1}%
  1878. }%
  1879. \def\@idxcollect#1#2{%
  1880.   \@idxmaintoks = {#1}%
  1881.   \@idxsubtoks = {#2}%
  1882.   \@idxtokscollect
  1883. }%
  1884. \def\@idx#1{%
  1885.   #1% Produce TERM as output.
  1886.   \@idxcollect{#1}{}%
  1887. }%
  1888. \def\@sidx#1{\@idxmaintoks = {#1}\@getoptionalarg\@finsidx}%
  1889. \def\@finsidx{%
  1890.   \@idxsubtoks = \expandafter{\@optionalarg}%
  1891.   \@idxtokscollect
  1892. }%
  1893. \def\idxsortkeysep{@}% This `@' is catcode 11, but it doesn't matter.
  1894. \def\@idxconstructmarked#1#2#3{%
  1895.   \toks@ = {#2}% The control sequence.
  1896.   \toks2 = {#3}% The term.
  1897.   \edef\temp{\the\toks2 \idxsortkeysep \the\toks@{\the\toks2}}%
  1898.   #1 = \expandafter{\temp}%
  1899. }%
  1900. \def\@idxmarked#1#2{%
  1901.   #1{#2}% Produce \CS{TERM} as output.
  1902.   \@idxconstructmarked\@idxmaintoks{#1}{#2}%
  1903.   \@idxsubtoks = {}%
  1904.   \@idxtokscollect
  1905. }%
  1906. \def\@sidxmarked#1#2{%
  1907.   \@idxconstructmarked\toks@{#1}{#2}%
  1908.   \edef\temp{{\the\toks@}}%
  1909.   \expandafter\@sidx\temp
  1910. }%
  1911. \def\@idxsubmarked#1#2#3{%
  1912.   #1 #2{#3}% produce `TERM \CS{SUBTERM} as output.
  1913.   \@sidxsubmarked{#1}{#2}{#3}%
  1914. }%
  1915. \def\@sidxsubmarked#1#2#3{%
  1916.   \@idxmaintoks = {#1}%
  1917.   \@idxconstructmarked\@idxsubtoks{#2}{#3}%
  1918.   \@idxtokscollect
  1919. }%
  1920. \def\idxnameseparator{, }% as in `Tachikawa, Elizabeth'
  1921. \def\@idxcollectname#1#2{%
  1922.   \def\temp{#1}%
  1923.   \ifx\temp\empty
  1924.     \toks@ = {}%
  1925.   \else
  1926.     \toks@ = {\idxnameseparator #1}%
  1927.   \fi
  1928.   \toks2 = {#2}%
  1929.   \edef\temp{\the\toks2 \the\toks@}%
  1930. }%
  1931. \def\@idxname#1#2{%
  1932.   #1 #2% Separate the names by a space in the output.
  1933.   \@idxcollectname{#1}{#2}%
  1934.   \expandafter\@idxcollect\expandafter{\temp}{}%
  1935. }%
  1936. \def\@sidxname#1#2{%
  1937.   \@idxcollectname{#1}{#2}%
  1938.   \expandafter\@sidx\expandafter{\temp}%
  1939. }%
  1940. \let\indexfonts = \relax
  1941. \def\readindexfile#1{%
  1942.   \edef\@idxprefix{#1}%
  1943.   \testfileexistence[\indexfilebasename]{\@idxprefix nd}%
  1944.   \iffileexists \begingroup
  1945.     \ifx\begin\undefined
  1946.       \def\begin##1{\@beginindex}%
  1947.       \let\end = \@gobble
  1948.     \fi
  1949.     \input \indexfilebasename.\@idxprefix nd
  1950.     \singlecolumn
  1951.   \endgroup
  1952.   \else
  1953.     \message{No index file \indexfilebasename.\@idxprefix nd.}%
  1954.   \fi
  1955. }%
  1956. \def\@beginindex{%
  1957.   \let\item = \@indexitem
  1958.   \let\subitem = \@indexsubitem
  1959.   \let\subsubitem = \@indexsubsubitem
  1960.   \indexfonts
  1961.   \doublecolumns
  1962.   \parindent = 0pt
  1963.   \hookrun{beginindex}%
  1964. }%
  1965. \let\indexspace = \bigbreak
  1966. \let\afterindexterm = \quad
  1967. \newskip\aboveindexitemskipamount  \aboveindexitemskipamount = 0pt plus2pt
  1968. \def\aboveindexitemskip{\vskip\aboveindexitemskipamount}%
  1969. \def\@indexitem{\begingroup
  1970.   \@indexitemsetup
  1971.   \leftskip = 0pt
  1972.   \aboveindexitemskip
  1973.   \penalty-100 % Encourage page breaks before items.
  1974.   \def\par{\endgraf\endgroup\nobreak}%
  1975. }%
  1976. \def\@indexsubitem{%
  1977.   \@indexitemsetup
  1978.   \leftskip = 1em
  1979. }%
  1980. \def\@indexsubsubitem{%
  1981.   \@indexitemsetup
  1982.   \leftskip = 2em
  1983. }%
  1984. \def\@indexitemsetup{%
  1985.   \par
  1986.   \hangindent = 1em
  1987.   \raggedright
  1988.   \hyphenpenalty = 10000
  1989.   \hookrun{indexitem}%
  1990. }%
  1991. \def\seevariant{\it}%
  1992. \def\indexseeword{See}%
  1993. \def\indexsee#1#2{{\seevariant \indexseeword\ }#1}%
  1994. \def\indexseealsowords{see also}%
  1995. \def\indexseealso#1#2{{\seevariant \indexseealsowords\ }#1}%
  1996. \defineindex{i}%
  1997. \begingroup
  1998.   \catcode `\^^M = \active %
  1999.   \gdef\flushleft{%
  2000.     \def\@endjustifycmd{\@endflushleft}%
  2001.     \def\@eoljustifyaction{\null\hfil\break}%
  2002.     \let\@firstlinejustifyaction = \relax
  2003.     \@startjustify %
  2004.   }%
  2005.   \gdef\flushright{%
  2006.     \def\@endjustifycmd{\@endflushright}%
  2007.     \def\@eoljustifyaction{\break\null\hfil}%
  2008.     \def\@firstlinejustifyaction{\hfil\null}%
  2009.     \@startjustify %
  2010.   }%
  2011.   \gdef\center{%
  2012.     \def\@endjustifycmd{\@endcenter}%
  2013.     \def\@eoljustifyaction{\hfil\break\null\hfil}%
  2014.     \def\@firstlinejustifyaction{\hfil\null}%
  2015.     \@startjustify %
  2016.   }%
  2017.   \gdef\@startjustify{%
  2018.     \parskip = 0pt
  2019.     \catcode`\^^M = \active %
  2020.     \def^^M{\futurelet\next\@finjustifyreturn}%
  2021.     \def\@eateol##1^^M{%
  2022.       \def\temp{##1}%
  2023.       \@firstlinejustifyaction %
  2024.       \ifx\temp\empty\else \temp^^M\fi %
  2025.     }%
  2026.     \expandafter\aftergroup\@endjustifycmd %
  2027.     \checkenv \environmenttrue %
  2028.     \par\noindent %
  2029.     \@eateol %
  2030.   }%
  2031.   \gdef\@finjustifyreturn{%
  2032.     \@eoljustifyaction %
  2033.     \ifx\next^^M%
  2034.       \def\par{\endgraf\vskip\blanklineskipamount \global\let\par = \endgraf}%
  2035.       \@endjustifycmd %
  2036.       \noindent %
  2037.       \@firstlinejustifyaction %
  2038.     \fi %
  2039.   }%
  2040. \endgroup
  2041. \def\@endflushleft{\unpenalty{\parfillskip = 0pt plus1fil\par}\ignorespaces}%
  2042. \def\@endflushright{% Remove the \hfil\null\break we just put on.
  2043.    \unskip \setbox0=\lastbox \unpenalty
  2044.    {\parfillskip = 0pt \par}\ignorespaces
  2045. }%
  2046. \def\@endcenter{% Remove the \hfil\null\break we just put on.
  2047.    \unskip \setbox0=\lastbox \unpenalty
  2048.    {\parfillskip = 0pt plus1fil \par}\ignorespaces
  2049. }%
  2050. \newcount\abovecolumnspenalty   \abovecolumnspenalty = 10000
  2051. \newcount\@linestogo         % Lines remaining to process.
  2052. \newcount\@linestogoincolumn % Lines remaining in column.
  2053. \newcount\@columndepth       % Number of lines in a column.
  2054. \newdimen\@columnwidth       % Width of each column.
  2055. \newtoks\crtok  \crtok = {\cr}%
  2056. \newcount\currentcolumn
  2057. \def\makecolumns#1/#2: {\par \begingroup
  2058.    \@columndepth = #1
  2059.    \advance\@columndepth by #2
  2060.    \advance\@columndepth by -1
  2061.    \divide \@columndepth by #2
  2062.    \@linestogoincolumn = \@columndepth
  2063.    \@linestogo = #1
  2064.    \currentcolumn = 1
  2065.    \def\@endcolumnactions{%
  2066.       \ifnum \@linestogo<2 
  2067.          \the\crtok \egroup \endgroup \par % End \valign and \makecolumns.
  2068.       \else
  2069.          \global\advance\@linestogo by -1
  2070.          \ifnum\@linestogoincolumn<2
  2071.             \global\advance\currentcolumn by 1
  2072.             \global\@linestogoincolumn = \@columndepth
  2073.             \the\crtok
  2074.          \else
  2075.             &\global\advance\@linestogoincolumn by -1
  2076.          \fi
  2077.       \fi
  2078.    }%
  2079.    \makeactive\^^M
  2080.    \letreturn \@endcolumnactions
  2081.    \@columnwidth = \hsize
  2082.      \advance\@columnwidth by -\parindent
  2083.      \divide\@columnwidth by #2
  2084.    \penalty\abovecolumnspenalty
  2085.    \noindent % It's not a paragraph (usually).
  2086.    \valign\bgroup
  2087.      &\hbox to \@columnwidth{\strut \hsize = \@columnwidth ##\hfil}\cr
  2088. }%
  2089. \newcount\footnotenumber
  2090. \newdimen\footnotemarkseparation \footnotemarkseparation = .5em
  2091. \newskip\interfootnoteskip \interfootnoteskip = 0pt
  2092. \newtoks\everyfootnote
  2093. \newdimen\footnoterulewidth \footnoterulewidth = 2in
  2094. \newdimen\footnoteruleheight \footnoteruleheight = 0.4pt
  2095. \newdimen\belowfootnoterulespace \belowfootnoterulespace = 2.6pt
  2096. \let\@plainfootnote = \footnote
  2097. \let\@plainvfootnote = \vfootnote
  2098. \def\vfootnote#1{\insert\footins\bgroup
  2099.   \interlinepenalty\interfootnotelinepenalty
  2100.   \splittopskip\ht\strutbox % top baseline for broken footnotes
  2101.   \advance\splittopskip by \interfootnoteskip
  2102.   \splitmaxdepth\dp\strutbox
  2103.   \floatingpenalty\@MM
  2104.   \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
  2105.   \everypar = {}%
  2106.   \parskip = 0pt % because of the vskip
  2107.   \ifnum\@numcolumns > 1 \hsize = \@normalhsize \fi
  2108.   \the\everyfootnote
  2109.   \vskip\interfootnoteskip
  2110.   \indent\llap{#1\kern\footnotemarkseparation}\footstrut\futurelet\next\fo@t
  2111. }%
  2112. \def\footnoterule{\dimen@ = \footnoteruleheight
  2113.   \advance\dimen@ by \belowfootnoterulespace
  2114.   \kern-\dimen@
  2115.   \hrule width\footnoterulewidth height\footnoteruleheight depth0pt
  2116.   \kern\belowfootnoterulespace
  2117.   \vskip-\interfootnoteskip
  2118. }%
  2119. \def\numberedfootnote{%
  2120.   \global\advance\footnotenumber by 1
  2121.   \@plainfootnote{$^{\number\footnotenumber}$}%
  2122. }%
  2123. \newdimen\paperheight \paperheight = 11in
  2124. \def\topmargin{\afterassignment\@finishtopmargin \dimen@}%
  2125. \def\@finishtopmargin{%
  2126.   \dimen2 = \voffset        % Remember the old \voffset.
  2127.   \voffset = \dimen@ \advance\voffset by -1in
  2128.   \advance\dimen2 by -\voffset    % Compute the change in \voffset.
  2129.   \advance\vsize by \dimen2    % Change type area accordingly.
  2130. }%
  2131. \def\advancetopmargin{%
  2132.   \dimen@ = 0pt \afterassignment\@finishadvancetopmargin \advance\dimen@
  2133. }%
  2134. \def\@finishadvancetopmargin{%
  2135.   \advance\voffset by \dimen@
  2136.   \advance\vsize by -\dimen@
  2137. }%
  2138. \def\bottommargin{\afterassignment\@finishbottommargin \dimen@}%
  2139. \def\@finishbottommargin{%
  2140.   \@computebottommargin        % Result in \dimen2.
  2141.   \advance\dimen2 by -\dimen@    % Compute the change in the bottom margin.
  2142.   \advance\vsize by \dimen2    % Change the type area.
  2143. }%
  2144. \def\advancebottommargin{%
  2145.   \dimen@ = 0pt \afterassignment\@finishadvancebottommargin \advance\dimen@
  2146. }%
  2147. \def\@finishadvancebottommargin{%
  2148.   \advance\vsize by -\dimen@
  2149. }%
  2150. \def\@computebottommargin{%
  2151.   \dimen2 = \paperheight    % The total paper size.
  2152.   \advance\dimen2 by -\vsize    % Less the text size.
  2153.   \advance\dimen2 by -\voffset    % Less the offset at the top.
  2154.   \advance\dimen2 by -1in    % Less the default offset.
  2155. }%
  2156. \newdimen\paperwidth \paperwidth = 8.5in
  2157. \def\leftmargin{\afterassignment\@finishleftmargin \dimen@}%
  2158. \def\@finishleftmargin{%
  2159.   \dimen2 = \hoffset        % Remember the old \hoffset.
  2160.   \hoffset = \dimen@ \advance\hoffset by -1in
  2161.   \advance\dimen2 by -\hoffset    % Compute the change in \hoffset.
  2162.   \advance\hsize by \dimen2    % Change type area accordingly.
  2163. }%
  2164. \def\advanceleftmargin{%
  2165.   \dimen@ = 0pt \afterassignment\@finishadvanceleftmargin \advance\dimen@
  2166. }%
  2167. \def\@finishadvanceleftmargin{%
  2168.   \advance\hoffset by \dimen@
  2169.   \advance\hsize by -\dimen@
  2170. }%
  2171. \def\rightmargin{\afterassignment\@finishrightmargin \dimen@}%
  2172. \def\@finishrightmargin{%
  2173.   \@computerightmargin        % Result in \dimen2.
  2174.   \advance\dimen2 by -\dimen@    % Compute the change in the right margin.
  2175.   \advance\hsize by \dimen2    % Change the type area.
  2176. }%
  2177. \def\advancerightmargin{%
  2178.   \dimen@ = 0pt \afterassignment\@finishadvancerightmargin \advance\dimen@
  2179. }%
  2180. \def\@finishadvancerightmargin{%
  2181.   \advance\hsize by -\dimen@
  2182. }%
  2183. \def\@computerightmargin{%
  2184.   \dimen2 = \paperwidth        % The total paper size.
  2185.   \advance\dimen2 by -\hsize    % Less the text size.
  2186.   \advance\dimen2 by -\hoffset    % Less the offset at the left.
  2187.   \advance\dimen2 by -1in    % Less the default offset.
  2188. }%
  2189. \newskip\abovecolumnskip \abovecolumnskip = \bigskipamount
  2190. \newskip\belowcolumnskip \belowcolumnskip = \bigskipamount
  2191. \newdimen\gutter \gutter = 2pc
  2192. \newbox\@partialpage
  2193. \newdimen\@columnhsize
  2194. \newdimen\@normalhsize
  2195. \newdimen\@normalvsize
  2196. \newtoks\previousoutput
  2197. \def\quadcolumns{\@columns4}%
  2198. \def\triplecolumns{\@columns3}%
  2199. \def\doublecolumns{\@columns2}%
  2200. \def\begincolumns#1{\ifcase#1\relax \or \singlecolumn \or \@columns2 \or
  2201.                             \@columns3 \or \@columns4 \else \relax \fi}%
  2202. \let\endcolumns = \singlecolumn
  2203. \let\@ndcolumns = \relax
  2204. \chardef\@numcolumns = 1
  2205. \def\@columns#1{%
  2206.   \@ndcolumns
  2207.   \let\@ndcolumns = \@endcolumns
  2208.   \chardef\@numcolumns = #1
  2209.   \par                     % Shouldn't start in horizontal mode.
  2210.   \previousoutput = \expandafter{\the\output}%
  2211.   \@columnhsize = \hsize
  2212.   \count@ = \@numcolumns
  2213.   \advance\count@ by -1
  2214.   \advance\@columnhsize by -\count@\gutter
  2215.   \divide\@columnhsize by \@numcolumns
  2216.   \output = {\global\setbox\@partialpage =
  2217.     \vbox{\unvbox255\vskip\abovecolumnskip}%
  2218.   }%
  2219.   \pagegoal = \pagetotal
  2220.   \eject
  2221.   \output = {\@columnoutput}%
  2222.   \@normalhsize = \hsize
  2223.   \@normalvsize = \vsize
  2224.   \hsize = \@columnhsize
  2225.   \advance\vsize by -\ht\@partialpage
  2226.   \advance\vsize by -\ht\footins
  2227.   \ifvoid\footins\else \advance\vsize by -\skip\footins \fi
  2228.   \multiply\count\footins by \@numcolumns
  2229.   \advance\vsize by -\ht\topins
  2230.   \ifvoid\topins\else \advance\vsize by -\skip\topins \fi
  2231.   \multiply\count\topins by \@numcolumns
  2232.   \global\vsize = \@numcolumns\vsize
  2233. }%
  2234. \def\@columnsplit{%
  2235.   \splittopskip = \topskip
  2236.   \splitmaxdepth = \baselineskip
  2237.   \dimen@ = \ht255
  2238.     \divide\dimen@ by \@numcolumns
  2239.  \begingroup
  2240.     \vbadness = 10000
  2241.     \global\setbox1 = \vsplit255 to \dimen@  \global\wd1 = \hsize
  2242.     \global\setbox3 = \vsplit255 to \dimen@  \global\wd3 = \hsize
  2243.     \ifnum\@numcolumns > 2
  2244.       \global\setbox5 = \vsplit255 to \dimen@ \global\wd5 = \hsize
  2245.     \fi
  2246.     \ifnum\@numcolumns > 3
  2247.       \global\setbox7 = \vsplit255 to \dimen@ \global\wd7 = \hsize
  2248.     \fi
  2249.   \endgroup
  2250.   \setbox0 = \box255
  2251.   \global\setbox255 = \vbox{%
  2252.     \unvbox\@partialpage
  2253.     \ifcase\@numcolumns \relax\or\relax
  2254.       \or \hbox to \@normalhsize{\box1\hfil\box3}%
  2255.       \or \hbox to \@normalhsize{\box1\hfil\box3\hfil\box5}%
  2256.       \or \hbox to \@normalhsize{\box1\hfil\box3\hfil\box5\hfil\box7}%
  2257.     \fi
  2258.   }%
  2259.   \setbox\@partialpage = \box0
  2260. }%
  2261. \def\@columnoutput{%
  2262.   \@columnsplit
  2263.   \hsize = \@normalhsize % Local to \output's group.
  2264.   \vsize = \@normalvsize
  2265.   \the\previousoutput
  2266.   \unvbox\@partialpage
  2267.   \penalty\outputpenalty
  2268.   \global\vsize = \@numcolumns\@normalvsize
  2269. }%
  2270. \def\singlecolumn{%
  2271.   \@ndcolumns
  2272.   \chardef\@numcolumns = 1
  2273.   \vskip\belowcolumnskip
  2274.   \nointerlineskip
  2275. }%
  2276. \def\@endcolumns{%
  2277.   \global\let\@ndcolumns = \relax
  2278.   \par % Shouldn't start in horizontal mode.
  2279.   \global\output = {\global\setbox1 = \box255}%
  2280.   \pagegoal = \pagetotal
  2281.   \eject                    % Exercise the page builder, i.e., \output.
  2282.   \global\setbox255 = \box1 % Retrieve what the fake \output set.
  2283.   \@columnsplit
  2284.   \global\vsize = \@normalvsize
  2285.   \global\hsize = \@normalhsize
  2286.   \global\output = \expandafter{\the\previousoutput}%
  2287.   \ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi
  2288.   \unvbox255
  2289. }%
  2290. \def\columnfill{%
  2291.   \dimen@ = \@normalvsize
  2292.   \advance\dimen@ by -\pagetotal
  2293.   \kern\dimen@
  2294. }
  2295. \let\wlog = \@plainwlog
  2296. \catcode`@ = \@eplainoldatcode
  2297. \def\fmtname{eplain}%
  2298. \def\eplain{t}%
  2299. {\edef\plainversion{\fmtversion}%
  2300.  \xdef\fmtversion{2.6:  2 May 1994 (and plain \plainversion)}%
  2301. }%
  2302.