%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\dofloatsflushbylabel#1#2% {\ctxlua{floats.flush("#1","#2",true)}% \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% {\ctxcommand{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" })}} \def\dofloatssavesomewherefloat#1#2% #1=method {\ctxlua{floats.save("#1", { specification = "#2", label = "\floatlabel" })}} %D This is an experimental new feature (for Alan Braslau), a prelude to more: %D %D \starttyping %D test \placefigure{}{} %D test \placefigure[somewhere:alpha][whatever]{}{} %D test \placefigure[somewhere:beta] [whatever]{}{} %D test \placefigure[somewhere:gamma][whatever]{}{} %D test \placefigure[somewhere:delta][whatever]{}{} %D test \placefigure{}{} %D %D in \in{figure}[whatever] bla bla %D %D \placenamedfloat[figure][*l*] %D \placenamedfloat[figure][gamma] %D \placenamedfloat[figure][beta] %D \stoptyping \def\placenamedfloat {\dodoubleargument\doplacenamedfloat} \def\doplacenamedfloat[#1][#2]% {\doloop {\dofloatsflushbylabel\s!somewhere{#2}% \ifvoid\floatbox \exitloop \else \def\currentfloat{#1}% \blank[\@@bkspacebefore]% \box\floatbox \blank[\@@bkspaceafter] \fi}} %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\s!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\s!text \nonoindentation} % brrr nonoindentation here \def\doresavefloat {\dofloatsresave\s!text} \def\doreversesavefloat {\dofloatsresave\s!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\s!rightpage>\zerocount % \doflushsomepagefloat\s!rightpage % \else\ifnum\dofloatsnofstacked\s!page>\zerocount % \doflushsomepagefloat\s!page % \else\ifnum\dofloatsnofstacked\s!leftpage>\zerocount % \emptyhbox\vfill\eject % %\doflushsomepagefloat\s!leftpage % \fi\fi\fi} % {\ifnum\dofloatsnofstacked\s!leftpage>\zerocount % \doflushsomepagefloat\s!leftpage % \else\ifnum\dofloatsnofstacked\s!page>\zerocount % \doflushsomepagefloat\s!page % \else\ifnum\dofloatsnofstacked\s!rightpage>\zerocount % \emptyhbox\vfill\eject % %\doflushsomepagefloat\s!rightpage % \fi\fi\fi}} \def\doflushpagefloats {\edef\checkedpagefloat{\ctxlua{floats.thecheckedpagefloat()}}% (true) for packed \ifx\checkedpagefloat\empty % nothing \else\ifx\checkedpagefloat\v!empty \emptyhbox\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 % temp hack, needed to prevent floatbox being forgotten during % output, this will change to using another box for flushing % % \dorecurse{700}{text } \placefigure[top][]{First} {\framed{bla 1}} % \placefigure[top][]{Second}{\framed{bla 2}} % \dorecurse {40}{text } \placefigure[top][]{Third} {\framed{bla 3}} \newbox\savedfloatbox \appendtoks \global\setbox\savedfloatbox\box\floatbox \to \everybeforeoutput \appendtoks \global\setbox\floatbox\box\savedfloatbox \to \everyafteroutput \protect \endinput