% File LPLAIN - Created 29 October 1985 from plain version 1.5CM
% - Last modified 20 October 1988 to take into account
% changes to PLAIN.TEX reported by Arthur Ogawa
% - Modified February 8, 1990 by Dominik Wujastyk to
% match the PLAIN.TEX meant for TeX 3.0 (\fmtname{plain},
% \fmtversion{3.0}).
% - Modified March 15, 1990 by Frank Mittelbach to
% allow the use of this file both in TeX 2 and 3
%
% This is the LaTeX version of the plain TeX format that's described in
% The TeXbook. All modifications can be found by searching for
% the word 'LaTeX'.
% N.B.: A version number is defined at the very end of this file;
% please change that number whenever the file is modified!
% And don't modify the file under any circumstances.
%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
\catcode`\{=1 % left brace is begin-group character
\catcode`\}=2 % right brace is end-group character
\catcode`\$=3 % dollar sign is math shift
\catcode`\&=4 % ampersand is alignment tab
\catcode`\#=6 % hash mark is macro parameter character
\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts
\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts
\catcode`\^^I=10 % ascii tab is a blank space
\chardef\active=13 \catcode`\~=\active % tilde is active
\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par"
\message{Preloading the plain format: codes,}
% We had to define the \catcodes right away, before the message line,
% since \message uses the { and } characters.
% When INITEX (the TeX initializer) starts up,
% it has defined the following \catcode values:
% \catcode`\^^@=9 % ascii null is ignored
% \catcode`\^^M=5 % ascii return is end-line
% \catcode`\\=0 % backslash is TeX escape character
% \catcode`\%=14 % percent sign is comment character
% \catcode`\ =10 % ascii space is blank space
% \catcode`\^^?=15 % ascii delete is invalid
% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
% all others are type 12 (other)
% Here is a list of the characters that have been specially catcoded:
\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
\do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
% (not counting ascii null, tab, linefeed, formfeed, return, delete)
% Each symbol in the list is preceded by \do, which can be defined
% if you want to do something to every item in the list.
% We make @ signs act like letters, temporarily, to avoid conflict
% between user names and internal control sequences of plain format.
\catcode`@=11
% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x,
% and \lccode`x=`x, \lccode`X=`x; all other values are zero.
% No changes to those tables are needed in plain TeX format.
% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999
% for uppercase letters. The following changes are needed:
\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0
% The \nonfrenchspacing macro will make further changes to \sfcode values.
% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
\delcode`\(="028300
\delcode`\)="029301
\delcode`\[="05B302
\delcode`\]="05D303
\delcode`\<="26830A
\delcode`\>="26930B
\delcode`\/="02F30E
\delcode`\|="26A30C
\delcode`\\="26E30F
% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
% To make the plain macros more efficient in time and space,
% several constant values are declared here as control sequences.
% If they were changed, anything could happen; so they are private symbols.
\chardef\@ne=1
\chardef\tw@=2
\chardef\thr@@=3
\chardef\sixt@@n=16
\chardef\@cclv=255
\mathchardef\@cclvi=256
\mathchardef\@m=1000
\mathchardef\@M=10000
\mathchardef\@MM=20000
% Allocation of registers
% Here are macros for the automatic allocation of \count, \box, \dimen,
% \skip, \muskip, and \toks registers, as well as \read and \write
% stream numbers, \fam codes, \language codes, and \insert numbers.
\message{registers,}
% When a register is used only temporarily, it need not be allocated;
% grouping can be used, making the value previously in the register return
% after the close of the group. The main use of these macros is for
% registers that are defined by one macro and used by others, possibly at
% different nesting levels. All such registers should be defined through
% these macros; otherwise conflicts may occur, especially when two or more
% more macro packages are being used at once.
% The following counters are reserved:
% 0 to 9 page numbering
% 10 count allocation
% 11 dimen allocation
% 12 skip allocation
% 13 muskip allocation
% 14 box allocation
% 15 toks allocation
% 16 read file allocation
% 17 write file allocation
% 18 math family allocation
% 19 language allocation
% 20 insert allocation
% 21 the most recently allocated number
% 22 constant -1
% New counters are allocated starting with 23, 24, etc. Other registers are
% allocated starting with 10. This leaves 0 through 9 for the user to play
% with safely, except that counts 0 to 9 are considered to be the page and
% subpage numbers (since they are displayed during output). In this scheme,
% \count 10 always contains the number of the highest-numbered counter that
% has been allocated, \count 14 the highest-numbered box, etc.
% Inserts are given numbers 254, 253, etc., since they require a \count,
% \dimen, \skip, and \box all with the same number; \count 19 contains the
% lowest-numbered insert that has been allocated. Of course, \box255 is
% reserved for \output; \count255, \dimen255, and \skip255 can be used freely.
% It is recommended that macro designers always use
% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and
% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255.
% This will prevent ``save stack buildup'' that might otherwise occur.
% Here are abbreviations for the names of scratch registers
% that don't need to be allocated.
\countdef\count@=255
\dimendef\dimen@=0
\dimendef\dimen@i=1 % global only
\dimendef\dimen@ii=2
\skipdef\skip@=0
\toksdef\toks@=0
% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo
% and \foo will be defined (with \countdef) to be the next counter.
% To find out which counter \foo is, you can look at \allocationnumber.
% Since there's no \boxdef command, \chardef is used to define a \newbox,
% \newinsert, \newfam, and so on.
% LaTeX change: remove \outer from \newcount and \newdimen (FMi)
% This is necessary to use \newcount inside \if...
% later on.
\def\newcount{\alloc@0\count\countdef\insc@unt}
\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi}
\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
\ch@ck#1#4#2% make sure there's still room
\allocationnumber=\count1#1%
\global#3#5=\allocationnumber
\wlog{\string#5=\string#2\the\allocationnumber}}
\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
\ch@ck0\insc@unt\count
\ch@ck1\insc@unt\dimen
\ch@ck2\insc@unt\skip
\ch@ck4\insc@unt\box
\allocationnumber=\insc@unt
\global\chardef#1=\allocationnumber
\wlog{\string#1=\string\insert\the\allocationnumber}}
\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
\else\errmessage{No room for a new #3}\fi}
% Here are some examples of allocation.
\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow
% LaTeX change: the PLAIN \centering dimension conflicts with
% LaTeX's \centering command, so it is redefined to \@centering.
% This dimension is used by LaTeX.
\newskip\@centering \@centering=0pt plus 1000pt minus 1000pt
\newdimen\p@ \p@=1pt % this saves macro space and time
\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
\newskip\z@skip \z@skip=0pt plus0pt minus0pt
\newbox\voidb@x % permanently void box register
% And here's a different sort of allocation:
% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
\expandafter\expandafter\expandafter
\edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
\expandafter\expandafter\expandafter
\edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
\@if#1{false}\escapechar\count@} % the condition starts out false
\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
\message{setting up things for TeX 3.0, }
% If this file is used in an old TeX we define the new features
% of TeX 3.0 as simple macros or counters so that files that uses
% these features can be processed in such an environment
% (They will however produce some other results).
\ifx\undefined\inputlineno
\newcount\inputlineno
\inputlineno-1 % this could be used to detect that
% an old TeX is in force
\newcount\language
\newcount\lefthyphenmin
\newcount\righthyphenmin
\newcount\errorcontextlines
\newcount\holdinginserts
\newdimen\emergencystretch
\newcount\badness
\let\noboundary\relax
\newcount\setlanguage
\fi
% Assign initial values to TeX's parameters
\message{parameters,}
% All of TeX's numeric parameters are listed here,
% but the code is commented out if no special value needs to be set.
% INITEX makes all parameters zero except where noted.
\pretolerance=100
\tolerance=200 % INITEX sets this to 10000
\hbadness=1000
\vbadness=1000
\linepenalty=10
\hyphenpenalty=50
\exhyphenpenalty=50
\binoppenalty=700
\relpenalty=500
\clubpenalty=150
\widowpenalty=150
\displaywidowpenalty=50
\brokenpenalty=100
\predisplaypenalty=10000
% \postdisplaypenalty=0
% \interlinepenalty=0
% \floatingpenalty=0, set during \insert
% \outputpenalty=0, set before TeX enters \output
\doublehyphendemerits=10000
\finalhyphendemerits=5000
\adjdemerits=10000
% \looseness=0, cleared by TeX after each paragraph
% \pausing=0
% \holdinginserts=0
% \tracingonline=0
% \tracingmacros=0
% \tracingstats=0
% \tracingparagraphs=0
% \tracingpages=0
% \tracingoutput=0
\tracinglostchars=1
% \tracingcommands=0
% \tracingrestores=0
% \language=0
\uchyph=1
% \lefthyphenmin=2 \righthyphenmin=3 set below
% \globaldefs=0
% \maxdeadcycles=25 % INITEX does this
% \hangafter=1 % INITEX does this, also TeX after each paragraph
% \fam=0
% \mag=1000 % INITEX does this
% \escapechar=`\\ % INITEX does this
\defaulthyphenchar=`\-
\defaultskewchar=-1
% \endlinechar=`\^^M % INITEX does this
\newlinechar=-1
\delimiterfactor=901
% \time=now % TeX does this at beginning of job
% \day=now % TeX does this at beginning of job
% \month=now % TeX does this at beginning of job
% \year=now % TeX does this at beginning of job
\showboxbreadth=5
\showboxdepth=3
\errorcontextlines=5
\hfuzz=0.1pt
\vfuzz=0.1pt
\overfullrule=5pt
\hsize=6.5in
\vsize=8.9in
\maxdepth=4pt
\splitmaxdepth=\maxdimen
\boxmaxdepth=\maxdimen
% \lineskiplimit=0pt, changed by \normalbaselines
\delimitershortfall=5pt
\nulldelimiterspace=1.2pt
\scriptspace=0.5pt
% \mathsurround=0pt
% \predisplaysize=0pt, set before TeX enters $$
% \displaywidth=0pt, set before TeX enters $$
% \displayindent=0pt, set before TeX enters $$
\parindent=20pt
% \hangindent=0pt, zeroed by TeX after each paragraph
% \hoffset=0pt
% \voffset=0pt
% \baselineskip=0pt, changed by \normalbaselines
% \lineskip=0pt, changed by \normalbaselines
\parskip=0pt plus 1pt
\abovedisplayskip=12pt plus 3pt minus 9pt
\abovedisplayshortskip=0pt plus 3pt
\belowdisplayskip=12pt plus 3pt minus 9pt
\belowdisplayshortskip=7pt plus 3pt minus 4pt
% \leftskip=0pt
% \rightskip=0pt
\topskip=10pt
\splittopskip=10pt
% \tabskip=0pt
% \spaceskip=0pt
% \xspaceskip=0pt
\parfillskip=0pt plus 1fil
\thinmuskip=3mu
\medmuskip=4mu plus 2mu minus 4mu
\thickmuskip=5mu plus 5mu
% We also define special registers that function like parameters:
\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt
\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt
\newskip\normalbaselineskip \normalbaselineskip=12pt
\newskip\normallineskip \normallineskip=1pt
\newdimen\normallineskiplimit \normallineskiplimit=0pt
\newdimen\jot \jot=3pt
\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
% Fonts assigned to \preloaded are not part of "plain TeX",
% but they are preloaded so that other format packages can use them.
% For example, if another set of macros says "\font\ninerm=cmr9",
% TeX will not have to reload the font metric information for cmr9.
% LaTeX font definitions are taken from the file LFONTS.TEX,
% so all of PLAIN's font definitions are commented out.
%\message{fonts,}
%
%\font\tenrm=cmr10 % roman text
%\font\preloaded=cmr9
%\font\preloaded=cmr8
%\font\sevenrm=cmr7
%\font\preloaded=cmr6
%\font\fiverm=cmr5
%
%\font\teni=cmmi10 % math italic
%\font\preloaded=cmmi9
%\font\preloaded=cmmi8
%\font\seveni=cmmi7
%\font\preloaded=cmmi6
%\font\fivei=cmmi5
%
%\font\tensy=cmsy10 % math symbols
%\font\preloaded=cmsy9
%\font\preloaded=cmsy8
%\font\sevensy=cmsy7
%\font\preloaded=cmsy6
%\font\fivesy=cmsy5
%
%\font\tenex=cmex10 % math extension
%
%\font\preloaded=cmss10 % sans serif
%\font\preloaded=cmssq8
%
%\font\preloaded=cmssi10 % sans serif italic
%\font\preloaded=cmssqi8
%
%\font\tenbf=cmbx10 % boldface extended
%\font\preloaded=cmbx9
%\font\preloaded=cmbx8
%\font\sevenbf=cmbx7
%\font\preloaded=cmbx6
%\font\fivebf=cmbx5
%
%\font\tentt=cmtt10 % typewriter
%\font\preloaded=cmtt9
%\font\preloaded=cmtt8
%
%\font\preloaded=cmsltt10 % slanted typewriter
%
%\font\tensl=cmsl10 % slanted roman
%\font\preloaded=cmsl9
%\font\preloaded=cmsl8
%
%\font\tenit=cmti10 % text italic
%\font\preloaded=cmti9
%\font\preloaded=cmti8
%\font\preloaded=cmti7
%
%\message{more fonts,}
%\font\preloaded=cmu10 % unslanted text italic
%
%\font\preloaded=cmmib10 % bold math italic
%\font\preloaded=cmbsy10 % bold math symbols
%
%\font\preloaded=cmcsc10 % caps and small caps
%
%\font\preloaded=cmssbx10 % sans serif bold extended
%
%\font\preloaded=cmdunh10 % Dunhill style
%
%\font\preloaded=cmr7 scaled \magstep4 % for titles
%\font\preloaded=cmtt10 scaled \magstep2
%\font\preloaded=cmssbx10 scaled \magstep2
%
%\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols
%
%% Additional \preloaded fonts can be specified here.
%% (And those that were \preloaded above can be eliminated.)
%
%\let\preloaded=\undefined % preloaded fonts must be declared anew later.
%
%\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177
%\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60
%
%\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
%\def\rm{\fam\z@\tenrm}
%\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
%\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni}
%\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
%\def\cal{\fam\tw@}
%\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
%\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4
%\textfont\itfam=\tenit
%\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5
%\textfont\slfam=\tensl
%\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6
%\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
%\scriptscriptfont\bffam=\fivebf
%\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7
%\textfont\ttfam=\tentt
% Macros for setting ordinary text
\message{macros,}
% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
{\catcode`\^^M=\active % these lines must end with %
\gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
\global\let^^M\par} % this is in case ^^M appears in a \write
\def\obeyspaces{\catcode`\ \active}
{\obeyspaces\global\let =\space}
\def\loop#1\repeat{\def\body{#1}\iterate}
\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
\let\repeat=\fi % this makes \loop...\if...\repeat skippable
\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out
\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign
\newcount\mscount
\def\multispan#1{\omit \mscount#1
\loop\ifnum\mscount>\@ne \sp@n\repeat}
\def\sp@n{\span\omit\advance\mscount\m@ne}
% LaTeX has its own tabbing environment, so PLAIN's is disabled.
%
%\newif\ifus@ \newif\if@cr
%\newbox\tabs \newbox\tabsyet \newbox\tabsdone
%
%\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
%\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
%\let\+=\relax % in case this file is being read in twice
%\def\sett@b{\ifx\next\+\let\next\relax
% \def\next{\afterassignment\s@tt@b\let\next}%
% \else\let\next\s@tcols\fi\next}
%\def\s@tt@b{\let\next\relax\us@false\m@ketabbox}
%\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
%\outer\def\+{\tabalign}
%\def\s@tcols#1\columns{\count@#1 \dimen@\hsize
% \loop\ifnum\count@>\z@ \@nother \repeat}
%\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
% \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
% \advance\dimen@-\dimen@ii \advance\count@\m@ne}
%
%\def\m@ketabbox{\begingroup
% \global\setbox\tabsyet\copy\tabs
% \global\setbox\tabsdone\null
% \def\cr{\@crtrue\crcr\egroup\egroup
% \ifus@\unvbox\z@\lastbox\fi\endgroup
% \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
% \setbox\z@\vbox\bgroup\@crfalse
% \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
%
%\def\t@bbox{\setbox\z@\hbox\bgroup}
%\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
% \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
% \global\setbox\@ne\lastbox}% now \box\@ne holds its size
% \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
% \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
% \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
% \box\z@}
% LaTeX has its own sectioning macros
%\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250
% \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip
% \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}
\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only
\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex%
\ialign{##\crcr#1\crcr}}} % put characters over each other
\def\ooalign{\lineskiplimit-\maxdimen \oalign}
% LaTeX change: \d, \b, \c redefined to work in a moving argument.
\def\pd#1{\oalign{#1\crcr\hidewidth.\hidewidth}}
\def\d{\protect\pd}
\def\pc#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1%
\else{\ooalign{\hidewidth\char24\hidewidth\crcr\unhbox\z@}}\fi}
\def\c{\protect\pc}
% end of LaTeX change to \d, \b, \c
\def\`#1{{\accent18 #1}}
\def\'#1{{\accent19 #1}}
\def\v#1{{\accent20 #1}} \let\^^_=\v
\def\u#1{{\accent21 #1}} \let\^^S=\u
\def\=#1{{\accent22 #1}}
\def\^#1{{\accent94 #1}} \let\^^D=\^
\def\.#1{{\accent95 #1}}
\def\H#1{{\accent"7D #1}}
\def\~#1{{\accent"7E #1}}
%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the following:
\def\"#1{\dirtyumlaut#1}
\input def_umlaut
% LaTeX change: Make \t work in a moving argument.
\def\pt#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
\def\t{\protect\pt}
% LaTeX change: \kern\z@ added to end of \hrulefill and \dotfill
% to make them work in `tabular' and `array' environments.
% (Change made 24 July 1987).
\def\hrulefill{\leaders\hrule\hfill\kern\z@}
\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill\kern\z@}
\def\joinrel{\mathrel{\mkern-3mu}}
\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
\def\Relbar{\mathrel=}
\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow}
\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook}
\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
\def\models{\mathrel|\joinrel=}
\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
% LaTeX Change: \longrightarrow and \longleftarrow redefined to make
% then robust.
\def\longrightarrow{\protect\@lra}
\def\@lra{\relbar\joinrel\rightarrow}
\def\longleftarrow{\protect\@lla}
\def\@lla{\leftarrow\joinrel\relbar}
% End of LaTeX change to \longrightarrow and \longleftarrow
\mathchardef\ldotp="613A % ldot as a punctuation mark
\mathchardef\cdotp="6201 % cdot as a punctuation mark
\mathchardef\colon="603A % colon as a punctuation mark
% LaTeX change: make \ldots work outside math mode too.
\def\@ldots{\mathinner{\ldotp\ldotp\ldotp}}
\def\ldots{\protect\pldots}
\def\pldots{\relax\ifmmode\@ldots\else\mbox{$\@ldots\,$}\fi}
% End of LaTeX change to \ldots
% LaTeX change: \eqalign eliminated, since it is replaced by the
% eqnarray environment.
%
%\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th
% \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
% \crcr#1\crcr}}\,}
% LaTeX: The following \eqalign type macros are eliminated, since
% they are replaced by the eqnarray environment.
%
%\def\eqalignno#1{\displ@y \tabskip\centering
% \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 \tabskip\centering
% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
% &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
% #1\crcr}}
% Definitions related to output
% LaTeX uses its own output routine
%
%\message{output routines,}
%
%\countdef\pageno=0 \pageno=1 % first page is number 1
%\newtoks\headline \headline={\hfil} % headline is normally blank
%\newtoks\footline \footline={\hss\tenrm\folio\hss}
% % footline is normally a centered page number in font \tenrm
%\newif\ifr@ggedbottom
%\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
%\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom
%\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
%\def\nopagenumbers{\footline{\hfil}} % blank out the footline
%\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
% \else\global\advance\pageno\@ne \fi} % increase |pageno|
% LaTeX does use the same insert for footnotes as PLAIN
\newinsert\footins
%\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later
% \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
% #1\@sf\vfootnote{#1}}
%\def\vfootnote#1{\insert\footins\bgroup
% \interlinepenalty\interfootnotelinepenalty
% \splittopskip\ht\strutbox % top baseline for broken footnotes
% \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
% \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
% \textindent{#1}\footstrut\futurelet\next\fo@t}
%\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
% \else\let\next\f@t\fi \next}
%\def\f@@t{\bgroup\aftergroup\@foot\let\next}
%\def\f@t#1{#1\@foot}
%\def\@foot{\strut\egroup}
%\def\footstrut{\vbox to\splittopskip{}}
% LaTeX leaves these initializations for the \footins insert.
%
\skip\footins=\bigskipamount % space added when footnote is present
\count\footins=1000 % footnote magnification factor (1 to 1)
\dimen\footins=8in % maximum footnotes per page
%\newinsert\topins
%\newif\ifp@ge \newif\if@mid
%\def\topinsert{\@midfalse\p@gefalse\@ins}
%\def\midinsert{\@midtrue\@ins}
%\def\pageinsert{\@midfalse\p@getrue\@ins}
%\skip\topins=\z@skip % no space added when a topinsert is present
%\count\topins=1000 % magnification factor (1 to 1)
%\dimen\topins=\maxdimen % no limit per page
%\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
%\def\endinsert{\egroup % finish the \vbox
% \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
% \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
% \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
% \if@mid \bigskip\box\z@\bigbreak
% \else\insert\topins{\penalty100 % floating insertion
% \splittopskip\z@skip
% \splitmaxdepth\maxdimen \floatingpenalty\z@
% \ifp@ge \dimen@\dp\z@
% \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
% \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}
%\output{\plainoutput}
%\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
% \advancepageno
% \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
%\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}}
%\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
% \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
%\def\makefootline{\baselineskip24\p@\line{\the\footline}}
%\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over
% \line{}\kern-\topskip\nobreak\vfill\supereject\fi}
%
%\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
% \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
% \ifvoid\footins\else % footnote info is present
% \vskip\skip\footins
% \footnoterule
% \unvbox\footins\fi
% \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
% LaTeX keeps PLAIN TeX's \footnoterule as the default
%
\def\footnoterule{\kern-3\p@
\hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high
% Hyphenation, miscellaneous macros, and initial values for standard layout
\message{hyphenation}
\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
\input sihyphen
% \magnification doesn't work in LaTeX
%
%\def\magnification{\afterassignment\m@g\count@}
%\def\m@g{\mag\count@
% \hsize6.5truein\vsize8.9truein\dimen\footins8truein}