\unprotect % % % NOT ENGLISH % % % % clean up footnotes to notes % We need to set the \dimen globally since we are in the % OTR. Unfortunately this interferes with local settings, % although we may assume that they will not cross page % boundaries. \def\OTRSETcheckcontent {\bgroup \donefalse \def\OTRSETcheckcontent##1% {\setbox\scratchbox##1\recurselevel \setbox\scratchbox\vbox{\unvbox\scratchbox}% \ifdim\ht\scratchbox>\zeropoint\donetrue\fi}% \dorecurse{\nofcolumns} {\OTRSETcheckcontent\columngettextbox \OTRSETcheckcontent\columngetfootbox \OTRSETcheckcontent\columngettopbox \OTRSETcheckcontent\columngetbotbox}% \ifdone\egroup\donefalse\else\egroup\donetrue\fi} \def\OTRSETgetcolumntextheight#1% max - boven - top {\scratchdimen=\OTRSETgetparameter\c!maxhoogte#1% \advance\scratchdimen -\OTRSETgetparameter\c!bovenoffset#1% \advance\scratchdimen -\ht\columntopbox#1% \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% \advance\scratchdimen -\ht\columnbotbox#1} % not used \def\OTRSETgetcolumnnaturalheight#1% max - boven - top {\setbox\scratchbox\vbox{\unvcopy\columntextbox#1}% \scratchdimen\ht\scratchbox \advance\scratchdimen \OTRSETgetparameter\c!bovenoffset#1% \advance\scratchdimen \ht\columntopbox#1% \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% \advance\scratchdimen \ht\columnbotbox#1} % not used \def\OTRSETdobalance% splitten in met en zonder footnotes {\bgroup \maxdeadcycles=1000 % collect content and notes \bgroup \OTRSEToutput {\global\setbox1\vbox{\unvbox\normalpagebox}% \global\setbox3\vbox{\unvbox\footins}}% \verticalstrut\vskip-\struttotal % makes footnotes flush \eject \global\collectingcontentfalse % check for footnotes only \ifdim\ht1<\topskip % real dirty \global\setbox1=\vbox{} % fix height of first line \ifdim\ht3>\!!zeropoint \global\setbox3\vbox {\setfootnotebodyfont \kern-\strutht \kern\topskip \unvbox3} \fi % prepare trial box \global\setbox5\vbox {\ifdim\ht1>\zeropoint \unvcopy1 \ifdim\ht3>\zeropoint \kern\skip\footins \fi \fi \ifdim\ht3>\zeropoint \unvcopy3 \fi} \egroup % erase old stuff \columnerasetextboxes \columnerasefootboxes % prepare floats \OTRSETdotopinsertions \OTRSETdobotinsertions % not used can be removed % calculate available space \!!heighta\zeropoint % available total height \dorecurse{\nofcolumns} {\OTRSETgetcolumntextheight\recurselevel \OTRSETcalculatelines\scratchdimen \advance\!!heighta \scratchdimen} % quick check \ifdim\ht5>\!!heighta % use normal routine \columnerasetextboxes \columnerasefootboxes % TEMP, TODO, FORCE NEXT PASS ! \unvbox1 \unvbox3 \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist \donefalse %\writestatus\m!columns{no balancing, text overflows height}% \else\ifdim\ht5>\zeropoint \relax % some text and/or notes \donetrue \else \donefalse \dorecurse\nofcolumns {\ifdim\ht\columntopbox\recurselevel>\zeropoint \donetrue \fi}% \ifdone % no text and notes, but figures \else % no text, no notes, no figures \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist \writestatus\m!columns{no balancing, nothing to be placed}% \fi \fi\fi \ifdone \ifdim\ht5>\zeropoint \relax % balancing text and notes %\writestatus\m!columns{text may fit, balancing}% \newcounter\loopcounter \newcounter\balancinglines \doloop {\increment\loopcounter\relax % initialize \columnerasetextboxes \columnerasefootboxes \setbox0=\copy5 \splittopskip\topskip % pre-split loop and quality calculation %\writestatus\m!columns{pass \loopcounter: correction -\balancinglines} \dorecurse\nofcolumns {\OTRSETgetcolumntextheight\recurselevel \OTRSETcalculatelines\scratchdimen \!!heightc\scratchdimen \ifnum\recurselevel<\nofcolumns \advance\!!heightc -\balancinglines\lineheight \fi \columnsettextbox\recurselevel\vsplit0 to \!!heightc} % just one method \OTRSETgetcolumnnaturalheight1 \dimen4\scratchdimen \OTRSETgetcolumnnaturalheight\nofcolumns \dimen6\scratchdimen %\writestatus\m!columns{first column: \the\dimen4}% %\writestatus\m!columns{last column: \the\dimen6}% \ifdim\dimen4=\dimen6 \donetrue % perfect balance \else\ifdim\dimen4>\dimen6 \donefalse % not yet good enough \increment\balancinglines % try again \edef\balancingcount{\the\!!counta} \else \donetrue % worse balance \ifnum\balancinglines>0 % take previous \decrement\balancinglines \fi \fi\fi % extra check % \ifdim\ht0>\zeropoint\relax \donefalse \fi % another check \ifdone %\writestatus\m!columns{balancing finished in pass \loopcounter}% \else \ifnum\loopcounter>100 \donetrue %\writestatus\m!columns{balancing aborted after pass \loopcounter}% \else %\writestatus\m!columns{balancing continued after pass \loopcounter}% \fi \fi % final balancing pass \ifdone \setbox0\copy1 \setbox2\copy3 \columnerasetextboxes \columnerasefootboxes \dorecurse\nofcolumns {\OTRSETgetcolumntextheight\recurselevel \OTRSETcalculatelines\scratchdimen \!!heightc\scratchdimen \ifnum\recurselevel<\nofcolumns \advance\!!heightc -\balancinglines\lineheight \fi % split off text \ifdim\ht0>\zeropoint \columnsettextbox\recurselevel\vsplit0 to \!!heightc \setbox4\vbox{\unvcopy\columntextbox\recurselevel} \advance\!!heightc -\ht4 \ifdim\ht0>\zeropoint \columnsettextbox\recurselevel\box4 \advance\!!heightc \skip\footins \fi \fi % split off footnotes \ifdim\ht0>\zeropoint\relax \else \ifdim\ht2>\zeropoint\relax \setbox4\vsplit2 to \!!heightc \setbox\footins=\vbox{\unvbox4} % ugly and dirty trick \ifdim\ht\columntextbox\recurselevel=\zeropoint\relax \columnsettextbox\recurselevel\hbox {\raise\strutdp\hbox % ugly but needed {\setfootnotebodyfont % both these moves \lower\strutdp\hbox{\placebottomnotes}}} \else \columnsetfootbox\recurselevel\hbox{\placebottomnotes} \fi \fi \fi} \exitloop \fi} \else % no reason to balance floats \fi \fi \doglobal\addtocommalist{\realfolio}\OTRSETbalancinglist \OTRSETdoflush \fi \egroup} \protect \endinput % \def\OTRSETsetbalanceht#1#2% var col % {#1\getvalue{\??mc\OTRSETidentifier\number#2\c!regels}\relax % \ifcase#1#1\getvalue{\??mc\OTRSETidentifier\c!regels}\relax\fi % \ifcase#1#1\savedcolumnmaxcells\relax\fi} % \def\OTRSETinitbalancing % {\ifbalancecolumns % \let\savedcolumnmaxcells\columnmaxcells % \ifnum\realpageno=\balancingpageno\relax % \ifnum\mofcolumns=\plusone\relax % \ifcase\OTRSETbottombalance \else % \!!countc\zeropoint % \dorecurse\nofcolumns % {\OTRSETsetbalanceht\!!countb\recurselevel % \ifnum\!!countb>\!!countc\!!countc\!!countb\fi}% % \fi % \dorecurse\nofcolumns % {\!!counta\recurselevel\relax % % can be an option: absolute versus relative % \ifcase\OTRSETbottombalance % \OTRSETsetbalanceht\!!countb\recurselevel % \advance\!!countb\precolumnlines % \ifnum\!!countb>\localcolumnmaxcells\relax % \xdef\localcolumnmaxcells{\the\!!countb}% % \fi % \advance\!!countb \plusone % \dostepwiserecurse\!!countb\columnmaxcells\plusone % {\ifvoid\OTRSETgridcell\!!counta\recurselevel % \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe % \fi}% % \else % \globallet\localcolumnmaxcells\columnmaxcells % \!!countb\!!countc % \advance\!!countb-\columnmaxcells % \!!countb-\!!countb % \advance\!!countb \minusone % \ifnum\!!countb>\zerocount % \dostepwiserecurse\plusone\!!countb\plusone % {\ifvoid\OTRSETgridcell\!!counta\recurselevel % \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe % \fi}% % \OTRSETsetbalanceht\!!countb\recurselevel % \ifnum\!!countc>\!!countb % \!!countd\columnmaxcells % \advance\!!countd-\!!countc % \advance\!!countd+\!!countb % \dostepwiserecurse\!!countd\columnmaxcells\plusone % {\ifvoid\OTRSETgridcell\!!counta\recurselevel % \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe % \fi}% % \fi % \fi % \fi}% % \OTRSETsetvsize % ! ! ! % \fi % \fi % \fi}