%% @texfile{ %% author = "Karl Berry et al.", %% version = "1.9a", %% date = "28jul03", %% filename = "eplain.tex", %% email = "karl@cs.umb.edu", %% codetable = "ISO/ASCII", %% supported = "yes", %% docstring = "This file defines macros that expand on plain TeX, and %% is used in the production of the book TeX for the Impatient. It was %% originally version 1.9 from 11mar91, and differs only in this header %% material. Sadly, newer versions of eplain have more %% incompatibilities with the features we used to produce TFTI. Of %% course new documents should use the latest eplain, available from %% http://tug.org/eplain and from http://www.ctan.org/macros/eplain. %% ", %% } \def\makeactive#1{\catcode`#1 = \active \ignorespaces}% \chardef\letter = 11 \chardef\other = 12 \catcode`@ = \letter \def\uncatcodespecials{% \def\do##1{\catcode`##1 = \other}% \dospecials }% {% \makeactive\^^M \long\gdef\letreturn#1{\let^^M = #1}% }% \def\gobble#1{}% \def\gobbletwo#1#2{}% \def\gobblethree#1#2#3{}% \def\@gobblemeaning#1:->{}% \def\sanitize{\expandafter\@gobblemeaning\meaning}% \def\futurenonspacelet#1{\def\cs{#1}% \afterassignment\@stepone\let\nexttoken= }% \def\\{\let\@stoken= }% \\ % now \@stoken is a space token (\\ is a control symbol, so that \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= }% \let\@plainwlog = \wlog \let\wlog = \gobble \newlinechar = `^^J \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}% \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}% \begingroup \catcode`\{ = 12 \catcode`\} = 12 \catcode`\[ = 1 \catcode`\] = 2 \gdef\lbracechar[{]% \gdef\rbracechar[}]% \catcode`\% = \other \gdef\percentchar[%]\endgroup \def^^L{\par}% \let\@ifempty = \iffalse \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.99h", %% date = "24 Apr 1991", %% filename = "btxmac.tex", %% address = "Please use electronic mail", %% checksum = "812 4053 30557", %% email = "opbibtex@neon.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\@getoptionalarg#1{\let\temp = #1\futurelet\next\@bracketcheck}% \def\@bracketcheck{\begingroup \if [\next \aftergroup\@@getoptionalarg \else \global\let\@optionalarg = \empty \aftergroup\temp \fi \endgroup}% \def\@@getoptionalarg[#1]{% \def\@optionalarg{#1}% \temp }% \def\@tokstostring#1{\@ttsA#1 \@ttsmarkA}% \def\@ttsA#1 #2\@ttsmarkA{% \@ifempty{#1}\else \@ttsB #1\@ttsmarkB \@ifempty{#2}\else \@spacesub\@ttsA#2\@ttsmarkA \fi \fi }% \def\@ttsB#1{% \ifx #1\@ttsmarkB\else \string #1% \expandafter\@ttsB \fi }% \def\@ttsmarkB{\@ttsmarkB}% should never be expanded \def\@spacesub{+}% \def\@ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}% \def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}% \def\@emptymarkA{\@emptymarkA}% Again, so \ifx won't complain. \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 \def\bibliography#1{% \@readauxfile \@writeaux{\string\bibdata{#1}}% \@testfileexistence{bbl}% \if@fileexists \@readbblfile \fi }% \let\bibdata = \@gobble \def\nocite#1{% \@readauxfile \@writeaux{\string\citation{#1}}% }% \@innernewif\if@notfirstcitation \def\cite{\begingroup\catcode`_ = \@letter \@getoptionalarg\@cite}% \def\@cite#1{% \nocite{#1}% \printcitestart \@notfirstcitationfalse \@for \@citation :=#1\do {% \expandafter\@onecitation\@citation\@@ }% \ifx\empty\@optionalarg\else \printcitenote{\@optionalarg}% \fi \printcitefinish \endgroup }% \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 \nobreak\hskip0pt#1\nobreak\hskip0pt}}% \fi \csname\@citelabel{#1}\endcsname \@notfirstcitationtrue }% \def\@citelabel#1{\@tokstostring{b@#1}}% \def\@citedef#1{% \begingroup \@resetnumerals \@finishcitedef{#1}% }% \def\@finishcitedef#1#2{% \expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}% \endgroup }% \def\@resetnumerals{% \catcode`0 = \@other \catcode`1 = \@other \catcode`2 = \@other \catcode`3 = \@other \catcode`4 = \@other \catcode`5 = \@other \catcode`6 = \@other \catcode`7 = \@other \catcode`8 = \@other \catcode`9 = \@other \catcode`" = \@other \catcode`' = \@other \catcode`` = \@other \catcode`, = \@other \catcode`. = \@other }% \def\@readbblfile{% \@innernewcount\@itemnum \begingroup \def\begin##1##2{% \setbox0 = \hbox{\biblabelcontents{##2}}% \biblabelwidth = \wd0 }% \def\end##1{}% ##1 is `thebibliography' again. \@itemnum = 0 \def\bibitem{\futurelet\next\@bibitem}% \def\@bibitem{% \begingroup \if [\next \aftergroup\@alphabibitem \else \aftergroup\@numberedbibitem \fi \endgroup }% \def\@alphabibitem[##1]##2{% \expandafter \xdef\csname\@citelabel{##2}\endcsname {##1}% \@finishbibitem{##2}% }% \def\@numberedbibitem##1{% \advance\@itemnum by 1 \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}% \@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 \biblabelextrahang}% \bblrm \parskip = 1.5ex plus .5ex minus .5ex \biblabelextrahang = .5em \bblhook \input \jobname.bbl \endgroup }% \@innernewdimen\biblabelwidth \@innernewdimen\biblabelextrahang \def\biblabelprint#1{% \noindent\hbox to \biblabelwidth{\biblabelcontents{#1}\hss}\enspace}% \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}% \futurelet\@next\@continuenewcommand }% \def\@continuenewcommand{\begingroup \if [\@next \aftergroup\@newcommandwithargs \else \global\@numparams = 0 \aftergroup\@newcommand \fi \endgroup}% \def\@newcommandwithargs[#1]{% \global\@numparams = #1 \@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 \@setletters \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 \def\@setletters{% \count255 = 0 \edef\temp{\ifx\inputlineno\@undefined 128\else 256\fi}% \loop \ifnum\catcode\count255 = \@other \catcode\count255 = \@letter \fi \advance\count255 by 1 \ifnum\count255<\temp \repeat \catcode`\_ = \@letter }% \@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\getoptionalarg = \@getoptionalarg \let\ifempty = \@ifempty \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\tokstostring = \@tokstostring \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\ \def {\ }% \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{% \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 }% \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}% }% \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\null}% \def\LaTeX{L\kern -.26em \raise .6ex \hbox{\sevenrm A}\kern -.15em \TeX}% \def\AMSTeX{$\cal A\kern -.1667em \lower .5ex\hbox{$\cal M$}% \kern -.125em S$-\TeX }% \def\BibTeX{{\rm B\kern-.05em{\sevenrm I\kern-.025em B}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}% \font\mflogo = logo10 \def\MF{{\mflogo META}{\tenrm \-}{\mflogo FONT}}% \def\blackbox{\vrule height .8ex width .6ex depth -.2ex }% square bullet \def\makeblankbox#1#2{% \ifvoid0 \errmessage{Box 0 is void}% \errhelp = \@makeblankboxhelp \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% \dimen0=#1\advance\dimen0 by #2% \vrule width\dimen0 \kern-#2% }% \newdimen\boxitspace \boxitspace = 3pt \def\boxit#1{% \vbox{% \hrule \hbox{% \vrule \kern\boxitspace \vbox{\kern\boxitspace \parindent = 0pt #1\kern\boxitspace}% \kern\boxitspace \vrule }% \hrule }% }% \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 }% \def\environment#1{% \ifx\@groupname\@undefined\else \errhelp = \@unnamedendgrouphelp \errmessage{`\@groupname' was not closed by \string\endenvironment}% \fi \def\@groupname{#1}% \begingroup \let\@groupname = \@undefined }% \def\endenvironment#1{% \endgroup \def\@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\space 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 X, but^^J% you ended it with Y. Maybe you made a typo in one or the other^^J% of the names.}% \newif\ifenvironment \def\checkenv{\ifenvironment \errhelp = \@interwovenenvhelp \errmessage{Interwoven environments}% \endgroup \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.}% \newif\ifeqno \newif\ifleqno \def\eq{\the\@eqtoks}% \def\eqn{\the\@eqnotoks}% \newtoks\@eqtoks \newtoks\@eqnotoks \long\def\displaysetup#1$${% \@ddisplaytest#1\eqdef\eqdef\@ddisplaytest \expandafter\@displaytest\the\toks0\eqno\eqno\@displaytest }% \def\@removetrailingspaces#1 #2 \endmark{#1}% \long\def\@ddisplaytest#1\eqdef#2\eqdef#3\@ddisplaytest{% \if !\noexpand#3!% \toks0 = {#1}% \else \toks2 = {#1}% \begingroup \def\temp{\@removetrailingspaces #2}% \def\\{ }% \xdef\temp{{\expandafter\temp\\ \endmark}}% \endgroup \toks4 = \expandafter\expandafter\expandafter{\expandafter\eqdef\temp}% \edef\@setupeq{\toks0 = {\the\toks2 \the\toks4}}% \@setupeq \fi }% \long\def\@displaytest#1\eqno#2\eqno#3\@displaytest{% \if !\noexpand#3!% \@ldisplaytest#1\leqno\leqno\@ldisplaytest \else \eqnotrue \leqnofalse \@eqnotoks = {#2}% \@eqtoks = {#1}% \fi \generaldisplay$$% }% \long\def\@ldisplaytest#1\leqno#2\leqno#3\@ldisplaytest{% \@eqtoks = {#1}% \if !\noexpand#3!% \eqnofalse \else \eqnotrue \leqnotrue \@eqnotoks = {#2}% \fi }% \newdimen\leftdisplayindent \newtoks\previouseverydisplay \newtoks\displayhook \def\leftdisplays{% \previouseverydisplay = \everydisplay \everydisplay = {\the\previouseverydisplay \the\displayhook \displaysetup}% \def\generaldisplay{% \leftline{% \strut \indent \hskip\leftskip \hskip\leftdisplayindent \dimen0 = \parindent \advance\dimen0 by \leftskip \advance\dimen0 by \leftdisplayindent \advance\displaywidth by -\dimen0 \@redefinealignmentdisplays \ifeqno\ifleqno \kern-\dimen0\rlap{$\displaystyle\eqn$}\kern\dimen0 \fi\fi $\displaystyle\eq$% \ifeqno\ifleqno\else \hfill $\displaystyle\eqn$% \fi\fi }% }% }% \def\@redefinealignmentdisplays{% \def\displaylines##1{\displ@y \vcenter{% \let\oldeqprint = \eqprint \def\eqprint{\hfill\oldeqprint}% \halign{\hbox to\displaywidth{$\@lign\displaystyle####\hfil$}\crcr ##1\crcr}}}% \def\eqalignno##1{\displ@y \vcenter{% \halign to\displaywidth{% $\@lign\displaystyle{####}$\tabskip\z@skip &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering &\llap{$\@lign####$}\tabskip\z@skip\crcr ##1\crcr}}}% \def\leqalignno##1{\displ@y \vcenter{% \halign to\displaywidth{% $\@lign\displaystyle{####}$\tabskip\z@skip &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering &\kern-\displaywidth \rlap{\kern-\parindent\kern-\leftskip$\@lign####$}% \tabskip\displaywidth\crcr ##1\crcr}}}% }% \def\centereddisplays{\let\displaysetup = \relax}% \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}% \newskip\abovelistskip \abovelistskip = .5\baselineskip \newskip\interitemskip \interitemskip = 0pt \newskip\belowlistskip \belowlistskip = .5\baselineskip \newdimen\listleftindent \listleftindent = 0pt \newdimen\listrightindent \listrightindent = 0pt \def\listcompact{\interitemskip = 0pt \relax}% \newdimen\@listindent \def\beginlist{% \@listindent = \parindent \advance\@listindent by \listleftindent \everydisplay = \expandafter{\the\everydisplay \advance\displayindent by \@listindent \advance\displaywidth by -\@listindent \advance\displaywidth by -\listrightindent}% \nobreak\vskip\abovelistskip \advance\leftskip by \@listindent \advance\rightskip by \listrightindent }% \def\printitem{% \par \vskip-\parskip \noindent \llap{\marker \enspace}% }% \def\endlist{\vskip\belowlistskip}% \newcount\numberedlistdepth \newcount\itemnumber \newcount\itemletter \def\numberedmarker{% \ifcase\numberedlistdepth (impossible)% \or \itemnumberout)% \or \itemletterout)% \else *% \fi }% \def\numberedlist{\environment{@numbered-list}% \advance\numberedlistdepth by 1 \itemnumber = 1 \itemletter = `a \beginlist \let\marker = \numberedmarker \def\li{% \ifnum\itemnumber=1\else \vskip\interitemskip \fi \printitem \advance\itemnumber by 1 \advance\itemletter by 1 }% }% \def\itemnumberout{\number\itemnumber}% \def\itemletterout{\char\itemletter}% \def\endnumberedlist{% \par \endenvironment{@numbered-list}% \endlist }% \newcount\unorderedlistdepth \def\unorderedmarker{% \ifcase\unorderedlistdepth (impossible)% \or \blackbox \or ---% \else *% \fi }% \def\unorderedlist{\environment{@unordered-list}% \advance\unorderedlistdepth by 1 \beginlist \itemnumber = 1 \let\marker = \unorderedmarker \def\li{% \ifnum\itemnumber=1\else \vskip\interitemskip \fi \printitem \advance\itemnumber by 1 }% }% \def\endunorderedlist{% \par \endenvironment{@unordered-list}% \endlist }% \def\listing#1{% \par \begingroup \@setuplisting \setuplistinghook \input #1 \endgroup }% \let\setuplistinghook = \empty \def\@setuplisting{% \uncatcodespecials \obeywhitespace \makeactive\` \makeactive\^^I \def^^L{\vfill\eject}% \tt }% {% \makeactive\` \gdef`{\relax\lq}% Defeat ligatures. }% {% \makeactive\^^I \tt \gdef^^I{\hskip8\fontdimen2\font \relax}% }% \newif\if@tocfileopened \newwrite\tocfile \def\opentocfile{% \if@tocfileopened\else \global\@tocfileopenedtrue \immediate\openout\tocfile = \jobname.toc \fi }% \def\writetocentry#1#2{\writenumberedtocentry{#1}{#2}\empty}% \def\writenumberedtocentry#1#2#3{% \ifrewritetocfile \opentocfile \toks0 = {\expandafter\noexpand \csname toc#1entry\endcsname}% \def\temp{#2}% \def\cs{#3}% \edef\@wr{% \write\tocfile{% \the\toks0 {\sanitize\temp}% \ifx \empty\cs\else{#3}\fi {\noexpand\folio}% }% }% \@wr \fi \ignorespaces }% \newif\ifrewritetocfile \rewritetocfiletrue \def\readtocfile{% \testfileexistence{toc}% \if@fileexists \input \jobname.toc \ifrewritetocfile \opentocfile \fi \fi }% \def\tocchapterentry#1#2{\line{\bf #1 \dotfill\ #2}}% \def\tocsectionentry#1#2{\line{\quad\sl #1 \dotfill\ \rm #2}}% \def\tocsubsectionentry#1#2{\line{\qquad\rm #1 \dotfill\ #2}}% \def\xrdef#1{% \@readauxfile \begingroup \xrlabel{#1}% \edef\@wr{\@writexrdef{\the\xrlabeltoks}}% \@wr \endgroup \ignorespaces }% \def\@writexrdef#1{% \@writeaux{% \string\gdef\expandafter\string\csname#1\endcsname {\noexpand\folio}% }% }% \newtoks\xrlabeltoks \def\xrlabel#1{% \begingroup \escapechar = `\_ \edef\tts{\tokstostring{#1_}}% \global\xrlabeltoks = \expandafter{\tts}% \endgroup }% \let\ifxrefwarning = \iftrue \def\xrefwarningtrue{\@citewarningtrue \let\ifxrefwarning = \iftrue}% \def\xrefwarningfalse{\@citewarningfalse let\ifxrefwarning = \iffalse}% \def\xrefn#1{% \@readauxfile \xrlabel{#1}% \xrlabeltoks now has the control sequence name. \toks0 = \expandafter{\csname\the\xrlabeltoks\endcsname}% \expandafter \ifx\the\toks0\relax \if@citewarning \message{\linenumber Undefined label `\tokstostring{#1}'.}% \fi \begingroup \let\spacesub = \space \expandafter\xdef\the\toks0{`{\tt \tokstostring{#1}}'}% \endgroup \fi \the\toks0 % Always produce something. }% \def\xref#1{p.\thinspace\xrefn{#1}}% \newcount\eqnumber \def\eqdefn#1{% \@readauxfile \global\advance\eqnumber by 1 \begingroup \xrlabel{#1}% \xrlabeltoks now has the control sequence name. \edef\@wr{\@writeeqdef{\the\xrlabeltoks}{\the\eqnumber}}% \@wr \endgroup \expandafter\xdef\csname\the\xrlabeltoks\endcsname{\the\eqnumber}% \ignorespaces }% \def\@writeeqdef#1#2{% \immediatewriteaux{% \string\gdef\expandafter\string\csname#1\endcsname{#2}% }% }% \def\eqdef#1{% \@maybedisableeqno \eqno \eqdefn{#1}\eqprint{\the\eqnumber}% \@mayberestoreeqno \ignorespaces }% \let\@mayberestoreeqno = \empty \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 }% \def\eqref#1{% \@readauxfile \xrlabel{#1}% \xrlabeltoks now has the control sequence name. \toks0 = \expandafter{\csname\the\xrlabeltoks\endcsname}% \expandafter \ifx\the\toks0\relax \if@citewarning \message{\linenumber Undefined equation label `\tokstostring{#1}'.}% \fi \begingroup \let\spacesub = \space \expandafter\xdef\the\toks0{`{\tt \tokstostring{#1}}'}% \endgroup \fi \eqprint{\the\toks0}% }% \def\eqprint#1{(#1)}% \begingroup \catcode `\^^M = \active % \globaldefs = 1 % \def\flushleft{\beforejustify % \aftergroup\@endflushleft % \def^^M{\null\hfil\break}% \def\@eateol^^M{}% \@eateol % }% \def\flushright{\beforejustify % \aftergroup\@endflushright % \def^^M{\break\null\hfil}% \def\@eateol^^M{\hfil\null}% \@eateol % }% \def\center {\beforejustify % \aftergroup\@endcenter % \def^^M{\hfil\break\null\hfil}% \def\@eateol^^M{\hfil\null}% \@eateol % }% \endgroup \def\@endflushleft{\unpenalty{\parfillskip = 0pt plus 1 fil\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 plus 1fil \par}\ignorespaces }% \def\beforejustify{% \par\noindent \catcode`\^^M = \active \checkenv \environmenttrue }% \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 = 2true in \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 = {}% \the\everyfootnote \vskip\interfootnoteskip \indent\llap{#1\kern\footnotemarkseparation}\footstrut\futurelet\next\fo@t }% \def\footnoterule{\dimen0 = \footnoteruleheight \advance\dimen0 by \belowfootnoterulespace \kern-\dimen0 \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 \dimen0}% \def\@finishtopmargin{% \dimen2 = \voffset % Remember the old \voffset. \voffset = \dimen0 \advance\voffset by -1in \advance\dimen2 by -\voffset % Compute the change in \voffset. \advance\vsize by \dimen2 % Change type area accordingly. }% \def\advancetopmargin{% \dimen0 = 0pt \afterassignment\@finishadvancetopmargin \advance\dimen0 }% \def\@finishadvancetopmargin{% \advance\voffset by \dimen0 \advance\vsize by -\dimen0 }% \def\bottommargin{\afterassignment\@finishbottommargin \dimen0}% \def\@finishbottommargin{% \@computebottommargin % Result in \dimen2. \advance\dimen2 by -\dimen0 % Compute the change in the bottom margin. \advance\vsize by \dimen2 % Change the type area. }% \def\advancebottommargin{% \dimen0 = 0pt \afterassignment\@finishadvancebottommargin \advance\dimen0 }% \def\@finishadvancebottommargin{% \advance\vsize by -\dimen0 }% \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 \dimen0}% \def\@finishleftmargin{% \dimen2 = \hoffset % Remember the old \hoffset. \hoffset = \dimen0 \advance\hoffset by -1in \advance\dimen2 by -\hoffset % Compute the change in \hoffset. \advance\hsize by \dimen2 % Change type area accordingly. }% \def\advanceleftmargin{% \dimen0 = 0pt \afterassignment\@finishadvanceleftmargin \advance\dimen0 }% \def\@finishadvanceleftmargin{% \advance\hoffset by \dimen0 \advance\hsize by -\dimen0 }% \def\rightmargin{\afterassignment\@finishrightmargin \dimen0}% \def\@finishrightmargin{% \@computerightmargin % Result in \dimen2. \advance\dimen2 by -\dimen0 % Compute the change in the right margin. \advance\hsize by \dimen2 % Change the type area. }% \def\advancerightmargin{% \dimen0 = 0pt \afterassignment\@finishadvancerightmargin \advance\dimen0 }% \def\@finishadvancerightmargin{% \advance\hsize by -\dimen0 }% \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\abovedoublecolumnskip \abovedoublecolumnskip = \bigskipamount \newskip\belowdoublecolumnskip \belowdoublecolumnskip = \bigskipamount \newdimen\gutter \gutter = 2pc \newdimen\doublecolumnhsize \newbox\@partialpage \newdimen\singlecolumnhsize \newdimen\singlecolumnvsize \newtoks\previousoutput \def\doublecolumns{% \doublecolumnhsize = \hsize % If \hsize changed, get the new value. \par % Shouldn't start in horizontal mode. \previousoutput = \expandafter{\the\output}% \advance\doublecolumnhsize by -\gutter \divide\doublecolumnhsize by 2 \output = {% \global\setbox\@partialpage = \vbox{\unvbox255\vskip\abovedoublecolumnskip}% }% \pagegoal = \pagetotal \break % Now expand the \output just above. \output = {\doublecolumnoutput}% \singlecolumnhsize = \hsize \singlecolumnvsize = \vsize \hsize = \doublecolumnhsize \vsize = 2\vsize }% \def\@doublecolumnsplit{% \splittopskip = \topskip \splitmaxdepth = \maxdepth \dimen0 = \singlecolumnvsize \advance\dimen0 by -\ht\@partialpage \advance\dimen0 by -\ht\footins \ifvoid\footins\else \advance\dimen0 by -\skip\footins \fi \advance\dimen0 by -\ht\topins \ifvoid\topins\else \advance\dimen0 by -\skip\topins \fi \begingroup \vbadness = 10000 \global\setbox1 = \vsplit255 to \dimen0 \wd1 = \hsize \global\setbox3 = \vsplit255 to \dimen0 \wd3 = \hsize \endgroup \global\setbox4 = \vbox{\unvbox255 \penalty\outputpenalty}% \global\setbox255 = \vbox{% \unvbox\@partialpage \hbox to \singlecolumnhsize{\box1\hfil\box3}% }% }% \def\doublecolumnoutput{% \@doublecolumnsplit \hsize = \singlecolumnhsize % Local to the \output group. \vsize = \singlecolumnvsize \the\previousoutput \unvbox4 }% \def\singlecolumn{% \par % Shouldn't start in horizontal mode. \output = {\global\setbox1 = \box255}% \pagegoal = \pagetotal \break % Exercise the page builder, i.e., \output. \setbox255 = \box1 % Retrieve what the fake \output set. \begingroup \singlecolumnvsize = \ht\@partialpage \advance\singlecolumnvsize by \ht\footins \ifvoid\footins\else \advance\singlecolumnvsize by \skip\footins\fi \advance\singlecolumnvsize by \ht\topins \ifvoid\topins\else \advance\singlecolumnvsize by \skip\topins\fi \dimen0 = \ht255 \divide\dimen0 by 2 \advance\singlecolumnvsize by \dimen0 \advance\singlecolumnvsize by .5\baselineskip \@doublecolumnsplit \endgroup \hsize = \singlecolumnhsize \vsize = \singlecolumnvsize \output = \expandafter{\the\previousoutput}% \unvbox255 \vskip\belowdoublecolumnskip \nointerlineskip }% \let\wlog = \@plainwlog \catcode`@ = \other \def\fmtname{eplain}% \def\eplain{t}% {\edef\plainversion{\fmtversion}% \xdef\fmtversion{1.9: 26 April 1991 (and plain \plainversion)}% }%