summaryrefslogtreecommitdiff
path: root/tex/context/base/page-ini.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/page-ini.mkiv')
-rw-r--r--tex/context/base/page-ini.mkiv1640
1 files changed, 325 insertions, 1315 deletions
diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv
index c9bd05775..8cb146505 100644
--- a/tex/context/base/page-ini.mkiv
+++ b/tex/context/base/page-ini.mkiv
@@ -25,177 +25,93 @@
%D mechanism use a different way of looping over columns.
\unprotect
-
-\def\m!otr{otr}
-
-% \setnewconstant\normalpagebox 255 % already set
-
-\newbox\pagebox
-
-\ifx\recalculatelayout\undefined
-
- \let \recalculatelayout \relax
-
-\fi
-
-\ifx\recalculatebackgrounds\undefined
-
- \let \recalculatebackgrounds \relax
- \let \addmainbackground \gobbleoneargument % <box>
- \let \addtextbackground \gobbleoneargument % <box>
- \let \addpagebackground \gobbleoneargument % <box>
- \let \addprintbackground \gobbleoneargument % <box>
- \let \addstatusinfo \gobbleoneargument % <box>
-
-\fi
-\ifx\realpageno\undefined
-
- \countdef\realpageno = 0 \realpageno = 1
- \countdef\userpageno = 1 \userpageno = 1
- \countdef\subpageno = 2 \subpageno = 0 % !!
- \countdef\arrangeno = 3 \arrangeno = 0 % !!
-
- \let\pageno\userpageno
-
-\fi
-
-\ifx\realfolio\undefined
+\def\m!otr{otr}
- \def\realfolio{\the\realpageno}
+\newbox \pagebox
+\newcount \nofshipouts
-\fi
+\newconstant\c_page_otr_eject_penalty \c_page_otr_eject_penalty -\plustenthousand
+\newconstant\c_page_otr_super_penalty \c_page_otr_super_penalty -\plustwentythousand
-\newcount\nofshipouts
+\let\ejectpenalty\c_page_otr_eject_penalty % for old times sake
\appendtoks
- \global\advance\nofshipouts\plusone
+ \global\advance\nofshipouts\plusone
\to \everyaftershipout
-% principle:
-%
-% multiple otr's
-%
-% (1) single column, simple routine (old one)
-% (2) multi column, collect and split routine (old one)
-% (3) multi column, page by page (new one, needed for taco)
-% (4) single column, spread handling (for fun)
-% (5) multi column, page by page, spread handling (as challenge)
-%
-% common components
-%
-% (1) float placement
-% (2) float flushing
-% (3) page body building
-% (4) ...
-%
-% ort
-%
-% + balancing
-% - mixed / one / multi / balancetofit
-% + backgrounds
-% + pre / post
-% + distances / heights
-% + ragged / baseline / normal
-% - pos sync
-% - last page
-%
-% - itemize / subtexts -> old mechanism
-%
-% floats
-%
-% - top / bottom / side / page / column / spead
-% - flush / packed flush / current page / next page / area
-%
-% footnotes
-%
-% + carry over pre column / local to column
-% + last column / pre last column / each column
-% - multiple classes
-% - area / page / end
-%
-% areas
-%
-% - top / bottom / mid in spread
-%
-% IMPORTANT
-%
-% switchtobodyfont in between ivm top
-
-% floats:
-%
-% tricky in balancing mode, a la huidige multi columns
-
-% \ifx\dosetuplayout\undefined % overloaded in page-lay !
-% \unexpanded\def\setuplayout{\dodoubleempty\getparameters[\??ly]}
-% \fi
-
\ifx\mkprocesscolumncontents\undefined\let\mkprocesscolumncontents\gobbleoneargument\fi
\ifx\mkprocesspagecontents \undefined\let\mkprocesspagecontents \gobbleoneargument\fi
\ifx\mkprocessboxcontents \undefined\let\mkprocessboxcontents \gobbleoneargument\fi
-
-\def\normalejectpenalty{-\plustenthousand } \let\ejectpenalty\normalejectpenalty
-\def\normalsuperpenalty{-\plustwentythousand} \let\superpenalty\normalsuperpenalty
-
-%D In case we're not running \ETEX, we need to bypass a
-%D couple of primitives.
-
-% ONE = single column
-% MUL = multi column
-% SET = columns sets
-\def\@@OTR{OTR}
+%D As we have several fundamentally different output routines
+%D available we need commands that adapt themselves to the
+%D current output routine. Such commands are implemented
+%D in the respective modules and prefixed:
+%D
+%D \starttabulate[|T|T|]
+%D \NC OTRONE \NC single column \NC \NR
+%D \NC OTRMUL \NC multi column \NC \NR
+%D \NC OTRSET \NC columns sets \NC \NR
+%D \stoptabulate
+%D
+%D The following macros are not to be changed by users:
-\let\OTRdefault\empty
+\let\OTRidentifier\empty % public
+\let\OTRdefault \empty % public
+\let\OTRunknown \empty
+\def\OTRprefix {OTR}
-% obsolete
+%D We keep a list of registered commands so that we can
+%D bind them when we switch to a specific routine.
-\def\installotr#1% andere naam, beter \connectotr of zo
- {\def\OTRidentifier{#1}}
+\newtoks\t_page_otr_registered_commands
-\def\OTRcommand#1%
- {\csname\@@OTR
- \ifcsname\@@OTR\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname
- \OTRidentifier
- \else\ifcsname\@@OTR\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname % fallback
- \OTRdefault
+\def\registerotrcommand#1%
+ {\t_page_otr_registered_commands\expandafter
+ {\the\t_page_otr_registered_commands
+ \page_otr_with_command#1}}
+
+\def\page_otr_preset_command#1%
+ {\expandafter\let\expandafter#1\csname\OTRprefix
+ \ifcsname\OTRprefix\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname
+ \OTRidentifier % dedicated
+ \else\ifcsname\OTRprefix\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname
+ \OTRdefault % fallback
+ \else
+ \s!unknown % dummy
\fi\fi
\expandafter\gobbleoneargument\string#1\endcsname}
-\def\activateotr#1#2%
+\def\page_otr_activate#1#2%
{\def\OTRidentifier{#1}%
- \def\OTRdefault {#2}}
+ \def\OTRdefault {#2}%
+ \let\page_otr_with_command\page_otr_preset_command
+ \the\t_page_otr_registered_commands}
-% variant that does a preset:
+\appendtoks
+ \page_otr_activate{ONE}\empty
+\to \everydump
-\newtoks\registeredotrcommands
+%D The next commands is a direct call to a specific command but is
+%D normally only used if one wants to call a command inside another
+%D one or for the main (not triggered) outputroutines.
-\def\registerotrcommand#1%
- {\appendtoks\dowithotrcommand#1\to\registeredotrcommands}
-
-\def\dopresetotrcommand#1%
- {\expandafter\let\expandafter#1\csname\@@OTR
- \ifcsname\@@OTR\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname
- \OTRidentifier
- \else\ifcsname\@@OTR\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname % fallback
- \OTRdefault
+\def\OTRcommand#1%
+ {\csname\OTRprefix
+ \ifcsname\OTRprefix\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname
+ \OTRidentifier % dedicated
+ \else\ifcsname\OTRprefix\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname
+ \OTRdefault % fallback
+ \else
+ \s!unknown % dummy
\fi\fi
\expandafter\gobbleoneargument\string#1\endcsname}
-\def\activateotr#1#2%
- {\def\OTRidentifier{#1}%
- \def\OTRdefault {#2}%
- \let\dowithotrcommand\dopresetotrcommand
- \the\registeredotrcommands}
-
-\appendtoks
- \activateotr{ONE}{}%
-\to\everydump
-
%D The initialization of the \type {\hsize} and \type {\vsize}
-%D depends on the OTR used.
+%D depends on the OTR used, as do some other commands.
-% todo: \registerotrcommand\output, is a toks
+% These definitions will move to where they are introduced.
\registerotrcommand\setvsize
\registerotrcommand\sethsize
@@ -216,588 +132,251 @@
\registerotrcommand\setfloathsize
-% wrong, will be redone
-%
-% \registerotrcommand\someherefloat
-% \registerotrcommand\somefixdfloat
-% \registerotrcommand\somepagefloat
-% \registerotrcommand\sometopsfloat
-% \registerotrcommand\somebotsfloat
-% \registerotrcommand\somesidefloat
+% \registerotrcommand\_specific_final_side_float_output % todo
-% beter een \installotr#1 met #1 = macro en auto test
-
-\newif \iftraceotr
-\newif \ifinotr
-\newtoks \mainoutput
-\newcount\otrlevel
+%registerotrcommand\someherefloat % not ok this way
+%registerotrcommand\somefixdfloat % not ok this way
+%registerotrcommand\somepagefloat % not ok this way
+%registerotrcommand\sometopsfloat % not ok this way
+%registerotrcommand\somebotsfloat % not ok this way
+%registerotrcommand\somesidefloat % not ok this way
% When issuing two \par\penalty-\plustenthousand's, only the first
-% triggers the otr; obscure feature or optimization?
+% triggers the otr. Is this an obscure feature or an optimization?
+
+\newif \iftraceotr % will change
+\newif \ifinotr % might change
-\newcount\outputcounter \outputcounter=-100010 % -10010
+\newcount\c_page_otf_trigger_penalty \c_page_otf_trigger_penalty=-100010 % -10010
-\def\doinvokeoutput
+\unexpanded\def\page_otr_trigger
{\iftraceotr
- \expandafter\dodotracedoutput
+ \expandafter\page_otr_trigger_traced
\else
- \expandafter\dodoinvokeoutput
+ \expandafter\page_otr_trigger_normal
\fi}
-\def\doshowoutputmessage#1#2#3%
- {\writestatus\m!otr{#1 #2 \number#3}}
-
-\def\dodoinvokeoutput#1%
- {\bgroup\par\penalty#1\egroup}
-
-\def\dodotracedoutput#1%
- {\doshowoutputmessage+{traced}{#1/\the\outputpenalty}%
- \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}%
- \dodoinvokeoutput{#1}%
- \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}%
- \doshowoutputmessage-{traced}{#1/\the\outputpenalty}}
-
-\def\installoutput#1#2% \invoke \action
- {\global\advance\outputcounter\minusone
- \edef#1{\noexpand\doinvokeoutput{\number\outputcounter}}%
- \setvalue{\@@OTR\number\outputcounter}{#2}}
-
-\def\invoketracedoutputroutine
- {\doshowoutputmessage+{trying}\outputpenalty
- \ifcsname\@@OTR\the\outputpenalty\endcsname
- \doshowoutputmessage+{special}\outputpenalty
- \csname\@@OTR\the\outputpenalty\endcsname
- \doshowoutputmessage-{special}\outputpenalty
+\def\page_otr_message_b#1#2%
+ {\writestatus\m!otr{+ #1 \number#1}}
+
+\def\page_otr_message_e#1#2%
+ {\writestatus\m!otr{- #1 \number#2}}
+
+\def\page_otr_message_s
+ {\writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}}
+
+\def\page_otr_trigger_normal#1%
+ {\begingroup\par\penalty#1\endgroup}
+
+\def\page_otr_trigger_traced#1%
+ {\page_otr_message_b{traced}{#1}%
+ \page_otr_message_s
+ \page_otr_trigger_normal{#1}%
+ \page_otr_message_s
+ \page_otr_message_e{traced}{#1}}
+
+\def\installoutputroutine#1#2% \invoke \action
+ {\global\advance\c_page_otf_trigger_penalty\minusone
+ \edef#1{\page_otr_trigger{\number\c_page_otf_trigger_penalty}}%
+ \setvalue{\??zo\number\c_page_otf_trigger_penalty}{#2}}
+
+\def\page_otr_triggered_output_routine_traced
+ {\page_otr_message_b{trying}\outputpenalty
+ \ifcsname\??zo\the\outputpenalty\endcsname
+ \page_otr_message_b{special}\outputpenalty
+ \csname\??zo\the\outputpenalty\endcsname
+ \page_otr_message_e{special}\outputpenalty
\else
- \doshowoutputmessage+{normal}\outputpenalty
- \the\OTRcommand\output
- \doshowoutputmessage-{normal}\outputpenalty
+ \page_otr_message_b{normal}\outputpenalty
+ \the\OTRcommand\output % currently a toks but this will become a normal command
+ \page_otr_message_e{normal}\outputpenalty
\fi
- \doshowoutputmessage-{trying}\outputpenalty}
+ \page_otr_message_e{trying}\outputpenalty}
-\def\invokenormaloutputroutine
- {\ifcsname\@@OTR\the\outputpenalty\endcsname
- \csname\@@OTR\the\outputpenalty\endcsname
+\def\page_otr_triggered_output_routine_normal
+ {\ifcsname\??zo\the\outputpenalty\endcsname
+ \csname\??zo\the\outputpenalty\endcsname
\else
\the\OTRcommand\output
\fi}
-\def\invokeoutputroutine
+\def\page_otr_triggered_output_routine
{\iftraceotr
- \expandafter\invoketracedoutputroutine
+ \expandafter\page_otr_triggered_output_routine_traced
\else
- \expandafter\invokenormaloutputroutine
+ \expandafter\page_otr_triggered_output_routine_normal
\fi}
-\mainoutput{\invokeoutputroutine}
-
%D Some hooks:
-\def\setoutputroutine#1%
- {\global\output{\inotrtrue\the\everybeforeoutput#1\the\everyafteroutput}}
+\def\page_otf_set_engine_output_routine#1%
+ {\global\output
+ {\inotrtrue
+ \the\everybeforeoutput
+ #1\relax
+ \the\everyafteroutput}}
-\setoutputroutine{\the\mainoutput}
-
-\ifx\pagediscards\undefined \let\pagediscards\relax \fi
+\page_otf_set_engine_output_routine{\page_otr_triggered_output_routine}
-\installoutput\synchronizeoutput % maybe add pagediscards
+\installoutputroutine\synchronizeoutput
{\ifvoid\normalpagebox\else
\unvbox\normalpagebox
- \pagediscards % maybe not needed ?
+ \pagediscards
\fi}
-\installoutput\discardpage
+\installoutputroutine\discardpage
{\setbox\scratchbox\box\normalpagebox}
-
-%D In order to force consistent use of variables, we
-%D predefine a lot of them here.
-
-%D The next two registers can be used to store pre column
-%D material as well as footnotes or so.
-
-\newbox\precolumnbox \newdimen\precolumnboxheight
-\newbox\postcolumnbox \newdimen\postcolumnboxheight
-
-%D We reserve a counter for the number of columns as well as
-%D the current column. Both are not to be changed by users!
-\newcount\nofcolumns \nofcolumns = 1
-\newcount\mofcolumns \mofcolumns = 1
-
-\setnewconstant\maxnofcolumns 50
-\setnewconstant\allocatednofcolumns 0
-
-%D The next dimensions reports the final column height
-
-\newdimen\finalcolumnheights
-\newcount\finalcolumnlines
-
-%D During initialization the temporary boxes are allocated.
-%D This enables us to use as much columns as we want, without
-%D exhausting the pool of boxes too fast. We could have packed
-%D them in one box, but we've got enough boxes.
-%D
-%D Two sets of boxes are declared, the txtboxes are used for
-%D the text, the topboxes are for moved column floats.
-
-\def\@col@{@col@}
-
-\def\initializecolumns#1%
- {\ifnum#1>\maxnofcolumns
- \showmessage\m!columns1\maxnofcolumns
- \nofcolumns\maxnofcolumns
- \else
- \nofcolumns#1\relax
+\def\page_otr_trigger_output_routine
+ {\par
+ \ifvmode
+ \penalty\c_page_otr_eject_penalty
\fi
- \ifnum\nofcolumns>\allocatednofcolumns
- \dorecurse\nofcolumns
- {\ifnum\recurselevel>\allocatednofcolumns\relax
- % \newbox\next \letgvalue{\@col@-\recurselevel-t}=\next
- \@EA\newbox\csname\@col@-\recurselevel-t\endcsname % text
- \@EA\newbox\csname\@col@-\recurselevel-f\endcsname % foot
- \@EA\newbox\csname\@col@-\recurselevel-h\endcsname % top insert
- \@EA\newbox\csname\@col@-\recurselevel-l\endcsname % top insert
- \fi}%
- \global\allocatednofcolumns\nofcolumns
- \fi}
-
-\def\firstcolumnbox {\columntextbox\plusone}
-\def\currentcolumnbox {\columntextbox\mofcolumns}
-\def\lastcolumnbox {\columntextbox\nofcolumns}
-
-\def\firsttopcolumnbox {\columntopbox \plusone}
-\def\currenttopcolumnbox{\columntopbox \mofcolumns}
-\def\lasttopcolumnbox {\columntopbox \nofcolumns}
-
-\def\columntextbox#1{\csname\@col@-\number#1-t\endcsname}
-\def\columnfootbox#1{\csname\@col@-\number#1-f\endcsname}
-\def\columntopbox #1{\csname\@col@-\number#1-h\endcsname}
-\def\columnbotbox #1{\csname\@col@-\number#1-l\endcsname}
-
-\def\columnsettextbox{\global\setbox\columntextbox}
-\def\columnsetfootbox{\global\setbox\columnfootbox}
-\def\columnsettopbox {\global\setbox\columntopbox}
-\def\columnsetbotbox {\global\setbox\columnbotbox}
-
-\def\columngettextbox{\copy\columntextbox}
-\def\columngetfootbox{\copy\columnfootbox}
-\def\columngettopbox {\copy\columntopbox}
-\def\columngetbotbox {\copy\columnbotbox}
-
-\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}}
-\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}}
-\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}}
-\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}}
-
-%D Without going in details we present two macro's which handle
-%D the columns. The action which is transfered by the the first
-%D and only parameter can do something with \type
-%D {\currentcolumnbox}. In case of the mid columns, \type
-%D {\firstcolumnbox} and \type {\lastcolumnbox} are handled
-%D outside these macro's.
-
-\def\dohandlecolumn#1%
- {\mofcolumns\recurselevel
- \let\currentcolumn\recurselevel
- #1\relax}
-
-\def\dohandleallcolumns#1%
- {\dorecurse\nofcolumns{\dohandlecolumn{#1}}}
-
-\def\dohandlerevcolumns#1%
- {\dostepwiserecurse\nofcolumns\plusone\minusone{\dohandlecolumn{#1}}}
-
-\def\dohandlemidcolumns#1%
- {\dohandleallcolumns
- {\ifnum\recurselevel>\plusone
- \ifnum\recurselevel<\nofcolumns
- \dohandlecolumn{#1}%
- \fi
- \fi}}
-
-%D This register can be used as a temporary storage for page
-%D content.
-
-\newbox\restofpage
-
-%D Features.
-
-\newif\ifintermediatefootnotes
-\newif\ifcarryoverfootnotes %\carryoverfootnotestrue
-\newif\iflastcolumnfootnotes %\lastcolumnfootnotestrue
-\newif\ifbalancecolumns %\balancecolumnstrue
-\newif\ifbalancetoheight %\balancetoheighttrue
-\newif\ifforcecolumngrid \forcecolumngridtrue
-\newif\ifstretchcolumns \stretchcolumnsfalse
-\newif\ifinheritcolumns \inheritcolumnsfalse
-\newif\ifheightencolumns \heightencolumnsfalse
-
-\newif\ifbalancingcolumns
-\newif\ifcollectingcontent
-\newif\ifcolumnoverflow
-
-\newdimen\intercolumnwidth
-\newdimen\localcolumnwidth
-\newdimen\savedpagetotal
-
-\newconstant\columndirection % 0:lr 1:rl
-
-\def\minbalancetoplines {1}
-\def\minfreecolumnlines {2}
-
-\newif\ifrecentercolumnbox \recentercolumnboxtrue
-\newif\ifrerecentercolumnbox \rerecentercolumnboxtrue
-\newif\ifpackcolumnfloats \packcolumnfloatstrue
-
-\newbox\collectedpagefloats
-\newbox\collectedleftpagefloats
-\newbox\collectedrightpagefloats
+ \resetpagebreak}
-%D The \type {\ifdim} test is needed, because otherwise the
-%D last line of a text end up on top of the baseline instead of
-%D on the baseline, as is the case with preceding pages.
-%D Also, a \type {\vfil} better than a \type {\vfill}.
+\def\page_otr_fill_and_eject_page
+ {\par
+ \ifvmode
+ \vfill
+ \penalty\c_page_otr_eject_penalty
+ \fi
+ \resetpagebreak}
-% to be replaced by \page[now] \page[final] / merged
+\def\page_otr_eject_page
+ {\par
+ \ifvmode
+ \ifdim\pagetotal>\pagegoal \else
+ \normalvfil
+ \fi
+ \penalty\c_page_otr_eject_penalty
+ \fi
+ \resetpagebreak}
-% \def\eject {\par\penalty-\plustenthousand } % == {\par\break} % plain
-% \def\supereject {\par\penalty-\plustwentythousand} % also plain
+\def\page_otr_eject_page_and_flush_inserts % can be an installed one
+ {\par
+ \ifvmode
+ \ifdim\pagetotal>\pagegoal \else
+ \normalvfil
+ \fi
+ \penalty\c_page_otr_super_penalty
+ \fi
+ \resetpagebreak}
-\def\eject {\par\ifvmode\penalty\ejectpenalty\fi\resetpagebreak} % == {\par\break} % plain
-\def\supereject {\par\ifvmode\penalty\superpenalty\fi\resetpagebreak} % also plain
+\def\page_otr_check_for_pending_inserts
+ {\ifnum\outputpenalty>\c_page_otr_super_penalty \else
+ \ifnum\insertpenalties>\zerocount
+ % something is being held over so we force a new page
+ \page_otr_force_another_page
+ \fi
+ \fi}
-\def\doejectpage {\par\ifvmode\ifdim\pagetotal>\pagegoal\else\normalvfil\fi\fi} % pg set to \textheight
-\def\ejectpage {\doejectpage\eject}
-\def\superejectpage{\doejectpage\supereject}
+\def\page_otr_force_another_page
+ {% we should actually remove the dummy line in the otr
+ \hbox to \hsize{}
+ \kern-\topskip
+ \nobreak
+ \vfill
+ \penalty\c_page_otr_super_penalty
+ \resetpagebreak}
-\ifx\bye\undefined \def\bye{\par\vfill\supereject\end} \fi % plain tex command
+\unexpanded\def\bye
+ {\writestatus\m!system{Sorry, you're not done yet, so no goodbye!}}
% floats
-\def\ejectinsert
+\def\page_otr_flush_all_floats
{%\flushnotes already done
- \bgroup
-\ifsomefloatwaiting
- \noftopfloats\plusthousand
- \nofbotfloats\zerocount
- % this is needed in case a float that has been stored
- % ends up at the current page; this border case occurs when
- % the calculated room is 'eps' smaller that the room available
- % when just flushing; so now we have (maybe optional):
- \pagebaselinecorrection % hm, needs checking, not needed when no floats
- % alas, this is tricky but needed (first surfaced in prikkels)
- \doflushfloats
-\fi
- \egroup}
+ \ifsomefloatwaiting
+ \begingroup
+ \noftopfloats\plusthousand
+ \nofbotfloats\zerocount
+ % this is needed in case a float that has been stored
+ % ends up at the current page; this border case occurs when
+ % the calculated room is 'eps' smaller that the room available
+ % when just flushing; so now we have (maybe optional):
+ \pagebaselinecorrection % hm, needs checking, not needed when no floats
+ % alas, this is tricky but needed (first surfaced in prikkels)
+ \doflushfloats
+ \endgroup
+ \fi}
-\def\ejectdummypage
- {\endgraf \ifvmode
- \ejectinsert
+\def\page_otr_insert_dummy_page
+ {\par
+ \ifvmode
+ \page_otr_flush_all_floats
\fixedspace
\vfill
\gotonextpage
\fi}
-\def\beforefinaloutput
- {}
-
-\def\afterfinaloutput
- {%\forgetall
+\def\finaloutput#1#2%
+ {\forgetall
+ \page_boxes_shipout{\page_boxes_constructed_page#1#2}% \hbox removed
\vskip\zeropoint\relax
\ifvoid\normalpagebox \else
\unvbox\normalpagebox
\penalty\outputpenalty
\fi
% not really needed, replaced by \flushsavedfloats
- \ifnum\outputpenalty>\superpenalty \else % better use a proper otr signal
- \dosupereject
- \fi
+ \page_otr_check_for_pending_inserts
% but does not hurt either (we're still in the otr!)
\inpagebodytrue % needed for enabling \blank !
\flushsavedfloats % was \dosetbothinserts; only otr one !
- \setvsize} % this is needed for interacting components, like floats and multicolumns
-
-\def\dofinaloutput#1#2% \vbox: prevents spurious spaces in every..pagebody
- {\forgetall
- \beforefinaloutput
- \the\everybeforeshipout % brrr not in shipout
- \the\pageboundsettings
- \myshipout{\hbox{\vbox{\dopagebody#1#2}}}% is this hbox needed
- \the\everyaftershipout
- \afterfinaloutput}
-
-\def\donofinaloutput#1#2%
- {\forgetall
- \beforefinaloutput
- \the\everybeforeshipout
- \message{[-\the\realpageno]}%
- \setbox\scratchbox\hbox{\dopagebody#1#2}%
- \deadcycles\zerocount
- \setnextrealpageno
- \the\everyaftershipout
- \afterfinaloutput}
-
-% beware: \ifprocessingpages is in use
-
-\ifdefined\doflushspread\else \let\doflushspread\relax \fi % todo
-
-\def\finaloutput#1#2%
- {\ifprocessingpages
- \ifpageselected
- \@EAEAEA\dofinaloutput
- \else
- \@EAEAEA\donofinaloutput
- \fi
- \else
- \ifpageselected
- \@EAEAEA\donofinaloutput
- \else
- \@EAEAEA\dofinaloutput
- \fi
- \fi#1#2%
- \resetselectiepagina
+ \setvsize % this is needed for interacting components, like floats and multicolumns
\doincrementpageboundcounters % should hook into an every
- \checkpagedimensions
- \ifnum\outputpenalty>\superpenalty \else
- \dosupereject
- \fi
+ \page_adapts_synchronize
+ \page_otr_check_for_pending_inserts
\doflushspread
- \doflushpostponedcontent}
+ \page_postponed_blocks_flush}
-\def\dooutput
- {\finaloutput\unvbox\normalpagebox}
+% Can't we get rid of this hackery? It's used in some widgets
+% stuff so probably not.
-\maxdeadcycles=1000
+\newbox\d_page_otr_special
-% this needs a real cleanup
-
-\def\doplaceversiontext#1#2%
- {\doifsomething{#2}
- {\defconvertedcommand\ascii{#2}%
- \space#1:\space\ascii\space
- \!!doneatrue}}
-
-\unexpanded\def\placeversioninfo % nog engels maken
- {\ifcase\conceptmode
- % 0 : nothing
- \or
- % 1 : simple
- \vskip\!!sixpoint
- \hbox to \makeupwidth
- {\infofont
- \v!concept:\space\currentdate
- \hss\reportpagedimensions}%
- \else
- % 2/3 : extensive
- \vskip\!!sixpoint
- \hbox to \makeupwidth
- {\infofont
- \getmessage\m!system{27}:\space\currentdate\space
- \doplaceversiontext\v!project \currentproject
- \doplaceversiontext\v!product \currentproduct
- \doplaceversiontext\v!component\currentcomponent
- \if!!donea\else\space\v!file:\space\jobname\fi
- \hss\reportpagedimensions}%
+\def\page_otr_flush_special_content
+ {\ifvoid\d_page_otr_special \else
+ \box\d_page_otr_special
\fi}
-% tot hier
+\def\page_otr_add_special_content
+ {\dowithnextbox\page_otr_add_special_content_indeed\hbox}
-\def\doversion[#1]%
- {\conceptmode\zerocount
- \overfullrule\zeropoint
- \processaction % \v!final=>
- [#1]
- [ \v!concept=>\conceptmode\plusone, % simple banner
- \v!file=>\conceptmode\plustwo, % full banner
- \v!temporary=>\conceptmode\plusthree % full banner plus
- \overfullrule5\points]} % info in the margin
+\def\page_otr_add_special_content_indeed
+ {\wd\nextbox\zeropoint
+ \ht\nextbox\zeropoint
+ \dp\nextbox\zeropoint
+ \global\setbox\d_page_otr_special\hbox
+ {%\hskip-\maxdimen % not here, fails in acrobat (clips)
+ \box\d_page_otr_special\box\nextbox}}% was \unhbox, is now box again
-\def\version
- {\dosingleargument\doversion}
+\let\flushatshipout\page_otr_add_special_content
-\def\addstatusinfo
- {\ifcase\conceptmode
- \@EA\gobbleoneargument
- \else
- \@EA\doaddstatusinfo
- \fi}
+% \def\dooutput{\finaloutput\unvbox\normalpagebox}
-\def\doaddstatusinfo#1%
- {\setbox#1\vbox to \paperheight
- {\vsmashbox#1\box#1%
- \offinterlineskip
- \vskip\topspace
- \hsize\paperwidth
- %\hfill\hbox{\placetestinfo\hskip.5cm}\vss % obsolete
- \settexthoffset\hskip\texthoffset % brrrr
- \vbox to 1cm{\vss\placeversioninfo\vss}}}
-
-\def\dotestinfo#1#2#3%
- {\ifinpagebody\else\ifnum\conceptmode=\plusthree
- \begingroup
- \defconvertedcommand\ascii{#3}%
- \xdef\extratestinfo
- {#2\space\ascii}%
- \gdef\totaltestinfo
- {\global\setbox#1\vbox
- {\unvbox#1\relax
- \infofont \setupinterlinespace
- \hbox
- {\strut
- \expanded{\doboundtext{\extratestinfo}{12em}{..}}%
- \quad}}}%
- \endgroup
- \ifinner
- \aftergroup\totaltestinfo
- \else
- \totaltestinfo
- \fi
- \fi\fi}
-
-\version[\v!final]
-
-% bewaren tvb documentatie
-%
-% \hbox to \hsize
-% {\en
-% \switchnaarkorps[5pt]%
-% \emergencystretch2em
-% \dimen0=\baselineskip
-% \baselineskip=\dimen0 plus 1pt
-% \hsize=.2\hsize
-% \vsize=2\hsize
-% \ruledvbox to \vsize{\input tufte \par}\hss
-% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss
-% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss
-% \ruledvbox to \vsize{\input tufte \par\vfill}\hss
-% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}}
-%
-% \hbox to \hsize
-% {\en
-% \switchnaarkorps[5pt]%
-% \emergencystretch2em
-% \dimen0=\baselineskip
-% \baselineskip=\dimen0 plus 1pt
-% \hsize=.18\hsize
-% \vsize=2.5\hsize
-% \setbox0=\vbox{\input tufte\relax}%
-% \ruledvbox to \vsize{\unvcopy0}\hss
-% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss
-% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss
-% \ruledvbox to \vsize{\unvcopy0\vfill}\hss
-% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}}
+\maxdeadcycles=1000
\newtoks\afterpage \newtoks\aftereverypage
\newtoks\beforepage \newtoks\beforeeverypage
-\newconstant\showgridstate
-
-\unexpanded\def\showgrid
- {\dosingleempty\doshowgrid}
-
-\def\doshowgrid[#1]%
- {\showgridstate \plusone % downward compatible default
- \gridboxlinemode \plusone
- \gridboxlinenomode\plusone
- \processallactionsinset
- [#1]%
- [ \v!reset=>\showgridstate \zerocount,
- \v!bottom=>\showgridstate \plusone,
- \v!top=>\showgridstate \plustwo,
- \v!none=>\gridboxlinemode \zerocount,
- \v!all=>\gridboxlinemode \plusone,
- \v!lines=>\gridboxlinemode \plustwo,
- \v!frame=>\gridboxlinemode \plusthree,
- \v!nonumber=>\gridboxlinenomode\zerocount,
- \v!right=>\gridboxlinenomode\plusone,
- \v!left=>\gridboxlinenomode\plustwo,
- \v!outer=>\gridboxlinenomode\plusthree]%
- \ifcase\showgridstate
- \let\addtextgridlayer\gobbleoneargument
- \else % 1=bottom 2=top
- \let\addtextgridlayer\doaddtextgridlayer
- \fi}
-
-\definepalet
- [layout]
- [grid=red,
- page=green]
-
-% if really needed for speed we can cache the grid
-
-\let\addtextgridlayer\gobbleoneargument
-
-\def\doaddtextgridlayer#1% to be checked for color and layer
- {\startcolor[layout:grid]%
- \setgridbox\scratchbox\makeupwidth\textheight % todo: check color
- \global\setbox#1\hbox
- {\ifcase\showgridstate\or\or\box#1\hskip-\makeupwidth\fi
- \bgroup % color
- \ifcase\layoutcolumns\else
- \gray
- \setlayoutcomponentattribute\v!grid\v!columns
- \hbox \layoutcomponentboxattribute to \makeupwidth
- {\dorecurse\layoutcolumns
- {\hskip\layoutcolumnwidth
- \ifnum\recurselevel<\layoutcolumns
- \vrule
- \!!height\ht\scratchbox
- \!!depth\dp\scratchbox
- \!!width\layoutcolumndistance
- \fi}}%
- \hskip-\makeupwidth
- \fi
- \setlayoutcomponentattribute\v!grid\v!lines
- \hbox \layoutcomponentboxattribute{\box\scratchbox}%
- \egroup
- \ifcase\showgridstate\or\hskip-\makeupwidth\box#1\fi}%
- \stopcolor}
-
-\def\buildpagebox#1%
- {\setbox#1\vbox to \paperheight
- {\hsize\paperwidth
- \vskip\topspace
- \doifbothsides
- {\hskip\backspace}
- {\hskip\backspace}
- {\hskip\paperwidth \hskip-\backspace \hskip-\makeupwidth}%
- \box#1}%
- \dp#1\zeropoint}
-
-% \newif\ifpagebodyornaments \pagebodyornamentstrue
-%
-% \appendtoks
-% \global\pagebodyornamentstrue
-% \to \everyaftershipout
-
-\newif\ifarrangingpages \arrangingpagesfalse
+\newif\ifarrangingpages \arrangingpagesfalse
\newconstant\pageornamentstate % 0=on 1=one-off 2=always-off
-\def\pagebodyornamentstrue {\pageornamentstate\zerocount} % for a while
-\def\pagebodyornamentsfalse{\pageornamentstate\plusone} % for a while
-
\appendtoks
- \ifcase\pageornamentstate\or
- \pageornamentstate\zerocount
- \fi
+ \ifcase\pageornamentstate \or
+ \pageornamentstate\zerocount
+ \fi
\to \everyaftershipout
-\let\poparrangedpages\relax
-\let\pusharrangedpage\relax
-
-\ifdefined\shiftprintpagebox \else
- \let\shiftprintpagebox\gobbleoneargument
- \let\shiftpaperpagebox\gobbleoneargument
-\fi
+% Mark synchronization
-\ifdefined\registerpageposition \else
- \let\registerpageposition\gobbleoneargument
-\fi
+\newconditional\page_marks_building_successive_pages \settrue\page_marks_building_successive_pages
-\newif\ifsavepagebody \newbox\savedpagebody
+\def\page_marks_synchronize_page#1% box
+ {\dosynchronizemarking[\v!page][#1][\ifconditional\page_marks_building_successive_pages\v!keep\fi]}
-\def\docolumnpagebodymarks#1#2#3#4% first last column box
+\def\page_marks_synchronize_column#1#2#3#4% first last column box
{\ifnum#3=#1\relax
\dosynchronizemarking[\number#3,\v!column:\number#3,\v!first,\v!column:\v!first][#4][]%
\else\ifnum#3=#2\relax
@@ -806,700 +385,131 @@
\dosynchronizemarking[\number#3,\v!column:\number#3 ][#4][]%
\fi\fi}
-% tricky ... we need to retain the last mark
+% Page body building
-\newconditional\buildingsuccessivepages \settrue\buildingsuccessivepages
+\newconditional\c_page_boxes_save_page_body
+\newbox \b_page_boxes_saved_page_body
-% \starttext
-% \dorecurse{3} {
-% \startchapter[title=Chapter #1]
-% \input tufte
-% \dorecurse{4}{\placefigure{Number ##1}{\externalfigure[cow][height=9cm]}}
-% \stopchapter
-% }
-% \stoptext
-
-\def\buildpagebody#1#2%
- {\ifsavepagebody\global\setbox\savedpagebody\fi
- \vbox
- {%\forgetall % igv problemen, check: \boxmaxdepth\maxdimen
+\def\page_boxes_constructed_page_body#1#2%
+ {\ifconditional\c_page_boxes_save_page_body \global\setbox\b_page_boxes_saved_page_body \fi \vbox \bgroup
\boxmaxdepth\maxdimen % new
\dontcomplain
- % marks get done here
- \dosynchronizemarking[\v!page][#2][\ifconditional\buildingsuccessivepages\v!keep\fi]% #2 box
- % the following plugin uses and sets pagebox; beware: this
- % will change and is for my (hh) personal experiments .. takes two
- % arguments
- \constructpagecontent#1#2%
- % the finishing touch
+ \page_marks_synchronize_page{#2}% we could consider doing this for \pagebox (needs testting)
+ \page_boxes_construct_content#1#2% % this one fills pagebox
+ \page_backgrounds_add_to_main \pagebox
+ \page_boxes_apply_offsets \pagebox
+ \page_info_add_to_box \pagebox
\ifcase\pageornamentstate
- \addpagebackground \pagebox
+ \page_backgrounds_add_to_paper \pagebox
\fi
- \registerpageposition\pagebox
+ \registerpageposition \pagebox
\ifarrangingpages
- \shiftpaperpagebox \pagebox % \v!paper
+ \page_boxes_apply_shift_paper \pagebox % \v!paper
\else
- \clippagebox \pagebox
- \page_marks_add_page \pagebox
- \replicatepagebox \pagebox
- \scalepagebox \pagebox
- \mirrorpaperbox \pagebox
- \orientpaperbox \pagebox
- \page_marks_add_more \pagebox
- \centerpagebox \pagebox
- \addprintbackground \pagebox
- \mirrorprintbox \pagebox
- \orientprintbox \pagebox
- \shiftprintpagebox \pagebox % \v!page
- \offsetprintbox \pagebox
- \negateprintbox \pagebox
+ \page_boxes_apply_clip_paper \pagebox
+ \page_marks_add_page \pagebox
+ \page_boxes_apply_replicate \pagebox
+ \page_boxes_apply_scale \pagebox
+ \page_boxes_apply_mirror_paper \pagebox
+ \page_boxes_apply_orientate_paper \pagebox
+ \page_marks_add_more \pagebox
+ \page_boxes_apply_center \pagebox
+ \page_backgrounds_add_to_print \pagebox
+ \page_boxes_apply_mirror_print \pagebox
+ \page_boxes_apply_orientate_print \pagebox
+ \page_boxes_apply_shift_print \pagebox % \v!page
+ \page_boxes_apply_offset \pagebox
+ \page_boxes_apply_negate_print \pagebox
\fi
- \box\pagebox}%
- \ifsavepagebody\copy\savedpagebody\fi}
-
-\ifx\page_marks_add_page\undefined \let\page_marks_add_page\gobbleoneargument \fi
-\ifx\page_marks_add_more\undefined \let\page_marks_add_more\gobbleoneargument \fi
-
-% \setvalue{\??ly\c!method\v!normal}#1#2%
-% {\setbox\pagebox\vbox
-% {\offinterlineskip
-% \ifcase\pageornamentstate
-% \bgroup % else footnotes get inconsistent font/baseline
-% % color/style attributes
-% \offinterlineskip
-% \gettextboxes
-% \egroup
-% \fi
-% \getmainbox#1#2}% including footnotes
-% \ifcase\pageornamentstate
-% \addmainbackground \pagebox
-% \fi
-% \buildpagebox \pagebox
-% \addstatusinfo \pagebox}
-
-\ifx\constructnormalpagecontent\undefined
-
- \def\constructnormalpagecontent#1#2%
- {\setbox\pagebox\vbox
- {\offinterlineskip
- \gettextboxes
- \getmainbox#1#2}% including footnotes
- \addmainbackground\pagebox
- \buildpagebox\pagebox
- \addstatusinfo\pagebox}
-
-\fi
-
-\ifx\constructpagecontent\undefined
- \let\constructpagecontent\constructnormalpagecontent % will be overloaded
-\fi
-
-\def\finishpagebox#1%
- {\ifarrangingpages
- \page_marks_add_more#1%
- \centerpagebox #1%
- \mirrorprintbox #1%
- \orientprintbox #1%
- \offsetprintbox #1%
- \negateprintbox #1%
- \fi}
-
+ \box\pagebox
+ \egroup \ifconditional\c_page_boxes_save_page_body \copy\b_page_boxes_saved_page_body \fi}
+
\appendtoks \restoreouterspacing \to \everybeforepagebody
\appendtoks \restoreglobalbodyfont \to \everybeforepagebody
%appendtoks \restoreouterspacing \to \everybeforepagebody
-\ifx\nestednewbox\undefined \newbox\nestednextbox \fi
-
-\prependtoks \let\nextbox\nestednextbox \to \everybeforepagebody
-
-\def\dopagebody#1#2%
- {\the\everybeforepagebody
- \starttextproperties
-% \setnextsubpageno % nog eens: als in pagina (tbv standaard opmaak)
- \dontshowboxes % dan hier blokkeren en verderop resetten
-% \shipoutfacingpage
- \checkmarginblocks
- \the\beforeeverypage
- \normalexpanded{\global\beforepage\emptytoks\the\beforepage}% \scratchtoks\beforepage\global\beforepage\emptytoks\the\scratchtoks % was \flushtoks\beforepage
- \inpagebodytrue\buildpagebody#1#2%
- \normalexpanded{\global\afterpage \emptytoks\the\afterpage }% \scratchtoks\afterpage \global\afterpage \emptytoks\the\scratchtoks % was \flushtoks\afterpage
- \the\aftereverypage
- \resetpagebreak
- %updatelistreferences % now in aftereverypage
- \resetlayouttextlines % will go to \aftereverypage
- \stoptextproperties
- \the\everyafterpagebody}
-
-\newtoks\pageboundsettings
-
-% \prependtoks \initializepaper \to \pageboundsettings
-
-% not here
-
-\newif\ifpagebreakdisabled \pagebreakdisabledfalse
-
-\newconstant\testpagemethod % todo: \testnewpage[method=,lines=,voffset=]
-\newconstant\testpagetrigger
-
-\def\testpage {\dotripleempty\dotestpage[\plusone ]} %
-\def\testpageonly{\dotripleempty\dotestpage[\plustwo ]} % no penalties added to the mvl
-\def\testpagesync{\dotripleempty\dotestpage[\plusthree]} % force sync
-
-\def\dotestpage[#1][#2][#3]% don't change, only add more methods
- {\relax % needed before \if
- \ifpagebreakdisabled
- \endgraf
- \else
- % new from here
- \ifcase\testpagetrigger
- \endgraf
- \or
- \ifvmode
- \dosomebreak\allowbreak
- \else % indeed?
- \vadjust{\allowbreak}%
- \endgraf
- \fi
- \fi
- % till here
- \ifdim\pagegoal<\maxdimen \relax
- \ifdim\pagetotal<\pagegoal \relax
- \scratchdimen\lineheight
- \multiply\scratchdimen#2\relax
- \advance\scratchdimen \pagetotal
- \ifdim\lastskip<\parskip
- \advance\scratchdimen \parskip
- \fi
- \ifthirdargument
- \advance\scratchdimen#3\relax
- \fi
- \ifcase\testpagemethod
- \ifdim\scratchdimen>.99\pagegoal
- \penalty-\!!tenthousand\relax
- \fi
- \or
- \advance\scratchdimen-\pagegoal
- \ifdim\scratchdimen>-\lineheight
- \penalty-\!!tenthousand\relax
- \fi
- \or
- \getnoflines\pagegoal
- \advance\scratchdimen-\noflines\lineheight \relax
- \ifdim\scratchdimen>-\lineheight
- \penalty-\!!tenthousand\relax
- \fi
- \or % same as 0 but more accurate
- \advance\scratchdimen-10\s!sp\relax
- \ifdim\scratchdimen>\pagegoal
- \penalty-\!!tenthousand\relax
- \fi
- \fi
- \else
- \ifnum#1=\plusthree
- \flushpagesofar
- \fi
- \fi
- \else
- \ifnum#1=\plusone\goodbreak\fi
- \fi
- \fi}
-
-\def\flushpagesofar
- {\endgraf
- \ifdim\pagetotal>\pagegoal
- \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal
- \goodbreak % \penalty0
- \else
- \page
- \fi
- \else
- \fi}
-
-\def\testcolumn
- {\dodoubleempty\dotestcolumn}
-
-\def\dotestcolumn[#1][#2]%
- {%\relax % needed before \if !
- \endgraf
- \ifdim\pagegoal<\maxdimen \ifdim\pagetotal<\pagegoal % \relax
- \scratchdimen\pagegoal
- \advance\scratchdimen-\pagetotal
- \ifdim\lastskip<\parskip
- \advance\scratchdimen \parskip
- \fi
- \ifsecondargument
- \advance\scratchdimen#2%
- \fi
- \getrawnoflines\scratchdimen % raw !
- % \message{[\number#1>\number\noflines ?}\wait
- \ifnum#1>\noflines
- \column
- \fi
- \else
- \penalty-\!!tenthousand % untested ! ! \column
- \fi \fi}
-
-\ifdefined\resetcurrentstructuremarkswithpage \else
- \let\resetcurrentstructuremarkswithpage\relax
-\fi
-
-\def\page{\pagebreak} % the short form of \pagebreak (mult-com one)
-
-\def\resetpagebreak
- {\global\pagebreakdisabledfalse}
-
-\def\simplifypagebreak
- {\def\dopagebreak[##1]{\goodbreak}}
-
-\def\disablepagebreaks
- {\def\dopagebreak[##1]{}}
-
-\def\executepagebreakhandler#1%
- {\edef\@@pagespecification{#1}%
- \ifcsname\??pe:\@@pagespecification\endcsname
- \csname\??pe:\@@pagespecification\endcsname
- \else\ifcsname\??pe::\@@pagespecification\endcsname
- \executepagebreakhandlers{\csname\??pe::\@@pagespecification\endcsname}%
- \else
- \csname\??pe:\s!unknown\endcsname
- \fi\fi}
-
-\long\def\installpagebreakhandler#1#2%
- {\long\setvalue{\??pe:#1}{#2}}
-
-\unexpanded\def\pagebreak
- {\dosingleempty\dopagebreak}
-
-\def\dopagebreak[#1]% so, page ornaments are reset after a pagebreak command, unless set
- {\bgroup
- \flushnotes
- \edef\prevrealpageno{\the\realpageno}%
- \ifcase\pageornamentstate \or
- % disable reset after shipout
- \global\pageornamentstate\plustwo
- \fi
- \iffirstargument % or if empty i.e. []
- \executepagebreakhandlers{#1}%
- \else % so, no pagebreak when \pagebreak[] ! ! !
- \executepagebreakhandler\v!yes
- \fi
- \ifnum\prevrealpageno<\realpageno
- % there must have been a reason why i added the ifcase
- % but it fails on tests/mkiv/pages/ornaments-001.tex
- % as WS found out so we have to wait till the next side
- % effect shows up
- % \ifcase\pageornamentstate\or
- \global\pageornamentstate\zerocount
- % \fi
- \fi
+\ifdefined\nestednewbox \else \newbox\nestednextbox \fi % hm, still needed?
+
+\prependtoks
+ \let\nextbox\nestednextbox
+\to \everybeforepagebody
+
+\def\page_boxes_constructed_page#1#2%
+ {\vbox\bgroup % intercept spurious spaces
+ \the\everybeforepagebody
+ \starttextproperties
+ \dontshowboxes
+ \checkmarginblocks
+ \the\beforeeverypage
+ \normalexpanded{\global\beforepage\emptytoks\the\beforepage}%
+ \inpagebodytrue
+ \page_boxes_constructed_page_body#1#2%
+ \normalexpanded{\global\afterpage \emptytoks\the\afterpage }%
+ \the\aftereverypage
+ \resetpagebreak
+ \resetlayouttextlines % will go to \aftereverypage
+ \stoptextproperties
+ \the\everyafterpagebody
\egroup}
-\def\executepagebreakhandlers#1%
- {\processcommacommand[#1]\executepagebreakhandler}
-
-\installpagebreakhandler \s!dummy
- {\ejectinsert
- \gotonextpage
- \ejectdummypage}
-
-\installpagebreakhandler \v!frame
- {\page\bgroup\showframe\page[\v!empty]\egroup}
-
-\installpagebreakhandler \s!unknown
- {\doifinstringelse{+}\@@pagespecification
- {\ejectinsert
- \gotonextpage
- \dorecurse\@@pagespecification\ejectdummypage}
- {\doifnumberelse\@@pagespecification
- {\ejectinsert
- \gotonextpage
- \doloop
- {\ifnum\userpageno<\@@pagespecification\relax
- \ejectdummypage
- \else
- \exitloop
- \fi}}
- {}}}
-
-\installpagebreakhandler \s!default
- {} % do nothing if empty
-
-\installpagebreakhandler \v!reset
- {% better not: \global\pageornamentstate\zerocount
- \resetpagebreak}
-
-\installpagebreakhandler \v!disable
- {\global\pagebreakdisabledtrue}
-
-\installpagebreakhandler \v!yes
- {\ifpagebreakdisabled\else
- \ejectinsert
- \gotonextpage
- \ifinsidecolumns % this will move to MUL
- \ejectpage % anders soms geen overgang
- \fi
- \fi}
-
-\installpagebreakhandler \v!makeup % ??
- {\ifpagebreakdisabled\else
- \eject
- \fi}
-
-\installpagebreakhandler \v!blank
- {\ifcase\pageornamentstate
- \global\pageornamentstate\plusone
- \fi}
-
-\installpagebreakhandler \v!no
- {\ifpagebreakdisabled\else
- \dosomebreak\nobreak
- \fi}
+%D Shipout control.
-\installpagebreakhandler \v!preference
- {\ifpagebreakdisabled\else
- \ifinsidecolumns % this will move to MUL
- \dosomebreak\goodbreak
- \else
- \testpage[3][\zeropoint]%
- \fi
- \fi}
-
-\installpagebreakhandler \v!bigpreference
- {\ifpagebreakdisabled\else
- \ifinsidecolumns % this will move to MUL
- \dosomebreak\goodbreak
- \else
- \testpage[5][\zeropoint]%
- \fi
- \fi}
-
-\installpagebreakhandler \v!empty
- {\ejectinsert
- \gotonextpage
- \doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}%
- \doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}%
- \ejectdummypage}
-
-\installpagebreakhandler \v!left
- {\ejectinsert
- \gotonextpageX % will become \gotonextpage
- \doifbothsidesoverruled{}{\resetcurrentstructuremarkswithpage\ejectdummypage}{}}
-
-\installpagebreakhandler \v!right
- {\ejectinsert
- \gotonextpageX % will become \gotonextpage
- \doifbothsidesoverruled{}{}{\resetcurrentstructuremarkswithpage\ejectdummypage}}
-
-\installpagebreakhandler \v!even
- {\page
- \doifoddpageelse{\resetcurrentstructuremarkswithpage\ejectdummypage}\donothing}
-
-\installpagebreakhandler \v!odd
- {\page
- \doifoddpageelse\donothing{\resetcurrentstructuremarkswithpage\ejectdummypage}}
-
-\installpagebreakhandler \v!quadruple % not yet ok inside columnsets
- {\ifdoublesided
- \!!counta\realpageno
- \!!countb\realpageno
- \divide\!!counta 4
- \divide\!!countb 2
- \ifnum\!!counta=\!!countb
- \else
- \executepagebreakhandler\v!yes
- \executepagebreakhandler\v!empty
- \executepagebreakhandler\v!empty
- \fi
- \fi}
+\newconditional\c_otr_shipout_enabled \settrue\c_otr_shipout_enabled
-\installpagebreakhandler \v!last
- {\ejectinsert
- \gotonextpageX % will become \gotonextpage
- \relax
- \doifbothsidesoverruled
- {\shipoutfacingpage}
- {}
- {\noheaderandfooterlines \ejectdummypage}%
- \filluparrangedpages}
-
-\installpagebreakhandler \v!lastpage % handy for backpage preceded by empty pages
- {\executepagebreakhandler\v!yes
- \ifdoublesided
- \executepagebreakhandler\v!left
- \executepagebreakhandler\v!empty
- \executepagebreakhandler\v!empty
+\def\page_otr_shipout
+ {\ifconditional\c_otr_shipout_enabled
+ \expandafter\page_otr_shipout_yes
+ \else
+ \expandafter\page_otr_shipout_nop
\fi}
-\installpagebreakhandler \v!start
- {\globallet\shipout\normalshipout}
-
-\installpagebreakhandler \v!stop
- {\globallet\shipout\noshipout}
-
-% nb: \executepagebreakhandler\v!hoofd in other ones
+\let\page_otr_shipout_yes\normalshipout
-\installpagebreakhandler \v!header
- {\doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}}
-
-\installpagebreakhandler \v!footer
- {\doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}}
-
-% \definepagebreak
-% [chapter]
-% [yes,header,right]
-%
-% \setuphead
-% [chapter]
-% [page=chapter,
-% header=empty,
-% footer=chapter]
-%
-% \definepagebreak % untested
-% [lastpage]
-% [left,{empty,right},{empty,left}]
-
-% public page handler, beware: definepage already in use (core-ref)
-%
-% \definepagebreak[instance][forsure]
-% \definepagebreak[forsure][yes,+4]
-
-\unexpanded\def\definepagebreak
- {\dodoubleargument\dodefinepagebreak}
-
-\def\dodefinepagebreak[#1][#2]% non recursive, meant for simple mappings
- {\setvalue{\??pe::#1}{#2}}
-
-\long\def\installcolumnbreakhandler#1#2#3% #1=otr-id #2=tag
- {\long\setvalue{\??cn:#1:#2}{#3}}
-
-\unexpanded\def\definecolumnbreak
- {\dodoubleargument\dodefinecolumnbreak}
-
-\def\dodefinecolumnbreak[#1][#2]% non recursive, meant for simple mappings
- {\setvalue{\??cn::#1}{#2}}
-
-%\def\columnbreak
-% {\dosingleempty\docolumnbreak}
-%
-%\def\docolumnbreak[#1]%
-% {\expanded{\nextcolumn[\executeifdefined{\??cn::#1}{#1}]}}
-
-\definecomplexorsimple\columnbreak
-
-\def\simplecolumnbreak
- {\executecolumnbreakhandler\v!yes}
-
-\def\complexcolumnbreak[#1]% if empty, do nothing and avoid processing
- {\doifsomething{#1}{\executecolumnbreakhandlers{#1}}}
-
-\def\executecolumnbreakhandlers#1%
- {\processcommacommand[#1]\executecolumnbreakhandler}
-
-\def\executecolumnbreakhandler#1% here no commalist
- {\edef\@@columnspecification{#1}%
- \doifdefinedelse{\??cn:\OTRidentifier:\@@columnspecification}
- {\getvalue{\??cn:\OTRidentifier:\@@columnspecification}}
- {\doifdefinedelse{\??cn::\@@columnspecification}
- {\executecolumnbreakhandlers{\getvalue{\??cn::\@@columnspecification}}}
- {\getvalue{\??cn:\OTRidentifier:\s!unknown}}}}
-
-%let\nextcolumn\columnbreak
-\let\column \columnbreak
-
-% We don't want spurious last pages (due to left over marks):
-
-\def\noshipout
- {\writestatus\m!system{ignoring further shipouts}%
+\unexpanded\def\page_otr_shipout_nop
+ {\writestatus\m!system{ignoring shipout of real page \the\realpageno}%
\global\advance\realpageno\minusone % else no flush of resources
\dowithnextbox{\deadcycles\zerocount}}
-% \def\doignorerestoftext
-% {\ifarrangingpages \else \ifnum\textlevel>\zerocount \else
-% \globallet\shipout\noshipout
-% \fi \fi}
-%
-% better:
-
-\def\doignorerestoftext
- {\ifarrangingpages \else \ifnum\textlevel=\plusone
- \globallet\shipout\noshipout
- \fi \fi}
-
-\let\ignorerestoftext\donothing
-
-\prependtoks % only ignore in a symmetrical doc
- \globallet\ignorerestoftext\doignorerestoftext
-\to \everystarttext
-
-% \appendtoks
-% \ignorerestoftext
-% \to \everylastshipout
-
-\newif\ifpageselected \pageselectedtrue
-\newif\ifselectingpages \selectingpagesfalse
-\newif\ifprocessingpages\processingpagestrue
-
-\let\pageselection \empty
-\let\currentpageselection\empty
-\let\aftershipout \relax
-\let\beforeshipout \relax
-
-\def\dodobeforeshipout#1%
- {\global\let\beforeshipout\relax
- \csname\??pg#1\c!before\endcsname}
-
-\def\dobeforeshipout
- {\doifsomething\currentpageselection
- {\processcommacommand[\currentpageselection]\dodobeforeshipout}}
-
-\def\dododoaftershipout#1%
- {\global\let\aftershipout\relax
- \global\let\currentpageselection\empty
- \csname\??pg#1\c!after\endcsname}
-
-\def\dodoaftershipout#1%
- {\doifelsevalue{\??pg#1\c!option}\v!doublesided
- {\doifbothsidesoverruled
- {\dododoaftershipout{#1}}
- {\dododoaftershipout{#1}}
- {}}
- {\dododoaftershipout{#1}}}
-
-\def\doaftershipout
- {\doifsomething\currentpageselection
- {\processcommacommand[\currentpageselection]\dodoaftershipout}}
-
-\def\docouplepage[#1][#2]%
- {\getparameters
- [\??pg]
- [\c!before=,
- \c!after=,
- \c!option=,
- #2]%
- \def\docommand##1%
- {\getparameters
- [\??pg##1]
- [\c!before=\@@pgbefore,
- \c!after=\@@pgafter,
- \c!option=\@@pgoption]}%
- \processcommalist[#1]\docommand}%
-
-\def\couplepage
- {\dodoubleargument\docouplepage}
-
-\def\doprocesspage[#1][#2]%
- {\processaction
- [#2]
- [\v!yes=>\global\processingpagestrue,
- \v!no=>\global\processingpagesfalse]%
- \gdef\pageselection{#1}%
- \global\selectingpagestrue
- \global\pageselectedfalse}
-
-\def\processpage
- {\dodoubleargument\doprocesspage}
-
-\def\resetselectiepagina
- {\ifselectingpages
- \doifbothsidesoverruled{\global\pageselectedfalse}{}{\global\pageselectedfalse}%
- \fi}
-
-\newif\ifregistertextareas
-\newif\iftracetextareas
-
-\newbox\registertextbox
-
-% \def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box
-% {\hbox{\box#3}}
-
-\def\enabletextarearegistration{\global\registertextareastrue}
-
-\def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box
- {\hbox\bgroup
- \ifregistertextareas \ifx\registerMPtextarea\undefined \else
- \setbox\registertextbox\emptyhbox
- \wd\registertextbox\wd#3%
- \ht\registertextbox\ht#3%
- \dp\registertextbox\dp#3%
- \ifcase#1\or % 1
- \setbox\registertextbox\hbox{\lower\strutdp\box\registertextbox}%
- \fi
- \ifcase#2\or % 1
- \setbox\registertextbox\hbox{\raise\topskip\hbox{\lower\strutht\box\registertextbox}}%
- \dp\registertextbox\strutdp
- \fi
- \dp\registertextbox\strutdp % needed
- %\setbox\registertextbox\hbox
- % {\iftracetextareas\gray\boxrulewidth2pt\ruledhbox\fi
- % {\registerMPtextarea{\box\registertextbox}}}%
- \setbox\registertextbox\hbox
- {\registerMPtextarea{\box\registertextbox}}%
- \smashbox\registertextbox
- \box\registertextbox
- \fi \fi
- \box#3%
- \egroup}
+% \let\shipout\page_otr_shipout_nop % we don't support direct user \shipouts (weird: this does not work, bug?)
-%D \macros
-%D {setupoppositeplacing,startopposite}
+%D The \type {\processpage} command has become obsolete. It's original
+%D purpose was to flush only parts of a document but nowadays we have
+%D project structure and modes. This is just one of those very early
+%D features that no longer makes sense.
%D
-%D \starttyping
-%D \starttext
-%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test
-%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test
-%D \stoptext
-%D \stoptyping
-
-% Moved from page-mar.tex, made english, cleaned up, but still to be
-% redesigned
-
-\newbox\facingpage
-
-\unexpanded\def\setupoppositeplacing
- {\dodoubleargument\getparameters[\??np]}
-
-\unexpanded\def\startopposite
- {\dowithnextboxcontent
- {\hsize\makeupwidth}%
- {\global\setbox\facingpage\vbox
- {\ifvoid\facingpage
- \@@npbefore
- \else
- \@@npinbetween
- \unvbox\facingpage
- \fi
- \box\nextbox}}%
- \vbox\bgroup}
-
-\unexpanded\def\stopopposite
- {\egroup}
-
-\def\finishfacingpage
- {\ifvoid\facingpage\else
- \global\setbox\facingpage\vbox to \makeupheight
- {\unvbox\facingpage
- \@@npafter
- \vss}%
- \fi}
-
-\def\shipoutfacingpage
- {\doif\@@npstate\v!start
- {\ifvoid\facingpage\else
- \ifnum\realpageno>\plusone
- \bgroup
- \pageornamentstate\plusone
- \finishfacingpage
- \myshipout{\buildpagebody\box\facingpage}%
- \egroup
- \else
- \global\setbox\facingpage\emptybox
- \fi
- \fi}}
-
-\setupoppositeplacing
- [\c!state=\v!start,
- \c!before=,
- \c!inbetween=\blank,
- \c!after=]
+%D The \type {\couplepage} command has become obsolete. It's original
+%D purpose was to provide hooks for printer directives (like choosing
+%D different paper trays).
\protect \endinput
+
+% bewaren tvb documentatie
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.2\hsize
+% \vsize=2\hsize
+% \ruledvbox to \vsize{\input tufte \par}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss
+% \ruledvbox to \vsize{\input tufte \par\vfill}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}}
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.18\hsize
+% \vsize=2.5\hsize
+% \setbox0=\vbox{\input tufte\relax}%
+% \ruledvbox to \vsize{\unvcopy0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss
+% \ruledvbox to \vsize{\unvcopy0\vfill}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}}