diff options
author | Hans Hagen <pragma@wxs.nl> | 2018-02-21 19:26:29 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2018-02-21 19:26:29 +0100 |
commit | 8e51addbcecd962280c24a77de9ec1f6724e7a65 (patch) | |
tree | 6a0f3b7ba546826e0864909da326df101068c5b8 /tex/context/base/mkiv | |
parent | 9bb459e9fedcad94579973ccd07ad9e78d0734c8 (diff) | |
download | context-8e51addbcecd962280c24a77de9ec1f6724e7a65.tar.gz |
2018-02-21 18:27:00
Diffstat (limited to 'tex/context/base/mkiv')
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 Binary files differindex 09d1cb941..b5d8fd91c 100644 --- a/tex/context/base/mkiv/status-files.pdf +++ b/tex/context/base/mkiv/status-files.pdf diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf Binary files differindex c27899964..01bfb9e13 100644 --- a/tex/context/base/mkiv/status-lua.pdf +++ b/tex/context/base/mkiv/status-lua.pdf 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 |