% 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