summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/page-sid.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/page-sid.mkiv')
-rw-r--r--tex/context/base/mkiv/page-sid.mkiv196
1 files changed, 135 insertions, 61 deletions
diff --git a/tex/context/base/mkiv/page-sid.mkiv b/tex/context/base/mkiv/page-sid.mkiv
index 50023c2e8..477675ce6 100644
--- a/tex/context/base/mkiv/page-sid.mkiv
+++ b/tex/context/base/mkiv/page-sid.mkiv
@@ -193,19 +193,29 @@
\def\page_sides_flush_floats
{\par
- \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint
- \page_sides_flush_floats_indeed
- \else
- % no need as the par just fits next to the previous float
+ \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint % -\pagedepth
+ \page_sides_flush_floats_progress
+ \page_sides_flush_floats_after_next
+ \fi
+ \page_sides_flush_floats_reset}
+
+\def\page_sides_flush_floats_text
+ {\par
+ \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint % -\pagedepth
+ \page_sides_flush_floats_progress
+ \page_sides_flush_floats_after_none
\fi
+ \page_sides_flush_floats_reset}
+
+\def\page_sides_flush_floats_reset
+ {\global\d_page_sides_vsize\d_page_sides_vsize_reset
% also here if used at all \global\holdinginserts\zerocount
- \global\d_page_sides_vsize\d_page_sides_vsize_reset
\global\setfalse\c_page_sides_short
\global\setfalse\c_page_sides_flag}
\unexpanded\def\doifelsesidefloat
{\par
- \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint
+ \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint % -\pagedepth
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
@@ -217,70 +227,86 @@
\setvalue{\??sidefloatsteps\v!line }{\strut}
\setvalue{\??sidefloatsteps\v!big }{\strut}
-\setvalue{\??sidefloatsteps\v!medium}{\halfstrut}
-\setvalue{\??sidefloatsteps\v!small }{\quarterstrut}
-\setvalue{\??sidefloatsteps\v!depth }{\depthstrut}
+\setvalue{\??sidefloatsteps\v!medium}{\halflinestrut} % was \halfstrut
+\setvalue{\??sidefloatsteps\v!small }{\noheightstrut} % was \quarterstrut
% we don't officially know what kind of float we flush
-\def\page_sides_flush_floats_blank#1% we need to deal with the distance
- {\ifdim\d_page_sides_bottomskip>\d_page_sides_topskip
- \blank[%
- \ifnum#1>\zerocount\v!nowhite,\fi
- \ifdim\d_page_sides_topskip >\zeropoint-\rootfloatparameter\c!sidespacebefore,\fi % the next one
- \ifdim\d_page_sides_bottomskip>\zeropoint \rootfloatparameter\c!sidespaceafter \fi
- ]%
- \else\ifdim\d_page_sides_bottomskip<\d_page_sides_topskip
- \blank[%
- \ifnum#1>\zerocount\v!nowhite,\fi
- \ifdim\d_page_sides_bottomskip>\zeropoint -\rootfloatparameter\c!sidespaceafter ,\fi
- \ifdim\d_page_sides_topskip >\zeropoint \rootfloatparameter\c!sidespacebefore \fi
- ]%
- \fi\fi}
-
\def\page_sides_flush_floats_tracer
{\dontleavehmode
\ruledhpack\bgroup\backgroundline[trace:b]{%
+ \llap{\smash{\vrule\s!width4\points\s!height.4\points\s!depth.4\points}}%
\ifnum\recurselevel=\plusone
- \llap{{\smallinfofont\the\scratchdimen}\hskip.5\leftmargindistance}%
+ \llap{\smash{\smallinfofont\the\scratchdimen}\hskip.5\leftmargindistance}%
\else\ifodd\recurselevel
- \llap{{\smallinfofont\recurselevel}\hskip.5\leftmargindistance}%
+ \llap{\smash{\smallinfofont\recurselevel}\hskip.5\leftmargindistance}%
\fi\fi
- \m_pages_strut
+ \page_sides_flush_floats_normal
\kern\hsize
\egroup}}
-\def\page_sides_flush_floats_indeed
- {% the \d_page_sides_bottomskip == \rootfloatparameter\c!sidespaceafter is embedded
- % in the progression of the float
- \begingroup
+\def\page_sides_flush_floats_normal
+ {\ifdim\scratchdimen>\htdp\strutbox
+ \strut
+ \else
+ \m_pages_strut
+ \fi}
+
+% the \d_page_sides_bottomskip == \rootfloatparameter\c!sidespaceafter is embedded
+% in the progression of the float
+
+\def\page_sides_flush_floats_progress
+ {\begingroup
\let\page_sides_flush_floats\relax
\edef\m_pages_strut
{\ifcsname\??sidefloatsteps\rootfloatparameter\c!step\endcsname
\lastnamedcs
\else
- \strut
- \fi}%
+ \noheightstrut
+ \fi}%
\forgetall
+ \offinterlineskip
\doloop
- {\scratchdimen\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax
- \iftracesidefloats
- \page_sides_flush_floats_tracer
- \else
- \m_pages_strut
- \fi
- \par
- \nointerlineskip
- \ifdim\scratchdimen>\zeropoint
+ {\scratchdimen\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal-\pagedepth\relax
+ \ifdim\scratchdimen>\onepoint % good enough, if we change it it will become a threshold
\ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles
\exitloop
- \fi
+ \else\iftracesidefloats
+ \page_sides_flush_floats_tracer\par
+ \else
+ \page_sides_flush_floats_normal\par
+ \fi\fi
\else
\exitloop
\fi}%
- \endgroup
- % we're going to add top space anyway so ....
- \ifdim\parskip>\zeropoint % why this test ?
+ \endgroup}
+
+\def\page_sides_flush_floats_after_none
+ {\ifdim\parskip>\zeropoint % why this test ?
+ \ifdim\d_page_sides_bottomskip>\parskip
+ \blank[\v!nowhite,\rootfloatparameter\c!sidespaceafter]%
+ \fi
+ \else
+ \blank[\rootfloatparameter\c!sidespaceafter]%
+ \fi}
+
+\def\page_sides_flush_floats_blank#1% we need to deal with the distance
+ {\ifdim\d_page_sides_bottomskip>\d_page_sides_topskip
+ \blank[%
+ \ifnum#1>\zerocount\v!nowhite,\fi
+ \ifdim\d_page_sides_topskip >\zeropoint-\rootfloatparameter\c!sidespacebefore,\fi % the next one
+ \ifdim\d_page_sides_bottomskip>\zeropoint \rootfloatparameter\c!sidespaceafter \fi
+ ]%
+ \else\ifdim\d_page_sides_bottomskip<\d_page_sides_topskip
+ \blank[%
+ \ifnum#1>\zerocount\v!nowhite,\fi
+ \ifdim\d_page_sides_bottomskip>\zeropoint -\rootfloatparameter\c!sidespaceafter ,\fi
+ \ifdim\d_page_sides_topskip >\zeropoint \rootfloatparameter\c!sidespacebefore \fi
+ ]%
+ \fi\fi}
+
+\def\page_sides_flush_floats_after_next
+ {\ifdim\parskip>\zeropoint % why this test ?
\ifdim\d_page_sides_bottomskip>\parskip
\page_sides_flush_floats_blank\plusone
\fi
@@ -405,15 +431,18 @@
\def\page_sides_apply_vertical_shift_traced
{\global\setbox\floatbox\hpack % why extra box
{\backgroundline[trace:r]{\ruledhpack{\vpack
- {\hsize\wd\floatbox
+ {\forgetall
+ \hsize\wd\floatbox
\vskip\privatescratchdimen
- \nointerlineskip
- \backgroundline[trace:g]{\ruledhpack{\box\floatbox}}%
+ \offinterlineskip
+ \backgroundline[trace:g]{\ruledhpack{\box\floatbox}}\par
+ \blackrule[\c!color=trace:s,\c!height=\d_page_sides_bottomskip,\c!depth=\zeropoint,\c!width=\hsize]%
+ \vskip-\d_page_sides_bottomskip
\ifnum\c_page_sides_align=\plusfive \vskip-\lineheight \fi}}}}}
\def\page_sides_apply_depth_normal
{\global\setbox\floatbox\hpack
- {\lower\strutdepth\box\floatbox}}
+ {\lower\strutdp\box\floatbox}}
\def\page_sides_apply_depth_traced
{\global\setbox\floatbox\hpack
@@ -426,7 +455,7 @@
\def\page_sides_apply_vertical_shift
{\ifnum\c_page_sides_align=\plusfour
\getnoflines{\ht\floatbox}%
- \privatescratchdimen\dimexpr\noflines\lineheight-\strutdepth\relax
+ \privatescratchdimen\dimexpr\noflines\lineheight-\strutdp\relax
\getrawnoflines\d_page_sides_topskip
\advance\privatescratchdimen\noflines\lineheight
% todo: maybe rounding problem here
@@ -453,17 +482,17 @@
% the top of the box is at the previous baseline
\ifcase\c_page_sides_align
% 0 normal
- \advance\privatescratchdimen\strutdepth % or \openstrutdepth
+ \advance\privatescratchdimen\strutdp % or \openstrutdepth
\or % 1 height
- \advance\privatescratchdimen\strutdepth % or \openstrutdepth
+ \advance\privatescratchdimen\strutdp % or \openstrutdepth
\or % 2 line
\or % 3 depth
- \advance\privatescratchdimen\lineheight % or \openlineheight
- \advance\privatescratchdimen\strutdepth % or \openstrutdepth
+ \advance\privatescratchdimen\lineheight % or \openlineheight
+ \advance\privatescratchdimen\strutdp % or \openstrutdepth
\or % 4 grid
\privatescratchdimen\zeropoint
\or
- \advance\privatescratchdimen\strutheight % or \openstrutheight
+ \advance\privatescratchdimen\strutht % or \openstrutheight
\fi
% new
\global\c_page_sides_lines_done\zerocount
@@ -555,6 +584,7 @@
\global\setfalse\c_page_sides_flag
\else
\advance\d_page_sides_progress-\pagetotal
+ \advance\d_page_sides_progress-\pagedepth % new 2017-10-10
\fi}
\def\page_sides_analyse_space
@@ -579,7 +609,7 @@
\ifcase\c_page_sides_method
% method 0 : raw
\or
- % method 1 : safe
+ % method 1 : safe (default)
\scratchdimentwo .99\pagegoal
\or
% method 2 : tight
@@ -596,6 +626,7 @@
% why was this \global\holdinginserts\plusone
\else
\global\advance\d_page_sides_vsize \d_page_sides_bottomskip
+ \global\advance\d_page_sides_vsize -\parskip % new 2017-10-10
\global\setfalse\c_page_sides_short
\fi
\global\settrue\c_page_floats_room
@@ -649,15 +680,58 @@
\unexpanded\def\page_sides_check_floats_tracer
{\begingroup
\hskip-\d_page_sides_width % kern
+ %\llap{\smallinfofont\the\d_page_sides_progression\space=>\space\the\c_page_sides_n_of_hang\hskip.5\leftmargindistance}%
\color[trace:o]%
{\vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width
\llap{\showstruts\strut\kern.25\bodyfontsize}}%
\endgroup}
+% \usemodule[art-01]
+% \starttext
+% \definemeasure[MyHeight][3cm] \definemeasure[MyWidth][3cm]
+% \startbuffer
+% \input klein \par
+% \placefigure[left]{oeps}{\framed[width=\measure{MyWidth},height=\measure{MyHeight}]{}}
+% \dorecurse{4}{test\par} \dorecurse{3}{\input klein }\par
+% \placefigure[left]{oeps}{\framed[width=\measure{MyWidth},height=\measure{MyHeight}]{}}
+% \dorecurse{3}{\input klein }\par
+% \stopbuffer
+% \enabletrackers[floats.anchoring]
+% \setupfloats[step=small]
+% \setupheadertexts[width=\measure{MyWidth},height=\measure{MyHeight}]
+% \dostepwiserecurse {100} {120} {1} {
+% \definemeasure[MyWidth][#1pt]
+% \dostepwiserecurse {50} {300} {1} {
+% \definemeasure[MyHeight][##1pt]
+% \setupwhitespace[none]%
+% \getbuffer \page
+% \setupwhitespace[big]
+% \getbuffer \page
+% }
+% }
+% \stoptext
+
+% \setupfloats
+% [\c!sidethreshold=.5\strutdp] % set to "old" to check with old method
+
+\newdimen\d_page_sides_progression
+
\unexpanded\def\page_sides_check_floats_set
- {\privatescratchdimen\dimexpr\d_page_sides_progress+\strutht-\roundingeps\relax
- \c_page_sides_n_of_hang\privatescratchdimen
- \divide\c_page_sides_n_of_hang \baselineskip\relax
+ {\edef\p_sidethreshold{\floatparameter\c!sidethreshold}%
+ \ifx\p_sidethreshold\v!old
+ \d_page_sides_progression\dimexpr\d_page_sides_progress+\strutht-\roundingeps\relax
+ \c_page_sides_n_of_hang\d_page_sides_progression
+ \divide\c_page_sides_n_of_hang \baselineskip\relax
+ \else
+ \d_page_sides_progression
+ \ifx\p_sidethreshold\empty
+ \d_page_sides_progress
+ \else
+ \dimexpr\d_page_sides_progress-\p_sidethreshold\relax
+ \fi
+ \getnoflines\d_page_sides_progression
+ \c_page_sides_n_of_hang\noflines
+ \fi
\ifnum\c_page_sides_n_of_hang>\zerocount
% new from here (needs test case, old code)
\ifcase\c_page_sides_n_of_lines
@@ -759,7 +833,7 @@
%D the callers. We use \type {\def} as they can be redefined! Some will become obsolete
\def\checksidefloat {\page_sides_check_floats}
-\def\flushsidefloats {\page_sides_flush_floats}
+\def\flushsidefloats {\page_sides_flush_floats_text}
\def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par}
\def\forgetsidefloats {\page_sides_forget_floats}
%def\synchronizesidefloats {\page_sides_synchronize_floats}