% Copyright (c) 1985, 1986 Daniel C. Brotsky.  All rights reserved.
% User interface for yTeX.  See the file YTEX.MAC for details.

% CONTENTS

% ^L-page       contents
% ----------------------------------------------------------------------
% 1             %% User interface to YTEX macros
% 2             %% combinators
% 3             %% runners
% 4             %% glosses
% 5             %% paragraphs
% 6             %% textual displays
% 7             %% lisp programs
% 8             %% footnotes
% 9             %% figures
% 10            %% tables
% 11            %% equations
% 12            %% chapters and sections
% 13            %% special pages
% 14            %% 2 columns
% 15            %% indexes
% 16            %% citations
% 17            %% labels
% 18            %% initialization

\message{combinators,}

% verbatim word
\def\verb {% <token>#1<token>
 \begingroup\tt\specials@ther\activespaces\ \v@rb}
\def\v@rb #1{%
 \def\next##1#1{##1\endgroup}\next}

% spread to the current hsize
\newspread\spread
 \setup
 \endnew
\let\@@spreadwidth=\spreadwidth \let\spreadwidth=\hsize

% left-adjusted, center-adjusted, and right-adjusted titles
\newtitle\tleft
 \box \vopen
 \shape \titleleft{\z@}{\z@}%
 \font
 \setup
 \begin
 \end
 \endnew
\newtitle\tcenter
 \box \vopen
 \shape \titlecenter{\z@}{\z@}%
 \font
 \setup
 \begin
 \end
 \endnew
\newtitle\tright
 \box \vopen
 \shape \titleright{\z@}{\z@}%
 \font
 \setup
 \begin
 \end
 \endnew

% symbols
\newtextwrap\sy
 \box \hopen
 \setup \smltt
 \before
 \after
 \begin
 \end
 \endnew
\newtextwrap\sybox
 \box \hbox
 \setup \smltt
 \before
 \after
 \begin
 \end
 \endnew
\newtextwrap\ucsy
 \box \hopen
 \setup \smltt
 \before
 \after
 \begin \uppercase\bgroup
 \end \egroup
 \endnew
\newtextwrap\ucsybox
 \box \hbox
 \setup \smltt
 \before
 \after
 \begin \uppercase\bgroup
 \end \egroup
 \endnew

\def\ignore #{%
 \begingroup
   \def\do ##1{\catcode`##1=12\relax}%
   \dospecials                 % turn off all special chars
   \catcode`\\=0\relax         % need to see commands as single tokens
   \catcode`\{=1\catcode`\}=2\relax    % need to recognize balanced braces
   \catcode`\%=14\relax        % need to ignore comments
   \let\par=\relax
   \ignorereader}
\long
\def\ignorereader #1{%
   \endgroup}

\message{runners,}

% contents of headers and footers
\newtoks\versoleftheader
\newtoks\versocenterheader
\newtoks\versorightheader
\newtoks\rectoleftheader
\newtoks\rectocenterheader
\newtoks\rectorightheader

\newtoks\versoleftfooter
\newtoks\versocenterfooter
\newtoks\versorightfooter
\newtoks\rectoleftfooter
\newtoks\rectocenterfooter
\newtoks\rectorightfooter

\newtoks\runnerfont

\rectoheader={\the\runnerfont
 \line{\hbox to\z@{\the\rectoleftheader\hss}\hfil
       \hbox to\z@{\hss\the\rectocenterheader\hss}\hfil
       \hbox to\z@{\hss\the\rectorightheader}}}
\versoheader={\the\runnerfont
 \line{\hbox to\z@{\the\versoleftheader\hss}\hfil
       \hbox to\z@{\hss\the\versocenterheader\hss}\hfil
       \hbox to\z@{\hss\the\versorightheader}}}
\rectofooter={\the\runnerfont
 \line{\hbox to\z@{\the\rectoleftfooter\hss}\hfil
       \hbox to\z@{\hss\the\rectocenterfooter\hss}\hfil
       \hbox to\z@{\hss\the\rectorightfooter}}}
\versofooter={\the\runnerfont
 \line{\hbox to\z@{\the\versoleftfooter\hss}\hfil
       \hbox to\z@{\hss\the\versocenterfooter\hss}\hfil
       \hbox to\z@{\hss\the\versorightfooter}}}

\versoleftheader={\bf\folio}
\rectoleftheader={\firstm@rk}
\rectorightheader={\bf\folio}

\versocenterfooter={\bf\folio}
\rectocenterfooter={\bf\folio}

% convenient runner settings: args are toklists
\let\fixedhead=\versorightheader
\let\runninghead=\rectoleftheader

\message{glosses,}

% top gloss: copyright
\newif\ifshowcopyright
\newtoks\copyrightholder
\def\copyrightpage {\ifshowcopyright\yestopgloss\fi}
\copyrightholder={by the author}
\topgloss={\regsize\bf
 Copyright $\m@th\copyright$ \number\year~\the\copyrightholder\hfil
 \shortdate \enspace[\daytime]}

% drafts
\def\draft {%
 \ymessage{{Draft}}
 \overfullrule=5\p@
 \bottomgloss={\regsize\bf
   DRAFT $\bullet$ DRAFT $\bullet$ DRAFT\hfil
   \date \enspace [\daytime]}
 \bottomglosstrue}

\message{paragraphs,}

% disciplined \rem@veindent
\newif\ifvpar
\def\vpar {%
 \ifvpar \edef\next{\the\everypar}\ifx\next\empty \rem@veindent \fi\fi}
\def\unvpar {\everypar={}}

% various paragraph shapes
\newpar\ivpar
 \argtext
 \setup
 \vestindent \parindent
 \starter \noindent
 \endnew
\newpar\ipar
 \argtext
 \setup
 \vestindent \parindent
 \starter \indent
 \endnew
\newdimen\partagsep
\newbox\partagbox
\newpar\ftpar
 \argtext #1%
 \setup \setbox\partagbox=\hbox{#1}%
        \ifdim \wd\partagbox<\parindent
          \setbox\partagbox=\hbox to\parindent{\unhbox\partagbox \hfil}%
        \else
          \setbox\partagbox=\hbox{\unhbox\partagbox \hskip\partagsep}\fi
 \vestindent \parindent
 \starter \noindent \box\partagbox \ignorespaces
 \endnew
\newpar\atpar
 \argtext #1%
 \setup
 \vestindent \parindent
 \starter \noindent \hbox to\parindent {\hss #1\hskip\partagsep}\ignorespaces
 \endnew
\newpar\vtpar
 \argtext #1%
 \setup \setbox\partagbox=\hbox{#1\hskip\partagsep}%
 \vestindent 1\wd\partagbox
 \starter \noindent \box\partagbox \ignorespaces
 \endnew

% bullet paragraphs and lists thereof
\newpar\bpar
 \argtext
 \setup
 \vestindent \parindent
 \starter \noindent \hbox to\parindent {$\m@th\bullet$\hfil}\ignorespaces
 \endnew

\newelement\bullets
 \setup \unvpar
 \above \minbreak \prebulletspenalty \abovebulletsskip
 \below \dobreak \postbulletspenalty \belowbulletsskip \vpar
 \begin
 \end \endgraf
 \endnew
\setskip\abovebulletsskip \dimen 2pt \glue \parskip \factor 500
\setskip\belowbulletsskip \dimen 2pt \glue \parskip \factor 500
\prebulletspenalty=-200
\postbulletspenalty=-200

% quotes
\newtoks\quotefont
\newelement\quote
 \setup \advance\leftskip\parindent \advance\rightskip\parindent
        \unvpar \the\quotefont \offindent
 \above \vskip\baselineskip \nobreak   % compensate for smaller baseline
        \begingroup \the\quotefont \vskip-\baselineskip \endgroup
 \below \vpar
 \begin
 \end \endgraf
 \endnew

% ragged center (mostly from the TeXbook)
\def\raggedcenter {%
 \leftskip=\z@ plus2em \rightskip=\leftskip
 \spaceskip=.3333em \xspaceskip=.5em \parfillskip=\z@
 \pretolerance=9999 \tolerance=9999 \hbadness=9999
 \hyphenpenalty=9999 \exhyphenpenalty=9999
 \offindent}

% ragged left
\def\raggedleft {%
 \leftskip=\z@ plus2em \rightskip=\z@skip
 \spaceskip=.3333em \xspaceskip=.5em \parfillskip=\z@
 \pretolerance=9999 \tolerance=9999 \hbadness=9999
 \hyphenpenalty=9999 \exhyphenpenalty=9999
 \offindent}

\message{textual displays,}

% nofill
\newelement\nofill
 \setup \offindent \setupnofill
 \above \vskip\parskip                 % compensate for loss of \parskip
 \below \vpar
 \begin
 \end \endgraf
 \endnew

\newtext\text
 \display
 \setup \hsize=\displaywidth \advance\leftskip\displayindent \setupnofill
 \begin
 \end
 \endnew
\newtext\textlines
 \display \displaywidth=\hsize \displayindent=\z@
 \setup \setupnofill
 \begin
 \end
 \endnew
\newtext\code
 \display
 \setup \hsize=\displaywidth \advance\leftskip\displayindent \tt \setupnofill
 \begin
 \end
 \endnew
\newtext\codelines
 \display \displaywidth=\hsize \displayindent=\z@
 \setup \tt \setupnofill
 \begin
 \end
 \endnew

% verbatim material
\def\beginverbatim {%
 \par
 \beginpgroup
 \vskip\parskip
 \setupverbatim
 \re@dverbatim}
{\obeylines \catcode`\|=\@scape \catcode`\\=\@ther %
|gdef|re@dverbatim#1^^M#2\endverbatim{#1#2|endgroup}}

\newverbatim\verb
 \begincs \beginverb
 \readcs \readv@rb
 \endcsname endverb%
 \display
 \setup \hsize=\displaywidth \advance\leftskip\displayindent \tt
 \begin
 \end
 \endnew
\newverbatim\verblines
 \begincs \beginverblines
 \readcs \readv@rblines
 \endcsname endverblines%
 \display \displaywidth=\hsize \displayindent=\z@
 \setup \tt
 \begin
 \end
 \endnew

\message{lisp programs,}

% make semis active a la \obeylines
{\catcode`\;=\@ctive
\gdef\obeysemis {\catcode`\;=\@ctive\relax \let;=\lispsemi}}

% \beginl@sp <body> \endl@sp
\def\beginl@sp {%
 \beginpgroup
 % semis start comments unless immediately followed by \pbrk
 \def\lispsemi{\futurelet\next\l@spsemi}%
 \def\l@spsemi{\ifx\next\pbrk \let\next=\relax
                 \else        \let\next=\l@spcomment\fi
                 \next}%
 \obeysemis
 % spaces made active so they start paragraphs
 %   and so multiple spaces aren't collapsed to one.
 \activespaces\ %
 % nofill via every line a par, if spaces start next line
 %   we do a \noindent to make sure a par gets started.
 % in addition, turn off interline skip and use struts
 %   to insure baseline spacing
 \offinterlineskip
 \parskip=\z@skip
 \def\par{\ifhmode \nobreak\strut \fi \endgraf}
 \obeylines
 % compensate for loss of baseline spacing
 \skip@=\dp\strutbox \advance\skip@ -\prevdepth
 \ifdim \skip@>\z@ \vskip\skip@ \nobreak \fi
 % make ',` do the right thing; make &, #, <> harmless
 \makebqspecial
 \makeandother
 \makesharpother
 \makelgtother
 \vbox\bgroup}

\def\endl@sp {%
 \egroup
 \endpgroup}

{\obeylines                     % for defs that happen where ^^M is active
% each program is a box, preventing page splits, but we
%   make the \pbrk macro work a la \noalign whose arg is
%   the entire rest of the line.
\gdef\pbrk #1^^M{%
   \egroup%
 \def\next{#1}%
 \ifx\empty\next%
   \smallskip
   \else \begingroup \activespaces\space \next\endgroup\fi%
 \vbox\bgroup%
   ^^M}                        % end with a CR since arg did
% semicolons start program comments which end with the end
% of the line.  These comments are in roman, in an \hbox to
% avoid line breaking, <> become angle brackets,
% and ; becomes harmless
\gdef\l@spcomment {%
 \begingroup%
 \def\lispsemi{;\kern\p@}\obeysemis    % this works even if ; already read
 \def^^M{\egroup\endgroup^^M}% end with ^^M since line does
 \leavevmode\hbox\bgroup \rm \strut;\kern\p@}%
} % end of def group

\newtoks\lispfont
\newtext\lisp
 \display
 \setup \hsize=\displaywidth \advance\leftskip\displayindent
        \the\lispfont
 \begin \beginl@sp
 \end \endl@sp
 \endnew
\newtext\lisplines
 \display \displaywidth=\hsize \displayindent=\z@
 \setup \the\lispfont
 \begin \beginl@sp
 \end \endl@sp
 \endnew

\message{footnotes,}

\let\footdef=\relax
\let\footref=\relax

\newfloat\footn@te
 \type \botfloat
 \floatsetup \setupfootnotefloat
 \setup \setupfootnote
 \floatabove
 \floatbelow
 \begin \startfootnote
 \end \strut\endgraf
 \endnew

\def\setupfootnotefloat {%
 \splittopskip=\ht\strutbox % top baseline for broken footnotes
 \splitmaxdepth=\dp\strutbox
 \floatingpenalty=\@M
 \setupfootnotefloathook}
\def\setupfootnotefloathook {}

\newtoks\footnotefont
\def\setupfootnote {%
 \interlinepenalty=\interfootnotelinepenalty
 \leftskip=\footnotemarkerwidth
 \parfillskip=\filskip
 \rightskip=\z@skip
 \spaceskip=\z@skip
 \xspaceskip=\z@skip
 \the\footnotefont
 \setupfootnotehook}
\def\setupfootnotehook {}

% footnote markers
\newdimen\footnotemarkerwidth
\def\footstrut {\vbox to\splittopskip{}}
\def\startfootnote #1{%
 \noindent \llap{#1}\footstrut}

% hmode footnote invocation
\def\footnote #1{\let\@sf\empty
 \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
 #1\@sf\beginfootn@te{#1}\futurelet\next\fo@t}
\def\@foot {\endfootn@te}

% numbered hmode footnote
\def\nfootnote #1{\footnote{$\m@th^{#1}$}}

% vmode footnote invocation
\def\vfootnote #1{\beginfootn@te{#1}\futurelet\next\fo@t}

% general footnote invocation
\newfloat\footmatter
 \type \botfloat
 \floatsetup \setupfootnotefloat \leftskip=\z@skip
 \setup \setupfootnote
 \floatabove
 \floatbelow
 \begin \noindent \footstrut
 \end \strut\endgraf
 \endnew

\message{figures,}

\let\figdef=\relax
\let\figref=\relax

% lines above and below figures
\newif\iffigureline
\newdimen\figurelinedrop
\def\figl@nabove {%
 \iffigureline \hrule \vskip\figurelinedrop\relax \fi}
\def\figl@nbelow {%
 \iffigureline \nobreak \vskip\figurelinedrop \hrule\relax \fi}

% figure environment definitions
\newdimen\captionindent
\newtoks\captionfont
\def\setupcaption {%
 \leftskip=\captionindent
 \rightskip=\captionindent
 \the\captionfont
 \parskip=\z@skip
 \everypar={}%
 \vpar
 \setupcaptionhook}
\def\setupcaptionhook {}

\newelement\c@ption
 \setup \setupcaption
 \above \dobreak \prec@ptionpenalty \abovec@ptionskip
 \below  \dobreak \postc@ptionpenalty \belowc@ptionskip
 \begin
 \end \ifhmode \vrule width\z@ height\z@ depth\dp\strutbox \fi \endgraf
 \endnew
\let\abovecaptionskip=\abovec@ptionskip
\let\belowcaptionskip=\belowc@ptionskip
\let\precaptionpenalty=\prec@ptionpenalty
\let\postcaptionpenalty=\postc@ptionpenalty

\def\setupfigure {%
 \let\begincaption=\beginc@ption
 \let\endcaption=\endc@ption
 \let\caption=\c@ption
 \leftskip=\z@skip
 \rightskip=\z@skip
 \spaceskip=\z@skip
 \xspaceskip=\z@skip
 \parfillskip=\filskip
 \everypar={}%
 \setupfigurehook}
\def\setupfigurehook {}

% figure type indicators
\newif\ifstationaryfigur@
\newif\ifsectionfigur@
\newif\iftopfigur@
\newif\iffloatingfigur@

% stationary figures
\newelement\stationaryfigure
 \setup \stationaryfigur@true \setupfigure
 \above \minbreak \prestationaryfigurepenalty \abovestationaryfigureskip
        \nointerlineskip
 \below \dobreak \poststationaryfigurepenalty \belowstationaryfigureskip
        \nointerlineskip
 \begin \vbox\bgroup \figl@nabove
 \end \figl@nbelow \egroup
 \endnew
\abovestationaryfigureskip=\bigskipamount
\belowstationaryfigureskip=\bigskipamount
\prestationaryfigurepenalty=\z@
\poststationaryfigurepenalty=-200
\newpage\pagestationaryfigure
 \setup \stationaryfigur@true \setupfigure
 \glue
 \begin \vbox to\vsize\bgroup \figl@nabove
 \end \figl@nbelow \vskip \z@ plus\@M\p@ \egroup
 \endnew
\def\stationaryfigures {%
 \let\figure=\stationaryfigure
 \let\pagefigure=\stationarypagefigure
 \let\beginfigure=\beginstationaryfigure
 \let\endfigure=\endstationaryfigure
 \let\beginpagefigure=\beginstationarypagefigure
 \let\endpagefigure=\endstationarypagefigure
 \let\abovefigureskip=\abovestationaryfigureskip
 \let\belowfigureskip=\belowstationaryfigureskip
 \let\prefigurepenalty=\prestationaryfigurepenalty
 \let\postfigurepenalty=\poststationaryfigurepenalty}

% section figures
\newelement\sectionfigure
 \setup \sectionfigur@true \setupfigure
 \above \dobreak \presectionfigurepenalty \abovesectionfigureskip
        \nointerlineskip
 \below \dobreak \postsectionfigurepenalty \belowsectionfigureskip
        \nointerlineskip
 \begin \vbox\bgroup \figl@nabove
 \end \figl@nbelow \egroup
 \endnew
\abovesectionfigureskip=\z@skip
\belowsectionfigureskip=\fillskip
\presectionfigurepenalty=\@M
\postsectionfigurepenalty=-200
\newpage\sectionpagefigure
 \setup \sectionfigur@true \setupfigure
 \glue
 \begin \vbox to\vsize\bgroup \figl@nabove
 \end \figl@nbelow \vskip \z@ plus\@M\p@ \egroup
 \endnew
\def\sectionfigures {%
 \let\figure=\sectionfigure
 \let\pagefigure=\sectionpagefigure
 \let\beginfigure=\beginsectionfigure
 \let\endfigure=\endsectionfigure
 \let\beginpagefigure=\beginsectionpagefigure
 \let\endpagefigure=\endsectionpagefigure
 \let\abovefigureskip=\abovesectionfigureskip
 \let\belowfigureskip=\belowsectionfigureskip
 \let\prefigurepenalty=\presectionfigurepenalty
 \let\postfigurepenalty=\postsectionfigurepenalty}

% floating top figures
\newskip\abovetopfigureskip \abovetopfigureskip=\z@skip
\newskip\belowtopfigureskip \belowtopfigureskip=\bigskipamount
\newcount\pretopfigurepenalty \pretopfigurepenalty=100
\newcount\posttopfigurepenalty \posttopfigurepenalty=\z@
\newfloat\topfigure
 \type \topfloat
 \floatsetup \floatingpenalty\posttopfigurepenalty
             \splitmaxdepth\maxdimen \splittopskip\z@skip
 \setup \topfigur@true \setupfigure
 \floatabove \penalty\pretopfigurepenalty \vskip\abovetopfigureskip
             \nointerlineskip
 \floatbelow \nobreak \vskip\belowtopfigureskip
 \begin \vbox\bgroup \figl@nabove
 \end \figl@nbelow \egroup
 \endnew
\newpagefloat\toppagefigure
 \type \topfloat
 \floatsetup \penalty\pretopfigurepenalty
             \floatingpenalty\posttopfigurepenalty
             \splitmaxdepth\maxdimen \splittopskip\z@skip
 \setup \topfigur@true \setupfigure
 \above
 \below
 \begin \vbox to\vsize\bgroup \figl@nabove
 \end \figl@nbelow \vskip \z@ plus\@M\p@ \egroup
 \endnew
\gdef\topfigures {%
 \let\figure=\topfigure
 \let\pagefigure=\toppagefigure
 \let\beginfigure=\begintopfigure
 \let\endfigure=\endtopfigure
 \let\beginpagefigure=\begintoppagefigure
 \let\endpagefigure=\endtoppagefigure
 \let\abovefigureskip=\abovetopfigureskip
 \let\belowfigureskip=\belowtopfigureskip
 \let\prefigurepenalty=\pretopfigurepenalty
 \let\postfigurepenalty=\posttopfigurepenalty}

% inline/floating figures
\newskip\floatabovefloatingfigureskip
\newskip\floatbelowfloatingfigureskip
\newcount\floatprefloatingfigurepenalty
\newcount\floatpostfloatingfigurepenalty
\floatabovefloatingfigureskip=\z@skip
\floatbelowfloatingfigureskip=\bigskipamount
\floatprefloatingfigurepenalty=100
\floatpostfloatingfigurepenalty=\z@
\newskip\abovefloatingfigureskip \abovefloatingfigureskip=\bigskipamount
\newskip\belowfloatingfigureskip \belowfloatingfigureskip=\bigskipamount
\newcount\prefloatingfigurepenalty \prefloatingfigurepenalty=\z@
\newcount\postfloatingfigurepenalty \postfloatingfigurepenalty=-200
\newfitfloat\floatingfigure
 \type \topfloat
 \floatsetup \floatingpenalty\floatpostfloatingfigurepenalty
             \splitmaxdepth\maxdimen \splittopskip\z@skip
 \setup \floatingfigur@true \setupfigure
 \floatabove \penalty\floatprefloatingfigurepenalty
             \vskip\floatabovefloatingfigureskip
             \nointerlineskip
 \floatbelow \nobreak \vskip\floatbelowfloatingfigureskip
 \above \penalty\prefloatingfigurepenalty
        \vskip\abovefloatingfigureskip
        \nointerlineskip
 \below \penalty\postfloatingfigurepenalty
        \vskip\belowfloatingfigureskip
        \nointerlineskip \vpar
 \begin \vbox\bgroup \figl@nabove
 \end \figl@nbelow \egroup
 \endnew
\newpagefloat\floatingpagefigure
 \type \topfloat
 \floatsetup \penalty\floatprefloatingfigurepenalty
             \floatingpenalty\floatpostfloatingfigurepenalty
             \splitmaxdepth\maxdimen \splittopskip\z@skip
 \setup \floatingfigur@true \setupfigure
 \above
 \below
 \begin \vbox to\vsize\bgroup \figl@nabove
 \end \figl@nbelow \vskip \z@ plus\@M\p@ \egroup
 \endnew
\gdef\floatingfigures {%
 \let\figure=\floatingfigure
 \let\pagefigure=\floatingpagefigure
 \let\beginfigure=\beginfloatingfigure
 \let\endfigure=\endfloatingfigure
 \let\beginpagefigure=\beginfloatingpagefigure
 \let\endpagefigure=\endfloatingpagefigure
 \let\abovefigureskip=\abovefloatingfigureskip
 \let\belowfigureskip=\belowfloatingfigureskip
 \let\prefigurepenalty=\prefloatingfigurepenalty
 \let\postfigurepenalty=\postfloatingfigurepenalty}

\message{tables,}

\let\tabdef=\relax
\let\tabref=\relax

\newtable\table
 \leftdelim [%
 \rightdelim ]%
 \before \vbox\bgroup
 \after \egroup
 \begin
 \end
 \endnew
\newtable\toptable
 \leftdelim [%
 \rightdelim ]%
 \before \vtop\bgroup
 \after \egroup
 \begin
 \end
 \endnew
\newtable\centertable
 \leftdelim [%
 \rightdelim ]%
 \before \vcenter\bgroup
 \after \egroup
 \begin
 \end
 \endnew
\newtable\opentable
 \leftdelim [%
 \rightdelim ]%
 \before
 \after
 \begin
 \end
 \endnew
\newtable\displaytable
 \leftdelim [%
 \rightdelim ]%
 \before \tablewidth=\hsize$$
 \after $$
 \begin
 \end
 \endnew

\message{equations,}

% equation numbering
\let\eqdef=\relax
\let\eqref=\relax

% synonyms for $$
\def\beginmath {$$}
\def\endmath {$$}
\def\math #1{$$#1$$}

\message{chapters and sections,}

\let\secref=\relax
\let\secdef=\relax

% are section, etc. headings centered or left-flush
\newif\ifcenterheadings

% chapters
\newtoks\chapterfont
\newtitle\chaptertitle
 \box \vopen
 \shape \ifcenterheadings \titlecenter{\z@}{\z@}\else
                          \titleleft{\z@}{\z@}\fi
 \font \the\chapterfont
 \setup \interlinepenalty=\@M
 \begin
 \end
 \endnew

\def\chaptersetup {%
 \chaptersetuphook}
\def\chaptersetuphook {}

\newelement\chapter
 \setup \get@rg\endchapter \chaptersetup
 \above \minbreak \prechapterpenalty \abovechapterskip
 \below \dobreak \postchapterpenalty \belowchapterskip \vpar
 \begin \get@rg
 \end \ymessage{{Chapter: \the\toks@}}\chaptertitle{\the\toks@}%
 \endnew
\setskip\abovechapterskip \dimen 36pt \glue \parskip \factor 3000
\setskip\belowchapterskip \dimen 18pt \glue \parskip \factor 2000
\prechapterpenalty=-500
\postchapterpenalty=10000

\newelement\pchapter
 \setup \get@rg\endpchapter \chaptersetup
 \above \rectosupereject
 \below \dobreak \postchapterpenalty \belowchapterskip \vpar
 \begin \get@rg
 \end \ymessage{{Chapter: \the\toks@}}\chaptertitle{\the\toks@}%
 \endnew

% starts sections.
\newtoks\sectionfont
\newtitle\sectiontitle
 \box \vbottom
 \shape \ifcenterheadings \titlecenter{\z@}{\z@}\else
                          \titleleft{\z@}{\z@}\fi
 \font \the\sectionfont
 \setup
 \begin
 \end
 \endnew

\def\sectionsetup {%
 \sectionsetuphook}
\def\sectionsetuphook {}

\newelement\section
 \setup \get@rg\endsection \sectionsetup
 \above \minbreak \presectionpenalty \abovesectionskip
 \below \dobreak \postsectionpenalty \belowsectionskip \vpar
 \begin \get@rg
 \end \ymessage{{Section: \the\toks@}}\sectiontitle{\the\toks@}%
 \endnew
\setskip\abovesectionskip \dimen 18pt \glue \parskip \factor 3000
\setskip\belowsectionskip \dimen  9pt \glue \parskip \factor 2000
\presectionpenalty=-200
\postsectionpenalty=10000

\let\beginsubsection=\beginsection
\let\endsubsection=\endsection
\let\subsection=\section

\let\beginsubsubsection=\beginsubsection
\let\endsubsubsection=\endsubsection
\let\subsubsection=\subsection

% simple heading
\newtoks\headingfont
\newtitle\headingtitle
 \box \vbottom
 \shape \ifcenterheadings \titlecenter{\z@}{\z@}\else
                          \titleleft{\z@}{\z@}\fi
 \font \the\headingfont
 \setup
 \begin
 \end
 \endnew

\def\headingsetup {%
 \headingsetuphook}
\def\headingsetuphook {}

\newelement\heading
 \setup \get@rg\endheading \headingsetup
 \above \minbreak \preheadingpenalty \aboveheadingskip
 \below \dobreak \postheadingpenalty \belowheadingskip \vpar
 \begin \get@rg
 \end \ymessage{{Heading: \the\toks@}}\headingtitle{\the\toks@}%
 \endnew
\setskip\aboveheadingskip \dimen 9pt \glue \parskip \factor 1000
\setskip\belowheadingskip \dimen 4pt \glue \parskip \factor 1000
\preheadingpenalty=-200
\postheadingpenalty=10000

\message{special pages,}

% titling pages
\newsuperpage\titlingpage
 \setup \norunners \copyrightpage
 \glue \vfil
 \begin
 \end
 \endnew

% main title pages
\newelement\titlepage
 \setup \titlepagedefs
 \above
 \below
 \begin \begintitlingpage \global\pageno=\z@ \ymessage{{Main title}}
 \end \endgraf \endtitlingpage \global\pageno=\@ne
 \endnew

% title pages for sub-parts of a book, etc.
\newelement\partpage
 \setup \titlepagedefs
 \above
 \below
 \begin \begintitlingpage \ymessage{{Part title}}
 \end \endgraf \endtitlingpage
 \endnew

% titles and abstracts
\newtoks\titlefont
\newtoks\authorfont
\newtitle\title
 \box \vbottom
 \shape \titleleft{\z@}{\z@}%
 \font \the\titlefont
 \setup
 \begin
 \end
 \endnew
\newtitle\ctitle
 \box \vbottom
 \shape \titlecenter{\z@}{\z@}%
 \font \the\titlefont
 \setup
 \begin
 \end
 \endnew
\newtitle\author
 \box \vbottom
 \shape \titleleft{\z@}{\z@}%
 \font \the\authorfont
 \setup
 \begin
 \end
 \endnew
\newtitle\cauthor
 \box \vbottom
 \shape \titlecenter{\z@}{\z@}%
 \font \the\authorfont
 \setup
 \begin
 \end
 \endnew

\newtoks\abstractfont
\newdimen\abstractindent
\newelement\abstract
 \setup \the\abstractfont \parindent=2em%
        \leftskip=\abstractindent \rightskip=\abstractindent
 \above \minbreak \preabstractpenalty \aboveabstractskip
 \below \dobreak \postabstractpenalty \belowabstractskip
 \begin
 \end \endgraf
 \endnew

\newtoks\bottomtextfont
\def\titlepagedefs {%
 \newelement\bottomtext
   \setup \the\bottomtextfont \offindent
   \above \bigskip \vfill
   \below
   \begin
   \end \endgraf
   \endnew}

\message{2 columns,}

% N.B. this stuff mostly adapted from the TeXbook

% parameters
\newdimen\columnskip

\newbox\partialp@ge
\newdimen\onec@lhsize
\newdimen\onec@lvsize
\newtoks\onec@loutput
\newdimen\twoc@lvsize

\def\setuptwocolumn {%
 \trimpagesfalse
 \onec@lfigfoot
 \def\columneject{\vfil\penalty200}%
 \baselinefactor={1.2}\setnormalbaselines
 \spaceskip=.3333em plus .3333em minus .1666em
 \xspaceskip=.3333em plus .6666em minus .0833em
 \advance\parskip by 0pt plus 2pt
 \setuptwocolumnhook}
\def\setuptwocolumnhook {}

% make figures and footnotes be one column
\def\onec@lfigfoot {%
 \topmag=2000%
 \botmag=2000%
 \addtodef\setupfigurehook{%
   \iffloatingfigur@
     \errhelp={I will assume it doesn't float.}%
     \errmessage{You can't use a floating figure in two-column text.}%
   \fi
   \iftopfigur@ \hsize=\onec@lhsize \fi
   \vsize=\onec@lvsize}%
 \addtodef\setupfootnotehook{\hsize=\onec@lhsize}}

\def\begintwocolumntext {%
 \begingroup
 \onec@lhsize=\hsize
 \onec@lvsize=\vsize
 \onec@loutput=\output
 \output={\global\setbox\partialp@ge=\vbox{\unvbox\@cclv}}%
 \let\dosupereject=\twoc@lsupereject
 \eject
 \output={\twoc@lout}%
 \hsize=.5\hsize \advance\hsize by-.5\columnskip
 \vsize=2\vsize  \advance\vsize by2pc\relax
 \twoc@lvsize=\vsize
 \advance\vsize by-2\ht\partialp@ge
 \setuptwocolumn}

\def\endtwocolumntext {%
 \output={\balancec@ls}%
 \eject
 \global\output=\onec@loutput
 \global\vsize=\onec@lvsize
 \endgroup
 \pagegoal=\vsize}

\def\twocolumntext #1{\begintwocolumntext #1\endtwocolumntext}

\def\twoc@lout {%
 \dimen@=\onec@lvsize \advance\dimen@ by-\ht\partialp@ge
 \advance\dimen@ by-\ht\topfloat \advance\dimen@ by-\dp\topfloat
 \advance\dimen@ by-\ht\botfloat \advance\dimen@ by-\dp\botfloat
 \ifdim \dimen@>\baselineskip
   \dimen@i=\ht\@cclv \advance\dimen@i\dp\@cclv
   \ifdim \dimen@i>\z@
     \splittopskip=\topskip \splitmaxdepth=\maxdimen
     \setbox\z@=\vsplit\@cclv to\dimen@
     \setbox\@ne=\vsplit\@cclv to\dimen@
   \else
     \setbox\z@=\box\voidb@x
     \setbox\@ne=\box\voidb@x
   \fi
 \else
   \setbox\z@=\box\voidb@x
   \setbox\@ne=\box\voidb@x
 \fi
 \def\line{\hbox to\onec@lhsize}%
 \let\pagebody=\twoc@lpagebody
 \ytexoutput
 \global\vsize=\twoc@lvsize
 \unvbox\@cclv
 \penalty\outputpenalty}

\def\twoc@lsupereject {%
 \ifnum\insertpenalties>\z@ % something is being held over
   \hbox{}\kern-\topskip\nobreak\vskip 0pt plus.5\vsize\penalty-200%
   \hbox{}\kern-\topskip\nobreak\vskip 0pt plus.5\vsize\supereject\fi}

\def\twoc@lpagebody {%
 \vbox{\twoc@lpagecontents}}

\def\twoc@lpagecontents {%
 \dimen@i=\ht\partialp@ge \advance\dimen@i\ht\z@
 \ifvoid\topfloat\else
   \dimen@=\ht\topfloat \advance\dimen@\dp\topfloat
   \unvbox\topfloat
   \ifdim \dimen@>\z@ \ifdim\dimen@i>\z@ \the\topsep\fi\fi
 \fi
 \unvbox\partialp@ge
 \wd\z@=\hsize \wd\@ne=\hsize
 \hbox to\onec@lhsize{\box\z@\hfil\box\@ne}
 \ifvoid\botfloat\else
   \dimen@=\ht\botfloat \advance\dimen@\dp\botfloat
   \ifdim \dimen@>\z@ \ifdim\dimen@i>\z@ \the\botsep\fi\fi
   \unvbox\botfloat
 \fi}

\def\balancec@ls {%
 \setbox\z@=\vbox{\unvbox\@cclv}%
 \dimen@=\ht\z@ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
 \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdimen
 {\vbadness=10000
   \loop \global\setbox\tw@=\copy\z@ \global\setbox\@ne=\vsplit\tw@ to\dimen@
   \ifdim\ht\tw@>\dimen@ \global\advance\dimen@ by\p@ \repeat}
 \setbox\z@=\vbox to\dimen@{\unvbox\@ne}%
 \setbox\@ne=\vbox to\dimen@{\unvbox\tw@}%
 \global\output={\balancing@rror}
 \unvbox\partialp@ge
 \wd\z@=\hsize \wd\@ne=\hsize
 \hbox to\onec@lhsize{\box\z@\hfil\box\@ne}}

\def\balancing@rror {%
 \errhelp={Please change the page into one that works.}%
 \errmessage{Page can't be balanced.}%
 \def\line{\hbox to\onec@lhsize}%
 \def\pagebody{\vbox{\unvbox\@cclv}}%
 \ytexoutput}

% complete double columns
\newif\iffirstc@l
\newbox\firstc@l
\newbox\secondc@l

\def\setupdoublecolumn {%
 \trimpagesfalse
 \def\pageeject{%
   \filpage\iffirstc@l \else \line{}\filpage \fi}%
 \baselinefactor={1.2}\setnormalbaselines
 \spaceskip=.3333em plus .3333em minus .1666em
 \xspaceskip=.3333em plus .6666em minus .0833em
 \advance\parskip by 0pt plus 2pt
 \setupdoublecolumnhook}
\def\setupdoublecolumnhook {}

\def\begindoublecolumn {%
 \begingroup
 \onec@lhsize=\hsize
 \output={\box\@cclv=\voidb@x}%
 \eject
 \output={\doublec@lout}%
 \global\firstc@ltrue
 \hsize=.5\hsize \advance\hsize by-.5\columnskip
 \setupdoublecolumn}

\def\enddoublecolumn {%
 \pageeject
 \endgroup
 \pagegoal=\vsize}

\def\doublecolumn #1{\begindoublecolumn #1\enddoublecolumn}

\def\doublec@lout {%
 \iffirstc@l
   \def\line{\hbox to\onec@lhsize}%
   \global\setbox\firstc@l=\pagebody
   \def\next{\global\firstc@lfalse}
 \else
   \def\line{\hbox to\onec@lhsize}%
   \global\setbox\secondc@l=\pagebody
   \wd\firstc@l=\hsize
   \wd\secondc@l=\hsize
   \def\pagecontents{\vbox{\line{\box\firstc@l\hfil\box\secondc@l}}}%
   \def\next{\ytexoutput\global\firstc@ltrue}%
 \fi
 \next}

\message{indexes,}

\gdef\beginindex {%
 \beginpgroup
 \def\entry##1{%
   \hangindent=2\parindent
   \hangafter=\@ne
   \noindent ##1\par}
 \def\subentry##1{%
   \hangindent=2\parindent
   \hangafter=\@ne
   \indent ##1\par}
 \raggedright
 \exhyphenpenalty=\@M
 \tolerance=\@M
 \interlinepenalty=\@M
 \begintwocolumntext}

\gdef\endindex {%
 \endtwocolumntext
 \endpgroup}

\message {citations,}

\def\writec@te {\write\m@ne}

\def\setciteaux #1{%
 \stripn@me{}#1%
 \edef\writec@te{\expandafter\noexpand\csname write\next \endcsname}}

\def\c@te #1{%
 \expandafter\ifx \csname @cd-#1\endcsname \relax
   \expandafter\let\csname @cd-#1\endcsname=\cite%
   \writec@te{\string\citation{#1}}%
 \fi
 \expandafter\ifx \csname @cr-#1\endcsname \relax
   \expandafter\def\csname @cr-#1\endcsname{??}%
   \ywarning{{Citation #1 undefined}}%
 \fi}

\def\cite #1{%
 \c@te{#1}%
 \csname @cr-#1\endcsname}

\def\explicitcite #1#2{%
 \c@te{#1}%
 #2}
\let\ecite=\explicitcite

\def\citation #1{\relax}

\def\bibcite #1#2{%
 \expandafter\def\csname @cr-#1\endcsname{#2}}

\def\setbibstyle #1{%
 \toks@={#1}%
 \immediate\writec@te{\string\bibstyle{\the\toks@}}}

\def\bibstyle #1{\relax}

\newcount\bibcount
\newskip\bibparskip
\newtoks\biblabelfont
\newtoks\bibsetup
\newif\ifbibopenform

\def\setupbibliography #1{
 \bibcount=\z@
 \setbox\z@=\hbox{\the\biblabelfont [#1]\enspace}\parindent=\wd\z@
 \ifbibopenform \let\newblock=\linebreak \else \let\newblock=\relax \fi
 \setupbibliographyhook}%

\def\setupbibliographyhook {}

\def\bibpar #1{\ftpar{\the\biblabelfont [#1]}}

\def\bibitem {\futurelet\next\bib@tem}
\def\bib@tem {%
 \if[\noexpand\next
   \let\next=\bibit@m
 \else
   \let\next\b@bitem
 \fi
 \next}
\def\bibit@m [#1]#2{%
 \toks@={#1}%
 \immediate\writec@te{\string\bibcite{#2}{\the\toks@}}%
 \bibpar{#1}}
\def\b@bitem #1{%
 \advance\bibcount\@ne
 \edef\next{\number\bibcount}
 \immediate\writec@te{\string\bibcite{#1}{\next}}%
 \bibpar{\number\bibcount}}

\def\bibliography #1{%
 \toks@={#1}%
 \immediate\writec@te{\string\bibdata{\the\toks@}}%
 \begingroup                           % for latex-like defs
   \def\begin##1##2{\begingroup \setupbibliography{##2}}%
   \def\end##1{\par\endgroup}%
   \@input{\jobname.bbl}{\ywarning{{No file \jobname.bbl}}}%
 \endgroup}

\def\explicitbibliography #1#2{%
 \toks@={#1}%
 \writec@te{\string\bibdata{\the\toks@}}
 \@input{#2.bbl}{\ywarning{{No file #2.bbl}}}}
\let\ebibligraphy=\explicitbibliography

\def\bibdata #1{\relax}

\message {labels,}

\def\writel@bel {\write\m@ne}

\def\setlabelaux #1{%
 \stripn@me{}#1%
 \edef\writel@bel{\expandafter\noexpand\csname write\next \endcsname}}

\def\reference #1{%
 \expandafter\ifx \csname @lr-#1\endcsname \relax
   \expandafter\def\csname @lr-#1\endcsname{??}%
   \ywarning{{Reference #1 undefined}}%
 \else
   \csname @lr-#1\endcsname
 \fi}

\def\pagereference #1{%
 \expandafter\ifx \csname @lrp-#1\endcsname \relax
   \expandafter\def\csname @lrp-#1\endcsname{??}%
   \ywarning{{Page reference #1 undefined}}%
 \else
   \csname @lrp-#1\endcsname
 \fi}

\def\label #1#2{%
 \edef\next{#2}%
 \expandafter\ifx \csname @lr-#1\endcsname \relax
   \ywarning{{Label #1 defined as \next}}%
 \fi
 \expandafter\let\csname @lr-#1\endcsname=\next
 \writel@bel{\string\deflabel{#1}{\csname @lr-#1\endcsname}{\the\pageno}}}

\def\deflabel #1#2#3{%
 \expandafter\def\csname @lr-#1\endcsname{#2}%
 \expandafter\def\csname @lrp-#1\endcsname{#3}}

\message{initialization,}

% output routine
\output={\fixsiz@ \ytexoutput}

% page layout
\hsize=28pc \vsize=44pc
\onheaders
\offfooters
\twosidedfalse
\showcopyrightfalse
\columnskip=2pc

% displays
\abovedisplayskip=3pt plus1pt minus2pt
\belowdisplayskip=3pt plus1pt minus2pt
\abovedisplayshortskip=0pt plus1pt
\belowdisplayshortskip=2pt plus1pt minus1pt

% footnotes
\footnotemarkerwidth=10pt
\botsep={\vskip\bigskipamount \footnoterule}

% figures
\figurelinefalse
\figurelinedrop=4pt
\topsep={}
\floatingfigures
\abovecaptionskip=\medskipamount
\captionindent=2em

% tables
\tablewidth=0pt
\intabskip=\emskip
\pretabskip=\filskip
\posttabskip=\filskip

% miscellany
\abstractindent=0pt
\centerheadingsfalse

% citations and labels
\newaux\aux
 \filename \perjob
 \extension aux%
 \endnew
\setciteaux\aux
\setlabelaux\aux
\bibsetup={}
\biblabelfont={}
\bibopenformfalse

% fonts
\runnerfont={\smlsize\rm}
\footnotefont={\smlsize\rm}
\captionfont={\smlsize\rm}
\quotefont={\smlsize\rm}
\titlefont={\bigsize\bf}
\authorfont={\regsize\rm}
\abstractfont={\smlsize\rm}
\bottomtextfont={\smllsize\rm}
\chapterfont={\bigsize\bf}
\sectionfont={\regsize\bf}
\headingfont={\regsize\bf}
\lispfont={\regsize\tt}

% running text
\vpartrue
\overfullrule=0pt
\parindent=2em
\partagsep=.5em
\parskip=1pt plus2pt minus1pt
\normallineskip=2pt
\normallineskiplimit=0pt
\def\singlespace {\baselinefactor={1.3}\setnormalbaselines}
\def\doublespace {\baselinefactor={2.6}\setnormalbaselines}
\singlespace
\clubpenalty=900
\widowpenalty=900