%% @texfile{ %% author = "Karl Berry", %% version = "2.6", %% date = "Mon May 2 07:48:18 EDT 1994", %% filename = "eplain.tex", %% email = "karl@cs.umb.edu", %% 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 = "opbibtex@cs.stanford.edu", %% 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 = "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 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 = "P.Taylor@Vax.Rhbnc.Ac.Uk (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%germany.csnet@relay.cs.net %%% %%% 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 % {\begingroup \c@tcodes = 13 \discr@tionaries }% \def \discr@tionaries #1% {\def \discr@ti@naries ##1#1% {\endgroup \def \discr@ti@n@ries ####1% or {\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% {\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% {\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)}% }%