%% @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)}%
}%
