% 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