summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/zztex/tex/zzpage.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/plain/contrib/zztex/tex/zzpage.tex')
-rw-r--r--macros/plain/contrib/zztex/tex/zzpage.tex908
1 files changed, 908 insertions, 0 deletions
diff --git a/macros/plain/contrib/zztex/tex/zzpage.tex b/macros/plain/contrib/zztex/tex/zzpage.tex
new file mode 100644
index 0000000000..a666c18094
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzpage.tex
@@ -0,0 +1,908 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Page Facilities
+%
+% Synopsis: This module contains all the user facilities for
+% specifying things about the page layout. It also
+% contains the output routines.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 7 March 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tracing Page Makeup
+% ------- ---- ------
+
+
+\def \tracepagemakeup #1{%
+ \if \posp{\tracingpagemakeup}%
+ \writelog{ZzTeX page \the\pagenumber: #1}%
+ \fi}
+
+% Initialize Page Parameters
+% ---------- ---- ----------
+
+
+% Here we assume that the type area width is the same on both pages.
+
+\def \zpageinit {%
+ \gcalculate \trimplusbleedheight = {\standardbleed,+,\trimheight,+,%
+ \standardbleed}%
+ \gcalculate \trimplusbleedwidth = {\standardbleed,+,\trimwidth,+,%
+ \standardbleed}%
+ \gcalculate \typeareawidth = {\oddlefttextmargin,+,\textmeasure,+,%
+ \oddrighttextmargin}%
+ \gcalculate \evenoutermargin = {\trimwidth,-,\typeareawidth,-,%
+ \eveninnermargin}%
+ \gcalculate \evenbleedshift = {-\evenlefttextmargin,-,\evenoutermargin,-,%
+ \standardbleed}%
+ \gcalculate \oddoutermargin = {\trimwidth,-,\typeareawidth,-,%
+ \oddinnermargin}%
+ \gcalculate \oddbleedshift = {-\oddlefttextmargin,-,\oddinnermargin,-,%
+ \standardbleed}}
+
+% Page Number
+% ---- ------
+
+
+\countdef \pagenumber = 0
+
+\declaresnapitem{\pagenumber}
+
+\def \setpagenumber #1{% {number}
+ \global\pagenumber = #1\relax
+ \setcolumnnumber{1}}
+
+\def \evenpagep {\evenp{\pagenumber}}
+\def \oddpagep {\oddp{\pagenumber}}
+
+\def \folio {}
+
+\def \setfoliostyle #1{% {\style}
+ \ztoksa = \expandaftertwice{\name{#1folio}}%
+ \xdef \folio {\the\ztoksa}}
+
+\def \chapterpagefolio {\the\chaptercomptext-\number\pagenumber}
+\def \arabicfolio {\number\pagenumber}
+\let \decimalfolio = \arabicfolio
+\def \letterfolio {\ucletter\pagenumber}
+\def \partpagefolio {\the\partcomptext-\number\pagenumber}
+\def \romanfolio {\romannumeral\pagenumber}
+
+% Marks
+% -----
+
+
+% These macros hold the five parts of the current mark, each part having
+% three subparts. When a part is saved, the first subpart is expanded and
+% the second and third subparts are not.
+
+\definetoks{\zmarki} \zmarki = {{???}{???}{???}}
+\definetoks{\zmarkii} \zmarkii = {{???}{???}{???}}
+\definetoks{\zmarkiii} \zmarkiii = {{???}{???}{???}}
+\definetoks{\zmarkiv} \zmarkiv = {{???}{???}{???}}
+\definetoks{\zmarkv} \zmarkv = {{???}{???}{???}}
+
+
+\def \setmarkinfothree #1#2#3#4{% {part}{text1}{text2}{text3}
+ {\tcounta = #1\relax
+ \edef \znext {{#2}}%
+ \global\name{\zmark\romannumeral\tcounta} = \expandafter{\znext{#3}{#4}}%
+ \mark{\noexpand\or \the\zmarki \noexpand\or \the\zmarkii
+ \noexpand\or \the\zmarkiii \noexpand\or \the\zmarkiv
+ \noexpand\or \the\zmarkv}}%
+ \if \vmodep \repeatpenalty \fi} % In case glue follows the mark.
+
+\def \setmarkinfo #1#2#3{% {part}{text1}{text2}
+ \setmarkinfothree{#1}{#2}{#3}{???}}
+
+
+\let \firstnewmark = \firstmark
+\let \bottommark = \botmark
+
+\def \markinfo #1#2#3{% {mark}{part}{subpart}
+ \ifcase #3%
+ \relax
+ \or
+ \expandafter\zoneofthree
+ \ifcase #2\expandafter\relax #1\else {???}{???}{???}\fi
+ \or
+ \expandafter\ztwoofthree
+ \ifcase #2\expandafter\relax #1\else {???}{???}{???}\fi
+ \or
+ \expandafter\zthreeofthree
+ \ifcase #2\expandafter\relax #1\else {???}{???}{???}\fi
+ \else
+ \error{invsubpart}{The subpart `#3' is invalid}%
+ \fi}
+
+% Page Screen
+% ---- ------
+
+
+\def \fullpagescreen #1{% {color}
+ \if \inbackground
+ \vskip -\standardbleed
+ \moveleft \standardbleed \vbox{%
+ \colorrule{#1}{width \trimplusbleedwidth height \trimplusbleedheight}}%
+ \else
+ \hrule width 0pt
+ \vsinkfromtrim{-\standardbleed}
+ \smashbox{%
+ \colorparrule{#1}
+ {\if \evenp{\pagenumber}\evenbleedshift \else \oddbleedshift \fi}
+ {width \trimplusbleedwidth height 0pt depth \trimplusbleedheight}}%
+ \fi}
+
+% New Headers & Footers Scheme
+% --- ------- - ------- ------
+
+
+% Most of the definitions are in zzrunner.tex, but these need to be in
+% here so they can be used in design files.
+
+
+\def \headerblindformat {}
+
+\def \footerblindformat {}
+
+\def \headercornermarkformat {%
+ \line{\vrule height .5pt depth 0pt width 6pt \hfil
+ \vrule height .5pt depth 0pt width 6pt}%
+ \nointerlineskip
+ \line{\vrule height 6pt depth 0pt width .5pt \hfil
+ \vrule height 6pt depth 0pt width .5pt}%
+ \vfil}
+
+\def \footercornermarkformat {%
+ \vfil
+ \line{\vrule height 6pt depth 0pt width .5pt \hfil
+ \vrule height 6pt depth 0pt width .5pt}%
+ \nointerlineskip
+ \line{\vrule height .5pt width 6pt \hfil
+ \vrule height .5pt width 6pt}}
+
+% Old Headers & Footers Scheme
+% --- ------- - ------- ------
+
+
+\def \zcurheader{\normalheader}
+\def \zcurfooter{\normalfooter}
+
+\setflag \zoverrunners = \false
+\let \zsaveheader = \relax
+\let \zsavefooter = \relax
+
+
+\def \setrunners #1#2{% {header}{footer}
+ \if \zoverrunners
+ \gdef \zsaveheader {#1}%
+ \gdef \zsavefooter {#2}%
+ \else
+ \gdef \zcurheader {#1}%
+ \gdef \zcurfooter {#2}%
+ \fi}
+
+\def \overriderunners #1#2{% {header}{footer}
+ \if \notp{\zoverrunners}%
+ \global\let \zsaveheader = \zcurheader
+ \global\let \zsavefooter = \zcurfooter
+ \global\setflag \zoverrunners = \true
+ \fi
+ \gdef \zcurheader {#1}%
+ \gdef \zcurfooter {#2}}
+
+\def \blindrunners {%
+ \overriderunners{\blindheader}{\blindfooter}}
+
+\def \zsetrunnerstoks #1{% {tokens}
+ \expandafter\overriderunners \the#1}
+
+\def \zoverriderunnerstoks #1{% {tokens}
+ \expandafter\overriderunners \the#1}
+
+% The following macro is used to initialize the \runners parameter.
+
+\def \zoldrunners #1{%
+ \runners = {#1}}
+
+% The following macro is called from the output routine.
+
+\def \znextpagerunners {%
+ \if \zoverrunners
+ \global\let \zcurheader = \zsaveheader
+ \global\let \zcurfooter = \zsavefooter
+ \global\setflag \zoverrunners = \false
+ \fi}
+
+
+% The following macros provide some standard, simple header and footer
+% formats.
+
+\def \blindheader {}
+
+\def \blindfooter {}
+
+\def \cornermarkheader {\headercornermarkformat}
+
+\def \cornermarkfooter {\footercornermarkformat}
+
+% The following header and footer formats are provided by the design.
+% Just in case they are forgotten:
+
+\def \normalheader {%
+ \warning{noheadfoot}{No normal header format has been specified}}
+\def \normalfooter {%
+ \warning{noheadfoot}{No normal footer format has been specified}}
+\def \chapterheader {%
+ \warning{noheadfoot}{No chapter header format has been specified}}
+\def \chapterfooter {%
+ \warning{noheadfoot}{No chapter footer format has been specified}}
+
+% Multiple Columns
+% -------- -------
+
+
+% The following parameters are calculated by the \setpagecolumns command:
+
+\setflag \zdofullbreak = \false % True if doing a full break.
+\setflag \zusetypewidth = \false % True if using type area width.
+
+\definecount{\columncount}{0} % Number of columns on page.
+\definecount{\columnnumber}{0} % Current column number.
+% \hsize
+% \vsize
+
+
+% The \setpagecolumns command accepts the following options:
+%
+% \fullbreak
+% \shortbreak
+% \usetextmeasure
+% \usetextwidth
+% \usetypewidth
+
+\def \setpagecolumns #1#2#3{% {options}{columns}{gutter-width}
+ \endgraf
+ {\def \fullbreak {\global\setflag \zdofullbreak = \true}%
+ \def \shortbreak {\global\setflag \zdofullbreak = \false}%
+ \def \usetextmeasure {\global\setflag \zutw = \false}%
+ \def \usetextwidth {\global\setflag \zutw = \false}%
+ \def \usetypewidth {\global\setflag \zutw = \true}%
+ \global\setflag \zdofullbreak = \false
+ \global\setflag \zutw = \false
+ #1}%
+ \if \andp{\zusetypewidth}{\notp{\zutw}}%
+ \zejectcolpage
+ \else\if \onep{\columncount}%
+ \if \orp{\gtrp{#2}{1}}{\zutw}\penalty \zpenoneton \fi
+ \else\if \neqlp{#2}{\columncount}%
+ \zejectcolpage
+ \fi\fi\fi
+ \global\columncount = #2\relax
+ \global\setflag \zusetypewidth = \zutw
+ \tdimena = \if \zusetypewidth \typeareawidth \else \textmeasure \fi
+ \calculate \tdimenb = {-#3,*,\columncount,+,#3,+,\tdimena,/,\columncount}%
+ \settextwidth{\tdimenb}%
+ \global\hsize = \hsize % Make these two parameters global.
+ \global\parfillskip = \parfillskip
+ \setcolumnnumber{1}%
+ \tracepagemakeup{Columns: \the\columncount; width: \the\hsize; gutter: #3.}}
+
+\def \zejectcolpage {%
+ \if \zdofullbreak
+ \freshpage{\full\floats\any}%
+ \else
+ \freshpage{\short\floats\any}%
+ \fi
+ \global\vsize = \textareaheight} % Needed even if no page eject.
+
+
+\def \setcolumnnumber #1{% {number}
+ \global\columnnumber = #1\relax
+ \if \andp{\oddpagep}{\lastcolumnp}%
+ \global\brokenpenalty = \oddbrokenpenalty
+ \else
+ \global\brokenpenalty = \evenbrokenpenalty
+ \fi}
+
+\def \firstcolumnp {\eqlp{\columnnumber}{1}}
+\def \lastcolumnp {\eqlp{\columnnumber}{\columncount}}
+
+
+%-----------------------------------------------------------------------------
+%
+% This old command is deprecated, although it will work forever.
+
+
+\def \setcolumns #1#2#3{% {count}{gutter-width}{use-type-area}
+ \endgraf
+ \if \andp{\zusetypewidth}{\notp{#3}}%
+ \freshpage{\short\floats\any}%
+ \global\vsize = \textareaheight % Needed even if no page eject.
+ \else \if \eqlp{\columncount}{1}%
+ \if \orp{\gtrp{#1}{1}}{#3}%
+ \penalty \zpenoneton
+ \fi
+ \else \if \neqlp{#1}{\columncount}%
+ \freshpage{\short\floats\any}%
+ \global\vsize = \textareaheight % Needed even if no page eject.
+ \fi\fi\fi
+ \global\columncount = #1\relax
+ \global\setflag \zusetypewidth = #3\relax
+ {\zpageinit
+ \tdimena = #2\relax
+ \multiply \tdimena by \columncount
+ \advance \tdimena by -#2\relax
+ \if \zusetypewidth
+ \advance \tdimena by -\typeareawidth
+ \else
+ \advance \tdimena by -\textmeasure
+ \fi
+ \divide \tdimena by -\columncount
+ \settextwidth{\tdimena}%
+ \global\hsize = \hsize % Make these two parameters global.
+ \global\parfillskip = \parfillskip}%
+ \setcolumnnumber{1}%
+ \tracepagemakeup{Columns: \the\columncount; width: \the\hsize; gutter: #2.}}
+
+% Column Breaks
+% ------ ------
+
+
+\def \columnbreak #1{% {penalty}
+ \penalty #1\relax}
+
+\def \freshcolumn #1{% {options}
+ {\let \zfill = \relax
+ \let \full = \relax \def \short {\def \zfill {\vfill}}%
+ #1\relax%
+ \if \notp{\dimzerop{\lastskip}}\vskip -\lastskip \fi
+ \zfill
+ \penalty \zpenfreshcol}}
+
+\def \fullcolumnbreak {\freshcolumn{\full}}
+\def \shortcolumnbreak {\freshcolumn{\short}}
+
+\def \blankcolumn {%
+ \line{}%
+ \shortcolumnbreak}
+
+% Page Breaks
+% ---- ------
+
+
+%~ This command starts a new page. The options specify the
+%~ exact behavior:
+%~ & |\any|& Start an even or odd page.
+%~ & |\even|& Start an even page.
+%~ & |\floats|& Place all floats before new page.
+%~ & |\full|& Current page is bottomed out.
+%~ & |\nofloats|& No need to place all floats.
+%~ & |\odd|& Start an odd page.
+%~ & |\short|& Run current page short.
+%~ &.
+
+\def \freshpage #1{% {options} %^page_makeup
+ \if \vmodep
+ {\let \zfill = \vfill
+ \let \short = \relax \def \full {\let \zfill = \relax}%
+ \let \zflush = \zpenfreshpage
+ \let \nofloats = \relax \def \floats {\let \zflush = \zpenflushpage}%
+ \let \zpage = \relax
+ \let \any = \relax
+ \def \odd {\def \zpage {\if \evenpagep \blankpage \fi}}%
+ \def \even {\def \zpage {\if \oddpagep \blankpage \fi}}%
+ #1\relax%
+ \if \notp{\dimzerop{\lastskip}}\vskip -\lastskip \fi
+ \zfill
+ \if \notp{\lastcolumnp}%
+ \penalty \zpenfreshcol
+ \if \notp{\lastcolumnp}%
+ \loop
+ \blankcolumn
+ \if \notp{\lastcolumnp}\repeat
+ \fi
+ \line{}%
+ \vfill
+ \fi
+ \penalty \zflush
+ \zpage}%
+ \else
+ \error{pagepar}{Page break requested in the middle of a paragraph}%
+ \fi}
+
+%~ This command starts a new page, bottoming out the current page.
+
+\def \fullpagebreak {\freshpage{\full\nofloats\any}} %^page_makeup
+
+%~ This command starts a new page, leaving the current page short.
+%~ The argument specifies the number of lines short, or, if
+%~ specified as |\asap|, runs the page as short as possible.
+
+\def \shortpagebreak #1{% {lines} %^page_makeup
+ {\def \zarg {#1}\def \zasap {\asap}%
+ \if \tokeqlp{\zarg}{\zasap}%
+ \freshpage{\short\nofloats\any}%
+ \else
+ \kern -\dp\strutbox
+ \kern #1\baselineskip
+ \fullpagebreak
+ \fi}}
+
+\def \blankpage {%
+ \blindrunners
+ \pagehint{(blank)}%
+ \hrule width 0pt
+ \freshpage{\short\nofloats\any}}
+
+\def \blankleaf {%
+ \freshpage{\short\floats\odd}
+ \blankpage
+ \freshpage{\short\even}
+ \blankpage}
+
+% Overriding Text Area Height
+% ---------- ---- ---- ------
+
+
+\definedimen{\zortahsave}{0pt} % Saved normal text area height.
+\definecount{\zortahcount}{0} % Number of overridden pages.
+
+
+%~ This command changes the number of lines on the specified number
+%~ of pages, beginning with the current page. The nominal line count
+%~ is increased or decreased by the specified number of lines,
+%~ which should be coded with a plus or minus sign. A fractional
+%~ number of lines is allowed. It is best to change two pages (a spread)
+%~ with each command.
+
+\def \overridetextareaheight #1#2{% {pages}{lines} %^page_makeup
+ \if \posp{\zortahcount}%
+ \warning{overortah}{Text area height overridden during previous override}%
+ \zresetortah
+ \fi
+ {\global\zortahsave = \textareaheight
+ \global\zortahcount = #1\relax
+ \global\advance \textareaheight by #2\baselineskip
+ \global\vsize = \textareaheight
+ \if \dimneqlp{\pagegoal}{\maxdimen}%
+ \tdimena = \textareaheight
+ \advance \tdimena by -\zortahsave
+ \advance \tdimena by \pagegoal
+ \global\pagegoal = \tdimena
+ \fi}%
+ \tracepagemakeup{Overriding text area height: pages: #1, vsize: \the\vsize,
+ goal: \the\pagegoal.}}
+
+\def \zresetortah {%
+ \global\zortahcount = 0
+ \global\textareaheight = \zortahsave
+ \global\vsize = \textareaheight
+%%% \global\pagegoal = \vsize
+ \tracepagemakeup{Un-overriding text area height: vsize: \the\vsize.}}
+
+\def \zortahdivfinal {%
+ \if \posp{\zortahcount}%
+ \warning{divortah}{Text area height overridden across a division}%
+ \zresetortah
+ \fi}
+
+% Text Margins
+% ---- -------
+
+
+% The following two macros are really bogus, because TeX doesn't
+% always know what page it's on, except in the output routine.
+
+\def \thislefttextmargin {%
+ \if \evenpagep \evenlefttextmargin \else \oddlefttextmargin \fi}
+
+\def \thisrighttextmargin {%
+ \if \evenpagep \evenrighttextmargin \else \oddrighttextmargin \fi}
+
+\definedimen{\typeareashift}{0pt}
+\definecount{\ztaspage}{0}
+
+\def \determinetypeareashift #1{% {page}
+ \global\typeareashift = \if \evenp{#1}-\evenlefttextmargin \else
+ -\oddlefttextmargin \fi}
+
+% Layout Summary
+% ------ -------
+
+
+{\catcode`\_ = \catactive
+
+\gdef \zlayoutsummary {%
+ {\def _{\space}%
+ \writelog{}%
+ \writelog{Layout:}%
+ \writelog{}%
+ \tdimena = .013837\trimwidth
+ \tdimenb = .013837\trimheight
+ \writelog{Trim: \thefactor\tdimena"_x_\thefactor\tdimenb"}%
+ \tdimena = .013837\headmargin
+ \writelog{Head margin: \thefactor\tdimena"}%
+ \tdimena = .083333\typeareawidth
+ \tdimenb = .083333\typeareaheight
+ \writelog{Type area: \thefactor\tdimena pc_x_\thefactor\tdimenb pc}%
+ \tdimena = .013837\eveninnermargin
+ \tdimenb = .013837\oddinnermargin
+ \writelog{Inside margins: even \thefactor\tdimena", odd \thefactor\tdimenb"}%
+ \tdimena = .013837\evenoutermargin
+ \tdimenb = .013837\oddoutermargin
+ \writelog{Outside margins: even \thefactor\tdimena", odd \thefactor\tdimenb"}%
+ \tdimena = .083333\evenlefttextmargin
+ \tdimenb = .083333\oddlefttextmargin
+ \writelog{Left text margins: even \thefactor\tdimena pc,
+ odd \thefactor \tdimenb pc}%
+ \tdimena = .083333\evenrighttextmargin
+ \tdimenb = .083333\oddrighttextmargin
+ \writelog{Right text margins: even \thefactor\tdimena pc,
+ odd \thefactor\tdimenb pc}%
+ \tdimena = .083333\textmeasure
+ \tdimenb = .083333\textareaheight
+ \writelog{Text area: \thefactor\tdimena pc_x_\thefactor\tdimenb pc}%
+ \writelog{Top skip: \the\topskip, delta: \the\topdelta}%
+ \writelog{}}}
+
+}% \catcode
+
+% Debugging
+% ---------
+
+
+\def \zlogoutf {-1} % First page to log.
+\def \zlogoutl {-1} % Last page to log.
+
+
+\def \logoutput #1#2{% {first-page}{last-page}
+ \global\def \zlogoutf {#1}%
+ \global\def \zlogoutl {#2}}
+
+% Output Routine
+% ------ -------
+
+
+% The following definitions are for special penalties that control
+% page makeup:
+
+\def \zpennormal {-10000\relax} % Normal page break.
+\def \zpenoneton {-10001\relax} % Switch from 1 to n columns.
+\def \zpenfreshcol {-10002\relax} % Fresh column.
+\def \zpenfreshpage {-10003\relax} % Fresh page.
+\def \zpenflushpage {-10004\relax} % Fresh page, and flush floats.
+\def \zpenfloatpage {-10005\relax} % Page of floats scheduled.
+
+% We need to put the depth of box 255 in a convenient place.
+
+\definedimen{\zoutputcoldepth}{0pt}
+
+% We must save \mathdisplayprevgraf across the output routine.
+
+\definecount{\zsavemdpg}{0}
+
+% The following boxes hold parts of the page:
+
+\definebox{\zcolbox} % One column's worth.
+\definebox{\zbodybox} % The body, multiple columns' worth.
+\definebox{\zonetonbox} % Stuff preceding 1- to n-column switch.
+\setflag \zonetontype = \false % True if 1-to-n text uses type area width.
+
+% This toks register is invoked at the beginning of every column, so that
+% things like index carryovers can be performed.
+
+\definetoks{\everycolumn}
+\everycolumn = {\relax}
+
+
+\output = {\zoutput}
+
+\def \zoutput {%
+ \if \andp{\notp{\lssp{\pagenumber}{\zlogoutf}}}%
+ {\notp{\gtrp{\pagenumber}{\zlogoutl}}}%
+ \tracingoutput = 1
+ \showboxdepth = 1000 \showboxbreadth = 1000\relax
+ \fi
+ \tracepagemakeup{[Output routine invoked for column \the\columnnumber;
+ penalty: \the\outputpenalty.}%
+ \tracepagemakeup{Vsize: \the\vsize;
+ Box 255: \the\ht255+\the\dp255 \space x \the\wd255.}%
+ \zoutputcoldepth = \dp255\relax
+ \let \zsavewith = \zwith % Save these items across the
+ \let \zsavevariant = \zvariant % output routine in case they
+ \zsavemdpg = \mathdisplayprevgraf % are altered within it.
+ \normalbaselines
+ \let \par = \endgraf
+ \everyparagraph = {}%
+ \spaceskip = 0pt
+ \tcounta = \outputpenalty
+ \if \eqlp{\tcounta}{-'10000000000}\tcounta = \zpenflushpage \fi
+ \if \gtrp{\tcounta}{-10000}\tcounta = -10000\relax \fi
+ \negate \tcounta
+ \advance \tcounta by -10000\relax
+ \ifcase \tcounta
+ \zpagenormal \or
+ \zpageoneton \or
+ \zpagefreshcol \or
+ \zpagefreshpage \or
+ \zpageflushpage \or
+ \zpagefloatpage \else
+ \zzerror{Invalid page break penalty: \the\outputpenalty}%
+ \fi
+ \global\let \zvariant = \zsavevariant
+ \global\let \zwith = \zsavewith
+ \global\mathdisplayprevgraf = \zsavemdpg
+ \tracepagemakeup{Output routine complete.]}}
+
+\def \zpagenormal {%
+ \tracepagemakeup{Process normal column.}%
+ \zcolumnsave
+ \if \lastcolumnp
+ \zpagecontents
+ \setcolumnnumber{1}%
+ \else
+ \tcounta = \columnnumber \increment \tcounta
+ \setcolumnnumber{\tcounta}%
+ \fi
+ \zfloatinit
+ \zschedulefloats{\zfloatcount}{\true}{\false}%
+ \if \gtrp{\zfloatcount}{99}%
+ \zfltpage{\zpenfloatpage}%
+ \else
+ \zeverycol
+ \fi}
+
+\def \zpageoneton {%
+ \tracepagemakeup{Process 1- to n-column transition.}%
+ \zonetoncolumnbody
+ \global\setflag \zonetontype = \zusetypewidth
+ \global\advance \vsize by -\ht\zonetonbox
+ \global\advance \vsize by -\dp\zonetonbox
+ \tracepagemakeup{Space remaining on page: \the\vsize.}}
+
+\def \zpagefreshcol {%
+ \tracepagemakeup{Process `fresh column' request.}%
+ \zpagenormal}
+
+\def \zpagefreshpage {%
+ \tracepagemakeup{Process `fresh page' request.}%
+ \zpagenormal}
+
+\def \zpageflushpage {%
+ \tracepagemakeup{Process `fresh page, flush floats' request.}%
+ \zcolumnsave
+ \if \lastcolumnp
+ \zpagecontents
+ \setcolumnnumber{1}%
+ \else
+ \tcounta = \columnnumber \increment \tcounta
+ \setcolumnnumber{\tcounta}%
+ \fi
+ \zfloatinit
+ \zschedulefloats{\zfloatcount}{\true}{\true}%
+ \if \posp{\zfloatcount}%
+ \zfltpage{\zpenflushpage}%
+ \else
+ \zeverycol
+ \fi}
+
+\def \zpagefloatpage {%
+ \tracepagemakeup{Process page of floats.}%
+ \zcolumnsave
+ \if \lastcolumnp
+ \zpagecontents
+ \setcolumnnumber{1}%
+ \else
+ \tcounta = \columnnumber \increment \tcounta
+ \setcolumnnumber{\tcounta}%
+ \fi
+ \zfloatinit
+ \zschedulefloats{\zfloatcount}{\true}{\false}%
+ \if \gtrp{\zfloatcount}{99}%
+ \zfltpage{\zpenfloatpage}%
+ \fi}
+
+\def \zfltpage #1{% {penalty}
+ \if \notp{\emptytoksp{\zfltrunners}}%
+ \zoverriderunnerstoks{\zfltrunners}%
+ \fi
+ {\leftskip = 0pt \rightskip = 0pt
+ \line{}}%
+ \kern -\topskip % Why bother to do this?
+ \nobreak \vfill
+ \penalty #1}
+
+\def \zeverycol {%
+ {\zadjtitle = \zadjtitlemark % \adjusttitle should adjust mark.
+ \def \zadjloc {\mark}%
+ \the\everycolumn}}
+
+% Page Makeup: Column
+% ---- ------- ------
+
+
+\def \zcolumnsave {%
+ \zcolumnbody
+ \if \firstcolumnp
+ \global\setbox \zbodybox = \hbox to \zbodyboxwidth {\box\zcolbox \hss}%
+ \ztoksa = \expandafter{\topmark}%
+ \xdef \topmarki {\the\ztoksa}%
+ \ztoksa = \expandafter{\firstnewmark}%
+ \xdef \firstnewmarki {\the\ztoksa}%
+ \ztoksa = \expandafter{\bottommark}%
+ \xdef \bottommarki {\the\ztoksa}%
+ \else
+ \global\setbox \zbodybox = \hbox to \zbodyboxwidth {%
+ \unhbox\zbodybox \hfill \box\zcolbox}%
+ \fi}
+
+\def \zbodyboxwidth {%
+ \if \zusetypewidth \typeareawidth \else \textmeasure \fi}
+
+\def \zcolumnbody {%
+ \tracepagemakeup{Wrapping up the column; hsize: \the\hsize.}%
+ {\vbadness = 10000\relax
+ \global\setbox \zcolbox = \vbox to \vsize {%
+ \setindentation{0pt}{0pt}%
+ \boxmaxdepth = \maxdepth
+ \if \notp{\voidboxp{\ztopcolinsert}}\unvbox \ztopcolinsert \fi
+ \unvbox 255 % Page built by TeX.
+ \if \risingfootnotes
+ \if \notp{\voidboxp{\zfninsert}}\zfootnoteformat{\zoutputcoldepth}\fi
+ \fi
+ \if \risingbottomfloats
+ \if \notp{\voidboxp{\zbotcolinsert}}\unvbox \zbotcolinsert \fi
+ \fi
+ \if \raggedbottom
+ \kern -\zoutputcoldepth \vfill
+ \fi
+ \if \notp{\risingfootnotes}%
+ \if \notp{\voidboxp{\zfninsert}}\zfootnoteformat{\zoutputcoldepth}\fi
+ \fi
+ \if \notp{\risingbottomfloats}%
+ \if \notp{\voidboxp{\zbotcolinsert}}\unvbox \zbotcolinsert \fi
+ \fi}}}
+
+% This is a special version of \zcolumnbody for the 1- to n-column
+% transition.
+
+\def \zonetoncolumnbody {%
+ \global\setbox \zonetonbox = \vbox{%
+ \setindentation{0pt}{0pt}%
+ \boxmaxdepth = \maxdepth
+ \if \notp{\voidboxp{\ztopcolinsert}}\unvbox \ztopcolinsert \fi
+ \unvbox 255 % Page built by TeX.
+ \vskip \baselineskip
+ \vskip -\topskip
+ % Ignore footnotes.
+ % Ignore bottom style.
+ % Ignore bottom floats.
+ % Don't produce text area bottom rule.
+ }}
+
+% Page Makeup: Page
+% ---- ------- ----
+
+
+\def \zpagecontents {%
+ \tracepagemakeup{Shipping out the final page.}%
+ \shipout \vbox to \trimheight {%
+ \parskip = 0pt \parindent = 0pt
+ \setindentation{0pt}{0pt}%
+ \zpageheadmargin
+ \nointerlineskip
+ \zpagetypearea
+ \vfil
+ \nointerlineskip
+ \zpageoverlay}%
+ \if \posp{\zortahcount}% % If overriding text area height:
+ \global\decrement \zortahcount
+ \if \zerop{\zortahcount}\zresetortah \fi
+ \fi
+ \tcounta = \pagenumber \increment \tcounta
+ \setpagenumber{\tcounta}%
+ \global\vsize = \textareaheight % In case it was reset for this page.
+ \znextpagerunners}
+
+\def \zpagelengthmarks {%
+ \tdimena = \headmargin
+ \advance \tdimena by \typeareaheight
+ \advance \tdimena by -\footerheight
+ \vskip \tdimena
+ \vbox to 0pt{%
+ \hbox to \trimwidth{%
+ \llap{\vrule height .5pt width .75pc}\hfil
+ \rlap{\vrule height .5pt width .75pc}}%
+ \vss}
+ \vskip -\tdimena
+ \nointerlineskip}
+
+\setflag \inbackground = \false
+
+\def \zpageheadmargin {%
+ \vbox to \headmargin {%
+ \hrule height 0pt width \trimwidth
+ \nointerlineskip
+ \smashbox{%
+ \setflag \inbackground = \true
+ \zcurback}%
+ \nointerlineskip
+ \vfil
+ \zmakeuprule{\trimwidth}{.5pt}}}
+
+\def \zpagetypearea {%
+ \if \evenpagep
+ \negate \eveninnermargin
+ \advance \eveninnermargin by \trimwidth
+ \advance \eveninnermargin by -\evenlefttextmargin
+ \advance \eveninnermargin by -\textmeasure
+ \advance \eveninnermargin by -\evenrighttextmargin
+ \fi
+ \moveright \if \oddpagep \oddinnermargin \else \eveninnermargin \fi
+ \vbox to \typeareaheight {%
+ \zadjtitle = \zadjtitlemark % \adjusttitle should adjust mark.
+ \def \zadjloc {\mark}%
+ \zpageheader
+ \nointerlineskip
+ \ztextandmargins
+ \zmakeuprule{\typeareawidth}{.5pt}%
+ \vss % Allows text area height to vary.
+ \vbox to \footerheight{%
+ \vss
+ \zpagefooter}}}
+
+\def \zpageheader {%
+ \vbox to \headerheight {%
+ \hsize = \typeareawidth
+ \zoutputbeginblack
+ \zcurheader
+ \zoutputendblack
+ \vfil
+ \zmakeuprule{\typeareawidth}{.5pt}}}
+
+\def \ztextandmargins {%
+ \hbox to \typeareawidth {%
+ \if \notp{\zusetypewidth}%
+ \hbox to \thislefttextmargin{\hss}%
+ \fi
+ \vbox{%
+ \boxmaxdepth = \maxdepth
+ \if \andp{\zusetypewidth}{\notp{\zonetontype}}%
+ \moveright \thislefttextmargin
+ \fi
+ \box\zonetonbox
+ \nointerlineskip
+ \vbox{\box\zbodybox}}%
+ \hss}}
+
+\def \zpagefooter {%
+ \hsize = \typeareawidth
+ \zoutputbeginblack
+ \zcurfooter
+ \zoutputendblack
+ \if \PDFhyperlinks \PDFmark{P:\folio}\fi}
+
+% This macro invokes the page overlay after positioning to the
+% upper-left corner of the trim.
+
+\def \zpageoverlay {%
+ \vbox to 0pt{%
+ \offinterlineskip
+ \kern -\trimheight
+ \name{\pageoverlay\the\zoverlay}%
+ \vss}}
+
+\def \zmakeuprule #1#2{% {width}{height}
+ \if \DVIWindoinuse
+ \colorspecial{ifview color push rgb 0 1 0}%
+ \tdimena = #1\tcounta = \tdimena
+ \tdimena = #2\tcountb = \tdimena
+ \special{viewrule: \the\tcounta\space \the\tcountb}%
+ \colorspecial{ifview color pop}%
+ \fi}