diff options
Diffstat (limited to 'macros/plain/contrib/zztex/tex/zzpage.tex')
-rw-r--r-- | macros/plain/contrib/zztex/tex/zzpage.tex | 908 |
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} |