summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/page-flt.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/page-flt.mkiv')
-rw-r--r--Master/texmf-dist/tex/context/base/page-flt.mkiv233
1 files changed, 233 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/page-flt.mkiv b/Master/texmf-dist/tex/context/base/page-flt.mkiv
new file mode 100644
index 00000000000..944626b8e9c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/page-flt.mkiv
@@ -0,0 +1,233 @@
+%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