summaryrefslogtreecommitdiff
path: root/tex/context/base/page-brk.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/page-brk.mkiv')
-rw-r--r--tex/context/base/page-brk.mkiv245
1 files changed, 187 insertions, 58 deletions
diff --git a/tex/context/base/page-brk.mkiv b/tex/context/base/page-brk.mkiv
index cc9a9b4d2..2b89f5b4f 100644
--- a/tex/context/base/page-brk.mkiv
+++ b/tex/context/base/page-brk.mkiv
@@ -316,75 +316,204 @@
%D Test page breaks.
-\newdimen \d_page_tests_test
-\newconstant\c_page_tests_mode
+% \newdimen \d_page_tests_test
+% \newconstant\c_page_tests_mode
-\newconstant\testpagemethod % todo: \testnewpage[method=,lines=,voffset=]
-\newconstant\testpagetrigger
+\newconstant\testpagemethod % old
+\newconstant\testpagetrigger % old
-\unexpanded\def\testpage {\c_page_tests_mode\plusone \dodoubleempty\page_tests_test} %
-\unexpanded\def\testpageonly{\c_page_tests_mode\plustwo \dodoubleempty\page_tests_test} % no penalties added to the mvl
-\unexpanded\def\testpagesync{\c_page_tests_mode\plusthree\dodoubleempty\page_tests_test} % force sync
-
-\def\page_tests_test[#1][#2]% don't change, only add more methods
+% \unexpanded\def\testpage {\c_page_tests_mode\plusone \dodoubleempty\page_tests_test} %
+% \unexpanded\def\testpageonly{\c_page_tests_mode\plustwo \dodoubleempty\page_tests_test} % no penalties added to the mvl
+% \unexpanded\def\testpagesync{\c_page_tests_mode\plusthree\dodoubleempty\page_tests_test} % force sync
+%
+% \def\page_tests_test[#1][#2]% don't change, only add more methods
+% {\relax % needed before \if
+% \ifconditional\c_page_breaks_enabled
+% % new from here
+% \ifcase\testpagetrigger
+% \endgraf
+% \or\ifvmode
+% \dosomebreak\allowbreak
+% \else % indeed?
+% \vadjust{\allowbreak}%
+% \endgraf
+% \fi\fi
+% % till here
+% \ifdim\pagegoal<\maxdimen \relax
+% \ifdim\pagetotal<\pagegoal \relax
+% \d_page_tests_test\dimexpr
+% #1\lineheight
+% +\pagetotal
+% \ifdim\lastskip<\parskip+\parskip\fi
+% \ifsecondargument+#2\fi
+% \relax
+% \ifcase\testpagemethod
+% \ifdim\d_page_tests_test>.99\pagegoal
+% \penalty-\plustenthousand
+% \fi
+% \or
+% \ifdim\dimexpr\d_page_tests_test-\pagegoal\relax>-\lineheight
+% \penalty-\plustenthousand
+% \fi
+% \or
+% \getnoflines\pagegoal
+% \ifdim\dimexpr\d_page_tests_test-\noflines\lineheight\relax>-\lineheight
+% \penalty-\plustenthousand
+% \fi
+% \or % same as 0 but more accurate
+% \ifdim\dimexpr\d_page_tests_test-10\scaledpoint\relax>\pagegoal
+% \penalty-\plustenthousand
+% \fi
+% \fi
+% \else\ifnum\c_page_tests_mode=\plusthree
+% \page_tests_flush_so_far
+% \fi\fi
+% \else\ifnum\c_page_tests_mode=\plusone
+% \goodbreak
+% \fi\fi
+% \else
+% \endgraf
+% \fi}
+%
+% \def\page_tests_flush_so_far
+% {\endgraf
+% \ifdim\pagetotal>\pagegoal
+% \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal
+% \goodbreak
+% \else
+% \page
+% \fi
+% \fi}
+
+\installcorenamespace {pagechecker}
+\installcorenamespace {pagecheckermethod}
+
+\installcommandhandler \??pagechecker {pagechecker} \??pagechecker
+
+\setuppagechecker
+ [\c!method=1,
+ \c!before=,
+ \c!after=,
+ \c!inbetween=,
+ \c!lines=\plusthree,
+ \c!offset=\zeropoint]
+
+\def\page_check_amount
+ {\dimexpr
+ \pagecheckerparameter\c!lines\lineheight
+ +\pagetotal
+ \ifdim\lastskip<\parskip+\parskip\fi
+ \ifsecondargument+\pagecheckerparameter\v!offset\fi
+ \relax}
+
+\unexpanded\def\checkpage
+ {\dodoubleempty\page_check}
+
+\def\page_check[#1][#2]%
{\relax % needed before \if
+ \endgraf
\ifconditional\c_page_breaks_enabled
- % new from here
- \ifcase\testpagetrigger
- \endgraf
- \or\ifvmode
- \dosomebreak\allowbreak
- \else % indeed?
- \vadjust{\allowbreak}%
- \endgraf
- \fi\fi
- % till here
- \ifdim\pagegoal<\maxdimen \relax
- \ifdim\pagetotal<\pagegoal \relax
- \d_page_tests_test\dimexpr
- #1\lineheight
- +\pagetotal
- \ifdim\lastskip<\parskip+\parskip\fi
- \ifsecondargument+#2\fi
- \relax
- \ifcase\testpagemethod
- \ifdim\d_page_tests_test>.99\pagegoal
- \penalty-\plustenthousand
- \fi
- \or
- \ifdim\dimexpr\d_page_tests_test-\pagegoal\relax>-\lineheight
- \penalty-\plustenthousand
- \fi
- \or
- \getnoflines\pagegoal
- \ifdim\dimexpr\d_page_tests_test-\noflines\lineheight\relax>-\lineheight
- \penalty-\plustenthousand
- \fi
- \or % same as 0 but more accurate
- \ifdim\dimexpr\d_page_tests_test-10\scaledpoint\relax>\pagegoal
- \penalty-\plustenthousand
- \fi
- \fi
- \else\ifnum\c_page_tests_mode=\plusthree
- \page_tests_flush_so_far
- \fi\fi
- \else\ifnum\c_page_tests_mode=\plusone
- \goodbreak
- \fi\fi
+ \begingroup
+ \edef\currentpagechecker{#1}%
+ \ifsecondargument\setupcurrentpagechecker[#2]\fi
+ \csname\??pagecheckermethod\pagecheckerparameter\c!method\endcsname
+ \endgroup
+ \fi}
+
+\setvalue{\??pagecheckermethod 0}%
+ {\ifdim\pagegoal<\maxdimen \relax
+ \ifdim\pagetotal<\pagegoal \relax
+ \ifdim\page_check_amount>.99\pagegoal
+ \pagecheckerparameter\c!before
+ \penalty-\plustenthousand
+ \pagecheckerparameter\c!after
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi
\else
- \endgraf
+ \pagecheckerparameter\c!inbetween
\fi}
-\def\page_tests_flush_so_far
- {\endgraf
- \ifdim\pagetotal>\pagegoal
- \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal
- \goodbreak
+\setvalue{\??pagecheckermethod 1}%
+ {\ifdim\pagegoal<\maxdimen \relax
+ \ifdim\pagetotal<\pagegoal \relax
+ \ifdim\dimexpr\page_check_amount-\pagegoal\relax>-\lineheight
+ \pagecheckerparameter\c!before
+ \penalty-\plustenthousand
+ \pagecheckerparameter\c!after
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi
\else
- \page
+ \pagecheckerparameter\c!inbetween
\fi
+ \else
+ \goodbreak
+ \pagecheckerparameter\c!inbetween
\fi}
+\setvalue{\??pagecheckermethod 2}%
+ {\ifdim\pagegoal<\maxdimen \relax
+ \ifdim\pagetotal<\pagegoal \relax
+ \getnoflines\pagegoal
+ \ifdim\dimexpr\page_check_amount-\noflines\lineheight\relax>-\lineheight
+ \pagecheckparameter\c!before
+ \penalty-\plustenthousand
+ \pagecheckerparameter\c!after
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi}
+
+\setvalue{\??pagecheckermethod 3}%
+ {\ifdim\pagegoal<\maxdimen \relax
+ \ifdim\pagetotal<\pagegoal \relax
+ \ifdim\dimexpr\page_check_amount-10\scaledpoint\relax>\pagegoal
+ \pagecheckerparameter\c!before
+ \penalty-\plustenthousand
+ \pagecheckerparameter\c!after
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi
+ \else
+ \ifdim\pagetotal>\pagegoal
+ \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal
+ \goodbreak
+ \pagecheckerparameter\c!inbetween
+ \else
+ \pagecheckerparameter\c!before
+ \page
+ \pagecheckerparameter\c!after
+ \fi
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi
+ \fi
+ \else
+ \pagecheckerparameter\c!inbetween
+ \fi}
+
+\definepagechecker[\s!unknown:0] [\c!method=0,\c!before=,\c!after=,\c!inbetween=]
+\definepagechecker[\s!unknown:1][]\s!unknown:0][\c!method=1]
+\definepagechecker[\s!unknown:2][]\s!unknown:0][\c!method=2]
+\definepagechecker[\s!unknown:3][]\s!unknown:0][\c!method=3]
+
+\def\page_tests_test_a[#1][#2]{\checkpage[\s!unknown:1][\c!lines=#1,\c!voffset=\ifsecondargument#2\else\zeropoint\fi]}
+\def\page_tests_test_b[#1][#2]{\checkpage[\s!unknown:2][\c!lines=#1,\c!voffset=\ifsecondargument#2\else\zeropoint\fi]}
+\def\page_tests_test_c[#1][#2]{\checkpage[\s!unknown:3][\c!lines=#1,\c!voffset=\ifsecondargument#2\else\zeropoint\fi]}
+
+\unexpanded\def\testpage {\dodoubleempty\page_tests_test_a} %
+\unexpanded\def\testpageonly{\dodoubleempty\page_tests_test_b} % no penalties added to the mvl
+\unexpanded\def\testpagesync{\dodoubleempty\page_tests_test_c} % force sync
+
%D Test column breaks.
\unexpanded\def\testcolumn