diff options
Diffstat (limited to 'macros/eplain/tex')
-rw-r--r-- | macros/eplain/tex/arrow.tex | 597 | ||||
-rw-r--r-- | macros/eplain/tex/btxmac.tex | 929 | ||||
-rw-r--r-- | macros/eplain/tex/eplain.aux | 3 | ||||
-rw-r--r-- | macros/eplain/tex/eplain.ini | 6 | ||||
-rw-r--r-- | macros/eplain/tex/eplain.tex | 4135 |
5 files changed, 5670 insertions, 0 deletions
diff --git a/macros/eplain/tex/arrow.tex b/macros/eplain/tex/arrow.tex new file mode 100644 index 0000000000..9c43c2fe3c --- /dev/null +++ b/macros/eplain/tex/arrow.tex @@ -0,0 +1,597 @@ +% arrow.tex: macros for commutative diagrams. +% +% Copyright (C) 1991,1992 Steven T. Smith. +% stsmith@ll.mit.edu +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2, or (at your option) +% any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this file; see the file COPYING. If not, write to the +% Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +% Boston, MA 02110-1301, USA. +% +% As a special exception, when this file is read by TeX when +% processing a TeX source document, you may use the result without +% restriction. + +% Version 0 Released for alpha testing, November 16, 1991. +% Version 0.1 Morphism positions for slanted lines improved, Nov. 17, 1991. +% Version 0.11 \biline changed to \bisline for compatible naming. 11/21/91 +% Version 0.2 Equate \lft & \rt w. _ and ^ instead of L_{12} & R_{12}. 1/20/92 +% Version 1.0 Distributed with Eplain. 1/20/92 +% Version 1.1 Purged \newcount's, etc.; Warner ref.; \getch@nnel logic. 4/21/92 +% Version 1.11 Replace \smash with \smash@@ (for amstex compatibility) 3/27/96 + + + +% Syntax: \[arrow](X,Y) or +% \[arrow](X,Y)\lft{MOR} (morphism placed left of arrow) or +% \[arrow](X,Y)\rt{MOR} (morphism placed right of arrow) +% +% [arrow] is one of +% sline (straight line) +% dotline (dotted line) * Unimplemented +% arrow (straight arrow) +% dotarrow (dotted arrow) * Unimplemented +% +% The following allow plain versions and some combination of \lft and \rt. +% biarrow (two straight arrows) +% adjarrow (two adjoint arrows) +% bisline (two straight lines) +% +% Also, for left, right, up, and down mappings: +% +% \mapright (or \mapright^{f_*}, \mapright_{f_*}) +% \mapleft (ditto) +% \mapup (use \rt and \lft as above) +% \mapdown (ditto) +% +% And variants of these (can use combinations of ^/_ and lft/rt): +% +% \bimapright (two right arrows) +% \bimapleft (two left arrows) +% \adjmapright (two adjoint arrows; <- over ->) +% \adjmapleft (two adjoint arrows; -> over <-) +% \hline (horizontal line) +% \dothline (dotted horizontal line) * Unimplemented +% \bihline (two horizontal lines) +% +% \bimapdown (two down arrows) +% \bimapup (two left arrows) +% \adjmapdown (two adjoint arrows; down then up) +% \adjmapup (two adjoint arrows; up then down) +% \vline (vertical line) +% \dotvline (dotted vertical line) * Unimplemented +% \bivline (two vertical lines) + +% Use \thinlines temporarily to find the current catcode of @, so we can +% restore it at the end. +\edef\thinlines{\the\catcode`@ }% +\catcode`@ = 11 +\let\@oldatcatcode = \thinlines + + +% I changed \smash to \smash@@ in these macros to avoid AMSTEX conflict. + +\def\smash@@{\relax % \relax, in case this comes first in \halign + \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh + \fi\next} +\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh} +\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh} +\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@} + +% Adapted LaTeX code for drawing lines and vectors + +% Note: to ensure compatibility with LaTeX, all LaTeX control +% sequences have been renamed. Control sequence names containing the +% at sign (@) have been changed to contain an ampersand (&) instead. +\edef\@oldandcatcode{\the\catcode`& }% +\catcode`& = 11 + +% LaTeX macros changed here: +% \line - changed to \drawline +% \vector - changed to \drawvector +% \@badlinearg - simply uses \errmessage now +% \@height, \@width, and \@depth are changed to height, width, and depth +% \@sline and \@svector - changed so that \hbox{\drawline...} yields +% a box of positive width and positive height for a positive slope +% and positive depth for a negative slope. +% \@hline and \@hvector - likewise +% \unitlength eliminated; pass dimensions to \drawline and \drawvector. + +% LaTeX's while loop +\def\&whilenoop#1{}% +\def\&whiledim#1\do #2{\ifdim #1\relax#2\&iwhiledim{#1\relax#2}\fi}% +\def\&iwhiledim#1{\ifdim #1\let\&nextwhile=\&iwhiledim + \else\let\&nextwhile=\&whilenoop\fi\&nextwhile{#1}}% + +% LaTeX's \line and \vector macros: +\newif\if&negarg +\newdimen\&wholewidth +\newdimen\&halfwidth + +\font\tenln=line10 + +\def\thinlines{\let\&linefnt\tenln \let\&circlefnt\tencirc + \&wholewidth\fontdimen8\tenln \&halfwidth .5\&wholewidth}% +\def\thicklines{\let\&linefnt\tenlnw \let\&circlefnt\tencircw + \&wholewidth\fontdimen8\tenlnw \&halfwidth .5\&wholewidth}% + +\def\drawline(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax \&linelen=#3\relax + \ifnum\&xarg =0 \&vline \else \ifnum\&yarg =0 \&hline \else \&sline\fi\fi}% + +\def\&sline{\leavevmode + \ifnum\&xarg< 0 \&negargtrue \&xarg -\&xarg \&yyarg -\&yarg + \else \&negargfalse \&yyarg \&yarg \fi + \ifnum \&yyarg >0 \&tempcnta\&yyarg \else \&tempcnta -\&yyarg \fi + \ifnum\&tempcnta>6 \&badlinearg \&yyarg0 \fi + \ifnum\&xarg>6 \&badlinearg \&xarg1 \fi + \setbox\&linechar\hbox{\&linefnt\&getlinechar(\&xarg,\&yyarg)}% + \ifnum \&yyarg >0 \let\&upordown\raise \&clnht\z@ + \else\let\&upordown\lower \&clnht \ht\&linechar\fi + \&clnwd=\wd\&linechar + \&whiledim \&clnwd <\&linelen \do {% + \&upordown\&clnht\copy\&linechar + \advance\&clnht \ht\&linechar + \advance\&clnwd \wd\&linechar + }% + \advance\&clnht -\ht\&linechar + \advance\&clnwd -\wd\&linechar + \&tempdima\&linelen\advance\&tempdima -\&clnwd + \&tempdimb\&tempdima\advance\&tempdimb -\wd\&linechar + \hskip\&tempdimb \multiply\&tempdima \@m + \&tempcnta \&tempdima \&tempdima \wd\&linechar \divide\&tempcnta \&tempdima + \&tempdima \ht\&linechar \multiply\&tempdima \&tempcnta + \divide\&tempdima \@m + \advance\&clnht \&tempdima + \ifdim \&linelen <\wd\&linechar \hskip \wd\&linechar + \else\&upordown\&clnht\copy\&linechar\fi}% + +\def\&hline{\vrule height \&halfwidth depth \&halfwidth width \&linelen}% + +\def\&getlinechar(#1,#2){\&tempcnta#1\relax\multiply\&tempcnta 8 + \advance\&tempcnta -9 \ifnum #2>0 \advance\&tempcnta #2\relax\else + \advance\&tempcnta -#2\relax\advance\&tempcnta 64 \fi + \char\&tempcnta}% + +\def\drawvector(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax + \&tempcnta \ifnum\&xarg<0 -\&xarg\else\&xarg\fi + \ifnum\&tempcnta<5\relax \&linelen=#3\relax + \ifnum\&xarg =0 \&vvector \else \ifnum\&yarg =0 \&hvector + \else \&svector\fi\fi\else\&badlinearg\fi}% + +\def\&hvector{\ifnum\&xarg<0 \rlap{\&linefnt\&getlarrow(1,0)}\fi \&hline + \ifnum\&xarg>0 \llap{\&linefnt\&getrarrow(1,0)}\fi}% + +\def\&vvector{\ifnum \&yarg <0 \&downvector \else \&upvector \fi}% + +\def\&svector{\&sline + \&tempcnta\&yarg \ifnum\&tempcnta <0 \&tempcnta=-\&tempcnta\fi + \ifnum\&tempcnta <5 + \if&negarg\ifnum\&yarg>0 % 3d quadrant; dp > 0 + \llap{\lower\ht\&linechar\hbox to\&linelen{\&linefnt + \&getlarrow(\&xarg,\&yyarg)\hss}}\else % 4th quadrant; ht > 0 + \llap{\hbox to\&linelen{\&linefnt\&getlarrow(\&xarg,\&yyarg)\hss}}\fi + \else\ifnum\&yarg>0 % 1st quadrant; ht > 0 + \&tempdima\&linelen \multiply\&tempdima\&yarg + \divide\&tempdima\&xarg \advance\&tempdima-\ht\&linechar + \raise\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\else + \&tempdima\&linelen \multiply\&tempdima-\&yarg % 2d quadrant; dp > 0 + \divide\&tempdima\&xarg + \lower\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\fi\fi + \else\&badlinearg\fi}% + +\def\&getlarrow(#1,#2){\ifnum #2 =\z@ \&tempcnta='33\else +\&tempcnta=#1\relax\multiply\&tempcnta \sixt@@n \advance\&tempcnta +-9 \&tempcntb=#2\relax\multiply\&tempcntb \tw@ +\ifnum \&tempcntb >0 \advance\&tempcnta \&tempcntb\relax +\else\advance\&tempcnta -\&tempcntb\advance\&tempcnta 64 +\fi\fi\char\&tempcnta}% + +\def\&getrarrow(#1,#2){\&tempcntb=#2\relax +\ifnum\&tempcntb < 0 \&tempcntb=-\&tempcntb\relax\fi +\ifcase \&tempcntb\relax \&tempcnta='55 \or +\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta +24 \advance\&tempcnta -6 \else \ifnum #1=3 \&tempcnta=49 +\else\&tempcnta=58 \fi\fi\or +\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta +24 \advance\&tempcnta -3 \else \&tempcnta=51\fi\or +\&tempcnta=#1\relax\multiply\&tempcnta +\sixt@@n \advance\&tempcnta -\tw@ \else +\&tempcnta=#1\relax\multiply\&tempcnta +\sixt@@n \advance\&tempcnta 7 \fi\ifnum #2<0 \advance\&tempcnta 64 \fi +\char\&tempcnta}% + +\def\&vline{\ifnum \&yarg <0 \&downline \else \&upline\fi}% + +\def\&upline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth + height \&linelen depth \z@\hss}}% + +\def\&downline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth + height \z@ depth \&linelen \hss}}% + +\def\&upvector{\&upline\setbox\&tempboxa\hbox{\&linefnt\char'66}\raise + \&linelen \hbox to\z@{\lower \ht\&tempboxa\box\&tempboxa\hss}}% + +\def\&downvector{\&downline\lower \&linelen + \hbox to \z@{\&linefnt\char'77\hss}}% + +\def\&badlinearg{\errmessage{Bad \string\arrow\space argument.}}% + +%INITIALIZATION +\thinlines + +% Allocate registers using the rules of p.~346 of {\sl The \TeX book}. +\countdef\&xarg 0 +\countdef\&yarg 2 +\countdef\&yyarg 4 +\countdef\&tempcnta 6 +\countdef\&tempcntb 8 + +\dimendef\&linelen 0 +\dimendef\&clnwd 2 +\dimendef\&clnht 4 +\dimendef\&tempdima 6 +\dimendef\&tempdimb 8 + +\chardef\@arrbox 0 +\chardef\&linechar 2 +\chardef\&tempboxa 2 % \&linechar and \&tempboxa don't interfere. + + +% Macros for abstract nonsense + +% Macros for slanted lines and arrows. + +\let\lft^% +\let\rt_% distinguish between \rt and \lft + +\newif\if@pslope % test for positive slope +\def\@findslope(#1,#2){\ifnum#1>0 + \ifnum#2>0 \@pslopetrue \else\@pslopefalse\fi \else + \ifnum#2>0 \@pslopefalse \else\@pslopetrue\fi\fi}% + +\def\generalsmap(#1,#2){\getm@rphposn(#1,#2)\plnmorph\futurelet\next\addm@rph}% + +% Put arrow in \@arrbox, then add morphisms later. + +% Single lines and arrows. +\def\sline(#1,#2){\setbox\@arrbox=\hbox{\drawline(#1,#2){\sarrowlength}}% + \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}% +\def\arrow(#1,#2){\setbox\@arrbox=\hbox{\drawvector(#1,#2){\sarrowlength}}% + \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}% + +% Double lines, arrows, and adjoint arrows. +\newif\ifd@@blearr + +\def\bisline(#1,#2){\@findslope(#1,#2)% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel + \rlap{\drawline(#1,#2){\sarrowlength}}% + \hskip\@hchannel\hbox{\drawline(#1,#2){\sarrowlength}}}% + \d@@blearrtrue\generalsmap(#1,#2)}% +\def\biarrow(#1,#2){\@findslope(#1,#2)% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel + \rlap{\drawvector(#1,#2){\sarrowlength}}% + \hskip\@hchannel\hbox{\drawvector(#1,#2){\sarrowlength}}}% + \d@@blearrtrue\generalsmap(#1,#2)}% +\def\adjarrow(#1,#2){\@findslope(#1,#2)% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel + \rlap{\drawvector(#1,#2){\sarrowlength}}% + \hskip\@hchannel\hbox{\drawvector(-#1,-#2){\sarrowlength}}}% + \d@@blearrtrue\generalsmap(#1,#2)}% + +% Morphism placement. + +% Logic for positioning morphisms on slanted arrows: +% If \lft then +% \hskip by -\@hmorphdflt +% if \@pslopetrue then \raise by \@vmorphdflt +% else \lower by \@vmorphdflt +% Else if \rt then +% \hskip by \@hmorphdflt +% if \@pslopetrue then \lower by \@vmorphdflt +% else \raise by \@vmorphdflt +% +% \@hmorphdflt and \@vmorphdflt defined by \getm@rphposn +% Advance \morphdist by .5\channelwidth if double arrows +% +% Use \@shiftmorph to allow users to move morphisms + +% Logic for \@shiftmorph: +% If \rtm@rph then +% if \hmorphposnrt=0 then hshift by\hmorphposn else hshift by\hmorphposnrt +% if \vmorphposnrt=0 then vshift by\vmorphposn else vshift by\vmorphposnrt +% Else +% if \hmorphposnlft=0 then hshift by\hmorphposn else hshift by\hmorphposnlft +% if \vmorphposnlft=0 then vshift by\vmorphposn else vshift by\vmorphposnlft + +\newif\ifrtm@rph +\def\@shiftmorph#1{\hbox{\setbox0=\hbox{$\scriptstyle#1$}% + \setbox1=\hbox{\hskip\@hm@rphshift\raise\@vm@rphshift\copy0}% + \wd1=\wd0 \ht1=\ht0 \dp1=\dp0 \box1}}% +\def\@hm@rphshift{\ifrtm@rph + \ifdim\hmorphposnrt=\z@\hmorphposn\else\hmorphposnrt\fi \else + \ifdim\hmorphposnlft=\z@\hmorphposn\else\hmorphposnlft\fi \fi}% +\def\@vm@rphshift{\ifrtm@rph + \ifdim\vmorphposnrt=\z@\vmorphposn\else\vmorphposnrt\fi \else + \ifdim\vmorphposnlft=\z@\vmorphposn\else\vmorphposnlft\fi \fi}% + +\def\addm@rph{\ifx\next\lft\let\temp=\lftmorph\else + \ifx\next\rt\let\temp=\rtmorph\else\let\temp\relax\fi\fi \temp}% + +\def\plnmorph{\dimen1\wd\@arrbox \ifdim\dimen1<\z@ \dimen1-\dimen1\fi + \vcenter{\box\@arrbox}}% +\def\lftmorph\lft#1{\rtm@rphfalse \setbox0=\@shiftmorph{#1}% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss % \dimen1=\wd\@arrbox + \llap{\box0}\hss}\hskip\@hmorphdflt}\futurelet\next\addm@rph}% +\def\rtmorph\rt#1{\rtm@rphtrue \setbox0=\@shiftmorph{#1}% + \if@pslope \let\@upordown\lower \else \let\@upordown\raise\fi + \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss + \rlap{\box0}\hss}\hskip-\@hmorphdflt}\futurelet\next\addm@rph}% + +% Get appropriate shifts for morphisms and double lines at various slopes +% Syntax e.g.: \@getshift(1,2){\@hchannel}{\@vchannel}{\channelwidth}% + +\def\getm@rphposn(#1,#2){\ifd@@blearr \dimen@\morphdist \advance\dimen@ by + .5\channelwidth \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\dimen@}\else + \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\morphdist}\fi}% + +\def\getch@nnel(#1,#2){\ifdim\hchannel=\z@ \ifdim\vchannel=\z@ + \@getshift(#1,#2){\@hchannel}{\@vchannel}{\channelwidth}% + \else \@hchannel\hchannel \@vchannel\vchannel \fi + \else \@hchannel\hchannel \@vchannel\vchannel \fi}% + +\def\@getshift(#1,#2)#3#4#5{\dimen@ #5\relax + \&xarg #1\relax \&yarg #2\relax + \ifnum\&xarg<0 \&xarg -\&xarg \fi + \ifnum\&yarg<0 \&yarg -\&yarg \fi + \ifnum\&xarg<\&yarg \&negargtrue \&yyarg\&xarg \&xarg\&yarg \&yarg\&yyarg\fi + \ifcase\&xarg \or % There is no case 0 + \ifcase\&yarg % case 1 + \dimen@i \z@ \dimen@ii \dimen@ \or % case (1,0) + \dimen@i .7071\dimen@ \dimen@ii .7071\dimen@ \fi \or + \ifcase\&yarg % case 2 + \or % case 0,2 wrong + \dimen@i .4472\dimen@ \dimen@ii .8944\dimen@ \fi \or + \ifcase\&yarg % case 3 + \or % case 0,3 wrong + \dimen@i .3162\dimen@ \dimen@ii .9486\dimen@ \or + \dimen@i .5547\dimen@ \dimen@ii .8321\dimen@ \fi \or + \ifcase\&yarg % case 4 + \or % case 0,2,4 wrong + \dimen@i .2425\dimen@ \dimen@ii .9701\dimen@ \or\or + \dimen@i .6\dimen@ \dimen@ii .8\dimen@ \fi \or + \ifcase\&yarg % case 5 + \or % case 0,5 wrong + \dimen@i .1961\dimen@ \dimen@ii .9801\dimen@ \or + \dimen@i .3714\dimen@ \dimen@ii .9284\dimen@ \or + \dimen@i .5144\dimen@ \dimen@ii .8575\dimen@ \or + \dimen@i .6247\dimen@ \dimen@ii .7801\dimen@ \fi \or + \ifcase\&yarg % case 6 + \or % case 0,2,3,4,6 wrong + \dimen@i .1645\dimen@ \dimen@ii .9864\dimen@ \or\or\or\or + \dimen@i .6402\dimen@ \dimen@ii .7682\dimen@ \fi \fi + \if&negarg \&tempdima\dimen@i \dimen@i\dimen@ii \dimen@ii\&tempdima\fi + #3\dimen@i\relax #4\dimen@ii\relax }% + +\catcode`\&=4 % Back to alignment tab + + +% Macros for horizontal and vertical lines and arrows. +% These macros use an idea from Appendix~D, p.~374 of the Texbook. +% Usage: `\mapright^f', `\mapleft', etc. +% `\mapdown\lft{f}', `\mapup\rt{g}', `\mapdown', etc. + +% \toks@ will contain the token sequence that defines the arrow and morphisms; +% ensure that \toks@={\mathop{\vcenter{\smash@@{horiz. arrow}}}\limits} to start. +\def\generalhmap{\futurelet\next\@generalhmap}% +\def\@generalhmap{\ifx\next^ \let\temp\generalhm@rph\else + \ifx\next_ \let\temp\generalhm@rph\else \let\temp\m@kehmap\fi\fi \temp}% +\def\generalhm@rph#1#2{\ifx#1^ + \toks@=\expandafter{\the\toks@#1{\rtm@rphtrue\@shiftmorph{#2}}}\else + \toks@=\expandafter{\the\toks@#1{\rtm@rphfalse\@shiftmorph{#2}}}\fi + \generalhmap}% +\def\m@kehmap{\mathrel{\smash@@{\the\toks@}}}% + +\def\mapright{\toks@={\mathop{\vcenter{\smash@@{\drawrightarrow}}}\limits}% + \generalhmap}% +\def\mapleft{\toks@={\mathop{\vcenter{\smash@@{\drawleftarrow}}}\limits}% + \generalhmap}% +\def\bimapright{\toks@={\mathop{\vcenter{\smash@@{\drawbirightarrow}}}\limits}% + \generalhmap}% +\def\bimapleft{\toks@={\mathop{\vcenter{\smash@@{\drawbileftarrow}}}\limits}% + \generalhmap}% +\def\adjmapright{\toks@={\mathop{\vcenter{\smash@@{\drawadjrightarrow}}}\limits}% + \generalhmap}% +\def\adjmapleft{\toks@={\mathop{\vcenter{\smash@@{\drawadjleftarrow}}}\limits}% + \generalhmap}% +\def\hline{\toks@={\mathop{\vcenter{\smash@@{\drawhline}}}\limits}% + \generalhmap}% +\def\bihline{\toks@={\mathop{\vcenter{\smash@@{\drawbihline}}}\limits}% + \generalhmap}% + +\def\drawrightarrow{\hbox{\drawvector(1,0){\harrowlength}}}% +\def\drawleftarrow{\hbox{\drawvector(-1,0){\harrowlength}}}% +\def\drawbirightarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(1,0){\harrowlength}}}}% +\def\drawbileftarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(-1,0){\harrowlength}}}}% +\def\drawadjrightarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(1,0){\harrowlength}}}}% +\def\drawadjleftarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(-1,0){\harrowlength}}}}% +\def\drawhline{\hbox{\drawline(1,0){\harrowlength}}}% +\def\drawbihline{\hbox{\raise.5\channelwidth + \hbox{\drawline(1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawline(1,0){\harrowlength}}}}% + +% Vertical arrows are handled differently because there is no \mathop. +% \toks@ will contain the token sequence that defines the arrow and morphisms; +% ensure that \toks@={\vcenter{vertical arrow}} to start. +\def\generalvmap{\futurelet\next\@generalvmap}% +\def\@generalvmap{\ifx\next\lft \let\temp\generalvm@rph\else + \ifx\next\rt \let\temp\generalvm@rph\else \let\temp\m@kevmap\fi\fi \temp}% +% Prepend or append to \toks@ depending on \rt or \lft. +\toksdef\toks@@=1 +\def\generalvm@rph#1#2{\ifx#1\rt % append + \toks@=\expandafter{\the\toks@ + \rlap{$\vcenter{\rtm@rphtrue\@shiftmorph{#2}}$}}\else % prepend + \toks@@={\llap{$\vcenter{\rtm@rphfalse\@shiftmorph{#2}}$}}% + \toks@=\expandafter\expandafter\expandafter{\expandafter\the\expandafter + \toks@@ \the\toks@}\fi \generalvmap}% +\def\m@kevmap{\the\toks@}% + +\def\mapdown{\toks@={\vcenter{\drawdownarrow}}\generalvmap}% +\def\mapup{\toks@={\vcenter{\drawuparrow}}\generalvmap}% +\def\bimapdown{\toks@={\vcenter{\drawbidownarrow}}\generalvmap}% +\def\bimapup{\toks@={\vcenter{\drawbiuparrow}}\generalvmap}% +\def\adjmapdown{\toks@={\vcenter{\drawadjdownarrow}}\generalvmap}% +\def\adjmapup{\toks@={\vcenter{\drawadjuparrow}}\generalvmap}% +\def\vline{\toks@={\vcenter{\drawvline}}\generalvmap}% +\def\bivline{\toks@={\vcenter{\drawbivline}}\generalvmap}% + +\def\drawdownarrow{\hbox to5pt{\hss\drawvector(0,-1){\varrowlength}\hss}}% +\def\drawuparrow{\hbox to5pt{\hss\drawvector(0,1){\varrowlength}\hss}}% +\def\drawbidownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}% + \hskip\channelwidth\hbox{\drawvector(0,-1){\varrowlength}}\hss}}% +\def\drawbiuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}% + \hskip\channelwidth\hbox{\drawvector(0,1){\varrowlength}}\hss}}% +\def\drawadjdownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}% + \hskip\channelwidth\lower\varrowlength + \hbox{\drawvector(0,1){\varrowlength}}\hss}}% +\def\drawadjuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}% + \hskip\channelwidth\raise\varrowlength + \hbox{\drawvector(0,-1){\varrowlength}}\hss}}% +\def\drawvline{\hbox to5pt{\hss\drawline(0,1){\varrowlength}\hss}}% +\def\drawbivline{\hbox to5pt{\hss\hbox{\drawline(0,1){\varrowlength}}% + \hskip\channelwidth\hbox{\drawline(0,1){\varrowlength}}\hss}}% + + +% Macros for setting commutative diagrams. + +% A macro inspired by Ex.~18.46 of the TeXbook. +\def\commdiag#1{\null\, + \vcenter{\commdiagbaselines + \m@th\ialign{\hfil$##$\hfil&&\hfil$\mkern4mu ##$\hfil\crcr + \mathstrut\crcr\noalign{\kern-\baselineskip} + #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}% + +\def\commdiagbaselines{\baselineskip15pt \lineskip3pt \lineskiplimit3pt }% +% A macro inspired by Francis Borceux's Diagram macros for LaTeX +% (FBORCEUX@BUCLLN11.BITNET). +\def\gridcommdiag#1{\null\, + \vcenter{\offinterlineskip + \m@th\ialign{&\vbox to\vgrid{\vss + \hbox to\hgrid{\hss\smash@@{$##$}\hss}}\crcr + \mathstrut\crcr\noalign{\kern-\vgrid} + #1\crcr\mathstrut\crcr\noalign{\kern-.5\vgrid}}}\,}% + +% Default parameters +% Define default heights and widths for arrows using the golden ratio. +% Note that 5:3 (for sline) and 3:2 (for vector) approximate this ratio. +\newdimen\harrowlength \harrowlength=60pt +\newdimen\varrowlength \varrowlength=.618\harrowlength +\newdimen\sarrowlength \sarrowlength=\harrowlength + +% Morphism placement +\newdimen\hmorphposn \hmorphposn=\z@ +\newdimen\vmorphposn \vmorphposn=\z@ +\newdimen\morphdist \morphdist=4pt + +\dimendef\@hmorphdflt 0 % These two dimensions are +\dimendef\@vmorphdflt 2 % defined by \getm@rphposn + +\newdimen\hmorphposnrt \hmorphposnrt=\z@ +\newdimen\hmorphposnlft \hmorphposnlft=\z@ +\newdimen\vmorphposnrt \vmorphposnrt=\z@ +\newdimen\vmorphposnlft \vmorphposnlft=\z@ +\let\hmorphposnup=\hmorphposnrt +\let\hmorphposndn=\hmorphposnlft +\let\vmorphposnup=\vmorphposnrt +\let\vmorphposndn=\vmorphposnlft + +% Default grid size for \gridcommdiag +\newdimen\hgrid \hgrid=15pt +\newdimen\vgrid \vgrid=15pt + +% Horizontal and vertical distance between double lines and arrows. +\newdimen\hchannel \hchannel=0pt +\newdimen\vchannel \vchannel=0pt +\newdimen\channelwidth \channelwidth=3pt + +\dimendef\@hchannel 0 % Defined via the +\dimendef\@vchannel 2 % macro \getch@nnel + +\catcode`& = \@oldandcatcode +\catcode`@ = \@oldatcatcode + + +% Some examples + +%\parskip=20pt +% +%The first example: +%$$\commdiag{A&\mapright^f&B&\mapleft^g&C\cr +%\mapdown\lft\psi&\arrow(3,-2)\rt s&\mapup\rt\phi& +%\arrow(-3,2)\lft l&\mapdown\rt\theta\cr +%D&\mapright_h&E&\mapleft_{\int_0^t{\bf A}\,d\sigma}&F\cr}$$ +% +% +%Covering homotopy property (Bott and Tu, {\it Differential Forms in +%Algebraic Topology}): +%$$\commdiag{Y&\mapright^f&E\cr \mapdown&\arrow(3,2)\lft{f_t}&\mapdown\cr +%Y\times I&\mapright^{\bar f_t}&X}$$ +% +% +%Universal mapping property (Warner, {\it Foundations of Differentiable +%Manifolds and Lie Groups}): $$\varrowlength=20pt +%\commdiag{V\otimes W\cr \mapup\lft\phi&\arrow(3,-1)\rt{\tilde l}\cr +%V\times W&\mapright^l&U\cr}$$ +% +% +%A cube (Francis Borceux): +%$$\harrowlength=48pt \varrowlength=48pt \sarrowlength=20pt +%\def\cross#1#2{\setbox0=\hbox{$#1$}% +% \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}} +%\gridcommdiag{&&B&&\mapright^b&&D\cr +%&\arrow(1,1)\lft a&&&&\arrow(1,1)\lft d\cr +%A&&\cross{\hmorphposn=12pt\mapright^c}{\vmorphposn=-12pt\mapdown\lft f} +%&&C&&\mapdown\rt h\cr\cr +%\mapdown\lft e&&F&&\cross{\hmorphposn=-12pt\mapright_j} +%{\vmorphposn=12pt\mapdown\rt g}&&H\cr +%&\arrow(1,1)\lft i&&&&\arrow(1,1)\rt l\cr +%E&&\mapright_k&&G\cr}$$ +% +%Zassenhaus's Butterfly Lemma (Lang, {\it Algebra}): +%$$\hgrid=16pt \vgrid=8pt \sarrowlength=32pt +%\def\cross#1#2{\setbox0=\hbox{$#1$}% +% \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}} +%\def\l#1{\llap{$#1$\hskip.5em}} +%\def\r#1{\rlap{\hskip.5em$#1$}} +%\gridcommdiag{&&U&&&&V\cr &&\bullet&&&&\bullet\cr +%&&\sarrowlength=16pt\sline(0,1)&&&&\sarrowlength=16pt\sline(0,1)\cr +%&&\l{u(U\cap V)}\bullet&&&&\bullet\r{(U\cap V)v}\cr +%&&&\sline(2,-1)&&\sline(2,1)\cr +%&&\cross{=}{\sline(0,1)}&&\bullet&&\cross{=}{\sline(0,1)}\cr\cr +%&&\l{^{\textstyle u(U\cap v)}}\bullet&&\cross{=}{\sline(0,1)}&& +% \bullet\r{^{\textstyle(u\cap V)v}}\cr +%&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)\cr +%\l{u}\bullet&&&&\bullet&&&&\bullet\r{v}\cr +%&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)\cr +%&&\bullet&&&&\bullet\cr &&u\cap V&&&&U\cap v\cr}$$ diff --git a/macros/eplain/tex/btxmac.tex b/macros/eplain/tex/btxmac.tex new file mode 100644 index 0000000000..9fd3e20415 --- /dev/null +++ b/macros/eplain/tex/btxmac.tex @@ -0,0 +1,929 @@ +%% @texfile{ +%% author = "Karl Berry and Oren Patashnik", +%% version = "0.99p", +%% date = "30 May 2019", +%% filename = "btxmac.tex", +%% address = "tex-eplain@tug.org", +%% supported = "yes", +%% docstring = "Defines macros that make BibTeX work with plain TeX", +%% } +% BibTeX-for-TeX macros for BibTeX 0.99c, TeX 3.0 or later. +% Copyright 1990, 1991, 1992, 1995, 2005, 2007, 2013, 2016, 2019 Karl Berry & +% Oren Patashnik. +% +% Unlimited copying and redistribution of this file are permitted as +% long as this file is not modified. Modifications (and redistribution +% thereof) are permitted, but only if the resulting file is not named +% btxmac.tex. +% +% This file contains TeX macros that allow BibTeX, a bibliography +% program that was originally designed for use with LaTeX, to work with +% plain TeX. Please report any bugs (outright goofs, improvable macros, +% misfeatures, or unclear documentation) to Oren Patashnik +% (opbibtex@cs.stanford.edu). These macros will become frozen shortly +% after BibTeX version 1.00 is released. +% +% AMS-TEX WARNING: We tried very hard, as of version .99i of these macros, +% to make them compatible with AmS-TeX. We succeeded to the extent +% that, if you use one of the standard bibliography styles, you probably +% won't notice any problems with version 0.99i of btxmac.tex. But +% ultimately we failed, in that the inherent incompatibilities between +% plain TeX and AmS-TeX kept making these macros break, for certain +% inputs or certain styles. Examples: (1) AmS-TeX treats at-signs as +% special, in ways that plain TeX and LaTeX don't, so that, for example, +% you can't have any `@' characters in an argument to the \cite command, +% the way you can in TeX or LaTeX; (2) AmS-TeX decided that plain TeX's +% and LaTeX's macron-accent control sequence `\=' should be undefined; +% so you'll need to define `\=' to be `\B' to get the xampl.bib example +% suggested below to work with AmS-TeX; (3) AmS-TeX redefines the tie +% character `~' of plain TeX, and AmS-TeX's `amsppt' style redefines +% plain TeX's `\nobreak' macro, so that if you use an author-date style +% like `apalike' and you have a multiple-author reference for which the +% author-date style automatically produces a citation in the text like +% `(Jones et~al., 1992)' you will throw AmS-TeX's `amsppt' style into +% an infinite loop, exceeding its input stack size. +% +% In practice, such incompatibilities surface infrequently; but it is +% now clear to us that it's not worth the effort (perhaps it's not even +% possible) to make the btxmac.tex macros robust when used both with +% plain TeX and Ams-TeX. If the BibTeX/AmS-TeX results attainable with +% the current btxmac.tex macros are sufficient, fine. But if there's a +% demand for more robust BibTeX/AmS-TeX behavior, then someone who's +% very familiar with the AmS-TeX package should probably make an +% amsbtxmc.tex version of the macros. Until then, if you're an AmS-TeX +% user, or a LaTeX or plain TeX user sharing files with an AmS-TeX user, +% beware. +% END OF AMS-TEX WARNING. +% +% To use these macros you should be familiar with how BibTeX interacts +% with LaTeX, since BibTeX's interaction with TeX is very similar; that +% interaction is explained in the LaTeX manual. It also helps to +% have read "BibTeXing", the documentation that accompanies BibTeX. +% +% Then, if you want, you should redefine any of the macros that begin +% with `\bbl' or `\biblabel' or `\print' that you need to get formatting +% different from the default (the default settings are designed to +% accompany a bibliography style like BibTeX's standard style `plain'). +% The macros you might want to change are described briefly a few +% paragraphs hence. +% +% To get started without reading any documentation, try running the +% short .tex file below through TeX and BibTeX. +% +% Remember the general scheme: Running (La)TeX writes information on the +% .aux (auxiliary) file; then running BibTeX reads information from the +% .aux, .bst (style), and .bib (database) files, and writes information +% (the bibliography) on a .bbl file; then running (La)TeX incorporates +% the bibliography; then running (La)TeX once more fixes the remaining +% forward references into the bibliography. Thus, to get everything +% incorporated into your output, you'll have to run (La)TeX, BibTeX, +% (La)TeX, (La)TeX. (Standup, sitdown, fight, fight, fight.) +% +% These macros can stand alone or they can be \input into a macro +% package, like Eplain, that is sufficiently compatible with plain TeX. +% To use these macros to format the 0.99 version of the xampl.bib file +% that's distributed with BibTeX (that version of the file has no +% self-identification), you'll need to define \mbox, which is a LaTeX +% command, to be \hbox, as in the example below. +% +% Here's an eight-line plain TeX file for trying out btxmac.tex; of course +% you'll have to remove the comment characters at the beginning of each +% line, and, depending on your system, you might have to take steps so +% that BibTeX can "see" the files xampl.bib and plain.bst (BibTeX will +% give you two empty-field warning messages that you should ignore). +% +% \input btxmac +% \noindent This cites Aamport's gnominious article~\cite{article-full}. +% \medskip +% \leftline{\bf References} +% \nocite{*} % put all database entries into the reference list +% \bibliographystyle{plain} % specify plain.bst as the style file +% \bibliography{xampl} % specify the database files; here, just xampl.bib +% \bye +% +% +% HISTORY +% +% Karl Berry wrote the original version of these macros in 1989 and +% 1990, for use in his `Eplain' package. Oren Patashnik modified them +% slightly in July 1990, as part of the official BibTeX distribution. +% +% 1-Aug-90 Version 0.99a, not released to the general public. +% 14-Aug-90 0.99b, first general release. +% 26-Aug-90 0.99c, made \@undefinedmessage work with other macro packages. +% 6-Sep-90 0.99d, allowed for general formatting of bibliography labels, +% for general formatting of (in-text) citations, and for +% changing certain catcodes while reading the .aux file. +% 14-Nov-90 0.99e, changed the way \@setletters works, made some \new...'s +% non-outer, and changed the way Eplain reads this file. +% 12-Dec-90 0.99f, made \@resetnumerals change the `,' and `.' catcodes; and +% added \biblabelextrahang, \@getoptionalarg, and \bblsc. +% 11-Mar-91 0.99g, made a few minor changes required by the way Eplain reads +% this file, but no functional changes. +% 24-Apr-91 0.99h, inhibited the reading and writing of the .aux file if it +% isn't used or if the \noauxfile macro is defined, and +% removed some .aux-file-opening detritus; printed the +% cite-key of undefined citations in \tt font; changed the +% catcode of `_' inside \cite; and called \@resetnumerals +% from inside a group. +% 29-Feb-92 0.99i, made these macros semi-compatible with AmS-TeX; removed +% \@resetnumerals, \@setletters, \@tokstostring, and +% friends; changed the way \cite handles catcodes; changed +% \@getoptionalarg, and had \bibitem and \newcommand use +% it; added \@futurenonspacelet and (to facilitate the use +% of multiple reference lists) \bblfilebasename; changed +% \biblabelprint to use the new macros \biblabelprecontents +% and \biblabelpostcontents, and to, by default, right- +% justify numeric labels; and renamed \biblabelextrahang to +% the more descriptive \biblabelextraspace. +% 14-Mar-92 0.99j, made 0.99i's use of `\\' local to btxmac.tex. +% 13-Nov-95 0.99k, defined \begin and \end (while reading bbl file) only if +% it wasn't already defined. +% 11-Aug-03 0.99l, defined \renewcommand and \providecommand, since some AMS +% style files use them. Also defined \emph, \textbf, and +% \mbox, since many .bib files use them. This version was +% never actually released, but these changes appear +% starting with 0.99k-18aug05. +% 18-Aug-05 0.99k-18aug05, made the \em, \emph, etc., definitions effective +% only if not already defined. Provided +% \printcite{pre,post}item, \bblitemhook. +% 09-Sep-07 0.99k-09sep07, executed \@citedef in a group to avoid potential +% save-stack overflow. +% 07-Feb-13 0.99m, made \newcommand and \providecommand be \long, and not +% use \edef. Defined \bbltextbf. +% 30-Sep-13 0.99n, made \@futurenonspacelet be \long, +% renamed \@optionaltemp to \@optionalusercs, +% ignored spaces after the optional argument. +% 12-May-16 0.99o, renamed \@newcommand and others to \@btx..., to avoid +% conflict with Babel's file plain.def. +% 30-May-19 0.99p, one missed rename of \@continuenewcommand to \@btx..., +% that made \providecommand fail. +% +% The LaTeX-related commands defined in this file include +% (a) the four commands that a user types (\bibliography, +% \bibliographystyle, \cite, and \nocite); +% (b) three commands that BibTeX looks for in the .aux +% file (\bibdata, \bibstyle, and \citation---there is a fourth command +% that BibTeX looks for, but that command is related to LaTeX's \include +% facility, so these macros ignore that command); and +% (c) the LaTeX commands (\newcommand, \renewcommand, \providecommand) +% that are written by a standard (alpha) or AMS bibliography style. +% (d) a few more LaTeX commands (\emph, \mbox, \textbf) which many .bib +% files use. +% +% The definitions here are not the same as the corresponding LaTeX +% definitions (those LaTeX definitions depend on a significant fraction +% of LaTeX itself). But the only significant differences are with the +% \*command macros, which in LaTeX (a) give warnings in various +% circumstances; (b) allow a second optional argument; and (c) make the +% defined control sequences \long. The versions here don't do any of +% those things. +% +% To summarize: Unless you know what you're doing, you shouldn't define +% any control sequences with these ten names: +% +% \bibdata +% \bibliography +% \bibliographystyle +% \bibstyle +% \citation +% \cite +% \newcommand +% \nocite +% \providecommand +% \renewcommand +% +% There are other commands written by one or more of the four standard +% (plain, abbrv, alpha, unsrt) or four semistandard (acm, apalike, +% ieeetr, siam) bibliography styles, or commonly used in .bib files. +% These take effect only within the bibliography, and are redefinable, +% as explained later: +% +% \em +% \emph +% \mbox +% \newblock +% \sc +% \textbf +% +% There's one control sequence you might want to use (but not redefine) +% in redefining \biblabelprint: +% +% \biblabelwidth +% +% There are fifteen other control sequences (explained later in more detail) +% that the macros of this file will use if you define them---you should +% define them after the \input btxmac command but before the \bibliography +% command. The first six begin with `\bbl' and affect fonts, spacing, +% perhaps other characteristics of the bibliography, and which .bbl files +% get read; the next five begin with `\biblabel' and determine how labels +% are formatted in the bibliography; and the last four begin with `\print' +% and determine how the in-text citations are formatted: +% +% \bblem +% \bblfilebasename +% \bblhook +% \bblnewblock +% \bblrm +% \bblsc +% \biblabelcontents +% \biblabelprecontents +% \biblabelprint +% \biblabelpostcontents +% \biblabelextraspace +% \printbetweencitations +% \printcitefinish +% \printcitenote +% \printcitestart +% +% If it's defined before the \input btxmac command, the control sequence +% below inhibits the reading and writing of the .aux file(s), and the +% issuing of related warning messages. Any definition will do. This +% feature might help when you're working on draft stages of a document: +% +% \noauxfile +% +% +% Here's another control sequence (it's described later) that you +% probably won't want to redefine unless you are writing another macro +% package; if you do redefine it, however, do it before the \input btxmac +% command (and notice that it has an `@' in its name): +% +% \@undefinedmessage +% +% Any other control sequence in this file that might conflict with +% something you've defined will have an `@' in its name, so such conflicts +% are unlikely; but if you're worried about a specific control sequence +% name, do a text search of this file to look for it. +% +% +% So to start things off we turn `@' into a letter (category code 11), +% keeping track of the old category code for future restoration. +% (Simply resetting it to 12 when we leave these macros is +% insufficient.) We use `\cite' as a temporary control sequence to +% save the current catcode of @ to avoid possibly overwriting something +% (without an `@' in its name) that might already be defined. +% +\edef\cite{\the\catcode`@}% +\catcode`@ = 11 +\let\@oldatcatcode = \cite +\chardef\@letter = 11 +\chardef\@other = 12 +% +% +% Next come some things that will be useful later. +% +% Make an outer definition into an inner one (due to Chris Thompson). +% The arguments should be the control sequence to be defined, and the +% new of the \outer control sequence, as characters; the control +% sequence #1 is defined to be just the same as \csname#2\endcsname, but +% not \outer. For example, \@innerdef\innernewcount{newcount} would +% define \innernewcount to be a non-outer version of \newcount. +% +\def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}% +% +% We use \@innerdef to make some of our allocations local, because +% Eplain includes our code inside a conditional. We put @'s in the +% names to minimize the (already small) chance of conflicts. +% +\@innerdef\@innernewcount{newcount}% +\@innerdef\@innernewdimen{newdimen}% +\@innerdef\@innernewif{newif}% +\@innerdef\@innernewwrite{newwrite}% +% +% +% Swallow one parameter. +% +\def\@gobble#1{}% +% +% +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\@undefined + \let\@linenumber = \empty % Pre-3.0. +\else + \def\@linenumber{\the\inputlineno:\space}% +\fi +% +% +% The following macro \@futurenonspacelet (from the TeXbook) behaves +% essentially like \futurelet except that it discards any implicit or +% explicit space tokens that intervene before a nonspace is scanned: +% +\long\def\@futurenonspacelet#1{\def\cs{#1}% + \afterassignment\@stepone\let\@nexttoken= +}% +\begingroup % The grouping here avoids stepping on an outside use of `\\'. +\def\\{\global\let\@stoken= }% +\\ % now \@stoken is a space token (\\ is a control symbol, so that + % space after it is seen). +\endgroup +\def\@stepone{\expandafter\futurelet\cs\@steptwo}% +\def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree + \else\let\@@next=\@nexttoken\fi \@@next}% +\def\@stepthree{\afterassignment\@stepone\let\@@next= }% +% +% +% \@getoptionalarg\CS gets an optional argument from the input, enclosed +% in brackets, then expands \CS. We set \@optionalarg to \empty if we +% don't find one, otherwise to the text of the argument. This assumes +% the brackets don't have a funny category code. +% +\def\@getoptionalarg#1{% + \let\@optionalusercs = #1% + \let\@optionalnext = \relax + \@futurenonspacelet\@optionalnext\@bracketcheck +}% +% +% The \expandafter's in this macro let us avoid the use of \aftergroup, +% which is somewhat more expensive. +% +\def\@bracketcheck{% + \ifx [\@optionalnext + \expandafter\@@getoptionalarg % we have an optional arg + \else + \let\@optionalarg = \empty % no optional arg + \expandafter\@optionalusercs + \fi +}% +% +% Get the next bracketed text. +\def\@@getoptionalarg[#1]{% + \def\@optionalarg{#1}% + % Ignore spaces after the optional arg, too. + % (We don't actually need to peek ahead, but this is the easiest way + % to ignore the spaces.) + \let\@optdummy=\relax % just in case it has become \outer somehow + \@futurenonspacelet\@optdummy\@optionalusercs +}% +% +% +% From LaTeX. +% +\def\@nnil{\@nil}% +\def\@fornoop#1\@@#2#3{}% +% +\def\@for#1:=#2\do#3{% + \edef\@fortmp{#2}% + \ifx\@fortmp\empty \else + \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}% + \fi +}% +% +\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else + #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi +}% +% +\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil + \let\@nextwhile=\@fornoop \else + #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}% +}% +% +% +% This macro tests if a file \jobname.#1 exists, and sets \if@fileexists +% appropriately. If an optional argument is given, it is used as the +% root part of the filename instead of \jobname. +% +\@innernewif\if@fileexists +% +\def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}% +\def\@finishtestfileexistence#1{% + \begingroup + \def\extension{#1}% + \immediate\openin0 = + \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi + \ifx\extension\empty \else .#1\fi + \space + \ifeof 0 + \global\@fileexistsfalse + \else + \global\@fileexiststrue + \fi + \immediate\closein0 + \endgroup +}% +% +% +%% [[[start of BibTeX-specific stuff]]] +% +% Now come the four main LaTeX commands and their associated .aux +% commands. Just as in LaTeX, \bibliographystyle defines the BibTeX +% style name (.bst file, that is), and \bibliography defines the +% database (.bib) file(s). The corresponding .aux-file commands are +% \bibstyle and \bibdata, which are there only for BibTeX's (but not +% LaTeX's) use. +% +\def\bibliographystyle#1{% + \@readauxfile + \@writeaux{\string\bibstyle{#1}}% +}% +\let\bibstyle = \@gobble +% +% As well as writing the \bibdata command to tell BibTeX which .bib +% files to read, we read the .bbl file that BibTeX (or a person, +% conceivably) has produced. We use \bblfilebasename as the root of the +% filename to read; this defaults to \jobname. +% +\let\bblfilebasename = \jobname +\def\bibliography#1{% + \@readauxfile + \@writeaux{\string\bibdata{#1}}% + \@testfileexistence[\bblfilebasename]{bbl}% + \if@fileexists + % We just output a non-discardable item (the `whatsit' with the + % \bibdata command). This means that the glue that will be + % inserted next (\parskip or \baselineskip, most likely) will be a + % legal breakpoint. Most likely, this is after some kind of + % heading, where we don't want to allow a page break. So: + \nobreak + \@readbblfile + \fi +}% +\let\bibdata = \@gobble +% +% The \nocite{label,label,...} command writes its argument to \@auxfile, +% unless instructed not to, but produces no text in the document. Both +% the \nocite and \cite commands produce \citation commands in the .aux file. +% +\def\nocite#1{% + \@readauxfile + \@writeaux{\string\citation{#1}}% +}% +% +\@innernewif\if@notfirstcitation +% +% \cite[note]{label,label,...} produces the citations for the labels as +% well. If the optional argument `note' is present, it's added after +% the labels. Since \cite calls \nocite to do its .aux-file writing, +% \cite doesn't need to call \@readauxfile (\nocite does). +% +\def\cite{\@getoptionalarg\@cite}% +% +% Typeset the citations for the labels in #1, followed by the note, if +% it exists. To change the citation's format in the text, redefine one +% or more `\print...' macros, whose defaults appear later in this file. +% +\def\@cite#1{% + % Remember the optional argument, in case one of the macros we call + % below ends up looking for an optional argument itself. For + % example, if a \cite[note] triggers reading the .aux file, then the + % [note] would be clobbered, since \@testfileexistence looks for an + % optional arg. + \let\@citenotetext = \@optionalarg + % Start printing the text, beginning with a left bracket by default. + \printcitestart + % It's complicated, but because \nocite puts a `whatsit' onto the list, + % \nocite should follow \printcitestart. It's conceivable, but very + % unlikely, that this `whatsit' will cause a problem (glue that doesn't + % disappear when you want it to is the most likely symptom), requiring + % a change either to \printcitestart or to the label that the .bst file + % produces. + \nocite{#1}% + \@notfirstcitationfalse + \@for \@citation :=#1\do + {% + \expandafter\@onecitation\@citation\@@ + }% + \ifx\empty\@citenotetext\else + \printcitenote{\@citenotetext}% + \fi + \printcitefinish +}% +% +\def\@onecitation#1\@@{% + \if@notfirstcitation + \printbetweencitations + \fi + % + \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax + \if@citewarning + \message{\@linenumber Undefined citation `#1'.}% + \fi + % Give it a dummy definition: + \expandafter\gdef\csname\@citelabel{#1}\endcsname{% + {\tt + \escapechar = -1 + \nobreak\hskip0pt + \expandafter\string\csname#1\endcsname + \nobreak\hskip0pt + }% + }% + \fi + % Now produce the text, whether it was undefined or not. + \printcitepreitem{#1}% + \csname\@citelabel{#1}\endcsname + \printcitepostitem + \@notfirstcitationtrue +}% +% +% Given a label `foo', the macro `\b@foo' is supposed to +% hold the text that should be produced. +% +\def\@citelabel#1{b@#1}% +% +% So, how does a citation label get defined? When we read the .bbl file +% (below), a \bibitem writes out a \@citedef command. And when we read +% the \@citedef, we define \@citelabel{#1}, where #1 is the user's +% label. +% +% The group around the def will keep the save stack from overflowing: +% We are reading the .aux file inside a group. For undefined +% commands, \csname...\endcsname makes them equivalent to \relax +% locally in that group; when we globally redefine them, TeX enters +% the definitions on the save stack, once for each label. When done +% in the topmost group, this can overflow a stack of any size, given +% sufficient number of label definitions. So, we put these +% \csname...\endcsname's inside another group, to pop the stack for +% every label. +\def\@citedef#1#2{{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}}% +% +% +% Reading the .bbl file also produces the typeset bibliography. Please +% notice, however, that we do not produce the title for the references +% (e.g., `References'), as LaTeX does. The formatting and spacing of +% that title, whether it should go into the headline, and so on, are all +% things determined by your format. We cannot know those things in +% advance. If you wish, you can define \bblhook to produce the title. +% Or just do it before the \bibliography command. +% +\def\@readbblfile{% + % Define a counter to tell us which item number we are on, unless + % we've already defined it (because the document has more than one + % bibliography). + \ifx\@itemnum\@undefined + \@innernewcount\@itemnum + \fi + % + \begingroup + % If another package has already defined \begin, don't define our + % own simplistic \begin and \end; assume they want to take care of + % it themselves. (That way, their \begin's and \end's for other + % things can be used in the bib files.) + \ifx\begin\@undefined + \def\begin##1##2{% + % ##1 is just `thebibliography'. + % ##2 is the widest label. + % We set (new dimen) \biblabelwidth based on the widest label + \setbox0 = \hbox{\biblabelcontents{##2}}% + \biblabelwidth = \wd0 + }% + \let\end = \@gobble % The arg is `thebibliography' again. + \fi + % + % Here we have two possibilities: + % \bibitem[typesetlabel]{citationlabel} + % \bibitem{citationlabel} + % If we have the second of these, the citations are numbered, starting + % from one; we use our own count register \@itemnum for this. + % + \@itemnum = 0 + \def\bibitem{\@getoptionalarg\@bibitem}% + \def\@bibitem{% + \ifx\@optionalarg\empty + \expandafter\@numberedbibitem + \else + \expandafter\@alphabibitem + \fi + }% + \def\@alphabibitem##1{% + % Need \xdef here for various reasons. + \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}% + % Left-justify alpha labels, unless \biblabel{pre,post}contents + % are already defined. + \ifx\biblabelprecontents\@undefined + \let\biblabelprecontents = \relax + \fi + \ifx\biblabelpostcontents\@undefined + \let\biblabelpostcontents = \hss + \fi + \@finishbibitem{##1}% + }% + % + \def\@numberedbibitem##1{% + \advance\@itemnum by 1 + \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}% + % Right-justify numeric labels, unless \biblabel{pre,post}contents + % are already defined. + \ifx\biblabelprecontents\@undefined + \let\biblabelprecontents = \hss + \fi + \ifx\biblabelpostcontents\@undefined + \let\biblabelpostcontents = \relax + \fi + \@finishbibitem{##1}% + }% + % + \def\@finishbibitem##1{% + \bblitemhook{##1}% + \biblabelprint{\csname\@citelabel{##1}\endcsname}% + \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}% + \ignorespaces + }% + % + % Do the printing (we're producing the bibliography, remember). + % + \ifx\undefined\em \let\em=\bblem \fi + \ifx\undefined\emph \let\emph=\bblemph \fi + \ifx\undefined\mbox \let\mbox=\bblmbox \fi + \ifx\undefined\newblock \let\newblock=\bblnewblock \fi + \ifx\undefined\sc \let\sc=\bblsc \fi + \ifx\undefined\textbf \let\textbf=\bbltextbf \fi + % + % Punctuation won't affect spacing; + \frenchspacing + % the penalties below are from LaTeX's [article,book,report].sty; + \clubpenalty = 4000 \widowpenalty = 4000 + % the next two values come from LaTeX's \sloppy command; + \tolerance = 10000 \hfuzz = .5pt + \everypar = {\hangindent = \biblabelwidth + \advance\hangindent by \biblabelextraspace}% + \bblrm + % the \parskip is a guess at what looks good; + \parskip = 1.5ex plus .5ex minus .5ex + % and the space between label and text comes from LaTeX's \labelsep. + \biblabelextraspace = .5em + \bblhook + % + \input \bblfilebasename.bbl + \endgroup +}% +% +% The widest label's width is useful for redefining \biblabelprint; +% you redefine \biblabelwidth, in effect, by redefining the +% \biblabelcontents macro that appears below. And \biblabelextraspace, +% which is redefinable inside \bblhook, is added to \biblabelwidth to +% determine the amount of hanging indentation. +% +\@innernewdimen\biblabelwidth +\@innernewdimen\biblabelextraspace +% +% Now come the main macros that are related to the printing of the +% bibliography. Since you might want to redefine them, they are given +% default definitions outside of \@readbblfile. +% +% The first one controls the printing of a bibliography entry's label. +% If you change it, make sure that it starts with something like +% \noindent or \indent or \leavevmode that puts TeX into horizontal mode +% (even if the label itself is empty); otherwise, the hanging +% indentation will get messed up in certain circumstances. +% +\def\biblabelprint#1{% + \noindent + \hbox to \biblabelwidth{% + \biblabelprecontents + \biblabelcontents{#1}% + \biblabelpostcontents + }% + \kern\biblabelextraspace +}% +% +% If you are using numeric labels, and you want them left-justified +% (numeric labels by default are right-justified), do something like: +% \def\biblabelprecontents{\relax} +% \def\biblabelpostcontents{\hss} +% +% By default the labels are typeset in \bblrm, and enclosed in brackets. +\def\biblabelcontents#1{{\bblrm [#1]}}% +% +% The main text, too, is typeset using \bblrm, which is \rm by default. +\def\bblrm{\rm}% +% +% Emphasis for producing, e.g., titles, is done with \it by default. +\def\bblem{\it}% +% +% Another way to emphasize, with built-in italic correction. (Doesn't +% look for a following comma or period, though.) +\def\bblemph#1{{\bblem #1\/}} +% +% And bold. +\def\bbltextbf#1{{\bf #1}} +% +% \mbox is \hbox forcing horizontal mode. +\def\bblmbox{\leavevmode\hbox} +% +% Some styles use a caps-and-small-caps font for author names. LaTeX +% defines an \sc command but plain TeX doesn't, so we need one here. +% The definition below doesn't load the font unless it's needed, but it +% tries to load only the 10pt version, because it might not exist at +% other point sizes. +% +\def\bblsc{\ifx\@scfont\@undefined + \font\@scfont = cmcsc10 + \fi + \@scfont +}% +% +% The major parts of an entry are separated with \bblnewblock. The +% numbers below are taken from LaTeX's `article' style. +% +\def\bblnewblock{\hskip .11em plus .33em minus .07em }% +% +% Here's where you stick any other bibliography-formatting goodies, or +% redefine the values above. +% +\let\bblhook = \empty +% +% And here you can add code to be executed before each item (before +% \biblabelprint is called). The parameter is citation label for this +% bibliography entry. +% +\let\bblitemhook = \@gobble +% +% +% Here are the four default definitions for formatting the in-text +% citations. These are what you redefine (after your \input btxmac but +% before your \bibliography) to get parens instead of brackets, or +% superscripts, or footnotes, or whatever. +% +\def\printcitestart{[}% left bracket +\def\printcitefinish{]}% right bracket +\def\printbetweencitations{, }% comma, space +\let\printcitepreitem\@gobble % takes label +\let\printcitepostitem\empty +\def\printcitenote#1{, #1}% comma, space, note (if it exists) +% +% That scheme is pretty flexible. For example you could use +% \def\printcitestart{\unskip $^\bgroup} +% \def\printcitefinish{\egroup$} +% \def\printbetweencitations{,} +% \def\printcitenote#1{\hbox{\sevenrm\space (#1)}} +% \font\eighttt = cmtt8 +% \scriptfont\ttfam = \eighttt +% to get superscripted in-text citations. (The scriptfont stuff +% exists only to print an undefined citation; it's in cmtt8 because +% there is no cmtt7.) To get something radically different, however, +% you'll have to define your own \cite command. +% +% When we read `\citation' from the .aux file, it means nothing. +% +\let\citation = \@gobble +% +% +% Now comes the stuff for dealing with LaTeX's \newcommand. As +% mentioned earlier, this \newcommand will redefine a preexisting +% command; that's different from how LaTeX's \newcommand behaves. +% +\@innernewcount\@btxnumparams +% +% \newcommand{\foo}[n]{text} defines the control sequence \foo to have n +% parameters, and replacement text `text'. In LaTeX, this command gives +% a warning if \foo is already defined, and allows a second +% optional argument (which is a default value for the first optional +% arg) but we don't bother with either of these. +% +\ifx\newcommand\undefined +\long\def\newcommand#1{% + \def\@btxcommandname{#1}% + \@getoptionalarg\@btxcontinuenewcommand +}% +\fi +% +% +% \renewcommand{\foo}[n]{text}, for our purposes, is the same as +% \newcommand. In LaTeX, it gives a warning if \foo is not already defined. +% +\ifx\renewcommand\undefined + \let\renewcommand = \newcommand +\fi +% +% +% \providecommand{\foo}[n]{text} defines \foo as in \newcommand only if +% \foo is not already defined. +% +\ifx\providecommand\undefined +\long\def\providecommand#1{% + \def\@btxcommandname{#1}% + % + \expandafter\ifx\@btxcommandname \@undefined + \let\cs=\@btxcontinuenewcommand % undefined, so we'll define it + \else + \let\cs=\@gobble % already defined, so ignore it + \fi + \@getoptionalarg\cs +}% +\fi +% +% +% Figure out if this definition has parameters. +% +\def\@btxcontinuenewcommand{% + % If no optional argument, we have zero parameters. Otherwise, we + % have that many. + \@btxnumparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax + \@btxnewcommand +}% +% +% \@btxnumparams is how many arguments this command has. The name of the +% command is \@btxcommandname. The replacement text for the new macro is #1. +% +\def\@btxnewcommand#1{% + \def\@btxstartdef{\expandafter\def\@btxcommandname}% + \ifnum\@btxnumparams=0 + \let\@btxparamdef = \empty + \else + \ifnum\@btxnumparams>9 + \errmessage{\the\@btxnumparams\space is too many parameters}% + \else + \ifnum\@btxnumparams<0 + \errmessage{\the\@btxnumparams\space is too few parameters}% + \else + \edef\@btxparamdef{% + % This is sad, but \loop doesn't work inside \edef, + % because \body isn't defined. + \ifcase\@btxnumparams + \empty No arguments. + \or ####1% + \or ####1####2% + \or ####1####2####3% + \or ####1####2####3####4% + \or ####1####2####3####4####5% + \or ####1####2####3####4####5####6% + \or ####1####2####3####4####5####6####7% + \or ####1####2####3####4####5####6####7####8% + \or ####1####2####3####4####5####6####7####8####9% + \fi + }% + \fi + \fi + \fi + \expandafter\@btxstartdef\@btxparamdef{#1}% +}% +% +%% [[[end of BibTeX-specific stuff]]] +% +% +% Names of references (arguments given in the \cite and \nocite +% commands) and file names (arguments given in the \bibliography and +% \bibliographystyle commands) are recorded in \jobname.aux, called the +% \@auxfile in these macros. Here's how they get read in. +% +\def\@readauxfile{% + \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined + \global\@auxfiledonetrue + \@testfileexistence{aux}% + \if@fileexists + \begingroup + % Because we might be in horizontal mode when \@readauxfile + % is called (if it's in response to a \cite or \nocite), we + % want to ignore all the would-be spaces at the ends of + % lines in the aux file. Fortunately, it's highly unlikely + % an end-of-line might actually be desired. + % And because we don't change the category code of anything + % but @, primitives like \gdef can't be used to define labels + % in the aux file. The solution adopted by btxmac.tex is to + % write `\@citedef{LABEL}{DEFINITION}' to the aux file, and + % use \csname on LABEL. + \endlinechar = -1 + \catcode`@ = 11 + \input \jobname.aux + \endgroup + \else + \message{\@undefinedmessage}% + \global\@citewarningfalse + \fi + \immediate\openout\@auxfile = \jobname.aux + \fi +}% +% +% The \@readauxfile macro does all that work the first time it's called. +% Since it's called once for every \cite, \nocite, \bibliography, and +% \bibliographystyle command that the user issues, we need to remember +% whether the work's been done. It's considered done if we're not to do +% it---that is, if \noauxfile is defined. +% +\newif\if@auxfiledone +\ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi +% +% It's conceivable you'd want to change how other characters are read; +% to do that, change their category code before doing \input btxmac. +% +% +% After reading the .aux file, \@readauxfile opens it for writing. +% The \@writeaux macro does the actual writing (as long as +% \noauxfile is undefined). +% +\@innernewwrite\@auxfile +\def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}% +% +% +% A macro package that uses btxmac.tex might define +% \@undefinedmessage (before doing an \input btxmac). +% +\ifx\@undefinedmessage\@undefined + \def\@undefinedmessage{No .aux file; I won't give you warnings about + undefined citations.}% +\fi +% +% Even if citations are undefined, we want to complain only if +% \@citewarningtrue. The default is to set \@citewarningtrue unless +% \noauxfile is defined. Again, a macro package that uses +% btxmac.tex might want to redefine this. +% +\@innernewif\if@citewarning +\ifx\noauxfile\@undefined \@citewarningtrue\fi +% +% +% Finally, before leaving we restore @'s old category code. +% +\catcode`@ = \@oldatcatcode diff --git a/macros/eplain/tex/eplain.aux b/macros/eplain/tex/eplain.aux new file mode 100644 index 0000000000..0efcf286dc --- /dev/null +++ b/macros/eplain/tex/eplain.aux @@ -0,0 +1,3 @@ +% This eplain.aux file is installed for the sake of initex. Running +% initex without this file would produce an eplain.fmt which never +% issues warning messages about undefined labels. diff --git a/macros/eplain/tex/eplain.ini b/macros/eplain/tex/eplain.ini new file mode 100644 index 0000000000..0df42edf05 --- /dev/null +++ b/macros/eplain/tex/eplain.ini @@ -0,0 +1,6 @@ +% Thomas Esser, 1998. public domain. +% hyphenation is set up in language.dat +\input bplain +\input eplain +\dump +\endinput diff --git a/macros/eplain/tex/eplain.tex b/macros/eplain/tex/eplain.tex new file mode 100644 index 0000000000..d4dc8e2a1c --- /dev/null +++ b/macros/eplain/tex/eplain.tex @@ -0,0 +1,4135 @@ +%% @texfile{ +%% author = "Karl Berry, Steven Smith, Oleg Katsitadze, and others", +%% version = "3.9", +%% date = "Thu May 30 08:55:47 PDT 2019", +%% filename = "eplain.tex", +%% email = "bug-eplain@tug.org", +%% checksum = "4135 9294 134244", +%% codetable = "ASCII", +%% supported = "yes", +%% docstring = "This file defines macros that extend and expand on +%% plain TeX. eplain.tex is xeplain.tex and the other +%% source files with comments stripped; see the original +%% files for author credits, etc. The original sources +%% can be found in Eplain sources in your TeX +%% distribution, on CTAN or on Eplain's home page at +%% http://tug.org/eplain. Please base diffs or +%% other contributions on xeplain.tex, not the +%% stripped-down eplain.tex.", +%% } +\ifx\eplain\undefined + \let\next\relax +\else + \expandafter\let\expandafter\next\csname endinput\endcsname +\fi +\next +%% +%% This is file `ifpdf.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% ifpdf.dtx (with options: `package') +%% +%% Source File: ifpdf.dtx +%% Copyright 2016 Heiko Oberdiek and LaTeX3 project +%% +%% This file may be distributed under the terms of the LPPL. +%% See README for details. +\ifx\ProvidesPackage\undefined +\def\next#1#2[#3]{\wlog{#2 #3}} +\expandafter\next\fi +\ProvidesPackage{ifpdf} +[2016/04/04 v3.0 Provides the ifpdf switch] +\expandafter\ifx\csname ifpdf\endcsname\relax + \csname newif\expandafter\endcsname\csname ifpdf\endcsname +\else + \ifx\pdftrue\undefined + \ifx\PackageError\undefined + \begingroup\def\PackageError#1#2#3{\endgroup\errmessage{#2}} + \fi + \PackageError{ifpdf}{incompatible ifpdf definition}{} + \expandafter\expandafter\expandafter + \fi +\fi +\let\ifpdf\iffalse +\ifx\directlua\undefined +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname pdfoutput\endcsname\relax +\else + \ifnum\pdfoutput>0 % + \pdftrue + \fi +\fi +\else +\directlua{% +if (tex.outputmode or tex.pdfoutput or 0) > 0 then + tex.print('\string\\pdftrue') +end +} +\fi +%% +%% End of file `ifpdf.sty'. +\def\makeactive#1{\catcode`#1 = \active \ignorespaces}% +\chardef\letter = 11 +\chardef\other = 12 +\def\makeatletter{% + \edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}% + \catcode`\@11\relax +}% +\def\makeatother{% + \edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}% + \catcode`\@12\relax +}% +\edef\leftdisplays{\the\catcode`@}% +\catcode`@ = \letter +\let\@eplainoldatcode = \leftdisplays +\toksdef\toks@ii = 2 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1 = \other}% + \dospecials +}% +{% + \makeactive\^^M % + \long\gdef\letreturn#1{\let^^M = #1}% +}% +\let\@eattoken = \relax % Define this, so \eattoken can be used in \edef. +\def\eattoken{\let\@eattoken = }% +\def\gobble#1{}% +\def\gobbletwo#1#2{}% +\def\gobblethree#1#2#3{}% +\def\identity#1{#1}% +\def\@emptymarkA{\@emptymarkB} +\def\ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}% +\def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}% +\def\@gobbleminus#1{\ifx-#1\else#1\fi}% +\def\ifinteger#1{\ifcat_\ifnum9<1\@gobbleminus#1 _\else A\fi}% +\def\isinteger{TT\fi\ifinteger}% +\def\@gobblemeaning#1:->{}% +\def\sanitize{\expandafter\@gobblemeaning\meaning}% +\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}% +\def\csn#1{\csname#1\endcsname}% +\def\ece#1#2{\expandafter#1\csname#2\endcsname}% +\def\expandonce{\expandafter\noexpand}% +\let\@plainwlog = \wlog +\let\wlog = \gobble +\newlinechar = `^^J +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{\tracingcommands\tw@\tracingstats\tw@ + \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne + \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne + \showboxbreadth\maxdimen\showboxdepth\maxdimen +}% +\def\tracingboxes{\showboxbreadth = \maxdimen \showboxdepth = \maxdimen}% +\def\gtracingoff{\begingroup \globaldefs = 1 \tracingoff \endgroup}% +\def\tracingoff{\tracingonline\z@\tracingcommands\z@\tracingstats\z@ + \tracingpages\z@\tracingoutput\z@\tracinglostchars\z@ + \tracingmacros\z@\tracingparagraphs\z@\tracingrestores\z@ + \showboxbreadth5 \showboxdepth3 +}% +\begingroup + \catcode`\{ = 12 \catcode`\} = 12 + \catcode`\[ = 1 \catcode`\] = 2 + \gdef\lbracechar[{]% + \gdef\rbracechar[}]% + \catcode`\% = \other + \gdef\percentchar[%]\endgroup +\def\vpenalty{\ifhmode\par\fi \penalty}% +\def\hpenalty{\ifvmode\leavevmode\fi \penalty}% +\def\iterate{% + \let\loop@next\relax + \body + \let\loop@next\iterate + \fi + \loop@next +}% +\def\edefappend#1#2{% + \toks@ = \expandafter{#1}% + \edef#1{\the\toks@ #2}% +}% +\def\allowhyphens{\nobreak\hskip\z@skip}% +\long\def\hookprepend{\@hookassign{\the\toks@ii \the\toks@}}% +\long\def\hookappend{\@hookassign{\the\toks@ \the\toks@ii}}% +\let\hookaction = \hookappend % either one should be ok +\long\def\@hookassign#1#2#3{% + \expandafter\ifx\csname @#2hook\endcsname \relax + \toks@ = {}% + \else + \expandafter\let\expandafter\temp \csname @#2hook\endcsname + \toks@ = \expandafter{\temp}% + \fi + \toks2 = {#3}% Don't expand the argument all the way. + \ece\edef{@#2hook}{#1}% +}% +\long\def\hookactiononce#1#2{% + \edefappend#2{\global\let\noexpand#2\relax} + \hookaction{#1}#2% +}% +\def\hookrun#1{% + \expandafter\ifx\csname @#1hook\endcsname \relax \else + \def\temp{\csname @#1hook\endcsname}% + \expandafter\temp + \fi +}% +\def\setproperty#1#2#3{\ece\edef{#1@p#2}{#3}}% +\def\setpropertyglobal#1#2#3{\ece\xdef{#1@p#2}{#3}}% +\def\getproperty#1#2{% + \expandafter\ifx\csname#1@p#2\endcsname\relax + \else \csname#1@p#2\endcsname + \fi +}% +\ifx\@undefinedmessage\@undefined + \def\@undefinedmessage + {No .aux file; I won't warn you about undefined labels.}% +\fi +%% @texfile{ +%% author = "Karl Berry and Oren Patashnik", +%% version = "0.99p", +%% date = "30 May 2019", +%% filename = "btxmac.tex", +%% address = "tex-eplain@tug.org", +%% supported = "yes", +%% docstring = "Defines macros that make BibTeX work with plain TeX", +%% } +\edef\cite{\the\catcode`@}% +\catcode`@ = 11 +\let\@oldatcatcode = \cite +\chardef\@letter = 11 +\chardef\@other = 12 +\def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}% +\@innerdef\@innernewcount{newcount}% +\@innerdef\@innernewdimen{newdimen}% +\@innerdef\@innernewif{newif}% +\@innerdef\@innernewwrite{newwrite}% +\def\@gobble#1{}% +\ifx\inputlineno\@undefined + \let\@linenumber = \empty % Pre-3.0. +\else + \def\@linenumber{\the\inputlineno:\space}% +\fi +\long\def\@futurenonspacelet#1{\def\cs{#1}% + \afterassignment\@stepone\let\@nexttoken= +}% +\begingroup % The grouping here avoids stepping on an outside use of `\\'. +\def\\{\global\let\@stoken= }% +\\ % now \@stoken is a space token (\\ is a control symbol, so that +\endgroup +\def\@stepone{\expandafter\futurelet\cs\@steptwo}% +\def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree + \else\let\@@next=\@nexttoken\fi \@@next}% +\def\@stepthree{\afterassignment\@stepone\let\@@next= }% +\def\@getoptionalarg#1{% + \let\@optionalusercs = #1% + \let\@optionalnext = \relax + \@futurenonspacelet\@optionalnext\@bracketcheck +}% +\def\@bracketcheck{% + \ifx [\@optionalnext + \expandafter\@@getoptionalarg % we have an optional arg + \else + \let\@optionalarg = \empty % no optional arg + \expandafter\@optionalusercs + \fi +}% +\def\@@getoptionalarg[#1]{% + \def\@optionalarg{#1}% + \let\@optdummy=\relax % just in case it has become \outer somehow + \@futurenonspacelet\@optdummy\@optionalusercs +}% +\def\@nnil{\@nil}% +\def\@fornoop#1\@@#2#3{}% +\def\@for#1:=#2\do#3{% + \edef\@fortmp{#2}% + \ifx\@fortmp\empty \else + \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}% + \fi +}% +\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else + #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi +}% +\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil + \let\@nextwhile=\@fornoop \else + #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}% +}% +\@innernewif\if@fileexists +\def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}% +\def\@finishtestfileexistence#1{% + \begingroup + \def\extension{#1}% + \immediate\openin0 = + \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi + \ifx\extension\empty \else .#1\fi + \space + \ifeof 0 + \global\@fileexistsfalse + \else + \global\@fileexiststrue + \fi + \immediate\closein0 + \endgroup +}% +\toks0 = {% +\def\bibliographystyle#1{% + \@readauxfile + \@writeaux{\string\bibstyle{#1}}% +}% +\let\bibstyle = \@gobble +\let\bblfilebasename = \jobname +\def\bibliography#1{% + \@readauxfile + \@writeaux{\string\bibdata{#1}}% + \@testfileexistence[\bblfilebasename]{bbl}% + \if@fileexists + \nobreak + \@readbblfile + \fi +}% +\let\bibdata = \@gobble +\def\nocite#1{% + \@readauxfile + \@writeaux{\string\citation{#1}}% +}% +\@innernewif\if@notfirstcitation +\def\cite{\@getoptionalarg\@cite}% +\def\@cite#1{% + \let\@citenotetext = \@optionalarg + \printcitestart + \nocite{#1}% + \@notfirstcitationfalse + \@for \@citation :=#1\do + {% + \expandafter\@onecitation\@citation\@@ + }% + \ifx\empty\@citenotetext\else + \printcitenote{\@citenotetext}% + \fi + \printcitefinish +}% +\def\@onecitation#1\@@{% + \if@notfirstcitation + \printbetweencitations + \fi + \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax + \if@citewarning + \message{\@linenumber Undefined citation `#1'.}% + \fi + \expandafter\gdef\csname\@citelabel{#1}\endcsname{% + {\tt + \escapechar = -1 + \nobreak\hskip0pt + \expandafter\string\csname#1\endcsname + \nobreak\hskip0pt + }% + }% + \fi + \printcitepreitem{#1}% + \csname\@citelabel{#1}\endcsname + \printcitepostitem + \@notfirstcitationtrue +}% +\def\@citelabel#1{b@#1}% +\def\@citedef#1#2{{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}}% +\def\@readbblfile{% + \ifx\@itemnum\@undefined + \@innernewcount\@itemnum + \fi + \begingroup + \ifx\begin\@undefined + \def\begin##1##2{% + \setbox0 = \hbox{\biblabelcontents{##2}}% + \biblabelwidth = \wd0 + }% + \let\end = \@gobble % The arg is `thebibliography' again. + \fi + \@itemnum = 0 + \def\bibitem{\@getoptionalarg\@bibitem}% + \def\@bibitem{% + \ifx\@optionalarg\empty + \expandafter\@numberedbibitem + \else + \expandafter\@alphabibitem + \fi + }% + \def\@alphabibitem##1{% + \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}% + \ifx\biblabelprecontents\@undefined + \let\biblabelprecontents = \relax + \fi + \ifx\biblabelpostcontents\@undefined + \let\biblabelpostcontents = \hss + \fi + \@finishbibitem{##1}% + }% + \def\@numberedbibitem##1{% + \advance\@itemnum by 1 + \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}% + \ifx\biblabelprecontents\@undefined + \let\biblabelprecontents = \hss + \fi + \ifx\biblabelpostcontents\@undefined + \let\biblabelpostcontents = \relax + \fi + \@finishbibitem{##1}% + }% + \def\@finishbibitem##1{% + \bblitemhook{##1}% + \biblabelprint{\csname\@citelabel{##1}\endcsname}% + \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}% + \ignorespaces + }% + \ifx\undefined\em \let\em=\bblem \fi + \ifx\undefined\emph \let\emph=\bblemph \fi + \ifx\undefined\mbox \let\mbox=\bblmbox \fi + \ifx\undefined\newblock \let\newblock=\bblnewblock \fi + \ifx\undefined\sc \let\sc=\bblsc \fi + \ifx\undefined\textbf \let\textbf=\bbltextbf \fi + \frenchspacing + \clubpenalty = 4000 \widowpenalty = 4000 + \tolerance = 10000 \hfuzz = .5pt + \everypar = {\hangindent = \biblabelwidth + \advance\hangindent by \biblabelextraspace}% + \bblrm + \parskip = 1.5ex plus .5ex minus .5ex + \biblabelextraspace = .5em + \bblhook + \input \bblfilebasename.bbl + \endgroup +}% +\@innernewdimen\biblabelwidth +\@innernewdimen\biblabelextraspace +\def\biblabelprint#1{% + \noindent + \hbox to \biblabelwidth{% + \biblabelprecontents + \biblabelcontents{#1}% + \biblabelpostcontents + }% + \kern\biblabelextraspace +}% +\def\biblabelcontents#1{{\bblrm [#1]}}% +\def\bblrm{\rm}% +\def\bblem{\it}% +\def\bblemph#1{{\bblem #1\/}} +\def\bbltextbf#1{{\bf #1}} +\def\bblmbox{\leavevmode\hbox} +\def\bblsc{\ifx\@scfont\@undefined + \font\@scfont = cmcsc10 + \fi + \@scfont +}% +\def\bblnewblock{\hskip .11em plus .33em minus .07em }% +\let\bblhook = \empty +\let\bblitemhook = \@gobble +\def\printcitestart{[}% left bracket +\def\printcitefinish{]}% right bracket +\def\printbetweencitations{, }% comma, space +\let\printcitepreitem\@gobble % takes label +\let\printcitepostitem\empty +\def\printcitenote#1{, #1}% comma, space, note (if it exists) +\let\citation = \@gobble +\@innernewcount\@btxnumparams +\ifx\newcommand\undefined +\long\def\newcommand#1{% + \def\@btxcommandname{#1}% + \@getoptionalarg\@btxcontinuenewcommand +}% +\fi +\ifx\renewcommand\undefined + \let\renewcommand = \newcommand +\fi +\ifx\providecommand\undefined +\long\def\providecommand#1{% + \def\@btxcommandname{#1}% + \expandafter\ifx\@btxcommandname \@undefined + \let\cs=\@btxcontinuenewcommand % undefined, so we'll define it + \else + \let\cs=\@gobble % already defined, so ignore it + \fi + \@getoptionalarg\cs +}% +\fi +\def\@btxcontinuenewcommand{% + \@btxnumparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax + \@btxnewcommand +}% +\def\@btxnewcommand#1{% + \def\@btxstartdef{\expandafter\def\@btxcommandname}% + \ifnum\@btxnumparams=0 + \let\@btxparamdef = \empty + \else + \ifnum\@btxnumparams>9 + \errmessage{\the\@btxnumparams\space is too many parameters}% + \else + \ifnum\@btxnumparams<0 + \errmessage{\the\@btxnumparams\space is too few parameters}% + \else + \edef\@btxparamdef{% + \ifcase\@btxnumparams + \empty No arguments. + \or ####1% + \or ####1####2% + \or ####1####2####3% + \or ####1####2####3####4% + \or ####1####2####3####4####5% + \or ####1####2####3####4####5####6% + \or ####1####2####3####4####5####6####7% + \or ####1####2####3####4####5####6####7####8% + \or ####1####2####3####4####5####6####7####8####9% + \fi + }% + \fi + \fi + \fi + \expandafter\@btxstartdef\@btxparamdef{#1}% +}% +}% +\ifx\nobibtex\@undefined \the\toks0 \fi +\def\@readauxfile{% + \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined + \global\@auxfiledonetrue + \@testfileexistence{aux}% + \if@fileexists + \begingroup + \endlinechar = -1 + \catcode`@ = 11 + \input \jobname.aux + \endgroup + \else + \message{\@undefinedmessage}% + \global\@citewarningfalse + \fi + \immediate\openout\@auxfile = \jobname.aux + \fi +}% +\newif\if@auxfiledone +\ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi +\@innernewwrite\@auxfile +\def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}% +\ifx\@undefinedmessage\@undefined + \def\@undefinedmessage{No .aux file; I won't give you warnings about + undefined citations.}% +\fi +\@innernewif\if@citewarning +\ifx\noauxfile\@undefined \@citewarningtrue\fi +\catcode`@ = \@oldatcatcode +\let\auxfile = \@auxfile +\let\for = \@for +\let\futurenonspacelet = \@futurenonspacelet +\def\iffileexists{\if@fileexists}% +\let\innerdef = \@innerdef +\let\innernewcount = \@innernewcount +\let\innernewdimen = \@innernewdimen +\let\innernewif = \@innernewif +\let\innernewwrite = \@innernewwrite +\let\linenumber = \@linenumber +\let\readauxfile = \@readauxfile +\let\spacesub = \@spacesub +\let\testfileexistence = \@testfileexistence +\let\writeaux = \@writeaux +\def\innerinnerdef#1{\expandafter\innerdef\csname inner#1\endcsname{#1}}% +\innerinnerdef{newbox}% +\innerinnerdef{newfam}% +\innerinnerdef{newhelp}% +\innerinnerdef{newinsert}% +\innerinnerdef{newlanguage}% +\innerinnerdef{newmuskip}% +\innerinnerdef{newread}% +\innerinnerdef{newskip}% +\innerinnerdef{newtoks}% +\def\immediatewriteaux#1{% + \ifx\noauxfile\@undefined + \immediate\write\@auxfile{#1}% + \fi +}% +\def\bblitemhook#1{\gdef\@hlbblitemlabel{#1}}% +\def\biblabelprint#1{% + \noindent + \hbox to \biblabelwidth{% + \hldest@impl{bib}{\@hlbblitemlabel}% + \biblabelprecontents + \biblabelcontents{#1}% + \biblabelpostcontents + }% + \kern\biblabelextraspace +}% +\def\eplainprintcitepreitem#1{\hlstart@impl{cite}{#1}}% +\def\eplainprintcitepostitem{\hlend@impl{cite}}% +\def\printcitepreitem#1{% + \testfileexistence[\bblfilebasename]{bbl}% + \iffileexists + \global\let\printcitepreitem\eplainprintcitepreitem + \global\let\printcitepostitem\eplainprintcitepostitem + \else + \global\let\printcitepreitem\gobble + \global\let\printcitepostitem\relax + \fi + \printcitepreitem{#1}% +}% +\def\@Nnil{\@Nil}% +\def\@Fornoop#1\@@#2#3{}% +\def\For#1:=#2\do#3{% + \edef\@Fortmp{#2}% + \ifx\@Fortmp\empty \else + \expandafter\@Forloop#2,\@Nil,\@Nil\@@#1{#3}% + \fi +}% +\def\@Forloop#1,#2,#3\@@#4#5{\@Fordef#1\@@#4\ifx #4\@Nnil \else + #5\@Fordef#2\@@#4\ifx #4\@Nnil \else#5\@iForloop #3\@@#4{#5}\fi\fi +}% +\def\@iForloop#1,#2\@@#3#4{\@Fordef#1\@@#3\ifx #3\@Nnil + \let\@Nextwhile=\@Fornoop \else + #4\relax\let\@Nextwhile=\@iForloop\fi\@Nextwhile#2\@@#3{#4}% +}% +\def\@Forspc{ }% +\def\@Fordef{\futurelet\@Fortmp\@@Fordef}% Peep at the next token. +\def\@@Fordef{% + \expandafter\ifx\@Forspc\@Fortmp % Next token is a space. + \expandafter\@Fortrim + \else + \expandafter\@@@Fordef + \fi +}% +\expandafter\def\expandafter\@Fortrim\@Forspc#1\@@{\@Fordef#1\@@}% +\def\@@@Fordef#1\@@#2{\def#2{#1}}% +\def\tmpfileextension{.tmp}% +\let\tmpfilebasename = \jobname +\ifx\eTeXversion\undefined + \innernewwrite\eplain@tmpfile + \def\scantokens#1{% + \toks@={#1}% + \immediate\openout\eplain@tmpfile=\tmpfilebasename\tmpfileextension + \immediate\write\eplain@tmpfile{\the\toks@}% + \immediate\closeout\eplain@tmpfile + \input \tmpfilebasename\tmpfileextension\relax + }% +\fi +\begingroup + \makeactive\^^M \makeactive\ % No spaces or ^^M's from here on. +\gdef\obeywhitespace{% +\makeactive\^^M\def^^M{\par\futurelet\next\@finishobeyedreturn}% +\makeactive\ \let =\ % +\aftergroup\@removebox% +\futurelet\next\@finishobeywhitespace% +}% +\gdef\@finishobeywhitespace{{% +\ifx\next % +\aftergroup\@obeywhitespaceloop% +\else\ifx\next^^M% +\aftergroup\gobble% +\fi\fi}}% +\gdef\@finishobeyedreturn{% +\ifx\next^^M\vskip\blanklineskipamount\fi% +\indent% +}% +\endgroup +\def\@obeywhitespaceloop#1{\futurelet\next\@finishobeywhitespace}% +\def\@removebox{% + \ifhmode + \setbox0 = \lastbox + \ifdim\wd0=\parindent + \setbox2 = \hbox{\unhcopy0}% Preserve \box0 so we can put it back. + \ifdim\wd2=0pt + \ignorespaces + \else + \box0 % Put it back: it wasn't empty. + \fi + \else + \box0 % Put it back: it wasn't the right width. + \fi + \fi +}% +\newskip\blanklineskipamount +\blanklineskipamount = 0pt +\def\frac#1/#2{\leavevmode + \kern.1em \raise .5ex \hbox{\the\scriptfont0 #1}% + \kern-.1em $/$% + \kern-.15em \lower .25ex \hbox{\the\scriptfont0 #2}% +}% +\newdimen\hruledefaultheight \hruledefaultheight = 0.4pt +\newdimen\hruledefaultdepth \hruledefaultdepth = 0.0pt +\newdimen\vruledefaultwidth \vruledefaultwidth = 0.4pt +\def\ehrule{\hrule height\hruledefaultheight depth\hruledefaultdepth}% +\def\evrule{\vrule width\vruledefaultwidth}% +%%% ==================================================================== +%%% @TeX-style-file{ +%%% author = "Nelson H. F. Beebe", +%%% version = "1.10", +%%% date = "02 March 1998", +%%% time = "08:36:13 MST", +%%% filename = "texnames.sty", +%%% address = "Center for Scientific Computing +%%% Department of Mathematics +%%% South Physics Building +%%% University of Utah +%%% Salt Lake City, UT 84112 +%%% USA +%%% Tel: (801) 581-5254 +%%% FAX: (801) 581-4148", +%%% checksum = "27723 296 1385 12423", +%%% email = "beebe@magna.math.utah.edu (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "TeX names", +%%% supported = "yes", +%%% docstring = "This style file for AmSTeX, LaTeX, and TeX +%%% defines macros for the names of TeX +%%% and METAFONT programs, in several +%%% letter-case variants: +%%% +%%% \AMSTEX, \AMSTeX, \AmSTeX +%%% \BIBTEX, \BIBTeX, \BibTeX +%%% \LAMSTeX, \LAmSTeX +%%% \LaTeX, \LATEX +%%% \METAFONT, \MF +%%% \SLITEX, \SLITeX, \SLiTeX, \SliTeX +%%% +%%% It will NOT redefine any macro that +%%% already exists, so it can be included +%%% harmlessly after other style files. +%%% +%%% In AmSTeX or Plain TeX, just do +%%% +%%% \input texnames.sty +%%% +%%% In LaTeX, do +%%% +%%% \documentstyle[...,texnames]{...} +%%% +%%% This file grew out of original work by +%%% +%%% Richard Furuta +%%% Department of Computer Science +%%% University of Maryland +%%% College Park, MD 20742 +%%% +%%% furuta@mimsy.umd.edu +%%% seismo!umcp-cs!furuta +%%% +%%% 22 October 1986, first release (1.00) +%%% +%%% 1 April 1987 (1.01): Modified by William +%%% LeFebvre, Rice University to include +%%% definitions for BibTeX and SLiTeX, as they +%%% appear in the LaTeX Local User's Guide +%%% template (the file latex/local.tex in +%%% standard distributions) +%%% +%%% 26 October 1991 (1.02): Modified by +%%% Nelson H. F. Beebe <beebe@math.utah.edu> to +%%% add several new macro names, and adapt for +%%% use with Plain TeX and AmSTeX. +%%% +%%% 26 October 1991 (1.03): Add \LaTeX and +%%% \LATEX +%%% +%%% 25 November 1991 (1.04): Add \LamSTeX +%%% and \LAMSTeX +%%% +%%% 27 January 1991 (1.05 and 1.06): Add slanted +%%% font support for \MF. Make several comment +%%% changes. Add a couple of missing % at end +%%% of line, and replace blank lines by empty +%%% comments. +%%% +%%% 30 December 1992 (1.07): Use \TeX in +%%% definitions of \BibTeX and \LaTeX. Remove +%%% occurrences of \rm. Change \sc to use +%%% \scriptfont instead of hardwiring cmcsc10. +%%% Use \cal for \LAMSTeX. +%%% +%%% 1 March 1993 (1.08): Consolidate \ifx's onto +%%% single lines for brevity. Add +%%% \spacefactor1000 to definitions for \TeX and \MF. +%%% +%%% 16 March 1993 (1.09): Add \AmS, \AMS, \AmSLaTeX, +%%% and \AMSLaTeX. +%%% +%%% 02 March 1998 (1.10): Add \LaTeXe. +%%% +%%% The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% +%%% } +%%% ==================================================================== +\ifx\sc\undefined + \def\sc{% + \expandafter\ifx\the\scriptfont\fam\nullfont + \font\temp = cmr7 \temp + \else + \the\scriptfont\fam + \fi + \def\uppercasesc{\char\uccode`}% + }% +\fi +\ifx\uppercasesc\undefined + \let\uppercasesc = \relax +\fi +\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\spacefactor1000 }% +\ifx\AmS\undefined + \def\AmS{{\the\textfont2 A}\kern-.1667em\lower.5ex\hbox + {\the\textfont2 M}\kern-.125em{\the\textfont2 S}} +\fi +\ifx\AMS\undefined \let\AMS=\AmS \fi +\ifx\AmSLaTeX\undefined + \def\AmSLaTeX{\AmS-\LaTeX} +\fi +\ifx\AMSLaTeX\undefined \let\AMSLaTeX=\AmSLaTeX \fi +\ifx\AmSTeX\undefined + \def\AmSTeX{$\cal A$\kern-.1667em\lower.5ex\hbox{$\cal M$}% + \kern-.125em$\cal S$-\TeX}% +\fi +\ifx\AMSTEX\undefined \let\AMSTEX=\AmSTeX \fi +\ifx\AMSTeX\undefined \let\AMSTeX=\AmSTeX \fi +\ifx\BibTeX\undefined + \def\BibTeX{B{\sc \uppercasesc i\kern-.025em \uppercasesc b}\kern-.08em + \TeX}% +\fi +\ifx\BIBTeX\undefined \let\BIBTeX=\BibTeX \fi +\ifx\BIBTEX\undefined \let\BIBTEX=\BibTeX \fi +\ifx\LAMSTeX\undefined + \def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em\the\scriptfont2 A}% + \kern-.2em\lower.376ex\hbox{\the\textfont2 M}% + \kern-.125em {\the\textfont2 S}-\TeX}% +\fi +\ifx\LamSTeX\undefined \let\LamSTeX=\LAMSTeX \fi +\ifx\LAmSTeX\undefined \let\LAmSTeX=\LAMSTeX \fi +\ifx\LaTeX\undefined + \def\LaTeX{L\kern-.36em\raise.3ex\hbox{\sc \uppercasesc a}\kern-.15em\TeX}% +\fi +\ifx\LATEX\undefined \let\LATEX=\LaTeX \fi +\ifx\LaTeXe\undefined + \def\LaTeXe{\LaTeX{}\kern.05em2$_{\textstyle\varepsilon}$} +\fi +\ifx\MF\undefined + \ifx\manfnt\undefined + \font\manfnt=logo10 + \fi + \ifx\manfntsl\undefined + \font\manfntsl=logosl10 + \fi + \def\MF{{\ifdim\fontdimen1\font>0pt \let\manfnt = \manfntsl \fi + {\manfnt META}\-{\manfnt FONT}}\spacefactor1000 }% +\fi +\ifx\METAFONT\undefined \let\METAFONT=\MF \fi +\ifx\SLITEX\undefined + \def\SLITEX{S\kern-.065em L\kern-.18em\raise.32ex\hbox{i}\kern-.03em\TeX}% +\fi +\ifx\SLiTeX\undefined \let\SLiTeX=\SLITEX \fi +\ifx\SliTeX\undefined \let\SliTeX=\SLITEX \fi +\ifx\SLITeX\undefined \let\SLITeX=\SLITEX \fi +%%% @TeX-style-file +%%% { +%%% author = "Philip Taylor", +%%% version = "3.05", +%%% date = "7 April 2011", +%%% time = "15:59:31 BST", +%%% filename = "path.sty", +%%% license = "Unlimited copying and redistribution of this +%%% file are permitted as long as this file is +%%% not modified. Modifications are permitted, +%%% but only if the resulting file is not named +%%% path.sty regardless of case", +%%% address = "c/o The Hellenic Institute +%%% Royal Holloway, University of London +%%% Egham Hull, Egham +%%% Surrey TW20 0EX +%%% United Kingdom", +%%% telephone = "Tel: +44 1622 820 735", +%%% email = "P.Taylor@Rhul.Ac.Uk", +%%% codetable = "ISO/ASCII", +%%% keywords = "file name, filename, path name, pathname, +%%% discretionary, discretionaries", +%%% supported = "yes", +%%% docstring = {Computer filenames, host names, and e-mail +%%% addresses tend to be long strings that +%%% cause line breaking problems for TeX. +%%% Sometimes rather long strings are +%%% encountered, such as: +%%% +%%% mighty-mouse-gw.scrc.symbolics.com +%%% +%%% This file defines a macro, \path|...|, +%%% similar to LaTeX's \verb|...| macro, that +%%% sets the text in the typewriter font, +%%% allowing hyphen-less line breaks at +%%% punctuation characters. +%%% +%%% The default set of punctuation characters is +%%% defined as +%%% +%%% \discretionaries |~!@$%^&*()_+`-=#{"}[]:;'<>,.?\/| +%%% +%%% However, you can change it as needed, for +%%% example +%%% +%%% \discretionaries +@%!.+ +%%% +%%% would assign to it the set @ % ! . which +%%% commonly occur in electronic mail addresses. +%%% +%%% The delimiter characters surrounding the +%%% arguments to \discretionaries and \path +%%% will normally be a punctuation character not +%%% found in the argument, and not otherwise +%%% significant to TeX. In particular, backslash +%%% cannot be used as a delimiter. In the rare +%%% event that this is required, set +%%% +%%% \specialpathdelimiterstrue +%%% +%%% This practice is not recommended, because TeX +%%% then runs about four times slower while it is +%%% typesetting \path\...\ requests. +%%% \specialpathdelimitersfalse is the normal +%%% setting. +%%% +%%% This file may be used in Plain TeX or AmSTeX +%%% by +%%% +%%% \input path.sty +%%% +%%% and in LaTeX by +%%% +%%% \usepackage {path} +%%% +%%% The checksum field above, if present, contains +%%% a CRC-16 checksum as the first value, followed +%%% by the equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility. +%%% } +%%% } +%%% ==================================================================== +%%% The use of `\path' as a temporary control sequence is a kludge, but +%%% it's a reasonably simple way to accomplish making @ a letter (to +%%% provide ``concealed'' control sequences) without overwriting something +%%% (without an `@' in its name) that might already be defined. +\edef \path {\the \catcode `\@}% +\catcode `\@ = 11 +\let \oldc@tcode = \path +%%% Make commercial-at a letter to provide concealed control sequences +\catcode `\@ = 11 +%%% and then declare two \count variables with concealed names +\newcount \c@tcode +\newcount \c@unter +%%% and a boolean variable with an open name, to specify the nature of +%%% the delimiters which will be associated with the \path command +\newif \ifspecialpathdelimiters +%%% If desired, you can define \pathafterhook to take +\let \pathafterhook = \relax +%%% We need to define control sequences which expand to both +%%% active and passive spaces ... +\begingroup +\catcode `\ = 10 +\gdef \passivesp@ce { } +\catcode `\ = 13\relax% +\gdef\activesp@ce{ }% +\endgroup +%%% \discretionaries will define a macro \discr@ti@n@ri@s which will +%%% make every character between the first and final <delim> a +%%% discretionary breakpoint. +\def \discretionaries %%% <delim> <chars> <delim> + {\begingroup + \c@tcodes = 13 + \discr@tionaries + } +%%% \discr@tionaries will receive as parameter the initial <delim> +%%% which will delimit the set of discretionaries; this <delim> +%%% will be active. +\def \discr@tionaries #1%%% <delim> + {\def \discr@ti@naries ##1#1%%% <chars> <delim> + {\endgroup + \def \discr@ti@n@ries ####1%%% <char> or <delim> + {\if \noexpand ####1\noexpand #1% + \let \n@xt = \relax + \else + \catcode `####1 = 13 + \def ####1{\discretionary + {\char `####1}{}{\char `####1}}% + \let \n@xt = \discr@ti@n@ries + \fi + \n@xt + }% + \def \discr@ti@n@ri@s {\discr@ti@n@ries ##1#1}% + }% + \discr@ti@naries + } +%%% \path, which is the user interface to \p@th, first checks +%%% to see whether \specialpathdelimiters is <true> or <false>; +%%% if <true>, it needs to take special action to ensure that +%%% \stress {all} characters (apart from <space>) are acceptable +%%% as delimiters; this is very time-consuming, and should be +%%% avoided if at all possible. It also defines \endp@th, to +%%% close the appropriate number of groups, and finally transfers +%%% control to \p@th +\def \path + {\ifspecialpathdelimiters + \begingroup + \c@tcodes = 12 + \def \endp@th {\endgroup \endgroup \pathafterhook}% + \else + \def \endp@th {\endgroup \pathafterhook}% + \fi + \p@th + } +%%% \p@th, which has essentially the same syntax as \discretionaries, +%%% expects to be followed by a <delim>, a <path>, and a second instance +%%% of <delim>; it will typeset <path> in the \tt font with hyphenation +%%% inhibited --- breaks (but not true hyphenation) are allowed at any +%%% or all of the special characters which have +%%% previously been declared as \discretionaries. +\def \p@th #1%%% <delim> + {\begingroup + \tt + \c@tcode = \catcode `#1 + \discr@ti@n@ri@s + \catcode `\ = \active + \expandafter \edef \activesp@ce {\passivesp@ce \hbox {}}% + \catcode `#1 = \c@tcode + \def \p@@th ##1#1% <chars> <delim> + {\leavevmode \hbox {}##1% + \endp@th + }% + \p@@th + } +%%% \c@tcodes expects to be followed by the r-h-s of a numeric +%%% assignment optionally including the assignment operator; it saves +%%% the value of the r-h-s in \c@tcode, and invokes \c@tc@des. +\def \c@tcodes {\afterassignment \c@tc@des \c@tcode} +%%% \c@tc@des uses the value saved in \c@tcode, and assigns it to the +%%% \catcode of all characters with the single exception of <space>, +%%% which retains its normal catcode of 10; on exit, every single +%%% character apart from <space> will have the catcode which followed +%%% \c@tcodes. The code is optimised to avoid unnecessary usage of +%%% save-stack space. +\def \c@tc@des + {\c@unter = 0 + \loop + \ifnum \catcode \c@unter = \c@tcode + \else + \catcode \c@unter = \c@tcode + \fi + \ifnum \c@unter < 255 + \advance \c@unter by 1 + \repeat + \catcode `\ = 10 + } +%%% We restore the original catcode of commercial-at +\catcode `\@ = \oldc@tcode +%%% Define a default set of discretionary break characters +%%% to include all punctuation characters except vertical +%%% bar +\discretionaries |~!@$%^&*()_+`-=#{}[]:";'<>,.?\/| +\ifx\eTeX\undefined + \def\eTeX{\hbox{\mathsurround=0pt $\varepsilon$-\kern-.125em\TeX}}% +\fi +\ifx\ExTeX\undefined + \def\ExTeX{\hbox{\mathsurround=0pt + $\textstyle\varepsilon_{\kern-0.15em\cal{X}}$\kern-.2em\TeX}}% +\fi +\def\eplain@Xe@reflect#1{% + \ifx\reflectbox\undefined + \errmessage{A graphics package must be loaded for \string\XeTeX}% + \else + \ifdim \fontdimen1\font>0pt + \raise 1.75ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em + \else + \reflectbox{#1}% + \fi + \fi +}% +\def\eplain@Xe#1{\leavevmode + \smash{\hbox{X% + \setbox0=\hbox{\TeX}\setbox2=\hbox{E}% + \lower\dp0\hbox{\raise\dp2\hbox{\kern-.125em\eplain@Xe@reflect{E}}}% + \kern-.1667em #1}}}% +\ifx\XeTeX\undefined + \def\XeTeX{\eplain@Xe\TeX}% +\fi +\ifx\XeLaTeX\undefined + \def\XeLaTeX{\eplain@Xe{\thinspace\LaTeX}}% +\fi +\def\blackbox{\vrule height .8ex width .6ex depth -.2ex \relax}% square bullet +\def\makeblankbox#1#2{% + \ifvoid0 + \errhelp = \@makeblankboxhelp + \errmessage{Box 0 is void}% + \fi + \hbox{\lower\dp0 + \vbox{\hidehrule{#1}{#2}% + \kern -#1% overlap rules + \hbox to \wd0{\hidevrule{#1}{#2}% + \raise\ht0\vbox to #1{}% vrule height + \lower\dp0\vtop to #1{}% vrule depth + \hfil\hidevrule{#2}{#1}% + }% + \kern-#1\hidehrule{#2}{#1}% + }% + }% +}% +\newhelp\@makeblankboxhelp{Assigning to the dimensions of a void^^J% + box has no effect. Do `\string\setbox0=\string\null' before you^^J% + define its dimensions.}% +\def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2 \kern-#2}% +\def\hidevrule#1#2{% + \kern-#1% + \dimen@=#1\advance\dimen@ by #2% + \vrule width\dimen@ + \kern-#2% +}% +\newdimen\boxitspace \boxitspace = 3pt +\long\def\boxit#1{% + \vbox{% + \ehrule + \hbox{% + \evrule + \kern\boxitspace + \vbox{\kern\boxitspace \parindent = 0pt #1\kern\boxitspace}% + \kern\boxitspace + \evrule + }% + \ehrule + }% +}% +\def\numbername#1{\ifcase#1% + zero% + \or one% + \or two% + \or three% + \or four% + \or five% + \or six% + \or seven% + \or eight% + \or nine% + \or ten% + \or #1% + \fi +}% +\let\@plainnewif = \newif +\let\@plainnewdimen = \newdimen +\let\newif = \innernewif +\let\newdimen = \innernewdimen +\edef\@eplainoldandcode{\the\catcode`& }% +\catcode`& = 11 +\toks0 = {% +\edef\thinlines{\the\catcode`@ }% +\catcode`@ = 11 +\let\@oldatcatcode = \thinlines +\def\smash@@{\relax % \relax, in case this comes first in \halign + \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh + \fi\next} +\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh} +\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh} +\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@} +\edef\@oldandcatcode{\the\catcode`& }% +\catcode`& = 11 +\def\&whilenoop#1{}% +\def\&whiledim#1\do #2{\ifdim #1\relax#2\&iwhiledim{#1\relax#2}\fi}% +\def\&iwhiledim#1{\ifdim #1\let\&nextwhile=\&iwhiledim + \else\let\&nextwhile=\&whilenoop\fi\&nextwhile{#1}}% +\newif\if&negarg +\newdimen\&wholewidth +\newdimen\&halfwidth +\font\tenln=line10 +\def\thinlines{\let\&linefnt\tenln \let\&circlefnt\tencirc + \&wholewidth\fontdimen8\tenln \&halfwidth .5\&wholewidth}% +\def\thicklines{\let\&linefnt\tenlnw \let\&circlefnt\tencircw + \&wholewidth\fontdimen8\tenlnw \&halfwidth .5\&wholewidth}% +\def\drawline(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax \&linelen=#3\relax + \ifnum\&xarg =0 \&vline \else \ifnum\&yarg =0 \&hline \else \&sline\fi\fi}% +\def\&sline{\leavevmode + \ifnum\&xarg< 0 \&negargtrue \&xarg -\&xarg \&yyarg -\&yarg + \else \&negargfalse \&yyarg \&yarg \fi + \ifnum \&yyarg >0 \&tempcnta\&yyarg \else \&tempcnta -\&yyarg \fi + \ifnum\&tempcnta>6 \&badlinearg \&yyarg0 \fi + \ifnum\&xarg>6 \&badlinearg \&xarg1 \fi + \setbox\&linechar\hbox{\&linefnt\&getlinechar(\&xarg,\&yyarg)}% + \ifnum \&yyarg >0 \let\&upordown\raise \&clnht\z@ + \else\let\&upordown\lower \&clnht \ht\&linechar\fi + \&clnwd=\wd\&linechar + \&whiledim \&clnwd <\&linelen \do {% + \&upordown\&clnht\copy\&linechar + \advance\&clnht \ht\&linechar + \advance\&clnwd \wd\&linechar + }% + \advance\&clnht -\ht\&linechar + \advance\&clnwd -\wd\&linechar + \&tempdima\&linelen\advance\&tempdima -\&clnwd + \&tempdimb\&tempdima\advance\&tempdimb -\wd\&linechar + \hskip\&tempdimb \multiply\&tempdima \@m + \&tempcnta \&tempdima \&tempdima \wd\&linechar \divide\&tempcnta \&tempdima + \&tempdima \ht\&linechar \multiply\&tempdima \&tempcnta + \divide\&tempdima \@m + \advance\&clnht \&tempdima + \ifdim \&linelen <\wd\&linechar \hskip \wd\&linechar + \else\&upordown\&clnht\copy\&linechar\fi}% +\def\&hline{\vrule height \&halfwidth depth \&halfwidth width \&linelen}% +\def\&getlinechar(#1,#2){\&tempcnta#1\relax\multiply\&tempcnta 8 + \advance\&tempcnta -9 \ifnum #2>0 \advance\&tempcnta #2\relax\else + \advance\&tempcnta -#2\relax\advance\&tempcnta 64 \fi + \char\&tempcnta}% +\def\drawvector(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax + \&tempcnta \ifnum\&xarg<0 -\&xarg\else\&xarg\fi + \ifnum\&tempcnta<5\relax \&linelen=#3\relax + \ifnum\&xarg =0 \&vvector \else \ifnum\&yarg =0 \&hvector + \else \&svector\fi\fi\else\&badlinearg\fi}% +\def\&hvector{\ifnum\&xarg<0 \rlap{\&linefnt\&getlarrow(1,0)}\fi \&hline + \ifnum\&xarg>0 \llap{\&linefnt\&getrarrow(1,0)}\fi}% +\def\&vvector{\ifnum \&yarg <0 \&downvector \else \&upvector \fi}% +\def\&svector{\&sline + \&tempcnta\&yarg \ifnum\&tempcnta <0 \&tempcnta=-\&tempcnta\fi + \ifnum\&tempcnta <5 + \if&negarg\ifnum\&yarg>0 % 3d quadrant; dp > 0 + \llap{\lower\ht\&linechar\hbox to\&linelen{\&linefnt + \&getlarrow(\&xarg,\&yyarg)\hss}}\else % 4th quadrant; ht > 0 + \llap{\hbox to\&linelen{\&linefnt\&getlarrow(\&xarg,\&yyarg)\hss}}\fi + \else\ifnum\&yarg>0 % 1st quadrant; ht > 0 + \&tempdima\&linelen \multiply\&tempdima\&yarg + \divide\&tempdima\&xarg \advance\&tempdima-\ht\&linechar + \raise\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\else + \&tempdima\&linelen \multiply\&tempdima-\&yarg % 2d quadrant; dp > 0 + \divide\&tempdima\&xarg + \lower\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\fi\fi + \else\&badlinearg\fi}% +\def\&getlarrow(#1,#2){\ifnum #2 =\z@ \&tempcnta='33\else +\&tempcnta=#1\relax\multiply\&tempcnta \sixt@@n \advance\&tempcnta +-9 \&tempcntb=#2\relax\multiply\&tempcntb \tw@ +\ifnum \&tempcntb >0 \advance\&tempcnta \&tempcntb\relax +\else\advance\&tempcnta -\&tempcntb\advance\&tempcnta 64 +\fi\fi\char\&tempcnta}% +\def\&getrarrow(#1,#2){\&tempcntb=#2\relax +\ifnum\&tempcntb < 0 \&tempcntb=-\&tempcntb\relax\fi +\ifcase \&tempcntb\relax \&tempcnta='55 \or +\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta +24 \advance\&tempcnta -6 \else \ifnum #1=3 \&tempcnta=49 +\else\&tempcnta=58 \fi\fi\or +\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta +24 \advance\&tempcnta -3 \else \&tempcnta=51\fi\or +\&tempcnta=#1\relax\multiply\&tempcnta +\sixt@@n \advance\&tempcnta -\tw@ \else +\&tempcnta=#1\relax\multiply\&tempcnta +\sixt@@n \advance\&tempcnta 7 \fi\ifnum #2<0 \advance\&tempcnta 64 \fi +\char\&tempcnta}% +\def\&vline{\ifnum \&yarg <0 \&downline \else \&upline\fi}% +\def\&upline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth + height \&linelen depth \z@\hss}}% +\def\&downline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth + height \z@ depth \&linelen \hss}}% +\def\&upvector{\&upline\setbox\&tempboxa\hbox{\&linefnt\char'66}\raise + \&linelen \hbox to\z@{\lower \ht\&tempboxa\box\&tempboxa\hss}}% +\def\&downvector{\&downline\lower \&linelen + \hbox to \z@{\&linefnt\char'77\hss}}% +\def\&badlinearg{\errmessage{Bad \string\arrow\space argument.}}% +\thinlines +\countdef\&xarg 0 +\countdef\&yarg 2 +\countdef\&yyarg 4 +\countdef\&tempcnta 6 +\countdef\&tempcntb 8 +\dimendef\&linelen 0 +\dimendef\&clnwd 2 +\dimendef\&clnht 4 +\dimendef\&tempdima 6 +\dimendef\&tempdimb 8 +\chardef\@arrbox 0 +\chardef\&linechar 2 +\chardef\&tempboxa 2 % \&linechar and \&tempboxa don't interfere. +\let\lft^% +\let\rt_% distinguish between \rt and \lft +\newif\if@pslope % test for positive slope +\def\@findslope(#1,#2){\ifnum#1>0 + \ifnum#2>0 \@pslopetrue \else\@pslopefalse\fi \else + \ifnum#2>0 \@pslopefalse \else\@pslopetrue\fi\fi}% +\def\generalsmap(#1,#2){\getm@rphposn(#1,#2)\plnmorph\futurelet\next\addm@rph}% +\def\sline(#1,#2){\setbox\@arrbox=\hbox{\drawline(#1,#2){\sarrowlength}}% + \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}% +\def\arrow(#1,#2){\setbox\@arrbox=\hbox{\drawvector(#1,#2){\sarrowlength}}% + \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}% +\newif\ifd@@blearr +\def\bisline(#1,#2){\@findslope(#1,#2)% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel + \rlap{\drawline(#1,#2){\sarrowlength}}% + \hskip\@hchannel\hbox{\drawline(#1,#2){\sarrowlength}}}% + \d@@blearrtrue\generalsmap(#1,#2)}% +\def\biarrow(#1,#2){\@findslope(#1,#2)% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel + \rlap{\drawvector(#1,#2){\sarrowlength}}% + \hskip\@hchannel\hbox{\drawvector(#1,#2){\sarrowlength}}}% + \d@@blearrtrue\generalsmap(#1,#2)}% +\def\adjarrow(#1,#2){\@findslope(#1,#2)% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel + \rlap{\drawvector(#1,#2){\sarrowlength}}% + \hskip\@hchannel\hbox{\drawvector(-#1,-#2){\sarrowlength}}}% + \d@@blearrtrue\generalsmap(#1,#2)}% +\newif\ifrtm@rph +\def\@shiftmorph#1{\hbox{\setbox0=\hbox{$\scriptstyle#1$}% + \setbox1=\hbox{\hskip\@hm@rphshift\raise\@vm@rphshift\copy0}% + \wd1=\wd0 \ht1=\ht0 \dp1=\dp0 \box1}}% +\def\@hm@rphshift{\ifrtm@rph + \ifdim\hmorphposnrt=\z@\hmorphposn\else\hmorphposnrt\fi \else + \ifdim\hmorphposnlft=\z@\hmorphposn\else\hmorphposnlft\fi \fi}% +\def\@vm@rphshift{\ifrtm@rph + \ifdim\vmorphposnrt=\z@\vmorphposn\else\vmorphposnrt\fi \else + \ifdim\vmorphposnlft=\z@\vmorphposn\else\vmorphposnlft\fi \fi}% +\def\addm@rph{\ifx\next\lft\let\temp=\lftmorph\else + \ifx\next\rt\let\temp=\rtmorph\else\let\temp\relax\fi\fi \temp}% +\def\plnmorph{\dimen1\wd\@arrbox \ifdim\dimen1<\z@ \dimen1-\dimen1\fi + \vcenter{\box\@arrbox}}% +\def\lftmorph\lft#1{\rtm@rphfalse \setbox0=\@shiftmorph{#1}% + \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi + \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss % \dimen1=\wd\@arrbox + \llap{\box0}\hss}\hskip\@hmorphdflt}\futurelet\next\addm@rph}% +\def\rtmorph\rt#1{\rtm@rphtrue \setbox0=\@shiftmorph{#1}% + \if@pslope \let\@upordown\lower \else \let\@upordown\raise\fi + \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss + \rlap{\box0}\hss}\hskip-\@hmorphdflt}\futurelet\next\addm@rph}% +\def\getm@rphposn(#1,#2){\ifd@@blearr \dimen@\morphdist \advance\dimen@ by + .5\channelwidth \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\dimen@}\else + \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\morphdist}\fi}% +\def\getch@nnel(#1,#2){\ifdim\hchannel=\z@ \ifdim\vchannel=\z@ + \@getshift(#1,#2){\@hchannel}{\@vchannel}{\channelwidth}% + \else \@hchannel\hchannel \@vchannel\vchannel \fi + \else \@hchannel\hchannel \@vchannel\vchannel \fi}% +\def\@getshift(#1,#2)#3#4#5{\dimen@ #5\relax + \&xarg #1\relax \&yarg #2\relax + \ifnum\&xarg<0 \&xarg -\&xarg \fi + \ifnum\&yarg<0 \&yarg -\&yarg \fi + \ifnum\&xarg<\&yarg \&negargtrue \&yyarg\&xarg \&xarg\&yarg \&yarg\&yyarg\fi + \ifcase\&xarg \or % There is no case 0 + \ifcase\&yarg % case 1 + \dimen@i \z@ \dimen@ii \dimen@ \or % case (1,0) + \dimen@i .7071\dimen@ \dimen@ii .7071\dimen@ \fi \or + \ifcase\&yarg % case 2 + \or % case 0,2 wrong + \dimen@i .4472\dimen@ \dimen@ii .8944\dimen@ \fi \or + \ifcase\&yarg % case 3 + \or % case 0,3 wrong + \dimen@i .3162\dimen@ \dimen@ii .9486\dimen@ \or + \dimen@i .5547\dimen@ \dimen@ii .8321\dimen@ \fi \or + \ifcase\&yarg % case 4 + \or % case 0,2,4 wrong + \dimen@i .2425\dimen@ \dimen@ii .9701\dimen@ \or\or + \dimen@i .6\dimen@ \dimen@ii .8\dimen@ \fi \or + \ifcase\&yarg % case 5 + \or % case 0,5 wrong + \dimen@i .1961\dimen@ \dimen@ii .9801\dimen@ \or + \dimen@i .3714\dimen@ \dimen@ii .9284\dimen@ \or + \dimen@i .5144\dimen@ \dimen@ii .8575\dimen@ \or + \dimen@i .6247\dimen@ \dimen@ii .7801\dimen@ \fi \or + \ifcase\&yarg % case 6 + \or % case 0,2,3,4,6 wrong + \dimen@i .1645\dimen@ \dimen@ii .9864\dimen@ \or\or\or\or + \dimen@i .6402\dimen@ \dimen@ii .7682\dimen@ \fi \fi + \if&negarg \&tempdima\dimen@i \dimen@i\dimen@ii \dimen@ii\&tempdima\fi + #3\dimen@i\relax #4\dimen@ii\relax }% +\catcode`\&=4 % Back to alignment tab +}% +\catcode`& = 4 +\toks2 = {% +\catcode`\&=4 % Back to alignment tab +\def\generalhmap{\futurelet\next\@generalhmap}% +\def\@generalhmap{\ifx\next^ \let\temp\generalhm@rph\else + \ifx\next_ \let\temp\generalhm@rph\else \let\temp\m@kehmap\fi\fi \temp}% +\def\generalhm@rph#1#2{\ifx#1^ + \toks@=\expandafter{\the\toks@#1{\rtm@rphtrue\@shiftmorph{#2}}}\else + \toks@=\expandafter{\the\toks@#1{\rtm@rphfalse\@shiftmorph{#2}}}\fi + \generalhmap}% +\def\m@kehmap{\mathrel{\smash@@{\the\toks@}}}% +\def\mapright{\toks@={\mathop{\vcenter{\smash@@{\drawrightarrow}}}\limits}% + \generalhmap}% +\def\mapleft{\toks@={\mathop{\vcenter{\smash@@{\drawleftarrow}}}\limits}% + \generalhmap}% +\def\bimapright{\toks@={\mathop{\vcenter{\smash@@{\drawbirightarrow}}}\limits}% + \generalhmap}% +\def\bimapleft{\toks@={\mathop{\vcenter{\smash@@{\drawbileftarrow}}}\limits}% + \generalhmap}% +\def\adjmapright{\toks@={\mathop{\vcenter{\smash@@{\drawadjrightarrow}}}\limits}% + \generalhmap}% +\def\adjmapleft{\toks@={\mathop{\vcenter{\smash@@{\drawadjleftarrow}}}\limits}% + \generalhmap}% +\def\hline{\toks@={\mathop{\vcenter{\smash@@{\drawhline}}}\limits}% + \generalhmap}% +\def\bihline{\toks@={\mathop{\vcenter{\smash@@{\drawbihline}}}\limits}% + \generalhmap}% +\def\drawrightarrow{\hbox{\drawvector(1,0){\harrowlength}}}% +\def\drawleftarrow{\hbox{\drawvector(-1,0){\harrowlength}}}% +\def\drawbirightarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(1,0){\harrowlength}}}}% +\def\drawbileftarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(-1,0){\harrowlength}}}}% +\def\drawadjrightarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(1,0){\harrowlength}}}}% +\def\drawadjleftarrow{\hbox{\raise.5\channelwidth + \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawvector(-1,0){\harrowlength}}}}% +\def\drawhline{\hbox{\drawline(1,0){\harrowlength}}}% +\def\drawbihline{\hbox{\raise.5\channelwidth + \hbox{\drawline(1,0){\harrowlength}}\lower.5\channelwidth + \llap{\drawline(1,0){\harrowlength}}}}% +\def\generalvmap{\futurelet\next\@generalvmap}% +\def\@generalvmap{\ifx\next\lft \let\temp\generalvm@rph\else + \ifx\next\rt \let\temp\generalvm@rph\else \let\temp\m@kevmap\fi\fi \temp}% +\toksdef\toks@@=1 +\def\generalvm@rph#1#2{\ifx#1\rt % append + \toks@=\expandafter{\the\toks@ + \rlap{$\vcenter{\rtm@rphtrue\@shiftmorph{#2}}$}}\else % prepend + \toks@@={\llap{$\vcenter{\rtm@rphfalse\@shiftmorph{#2}}$}}% + \toks@=\expandafter\expandafter\expandafter{\expandafter\the\expandafter + \toks@@ \the\toks@}\fi \generalvmap}% +\def\m@kevmap{\the\toks@}% +\def\mapdown{\toks@={\vcenter{\drawdownarrow}}\generalvmap}% +\def\mapup{\toks@={\vcenter{\drawuparrow}}\generalvmap}% +\def\bimapdown{\toks@={\vcenter{\drawbidownarrow}}\generalvmap}% +\def\bimapup{\toks@={\vcenter{\drawbiuparrow}}\generalvmap}% +\def\adjmapdown{\toks@={\vcenter{\drawadjdownarrow}}\generalvmap}% +\def\adjmapup{\toks@={\vcenter{\drawadjuparrow}}\generalvmap}% +\def\vline{\toks@={\vcenter{\drawvline}}\generalvmap}% +\def\bivline{\toks@={\vcenter{\drawbivline}}\generalvmap}% +\def\drawdownarrow{\hbox to5pt{\hss\drawvector(0,-1){\varrowlength}\hss}}% +\def\drawuparrow{\hbox to5pt{\hss\drawvector(0,1){\varrowlength}\hss}}% +\def\drawbidownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}% + \hskip\channelwidth\hbox{\drawvector(0,-1){\varrowlength}}\hss}}% +\def\drawbiuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}% + \hskip\channelwidth\hbox{\drawvector(0,1){\varrowlength}}\hss}}% +\def\drawadjdownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}% + \hskip\channelwidth\lower\varrowlength + \hbox{\drawvector(0,1){\varrowlength}}\hss}}% +\def\drawadjuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}% + \hskip\channelwidth\raise\varrowlength + \hbox{\drawvector(0,-1){\varrowlength}}\hss}}% +\def\drawvline{\hbox to5pt{\hss\drawline(0,1){\varrowlength}\hss}}% +\def\drawbivline{\hbox to5pt{\hss\hbox{\drawline(0,1){\varrowlength}}% + \hskip\channelwidth\hbox{\drawline(0,1){\varrowlength}}\hss}}% +\def\commdiag#1{\null\, + \vcenter{\commdiagbaselines + \m@th\ialign{\hfil$##$\hfil&&\hfil$\mkern4mu ##$\hfil\crcr + \mathstrut\crcr\noalign{\kern-\baselineskip} + #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}% +\def\commdiagbaselines{\baselineskip15pt \lineskip3pt \lineskiplimit3pt }% +\def\gridcommdiag#1{\null\, + \vcenter{\offinterlineskip + \m@th\ialign{&\vbox to\vgrid{\vss + \hbox to\hgrid{\hss\smash@@{$##$}\hss}}\crcr + \mathstrut\crcr\noalign{\kern-\vgrid} + #1\crcr\mathstrut\crcr\noalign{\kern-.5\vgrid}}}\,}% +\newdimen\harrowlength \harrowlength=60pt +\newdimen\varrowlength \varrowlength=.618\harrowlength +\newdimen\sarrowlength \sarrowlength=\harrowlength +\newdimen\hmorphposn \hmorphposn=\z@ +\newdimen\vmorphposn \vmorphposn=\z@ +\newdimen\morphdist \morphdist=4pt +\dimendef\@hmorphdflt 0 % These two dimensions are +\dimendef\@vmorphdflt 2 % defined by \getm@rphposn +\newdimen\hmorphposnrt \hmorphposnrt=\z@ +\newdimen\hmorphposnlft \hmorphposnlft=\z@ +\newdimen\vmorphposnrt \vmorphposnrt=\z@ +\newdimen\vmorphposnlft \vmorphposnlft=\z@ +\let\hmorphposnup=\hmorphposnrt +\let\hmorphposndn=\hmorphposnlft +\let\vmorphposnup=\vmorphposnrt +\let\vmorphposndn=\vmorphposnlft +\newdimen\hgrid \hgrid=15pt +\newdimen\vgrid \vgrid=15pt +\newdimen\hchannel \hchannel=0pt +\newdimen\vchannel \vchannel=0pt +\newdimen\channelwidth \channelwidth=3pt +\dimendef\@hchannel 0 % Defined via the +\dimendef\@vchannel 2 % macro \getch@nnel +\catcode`& = \@oldandcatcode +\catcode`@ = \@oldatcatcode +}% +\let\newif = \@plainnewif +\let\newdimen = \@plainnewdimen +\ifx\noarrow\@undefined \the\toks0 \the\toks2 \fi +\catcode`& = \@eplainoldandcode +\def\environment#1{% + \ifx\@groupname\@undefined\else + \errhelp = \@unnamedendgrouphelp + \errmessage{`\@groupname' was not closed by \string\endenvironment}% + \fi + \edef\@groupname{#1}% + \begingroup + \let\@groupname = \@undefined +}% +\def\endenvironment#1{% + \endgroup + \edef\@thearg{#1}% + \ifx\@groupname\@thearg + \else + \ifx\@groupname\@undefined + \errhelp = \@isolatedendenvironmenthelp + \errmessage{Isolated \string\endenvironment\space for `#1'}% + \else + \errhelp = \@mismatchedenvironmenthelp + \errmessage{Environment `#1' ended, but `\@groupname' started}% + \endgroup % Probably a typo in the names. + \fi + \fi + \let\@groupname = \@undefined +}% +\newhelp\@unnamedendgrouphelp{Most likely, you just forgot an^^J% + \string\endenvironment. Maybe you should try inserting another^^J% + \string\endgroup to recover.}% +\newhelp\@isolatedendenvironmenthelp{You ended an environment X, but^^J% + no \string\environment{X} to start it is anywhere in sight.^^J% + You might also be at an \string\endenvironment\space that would match^^J% + a \string\begingroup, i.e., you forgot an \string\endgroup.}% +\newhelp\@mismatchedenvironmenthelp{You started an environment named X, but^^J% + you ended one named Y. Maybe you made a typo in one^^J% + or the other of the names?}% +\newif\ifenvironment +\def\checkenv{\ifenvironment \errhelp = \@interwovenenvhelp + \errmessage{Interwoven environments}% + \egroup \fi +}% +\newhelp\@interwovenenvhelp{Perhaps you forgot to end the previous^^J% + environment? I'm finishing off the current group,^^J% + hoping that will fix it.}% +\newtoks\previouseverydisplay +\let\@leftleftfill\relax % as it was +\newdimen\leftdisplayindent \leftdisplayindent=\parindent +\newif\if@leftdisplays +\def\leftdisplays{% + \if@leftdisplays\else + \previouseverydisplay = \everydisplay + \everydisplay = {\the\previouseverydisplay \leftdisplaysetup}% + \let\@save@maybedisableeqno = \@maybedisableeqno + \let\@saveeqno = \eqno + \let\@saveleqno = \leqno + \let\@saveeqalignno = \eqalignno + \let\@saveleqalignno = \leqalignno + \let\@maybedisableeqno = \relax + \def\eqno{\hfill\textstyle\enspace}% + \def\leqno{% + \hfill + \hbox to0pt\bgroup + \kern-\displaywidth + \kern-\leftdisplayindent % I'll use just \leftdisplayindent + $\aftergroup\@leftleqnoend % inserted after ending $ + }% + \@redefinealignmentdisplays + \@leftdisplaystrue + \fi +}% +\newbox\@lignbox +\newdimen\disprevdepth +\def\centereddisplays{% + \if@leftdisplays + \everydisplay = \previouseverydisplay + \let\@maybedisableeqno = \@save@maybedisableeqno + \let\eqno = \@saveeqno + \let\leqno = \@saveleqno + \let\eqalignno = \@saveeqalignno + \let\leqalignno = \@saveleqalignno + \@leftdisplaysfalse + \fi +}% +\def\leftdisplaysetup{% + \dimen@ = \leftdisplayindent + \advance\dimen@ by \leftskip + \advance\displayindent by \dimen@ + \advance\displaywidth by -\dimen@ + \halign\bgroup##\cr \noalign\bgroup + \disprevdepth = \prevdepth + \setbox\z@ = \hbox to\displaywidth\bgroup + $\displaystyle + \aftergroup\@lefteqend % inserted after ending $ +} +\def\@lefteqend{% gets inserted between the ending $$ + \hfil\egroup% end box 0 + \@putdisplay} +\def\@leftleqnoend{\hss \egroup $}% end the \hbox to 0pt for \leqno, restore $ +\def\@putdisplay{% + \ifvoid\@lignbox % Ordinary display; use it. + \moveright\displayindent\box\z@ + \else % alignment display; unwrap alignment + \prevdepth = \dp\@lignbox % affects the skip *below* + \unvbox\@lignbox + \fi + \egroup\egroup % end \noalign, end outer \halign + $% restore first $ of trailing $$ +} +\def\@redefinealignmentdisplays{% + \def\displaylines##1{ + \global\setbox\@lignbox\vbox{% + \prevdepth = \disprevdepth + \displ@y + \tabskip\displayindent + \halign{\hbox to\displaywidth + {$\@lign\displaystyle####\hfil$\hfil}\crcr + ##1\crcr}}}% + \def\eqalignno##1{% + \def\eqno{&}% + \def\leqno{&}% + \global\setbox\@lignbox\vbox{% + \prevdepth = \disprevdepth + \displ@y + \advance\displaywidth by \displayindent + \tabskip\displayindent + \halign to\displaywidth{% + \hfil $\@lign\displaystyle{####}$\@leftleftfill\tabskip\z@skip + &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering + &\llap{$\@lign####$}\tabskip\z@skip\crcr + ##1\crcr}}}% + \def\leqalignno##1{% + \def\eqno{&}% + \def\leqno{&}% + \global\setbox\@lignbox\vbox{% + \prevdepth = \disprevdepth + \displ@y + \advance\displaywidth by \displayindent + \tabskip\displayindent + \halign to\displaywidth{% + \hfil $\@lign\displaystyle{####}$\@leftleftfill\tabskip\z@skip + &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering + &\kern-\displaywidth + \rlap{\kern\displayindent \kern-\leftdisplayindent$\@lign####$}% + \tabskip\displaywidth\crcr + ##1\crcr}}}% +}% +\let\@primitivenoalign = \noalign +\newtoks\@everynoalign +\def\@lefteqalignonoalign#1{% + \@primitivenoalign{% + \advance\leftskip by -\parindent + \advance\leftskip by -\leftdisplayindent + \parskip = 0pt + \parindent = 0pt + \the\@everynoalign + #1% + }% +}% +\def\monthname{% + \ifcase\month + \or Jan\or Feb\or Mar\or Apr\or May\or Jun% + \or Jul\or Aug\or Sep\or Oct\or Nov\or Dec% + \fi +}% +\def\fullmonthname{% + \ifcase\month + \or January\or February\or March\or April\or May\or June% + \or July\or August\or September\or October\or November\or December% + \fi +}% +\def\timestring{\begingroup + \count0 = \time + \divide\count0 by 60 + \count2 = \count0 % The hour, from zero to 23. + \count4 = \time + \multiply\count0 by 60 + \advance\count4 by -\count0 % The minute, from zero to 59. + \ifnum\count4<10 + \toks1 = {0}% + \else + \toks1 = {}% + \fi + \ifnum\count2<12 + \toks0 = {a.m.}% + \else + \toks0 = {p.m.}% + \advance\count2 by -12 + \fi + \ifnum\count2=0 + \count2 = 12 + \fi + \number\count2:\the\toks1 \number\count4 \thinspace \the\toks0 +\endgroup}% +\def\timestamp{\number\day\space\monthname\space\number\year\quad\timestring}% +\def\today{\the\day\ \fullmonthname\ \the\year}% +\newskip\abovelistskipamount \abovelistskipamount = .5\baselineskip + \newcount\abovelistpenalty \abovelistpenalty = 10000 + \def\abovelistskip{\vpenalty\abovelistpenalty \vskip\abovelistskipamount}% +\newskip\interitemskipamount \interitemskipamount = 0pt + \newcount\belowlistpenalty \belowlistpenalty = -50 + \def\belowlistskip{\vpenalty\belowlistpenalty \vskip\belowlistskipamount}% +\newskip\belowlistskipamount \belowlistskipamount = .5\baselineskip + \newcount\interitempenalty \interitempenalty = 0 + \def\interitemskip{\vpenalty\interitempenalty \vskip\interitemskipamount}% +\newdimen\listleftindent \listleftindent = 0pt +\newdimen\listrightindent \listrightindent = 0pt +\let\listmarkerspace = \enspace +\newtoks\everylist +\def\listcompact{\interitemskipamount = 0pt \relax}% +\newdimen\@listindent +\def\beginlist{% + \abovelistskip + \@listindent = \parindent + \advance\@listindent by \listleftindent + \advance\leftskip by \@listindent + \advance\rightskip by \listrightindent + \itemnumber = 1 + \the\everylist +}% +\def\li{\@getoptionalarg\@finli}% +\def\@finli{% + \let\@lioptarg\@optionalarg + \ifx\@lioptarg\empty \else + \begingroup + \@@hldestoff + \expandafter\writeitemxref\expandafter{\@lioptarg}% + \endgroup + \fi + \ifnum\itemnumber=1 \else \interitemskip \fi + \begingroup + \ifx\@lioptarg\empty \else + \toks@ = \expandafter{\@lioptarg}% + \let\li@nohldest@marker\marker + \edef\marker{\noexpand\hldest@impl{li}{\the\toks@}\noexpand\li@nohldest@marker}% + \fi + \printitem + \endgroup + \advance\itemnumber by 1 + \advance\itemletter by 1 + \advance\itemromannumeral by 1 + \ignorespaces +}% +\def\writeitemxref#1{\definexref{#1}\marker{item}}% +\def\printitem{% + \par + \nobreak + \vskip-\parskip + \noindent + \printmarker\marker +}% +\def\printmarker#1{\llap{\marker \enspace}}% +\def\endlist{\belowlistskip}% +\newcount\numberedlistdepth +\newcount\itemnumber +\newcount\itemletter +\newcount\itemromannumeral +\def\numberedmarker{% + \ifcase\numberedlistdepth + (impossible)% + \or \printitemnumber + \or \printitemletter + \or \printitemromannumeral + \else *% + \fi +}% +\def\printitemnumber{\number\itemnumber}% +\def\printitemletter{\char\the\itemletter}% +\def\printitemromannumeral{\romannumeral\itemromannumeral}% +\def\numberedprintmarker#1{\llap{#1) \listmarkerspace}}% +\def\numberedlist{\environment{@numbered-list}% + \advance\numberedlistdepth by 1 + \itemletter = `a + \itemromannumeral = 1 + \beginlist + \let\marker = \numberedmarker + \let\printmarker = \numberedprintmarker +}% +\def\endnumberedlist{% + \par + \endenvironment{@numbered-list}% + \endlist +}% +\let\orderedlist = \numberedlist +\let\endorderedlist = \endnumberedlist +\newcount\unorderedlistdepth +\def\unorderedmarker{% + \ifcase\unorderedlistdepth + (impossible)% + \or \blackbox + \or ---% + \else *% + \fi +}% +\def\unorderedprintmarker#1{\llap{#1\listmarkerspace}}% +\def\unorderedlist{\environment{@unordered-list}% + \advance\unorderedlistdepth by 1 + \beginlist + \let\marker = \unorderedmarker + \let\printmarker = \unorderedprintmarker +}% +\def\endunorderedlist{% + \par + \endenvironment{@unordered-list}% + \endlist +}% +\def\listing#1{% + \par \begingroup + \@setuplisting + \setuplistinghook + \input #1 + \endgroup +}% +\let\setuplistinghook = \relax +\def\linenumberedlisting{% + \ifx\lineno\undefined \innernewcount\lineno \fi + \lineno = 0 + \everypar = {\advance\lineno by 1 \printlistinglineno}% +}% +\def\printlistinglineno{\llap{[\the\lineno]\quad}}% +\def\nolastlinelisting{\aftergroup\@removeboxes}% +\def\@removeboxes{% + \setbox0 = \lastbox + \ifvoid0 + \ignorespaces % Ignore spaces after the \obeywhitespace's group. + \else + \expandafter\@removeboxes + \fi +}% +{% + \makeactive\^^L + \let^^L = \relax + \gdef\@setuplisting{% + \uncatcodespecials + \obeywhitespace + \makeactive\` + \makeactive\^^I + \makeactive\^^L + \def^^L{\vfill\break}% + \parskip = 0pt + \listingfont + }% +}% +\def\listingfont{\tt}% +{% + \makeactive\` + \gdef`{\relax\lq}% Defeat ligatures. +}% +{% + \makeactive\^^I + \gdef^^I{\hskip8\fontdimen2\font \relax}% +}% +\def\verbatimescapechar#1{% + \gdef\@makeverbatimescapechar{% + \@makeverbatimdoubleescape #1% + \catcode`#1 = 0 + }% +}% +\def\@makeverbatimdoubleescape#1{% + \catcode`#1 = \other + \begingroup + \lccode`\* = `#1% + \lowercase{\endgroup \ece\def*{*}}% +}% +\verbatimescapechar\| % initially escapechar is | +\def\verbatim{\begingroup + \uncatcodespecials + \makeactive\` % make space character a single space, not stretchable + \@makeverbatimescapechar + \tt\obeywhitespace} +\let\endverbatim = \endgroup +\def\definecontentsfile#1{% + \ece\innernewwrite{#1file}% + \ece\innernewif{if@#1fileopened}% + \ece\let{#1filebasename} = \jobname + \ece\def{open#1file}{\opencontentsfile{#1}}% + \ece\def{write#1entry}{\writecontentsentry{#1}}% + \ece\def{writenumbered#1entry}{\writenumberedcontentsentry{#1}}% + \ece\def{writenumbered#1line}{\writenumberedcontentsline{#1}}% + \ece\innernewif{ifrewrite#1file} \csname rewrite#1filetrue\endcsname + \ece\def{read#1file}{\readcontentsfile{#1}}% +}% +\definecontentsfile{toc}% +\def\opencontentsfile#1{% + \csname if@#1fileopened\endcsname \else + \ece{\immediate\openout}{#1file} = \csname #1filebasename\endcsname.#1 + \ece\global{@#1fileopenedtrue}% + \fi +}% +\def\writecontentsentry#1#2#3{\writenumberedcontentsentry{#1}{#2}{#3}{}}% +\def\writenumberedcontentsentry#1#2#3#4{% + \csname ifrewrite#1file\endcsname + \writenumberedcontents@cmdname{#1}{#2}% + \def\temp{#3}% the text + \toks2 = \expandafter{#4}% + \edef\cs{\the\toks2}% + \edef\@wr{% + \write\csname #1file\endcsname{% + \the\toks0 % the \toc...entry control sequence + {\sanitize\temp}% the text + \ifx\empty\cs\else {\sanitize\cs}\fi % a secondary number, or nothing + {\noexpand\folio}% the page number + }% + }% + \@wr + \fi + \ignorespaces +}% +\def\writenumberedcontentsline#1#2#3#4{% + \csname ifrewrite#1file\endcsname + \writenumberedcontents@cmdname{#1}{#2}% + \def\temp{#4}% the text + \toks2 = \expandafter{#3}% + \edef\cs{\the\toks2}% + \edef\@wr{% + \write\csname #1file\endcsname{% + \the\toks0 % the \toc...entry control sequence + \ifx\empty\cs\else {\sanitize\cs}\fi % a secondary number, or nothing + {\sanitize\temp}% the text + {\noexpand\folio}% the page number + }% + }% + \@wr + \fi + \ignorespaces +}% +\def\writenumberedcontents@cmdname#1#2{% + \csname open#1file\endcsname + \edef\temp{#2}% Expand PART fully and see if this produced an integer. + \expandafter\if\expandafter\isinteger\expandafter{\temp}% + \toks0 = {\expandafter\noexpand \csname #1entry\endcsname}% + \edef\temp{\the\toks0{\temp}}% + \toks0 = \expandafter{\temp}% + \else + \toks0 = {\expandafter\noexpand \csname #1#2entry\endcsname}% + \fi +}% +\def\readcontentsfile#1{% + \edef\temp{% + \noexpand\testfileexistence[\csname #1filebasename\endcsname]{#1}% + }\temp + \if@fileexists + \input \csname #1filebasename\endcsname.#1\relax + \fi +}% +\def\tocchapterentry#1#2{\line{\bf #1 \dotfill\ #2}}% +\def\tocsectionentry#1#2{\line{\quad\sl #1 \dotfill\ \rm #2}}% +\def\tocsubsectionentry#1#2{\line{\qquad\rm #1 \dotfill\ #2}}% +\def\tocentry#1#2#3{\line{\rm\hskip#1em #2 \dotfill\ #3}}% +\let\ifxrefwarning = \iftrue +\def\xrefwarningtrue{\@citewarningtrue \let\ifxrefwarning = \iftrue}% +\def\xrefwarningfalse{\@citewarningfalse \let\ifxrefwarning = \iffalse}% +\begingroup + \catcode`\_ = 8 + \gdef\xrlabel#1{#1_x}% +\endgroup +\def\xrdef#1{% + \begingroup + \hldest@impl{xrdef}{#1}% + \begingroup + \@@hldestoff + \definexref{#1}{\noexpand\folio}{page}% + \endgroup + \endgroup + \ignorespaces +}% +\def\definexref#1#2#3{% + \hldest@impl{definexref}{#1}% + \edef\temp{#1}% + \readauxfile + \edef\@wr{\noexpand\writeaux{\string\@definelabel{\temp}{#2}{#3}}}% + \@wr + \ignorespaces +}% +\def\@definelabel#1{% #2 and #3 will be read later. + \begingroup % Will be ended in \@definelabel@nocheck. + \expandafter\ifx\csname\xrlabel{#1}\endcsname \relax + \expandafter\@definelabel@nocheck + \else + \expandafter\@definelabel@warn + \fi + {#1}% +}% +\def\@definelabel@nocheck#1#2#3{% + \expandafter\gdef\csname\xrlabel{#1}\endcsname{#2}% + \setpropertyglobal{\xrlabel{#1}}{class}{#3}% + \endgroup % From \@definelabel. +}% +\def\@definelabel@warn#1#2#3{% + \message{^^J\linenumber Label `#1' multiply defined, + value `#2' of class `#3' overwriting value + `\csname\xrlabel{#1}\endcsname' of class + `\getproperty{\xrlabel{#1}}{class}'.}% + \@definelabel@nocheck{#1}{#2}{#3}% +}% +\def\reftie{\penalty\@M \ }% Do not rely on `~' being defined as a tie. +\let\refspace\ +\def\xrefn{\@getoptionalarg\@finxrefn}% +\def\@finxrefn#1{% + \hlstart@impl{ref}{#1}% + \ifx\@optionalarg\empty \else + \let\@xrefnoptarg\@optionalarg + \readauxfile + {\@@hloff\@xrefnoptarg}\reftie + \fi + \plain@xrefn{#1}% + \hlend@impl{ref}% +}% +\def\plain@xrefn#1{% + \readauxfile + \expandafter \ifx\csname\xrlabel{#1}\endcsname\relax + \if@citewarning + \message{\linenumber Undefined label `#1'.}% + \fi + \expandafter\def\csname\xrlabel{#1}\endcsname{% + `{\tt + \escapechar = -1 + \expandafter\string\csname#1\endcsname + }'% + }% + \fi + \csname\xrlabel{#1}\endcsname % Always produce something. +}% +\let\refn = \xrefn +\def\xrefpageword{p.\thinspace}% +\def\xref{\@getoptionalarg\@finxref}% +\def\@finxref#1{% + \hlstart@impl{xref}{#1}% + \ifx\@optionalarg\empty \else + {\@@hloff\@optionalarg}\refspace + \fi + \xrefpageword\plain@xrefn{#1}% + \hlend@impl{xref}% +}% +\def\@maybewarnref{% + \ifundefined{amsppt.sty}% + \else + \message{Warning: amsppt.sty and Eplain both define \string\ref. See + the Eplain manual.}% + \let\amsref = \ref + \fi + \let\ref = \eplainref + \ref +} +\let\ref = \@maybewarnref +\def\eplainref{\@getoptionalarg\@fineplainref}% +\def\@fineplainref{\@generalref{1}{}}% +\def\refs{\let\@optionalarg\empty \@generalref{0}s}% +\def\@generalref#1#2#3{% + \let\@generalrefoptarg\@optionalarg + \readauxfile + \ifcase#1 \else \hlstart@impl{ref}{#3}\fi + \edef\@generalref@class{\getproperty{\xrlabel{#3}}{class}}% + \expandafter\ifx\csname \@generalref@class word\endcsname\relax + \ifx\@generalrefoptarg\empty \else {\@@hloff\@generalrefoptarg\reftie}\fi + \else + \begingroup + \@@hloff + \ifx\@generalrefoptarg\empty \else \@generalrefoptarg \refspace \fi + \csname \@generalref@class word\endcsname + #2\reftie + \endgroup + \fi + \ifcase#1 \hlstart@impl{ref}{#3}\fi + \plain@xrefn{#3}% + \hlend@impl{ref}% +}% +\newcount\eqnumber +\newcount\subeqnumber +\def\eqdefn{\@getoptionalarg\@fineqdefn}% +\def\@fineqdefn#1{% + \ifx\@optionalarg\empty + \global\advance\eqnumber by 1 + \def\temp{\eqconstruct{\number\eqnumber}}% + \else + \def\temp{\@optionalarg}% + \fi + \global\subeqnumber = 0 + \gdef\@currenteqlabel{#1}% + \toks0 = \expandafter{\@currenteqlabel}% + \begingroup + \def\eqrefn{\noexpand\plain@xrefn}% + \def\xrefn{\noexpand\plain@xrefn}% + \edef\temp{\noexpand\@eqdefn{\the\toks0}{\temp}}% + \temp + \endgroup +}% +\def\eqsubdefn#1{% + \global\advance\subeqnumber by 1 + \toks0 = {#1}% + \toks2 = \expandafter{\@currenteqlabel}% + \begingroup + \def\eqrefn{\noexpand\plain@xrefn}% + \def\xrefn{\noexpand\plain@xrefn}% + \def\eqsubreftext{\noexpand\eqsubreftext}% + \edef\temp{% + \noexpand\@eqdefn + {\the\toks0}% + {\eqsubreftext{\eqrefn{\the\toks2}}{\the\subeqnumber}}% + }% + \temp + \endgroup +}% +\newcount\phantomeqnumber +\def\phantomeqlabel{PHEQ\the\phantomeqnumber}% +\def\@eqdefn#1#2{% + \ifempty{#1}% + \global\advance\phantomeqnumber by 1 + \edef\hl@eqlabel{\phantomeqlabel}% + \readauxfile + \else + \def\hl@eqlabel{#1}% + {\@@hldestoff \definexref{#1}{#2}{eq}}% + \fi + \hldest@impl{eq}{\hl@eqlabel}% + \begingroup % \@definelabel@nocheck will end this group. + \@definelabel@nocheck{#1}{#2}{eq}% +}% +\def\eqdef{\@getoptionalarg\@fineqdef}% +\def\@fineqdef{% + \toks0 = \expandafter{\@optionalarg}% + \edef\temp{\noexpand\@eqdef{\noexpand\eqdefn[\the\toks0]}}% + \temp +}% +\def\eqsubdef{\@eqdef\eqsubdefn}% +\def\@eqdef#1#2{% + \@maybedisableeqno + \eqnum #1{#2}% Define the label and hyperlink destination. + \let\@optionalarg\empty % \@fineqref will examine \@optionalarg. + {\@@hloff\@fineqref{#2}}% Print the text without a hyperlink. + \@mayberestoreeqno + \ignorespaces +}% +\let\@mayberestoreeqno = \relax +\def\@maybedisableeqno{% + \ifinner + \global\let\eqno = \relax + \global\let\leqno = \relax + \global\let\@mayberestoreeqno = \@restoreeqno + \fi +}% +\let\@primitiveeqno = \eqno +\let\@primitiveleqno = \leqno +\def\@restoreeqno{% + \global\let\eqno = \@primitiveeqno + \global\let\leqno = \@primitiveleqno + \global\let\@mayberestoreeqno = \empty +}% +\def\righteqnumbers{% + \def\eqnum{\eqno}% + \def\eqalignnum{\eqalignno}% +}% +\def\lefteqnumbers{% + \def\eqnum{\leqno}% + \def\eqalignnum{\leqalignno}% +}% +\righteqnumbers +\def\eqrefn{\@getoptionalarg\@fineqrefn}% +\def\@fineqrefn#1{% + \eqref@start{#1}% + \plain@xrefn{#1}% + \hlend@impl{eq}% +}% +\def\eqref{\@getoptionalarg\@fineqref}% +\def\@fineqref#1{% + \eqref@start{#1}% + \eqprint{\plain@xrefn{#1}}% + \hlend@impl{eq}% +}% +\def\eqref@start#1{% + \let\@eqrefoptarg\@optionalarg + \ifempty{#1}% + \hlstart@impl{eq}{\phantomeqlabel}% + \else + \hlstart@impl{eq}{#1}% + \fi + \ifx\@eqrefoptarg\empty \else + {\@@hloff\@eqrefoptarg\reftie}% + \fi +}% +\let\eqconstruct = \identity +\def\eqprint#1{(#1)}% +\def\eqsubreftext#1#2{#1.#2}% +\let\extraidxcmdsuffixes = \empty +\def\defineindex#1{% + \def\@idxprefix{#1}% + \expandafter\innernewif\csname if\@idxprefix dx\endcsname + \csname \@idxprefix dxtrue\endcsname + \for\@idxcmd:=,marked,submarked,name% + \extraidxcmdsuffixes\do + {% + \@defineindexcmd\@idxcmd + }% + \ece\innernewwrite{@#1indexfile}% + \ece\innernewif{if@#1indexfileopened}% +}% +\newif\ifsilentindexentry +\def\@defineindexcmd#1{% + \@defineoneindexcmd{s}{#1}\silentindexentrytrue + \@defineoneindexcmd{}{#1}\silentindexentryfalse +}% +\def\@defineoneindexcmd#1#2#3{% + \toks@ = {#3}% + \edef\temp{% + \def + \expandonce\csname#1\@idxprefix dx#2\endcsname % e.g., \idx or \sidxname. + {\def\noexpand\@idxprefix{\@idxprefix}% define \@idxprefix + \expandonce\csname @@#1idx#2\endcsname + }% + \def + \expandonce\csname @@#1idx#2\endcsname{% e.g., \@@idx + \the\toks@ + \noexpand\@idxgetrange\expandonce\csname @#1idx#2\endcsname + }% + }% + \temp +}% +\let\indexfilebasename = \jobname +\def\@idxwrite#1#2{% + \csname if\@idxprefix dx\endcsname + \@openidxfile + \def\temp{#1}% + \edef\@wr{% + \expandafter\write\csname @\@idxprefix indexfile\endcsname{% + \string\indexentry + {\sanitize\temp}% + {\noexpand#2}% + }% + }% + \@wr + \else + \write-1{}% + \fi + \ifindexproofing + \def\temp{#1}% + \edef\temp{% + \insert\@indexproof{\noexpand\indexproofterm{\sanitize\temp}}% + }% + \temp + \ifhmode\allowhyphens\fi + \fi + \hookrun{afterindexterm}% + \ifsilentindexentry \expandafter\ignorespaces\fi +}% +\def\@openidxfile{% + \csname if@\@idxprefix indexfileopened\endcsname \else + \expandafter\immediate\openout\csname @\@idxprefix indexfile\endcsname = + \indexfilebasename.\@idxprefix dx + \expandafter\global\csname @\@idxprefix indexfileopenedtrue\endcsname + \fi +}% +\newif\ifindexproofing +\newinsert\@indexproof +\dimen\@indexproof = \maxdimen % No limit on number of terms. +\count\@indexproof = 0 \skip\@indexproof = 0pt % They take up no space. +\font\indexprooffont = cmtt8 +\def\indexproofterm#1{\hbox{\strut \indexprooffont #1}}% +\let\@plainmakeheadline = \makeheadline +\def\makeheadline{% + \expandafter\ifx\csname\idxpageanchor{\folio}\endcsname\relax \else + {\@@hldeston \hldest@impl{idx}{\hlidxpagelabel{\folio}}}% + \fi + \indexproofunbox + \@plainmakeheadline +}% +\def\indexsetmargins{% + \ifx\undefined\outsidemargin + \dimen@ = 1truein + \advance\dimen@ by \hoffset + \edef\outsidemargin{\the\dimen@}% + \let\insidemargin = \outsidemargin + \fi +}% +\def\indexproofunbox{% + \ifvoid\@indexproof\else + \indexsetmargins + \rlap{% + \kern\hsize + \ifodd\pageno \kern\outsidemargin \else \kern\insidemargin \fi + \vbox to 0pt{\unvbox\@indexproof\vss}% + }\nointerlineskip + \fi +}% +\def\idxrangebeginword{begin}% +\def\idxbeginrangemark{(}% the corresponding magic char to go in the idx file +\def\idxrangeendword{end}% +\def\idxendrangemark{)}% +\def\idxseecmdword{see}% +\def\idxseealsocmdword{seealso}% +\newif\if@idxsee +\newif\if@hlidxencap +\let\@idxseenterm = \relax +\def\idxpagemarkupcmdword{pagemarkup}% +\let\@idxpagemarkup = \relax +\def\@idxgetrange#1{% + \let\@idxrangestr = \empty + \let\@afteridxgetrange = #1% + \begingroup + \catcode\idxargopen=1 + \@getoptionalarg\@finidxgetopt +}% +\def\@finidxgetopt{% + \global\let\@idxgetrange@arg\@optionalarg + \endgroup + \@hlidxencaptrue + \for\@idxarg:=\@idxgetrange@arg\do{% + \expandafter\@idxcheckpagemarkup\@idxarg=,% + \ifx\@idxarg\idxrangebeginword + \def\@idxrangestr{\idxencapoperator\idxbeginrangemark}% + \else + \ifx\@idxarg\idxrangeendword + \def\@idxrangestr{\idxencapoperator\idxendrangemark}% + \@hlidxencapfalse + \else + \ifx\@idxarg\idxseecmdword + \def\@idxpagemarkup{indexsee}% + \@idxseetrue + \@hlidxencapfalse + \else + \ifx\@idxarg\idxseealsocmdword + \def\@idxpagemarkup{indexseealso}% + \@idxseetrue + \@hlidxencapfalse + \else + \ifx\@idxpagemarkup\relax + \errmessage{Unrecognized index option `\@idxarg'}% + \fi + \fi + \fi + \fi + \fi + }% + \ifnum\hldest@place@idx < 0 \else + \if@hlidxencap + \ifx\@idxpagemarkup\relax + \let\@idxpagemarkup\empty + \fi + \ifcase\hldest@place@idx \relax + \edef\@idxpagemarkup{hlidxpage{\@idxpagemarkup}}% + \definepageanchor{\noexpand\folio}% + \else + \global\advance\hlidxlabelnumber by 1 + \edef\@idxpagemarkup{hlidx{\hlidxlabel}{\@idxpagemarkup}}% + \hldest@impl{idx}{\hlidxlabel}% + \fi + \fi + \fi + \@afteridxgetrange +}% +\def\@idxcheckpagemarkup#1=#2,{% + \def\temp{#1}% + \ifx\temp\idxpagemarkupcmdword + \if ,#2, % If #2 is empty, complain. + \errmessage{Missing markup command to `pagemarkup'}% + \else + \def\temp##1={##1}% + \edef\@idxpagemarkup{\temp\string#2}% + \fi + \fi +}% +\def\hldest@place@idx{-1}% +\begingroup + \catcode`\_ = 8 + \gdef\idxpageanchor#1{#1_p}% +\endgroup +\def\definepageanchor#1{% + \readauxfile + \edef\@wr{\noexpand\writeaux{\string\@definepageanchor{#1}}}% + \@wr + \ignorespaces +}% +\def\@definepageanchor#1{% + \expandafter\gdef\csname\idxpageanchor{#1}\endcsname{}% +}% +\newcount\hlidxlabelnumber +\def\hlidxlabel{IDX\the\hlidxlabelnumber}% +\def\hlidxpagelabel#1{IDXPG#1}% +\def\hlidx#1#2#3{% + \ifempty{#2}% + \let\@idxpageencap\relax + \else + \expandafter\let\expandafter\@idxpageencap\csname #2\endcsname + \fi + \hlstart@impl{idx}{#1}% + \@idxpageencap{#3}% + \hlend@impl{idx}% +}% +\def\hlidxpage#1#2{% + \@hlidxgetpages{#2}% + \ifempty{#1}% + \let\@idxpageencap\relax + \else + \expandafter\let\expandafter\@idxpageencap\csname #1\endcsname + \fi + \hlstart@impl{idx}{\hlidxpagelabel{\@idxpageiref}}% + \expandafter\@idxpageencap\expandafter{\@idxpagei}% + \hlend@impl{idx}% + \ifx\@idxpageii\empty \else + \@idxpagesep + \hlstart@impl{idx}{\hlidxpagelabel{\@idxpageiiref}}% + \expandafter\@idxpageencap\expandafter{\@idxpageii}% + \hlend@impl{idx}% + \fi +}% +\def\@hlidxgetpages#1{% + \idxparselist{#1}% + \ifx\idxpagei\empty + \idxparserange{#1}% + \ifx\idxpagei\empty + \def\@idxpageiref{#1}% Label for \hlstart. + \else + \let\@idxpageiref\idxpagei % Label for \hlstart. + \fi + \def\@idxpagei{#1}% + \let\@idxpageii\empty + \else + \let\@idxpagei\idxpagei + \let\@idxpageii\idxpageii + \let\@idxpageiref\idxpagei % Label for \hlstart. + \let\@idxpageiiref\idxpageii % Label for \hlstart. + \let\@idxpagesep\idxpagelistdelimiter + \fi +}% +\def\setidxpagelistdelimiter#1{% + \gdef\idxpagelistdelimiter{#1}% + \gdef\@removepagelistdelimiter##1#1{##1}% + \gdef\@idxparselist##1#1##2\@@{% + \ifempty{##2}% + \let\idxpagei\empty + \else + \def\idxpagei{##1}% + \edef\idxpageii{\@removepagelistdelimiter##2}% + \fi + }% + \gdef\idxparselist##1{\@idxparselist##1#1\@@}% +}% +\def\setidxpagerangedelimiter#1{% + \gdef\idxpagerangedelimiter{#1}% + \gdef\@removepagerangedelimiter##1#1{##1}% + \gdef\@idxparserange##1#1##2\@@{% + \ifempty{##2}% + \let\idxpagei\empty + \else + \def\idxpagei{##1}% + \edef\idxpageii{\@removepagerangedelimiter##2}% + \fi + }% + \gdef\idxparserange##1{\@idxparserange##1#1\@@}% +}% +\setidxpagelistdelimiter{, }% +\setidxpagerangedelimiter{--}% +\def\idxsubentryseparator{!}% +\def\idxencapoperator{|}% +\def\idxmaxpagenum{99999}% +\newtoks\@idxmaintoks +\newtoks\@idxsubtoks +\def\@idxtokscollect{% + \edef\temp{\the\@idxsubtoks}% + \edef\@indexentry{% + \the\@idxmaintoks + \ifx\temp\empty\else \idxsubentryseparator\the\@idxsubtoks \fi + \@idxrangestr + }% + \if@idxsee + \@idxseefalse % Reset so the next term won't be a `see'. + \edef\temp{\noexpand\idx@getverbatimarg + {\noexpand\@finidxtokscollect{\idxmaxpagenum}}}% + \else + \def\temp{\@finfinidxtokscollect\folio}% + \fi + \temp +}% +\def\@finidxtokscollect#1#2{% + \def\@idxseenterm{#2}% + \@finfinidxtokscollect{#1}% +}% +\def\@finfinidxtokscollect#1{% + \ifx\@idxpagemarkup\relax \else + \toks@ = \expandafter{\@indexentry}% + \edef\@indexentry{% + \the\toks@ + \ifx\@idxrangestr\empty \idxencapoperator \fi + \@idxpagemarkup + }% + \let\@idxpagemarkup = \relax + \fi + \ifx\@idxseenterm\relax \else + \toks@ = \expandafter{\@indexentry}% + \edef\@indexentry{\the\toks@{\sanitize\@idxseenterm}}% + \let\@idxseenterm = \relax + \fi + \expandafter\@idxwrite\expandafter{\@indexentry}{#1}% +}% +\def\@idxcollect#1#2{% + \@idxmaintoks = {#1}% + \@idxsubtoks = {#2}% + \@idxtokscollect +}% +\def\idxargopen{`\{}% +\def\idxargclose{`\}}% +\def\idx@getverbatimarg#1{% + \def\idx@getverbatimarg@cmd{#1}% Save the command, allowing it to be + \begingroup + \uncatcodespecials + \catcode\idxargopen=1 + \catcode\idxargclose=2 + \catcode`\ =10 % Swallow multiple consequent spaces. + \catcode`\^^I=10 % Just in case, to avoid dependence on + \catcode`\^^M=5 % current meanings of tabs and newlines. + \idx@fingetverbatimarg +}% +\def\idx@fingetverbatimarg#1{\endgroup\idx@getverbatimarg@cmd{#1}}% +\def\idx@getverboptarg#1{% + \def\idx@optionaltemp{#1}% Save the command, allowing it to be more + \let\idx@optionalnext = \relax + \begingroup + \if@idxsee \catcode\idxargopen=1 \fi + \@futurenonspacelet\idx@optionalnext\idx@bracketcheck +}% +\def\idx@bracketcheck{% + \ifx [\idx@optionalnext + \endgroup % Cancel \catcode\idxargopen=1. + \expandafter\idx@finbracketcheck + \else + \endgroup % Cancel \catcode\idxargopen=1. + \let\@optionalarg = \empty + \expandafter\idx@optionaltemp + \fi +}% +\def\idx@finbracketcheck{% + \begingroup + \uncatcodespecials + \catcode`\ =10 % Swallow multiple consequent spaces. + \catcode`\^^I=10 % Just in case, to avoid dependence on + \catcode`\^^M=5 % current meanings of tabs and newlines. + \idx@@getoptionalarg +}% +\def\idx@@getoptionalarg[#1]{% + \endgroup + \def\@optionalarg{#1}% + \idx@optionaltemp +}% +{\catcode`\&=0 +\gdef\idx@scanterm#1{% + \edef\idx@scanterm@nl@catcode{\the\catcode`\^^M\relax}% + \catcode`\^^M=5 + \scantokens{#1&endinput}% + \catcode`\^^M=\idx@scanterm@nl@catcode +}}% +\def\@idx{\idx@getverbatimarg\@finidx}% +\def\@finidx#1{% + \idx@scanterm{#1}% Produce TERM as output. + \@idxcollect{#1}{}% +}% +\def\@sidx{\idx@getverbatimarg\@finsidx}% +\def\@finsidx#1{\@idxmaintoks = {#1}\idx@getverboptarg\@finfinsidx}% +\def\@finfinsidx{% + \@idxsubtoks = \expandafter{\@optionalarg}% + \@idxtokscollect +}% +\def\idxsortkeysep{@}% This `@' is catcode 11, but it doesn't matter. +\def\@idxconstructmarked#1#2#3{% + \toks@ = {#2}% The control sequence. + \toks2 = {#3}% The term. + \edef\temp{\the\toks2 \idxsortkeysep \the\toks@{\the\toks2}}% + #1 = \expandafter{\temp}% +}% +\def\@idxmarked#1{\idx@getverbatimarg{\@finidxmarked{#1}}}% +\def\@finidxmarked#1#2{% + \idx@scanterm{#1{#2}}% Produce \CS{TERM} as output. + \@idxconstructmarked\@idxmaintoks{#1}{#2}% + \@idxsubtoks = {}% + \@idxtokscollect +}% +\def\@sidxmarked#1{\idx@getverbatimarg{\@finsidxmarked{#1}}}% +\def\@finsidxmarked#1#2{% + \@idxconstructmarked\toks@{#1}{#2}% + \edef\temp{{\the\toks@}}% + \expandafter\@finsidx\temp +}% +\def\@idxsubmarked{% + \let\sidxsubmarked@print\idxsubmarked@print + \idx@getverbatimarg\@finsidxsubmarked +}% +\def\idxsubmarked@print{\expandafter\idx@scanterm\expandafter}% +\def\@sidxsubmarked{% + \let\sidxsubmarked@print\gobble + \idx@getverbatimarg\@finsidxsubmarked +}% +\def\@finsidxsubmarked#1{\@idxmaintoks = {#1}\@@finsidxsubmarked}% Reads TERM. +\def\@@finsidxsubmarked#1{\idx@getverbatimarg{\@@@finsidxsubmarked{#1}}}% Reads \CS. +\def\@@@finsidxsubmarked#1#2{% Reads {\CS}{SUBTERM}. + \sidxsubmarked@print % Prints for \@idxsubmarked, gobbles for \@sidxsubmarked. + {\the\@idxmaintoks\space #1{#2}}% Maybe produce `TERM \CS{SUBTERM}' as output. + \@idxconstructmarked\@idxsubtoks{#1}{#2}% + \@idxtokscollect +}% +\def\idxnameseparator{, }% as in `Tachikawa, Elizabeth' +\def\@idxcollectname#1#2{% + \def\temp{#1}% + \ifx\temp\empty + \toks@ = {}% + \else + \toks@ = \expandafter{\idxnameseparator #1}% + \fi + \toks2 = {#2}% + \edef\temp{\the\toks2 \the\toks@}% +}% +\def\@idxname{\idx@getverbatimarg\@finidxname}% +\def\@finidxname#1{\idx@getverbatimarg{\@finfinidxname{#1}}}% +\def\@finfinidxname#1#2{% + \idx@scanterm{#1 #2}% Separate the names by a space in the output. + \@idxcollectname{#1}{#2}% + \expandafter\@idxcollect\expandafter{\temp}{}% +}% +\def\@sidxname{\idx@getverbatimarg\@finsidxname}% +\def\@finsidxname#1{\idx@getverbatimarg{\@finfinsidxname{#1}}}% +\def\@finfinsidxname#1#2{% + \@idxcollectname{#1}{#2}% + \expandafter\@finsidx\expandafter{\temp}% +}% +\let\indexfonts = \relax +\def\readindexfile#1{% + \edef\@idxprefix{#1}% + \testfileexistence[\indexfilebasename]{\@idxprefix nd}% + \iffileexists \begingroup + \ifx\begin\undefined + \def\begin##1{\@beginindex}% + \let\end = \@gobble + \fi + \input \indexfilebasename.\@idxprefix nd + \singlecolumn + \endgroup + \else + \message{No index file \indexfilebasename.\@idxprefix nd.}% + \fi +}% +\def\@beginindex{% + \let\item = \@indexitem + \let\subitem = \@indexsubitem + \let\subsubitem = \@indexsubsubitem + \indexfonts + \doublecolumns + \parindent = 0pt + \hookrun{beginindex}% +}% +\let\indexspace = \bigbreak +\let\afterindexterm = \quad +\newskip\aboveindexitemskipamount \aboveindexitemskipamount = 0pt plus2pt +\def\aboveindexitemskip{\vskip\aboveindexitemskipamount}% +\def\@indexitem{\begingroup + \@indexitemsetup + \leftskip = 0pt + \aboveindexitemskip + \penalty-100 % Encourage page breaks before items. + \def\par{\endgraf\endgroup\nobreak}% +}% +\def\@indexsubitem{% + \@indexitemsetup + \leftskip = 1em +}% +\def\@indexsubsubitem{% + \@indexitemsetup + \leftskip = 2em +}% +\def\@indexitemsetup{% + \par + \hangindent = 1em + \raggedright + \hyphenpenalty = 10000 + \hookrun{indexitem}% +}% +\def\seevariant{\it}% +\def\indexseeword{see}% +\def\indexsee{\idx@getverbatimarg\@finindexsee}% +\def\@finindexsee#1#2{{\seevariant \indexseeword\/ }\idx@scanterm{#1}}% +\def\indexseealsowords{see also}% +\def\indexseealso{\idx@getverbatimarg\@finindexseealso}% +\def\@finindexseealso#1#2{{\seevariant \indexseealsowords\/ }\idx@scanterm{#1}}% +\defineindex{i}% +\begingroup + \catcode `\^^M = \active % + \gdef\flushleft{% + \def\@endjustifycmd{\@endflushleft}% + \def\@eoljustifyaction{\null\hfil\break}% + \let\@firstlinejustifyaction = \relax + \@startjustify % + }% + \gdef\flushright{% + \def\@endjustifycmd{\@endflushright}% + \def\@eoljustifyaction{\break\null\hfil}% + \def\@firstlinejustifyaction{\hfil\null}% + \@startjustify % + }% + \gdef\center{% + \def\@endjustifycmd{\@endcenter}% + \def\@eoljustifyaction{\hfil\break\null\hfil}% + \def\@firstlinejustifyaction{\hfil\null}% + \@startjustify % + }% + \gdef\@startjustify{% + \parskip = 0pt + \catcode`\^^M = \active % + \def^^M{\futurelet\next\@finjustifyreturn}% + \def\@eateol##1^^M{% + \def\temp{##1}% + \@firstlinejustifyaction % + \ifx\temp\empty\else \temp^^M\fi % + }% + \expandafter\aftergroup\@endjustifycmd % + \checkenv \environmenttrue % + \par\noindent % + \@eateol % + }% + \gdef\@finjustifyreturn{% + \@eoljustifyaction % + \ifx\next^^M% + \def\par{\endgraf\vskip\blanklineskipamount \global\let\par = \endgraf}% + \@endjustifycmd % + \noindent % + \@firstlinejustifyaction % + \fi % + }% +\endgroup +\def\@endflushleft{\unpenalty{\parfillskip = 0pt plus1fil\par}\ignorespaces}% +\def\@endflushright{% Remove the \hfil\null\break we just put on. + \unskip \setbox0=\lastbox \unpenalty + {\parfillskip = 0pt \par}\ignorespaces +}% +\def\@endcenter{% Remove the \hfil\null\break we just put on. + \unskip \setbox0=\lastbox \unpenalty + {\parfillskip = 0pt plus1fil \par}\ignorespaces +}% +\ifx\@undefined\raggedleft +\innernewskip\raggedleftskip \raggedleftskip=0pt plus2em +\def\raggedleft{\leftskip\raggedleftskip \parindent=0pt + \spaceskip.3333em \xspaceskip.5em \parfillskip0pt \relax} +\fi % \raggedleft undefined +\newcount\abovecolumnspenalty \abovecolumnspenalty = 10000 +\newcount\@linestogo % Lines remaining to process. +\newcount\@linestogoincolumn % Lines remaining in column. +\newcount\@columndepth % Number of lines in a column. +\newdimen\@columnwidth % Width of each column. +\newtoks\crtok \crtok = {\cr}% +\newcount\currentcolumn +\def\makecolumns#1/#2: {\par \begingroup + \@columndepth = #1 + \advance\@columndepth by -1 + \divide \@columndepth by #2 + \advance\@columndepth by 1 + \@linestogoincolumn = \@columndepth + \@linestogo = #1 + \currentcolumn = 1 + \def\@endcolumnactions{% + \ifnum \@linestogo<2 + \the\crtok \egroup \endgroup \par % End \valign and \makecolumns. + \else + \global\advance\@linestogo by -1 + \ifnum\@linestogoincolumn<2 + \global\advance\currentcolumn by 1 + \global\@linestogoincolumn = \@columndepth + \the\crtok + \else + &\global\advance\@linestogoincolumn by -1 + \fi + \fi + }% + \makeactive\^^M + \letreturn \@endcolumnactions + \@columnwidth = \hsize + \advance\@columnwidth by -\parindent + \divide\@columnwidth by #2 + \penalty\abovecolumnspenalty + \noindent % It's not a paragraph (usually). + \valign\bgroup + &\hbox to \@columnwidth{\strut \hsize = \@columnwidth ##\hfil}\cr +}% +\newcount\footnotenumber +\newcount\hlfootlabelnumber +\newdimen\footnotemarkseparation \footnotemarkseparation = .5em +\newskip\interfootnoteskip \interfootnoteskip = 0pt +\newtoks\everyfootnote +\newdimen\footnoterulewidth \footnoterulewidth = 2in +\newdimen\footnoteruleheight \footnoteruleheight = 0.4pt +\newdimen\belowfootnoterulespace \belowfootnoterulespace = 2.6pt +\let\@plainfootnote = \footnote +\let\@plainvfootnote = \vfootnote +\def\hlfootlabel{FOOT\the\hlfootlabelnumber}% +\def\hlfootbacklabel{FOOTB\the\hlfootlabelnumber}% +\def\@eplainfootnote#1{\let\@sf\empty % parameter #2 (the text) is read later + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi + \global\advance\hlfootlabelnumber by 1 + \hlstart@impl{foot}{\hlfootlabel}% + \hldest@impl{footback}{\hlfootbacklabel}% + #1% + \hlend@impl{foot}% + \@sf\vfootnote{#1}% +}% +\let\footnote\@eplainfootnote +\def\vfootnote#1{\insert\footins\bgroup + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \advance\splittopskip by \interfootnoteskip + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip + \everypar = {}% + \parskip = 0pt % because of the vskip + \ifnum\@numcolumns > 1 \hsize = \@normalhsize \fi + \the\everyfootnote + \vskip\interfootnoteskip + \indent\llap{% + \hlstart@impl{footback}{\hlfootbacklabel}% + \hldest@impl{foot}{\hlfootlabel}% + #1% + \hlend@impl{footback}% + \kern\footnotemarkseparation + }% + \footstrut\futurelet\next\fo@t +}% +\def\footnoterule{\dimen@ = \footnoteruleheight + \advance\dimen@ by \belowfootnoterulespace + \kern-\dimen@ + \hrule width\footnoterulewidth height\footnoteruleheight depth0pt + \kern\belowfootnoterulespace + \vskip-\interfootnoteskip +}% +\def\numberedfootnote{% + \global\advance\footnotenumber by 1 + \@eplainfootnote{$^{\number\footnotenumber}$}% +}% +\newdimen\paperheight +\ifnum\mag=1000 + \paperheight = 11in % No magnification (yet). +\else + \paperheight = 11truein % We already have a magnification. +\fi +\def\topmargin{\afterassignment\@finishtopmargin \dimen@}% +\def\@finishtopmargin{% + \dimen2 = \voffset % Remember the old \voffset. + \voffset = \dimen@ \advance\voffset by -1truein + \advance\dimen2 by -\voffset % Compute the change in \voffset. + \advance\vsize by \dimen2 % Change type area accordingly. +}% +\def\advancetopmargin{% + \dimen@ = 0pt \afterassignment\@finishadvancetopmargin \advance\dimen@ +}% +\def\@finishadvancetopmargin{% + \advance\voffset by \dimen@ + \advance\vsize by -\dimen@ +}% +\def\bottommargin{\afterassignment\@finishbottommargin \dimen@}% +\def\@finishbottommargin{% + \@computebottommargin % Result in \dimen2. + \advance\dimen2 by -\dimen@ % Compute the change in the bottom margin. + \advance\vsize by \dimen2 % Change the type area. +}% +\def\advancebottommargin{% + \dimen@ = 0pt \afterassignment\@finishadvancebottommargin \advance\dimen@ +}% +\def\@finishadvancebottommargin{% + \advance\vsize by -\dimen@ +}% +\def\@computebottommargin{% + \dimen2 = \paperheight % The total paper size. + \advance\dimen2 by -\vsize % Less the text size. + \advance\dimen2 by -\voffset % Less the offset at the top. + \advance\dimen2 by -1truein % Less the default offset. +}% +\newdimen\paperwidth +\ifnum\mag=1000 + \paperwidth = 8.5in % No magnification (yet). +\else + \paperwidth = 8.5truein % We already have a magnification. +\fi +\def\leftmargin{\afterassignment\@finishleftmargin \dimen@}% +\def\@finishleftmargin{% + \dimen2 = \hoffset % Remember the old \hoffset. + \hoffset = \dimen@ \advance\hoffset by -1truein + \advance\dimen2 by -\hoffset % Compute the change in \hoffset. + \advance\hsize by \dimen2 % Change type area accordingly. +}% +\def\advanceleftmargin{% + \dimen@ = 0pt \afterassignment\@finishadvanceleftmargin \advance\dimen@ +}% +\def\@finishadvanceleftmargin{% + \advance\hoffset by \dimen@ + \advance\hsize by -\dimen@ +}% +\def\rightmargin{\afterassignment\@finishrightmargin \dimen@}% +\def\@finishrightmargin{% + \@computerightmargin % Result in \dimen2. + \advance\dimen2 by -\dimen@ % Compute the change in the right margin. + \advance\hsize by \dimen2 % Change the type area. +}% +\def\advancerightmargin{% + \dimen@ = 0pt \afterassignment\@finishadvancerightmargin \advance\dimen@ +}% +\def\@finishadvancerightmargin{% + \advance\hsize by -\dimen@ +}% +\def\@computerightmargin{% + \dimen2 = \paperwidth % The total paper size. + \advance\dimen2 by -\hsize % Less the text size. + \advance\dimen2 by -\hoffset % Less the offset at the left. + \advance\dimen2 by -1truein % Less the default offset. +}% +\let\@plainm@g = \m@g +\def\m@g{\@plainm@g \paperwidth = 8.5 true in \paperheight = 11 true in}% +\newskip\abovecolumnskip \abovecolumnskip = \bigskipamount +\newskip\belowcolumnskip \belowcolumnskip = \bigskipamount +\newdimen\gutter \gutter = 2pc +\newbox\@partialpage +\newdimen\@normalhsize +\newdimen\@normalvsize % The original (before multi-columns) \vsize. +\newtoks\previousoutput +\def\quadcolumns{\@columns4}% +\def\triplecolumns{\@columns3}% +\def\doublecolumns{\@columns2}% +\def\begincolumns#1{\ifcase#1\relax \or \singlecolumn \or \@columns2 \or + \@columns3 \or \@columns4 \else \relax \fi}% +\def\endcolumns{\singlecolumn}% +\let\@ndcolumns = \relax +\chardef\@numcolumns = 1 +\mathchardef\@ejectpartialpenalty = 10141 +\chardef\@col@minlines = 3 +\chardef\@col@extralines = 3 +\newdimen\@col@extraheight +\def\@columns#1{% + \@ndcolumns + \global\let\@ndcolumns = \@endcolumns + \global\chardef\@numcolumns = #1 + \global\previousoutput = \expandafter{\the\output}% + \global\output = {% + \ifnum\outputpenalty = -\@ejectpartialpenalty + \dimen@ = \vsize + \advance\dimen@ by \@col@minlines\baselineskip + \global\setbox\@partialpage = + \vbox \ifdim \pagetotal > \vsize to \dimen@ \fi {% + \unvbox255 \unskip + }% + \else + \the\previousoutput + \fi + }% + \vskip \abovecolumnskip + \vskip \@col@minlines\baselineskip + \penalty -\@ejectpartialpenalty + \global\output = {\@columnoutput}% + \global\@normalhsize = \hsize + \global\@normalvsize = \vsize + \count@ = \@numcolumns + \advance\count@ by -1 + \global\advance\hsize by -\count@\gutter + \global\divide\hsize by \@numcolumns + \advance\vsize by -\ht\@partialpage + \advance\vsize by -\ht\footins + \ifvoid\footins\else \advance\vsize by -\skip\footins \fi + \multiply\count\footins by \@numcolumns + \advance\vsize by -\ht\topins + \ifvoid\topins\else \advance\vsize by -\skip\topins \fi + \multiply\count\topins by \@numcolumns + \global\vsize = \@numcolumns\vsize + \@col@extraheight=\@col@extralines\baselineskip + \multiply\@col@extraheight by \@numcolumns + \global\advance\vsize by \@col@extraheight +}% +\def\gutterbox{\vbox to \dimen0{\vfil\hbox{\hfil}\vfil}}% +\def\@columnsplit{% + \splittopskip = \topskip + \splitmaxdepth = \baselineskip + \begingroup + \vbadness = 10000 + \global\setbox1 = \vsplit255 to \dimen@ \global\wd1 = \hsize + \global\setbox3 = \vsplit255 to \dimen@ \global\wd3 = \hsize + \ifnum\@numcolumns > 2 + \global\setbox5 = \vsplit255 to \dimen@ \global\wd5 = \hsize + \fi + \ifnum\@numcolumns > 3 + \global\setbox7 = \vsplit255 to \dimen@ \global\wd7 = \hsize + \fi + \endgroup + \setbox0 = \box255 + \global\setbox255 = \vbox{% + \unvbox\@partialpage + \ifcase\@numcolumns \relax\or\relax + \or \hbox to \@normalhsize{\box1\hfil\gutterbox\hfil\box3}% + \or \hbox to \@normalhsize{\box1\hfil\gutterbox\hfil\box3% + \hfil\gutterbox\hfil\box5}% + \or \hbox to \@normalhsize{\box1\hfil\gutterbox\hfil\box3% + \hfil\gutterbox\hfil\box5% + \hfil\gutterbox\hfil\box7}% + \fi + }% + \setbox\@partialpage = \box0 +}% +\def\@columnoutput{% + \dimen@ = \ht255 + \advance\dimen@ by -\@col@extraheight + \divide\dimen@ by \@numcolumns + \@columnsplit + \@recoverclubpenalty + \hsize = \@normalhsize % Local to \output's group. + \vsize = \@normalvsize + \the\previousoutput + \unvbox\@partialpage + \penalty\outputpenalty + \global\vsize = \@numcolumns\@normalvsize + \global\advance\vsize by \@col@extraheight +}% +\def\singlecolumn{% + \@ndcolumns + \chardef\@numcolumns = 1 + \vskip\belowcolumnskip + \nointerlineskip +}% +\newbox\@singlecolumnbox +\newdimen\column@pagegoal +\newdimen\column@vsize +\def\@endcolumns{% + \global\let\@ndcolumns = \relax + \par % Shouldn't start in horizontal mode. + \column@pagegoal = \pagegoal + \advance\column@pagegoal by-\@col@extraheight + \ifdim \pagetotal > \column@pagegoal + \column@vsize = \column@pagegoal + \else + \column@vsize = \pagetotal + \fi + \global\output = {\global\setbox1 = \box255}% + \pagegoal = \pagetotal + \break % Exercise the page builder, i.e., \output. + \setbox2 = \box1 % Save material in box2 in case of overflow. + \global\output = \expandafter{\the\previousoutput}% + \setbox\@singlecolumnbox = \box\@partialpage + \@balancecolumns +}% +\def\@balancecolumns{% + \global\setbox255 = \copy2 % Retrieve what the fake \output set. + \dimen@ = \column@vsize + \divide\dimen@ by \@numcolumns + \@columnsplit + \ifvoid\@partialpage + \global\vsize = \@normalvsize + \global\hsize = \@normalhsize + \dump@balanced@columns + \let\next\relax + \else + \advance \column@vsize by \@numcolumns pt + \test@spill@columns + \ifspill@columns + \begingroup + \vsize = \@normalvsize + \hsize = \@normalhsize + \dump@balanced@columns + \break + \@recoverclubpenalty + \endgroup + \unvbox\@partialpage + \let\next\@endcolumns + \else + \setbox0=\box\@partialpage % Merely to void \@partialpage. + \let\next\@balancecolumns + \fi + \fi + \next +}% +\def\dump@balanced@columns{% + \ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi + \unvbox\@singlecolumnbox + \nointerlineskip + \box255 +}% +\newif\ifspill@columns +\def\test@spill@columns{% + \spill@columnsfalse + \ifdim \column@vsize > \column@pagegoal + \ifvoid\footins + \ifvoid\topins + \spill@columnstrue + \fi + \fi + \fi +}% +\def\@saveclubpenalty{% save the current value of \clubpenalty + \edef\@recoverclubpenalty{% + \global\clubpenalty=\the\clubpenalty\relax% + \global\let\noexpand\@recoverclubpenalty\relax + }% the \noexpand handles infinite self-reference +}% +\let\@recoverclubpenalty\relax +\newdimen\temp@dimen +\def\columnfill{% + \par + \dimen@ = \pagetotal % The height of the text so far. + \temp@dimen = \vsize % = \@numcolumns * columnheight + \advance\temp@dimen by -\@col@extraheight + \divide\temp@dimen by \@numcolumns % Compute column height + \loop + \ifdim \dimen@ > \temp@dimen % more material than a column? + \advance \dimen@ by -\temp@dimen + \advance \dimen@ by \topskip % fudge factor + \repeat + \advance \temp@dimen by -\dimen@ + \advance \temp@dimen by -\prevdepth + \@saveclubpenalty + \clubpenalty=10000\relax + \hrule height\temp@dimen width0pt depth0pt\relax % fill space with rule + \nointerlineskip + \par + \nointerlineskip + \allowbreak \vfil % To allow a page break here. + \relax +}% +\def\@hldest{% + \def\hl@prefix{hldest}% + \let\after@hl@getparam\hldest@aftergetparam + \begingroup + \hl@getparam +}% +\def\hldest@aftergetparam{% + \ifvmode + \hldest@driver + \else + \allowhyphens + \smash{\ifx\hldest@opt@raise\empty \else \raise\hldest@opt@raise\fi + \hbox{\hldest@driver}}% + \allowhyphens + \fi + \endgroup +}% +\def\@hlstart{% + \leavevmode + \def\hl@prefix{hl}% + \let\after@hl@getparam\hlstart@aftergetparam + \begingroup + \hl@getparam +}% +\def\hlstart@aftergetparam{% + \ifx\color\undefined \else + \ifx\hl@opt@color\empty \else + \ifx\hl@opt@colormodel\empty + \edef\temp{\noexpand\color{\hl@opt@color}}% + \else + \edef\temp{\noexpand\color[\hl@opt@colormodel]{\hl@opt@color}}% + \fi + \temp + \fi + \fi + \hl@driver +}% +\def\hl@getparam#1#2{% We'll read #3 (LABEL) later. + \edef\@hltype{#1}% + \ifx\@hltype\empty + \expandafter\let\expandafter\@hltype + \csname \hl@prefix @type\endcsname + \fi + \expandafter\ifx\csname \hl@prefix @typeh@\@hltype\endcsname \relax + \errmessage{Invalid hyperlink type `\@hltype'}% + \fi + \For\hl@arg:=#2\do{% + \ifx\hl@arg\empty \else + \expandafter\hl@set@opt\hl@arg=,% + \fi + }% + \bgroup + \uncatcodespecials + \catcode`\{=1 \catcode`\}=2 + \@hl@getparam +}% +\def\@hl@getparam#1{% + \egroup + \edef\@hllabel{#1}% + \after@hl@getparam + \ignorespaces +}% +\def\hl@set@opt#1=#2,{% + \expandafter\ifx\csname \hl@prefix @opt@#1\endcsname \relax + \errmessage{Invalid hyperlink option `#1'}% + \fi + \if ,#2, % if #2 is empty, complain. + \errmessage{Missing value for option `#1'}% + \else + \def\temp##1={##1}% + \expandafter\edef\csname \hl@prefix @opt@#1\endcsname{\temp#2}% + \fi +}% +\def\hldest@impl#1{% + \expandafter\ifcase\csname hldest@on@#1\endcsname + \relax\expandafter\gobble + \else + \toks@=\expandafter{\csname hldest@type@#1\endcsname}% + \toks@ii=\expandafter{\csname hldest@opts@#1\endcsname}% + \edef\temp{\noexpand\hldest{\the\toks@}{\the\toks@ii}}% + \expandafter\temp + \fi +}% +\def\hlstart@impl#1{% + \expandafter\ifcase\csname hl@on@#1\endcsname + \leavevmode\expandafter\gobble + \else + \toks@=\expandafter{\csname hl@type@#1\endcsname}% + \toks@ii=\expandafter{\csname hl@opts@#1\endcsname}% + \edef\temp{\noexpand\hlstart{\the\toks@}{\the\toks@ii}}% + \expandafter\temp + \fi +}% +\def\hlend@impl#1{% + \expandafter\ifcase\csname hl@on@#1\endcsname + \else + \hlend + \fi +}% +\def\hl@asterisk@word{*}% +\def\hl@opts@word{opts}% +\newif\if@params@override +\def\hldest@groups{definexref,xrdef,li,eq,bib,foot,footback,idx}% +\def\hl@groups{ref,xref,eq,cite,foot,footback,idx,url,hrefint,hrefext}% +\def\hldesttype{% + \def\hl@prefix{hldest}% + \def\hl@param{type}% + \let\hl@all@groups\hldest@groups + \futurelet\hl@excl\hl@param@read@excl +}% +\def\hldestopts{% + \def\hl@prefix{hldest}% + \def\hl@param{opts}% + \let\hl@all@groups\hldest@groups + \futurelet\hl@excl\hl@param@read@excl +}% +\def\hltype{% + \def\hl@prefix{hl}% + \def\hl@param{type}% + \let\hl@all@groups\hl@groups + \futurelet\hl@excl\hl@param@read@excl +}% +\def\hlopts{% + \def\hl@prefix{hl}% + \def\hl@param{opts}% + \let\hl@all@groups\hl@groups + \futurelet\hl@excl\hl@param@read@excl +}% +\def\hl@param@read@excl{% + \ifx!\hl@excl + \let\next\hl@param@read@opt@arg + \@params@overridetrue + \else + \def\next{\hl@param@read@opt@arg{!}}% + \@params@overridefalse + \fi + \next +}% +\def\hl@param@read@opt@arg#1{% #1 is the `!', ignore it. + \@getoptionalarg\hl@setparam +}% +\def\@hl@setparam#1{% + \ifx\@optionalarg\empty + \hl@setparam@default{#1}% Set default. + \else + \let\hl@do@all@groups\gobble + \For\hl@group:=\@optionalarg\do{% + \ifx\hl@group\hl@asterisk@word + \def\hl@do@all@groups{\let\@optionalarg\hl@all@groups \hl@setparam}% + \else + \hl@setparam@group{#1}% + \fi + }% + \hl@do@all@groups{#1}% + \fi +}% +\def\hl@setparam@group#1{% + \ifx\hl@group\empty + \hl@setparam@default{#1}% + \else + \expandafter\ifx\csname\hl@prefix @\hl@param @\hl@group\endcsname\relax + \errmessage{Hyperlink group `\hl@prefix:\hl@param:\hl@group' is not defined}% + \fi + \ifx\hl@param\hl@opts@word + \if@params@override + \expandafter\let\csname\hl@prefix @\hl@param @\hl@group\endcsname\empty + \fi + \hl@update@opts@with@list{#1}% #1 will be used in the \for + \else + \ece\def{\hl@prefix @\hl@param @\hl@group}{#1}% + \fi + \fi +}% +\def\hl@setparam@default#1{% + \ifx\hl@param\hl@opts@word + \For\hl@opt:=#1\do{% + \ifx\hl@opt\empty \else + \expandafter\hl@set@opt\hl@opt=,% + \fi + }% + \else + \expandafter\ifx\csname\hl@prefix @\hl@param\endcsname\relax + \message{Default hyperlink parameter `\hl@prefix:\hl@param' is not defined}% + \fi + \ece\def{\hl@prefix @\hl@param}{#1}% + \fi +}% +\def\hl@update@opts@with@list#1{% + \global\expandafter\let\expandafter\hl@update@new@list + \csname \hl@prefix @opts@\hl@group\endcsname + \begingroup + \For\hl@opt:=#1\do{% + \hl@update@opts@with@opt + }% + \endgroup + \ece\let{\hl@prefix @opts@\hl@group}\hl@update@new@list +}% +\def\hl@update@opts@with@opt{% + \global\let\hl@update@old@list\hl@update@new@list + \global\let\hl@update@new@list\empty + \global\let\hl@update@new@opt\hl@opt + \expandafter\hl@parse@opt@key\hl@opt=,% + \let\hl@update@new@key\hl@update@key + \global\let\hl@update@comma\empty + \begingroup + \for\hl@opt:=\hl@update@old@list\do{% + \ifx\hl@opt\empty \else % Skip empty `options'. + \expandafter\hl@parse@opt@key\hl@opt=,% + \toks@=\expandafter{\hl@update@new@list}% + \ifx\hl@update@key\hl@update@new@key + \ifx\hl@update@new@opt\empty \else % Skip multiple options. + \toks@ii=\expandafter{\hl@update@new@opt}% + \xdef\hl@update@new@list{\the\toks@\hl@update@comma\the\toks@ii}% + \global\let\hl@update@new@opt\empty + \global\def\hl@update@comma{,}% + \fi + \else + \toks@ii=\expandafter{\hl@opt}% + \xdef\hl@update@new@list{\the\toks@\hl@update@comma\the\toks@ii}% + \global\def\hl@update@comma{,}% + \fi + \fi + }% + \endgroup + \ifx\hl@update@new@opt\empty \else + \toks@=\expandafter{\hl@update@new@list}% + \toks@ii=\expandafter{\hl@update@new@opt}% + \xdef\hl@update@new@list{\the\toks@\hl@update@comma\the\toks@ii}% + \fi +}% +\def\hl@parse@opt@key#1=#2,{\def\hl@update@key{#1}}% +\def\hldest@opt@raise{\normalbaselineskip}% +\def\hl@opt@colormodel{cmyk}% +\def\hl@opt@color{0.28,1,1,0.35}% +\def\hldest@on@definexref{0}% +\def\hldest@on@xrdef{0}% +\def\hldest@on@li{0}% +\def\hldest@on@eq{0}% \eqdef and friends +\def\hldest@on@bib{0}% \biblabelprint (BibTeX) +\def\hldest@on@foot{0}% \footnote / \numberedfootnote +\def\hldest@on@footback{0}% back-ref for \footnote / \numberedfootnote +\def\hldest@on@idx{0}% both `page' dests and `exact' dests +\let\hldest@type@definexref\empty +\let\hldest@type@xrdef\empty +\let\hldest@type@li\empty +\let\hldest@type@eq\empty % \eqdef and friends +\let\hldest@type@bib\empty % \biblabelprint (BibTeX) +\let\hldest@type@foot\empty % \footnote / \numberedfootnote +\let\hldest@type@footback\empty % back-ref for \footnote / \numberedfootnote +\let\hldest@type@idx\empty % both `page' dests and `exact' dests +\let\hldest@opts@definexref\empty +\let\hldest@opts@xrdef\empty +\let\hldest@opts@li\empty +\def\hldest@opts@eq{raise=1.7\normalbaselineskip}% \eqdef and friends +\let\hldest@opts@bib\empty % \biblabelprint (BibTeX) +\let\hldest@opts@foot\empty % \footnote / \numberedfootnote +\let\hldest@opts@footback\empty % back-ref for \footnote / \numberedfootnote +\let\hldest@opts@idx\empty % both `page' dests and `exact' dests +\def\hl@on@ref{0}% \refn and \xrefn, \ref, \refs +\def\hl@on@xref{0}% +\def\hl@on@eq{0}% \eqref and \eqrefn +\def\hl@on@cite{0}% \cite (BibTeX) +\def\hl@on@foot{0}% \footnote / \numberedfootnote +\def\hl@on@footback{0}% back-reference for \footnote / \numberedfootnote +\def\hl@on@idx{0}% +\def\hl@on@url{0}% \url from url.sty +\def\hl@on@hrefint{0}% \href with internal #labels +\def\hl@on@hrefext{0}% \href with external labels (URLs) +\let\hl@type@ref\empty % \refn and \xrefn, \ref, \refs +\let\hl@type@xref\empty +\let\hl@type@eq\empty % \eqref and \eqrefn +\let\hl@type@cite\empty % \cite (BibTeX) +\let\hl@type@foot\empty % \footnote / \numberedfootnote +\let\hl@type@footback\empty % back-reference for \footnote / \numberedfootnote +\let\hl@type@idx\empty +\let\hl@type@url\empty % \url from url.sty (this will be set to `url' by +\let\hl@type@hrefint\empty % \href with internal #labels +\let\hl@type@hrefext\empty % \href with external labels (URLs) (this +\let\hl@opts@ref\empty % \refn and \xrefn, \ref, \refs +\let\hl@opts@xref\empty +\let\hl@opts@eq\empty % \eqref and \eqrefn +\let\hl@opts@cite\empty % \cite (BibTeX) +\let\hl@opts@foot\empty % \footnote / \numberedfootnote +\let\hl@opts@footback\empty % back-reference for \footnote / \numberedfootnote +\let\hl@opts@idx\empty +\let\hl@opts@url\empty % \url from url.sty +\let\hl@opts@hrefint\empty % \href with internal #labels +\let\hl@opts@hrefext\empty % \href with external labels (URLs) +\def\@hlon{\@hlonoff@value@stub{hl}\@@hlon1 }% +\def\@hloff{\@hlonoff@value@stub{hl}\@@hloff0 }% +\def\@hldeston{\@hlonoff@value@stub{hldest}\@@hldeston1 }% +\def\@hldestoff{\@hlonoff@value@stub{hldest}\@@hldestoff0 }% +\def\@hlonoff@value@stub#1#2#3{% + \def\hl@prefix{#1}% + \let\hl@on@empty#2% + \def\hl@value{#3}% + \expandafter\let\expandafter\hl@all@groups + \csname \hl@prefix @groups\endcsname + \@getoptionalarg\@finhlswitch +}% +\def\@finhlswitch{% + \ifx\@optionalarg\empty + \hl@on@empty + \fi + \let\hl@do@all@groups\relax + \For\hl@group:=\@optionalarg\do{% + \ifx\hl@group\hl@asterisk@word + \let\@optionalarg\hl@all@groups + \let\hl@do@all@groups\@finhlswitch + \else + \ifx\hl@group\empty + \hl@on@empty + \else + \expandafter\ifx\csname\hl@prefix @on@\hl@group\endcsname \relax + \errmessage{Hyperlink group `\hl@prefix:on:\hl@group' + is not defined}% + \fi + \ece\edef{\hl@prefix @on@\hl@group}{\hl@value}% + \fi + \fi + }% + \hl@do@all@groups +}% +\def\@@hlon{% + \let\hlstart\@hlstart + \let\hlend\@hlend +}% +\def\@@hloff{% + \def\hlstart##1##2##3{\leavevmode\ignorespaces}% + \let\hlend\relax +}% +\def\@@hldeston{% + \let\hldest\@hldest +}% +\def\@@hldestoff{% + \def\hldest##1##2##3{\ignorespaces}% +}% +\def\hl@idxexact@word{idxexact}% +\def\hl@idxpage@word{idxpage}% +\def\hl@idxnone@word{idxnone}% +\def\hl@raw@word{raw}% +\def\enablehyperlinks{\@getoptionalarg\@finenablehyperlinks}% +\def\@finenablehyperlinks{% + \let\hl@selecteddriver\empty + \def\hldest@place@idx{0}% + \for\hl@arg:=\@optionalarg\do{% + \ifx\hl@arg\hl@idxexact@word + \def\hldest@place@idx{1}% + \else + \ifx\hl@arg\hl@idxnone@word + \def\hldest@place@idx{-1}% + \else + \ifx\hl@arg\hl@idxpage@word + \def\hldest@place@idx{0}% + \else + \let\hl@selecteddriver\hl@arg + \fi + \fi + \fi + }% + \ifx\hl@selecteddriver\empty + \ifpdf + \def\hl@selecteddriver{pdftex}% + \message{^^JEplain: using `pdftex' hyperlink driver.}% + \else + \def\hl@selecteddriver{hypertex}% + \message{^^JEplain: using `hypertex' hyperlink driver.}% + \fi + \else + \expandafter\ifx\csname hldriver@\hl@selecteddriver\endcsname \relax + \errmessage{No hyperlink driver `\hl@selecteddriver' available}% + \fi + \fi + \let\hl@setparam\@hl@setparam + \csname hldriver@\hl@selecteddriver\endcsname + \def\@finenablehyperlinks{\errmessage{Hyperlink driver `\hl@selecteddriver' + already selected}}% + \let\hldriver@nolinks\undefined + \let\hldriver@hypertex\undefined + \let\hldriver@pdftex \undefined + \let\hldriver@dvipdfm\undefined + \let\hloff\@hloff + \let\hlon\@hlon + \let\hldestoff\@hldestoff + \let\hldeston\@hldeston + \hlon[*,]\hloff[foot,footback]% + \hldeston[*,]\hldestoff[foot,footback]% +}% +\def\hldriver@nolinks{% + \def\@hldest##1##2##3{% + \edef\temp{\write-1{hldest: ##3}}% + \ifvmode + \temp + \else + \allowhyphens + \expandafter\smash\expandafter{\temp}% + \allowhyphens + \fi + \ignorespaces + }% + \def\@hlstart##1##2##3{% + \leavevmode + \begingroup % Start the color group. + \edef\temp{\write-1{hlstart: ##3}}% + \temp + \ignorespaces + }% + \def\@hlend{% + \edef\temp{\write-1{hlend}}% + \temp + \endgroup % End the color group from \@hlstart. + }% + \let\hl@setparam\gobble +}% +{\catcode`\#=\other +\gdef\hlhash{#}}% +\def\hldriver@hypertex{% + \def\hldest@type{xyz}% + \let\hldest@opt@cmd \empty + \def\hldest@driver{% + \ifx\@hltype\hl@raw@word + \csname \hldest@opt@cmd \endcsname + \else + \special{html:<a name="\@hllabel">}\special{html:</a>}% + \fi + }% + \let\hldest@typeh@raw \empty + \let\hldest@typeh@xyz \empty + \def\hl@type{name}% + \ifx\hl@type@url\empty + \def\hl@type@url{url}% + \fi + \ifx\hl@type@hrefext\empty + \def\hl@type@hrefext{url}% + \fi + \let\hl@opt@cmd \empty + \let\hl@opt@ext \empty + \let\hl@opt@file \empty + \def\hl@driver{% + \ifx\@hltype\hl@raw@word + \csname \hl@opt@cmd \endcsname + \else + \def\hlstart@preamble{html:<a href="}% + \csname hl@typeh@\@hltype\endcsname + \fi + }% + \let\hl@typeh@raw \empty + \def\hl@typeh@name{\special{\hlstart@preamble \hlhash\@hllabel">}}% + \def\hl@typeh@filename{% + \special{% + \hlstart@preamble + file:\hl@opt@file\hl@opt@ext + \ifempty\@hllabel \else \hlhash\@hllabel\fi + ">% + }% + }% + \def\hl@typeh@url{% + \special{% + \hlstart@preamble + \@hllabel + ">% + }% + }% + \def\@hlend{\special{html:</a>}\endgroup}% End the group from \@hlstart. +}% +\def\hldriver@pdftex{% +\ifpdf % PDF output is enabled. + \def\hldest@type{xyz}% + \let\hldest@opt@width \empty + \let\hldest@opt@height \empty + \let\hldest@opt@depth \empty + \let\hldest@opt@zoom \empty + \let\hldest@opt@cmd \empty + \def\hldest@driver{% + \ifx\@hltype\hl@raw@word + \csname \hldest@opt@cmd \endcsname + \else + \pdfdest name{\@hllabel}\@hltype + \csname hldest@typeh@\@hltype\endcsname + \fi + }% + \let\hldest@typeh@raw \empty + \let\hldest@typeh@fit \empty + \let\hldest@typeh@fith \empty + \let\hldest@typeh@fitv \empty + \let\hldest@typeh@fitb \empty + \let\hldest@typeh@fitbh \empty + \let\hldest@typeh@fitbv \empty + \def\hldest@typeh@fitr{% + \ifx\hldest@opt@width \empty \else width \hldest@opt@width \fi + \ifx\hldest@opt@height \empty \else height \hldest@opt@height \fi + \ifx\hldest@opt@depth \empty \else depth \hldest@opt@depth \fi + }% + \def\hldest@typeh@xyz{% + \ifx\hldest@opt@zoom\empty \else zoom \hldest@opt@zoom \fi + }% + \def\hl@type{name}% + \ifx\hl@type@url\empty + \def\hl@type@url{url}% + \fi + \ifx\hl@type@hrefext\empty + \def\hl@type@hrefext{url}% + \fi + \let\hl@opt@width \empty + \let\hl@opt@height \empty + \let\hl@opt@depth \empty + \def\hl@opt@bstyle {S}% + \def\hl@opt@bwidth {1}% + \let\hl@opt@bcolor \empty + \let\hl@opt@hlight \empty + \let\hl@opt@bdash \empty + \let\hl@opt@pagefit \empty + \let\hl@opt@cmd \empty + \let\hl@opt@file \empty + \let\hl@opt@newwin \empty + \def\hl@driver{% + \ifx\@hltype\hl@raw@word + \csname \hl@opt@cmd \endcsname + \else + \let\hl@BSspec\relax % construct + \ifx\hl@opt@bstyle \empty + \ifx\hl@opt@bwidth \empty + \ifx\hl@opt@bdash \empty + \let\hl@BSspec\empty % don't construct + \fi + \fi + \fi + \def\hlstart@preamble{% + \pdfstartlink + \ifx\hl@opt@width \empty \else width \hl@opt@width \fi + \ifx\hl@opt@height \empty \else height \hl@opt@height \fi + \ifx\hl@opt@depth \empty \else depth \hl@opt@depth \fi + attr{% + \ifx\hl@opt@bcolor\empty\else /C[\hl@opt@bcolor]\fi + \ifx\hl@opt@hlight\empty\else /H/\hl@opt@hlight\fi + \ifx\hl@BSspec\relax + /BS<<% + /Type/Border% + \ifx\hl@opt@bstyle\empty\else /S/\hl@opt@bstyle\fi + \ifx\hl@opt@bwidth\empty\else /W \hl@opt@bwidth\fi + \ifx\hl@opt@bdash\empty \else /D[\hl@opt@bdash]\fi + >>% + \fi + }% + }% + \csname hl@typeh@\@hltype\endcsname + \fi + }% + \let\hl@typeh@raw\empty + \def\hl@typeh@name{\hlstart@preamble goto name{\@hllabel}}% + \def\hl@typeh@num{\hlstart@preamble goto num \@hllabel}% + \def\hl@typeh@page{% + \count@=\@hllabel + \advance\count@ by-1 + \hlstart@preamble + user{% + /Subtype/Link% + /Dest% + [\the\count@ + \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]% + }% + }% + \def\hl@typeh@filename{\hl@file{(\@hllabel)}}% + \def\hl@typeh@filepage{% + \count@=\@hllabel + \advance\count@ by-1 + \hl@file{% + [\the\count@ \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]% + }% + }% + \def\hl@file##1{% + \hlstart@preamble + user{% + /Subtype/Link% + /A<<% + /Type/Action% + /S/GoToR% + /D##1% + /F(\hl@opt@file)% + \ifx\hl@opt@newwin\empty \else + /NewWindow \ifcase\hl@opt@newwin false\else true\fi + \fi + >>% + }% + }% + \def\hl@typeh@url{% + \hlstart@preamble + user{% + /Subtype/Link% + /A<<% + /Type/Action% + /S/URI% + /URI(\@hllabel)% + >>% + }% + }% + \def\@hlend{\pdfendlink\endgroup}% End the group from the \@hlstart. +\else % PDF output is not enabled. + \message{Eplain warning: `pdftex' hyperlink driver: PDF output is^^J + \space not enabled, falling back on `nolinks' driver.}% + \hldriver@nolinks +\fi +}% +\def\hldriver@dvipdfm{% + \def\hldest@type{xyz}% + \let\hldest@opt@left \empty + \let\hldest@opt@top \empty + \let\hldest@opt@right \empty + \let\hldest@opt@bottom \empty + \let\hldest@opt@zoom \empty + \let\hldest@opt@cmd \empty + \def\hldest@driver{% + \ifx\@hltype\hl@raw@word + \csname \hldest@opt@cmd \endcsname + \else + \def\hldest@preamble{% + pdf: dest (\@hllabel) [@thispage + }% + \csname hldest@typeh@\@hltype\endcsname + \fi + }% + \let\hldest@typeh@raw\empty + \def\hldest@typeh@fit{% + \special{\hldest@preamble /Fit]}% + }% + \def\hldest@typeh@fith{% + \special{\hldest@preamble /FitH + \ifx\hldest@opt@top\empty @ypos \else \hldest@opt@top \fi]}% + }% + \def\hldest@typeh@fitv{% + \special{\hldest@preamble /FitV + \ifx\hldest@opt@left\empty @xpos \else \hldest@opt@left \fi]}% + }% + \def\hldest@typeh@fitb{% + \special{\hldest@preamble /FitB]}% + }% + \def\hldest@typeh@fitbh{% + \special{\hldest@preamble /FitBH + \ifx\hldest@opt@top\empty @ypos \else \hldest@opt@top \fi]}% + }% + \def\hldest@typeh@fitbv{% + \special{\hldest@preamble /FitBV + \ifx\hldest@opt@left\empty @xpos \else \hldest@opt@left \fi]}% + }% + \def\hldest@typeh@fitr{% + \special{\hldest@preamble /FitR + \ifx\hldest@opt@left\empty @xpos\else\hldest@opt@left\fi\space + \ifx\hldest@opt@bottom\empty @ypos\else\hldest@opt@bottom\fi\space + \ifx\hldest@opt@right\empty @xpos\else\hldest@opt@right\fi\space + \ifx\hldest@opt@top\empty @ypos\else\hldest@opt@top \fi]}% + }% + \def\hldest@typeh@xyz{% + \begingroup + \ifx\hldest@opt@zoom\empty + \count1=\z@ \count2=\z@ + \else + \count2=\hldest@opt@zoom + \count1=\count2 \divide\count1 by 1000 + \count3=\count1 \multiply\count3 by 1000 + \advance\count2 by -\count3 + \fi + \special{\hldest@preamble /XYZ + \ifx\hldest@opt@left\empty @xpos\else\hldest@opt@left\fi\space + \ifx\hldest@opt@top\empty @ypos\else\hldest@opt@top\fi\space + \the\count1.\the\count2]}% + \endgroup + }% + \def\hl@type{name}% + \ifx\hl@type@url\empty + \def\hl@type@url{url}% + \fi + \ifx\hl@type@hrefext\empty + \def\hl@type@hrefext{url}% + \fi + \def\hl@opt@bstyle {S}% + \def\hl@opt@bwidth {1}% + \let\hl@opt@bcolor \empty + \let\hl@opt@hlight \empty + \let\hl@opt@bdash \empty + \let\hl@opt@pagefit \empty + \let\hl@opt@cmd \empty + \let\hl@opt@file \empty + \let\hl@opt@newwin \empty + \def\hl@driver{% + \ifx\@hltype\hl@raw@word + \csname \hl@opt@cmd \endcsname + \else + \let\hl@BSspec\relax % construct + \ifx\hl@opt@bstyle \empty + \ifx\hl@opt@bwidth \empty + \ifx\hl@opt@bdash \empty + \let\hl@BSspec\empty % don't construct + \fi + \fi + \fi + \def\hlstart@preamble{% + pdf: beginann + <<% + /Type/Annot% + /Subtype/Link% + \ifx\hl@opt@bcolor\empty\else /C[\hl@opt@bcolor]\fi + \ifx\hl@opt@hlight\empty\else /H/\hl@opt@hlight\fi + \ifx\hl@BSspec\relax + /BS<<% + /Type/Border% + \ifx\hl@opt@bstyle\empty\else /S/\hl@opt@bstyle\fi + \ifx\hl@opt@bwidth\empty\else /W \hl@opt@bwidth\fi + \ifx\hl@opt@bdash\empty \else /D[\hl@opt@bdash]\fi + >>% + \fi + }% + \csname hl@typeh@\@hltype\endcsname + \fi + }% + \let\hl@typeh@raw\empty + \def\hl@typeh@name{\special{\hlstart@preamble /Dest(\@hllabel)>>}}% + \def\hl@typeh@page{% + \count@=\@hllabel + \advance\count@ by-1 + \special{% + \hlstart@preamble + /Dest[\the\count@ + \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]% + >>% + }% + }% + \def\hl@typeh@filename{\hl@file{(\@hllabel)}}% + \def\hl@typeh@filepage{% + \count@=\@hllabel + \advance\count@ by-1 + \hl@file{% + [\the\count@ \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]% + }% + }% + \def\hl@file##1{% + \special{% + \hlstart@preamble + /A<<% + /Type/Action% + /S/GoToR% + /D##1% + /F(\hl@opt@file)% + \ifx\hl@opt@newwin\empty \else + /NewWindow \ifcase\hl@opt@newwin false\else true\fi + \fi + >>% + >>% + }% + }% + \def\hl@typeh@url{% + \special{% + \hlstart@preamble + /A<<% + /Type/Action% + /S/URI% + /URI(\@hllabel)% + >>% + >>% + }% + }% + \def\@hlend{\special{pdf: endann}\endgroup}% End the group from \@hlstart. +}% +\def\href{% + \bgroup + \uncatcodespecials + \catcode`\{=1 \catcode`\}=2 + \@href +}% +\def\@href#1{% We'll read #2 (TEXT) later. + \egroup + \edef\@hreftmp{\ifempty{#1}{}\fi}% Parameter stuffing for \@@href. + \expandafter\@@href\@hreftmp#1\@@ +}% +\def\href@end@int{\hlend@impl{hrefint}}% +\def\href@end@ext{\hlend@impl{hrefext}}% +\def\@@href#1#2\@@{% + \def\@hreftmp{#1}% + \ifx\@hreftmp\hlhash + \let\href@end\href@end@int + \hlstart@impl{hrefint}{#2}% + \else + \let\href@end\href@end@ext + \hlstart@impl{hrefext}{#1#2}% + \fi + \@@@href +}% +\def\@@@href{% + \futurelet\@hreftmp\href@ +}% +\def\href@{% + \ifcat\bgroup\noexpand\@hreftmp + \let\@hreftmp\href@@ + \else + \let\@hreftmp\href@@@ + \fi + \@hreftmp +}% +\def\href@@{\bgroup\aftergroup\href@end \let\@hreftmp}% +\def\href@@@#1{#1\href@end}% +\def\hldeston{\errmessage{Please enable hyperlinks with + \string\enablehyperlinks\space before using hyperlink commands + (consider selecting the `nolinks' driver to ignore all hyperlink + commands in your document)}}% +\let\hldestoff\hldeston \let\hlon\hldeston \let\hloff\hldeston +\let\hlstart\hldeston \let\hlend\hldeston \let\hldest\hldeston +\let\hl@setparam\hldeston +\@hloff[*]\@hldestoff[*]% +\newif\ifusepkg@miniltx@loaded +\newcount\usepkg@recursion@level +\def\usepkg@rcrs{\the\usepkg@recursion@level}% +\let\usepkg@at@begin@document\empty +\let\usepkg@at@end@of@package\empty +\def\usepkg@word@autopict{autopict}% +\def\usepkg@word@psfrag{psfrag}% +\long\def\beginpackages#1\endpackages{% + \let\usepackage\real@usepackage + \let\DoNotLoadEpstopdf=t + \let\eplaininput=\input + #1% + \usepkg@at@begin@document + \global\let\usepkg@at@begin@document\empty + \global\let\usepackage\fake@usepackage + \let\packageinput=\input + \let\input=\eplaininput + \ifx\resetatcatcode\@undefined \else\resetatcatcode \fi +}% +\def\fake@usepackage{\errmessage{You should not use \string\usepackage\space outside of^^J + \@spaces\string\beginpackages...\string\endpackages\space environment}% +}% +\def\eplain@RequirePackage{% + \global\ece\let{usepkg@save@pkg\usepkg@rcrs}\usepkg@pkg + \global\ece\let{usepkg@save@options\usepkg@rcrs}\usepkg@options + \global\ece\let{usepkg@save@date\usepkg@rcrs}\usepkg@date + \global\ece\let{usepkg@at@end@of@package\usepkg@rcrs}\usepkg@at@end@of@package + \global\advance\usepkg@recursion@level by\@ne + \real@usepackage +}% +\let\usepackage\fake@usepackage +\def\real@usepackage{\@getoptionalarg\@finusepackage}% +\def\@finusepackage#1{% + \let\usepkg@options\@optionalarg + \ifempty{#1}% + \errmessage{No packages specified}% + \fi + \ifusepkg@miniltx@loaded \else + \testfileexistence[miniltx]{tex}% + \if@fileexists + \input miniltx.tex + \global\usepkg@miniltx@loadedtrue + \global\let\RequirePackage\eplain@RequirePackage + \global\let\DeclareOption\eplain@DeclareOption + \global\let\PassOptionsToPackage\eplain@PassOptionsToPackage + \global\let\ExecuteOptions\eplain@ExecuteOptions + \gdef\ProcessOptions{\@ifstar\eplain@ProcessOptions + \eplain@ProcessOptions}% + \global\let\AtBeginDocument\eplain@AtBeginDocument + \global\let\AtEndOfPackage\eplain@AtEndOfPackage + \global\let\ProvidesFile\eplain@ProvidesFile + \global\let\ProvidesPackage\eplain@ProvidesPackage + \else + \errmessage{miniltx.tex not found, cannot load LaTeX packages}% + \fi + \fi + \@ifnextchar[%] + {\@finfinusepackage{#1}}% + {\@finfinusepackage{#1}[]}% +}% +\def\@finfinusepackage#1[#2]{% + \edef\usepkg@date{#2}% + \let\usepkg@load@list\empty + \for\usepkg@pkg:=#1\do{% + \toks@=\expandafter{\usepkg@load@list}% + \edef\usepkg@load@list{% + \the\toks@ + \noexpand\usepkg@load@pkg{\usepkg@pkg}% + }% + }% + \usepkg@load@list + \ifnum\usepkg@recursion@level>0 + \global\advance\usepkg@recursion@level by\m@ne + \expandafter\let\expandafter\usepkg@pkg\csname usepkg@save@pkg\usepkg@rcrs\endcsname + \expandafter\let\expandafter\usepkg@options\csname usepkg@save@options\usepkg@rcrs\endcsname + \expandafter\let\expandafter\usepkg@date\csname usepkg@save@date\usepkg@rcrs\endcsname + \expandafter\let\expandafter\usepkg@at@end@of@package\csname usepkg@at@end@of@package\usepkg@rcrs\endcsname + \global\ece\let{usepkg@save@pkg\usepkg@rcrs}\undefined + \global\ece\let{usepkg@save@options\usepkg@rcrs}\undefined + \global\ece\let{usepkg@save@date\usepkg@rcrs}\undefined + \global\ece\let{usepkg@at@end@of@package\usepkg@rcrs}\undefined + \fi +}% +\def\usepkg@load@pkg#1{% + \def\usepkg@pkg{#1}% + \ifx\usepkg@pkg\usepkg@word@autopict + \testfileexistence[picture]{tex}% + \if@fileexists \else + \errmessage{Loader `picture.tex' for package `\usepkg@pkg' not found}% + \fi + \else + \ifx\usepkg@pkg\usepkg@word@psfrag + \testfileexistence[psfrag]{tex}% + \if@fileexists \else + \errmessage{Loader `psfrag.tex' for package `\usepkg@pkg' not found}% + \fi + \fi + \fi + \ifundefined{ver@\usepkg@pkg.sty}% + \expandafter\@finusepkg@load@pkg + \else + \immediate\write-1{^^J\linenumber Eplain: package `\usepkg@pkg' already + loaded, skipping reloading}% + \fi +}% +\def\@finusepkg@load@pkg{% + \testfileexistence[\usepkg@pkg]{sty}% + \if@fileexists \else + \errmessage{Package `\usepkg@pkg' not found}% + \fi + \expandafter\let\expandafter\temp\csname usepkg@options@\usepkg@pkg\endcsname + \ifx\temp\relax + \let\temp\empty + \fi + \ifx\temp\empty + \let\temp\usepkg@options + \else + \ifx\usepkg@options\empty \else + \edef\temp{\temp,\usepkg@options}% + \fi + \fi + \global\ece\let{usepkg@options@\usepkg@pkg}\temp + \let\usepackage\eplain@RequirePackage + \global\let\usepkg@at@end@of@package\empty + \ifx\usepkg@pkg\usepkg@word@autopict + \input picture.tex + \else + \ifx\usepkg@pkg\usepkg@word@psfrag + \input \usepkg@pkg.tex + \else + \input \usepkg@pkg.sty + \fi + \fi + \usepkg@at@end@of@package + \global\let\usepkg@at@end@of@package\empty + \let\usepackage\real@usepackage + \global\ece\let{usepkg@options@\usepkg@pkg}\undefined + \def\Url@HyperHook##1{\hlstart@impl{url}{\Url@String}##1\hlend@impl{url}}% +}% +\def\eplain@DeclareOption#1#2{% + \toks@{#2}% + \expandafter\xdef\csname usepkg@option@\usepkg@pkg @#1\endcsname{\the\toks@}% +}% +\def\eplain@PassOptionsToPackage#1#2{% + \ifempty{#1}\else + \for\usepkg@temp:=#2\do{% + \expandafter\let\expandafter\temp\csname usepkg@options@\usepkg@temp\endcsname + \ifx\temp\relax + \let\temp\empty + \fi + \ifx\temp\empty + \edef\temp{#1}% + \else + \edef\temp{\temp,#1}% + \fi + \global\ece\let{usepkg@options@\usepkg@temp}\temp + }% + \fi +}% +\def\usepkg@exec@options#1{% + \for\CurrentOption:=#1\do{% + \expandafter\let\expandafter\usepkg@temp + \csname usepkg@option@\usepkg@pkg @\CurrentOption\endcsname + \ifx\usepkg@temp\relax + \expandafter\let\expandafter\temp\csname usepkg@option@\usepkg@pkg @*\endcsname + \ifx\temp\relax + \errmessage{Unknown option `\CurrentOption' to package `\usepkg@pkg'}% + \else + \temp + \fi + \else + \usepkg@temp + \fi + }% +}% +\let\eplain@ExecuteOptions\usepkg@exec@options +\def\eplain@ProcessOptions{% + \expandafter\usepkg@exec@options\csname usepkg@options@\usepkg@pkg\endcsname +}% +\def\usepkg@accumulate@cmds#1#2{% + \toks@=\expandafter{#1}% + \toks@ii={#2}% + \xdef#1{\the\toks@\the\toks@ii}% +}% +\def\eplain@AtBeginDocument{\usepkg@accumulate@cmds\usepkg@at@begin@document}% +\def\eplain@AtEndOfPackage{\usepkg@accumulate@cmds\usepkg@at@end@of@package}% +\def\eplain@ProvidesPackage#1{% + \@ifnextchar[%] + {\eplain@pr@videpackage{#1.sty}}{\eplain@pr@videpackage#1[]}% +}% +\def\eplain@pr@videpackage#1[#2]{% + \wlog{#1: #2}% + \expandafter\xdef\csname ver@#1\endcsname{#2}% + \@ifl@t@r{#2}\usepkg@date{}% + {\message{Warning: you have requested package `\usepkg@pkg', version \usepkg@date,^^J + \@spaces but only version `\csname ver@#1\endcsname' is available.}}% +}% +\def\eplain@ProvidesFile#1{% + \@ifnextchar[%] + {\eplain@pr@videfile{#1}}{\eplain@pr@videfile#1[]}% +}% +\def\eplain@pr@videfile#1[#2]{% + \wlog{#1: #2}% + \expandafter\xdef\csname ver@#1\endcsname{#2}% +}% +\def\@ifl@ter#1#2{% + \expandafter\@ifl@t@r + \csname ver@#2.#1\endcsname +}% +\def\@ifl@t@r#1#2{% + \ifnum\expandafter\@parse@version#1//00\@nil<% + \expandafter\@parse@version#2//00\@nil + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi +}% +\def\@parse@version#1/#2/#3#4#5\@nil{#1#2#3#4 }% +\let\ttfamily\tt +\def\strip@prefix#1>{}% +\def\@ifpackageloaded#1{% + \expandafter\ifx\csname ver@#1.sty\endcsname\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi +}% +\long\def\g@addto@macro#1#2{% + \begingroup + \toks@\expandafter{#1#2}% + \xdef#1{\the\toks@}% + \endgroup +}% +\def\PackageWarning#1#2{% + \begingroup + \newlinechar=10 % + \def\MessageBreak{% + ^^J(#1)\@spaces\@spaces\@spaces\@spaces + }% + \immediate\write16{^^JPackage #1 Warning: #2\on@line.^^J}% + \endgroup +}% +\def\PackageWarningNoLine#1#2{% + \PackageWarning{#1}{#2\@gobble}% +}% +\def\on@line{ on input line \the\inputlineno}% +\def\@spaces{\space\space\space\space}% +\def\@inmatherr#1{% + \relax + \ifmmode + \errmessage{The command is invalid in math mode}% + \fi +}% +\let\protected@edef\edef +\let\wlog = \@plainwlog +\catcode`@ = \@eplainoldatcode +\def\fmtname{eplain}% +\def\eplain{t}% +{\edef\plainversion{\fmtversion}% + \xdef\fmtversion{3.9: 30 May 2019 (and plain \plainversion)}% +}% |