%% @texfile{
%% author = "Karl Berry",
%% version = "2.6",
%% date = "Mon May 2 07:48:18 EDT 1994",
%% filename = "eplain.tex",
%% email = "[email protected]",
%% address = "135 Center Hill Rd. // Plymouth, MA 02360"
%% checksum = "2301 5656 77376",
%% codetable = "ISO/ASCII",
%% supported = "yes",
%% docstring = "This file defines macros that extend and expand on
%% plain TeX. eplain.tex is eplain.tex and the other
%% source files with comments stripped; see the original
%% files for author credits, etc. And please base diffs
%% or other contributions on eplain.tex, not the
%% stripped-down eplain.tex.",
%% }
\def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
\chardef\letter = 11
\chardef\other = 12
\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\ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}%
\def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
\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^^L{\par}%
\def\vpenalty{\ifhmode\par\fi \penalty}%
\def\hpenalty{\ifvmode\leavevmode\fi \penalty}%
\def\iterate{%
\let\next\relax
\body
\let\next\iterate
\fi
\next
}%
\def\edefappend#1#2{%
\toks@ = \expandafter{#1}%
\edef#1{\the\toks@ #2}%
}%
\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\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.99j",
%% date = "14 Mar 1992",
%% filename = "btxmac.tex",
%% address = "Please use electronic mail",
%% checksum = "834 4503 33061",
%% email = "[email protected]",
%% codetable = "ISO/ASCII",
%% 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
\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\@optionaltemp = #1%
\let\@optionalnext = \relax
\@futurenonspacelet\@optionalnext\@bracketcheck
}%
\def\@bracketcheck{%
\ifx [\@optionalnext
\expandafter\@@getoptionalarg
\else
\let\@optionalarg = \empty
\expandafter\@optionaltemp
\fi
}%
\def\@@getoptionalarg[#1]{%
\def\@optionalarg{#1}%
\@optionaltemp
}%
\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
\@printcitelabel{#1}%
\@notfirstcitationtrue
}%
\def\@printcitelabel#1{%
\csname\@citelabel{#1}\endcsname
}%
\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{%
\biblabelprint{\csname\@citelabel{##1}\endcsname}%
\@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
\ignorespaces
}%
\let\em = \bblem
\let\newblock = \bblnewblock
\let\sc = \bblsc
\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\bblsc{\ifx\@scfont\@undefined
\font\@scfont = cmcsc10
\fi
\@scfont
}%
\def\bblnewblock{\hskip .11em plus .33em minus .07em }%
\let\bblhook = \empty
\def\printcitestart{[}% left bracket
\def\printcitefinish{]}% right bracket
\def\printbetweencitations{, }% comma, space
\def\printcitenote#1{, #1}% comma, space, note (if it exists)
\let\citation = \@gobble
\@innernewcount\@numparams
\def\newcommand#1{%
\def\@commandname{#1}%
\@getoptionalarg\@continuenewcommand
}%
\def\@continuenewcommand{%
\@numparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
\@newcommand
}%
\def\@newcommand#1{%
\def\@startdef{\expandafter\edef\@commandname}%
\ifnum\@numparams=0
\let\@paramdef = \empty
\else
\ifnum\@numparams>9
\errmessage{\the\@numparams\space is too many parameters}%
\else
\ifnum\@numparams<0
\errmessage{\the\@numparams\space is too few parameters}%
\else
\edef\@paramdef{%
\ifcase\@numparams
\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\@startdef\@paramdef{#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
}%
\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{\unhbox0}%
\ifdim\wd2=0pt
\ignorespaces
\else
\box2 % 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.09",
%%% date = "16 March 1993",
%%% time = "10:08:05 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 = "15888 291 1374 12268",
%%% email = "[email protected] (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
%%%
%%% [email protected]
%%% 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 <[email protected]> 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.
%%%
%%% 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\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
%%% @texfile{
%%% author = "Philip Taylor",
%%% version = "3.04",
%%% date = "25 July 1992",
%%% time = "17:07 EDT",
%%% filename = "path.sty",
%%% address = "The Computer Centre
%%% RHBNC, University of London
%%% Egham Hill
%%% Egham, Surrey TW20 0EX, ENGLAND",
%%% telephone = "Tel: +44 784 443172",
%%% FAX = "Fax: +44 784 434348",
%%% checksum = "41143 321 1758 13526",
%%% email = "[email protected] (Internet)",
%%% 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; here are two examples:
%%%
%%% Friesland%rz.informatik.uni-hamburg.dbp.de%[email protected]
%%%
%%% 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
%%%
%%% \documentstyle[...,path,...]{...}
%%%
%%% 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.}
%%% }
\edef\path{\the\catcode`@}%
\catcode`@ = 11
\let\@oldatcatcode = \path
\newcount \c@tcode
\newcount \c@unter
\newif \ifspecialpathdelimiters
\begingroup
\catcode `\ = 10
\gdef \passivesp@ce { }%
\catcode `\ = 13\relax%
\gdef\activesp@ce{ }%
\endgroup
\def \discretionaries % <delim> <chars> <delim>
{\begingroup
\c@tcodes = 13
\discr@tionaries
}%
\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
}%
\let\pathafterhook = \relax
\def \path
{\ifspecialpathdelimiters
\begingroup
\c@tcodes = 12
\def \endp@th {\endgroup \endgroup \pathafterhook}%
\else
\def \endp@th {\endgroup \pathafterhook}%
\fi
\p@th
}%
\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
}%
\def \c@tcodes {\afterassignment \c@tc@des \c@tcode}%
\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
}%
\catcode `\@ = \@oldatcatcode
\discretionaries |~!@$%^&*()_+`-=#{}[]:";'<>,.?\/|%
\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
\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
\newdimen\leftdisplayindent
\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-\displayindent
$\aftergroup\@leftleqnoend
}%
\@redefinealignmentdisplays
\@leftdisplaystrue
\fi
}%
\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{%
\hbox to\displaywidth\bgroup
\strut
\dimen@ = \parindent
\advance\dimen@ by \leftdisplayindent
\advance\dimen@ by \leftskip
\hskip\dimen@
\advance\displayindent by \dimen@
\advance\displaywidth by -\parindent
\advance\displaywidth by -\leftdisplayindent
\advance\displaywidth by -\leftskip
$%
\advance\hsize by -\displayindent
\aftergroup\@lefteqend
\displaystyle
}%
\def\@lefteqend{\hfil\egroup$}% gets inserted between the ending $$
\def\@leftleqnoend{\hss \egroup$}%
\def\@redefinealignmentdisplays{%
\def\displaylines##1{\displ@y
\vcenter{%
\halign{\hbox to\displaywidth{$\@lign\displaystyle####\hfil$\hfil}\crcr
##1\crcr}}}%
\def\eqalignno##1{\displ@y
\let\noalign = \@lefteqalignonoalign
\vcenter{%
\halign to\displaywidth{%
\hfil $\@lign\displaystyle{####}$\tabskip\z@skip
&$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
&\llap{$\@lign####$}\tabskip\z@skip\crcr
##1\crcr}}}%
\def\leqalignno##1{\displ@y
\let\eqno = \relax
\vcenter{%
\halign to\displaywidth{%
\hfil$\@lign\displaystyle{####}$\tabskip\z@skip
&$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
&\kern-\displaywidth
\rlap{\kern-\displayindent $\@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{%
\ifx\@optionalarg\empty \else
\expandafter\writeitemxref\expandafter{\@optionalarg}%
\fi
\ifnum\itemnumber=1 \else \interitemskip \fi
\printitem
\advance\itemnumber by 1
\advance\itemletter by 1
\advance\itemromannumeral by 1
\ignorespaces
}%
\def\writeitemxref#1{\definexref{#1}\marker{item}}%
\def\printitem{%
\par
\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\listingfont{\tt}%
\def\@setuplisting{%
\uncatcodespecials
\obeywhitespace
\makeactive\`
\makeactive\^^I
\def^^L{\vfill\eject}%
\parskip = 0pt
\listingfont
}%
{%
\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
\obeywhitespace
\makeactive\` % make space character a single space, not stretchable
\@makeverbatimescapechar
\tt}
\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\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
\csname open#1file\endcsname
\toks0 = {\expandafter\noexpand \csname #1#2entry\endcsname}%
\def\temp{#3}%
\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\readcontentsfile#1{%
\edef\temp{%
\noexpand\testfileexistence[\csname #1filebasename\endcsname]{toc}%
}\temp
\if@fileexists
\input \csname #1filebasename\endcsname.#1\relax
\csname ifrewrite#1file\endcsname \csname open#1file\endcsname \endif
\fi
}%
\def\endif{\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}}%
\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{\definexref{#1}{\noexpand\folio}{page}}%
\def\definexref#1#2#3{%
\edef\temp{#1}%
\readauxfile
\edef\@wr{\noexpand\writeaux{\string\@definelabel{\temp}{#2}{#3}}}%
\@wr
\ignorespaces
}%
\def\@definelabel#1#2#3{%
\expandafter\gdef\csname\xrlabel{#1}\endcsname{#2}%
\global\setproperty{\xrlabel{#1}}{class}{#3}%
}%
\def\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\xref{p.\thinspace\xrefn}%
\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{\@generalref{}}%
\def\refs{\@generalref s}%
\def\@generalref#1#2{%
\readauxfile
\edef\temp{\getproperty{\xrlabel{#2}}{class}}%
\expandafter\ifx\csname \temp word\endcsname\relax \else
\csname \temp word\endcsname
#1\penalty\@M \
\fi
\refn{#2}%
}%
\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{\noexpand\@optionalarg}%
\fi
\global\subeqnumber = 0
\gdef\@currenteqlabel{#1}%
\toks0 = \expandafter{\@currenteqlabel}%
\begingroup
\def\eqrefn{\noexpand\eqrefn}%
\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\eqrefn}%
\def\eqsubreftext{\noexpand\eqsubreftext}%
\edef\temp{%
\noexpand\@eqdefn
{\the\toks0}%
{\eqsubreftext{\eqrefn{\the\toks2}}{\the\subeqnumber}}%
}%
\temp
\endgroup
}%
\def\@eqdefn#1#2{%
\definexref{#1}{#2}{eq}%
\@definelabel{#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{%
#1{#2}% Define the label.
\@maybedisableeqno
\eqno \eqref{#2}% Print the text.
\@mayberestoreeqno
\ignorespaces
}%
\let\@mayberestoreeqno = \relax
\def\@maybedisableeqno{%
\ifinner
\global\let\eqno = \relax
\global\let\@mayberestoreeqno = \@restoreeqno
\fi
}%
\let\@primitiveeqno = \eqno
\def\@restoreeqno{%
\global\let\eqno = \@primitiveeqno
\global\let\@mayberestoreeqno = \empty
}%
\let\eqrefn = \xrefn
\def\eqref#1{\eqprint{\eqrefn{#1}}}%
\let\eqconstruct = \identity
\def\eqprint#1{(#1)}%
\def\eqsubreftext#1#2{#1.#2}%
\let\extraidxcmdsuffixes = \empty
\outer\def\defineindex#1{%
\def\@idxprefix{#1}%
\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 indexfileopened\endcsname \else
\expandafter\immediate\openout\csname @\@idxprefix indexfile\endcsname =
\indexfilebasename.\@idxprefix dx
\expandafter\global\csname @\@idxprefix indexfileopenedtrue\endcsname
\fi
\def\temp{#1}%
\edef\@wr{%
\expandafter\write\csname @\@idxprefix indexfile\endcsname{%
\string\indexentry
{\sanitize\temp}%
{\noexpand#2}%
}%
}%
\@wr
\ifindexproofing \insert\@indexproof{\indexproofterm{#1}}\fi
\hookrun{afterindexterm}%
\ifsilentindexentry \expandafter\ignorespaces\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{%
\indexproofunbox
\@plainmakeheadline
}%
\def\indexsetmargins{%
\ifx\undefined\outsidemargin
\dimen@ = 1in
\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}%
}%
\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
\let\@idxseenterm = \relax
\def\idxpagemarkupcmdword{pagemarkup}%
\let\@idxpagemarkup = \relax
\def\@idxgetrange#1{%
\let\@idxrangestr = \empty
\let\@afteridxgetrange = #1%
\@getoptionalarg\@finidxgetopt
}%
\def\@finidxgetopt{%
\for\@idxarg:=\@optionalarg\do{%
\expandafter\@idxcheckpagemarkup\@idxarg=,%
\ifx\@idxarg\idxrangebeginword
\def\@idxrangestr{\idxencapoperator\idxbeginrangemark}%
\else
\ifx\@idxarg\idxrangeendword
\def\@idxrangestr{\idxencapoperator\idxendrangemark}%
\else
\ifx\@idxarg\idxseecmdword
\def\@idxpagemarkup{indexsee}%
\@idxseetrue
\else
\ifx\@idxarg\idxseealsocmdword
\def\@idxpagemarkup{indexseealso}%
\@idxseetrue
\else
\ifx\@idxpagemarkup\relax
\errmessage{Unrecognized index option `\@idxarg'}%
\fi
\fi
\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\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\@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@ \idxencapoperator \@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\@idx#1{%
#1% Produce TERM as output.
\@idxcollect{#1}{}%
}%
\def\@sidx#1{\@idxmaintoks = {#1}\@getoptionalarg\@finsidx}%
\def\@finsidx{%
\@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#2{%
#1{#2}% Produce \CS{TERM} as output.
\@idxconstructmarked\@idxmaintoks{#1}{#2}%
\@idxsubtoks = {}%
\@idxtokscollect
}%
\def\@sidxmarked#1#2{%
\@idxconstructmarked\toks@{#1}{#2}%
\edef\temp{{\the\toks@}}%
\expandafter\@sidx\temp
}%
\def\@idxsubmarked#1#2#3{%
#1 #2{#3}% produce `TERM \CS{SUBTERM} as output.
\@sidxsubmarked{#1}{#2}{#3}%
}%
\def\@sidxsubmarked#1#2#3{%
\@idxmaintoks = {#1}%
\@idxconstructmarked\@idxsubtoks{#2}{#3}%
\@idxtokscollect
}%
\def\idxnameseparator{, }% as in `Tachikawa, Elizabeth'
\def\@idxcollectname#1#2{%
\def\temp{#1}%
\ifx\temp\empty
\toks@ = {}%
\else
\toks@ = {\idxnameseparator #1}%
\fi
\toks2 = {#2}%
\edef\temp{\the\toks2 \the\toks@}%
}%
\def\@idxname#1#2{%
#1 #2% Separate the names by a space in the output.
\@idxcollectname{#1}{#2}%
\expandafter\@idxcollect\expandafter{\temp}{}%
}%
\def\@sidxname#1#2{%
\@idxcollectname{#1}{#2}%
\expandafter\@sidx\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#1#2{{\seevariant \indexseeword\ }#1}%
\def\indexseealsowords{see also}%
\def\indexseealso#1#2{{\seevariant \indexseealsowords\ }#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
}%
\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 #2
\advance\@columndepth by -1
\divide \@columndepth by #2
\@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
\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\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{#1\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
\@plainfootnote{$^{\number\footnotenumber}$}%
}%
\newdimen\paperheight \paperheight = 11in
\def\topmargin{\afterassignment\@finishtopmargin \dimen@}%
\def\@finishtopmargin{%
\dimen2 = \voffset % Remember the old \voffset.
\voffset = \dimen@ \advance\voffset by -1in
\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 -1in % Less the default offset.
}%
\newdimen\paperwidth \paperwidth = 8.5in
\def\leftmargin{\afterassignment\@finishleftmargin \dimen@}%
\def\@finishleftmargin{%
\dimen2 = \hoffset % Remember the old \hoffset.
\hoffset = \dimen@ \advance\hoffset by -1in
\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 -1in % Less the default offset.
}%
\newskip\abovecolumnskip \abovecolumnskip = \bigskipamount
\newskip\belowcolumnskip \belowcolumnskip = \bigskipamount
\newdimen\gutter \gutter = 2pc
\newbox\@partialpage
\newdimen\@columnhsize
\newdimen\@normalhsize
\newdimen\@normalvsize
\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}%
\let\endcolumns = \singlecolumn
\let\@ndcolumns = \relax
\chardef\@numcolumns = 1
\def\@columns#1{%
\@ndcolumns
\let\@ndcolumns = \@endcolumns
\chardef\@numcolumns = #1
\par % Shouldn't start in horizontal mode.
\previousoutput = \expandafter{\the\output}%
\@columnhsize = \hsize
\count@ = \@numcolumns
\advance\count@ by -1
\advance\@columnhsize by -\count@\gutter
\divide\@columnhsize by \@numcolumns
\output = {\global\setbox\@partialpage =
\vbox{\unvbox255\vskip\abovecolumnskip}%
}%
\pagegoal = \pagetotal
\eject
\output = {\@columnoutput}%
\@normalhsize = \hsize
\@normalvsize = \vsize
\hsize = \@columnhsize
\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
}%
\def\@columnsplit{%
\splittopskip = \topskip
\splitmaxdepth = \baselineskip
\dimen@ = \ht255
\divide\dimen@ by \@numcolumns
\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\box3}%
\or \hbox to \@normalhsize{\box1\hfil\box3\hfil\box5}%
\or \hbox to \@normalhsize{\box1\hfil\box3\hfil\box5\hfil\box7}%
\fi
}%
\setbox\@partialpage = \box0
}%
\def\@columnoutput{%
\@columnsplit
\hsize = \@normalhsize % Local to \output's group.
\vsize = \@normalvsize
\the\previousoutput
\unvbox\@partialpage
\penalty\outputpenalty
\global\vsize = \@numcolumns\@normalvsize
}%
\def\singlecolumn{%
\@ndcolumns
\chardef\@numcolumns = 1
\vskip\belowcolumnskip
\nointerlineskip
}%
\def\@endcolumns{%
\global\let\@ndcolumns = \relax
\par % Shouldn't start in horizontal mode.
\global\output = {\global\setbox1 = \box255}%
\pagegoal = \pagetotal
\eject % Exercise the page builder, i.e., \output.
\global\setbox255 = \box1 % Retrieve what the fake \output set.
\@columnsplit
\global\vsize = \@normalvsize
\global\hsize = \@normalhsize
\global\output = \expandafter{\the\previousoutput}%
\ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi
\unvbox255
}%
\def\columnfill{%
\dimen@ = \@normalvsize
\advance\dimen@ by -\pagetotal
\kern\dimen@
}
\let\wlog = \@plainwlog
\catcode`@ = \@eplainoldatcode
\def\fmtname{eplain}%
\def\eplain{t}%
{\edef\plainversion{\fmtversion}%
\xdef\fmtversion{2.6: 2 May 1994 (and plain \plainversion)}%
}%
|