summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2018-02-21 19:26:29 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2018-02-21 19:26:29 +0100
commit8e51addbcecd962280c24a77de9ec1f6724e7a65 (patch)
tree6a0f3b7ba546826e0864909da326df101068c5b8 /tex/context/base/mkiv
parent9bb459e9fedcad94579973ccd07ad9e78d0734c8 (diff)
downloadcontext-8e51addbcecd962280c24a77de9ec1f6724e7a65.tar.gz
2018-02-21 18:27:00
Diffstat (limited to 'tex/context/base/mkiv')
-rw-r--r--tex/context/base/mkiv/buff-imp-tex.lua2
-rw-r--r--tex/context/base/mkiv/cont-fil.mkiv24
-rw-r--r--tex/context/base/mkiv/cont-new.mkiv2
-rw-r--r--tex/context/base/mkiv/context.mkiv2
-rw-r--r--tex/context/base/mkiv/core-def.mkiv6
-rw-r--r--tex/context/base/mkiv/font-tra.mkiv2
-rw-r--r--tex/context/base/mkiv/mtx-context-arrange.tex20
-rw-r--r--tex/context/base/mkiv/mult-low.lua2
-rw-r--r--tex/context/base/mkiv/mult-mes.lua3
-rw-r--r--tex/context/base/mkiv/page-sid.mkiv705
-rw-r--r--tex/context/base/mkiv/regi-ini.lua21
-rw-r--r--tex/context/base/mkiv/spac-hor.mkiv18
-rw-r--r--tex/context/base/mkiv/spac-ver.lua222
-rw-r--r--tex/context/base/mkiv/spac-ver.mkiv32
-rw-r--r--tex/context/base/mkiv/status-files.pdfbin25828 -> 25783 bytes
-rw-r--r--tex/context/base/mkiv/status-lua.pdfbin252562 -> 252639 bytes
-rw-r--r--tex/context/base/mkiv/strc-flt.mkvi36
-rw-r--r--tex/context/base/mkiv/strc-ren.mkiv110
-rw-r--r--tex/context/base/mkiv/strc-sec.mkiv2
-rw-r--r--tex/context/base/mkiv/util-sta.lua2
20 files changed, 635 insertions, 576 deletions
diff --git a/tex/context/base/mkiv/buff-imp-tex.lua b/tex/context/base/mkiv/buff-imp-tex.lua
index 13ecdf27f..606c31d36 100644
--- a/tex/context/base/mkiv/buff-imp-tex.lua
+++ b/tex/context/base/mkiv/buff-imp-tex.lua
@@ -43,7 +43,7 @@ local handler = visualizers.newhandler {
-- todo: unicode letters in control sequences (slow as we need to test the nature)
local comment = S("%")
-local name = P("\\") * (patterns.letter + S("@!?_"))^1
+local name = P("\\") * (patterns.letter + S("@!?_") + patterns.utf8two + patterns.utf8three + patterns.utf8four)^1
local escape = P("\\") * (patterns.anything - patterns.newline)^-1 -- else we get \n
local group = S("${}")
local boundary = S('[]()<>#="')
diff --git a/tex/context/base/mkiv/cont-fil.mkiv b/tex/context/base/mkiv/cont-fil.mkiv
index 69c45c0e5..507effd02 100644
--- a/tex/context/base/mkiv/cont-fil.mkiv
+++ b/tex/context/base/mkiv/cont-fil.mkiv
@@ -114,22 +114,28 @@
\definefilesynonym [memo] [cor-02]
\definefilesynonym [resume] [cor-03]
-% downward compatible mapping:
-
-\definefilesynonym [pre-41] [present-tiles]
-\definefilesynonym [fnt-29] [fonts-shapes]
-\definefilesynonym [fnt-33] [math-coverage]
-\definefilesynonym [mat-12] [math-parameters]
-\definefilesynonym [mat-20] [math-parameters]
+\definefilesynonym [fnt-10] [fonts-complete]
+\definefilesynonym [fnt-11] [fonts-system]
+\definefilesynonym [fnt-20] [fonts-steps]
+\definefilesynonym [fnt-21] [fonts-steps]
+\definefilesynonym [fnt-22] [fonts-engines]
+\definefilesynonym [fnt-23] [fonts-shapes]
+\definefilesynonym [fnt-24] [fonts-cjk]
\definefilesynonym [fnt-25] [math-characters]
\definefilesynonym [fnt-28] [fonts-goodies]
+\definefilesynonym [fnt-29] [fonts-shapes]
\definefilesynonym [fnt-31] [fonts-coverage]
+\definefilesynonym [fnt-33] [math-coverage]
+
\definefilesynonym [mat-10] [math-characters]
\definefilesynonym [mat-11] [math-characters]
-\definefilesynonym [fnt-11] [fonts-system]
-\definefilesynonym [fnt-23] [fonts-shapes]
+\definefilesynonym [mat-12] [math-parameters]
+\definefilesynonym [mat-20] [math-parameters]
+
\definefilesynonym [syn-01] [syntax]
+\definefilesynonym [reg-01] [regimes-list]
+
\definefilesynonym [set-11] [setups-basics]
\definefilesynonym [set-12] [setups-overview]
%definefilesynonym [set-13] [setups-proofing]
diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv
index 03714b5c7..b48f7a39e 100644
--- a/tex/context/base/mkiv/cont-new.mkiv
+++ b/tex/context/base/mkiv/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2018.02.19 18:56}
+\newcontextversion{2018.02.21 18:19}
%D This file is loaded at runtime, thereby providing an excellent place for
%D hacks, patches, extensions and new features.
diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv
index 6c5b378b0..53ef6e71c 100644
--- a/tex/context/base/mkiv/context.mkiv
+++ b/tex/context/base/mkiv/context.mkiv
@@ -41,7 +41,7 @@
%D up and the dependencies are more consistent.
\edef\contextformat {\jobname}
-\edef\contextversion{2018.02.19 18:56}
+\edef\contextversion{2018.02.21 18:19}
\edef\contextkind {beta}
%D For those who want to use this:
diff --git a/tex/context/base/mkiv/core-def.mkiv b/tex/context/base/mkiv/core-def.mkiv
index acd411fac..0e7cd2d2e 100644
--- a/tex/context/base/mkiv/core-def.mkiv
+++ b/tex/context/base/mkiv/core-def.mkiv
@@ -53,9 +53,9 @@
\flushnotes
\to \everydisplay
-\appendtoks
- \adjustsidefloatdisplaylines
-\to \everydisplay
+% \appendtoks
+% \adjustsidefloatdisplaylines
+% \to \everydisplay
% \appendtoks
% \flushpostponednodedata
diff --git a/tex/context/base/mkiv/font-tra.mkiv b/tex/context/base/mkiv/font-tra.mkiv
index 566897240..c51ba78fc 100644
--- a/tex/context/base/mkiv/font-tra.mkiv
+++ b/tex/context/base/mkiv/font-tra.mkiv
@@ -309,7 +309,7 @@
\letvalue{\??otfcompositiondir 1}\lefttoright
\unexpanded\def\setotfcompositiondirection#1%
- {\getvalue{\??otfcompositiondir#1}}
+ {\begincsname\??otfcompositiondir#1\endcsname}
\unexpanded\def\showotfcomposition#1#2#3% {font*features at size}, rl=-1, text
{\begingroup
diff --git a/tex/context/base/mkiv/mtx-context-arrange.tex b/tex/context/base/mkiv/mtx-context-arrange.tex
index a3e6e9db3..e970ac450 100644
--- a/tex/context/base/mkiv/mtx-context-arrange.tex
+++ b/tex/context/base/mkiv/mtx-context-arrange.tex
@@ -27,8 +27,8 @@
% --printformat : 2UP, etc
% --paperformat=spec : paper*print or paperxprint
%
-% example: context --extra=arrange --printformat=2UP --paperformat=A4*A3,landscape myfile
-%
+% example: context --extra=arrange --printformat=2UP --paperformat=A4*A3,landscape myfile
+% context --extra=arrange --printformat=xy --paperformat=A4*A2 --nx=2 --ny=2 myfile
% end help
\input mtx-context-common.tex
@@ -79,6 +79,20 @@
local printformat = document.arguments.printformat or ""
if printformat == "" then
printformat = "normal"
+ elseif string.find(printformat,"xy") then
+ if false then
+ context.setuplayout {
+ nx = document.arguments.nx or 1,
+ ny = document.arguments.ny or 1,
+ }
+ printformat = "XY,\\v!rotated"
+ else
+ context.setuppaper {
+ nx = document.arguments.nx or 1,
+ ny = document.arguments.ny or 1,
+ }
+ printformat = "XY"
+ end
elseif string.find(printformat,".*up") then
printformat = "2UP,\\v!rotated"
elseif string.find(printformat,".*down") then
@@ -107,7 +121,7 @@
local textwidth = arguments.textwidth or "0cm"
for i=1,noffiles do
local filename = files[i]
- if not string.find(filename,"^mtx%-context%-") then
+ if not string.find(file.basename(filename),"^mtx%-context%-") then
context.insertpages (
{ filename },
{ emptypages },
diff --git a/tex/context/base/mkiv/mult-low.lua b/tex/context/base/mkiv/mult-low.lua
index 1fea62f6a..50ddeff2c 100644
--- a/tex/context/base/mkiv/mult-low.lua
+++ b/tex/context/base/mkiv/mult-low.lua
@@ -278,7 +278,7 @@ return {
"singleexpandafter", "doubleexpandafter", "tripleexpandafter",
--
"dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces",
- "removepunctuation",
+ "removepunctuation", "ignoreparskip",
--
"wait", "writestatus", "define", "defineexpandable", "redefine",
--
diff --git a/tex/context/base/mkiv/mult-mes.lua b/tex/context/base/mkiv/mult-mes.lua
index 21bb16eab..1eb429763 100644
--- a/tex/context/base/mkiv/mult-mes.lua
+++ b/tex/context/base/mkiv/mult-mes.lua
@@ -498,6 +498,9 @@ return {
en = "location %a changed to %a due to exporting",
nl = "plaatsing %a vervangen door %a vanwege export",
},
+ ["floatblocks:16"] = {
+ en = "anchor=orange, shift=red, box=green, dummy=blue, line=cyan, depth=magenta, prev=orange",
+ },
["floatblocks:1"] = {
en = "%a is empty",
},
diff --git a/tex/context/base/mkiv/page-sid.mkiv b/tex/context/base/mkiv/page-sid.mkiv
index 31c962719..a777efa32 100644
--- a/tex/context/base/mkiv/page-sid.mkiv
+++ b/tex/context/base/mkiv/page-sid.mkiv
@@ -18,16 +18,18 @@
%D These macro deal with side floats. We started with Daniel Comenetz macros as
%D published in TUGBoat Volume 14 (1993), No.\ 1: Anchored Figures at Either Margin.
%D I extended and patched the macros to suite our needs which results in a messy
-%D module. Therefore, this module badly needs an update because it's now a mixture
-%D of old and new macros.
-
-% Interesting cases where it goes wrong:
-%
-% \placefigure[left]{}{} \dorecurse{3}{\input ward } {\par} \input ward
-
+%D module.
+%D
%D A complication is that we need to deal with spacing differently before and after
-%D the float. Also, whitespace can interfere as does the prevdepth. There is no
-%D real universal solotion.
+%D the float. Also, whitespace can interfere as does the prevdepth. There is no real
+%D universal solution. So, by now not much is left of that code, if only because we
+%D need to match \CONTEXT\ spacing module, because we have more placement options
+%D and control and because the math hackery is not suitable for \CONTEXT\ anyway.
+%D
+%D This code had been redone many times because we kept running into spacing issues
+%D and it's not that much fun (or rewarding). It's probably the module that made
+%D me go into distraciton mode most often (like watching amusing Walk of The
+%D Earth or sophisticated Massive Attack video clips).
\newdimen \d_page_sides_height % includes the topskip
\newdimen \d_page_sides_width
@@ -36,9 +38,8 @@
\newdimen \d_page_sides_vsize_reset
\newdimen \d_page_sides_progress
\newdimen \d_page_sides_page_total
-\newdimen \d_page_sides_saved_depth
-\newbox \b_page_sides_bottom
+%newbox \b_page_sides_bottom
\newcount \c_page_sides_lines_done
\newcount \c_page_sides_checks_done
@@ -48,7 +49,6 @@
\newconditional \c_page_sides_short
\newconditional \c_page_sides_flag
-\newconditional \c_page_sides_dummy_lines
\newdimen \d_page_sides_shift
\newdimen \d_page_sides_extrashift
@@ -67,15 +67,35 @@
\newdimen \d_page_sides_toptotal
\newdimen \d_page_sides_bottomtotal
-\setnewconstant \c_page_sides_method \plusone
-\setnewconstant \c_page_sides_align \zerocount
-\setnewconstant \c_page_sides_skipmode \zerocount
-\setnewconstant \c_page_sides_tolerance\zerocount
+\newconstant \c_page_sides_align
+\newconstant \c_page_sides_skipmode
+\newconstant \c_page_sides_tolerance
+
+\newconstant \c_page_sides_method % sort of obsolete
+
+\newdimen \d_page_sides_progression
+
+\newif \iftracesidefloats % public (might change)
+
+%D Defaults:
\d_page_sides_vsize_reset -\onepoint
%d_page_sides_vsize_reset \zeropoint % could be an option, needs testing
-\settrue\c_page_sides_dummy_lines % when false gets reset to true afterwards
+%D We have some basic (and colorful) tracing:
+
+\def\page_sides_floats_legend
+ {\showmessage\m!floatblocks{16}\empty
+ \glet\page_sides_floats_legend\relax}
+
+\installtextracker{floats.anchoring}
+ {\page_sides_floats_legend
+ \tracesidefloatstrue}
+ {\tracesidefloatsfalse}
+
+%D The horizontal shifts depend on the location: left or right in the text, margin
+%D or edge. These shifts are rather stable and don't interfere with the page flow
+%D as much as the vertical ones do.
\def\page_sides_process_float_backspace {\global\c_page_sides_float_type\plusone \page_sides_handle_float}
\def\page_sides_process_float_leftedge {\global\c_page_sides_float_type\plustwo \page_sides_handle_float}
@@ -87,41 +107,14 @@
\def\page_sides_process_float_cutspace {\global\c_page_sides_float_type\pluseight\page_sides_handle_float}
\def\page_sides_process_float_margin {\global\c_page_sides_float_type\pluseight\page_sides_handle_float}
-\def\page_sides_check_skips
- {\global\d_page_sides_toptotal \dimexpr\d_page_sides_topskip +\d_page_sides_topoffset \relax
- \global\d_page_sides_bottomtotal\dimexpr\d_page_sides_bottomskip+\d_page_sides_bottomoffset\relax
- \ifcase\c_page_sides_skipmode
+\def\page_sides_check_horizontal_skips
+ {\ifcase\c_page_sides_skipmode
\or % high
- \global\d_page_sides_toptotal \d_page_sides_topoffset
\or % low
- \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
\or % fit
- \global\d_page_sides_toptotal \d_page_sides_topoffset
- \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
- \global\d_strc_floats_margin \zeropoint
+ \global\d_strc_floats_margin\zeropoint
\fi}
-\newif\iftracesidefloats % public (might change)
-
-\unexpanded\def\page_sides_force_depth
- {\iftracesidefloats
- \begingroup
- \c_page_force_strut_depth_trace_mode\plusone
- \forcestrutdepth
- \endgroup
- \else
- \forcestrutdepth
- \fi}
-
-\def\page_sides_floats_legend
- {\writestatus\m!floatblocks{anchor: orange, shift: red, box: green, dummy: blue, depth: magenta}%
- \glet\page_sides_floats_legend\relax}
-
-\installtextracker{floats.anchoring}
- {\page_sides_floats_legend
- \tracesidefloatstrue}
- {\tracesidefloatsfalse}
-
\def\page_sides_apply_horizontal_shift
{\ifdim\d_page_sides_maximum>\zeropoint
\ifcase\c_page_sides_float_type
@@ -221,12 +214,189 @@
+\compensatedinnermakeupmargin
\relax
\fi
- \ifdim\d_page_sides_rightskip>\zeropoint \global\advance\d_page_sides_rightskip\rightskip \fi
- \ifdim\d_page_sides_leftskip >\zeropoint \global\advance\d_page_sides_leftskip \leftskip \fi}
+ \ifdim\d_page_sides_rightskip>\zeropoint
+ \global\advance\d_page_sides_rightskip\rightskip
+ \fi
+ \ifdim\d_page_sides_leftskip >\zeropoint
+ \global\advance\d_page_sides_leftskip \leftskip
+ \fi}
+
+%D Shifts get applied to the float box:
+
+\def\page_sides_relocate_float#1%
+ {\global\setbox\floatbox\hpack
+ {\ifnum\c_page_sides_float_type=\plusfour
+ \kern\d_page_sides_leftshift
+ \else\ifnum\c_page_sides_float_type=\plusone
+ \kern\d_page_sides_leftshift
+ \fi\fi
+ \ifnum\c_page_sides_float_type>\plusfour
+ \kern-\d_page_sides_extrashift
+ \else
+ \kern\d_page_sides_shift
+ \fi
+ \vbox{#1\ifnum\c_page_sides_align=\plusfour \removedepth \fi}%
+ \ifnum\c_page_sides_float_type>\plusfour
+ \kern\d_page_sides_shift
+ \else
+ \kern-\d_page_sides_extrashift
+ \fi
+ \ifnum\c_page_sides_float_type=\pluseight
+ \kern\d_page_sides_rightshift
+ \else\ifnum\c_page_sides_float_type=\plusfive
+ \kern\d_page_sides_rightshift
+ \fi\fi}}
+
+%D The vertical skips are a nightmare and this mechanism is about as complex
+%D as one can get it.
+
+\def\page_sides_check_vertical_skips
+ {\ifdim\d_page_sides_topskip <\zeropoint\d_page_sides_topskip \zeropoint\fi
+ \ifdim\d_page_sides_bottomskip<\zeropoint\d_page_sides_bottomskip\zeropoint\fi
+ \ifdim\d_page_sides_midskip <\zeropoint\d_page_sides_midskip \zeropoint\fi
+ %
+ \global\d_page_sides_toptotal \dimexpr\d_page_sides_topskip +\d_page_sides_topoffset \relax
+ \global\d_page_sides_bottomtotal\dimexpr\d_page_sides_bottomskip+\d_page_sides_bottomoffset\relax
+ \ifcase\c_page_sides_skipmode
+ \or % high
+ \global\d_page_sides_toptotal \d_page_sides_topoffset
+ \or % low
+ \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
+ \or % fit
+ \global\d_page_sides_toptotal \d_page_sides_topoffset
+ \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
+ \fi}
+
+%D These shifts get (selectively) applied with a bit of optional tracing.
+
+\def\page_sides_apply_vertical_shift_normal
+ {\global\setbox\floatbox\hpack % why extra box
+ {\vpack
+ {\forgetall
+ \hsize\wd\floatbox
+ \vskip\privatescratchdimen
+ \offinterlineskip
+ \box\floatbox
+ % somehow we need this \scratchbox magic, but at least it's the same as the
+ % tracer now
+ \setbox\scratchbox\emptybox
+ \wd\scratchbox\hsize
+ \ht\scratchbox\d_page_sides_bottomtotal
+ \box\scratchbox
+ \vskip-\d_page_sides_bottomtotal
+ \ifnum\c_page_sides_align=\plusfive
+ \vskip-\lineheight
+ \fi}}}
+
+\def\page_sides_apply_vertical_shift_traced
+ {\global\setbox\floatbox\hpack % why extra box
+ {\backgroundline[trace:r]{\ruledhpack{\vpack
+ {\forgetall
+ \hsize\wd\floatbox
+ \vskip\privatescratchdimen
+ \offinterlineskip
+ \backgroundline
+ [trace:g]%
+ {\ruledhpack{\box\floatbox}}%
+ \par
+ \blackrule
+ [\c!color=trace:s,%
+ \c!height=\d_page_sides_bottomtotal,%
+ \c!depth=\zeropoint,%
+ \c!width=\hsize]%
+ \vskip-\d_page_sides_bottomtotal
+ \ifnum\c_page_sides_align=\plusfive
+ \vskip-\lineheight
+ \fi}}}}}
+
+\def\page_sides_apply_vertical_shift
+ {\ifnum\c_page_sides_align=\plusfour
+ \getnoflines{\ht\floatbox}%
+ \privatescratchdimen\dimexpr\noflines\lineheight-\strutdp\relax
+ \getrawnoflines\d_page_sides_toptotal
+ \advance\privatescratchdimen\noflines\lineheight
+ \page_sides_force_depth
+ \ht\floatbox\privatescratchdimen
+ \dp\floatbox\zeropoint
+ \fi
+ \ifcase\c_page_sides_align \else
+ \global\d_page_sides_toptotal\zeropoint
+ \fi
+ \privatescratchdimen
+ \ifnum\c_page_sides_float_type<\plusfour
+ \d_page_sides_toptotal
+ \else\ifnum\c_page_sides_float_type>\plusfive
+ \d_page_sides_toptotal
+ \else
+ \zeropoint
+ \fi\fi
+ % the top of the box is at the previous baseline
+ \ifcase\c_page_sides_align
+ % 0 normal
+ \advance\privatescratchdimen\strutdp % or \openstrutdepth
+ \or % 1 height
+ \advance\privatescratchdimen\strutdp % or \openstrutdepth
+ \or % 2 line
+ \or % 3 depth
+ \advance\privatescratchdimen\lineheight % or \openlineheight
+ \advance\privatescratchdimen\strutdp % or \openstrutdepth
+ \or % 4 grid
+ \privatescratchdimen\zeropoint
+ \or
+ \advance\privatescratchdimen\strutht % or \openstrutheight
+ \fi
+ % new
+ \global\c_page_sides_lines_done\zerocount
+ \ifnum\c_page_sides_n_of_lines>\zerocount
+ \advance\privatescratchdimen\c_page_sides_n_of_lines\lineheight
+ \fi
+ \iftracesidefloats
+ \page_sides_apply_vertical_shift_traced % uses \privatescratchdimen
+ \else
+ \page_sides_apply_vertical_shift_normal % uses \privatescratchdimen
+ \fi
+ \ifnum\c_page_sides_float_type<\plusfour
+ \global\d_page_sides_toptotal\zeropoint
+ \else\ifnum\c_page_sides_float_type>\plusfive
+ \global\d_page_sides_toptotal\zeropoint
+ \fi\fi
+ \global\d_page_sides_downshift\zeropoint}
+
+%D We have a few virtual dimensions. I'm not sure what to do with \type
+%D {\pagedepth} and \type {\pageshrink} in the next two. If we ever need
+%D that it will become options.
+
+\def\e_page_sides_flush_criterium
+ {\dimexpr
+ \d_page_sides_vsize
+ -\d_page_sides_bottomtotal
+ -\pagetotal
+ \relax}
+
+\def\e_page_sides_room_criterium
+ {\dimexpr
+ \d_page_sides_vsize
+ -\d_page_sides_bottomtotal % added here too
+ -\pagetotal
+ \relax}
+
+%D In order to get a consistent spacing we force a strutdepth unless the
+%D preceding material has more depth than that already. This way anchoring
+%D becomes predictable.
+
+\unexpanded\def\page_sides_force_depth
+ {\iftracesidefloats
+ \begingroup
+ \c_page_force_strut_depth_trace_mode\plusone
+ \forcestrutdepth
+ \endgroup
+ \else
+ \forcestrutdepth
+ \fi}
\def\page_sides_flush_floats
{\par
- \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomtotal-\pagetotal\relax>\zeropoint % -\pagedepth
+ \ifdim\e_page_sides_flush_criterium>\zeropoint
\page_sides_flush_floats_progress
\page_sides_flush_floats_after_next
\fi
@@ -234,14 +404,8 @@
\def\page_sides_flush_floats_text
{\par
- \ifdim\dimexpr
- \d_page_sides_vsize
-% no longer with the adapted skipper
-% \ifnum\c_anch_backgrounds_text_level>\plusone
- -\d_page_sides_bottomtotal
-% \fi
- -\pagetotal
- \relax>\zeropoint % -\pagedepth
+ % what with \c_anch_backgrounds_text_level>\plusone
+ \ifdim\e_page_sides_flush_criterium>\zeropoint
\page_sides_flush_floats_progress
\page_sides_flush_floats_after_none
\fi
@@ -254,9 +418,25 @@
\global\setfalse\c_page_sides_flag
\global\c_page_sides_checks_done\zerocount}
+\def\page_sides_flush_floats_after_none % we force a flush
+ {\ifdim\d_page_sides_midskip>\zeropoint
+ \blank[\the\d_page_sides_midskip]
+ \fi
+ \ignoreparskip
+ \blank[\v!disable]}
+
+\def\page_sides_flush_floats_after_next % we have two successive ones
+ {\ifdim\d_page_sides_bottomskip>\zeropoint
+ \blank[\the\d_page_sides_bottomskip]
+ \fi
+ \ignoreparskip
+ \blank[\v!disable]}
+
+%D A rudimentary checker:
+
\unexpanded\def\doifelsesidefloat
{\par
- \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint % -\pagedepth
+ \ifdim\e_page_sides_room_criterium>\zeropoint % -\pagedepth
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
@@ -264,6 +444,10 @@
\let\doifsidefloatelse\doifelsesidefloat
+%D Sometimes we need to fill up the space alongside a side float and this
+%D is where we define the helpers. A user can enforce a smaller step. We use
+%D large steps when possible.
+
\installcorenamespace{sidefloatsteps}
\setvalue{\??sidefloatsteps\v!line }{\strut}
@@ -271,8 +455,6 @@
\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_tracer
{\dontleavehmode
\ruledhpack\bgroup\backgroundline[trace:b]{%
@@ -296,6 +478,7 @@
\def\page_sides_flush_floats_progress
{\begingroup
\page_sides_force_depth
+ \parskip\zeropoint
\let\page_sides_flush_floats\relax
\edef\m_pages_strut
{\ifcsname\??sidefloatsteps\rootfloatparameter\c!step\endcsname
@@ -306,13 +489,8 @@
\forgetall
\offinterlineskip
\doloop
- {\scratchdimen\dimexpr
- \d_page_sides_vsize
- -\d_page_sides_bottomtotal
- -\pagetotal
- % -\pagedepth
- \relax
- \ifdim\scratchdimen>\onepoint % good enough, if we change it it will become a threshold
+ {\scratchdimen\e_page_sides_flush_criterium
+ \ifdim\scratchdimen>\onepoint % good enough, can become configurable
\ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles
\exitloop
\else\iftracesidefloats
@@ -324,17 +502,55 @@
\page_sides_force_depth
\exitloop
\fi}%
- \global\setfalse\c_page_sides_dummy_lines
\endgroup}
+%D We force a parskip and ignore it afterwards. We can nil it by setting the
+%D \type {spacebeforeside} parameter. We can have a leading blank so we need
+%D to make sure that we use blank to inject the parskip and then ignore
+%D the one injected by the engine.
-\def\page_sides_flush_floats_after_none % we force a flush
- {\checkedblank[\rootfloatparameter\c!sidespaceafter]%
- \page_sides_inject_after}
+\def\page_sides_inject_before
+ {\page_sides_force_depth
+ \ifdim\parskip>\zeropoint
+ \ifdim\parskip>\d_strc_floats_top
+ \ifdim\d_strc_floats_top>\zeropoint
+ \ignoreparskip
+ \blank[\v!white]%
+ \else
+ \checkedblank[\rootfloatparameter\c!spacebeforeside]%
+ \fi
+ \else
+ \checkedblank[\rootfloatparameter\c!spacebeforeside]%
+ \fi
+ \else
+ \checkedblank[\rootfloatparameter\c!spacebeforeside]%
+ \fi}
-\def\page_sides_flush_floats_after_next % we have two successive ones
- {\checkedblank[\rootfloatparameter\c!sidespaceinbetween]% maybe also none
- \page_sides_inject_after}
+%D We are now done with \type {spacebefore} and the parskip is already
+%D injected. The dummy line makes sure that we anchor properly and it
+%D also can serve as tracer.
+
+\def\page_sides_inject_dummy_line_normal
+ {\hpack to \availablehsize{\strut\hss}}
+
+\def\page_sides_inject_dummy_line_traced
+ {\ruledhpack to \availablehsize{\backgroundline[trace:c]{\page_sides_inject_dummy_line_normal}}}
+
+\def\page_sides_inject_dummy_lines
+ {\par
+ \nointerlineskip
+ \dontleavehmode
+ \iftracesidefloats
+ \page_sides_inject_dummy_line_traced
+ \else
+ \page_sides_inject_dummy_line_normal
+ \fi
+ \vskip-\dimexpr\lineheight+\strutdp\relax
+ \ignoreparskip
+ \blank[\v!samepage]
+ \blank[\v!disable]}
+
+%D Checkers:
\def\page_sides_check_floats_after_par
{\page_sides_check_floats_indeed
@@ -355,184 +571,23 @@
\global\setfalse\c_page_sides_short
\global\setfalse\c_page_sides_flag}
-\let\page_otr_sides_pop_penalties \relax
-\let\page_otr_sides_push_penalties\relax
-
-\def\page_sides_restore_output_penalty
- {\ifnum\outputpenalty=\plustenthousand \else
- \penalty\outputpenalty
- \fi}
+%D Here comes the output routine. We either go the fast route or we use the
+%D normal one (stored in \type {\page_otr_command_side_float_output}. We no
+%D longer have this fuzzy code around with penalties and indentation and
+%D such.
\def\page_sides_output_routine
- {\ifconditional\c_page_sides_short
- % Is this branch ever entered?
- \page_sides_output_routine_yes
- \else
- \page_sides_output_routine_nop
- \fi}
-
-\def\page_sides_output_routine_nop
- {\page_otr_command_side_float_output % otr specific
- \global\d_page_sides_vsize\d_page_sides_vsize_reset
- \global\c_page_sides_n_of_lines\zerocount
- % we can end up in fig lock, so \global\holdinginserts\zerocount here too ?
- \page_otr_sides_pop_penalties}
-
-\def\page_sides_output_routine_yes % we need to rework this ... add pagediscards and such
- {\unvbox\normalpagebox % bah, and the discards?
- \setbox\b_page_sides_bottom\lastbox
- \ifvoid\b_page_sides_bottom
- % go on
- \else\ifdim\wd\b_page_sides_bottom>\d_page_sides_hsize
- % hm, i really need to write this from scratch
- \penalty-201
- \box\b_page_sides_bottom
+ {\page_otr_command_side_float_output
+ \ifconditional\c_page_sides_short
+ \global\setfalse\c_page_sides_short
\else
- \page_sides_restore_left_indent
- \ifdim\wd\b_page_sides_bottom<\d_page_sides_hsize
- \parskip\zeropoint
- %\noindent
- \ifinner\else
- \vadjust{\penalty\minusone}%
- \fi
- \global\advance\d_page_sides_hsize -\wd\b_page_sides_bottom
- \global\divide\d_page_sides_hsize \plustwo
- \hskip\d_page_sides_hsize % \kern
- \fi
- \box\b_page_sides_bottom
- \page_sides_restore_output_penalty
- \fi\fi
- % why was this \global\holdinginserts\zerocount
- \global\setfalse\c_page_sides_short}
-
-\def\page_sides_restore_left_indent
- {\relax
- \ifnum\c_page_sides_float_type>\plusfour \else
- \parskip\zeropoint % here ?
- \ifdim\d_page_sides_width>\zeropoint % new, see prikkels
- \noindent
- \ifinner \else
- \vadjust{\penalty\minusone}%
- \fi
- \hskip\d_page_sides_width\relax % \kern
- %\else
- % we have a margin or edge float
- \fi
+ \global\d_page_sides_vsize\d_page_sides_vsize_reset
+ \global\c_page_sides_n_of_lines\zerocount
\fi}
-\def\page_sides_relocate_float#1%
- {\global\setbox\floatbox\hpack
- {\ifnum\c_page_sides_float_type=\plusfour
- \kern\d_page_sides_leftshift
- \else\ifnum\c_page_sides_float_type=\plusone
- \kern\d_page_sides_leftshift
- \fi\fi
- \ifnum\c_page_sides_float_type>\plusfour
- \kern-\d_page_sides_extrashift
- \else
- \kern\d_page_sides_shift
- \fi
- \vbox{#1\ifnum\c_page_sides_align=\plusfour \removedepth \fi}%
- \ifnum\c_page_sides_float_type>\plusfour
- \kern\d_page_sides_shift
- \else
- \kern-\d_page_sides_extrashift
- \fi
- \ifnum\c_page_sides_float_type=\pluseight
- \kern\d_page_sides_rightshift
- \else\ifnum\c_page_sides_float_type=\plusfive
- \kern\d_page_sides_rightshift
- \fi\fi}}
-
-\def\page_sides_apply_vertical_shift_normal
- {\global\setbox\floatbox\hpack % why extra box
- {\vpack
- {\forgetall
- \hsize\wd\floatbox
- \vskip\privatescratchdimen
- \offinterlineskip
- \box\floatbox
- % somehow we need this \scratchbox magic, but at least it's the same as the
- % tracer now
- \setbox\scratchbox\emptybox
- \wd\scratchbox\hsize
- \ht\scratchbox\d_page_sides_bottomtotal
- \box\scratchbox
- \vskip-\d_page_sides_bottomtotal
- \ifnum\c_page_sides_align=\plusfive \vskip-\lineheight \fi}}}
-
-\def\page_sides_apply_vertical_shift_traced
- {\global\setbox\floatbox\hpack % why extra box
- {\backgroundline[trace:r]{\ruledhpack{\vpack
- {\forgetall
- \hsize\wd\floatbox
- \vskip\privatescratchdimen
- \offinterlineskip
- \backgroundline[trace:g]{\ruledhpack{\box\floatbox}}\par
- \blackrule[\c!color=trace:s,\c!height=\d_page_sides_bottomtotal,\c!depth=\zeropoint,\c!width=\hsize]%
- \vskip-\d_page_sides_bottomtotal
- \ifnum\c_page_sides_align=\plusfive \vskip-\lineheight \fi}}}}}
-
-\def\page_sides_apply_vertical_shift
- {\ifnum\c_page_sides_align=\plusfour
- \getnoflines{\ht\floatbox}%
- \privatescratchdimen\dimexpr\noflines\lineheight-\strutdp\relax
- \getrawnoflines\d_page_sides_toptotal
- \advance\privatescratchdimen\noflines\lineheight
- % todo: maybe rounding problem here
- % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}%
- \page_sides_force_depth
- \ht\floatbox\privatescratchdimen
- \dp\floatbox\zeropoint
- \fi
- \ifcase\c_page_sides_align \else
- \global\d_page_sides_toptotal\zeropoint
- \fi
- \privatescratchdimen
- \ifnum\c_page_sides_float_type<\plusfour
- \d_page_sides_toptotal
- \else\ifnum\c_page_sides_float_type>\plusfive
- \d_page_sides_toptotal
- \else
- \zeropoint
- \fi\fi
- % the top of the box is at the previous baseline
- \ifcase\c_page_sides_align
- % 0 normal
- \advance\privatescratchdimen\strutdp % or \openstrutdepth
- \or % 1 height
- \advance\privatescratchdimen\strutdp % or \openstrutdepth
- \or % 2 line
- \or % 3 depth
- \advance\privatescratchdimen\lineheight % or \openlineheight
- \advance\privatescratchdimen\strutdp % or \openstrutdepth
- \or % 4 grid
- \privatescratchdimen\zeropoint
- \or
- \advance\privatescratchdimen\strutht % or \openstrutheight
- \fi
- % new
- \global\c_page_sides_lines_done\zerocount
- \ifnum\c_page_sides_n_of_lines>\zerocount
- \advance\privatescratchdimen\c_page_sides_n_of_lines\lineheight
- \fi
- \iftracesidefloats
- \page_sides_apply_vertical_shift_traced % uses \privatescratchdimen
- \else
- \page_sides_apply_vertical_shift_normal % uses \privatescratchdimen
- \fi
- \ifnum\c_page_sides_float_type<\plusfour
- \global\d_page_sides_toptotal\zeropoint
- \else\ifnum\c_page_sides_float_type>\plusfive
- \global\d_page_sides_toptotal\zeropoint
- \fi\fi
- \global\d_page_sides_downshift\zeropoint}
-
\def\page_sides_place_float
{\ifnum\c_page_sides_float_type=\plusfour \kern\d_page_sides_toptotal \fi
\ifnum\c_page_sides_float_type=\plusfive \kern\d_page_sides_toptotal \fi
-% \d_page_sides_saved_depth\prevdepth
-% \nointerlineskip
\ifgridsnapping
\page_sides_place_float_grid
\else
@@ -540,10 +595,8 @@
\fi
\par
\kern-\d_page_sides_height
-\vskip-\parskip
\penalty10001 % oeps, this will change
- \normalbaselines
-}% \prevdepth\d_page_sides_saved_depth}
+ \normalbaselines}
\def\page_sides_place_float_normal
{\page_sides_push_float_inline\firstofoneargument}
@@ -556,7 +609,7 @@
\ifx\p_grid\empty\else
\snaptogrid[\p_grid]%
\fi
- \hbox{#1}}
+ \hpack{#1}}
\def\page_sides_place_float_grid
{\getrawnoflines\d_page_sides_height % raw ?
@@ -625,7 +678,15 @@
\scratchdimenone\d_page_sides_vsize
\scratchdimentwo\pagegoal
\ifcase\c_page_sides_tolerance
- \advance\scratchdimentwo -\strutdp
+ \ifcase\c_page_sides_method
+ % method 0 : raw
+ \or
+ % method 1 : safe (default)
+ \advance\scratchdimentwo -\strutdp
+ \or
+ % method 2 : tight (grid default)
+ \advance\scratchdimenone -\onepoint
+ \fi
\or
% tolerant
\advance\scratchdimentwo -.5\strutdp
@@ -634,14 +695,13 @@
\else
\advance\scratchdimentwo -\strutdp
\fi
- % here also pagedepth
+ % how about \pagedepth
\ifdim\scratchdimenone>\scratchdimentwo
\global\setfalse\c_page_floats_room
\else
\ifdim\dimexpr\pagegoal-\d_page_sides_vsize\relax<\d_page_sides_bottomtotal
% just weird: \global\advance\d_page_sides_vsize \scratchdimenone
\global\settrue\c_page_sides_short
- \page_otr_sides_push_penalties
% why was this \global\holdinginserts\plusone
\else
\global\advance\d_page_sides_vsize \d_page_sides_bottomtotal % wins over inbetween
@@ -650,25 +710,15 @@
\global\settrue\c_page_floats_room
\fi}
-\def\page_sides_inject_before
- {\checkedblank[\rootfloatparameter\c!spacebeforeside]}
-
-% \def\page_sides_inject_after
-% {\checkedblank[\rootfloatparameter\c!spaceafterside]}
-%
-% As we have no clear end of one or more paragraphs this makes no sense so:
-
-\let\page_sides_inject_after\donothing
-
-% \def\page_sides_prepare_space
-% {\inhibitblank} % hm, why here .. gets obscured anyway
+%D As we have no clear end of one or more paragraphs we only have pre float
+%D skips.
\def\page_sides_handle_float#1% grid (4) is rather experimental
- {\page_sides_check_skips
- \page_sides_inject_before
-% \page_sides_prepare_space
+ {\page_sides_check_horizontal_skips
+ \page_sides_check_vertical_skips
\page_sides_apply_horizontal_shift
\page_sides_check_previous_float
+ \page_sides_inject_before
\page_sides_inject_dummy_lines
\page_sides_relocate_float{#1}%
\page_sides_apply_vertical_shift
@@ -676,11 +726,18 @@
\ifconditional\c_page_floats_room \else
\page_otr_fill_and_eject_page
\page_sides_analyse_space
+ %\page_sides_inject_before
\page_sides_inject_dummy_lines
\fi
\page_sides_place_float
\page_sides_check_floats_reset
- \ignorespaces} % not really needed
+ \page_sides_wrapup}
+
+\def\page_sides_wrapup
+ {% we need to do this aftergroup
+ \ignoreparskip \aftergroup\ignoreparskip
+ \ignorespaces \aftergroup\ignorespaces
+ }
\def\page_sides_check_floats_indeed
{\page_sides_analyse_progress
@@ -689,49 +746,27 @@
\else
\page_sides_check_floats_reset
\fi
- \parskip\s_spac_whitespace_parskip}
+ \parskip\s_spac_whitespace_parskip} % not needed
\let\page_sides_check_floats\page_sides_check_floats_indeed
\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}}%
+ \dontleavehmode
+ \ifnum\c_page_sides_float_type>\plusfour
+ \rlap
+ {\hskip\availablehsize % d_page_sides_width % kern
+ \color[trace:o]%
+ {\rlap{\kern.25\bodyfontsize\showstruts\strut}%
+ \vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width}}%
+ \else
+ \hskip-\d_page_sides_width % kern
+ \color[trace:o]%
+ {\vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width
+ \llap{\showstruts\strut\kern.25\bodyfontsize}}%
+ \fi
\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
{\edef\p_sidethreshold{\floatparameter\c!sidethreshold}%
\ifx\p_sidethreshold\v!old
@@ -749,7 +784,6 @@
\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
\else
\ifcase\c_page_sides_lines_done
@@ -760,33 +794,28 @@
\global\advance\c_page_sides_n_of_lines-\privatescratchcounter
\fi
\fi
- % hm, when do we get the parshape branch? needs testing
\ifnum\c_page_sides_n_of_lines>\zerocount
\privatescratchtoks\emptytoks
\privatescratchcounter\c_page_sides_n_of_lines
\privatescratchdimen\dimexpr\hsize-\d_page_sides_width\relax
\dorecurse\c_page_sides_n_of_lines
- %{\appendtoks \zeropoint \hsize \to \privatescratchtoks}%
{\toksapp\privatescratchtoks{\zeropoint\hsize}}%
\ifnum\c_page_sides_n_of_hang>\c_page_sides_n_of_lines
\advance\c_page_sides_n_of_hang -\c_page_sides_n_of_lines\relax
\advance\privatescratchcounter\c_page_sides_n_of_hang
\dorecurse\c_page_sides_n_of_hang % weird, shouldn't that be scratchcounter
{\ifnum\c_page_sides_float_type>\plusfour
- %\appendtoks \zeropoint \privatescratchdimen \to \privatescratchtoks
\toksapp\privatescratchtoks{\zeropoint\privatescratchdimen}%
\else
- %\appendtoks \d_page_sides_width\privatescratchdimen \to \privatescratchtoks
\toksapp\privatescratchtoks{\d_page_sides_width\privatescratchdimen}%
\fi}%
\fi
\parshape
\numexpr\privatescratchcounter+\plusone\relax
- \the\privatescratchtoks % \privatescratchcounter
- \zeropoint \hsize % \plusone
+ \the\privatescratchtoks
+ \zeropoint \hsize
\relax
\else
- % new till here
\hangindent \ifnum\c_page_sides_float_type>\plusfour -\fi\d_page_sides_width
\hangafter-\c_page_sides_n_of_hang
\fi
@@ -815,51 +844,13 @@
\fi
\fi}
-\def\page_sides_inject_dummy_line_normal
- {\hpack to \availablehsize{\strut\hss}}
-
-\def\page_sides_inject_dummy_line_traced
- {\ruledhpack to \availablehsize{\backgroundline[trace:b]{\page_sides_inject_dummy_line_normal}}}
-
-\def\page_sides_inject_dummy_lines % so always one
- {\ifconditional\c_page_sides_dummy_lines
- \par
- \page_sides_force_depth
- %\checkedblank[\rootfloatparameter\c!sidespacebefore]%
- \begingroup
- \privatescratchcounter\pageshrink
- \divide\privatescratchcounter \lineheight % \baselineskip
- \advance\privatescratchcounter\plusone
- \offinterlineskip
- \ifcase\privatescratchcounter\else
- \dorecurse\privatescratchcounter
- {\dontleavehmode
- \iftracesidefloats
- \page_sides_inject_dummy_line_traced
- \else
- \page_sides_inject_dummy_line_normal
- \fi
- \par}%
- \vskip-\lineheight
- \vskip-\strutdp
-% \blank[-\v!line]%
- \fi
- \endgroup
- \else\ifdim\d_page_sides_midskip>\zeropoint\else
-% \vskip\parskip
- \ifdim\parskip>\zeropoint
- \blank[\v!white]%
- \fi
- \fi\fi
- \global\settrue\c_page_sides_dummy_lines}
-
-\def\adjustsidefloatdisplaylines % public, will change
- {\aftergroup\page_sides_adjust_display_lines}
-
-\def\page_sides_adjust_display_lines
- {\par
- \noindent
- \ignorespaces}
+% \def\adjustsidefloatdisplaylines % public, will change
+% {\aftergroup\page_sides_adjust_display_lines}
+%
+% \def\page_sides_adjust_display_lines
+% {\par
+% \noindent
+% \ignorespaces}
%D We need to hook it into the other otr's. This code will be adapted once we rename
%D the callers. We use \type {\def} as they can be redefined! Some will become obsolete
diff --git a/tex/context/base/mkiv/regi-ini.lua b/tex/context/base/mkiv/regi-ini.lua
index be8fa1b1c..7691e8765 100644
--- a/tex/context/base/mkiv/regi-ini.lua
+++ b/tex/context/base/mkiv/regi-ini.lua
@@ -12,6 +12,8 @@ if not modules then modules = { } end modules ['regi-ini'] = {
runtime.</p>
--ldx]]--
+-- Todo: use regi-imp*.lua instead
+
local commands, context = commands, context
local utfchar = utf.char
@@ -134,6 +136,9 @@ end
setmetatableindex(mapping, loadregime)
setmetatableindex(backmapping,loadreverse)
+regimes.mapping = mapping
+regimes.backmapping = backmapping
+
local function fromregime(regime,line)
if line and #line > 0 then
local map = mapping[regime and synonyms[regime] or regime or currentregime]
@@ -251,6 +256,22 @@ end
regimes.push = push
regimes.pop = pop
+function regimes.list()
+ local name = resolvers.findfile(format("regi-ini.lua",regime)) or ""
+ local okay = { }
+ if name then
+ local list = dir.glob(file.join(file.dirname(name),"regi-*.lua"))
+ for i=1,#list do
+ local name = list[i]
+ if name ~= "regi-ini.lua" then
+ okay[#okay+1] = match(name,"regi%-(.-)%.lua")
+ end
+ table.sort(okay)
+ end
+ end
+ return okay
+end
+
if sequencers then
sequencers.prependaction(textlineactions,"system","regimes.process")
diff --git a/tex/context/base/mkiv/spac-hor.mkiv b/tex/context/base/mkiv/spac-hor.mkiv
index 257535f73..176b52e1f 100644
--- a/tex/context/base/mkiv/spac-hor.mkiv
+++ b/tex/context/base/mkiv/spac-hor.mkiv
@@ -822,14 +822,16 @@
\forgetbothskips
\to \everyforgetall
-\unexpanded\def\forgetparskip
- {\s_spac_whitespace_parskip\zeropoint
- \parskip\zeropoint
- \let\v_spac_whitespace_current\v!none}
-
-\appendtoks
- \forgetparskip
-\to \everyforgetall
+% in spac-ver.mkiv
+%
+% \unexpanded\def\forgetparskip
+% {\s_spac_whitespace_parskip\zeropoint
+% \parskip\zeropoint
+% \let\v_spac_whitespace_current\v!none}
+%
+% \appendtoks
+% \forgetparskip
+% \to \everyforgetall
%D Tolerance (can also be set with align):
diff --git a/tex/context/base/mkiv/spac-ver.lua b/tex/context/base/mkiv/spac-ver.lua
index 1cd78ce70..aee61adf9 100644
--- a/tex/context/base/mkiv/spac-ver.lua
+++ b/tex/context/base/mkiv/spac-ver.lua
@@ -40,7 +40,6 @@ local todimen = string.todimen
local formatters = string.formatters
local nodes = nodes
-local node = node
local trackers = trackers
local attributes = attributes
local context = context
@@ -52,6 +51,7 @@ local texgetcount = tex.getcount
local texgetdimen = tex.getdimen
local texset = tex.set
local texsetdimen = tex.setdimen
+local texsetcount = tex.setcount
local texnest = tex.nest
local texgetbox = tex.getbox
@@ -149,6 +149,7 @@ local find_node_tail = nuts.tail
local flush_node = nuts.flush_node
local traverse_nodes = nuts.traverse
local traverse_nodes_id = nuts.traverse_id
+local insert_node_after = nuts.insert_after
local insert_node_before = nuts.insert_before
local remove_node = nuts.remove
local count_nodes = nuts.countall
@@ -694,41 +695,45 @@ local function snap_topskip(current,method)
return w, 0
end
-local categories = allocate {
- [0] = 'discard',
- [1] = 'largest',
- [2] = 'force' ,
- [3] = 'penalty',
- [4] = 'add' ,
- [5] = 'disable',
- [6] = 'nowhite',
- [7] = 'goback',
- [8] = 'together', -- not used (?)
- [9] = 'overlay',
- [10] = 'notopskip',
-}
+do
-vspacing.categories = categories
+ local categories = allocate {
+ [0] = 'discard',
+ [1] = 'largest',
+ [2] = 'force' ,
+ [3] = 'penalty',
+ [4] = 'add' ,
+ [5] = 'disable',
+ [6] = 'nowhite',
+ [7] = 'goback',
+ [8] = 'together', -- not used (?)
+ [9] = 'overlay',
+ [10] = 'notopskip',
+ }
-function vspacing.tocategories(str)
- local t = { }
- for s in gmatch(str,"[^, ]") do -- use lpeg instead
- local n = tonumber(s)
- if n then
- t[categories[n]] = true
- else
- t[b] = true
+ vspacing.categories = categories
+
+ function vspacing.tocategories(str)
+ local t = { }
+ for s in gmatch(str,"[^, ]") do -- use lpeg instead
+ local n = tonumber(s)
+ if n then
+ t[categories[n]] = true
+ else
+ t[b] = true
+ end
end
+ return t
end
- return t
-end
-function vspacing.tocategory(str) -- can be optimized
- if type(str) == "string" then
- return set.tonumber(vspacing.tocategories(str))
- else
- return set.tonumber({ [categories[str]] = true })
+ function vspacing.tocategory(str) -- can be optimized
+ if type(str) == "string" then
+ return set.tonumber(vspacing.tocategories(str))
+ else
+ return set.tonumber({ [categories[str]] = true })
+ end
end
+
end
vspacingdata.map = vspacingdata.map or { } -- allocate ?
@@ -1888,72 +1893,84 @@ end
-- tex.lists.page_head
-- tex.lists.contrib_head
-local stackhead, stacktail, stackhack = nil, nil, false
+do
-local function report(message,where,lst)
- if lst and where then
- report_vspacing(message,where,count_nodes(lst,true),nodeidstostring(lst))
- else
- report_vspacing(message,count_nodes(lst,true),nodeidstostring(lst))
+ local stackhead, stacktail, stackhack = nil, nil, false
+
+ local function report(message,where,lst)
+ if lst and where then
+ report_vspacing(message,where,count_nodes(lst,true),nodeidstostring(lst))
+ else
+ report_vspacing(message,count_nodes(lst,true),nodeidstostring(lst))
+ end
end
-end
--- ugly code: we get partial lists (check if this stack is still okay) ... and we run
--- into temp nodes (sigh)
-
-function vspacing.pagehandler(newhead,where)
- -- local newhead = texlists.contrib_head
- if newhead then
- newhead = tonut(newhead)
- local newtail = find_node_tail(newhead) -- best pass that tail, known anyway
- local flush = false
- stackhack = true -- todo: only when grid snapping once enabled
- -- todo: fast check if head = tail
- for n in traverse_nodes(newhead) do -- we could just look for glue nodes
- local id = getid(n)
- if id ~= glue_code then
- flush = true
- elseif getsubtype(n) == userskip_code then
- if getattr(n,a_skipcategory) then
- stackhack = true
- else
+ -- ugly code: we get partial lists (check if this stack is still okay) ... and we run
+ -- into temp nodes (sigh)
+
+ function vspacing.pagehandler(newhead,where)
+ -- local newhead = texlists.contrib_head
+ if newhead then
+ newhead = tonut(newhead)
+ local newtail = find_node_tail(newhead) -- best pass that tail, known anyway
+ local flush = false
+ stackhack = true -- todo: only when grid snapping once enabled
+ -- todo: fast check if head = tail
+ for n in traverse_nodes(newhead) do -- we could just look for glue nodes
+ local id = getid(n)
+ if id ~= glue_code then
flush = true
+ else
+ local subtype = getsubtype(n)
+ if subtype == userskip_code then
+ if getattr(n,a_skipcategory) then
+ stackhack = true
+ else
+ flush = true
+ end
+ elseif subtype == parskip_code then
+ -- if where == new_graf then ... end
+ if texgetcount("c_spac_vspacing_ignore_parskip") > 0 then
+ texsetcount("c_spac_vspacing_ignore_parskip",0)
+ setglue(n)
+ -- maybe removenode
+ end
+ end
end
- else
- -- tricky
end
- end
- if flush then
- if stackhead then
- if trace_collect_vspacing then report("%s > appending %s nodes to stack (final): %s",where,newhead) end
- setlink(stacktail,newhead)
- newhead = stackhead
- stackhead, stacktail = nil, nil
- end
- if stackhack then
- stackhack = false
- if trace_collect_vspacing then report("%s > processing %s nodes: %s",where,newhead) end
- -- texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod)
- newhead = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod)
- else
- if trace_collect_vspacing then report("%s > flushing %s nodes: %s",where,newhead) end
- -- texlists.contrib_head = newhead
- end
- return tonode(newhead)
- else
- if stackhead then
- if trace_collect_vspacing then report("%s > appending %s nodes to stack (intermediate): %s",where,newhead) end
- setlink(stacktail,newhead)
+ if flush then
+ if stackhead then
+ if trace_collect_vspacing then report("%s > appending %s nodes to stack (final): %s",where,newhead) end
+ setlink(stacktail,newhead)
+ newhead = stackhead
+ stackhead, stacktail = nil, nil
+ end
+ if stackhack then
+ stackhack = false
+ if trace_collect_vspacing then report("%s > processing %s nodes: %s",where,newhead) end
+ -- texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod)
+ newhead = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod)
+ else
+ if trace_collect_vspacing then report("%s > flushing %s nodes: %s",where,newhead) end
+ -- texlists.contrib_head = newhead
+ end
+ return tonode(newhead)
else
- if trace_collect_vspacing then report("%s > storing %s nodes in stack (initial): %s",where,newhead) end
- stackhead = newhead
+ if stackhead then
+ if trace_collect_vspacing then report("%s > appending %s nodes to stack (intermediate): %s",where,newhead) end
+ setlink(stacktail,newhead)
+ else
+ if trace_collect_vspacing then report("%s > storing %s nodes in stack (initial): %s",where,newhead) end
+ stackhead = newhead
+ end
+ stacktail = newtail
+ -- texlists.contrib_head = nil
+ -- newhead = nil
end
- stacktail = newtail
- -- texlists.contrib_head = nil
- -- newhead = nil
end
+ return nil
end
- return nil
+
end
do
@@ -2033,16 +2050,37 @@ do
trackers.register("vspacing.forcestrutdepth",function(v) trace = v end)
+-- function vspacing.forcestrutdepth(n,depth,trace_mode)
+-- local box = texgetbox(n)
+-- if box then
+-- box = tonut(box)
+-- local dp = getdepth(box)
+-- if dp < depth then
+-- local head = getlist(box)
+-- if head then
+-- local tail = find_node_tail(head)
+-- if tail and getid(tail) == hlist_code then
+-- setdepth(tail,depth)
+-- outer.prevdepth = depth
+-- if trace or trace_mode > 0 then
+-- nuts.setvisual(tail,"depth")
+-- end
+-- end
+-- end
+-- end
+-- end
+-- end
+
function vspacing.forcestrutdepth(n,depth,trace_mode)
local box = texgetbox(n)
if box then
box = tonut(box)
- local dp = getdepth(box)
- if dp < depth then
- local head = getlist(box)
- if head then
- local tail = find_node_tail(head)
- if tail and getid(tail) == hlist_code then
+ local head = getlist(box)
+ if head then
+ local tail = find_node_tail(head)
+ if tail and getid(tail) == hlist_code then
+ local dp = getdepth(tail)
+ if dp < depth then
setdepth(tail,depth)
outer.prevdepth = depth
if trace or trace_mode > 0 then
diff --git a/tex/context/base/mkiv/spac-ver.mkiv b/tex/context/base/mkiv/spac-ver.mkiv
index 76ea35223..0927758c2 100644
--- a/tex/context/base/mkiv/spac-ver.mkiv
+++ b/tex/context/base/mkiv/spac-ver.mkiv
@@ -61,7 +61,7 @@
\newif\iflocalinterlinespace
-\newskip\s_spac_vspacing_temp \s_spac_vspacing_temp\bigskipamount
+\newskip \s_spac_vspacing_temp \s_spac_vspacing_temp\bigskipamount
\def\skipfactor {.75}
\def\skipgluefactor{.25}
@@ -2545,4 +2545,34 @@
% \blank[\ifx\p_before\empty\else\p_before,\fi\p_blank\ifx\p_after\empty\else,\p_after\fi]%
% \fi\fi}
+% \setupwhitespace[line]
+% \prerollblank[2*line] \the\prerolledblank
+% \prerollblank[-2*line] \the\prerolledblank
+
+\newskip\prerolledblank
+
+\unexpanded\def\prerollblank[#1]%
+ {\begingroup
+ \edef\p_blank{#1}%
+ \ifx\p_blank\empty
+ \global\prerolledblank\zeropoint
+ \else\ifx\p_blank\v!none
+ \global\prerolledblank\zeropoint
+ \else
+ % don't mess with \arskip here!
+ \scratchskip\plusten\lineheight
+ \setbox\scratchbox\vbox
+ {\vskip\scratchskip
+ \kern\zeropoint
+ \blank[\p_blank]}%
+ % \dimexpr doesn't work well with skips
+ \advance\scratchskip-\ht\scratchbox
+ \global\prerolledblank-\scratchskip
+ \fi\fi
+ \endgroup}
+
+\newcount\c_spac_vspacing_ignore_parskip
+
+\unexpanded\def\ignoreparskip{\c_spac_vspacing_ignore_parskip\plusone}
+
\protect \endinput
diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf
index 09d1cb941..b5d8fd91c 100644
--- a/tex/context/base/mkiv/status-files.pdf
+++ b/tex/context/base/mkiv/status-files.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf
index c27899964..01bfb9e13 100644
--- a/tex/context/base/mkiv/status-lua.pdf
+++ b/tex/context/base/mkiv/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/strc-flt.mkvi b/tex/context/base/mkiv/strc-flt.mkvi
index 99ab2d50a..4c10e49e9 100644
--- a/tex/context/base/mkiv/strc-flt.mkvi
+++ b/tex/context/base/mkiv/strc-flt.mkvi
@@ -740,17 +740,27 @@
\newdimen\d_strc_floats_top
\newdimen\d_strc_floats_bottom
+% \def\strc_floats_calculate_skip#target#skip%
+% {\begingroup
+% \edef\askedfloatskip{\rootfloatparameter#skip}%
+% \ifx\askedfloatskip\empty
+% \global#target\zeropoint
+% \else\ifx\askedfloatskip\v!none
+% \global#target\zeropoint
+% \else
+% \setbox\scratchbox\vbox{\whitespace\blank[\askedfloatskip]}% todo: move whitespace inside blank
+% \global#target\ht\scratchbox
+% \fi\fi
+% \endgroup}
+
\def\strc_floats_calculate_skip#target#skip%
{\begingroup
- \edef\askedfloatskip{\rootfloatparameter#skip}%
- \ifx\askedfloatskip\empty
- \global#target\zeropoint
- \else\ifx\askedfloatskip\v!none
- \global#target\zeropoint
- \else
- \setbox\scratchbox\vbox{\whitespace\blank[\askedfloatskip]}% todo: move whitespace inside blank
- \global#target\ht\scratchbox
- \fi\fi
+ \edef\p_blank{\rootfloatparameter#skip}%
+ \ifx\p_blank\v!nowhite
+ \edef\p_blank{-\v!white}%
+ \fi
+ \prerollblank[\p_blank]%
+ \global#target\prerolledblank
\endgroup}
\def\strc_floats_analyze_variables_two
@@ -780,9 +790,11 @@
\ifconditional\c_strc_floats_par_float
\global\d_strc_floats_top \zeropoint
\global\d_strc_floats_bottom \zeropoint
- \strc_floats_calculate_skip\d_page_sides_topskip \c!sidespacebefore
- \strc_floats_calculate_skip\d_page_sides_bottomskip \c!sidespaceafter
- \strc_floats_calculate_skip\d_page_sides_midskip \c!sidespaceinbetween
+ \strc_floats_calculate_skip\d_page_sides_topskip \c!sidespacebefore
+ \strc_floats_calculate_skip\d_page_sides_bottomskip\c!sidespaceafter
+ \strc_floats_calculate_skip\d_page_sides_midskip \c!sidespaceinbetween
+ \strc_floats_calculate_skip\d_strc_floats_top \c!spacebeforeside
+ \strc_floats_calculate_skip\d_strc_floats_bottom \c!spaceafterside
\else
\global\d_page_sides_topskip \zeropoint
\global\d_page_sides_bottomskip \zeropoint
diff --git a/tex/context/base/mkiv/strc-ren.mkiv b/tex/context/base/mkiv/strc-ren.mkiv
index 90ad2252d..89aa6f55a 100644
--- a/tex/context/base/mkiv/strc-ren.mkiv
+++ b/tex/context/base/mkiv/strc-ren.mkiv
@@ -221,24 +221,6 @@
\let\localheadsetup \strc_rendering_initialize_spacing % historic name
\let\headsetupspacing\strc_rendering_initialize_spacing}
-\def\strc_rendering_initialize_hsize_local
- {\global\d_strc_rendering_local_leftoffset \leftskip
- \global\d_strc_rendering_local_rightoffset\rightskip
- % \forgetall
- % \leftskip \d_strc_rendering_local_leftoffset % no stretch
- % \rightskip\d_strc_rendering_local_rightoffset % no stretch
- % \setlocalhsize
- % \hsize\localhsize
- % \forgetbothskips}
- \scratchwidth\availablehsize
- \forgetall
- \hsize\scratchwidth}
-
-\def\strc_rendering_initialize_hsize_global
- {\global\d_strc_rendering_local_leftoffset \zeropoint
- \global\d_strc_rendering_local_rightoffset\zeropoint
- \forgetall}
-
\def\strc_rendering_initialize_interaction
{\resetinteractionparameter\c!style
\resetinteractionparameter\c!color
@@ -308,73 +290,32 @@
\d_strc_rendering_hang_height\zeropoint
\fi}
-% \def\strc_rendering_stop_placement
-% {\n_strc_rendering_hang_lines\zerocount
-% \ifconditional\headisdisplay
-% \strc_rendering_initialize_line_hang
-% % kind of special, we want to snap heads also according to local specs local
-% \ifgridsnapping
-% \hbox\bgroup % extra hbox will trigger global snapper on top of local
-% \edef\p_grid{\headparameter\c!grid}%
-% \ifconditional\headisdisplay
-% \ifx\p_grid\empty\else
-% \useheadstyleandcolor\c!style\c!color
-% \setupinterlinespace
-% \useheadstyleandcolor\c!textstyle\c!textcolor
-% \setupinterlinespace
-% \fi
-% \fi
-% \snaptogrid[\p_grid]\hbox
-% {\hskip\dimexpr\d_strc_rendering_local_leftoffset+\headparameter\c!margin\relax\box\b_strc_rendering_head}%
-% \egroup
-% \else
-% \hbox
-% {\hskip\dimexpr\d_strc_rendering_local_leftoffset+\headparameter\c!margin\relax\box\b_strc_rendering_head}%
-% \fi
-% \flushnotes % new, not really needed
-% \endgraf
-% \ifvmode
-% \ifnum\n_strc_rendering_hang_lines>\zerocount
-% \dorecurse\n_strc_rendering_hang_lines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}% to be checked
-% \fi
-% \nointerlineskip
-% \dosomebreak\nobreak
-% \fi
-% \getheadsyncs
-% \else
-% % somehow this goes ok even when we push in the margin probably because we gobble pars
-% % in the process of collecting index entries etc
-% \strut
-% \flushnotes % new, here since we're in par mode
-% \unhbox\b_strc_rendering_head
-% \getheadsyncs
-% \ifconditional\headissomewhere
-% % nothing special
-% \else
-% %\hskip\headnumberdistance\s!plus\headnumberdistance\s!minus.25\dimexpr\headnumberdistance\relax
-% \hskip\headtextdistance\relax
-% \strc_sectioning_inject_continuous_signal
-% \fi
-% \fi
-% \ifconditional\headisdisplay
-% \ifvmode
-% \ifgridsnapping % important, font related depth, see comment
-% \prevdepth\strutdp
-% \else
-% \prevdepth\d_strc_rendering_local_depth
-% \fi
-% \fi
-% \fi
-% \egroup
-% \egroup
-% \ifconditional\headisdisplay
-% \useindentnextparameter\headparameter
-% \else
-% \nonoindentation % recently added, was a bug
-% \fi}
+\def\strc_rendering_initialize_hsize_local
+ {\global\d_strc_rendering_local_leftoffset \leftskip
+ \global\d_strc_rendering_local_rightoffset\rightskip
+ % \forgetall
+ % \leftskip \d_strc_rendering_local_leftoffset % no stretch
+ % \rightskip\d_strc_rendering_local_rightoffset % no stretch
+ % \setlocalhsize
+ % \hsize\localhsize
+ % \forgetbothskips}
+ \scratchwidth\availablehsize
+ \forgetall
+ \hsize\scratchwidth}
+
+\def\strc_rendering_initialize_hsize_global
+ {\global\d_strc_rendering_local_leftoffset \zeropoint
+ \global\d_strc_rendering_local_rightoffset\zeropoint
+ \forgetall}
+
+% \def\strc_sectioning_stay_on_this_line
+% {\directcheckedvspacing{-\v!line,\v!samepage,\v!nowhite}%
+% \directcheckedvspacing\v!disable}
+%
+% we now use \ignoreparskip, so:
\def\strc_sectioning_stay_on_this_line
- {\directcheckedvspacing{\v!samepage,-\v!line}%
+ {\directcheckedvspacing{-\v!line,\v!samepage}%
\directcheckedvspacing\v!disable}
\def\strc_rendering_stop_placement
@@ -434,7 +375,8 @@
\ifconditional\headisdisplay
\useindentnextparameter\headparameter
\else
- \nonoindentation % recently added, was a bug
+ \ignoreparskip
+ \noindentation % recently added, was a bug
\fi}
% nice testcase
diff --git a/tex/context/base/mkiv/strc-sec.mkiv b/tex/context/base/mkiv/strc-sec.mkiv
index 78421067e..4e5115a7d 100644
--- a/tex/context/base/mkiv/strc-sec.mkiv
+++ b/tex/context/base/mkiv/strc-sec.mkiv
@@ -1088,7 +1088,7 @@
{\ifconditional\headisdisplay
\ifconditional\c_strc_sectioning_auto_break
% \vspacing[\v!samepage-\currentheadlevel]%
-\vspacing[\v!samepage]%
+ \vspacing[\v!samepage]%
\fi
\strc_sectioning_empty_correction
\headparameter\c!after
diff --git a/tex/context/base/mkiv/util-sta.lua b/tex/context/base/mkiv/util-sta.lua
index 614ef567e..d140cacdc 100644
--- a/tex/context/base/mkiv/util-sta.lua
+++ b/tex/context/base/mkiv/util-sta.lua
@@ -154,7 +154,7 @@ function stacker.new(name)
local function resolve_step(ti) -- keep track of changes outside function !
-- todo: optimize for n=1 etc
local result = nil
- local noftop = #top
+ local noftop = top and #top or 0
if ti > 0 then
local current = list[ti]
if current then