%D \module %D [ file=page-flt, %D version=2010.04,08, %D title=\CONTEXT\ Page Macros, %D subtitle=Float Management, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA / Hans Hagen \& Ton Otten}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. \writestatus{loading}{ConTeXt Page Macros / Float Management} %D This module has code that previously was in other modules. There is %D also float related code in \type {strc-flt.mkiv}. \registerctxluafile{page-flt}{1.001} \unprotect %D To be checked and removed %def\dosavefloatinfo {\showmessage\m!floatblocks2{\the\totalnoffloats}} \def\doinsertfloatinfo {\showmessage\m!floatblocks4{\the\totalnoffloats}} \def\dofloatflushedinfo{\showmessage\m!floatblocks3{\the\numexpr\totalnoffloats-\savednoffloats\relax}} %D Extra float registers. \newif\ifsomefloatwaiting \somefloatwaitingfalse \newif\ifroomforfloat \roomforfloattrue \newif\ifnofloatpermitted \nofloatpermittedfalse \newif\ifcenterfloatbox \centerfloatboxtrue \newif\iflocalcenterfloatbox \localcenterfloatboxfalse \newif\ifglobalcenterfloatbox \globalcenterfloatboxfalse \newif\ifflushingfloats \flushingfloatsfalse \newif\ifpackflushedfloats \packflushedfloatstrue % for the moment \newif\ifpackcolumnfloats \packcolumnfloatstrue \newcount\totalnoffloats \newcount\savednoffloats \newcount\noffloatinserts \newcount\nofcollectedfloats % communication channel \newbox \floatlist \newbox \savedfloatlist \newbox \floattext \newdimen\floatwidth \newdimen\floatheight \newdimen\floatdepth \newdimen\floattextwidth \newdimen\floattextheight \newbox \floatbox \newbox \savedfloatbox %D From now on we manage the float stack at the \LUA\ end instead of packing %D them in a box and splitting off stacked floats. It's not so much less code %D but it's cleaner this way. It also opens op some posibilities as we can now %D more conveniently cary additional information around. \newtoks \everyfloatscheck \appendtoks \ifcase\savednoffloats \global\somefloatwaitingfalse \else \global\somefloatwaitingtrue \fi \to \everyfloatscheck \def\dofloatsflush#1#2% {\ctxlua{floats.flush("#1",\number#2)}% \the\everyfloatscheck} \def\dofloatssave#1% {\ctxlua{floats.save("#1")}% \the\everyfloatscheck} \def\dofloatsresave#1% {\ctxlua{floats.resave("#1")}% \the\everyfloatscheck} \def\dopushsavedfloats {\ctxlua{floats.push()}% \the\everyfloatscheck} \def\dopopsavedfloats {\ctxlua{floats.pop()}% \the\everyfloatscheck} \def\dofloatsgetinfo#1% {\ctxlua{floats.consult("#1")}} \def\doifsavedfloatelse#1% {\ctxlua{commands.doifsavedfloatelse("#1")}} \def\dofloatscollect#1#2#3% {\ctxlua{floats.collect("#1",\number\dimexpr#2,\number\dimexpr#3)}} \def\dofloatsnofstacked#1% {\ctxlua{floats.thestacked("#1")}} \def\dofloatsgetvariable#1% {\ctxlua{floats.thevar("specification")}} \let\dopushcolumnfloats\dopushsavedfloats \let\dopopcolumnfloats \dopopsavedfloats \def\dofloatssavepagefloat#1#2% {\ctxlua{floats.save("#1", { specification = "#2" })}} %D The following code is in transition as we don't want to break the %D current single column, multi column, and columnset mechanism. %D %D First we reimplement some helpers. \def\dogetfloat {\ifsomefloatwaiting \dofloatsflush{text}{1}% \ifcenterfloatbox \ifdim\wd\globalscratchbox<\hsize \global\setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}% \else % retain special alignments \ifinsidecolumns \ifdim\wd\floatbox>\makeupwidth \global\wd\floatbox\makeupwidth \fi \fi \fi \fi \else \global\savednoffloats\zerocount \global\setbox\floatbox\emptybox \fi} \def\dosavefloat {\dofloatssave{text}% \nonoindentation} % brrr nonoindentation here \def\doresavefloat {\dofloatsresave{text}} \def\doreversesavefloat {\dofloatsresave{text}} \def\doflushsavedfloats % simplified \OTRONEdodoflushfloats {\doloop {\ifsomefloatwaiting \docheckiffloatfits \ifroomforfloat \dogetfloat \doplacefloatbox \else \exitloop \fi \else \exitloop \fi}} %D Page floats use different stacks. \newtoks \everybeforeflushedpagefloat \def\doflushsomepagefloat#1% future releases can do more clever things {\dofloatsflush{#1}{1}% \edef\floatspecification{\dofloatsgetvariable{specification}}% \the\everybeforeflushedpagefloat \vbox to \textheight {\doifnotinset\v!high\floatspecification\vfill \box\floatbox \doifnotinset\v!low\floatspecification\vfill}% \vfill\eject} % \def\doflushpagefloats % {\doifoddpageelse % {\ifnum\dofloatsnofstacked{rightpage}>\zerocount % \doflushsomepagefloat{rightpage}% % \else\ifnum\dofloatsnofstacked{page}>\zerocount % \doflushsomepagefloat{page} % \else\ifnum\dofloatsnofstacked{leftpage}>\zerocount % \null\vfill\eject % %\doflushsomepagefloat{leftpage}% % \fi\fi\fi} % {\ifnum\dofloatsnofstacked{leftpage}>\zerocount % \doflushsomepagefloat{leftpage}% % \else\ifnum\dofloatsnofstacked{page}>\zerocount % \doflushsomepagefloat{page} % \else\ifnum\dofloatsnofstacked{rightpage}>\zerocount % \null\vfill\eject % %\doflushsomepagefloat{rightpage}% % \fi\fi\fi}} \def\doflushpagefloats {\edef\checkedpagefloat{\ctxlua{floats.thecheckedpagefloat()}}% (true) for packed \ifx\checkedpagefloat\empty % nothing \else\ifx\checkedpagefloat\v!empty \null\vfill\eject \else \doflushsomepagefloat\checkedpagefloat \fi\fi} \def\uncenteredfloatbox {\ifcenterfloatbox \ifhbox\floatbox\relax % remove centering \ifdim\wd\floatbox=\hsize \ifhbox\floatbox \setbox\scratchbox\hbox {\unhbox\floatbox \unskip\unskip \global\setbox\globalscratchbox\lastbox}% \box\globalscratchbox \else \box\floatbox \fi \else \box\floatbox \fi \else \box\floatbox \fi \else \box\floatbox \fi} \ifdefined\doflushfloats\else \let\doflushfloats\relax \fi \ifdefined\flushfloatbox\else \let\flushfloatbox\relax \fi \protect \endinput