summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/spac-ver.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/spac-ver.mkiv')
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ver.mkiv1585
1 files changed, 785 insertions, 800 deletions
diff --git a/Master/texmf-dist/tex/context/base/spac-ver.mkiv b/Master/texmf-dist/tex/context/base/spac-ver.mkiv
index 897e9c9d732..23229b65078 100644
--- a/Master/texmf-dist/tex/context/base/spac-ver.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-ver.mkiv
@@ -5,7 +5,7 @@
%D subtitle=Vertical,
%D author=Hans Hagen,
%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
@@ -17,26 +17,14 @@
\registerctxluafile{spac-ver}{1.001}
-\newskip\blankskip \blankskip=\bigskipamount
+% todo: itemize : intro ... only when there is one or two lines preceding and then
+% keep these together i.e. \blank[intro]
-\def\skipfactor {.75}
-\def\skipgluefactor{.25}
-
-\def\normalskipamount
- {\openlineheight
- \ifgridsnapping \else \ifblankflexible
- \!!plus \skipgluefactor\openlineheight
- \!!minus\skipgluefactor\openlineheight
- \fi \fi
- \relax}
-\def\linedistance {\normalskipamount}
-\def\appliedblankskip{\skipfactor\linedistance}
-\def\lastblankskip {\blankskip}
-\def\currentblank {\v!big}
-\def\oldprevdepth {\prevdepth}
-\def\newprevdepth {-1001pt}
-\def\mindimen {1sp} % was: 0.00002pt
+% Isn't it about time to get rid of topskip i.e. make it equivalent to
+% \openstrutheight so that we can remove delta code.
+%
+% There might be more namespace protection.
%D There are two ways to influence the interline spacing. The
%D most general and often most consistent way is using
@@ -67,40 +55,51 @@
%D arguments) to set the interline space according to the
%D current font, e.g. a \type{\bfa}.
+% will be cleaned up but it will stay messy because we accept so
+% many variants
+
\newif\iflocalinterlinespace
-% font-ini
+\newskip\s_spac_vspacing_temp \s_spac_vspacing_temp\bigskipamount
-\ifx\bodyfontinterlinespecs\undefined
+\def\skipfactor {.75}
+\def\skipgluefactor{.25}
- \let\bodyfontinterlinespecs\empty
- \let\bodyfontinterlinespace\empty
+\def\normalskipamount
+ {\openlineheight
+ \ifgridsnapping \else \ifblankflexible
+ \!!plus \skipgluefactor\openlineheight
+ \!!minus\skipgluefactor\openlineheight
+ \fi \fi
+ \relax}
+\ifdefined\bodyfontinterlinespace \else
+ \let\bodyfontinterlinespace\empty
\fi
-\def\presetnormallineheight
+\unexpanded\def\presetnormallineheight % each bodyfont
{\edef\normallineheight{\interlinespaceparameter\c!line}%
- %done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
\iflocalinterlinespace \else
- \doifdefined\bodyfontinterlinespecs
- {\doifsomething\bodyfontinterlinespace
- {\edef\normallineheight{\bodyfontinterlinespace}}}%
+ \edef\m_spac_normallineheight{\bodyfontinterlinespace}%
+ \ifx\m_spac_normallineheight\empty \else
+ \let\normallineheight\m_spac_normallineheight
+ \fi
\fi}
\unexpanded\def\setupspecifiedinterlinespace[#1]%
- {\getparameters[\??it\currentinterlinespace][#1]%
- \dosetupspecifiedinterlinespaceindeed}
+ {\setupcurrentinterlinespace[#1]%
+ \spac_linespacing_setup_specified_interline_space}
-\def\dosetupspecifiedinterlinespaceindeed
- {\edef\strutheightfactor {\interlinespaceparameter\c!height}%
- \edef\strutdepthfactor {\interlinespaceparameter\c!depth}%
+\def\spac_linespacing_setup_specified_interline_space
+ {\edef\strutheightfactor {\interlinespaceparameter\c!height }%
+ \edef\strutdepthfactor {\interlinespaceparameter\c!depth }%
\edef\minimumstrutheight {\interlinespaceparameter\c!minheight}%
- \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth}%
- \edef\minimumlinedistance{\interlinespaceparameter\c!distance}%
- \edef\normallineheight {\interlinespaceparameter\c!line}%
- \edef\topskipfactor {\interlinespaceparameter\c!top}%
- \edef\maxdepthfactor {\interlinespaceparameter\c!bottom}%
- \edef\baselinegluefactor {\interlinespaceparameter\c!stretch}%
+ \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth }%
+ \edef\minimumlinedistance{\interlinespaceparameter\c!distance }%
+ \edef\normallineheight {\interlinespaceparameter\c!line }%
+ \edef\topskipfactor {\interlinespaceparameter\c!top }%
+ \edef\maxdepthfactor {\interlinespaceparameter\c!bottom }%
+ \edef\baselinegluefactor {\interlinespaceparameter\c!stretch }%
% often topskip does more bad than good, so:
\ifx\topskipfactor\v!height
\let\topskipfactor\strutheightfactor
@@ -108,93 +107,87 @@
\setfontparameters % redundant, can be \setstrut, test first
\updateraggedskips} % yes indeed
+\installcorenamespace{interlinespacerelative}
+
+\let\setrelativeinterlinespace \relax % used elsewhere
\let\currentrelativeinterlinespace\empty
-\setvalue{\??it::\v!on }{\oninterlineskip}
-\setvalue{\??it::\v!off }{\offinterlineskip}
-\setvalue{\??it::\v!reset}{\let\currentrelativeinterlinespace\empty
- \let\setrelativeinterlinespace\relax
- \setfontparameters}
-\setvalue{\??it::\v!auto }{\let\setrelativeinterlinespace\dosetrelativeinterlinespace}
+\setvalue{\??interlinespacerelative\v!on }{\oninterlineskip}
+\setvalue{\??interlinespacerelative\v!off }{\offinterlineskip}
+\setvalue{\??interlinespacerelative\v!reset}{\let\currentrelativeinterlinespace\empty
+ \let\setrelativeinterlinespace\relax
+ \setfontparameters}
+\setvalue{\??interlinespacerelative\v!auto }{\let\setrelativeinterlinespace\spac_linespacing_set_relative_interlinespace}
-\def\dosetspecifiedrelativeinterlinespace#1% fragile?
+\def\spac_linespacing_set_specified_relative_interlinespace#1% fragile?
{\doifdimenstringelse{#1}
{\setupspecifiedinterlinespace[\c!line=#1]}
{\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
\spacing\currentrelativeinterlinespace}}
\unexpanded\def\setuprelativeinterlinespace[#1]%
- {\processcommalist[#1]\dosetuprelativeinterlinespace}
+ {\processcommalist[#1]\spac_linespacing_setup_relative_interlinespace}
-\def\dosetuprelativeinterlinespace#1%
- {\ifcsname\??it::#1\endcsname
- \csname\??it::#1\endcsname
+\def\spac_linespacing_setup_relative_interlinespace#1%
+ {\ifcsname\??interlinespacerelative#1\endcsname
+ \csname\??interlinespacerelative#1\endcsname
\else
- \dosetspecifiedrelativeinterlinespace{#1}%
+ \spac_linespacing_set_specified_relative_interlinespace{#1}%
\fi}
-\def\dosetrelativeinterlinespace
+\def\spac_linespacing_set_relative_interlinespace
{\ifx\currentrelativeinterlinespace\empty\else
\spacing\currentrelativeinterlinespace
\fi}
-\let\setrelativeinterlinespace\relax
-
-\newtoks \everysetupglobalinterlinespace
-\newtoks \everysetuplocalinterlinespace
-
-\def\interlinespaceparameter #1{\csname\dointerlinespaceparameter{\??it\currentinterlinespace}#1\endcsname}
-\def\dointerlinespaceparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointerlinespaceparentparameter\csname#1\s!parent\endcsname#2\fi}
-\def\dointerlinespaceparentparameter#1#2{\ifx#1\relax\s!empty\else\dointerlinespaceparameter#1#2\fi}
+\newtoks\everysetupglobalinterlinespace
+\newtoks\everysetuplocalinterlinespace
\newconditional\interlinespaceisset
-\let\currentinterlinespace\empty
-
-\unexpanded\def\defineinterlinespace
- {\dodoubleempty\dodefineinterlinespace}
+\installcorenamespace{interlinespace}
-\def\dodefineinterlinespace[#1][#2]%
- {\getparameters[\??it#1][\s!parent=\??it,#2]}
+\installcommandhandler \??interlinespace {interlinespace} \??interlinespace
\unexpanded\def\setupinterlinespace
- {\dodoubleempty\dosetupinterlinespace}
+ {\dodoubleempty\spac_linespacing_setup}
-\def\dosetupinterlinespace[#1][#2]%
+\def\spac_linespacing_setup[#1][#2]%
{\settrue\interlinespaceisset % reset has to be done when needed
\ifsecondargument
- \getparameters[\??it#1][#2]%
+ \setup_interlinespace[#1][#2]%
\else\iffirstargument
- \edef\currentinterlinespace{\ifcsname\??it#1\s!parent\endcsname#1\fi}%
- \ifx\currentinterlinespace\empty
- \complexsetupinterlinespace[#1]%
+ \ifcsname\namedinterlinespacehash{#1}\s!parent\endcsname
+ \edef\currentinterlinespace{#1}%
+ \spac_linespacing_setup_specified_interline_space
+ %\dosetupspecifiedinterlinespaceindeed
\else
- \dosetupspecifiedinterlinespaceindeed
+ \spac_linespacing_setup_specified_or_relative[#1]%
\fi
\else
\let\currentinterlinespace\empty
- \simplesetupinterlinespace
+ \spac_linespacing_synchronize_local
\fi\fi}
-\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1
+\def\spac_linespacing_setup_specified_or_relative[#1]%
{\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
\the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
-\def\simplesetupinterlinespace % adapts to the font
+\def\spac_linespacing_synchronize_local % adapts to the font
{\localinterlinespacetrue
\setfontparameters
\updateraggedskips % funny one here
\the\everysetuplocalinterlinespace
\localinterlinespacefalse}
-\def\dosetupcheckedinterlinespace#1% often a chain
+\unexpanded\def\dosetupcheckedinterlinespace#1% often a chain
{\edef\askedinterlinespace{#1}%
\ifx\askedinterlinespace\empty
- \simplesetupinterlinespace
- \else\ifcsname\??it\askedinterlinespace\s!parent\endcsname
+ \spac_linespacing_synchronize_local
+ \else\ifcsname\namedinterlinespacehash\askedinterlinespace\s!parent\endcsname % we could have a \s!check
\pushmacro\currentinterlinespace
\let\currentinterlinespace\askedinterlinespace
- \dosetupspecifiedinterlinespaceindeed
+ \spac_linespacing_setup_specified_interline_space % \dosetupspecifiedinterlinespaceindeed
\iflocalinterlinespace
\the\everysetuplocalinterlinespace
\else
@@ -205,8 +198,7 @@
\popmacro\currentinterlinespace
\else
\normalexpanded{\noexpand\doifassignmentelse{\askedinterlinespace}%
- \noexpand\setupspecifiedinterlinespace
- \noexpand\setuprelativeinterlinespace[\askedinterlinespace]}%
+ \setupspecifiedinterlinespace\setuprelativeinterlinespace[\askedinterlinespace]}%
\iflocalinterlinespace
\the\everysetuplocalinterlinespace
\else
@@ -225,115 +217,52 @@
\let\switchtointerlinespace\setuplocalinterlinespace
-\definecomplexorsimple\setupinterlinespace
-
-\def\removelastskip % a redefinition of plain
+% \definecomplexorsimple\setupinterlinespace
+
+%D Helpers
+
+\newskip \s_spac_lastskip
+\newdimen\d_spac_prevdepth
+\newcount\c_spac_spacefactor
+
+\unexpanded\def\removelastskip
{\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi}
-\def\doifoutervmode#1%
- {\ifvmode\ifinner\else#1\fi\fi}
+\def\doifoutervmode
+ {\ifvmode
+ \ifinner
+ \doubleexpandafter\gobbleoneargument
+ \else
+ \doubleexpandafter\firstofoneargument
+ \fi
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
-\def\dosomebreak#1%
+\unexpanded\def\dosomebreak#1%
{\doifoutervmode
- {\scratchskip\lastskip
+ {\s_spac_lastskip\lastskip
\removelastskip
- %\leavevmode\type{#1}%
#1\relax
- \ifdim\scratchskip=\zeropoint % else interference with footnotes
+ \ifdim\s_spac_lastskip=\zeropoint
+ % avoid interference with footnotes
\else
- \vskip\scratchskip
+ \vskip\s_spac_lastskip
\fi}}
-
-\def\packed
+
+\unexpanded\def\packed
{\nointerlineskip}
-\def\godown[#1]%
+\unexpanded\def\godown[#1]%
{\relax
\ifhmode\endgraf\fi
\ifvmode\nointerlineskip\vskip#1\relax\fi}
-
-\ifx\smallskip\undefined
-
- \def\smallskip{\vskip\smallskipamount}
- \def\medskip {\vskip\medskipamount}
- \def\bigskip {\vskip\bigskipamount}
-
-\fi
-\ifx\allowbreak\undefined
+\unexpanded\def\smallskip{\vskip\smallskipamount}
+\unexpanded\def\medskip {\vskip\medskipamount}
+\unexpanded\def\bigskip {\vskip\bigskipamount}
- \def\break {\penalty\ifhmode-\plustenthousand\else\ejectpenalty\fi}
- \def\nobreak {\penalty \plustenthousand}
- \def\allowbreak{\penalty \zeropoint}
- \def\filbreak {\par\vfil\penalty-200\vfilneg}
- \def\goodbreak {\par\penalty-500 }
-
-\fi
-
-%D Made slightly more readable:
-
-\ifx\vglue\undefined
-
- \def\vglue {\afterassignment\dovglue\scratchskip=}
- \def\hglue {\afterassignment\dohglue\scratchskip=}
- \def\topglue{\nointerlineskip\vglue-\topskip\vglue}
-
- \def\dovglue
- {\par
- \scratchdimen\prevdepth
- \hrule\!!height\zeropoint
- \nobreak
- \vskip\scratchskip
- \prevdepth\scratchdimen}
-
- \def\dohglue
- {\dontleavehmode % \leavevmode
- \scratchcounter\spacefactor
- \vrule\!!width\zeropoint
- \nobreak
- \hskip\scratchskip
- \spacefactor\scratchcounter}
-
-\fi
-
-\ifx\eject\undefined
-
- \def\eject{\par\break}
-
-\fi
-
-\ifx\supereject\undefined
-
- \def\supereject{\par\penalty\superpenalty}
-
-\fi
-
-\ifx\dosupereject\undefined
-
- \def\dosupereject
- {\ifnum\insertpenalties>\zerocount % something is being held over
- \line{}
- \kern-\topskip
- \nobreak
- \vfill\supereject
- \fi}
-
-\fi
-
-%D We adapt plain's \type {\removelastskip} a bit:
-
-\ifx\removelastskip\undefined
-
- \def\removelastskip
- {\ifvmode \ifdim\lastskip=\zeropoint \else
- \vskip-\lastskip
- \fi \fi}
-
-\fi
-
-\ifx\smallbreak\undefined
-
-\def\smallbreak
+\unexpanded\def\smallbreak
{\par
\ifdim\lastskip<\smallskipamount
\removelastskip
@@ -341,7 +270,7 @@
\smallskip
\fi}
-\def\medbreak
+\unexpanded\def\medbreak
{\par
\ifdim\lastskip<\medskipamount
\removelastskip
@@ -349,7 +278,7 @@
\medskip
\fi}
-\def\bigbreak
+\unexpanded\def\bigbreak
{\par
\ifdim\lastskip<\bigskipamount
\removelastskip
@@ -357,178 +286,310 @@
\bigskip
\fi}
-\fi
-
-\newskip\ctxparskip \ctxparskip\zeropoint
+\unexpanded\def\break {\penalty-\plustenthousand} % can be hmode or vmode
+\unexpanded\def\nobreak {\penalty \plustenthousand} % can be hmode or vmode
+\unexpanded\def\allowbreak{\penalty \zeropoint} % can be hmode or vmode
+\unexpanded\def\goodbreak {\par\penalty-500\relax} % forces vmode
+\unexpanded\def\filbreak {\par\vfil\penalty-200\vfilneg} % forces vmode
-\newconditional \flexiblewhitespace \settrue\flexiblewhitespace
+%D Made slightly more readable:
-\def\currentwhitespace {\zeropoint}
+\unexpanded\def\vglue {\afterassignment\spac_helpers_vglue_indeed\s_spac_lastskip=}
+\unexpanded\def\hglue {\afterassignment\spac_helpers_hglue_indeed\s_spac_lastskip=}
+\unexpanded\def\topglue{\nointerlineskip\vglue-\topskip\vglue}
-\definecomplexorsimple\setupwhitespace
+\def\spac_helpers_vglue_indeed
+ {\par
+ \d_spac_prevdepth\prevdepth
+ \hrule\!!height\zeropoint
+ \nobreak
+ \vskip\s_spac_lastskip
+ \prevdepth\d_spac_prevdepth}
+
+\def\spac_helpers_hglue_indeed
+ {\dontleavehmode % \leavevmode
+ \c_spac_spacefactor\spacefactor
+ \vrule\!!width\zeropoint
+ \nobreak
+ \hskip\s_spac_lastskip
+ \spacefactor\c_spac_spacefactor}
-\def\simplesetupwhitespace
- {\doifnot\currentwhitespace\v!none\dosetupwhitespace}
+%D We adapt plain's \type {\removelastskip} a bit:
-\def\complexsetupwhitespace[#1]%
- {\edef\nextcurrentwhitespace{#1}%
- \ifx\nextcurrentwhitespace\empty
- \simplesetupwhitespace
- \else
- \let\currentwhitespace\nextcurrentwhitespace
- \dosetupwhitespace
+\unexpanded\def\removelastskip % also in supp-box
+ {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi}
+
+% The whitespace handler. We could cache settings but normally there are not
+% that many in a set.
+
+\installcorenamespace{whitespacemethod}
+
+\newskip \s_spac_whitespace_parskip \s_spac_whitespace_parskip\zeropoint
+\newconditional\c_spac_whitespace_flexible \settrue\c_spac_whitespace_flexible
+\newconstant \c_spac_whitespace_grid_mode % option in layout / 1=permit_half_lines
+
+%def\v_spac_whitespace_current{\zeropoint}
+\let\v_spac_whitespace_current\v!none
+
+\unexpanded\def\setupwhitespace
+ {\doifnextoptionalelse\spac_whitespace_setup_yes\spac_whitespace_setup_nop}
+
+\def\spac_whitespace_setup_nop
+ {\ifx\v_spac_whitespace_current\v!none\else
+ \spac_whitespace_setup
\fi}
-\newconstant\baselinegridmode % option in layout / 1=permit_half_lines
+\let\synchronizewhitespace\spac_whitespace_setup_nop
+
+\def\spac_whitespace_setup_yes[#1]%
+ {\edef\m_spac_whitespace_asked{#1}%
+ \ifx\m_spac_whitespace_asked\empty
+ \spac_whitespace_setup_nop
+ \else
+ \let\v_spac_whitespace_current\m_spac_whitespace_asked
+ \spac_whitespace_setup
+ \fi}
-\def\dosetupwhitespace % quick test for no list
- {\ifcsname\??ws\??ws\currentwhitespace\endcsname
- \csname\??ws\??ws\currentwhitespace\endcsname
+\def\spac_whitespace_setup % quick test for no list
+ {\ifcsname\??whitespacemethod\v_spac_whitespace_current\endcsname
+ \csname\??whitespacemethod\v_spac_whitespace_current\endcsname
\else
- \expandafter\processcommalist\expandafter[\currentwhitespace]\dowhitespacemethod % can be raw
+ \expandafter\processcommalist\expandafter[\v_spac_whitespace_current]\spac_whitespace_setup_method % can be raw
\fi\relax
\ifgridsnapping
- \setfalse\flexiblewhitespace
- \ifdim\ctxparskip>\zeropoint
- \ctxparskip
- \ifcase\baselinegridmode
- \baselineskip % normal ! ! ! ! !!
- \or
- \ifdim\scratchdimen=\baselineskip % maybe range
- \baselineskip % normal ! ! ! ! !!
- \else
- \numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax
- \fi
- \else
- \baselineskip % normal ! ! ! ! !!
- \fi
- \fi
+ \spac_whitespace_setup_grid
\else
- \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi
+ \spac_whitespace_setup_normal
\fi
- \parskip\ctxparskip}
+ \parskip\s_spac_whitespace_parskip}
-\def\dodosetupwhitespace
- {\ifgridsnapping
- \setfalse\flexiblewhitespace
- \ctxparskip1\ctxparskip
- \ifdim\ctxparskip>\zeropoint
- \ifcase\baselinegridmode
- \ctxparskip\baselineskip % normal ! ! ! ! !!
+\def\spac_whitespace_setup_normal
+ {\ifconditional\c_spac_whitespace_flexible \else
+ \s_spac_whitespace_parskip\plusone\s_spac_whitespace_parskip
+ \fi}
+
+\def\spac_whitespace_setup_grid
+ {\setfalse\c_spac_whitespace_flexible
+ \ifdim\s_spac_whitespace_parskip>\zeropoint
+ \s_spac_whitespace_parskip
+ \ifcase\c_spac_whitespace_grid_mode
+ \baselineskip
\or
\ifdim\scratchdimen=\baselineskip % maybe range
- \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \baselineskip
\else
- \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax
+ \numexpr\s_spac_whitespace_parskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax
\fi
\else
- \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \baselineskip
\fi
- \fi
- \else
- \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi
- \fi
- \parskip\ctxparskip}
-
-\definesystemvariable {ws} % whitespace
+ \fi}
-\unexpanded\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#1}{#2}}
+\unexpanded\def\installwhitespacemethod#1#2%
+ {\setvalue{\??whitespacemethod#1}{#2}}
-\definewhitespacemethod [\v!fix] {}
-\definewhitespacemethod [\v!fixed] {\setfalse\flexiblewhitespace}
-\definewhitespacemethod [\v!flexible] {\settrue\flexiblewhitespace}
-\definewhitespacemethod [\v!line] {\ctxparskip \baselineskip}
-\definewhitespacemethod [\v!halfline] {\ctxparskip.5\baselineskip}
-\definewhitespacemethod [\v!none] {\ctxparskip \zeropoint}
-\definewhitespacemethod [\v!big] {\ctxparskip \bigskipamount}
-\definewhitespacemethod [\v!medium] {\ctxparskip \medskipamount}
-\definewhitespacemethod [\v!small] {\ctxparskip \smallskipamount}
+\installwhitespacemethod \v!fix {}
+\installwhitespacemethod \v!fixed {\setfalse\c_spac_whitespace_flexible}
+\installwhitespacemethod \v!flexible {\settrue \c_spac_whitespace_flexible}
-\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin}
+\installwhitespacemethod \v!line {\s_spac_whitespace_parskip \baselineskip}
+\installwhitespacemethod \v!halfline {\s_spac_whitespace_parskip .5\baselineskip}
+\installwhitespacemethod \v!quarterline {\s_spac_whitespace_parskip.25\baselineskip}
+\installwhitespacemethod \v!none {\s_spac_whitespace_parskip \zeropoint}
+\installwhitespacemethod \v!big {\s_spac_whitespace_parskip \bigskipamount}
+\installwhitespacemethod \v!medium {\s_spac_whitespace_parskip \medskipamount}
+\installwhitespacemethod \v!small {\s_spac_whitespace_parskip \smallskipamount}
-\def\dowhitespacemethod#1%
- {\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax}
+\installwhitespacemethod \s!default {\spac_whitespace_setup_nop}
-\def\nowhitespace{\vspacing[\v!nowhite]}
-\def\whitespace {\vspacing[\v!white]}
+\def\spac_whitespace_setup_method#1%
+ {\ifcsname\??whitespacemethod#1\endcsname
+ \csname\??whitespacemethod#1\endcsname
+ \else
+ \s_spac_whitespace_parskip#1\fi
+ \relax}
+
+\unexpanded\def\forgetparskip
+ {\s_spac_whitespace_parskip\zeropoint
+ \parskip\zeropoint
+ \let\v_spac_whitespace_current\v!none}
+
+% \installwhitespacemethod \s!unknown {\s_spac_whitespace_parskip\commalistelement\relax}
+%
+% \def\spac_whitespace_setup_method#1%
+% {\csname\??whitespacemethod\ifcsname\??whitespacemethod#1\endcsname#1\else\s!unknown\endcsname\relax}
+
+\unexpanded\def\nowhitespace{\vspacing[\v!nowhite]}
+\unexpanded\def\whitespace {\vspacing[\v!white]}
-% De onderstaande macro handelt ook de situatie dat er geen
-% tekst tussen \start ... \stop is geplaatst. Daartoe wordt de
-% laatste skip over de lege tekst heen gehaald. Dit komt goed
-% van pas bij het plaatsen van (mogelijk lege) lijsten.
+% Packed:
-\newconditional\noblankinpacked
-\newcount\packeddepth
+% todo: when packed blocks blank, we need to enable forced
+
+\newconditional\c_spac_packed_blank \settrue\c_spac_packed_blank
+\newcount \c_spac_packed_level
\unexpanded\def\startpacked
- {\dosingleempty\dostartpacked}
+ {\dosingleempty\spac_packed_start}
-\def\dostartpacked[#1]% nesting afvangen
- {\global\advance\packeddepth\plusone
+\def\spac_packed_start[#1]% nesting afvangen
+ {\global\advance\c_spac_packed_level\plusone
\par
- \ifnum\packeddepth=\plusone \ifvmode
- \bgroup
+ \ifnum\c_spac_packed_level=\plusone \ifvmode
+ \begingroup
\whitespace % not combined
\blank[\v!disable]%
- \doifelse{#1}\v!blank\setfalse\settrue\noblankinpacked
+ \doifelse{#1}\v!blank\settrue\setfalse\c_spac_packed_blank
\setupwhitespace[\v!none]%
\fi \fi}
\unexpanded\def\stoppacked
{\par
- \ifnum\packeddepth=\plusone \ifvmode
- \egroup
+ \ifnum\c_spac_packed_level=\plusone \ifvmode
+ \endgroup
\fi \fi
- \global\advance\packeddepth\minusone}
+ \global\advance\c_spac_packed_level\minusone}
\unexpanded\def\startunpacked
{\blank
- \bgroup}
+ \begingroup}
\unexpanded\def\stopunpacked
- {\egroup
+ {\endgroup
\blank}
-
-% De onderstaande macro's moeten nog eens nader worden uitgewerkt.
-% Ze spelen een rol bij de spatiering rond omkaderde teksten
-% en/of boxen zonder diepte.
% \prevdepth crosses pageboundaries!
%
% todo: a version that works ok inside a box
-\let\doaroundlinecorrection\relax
+\installcorenamespace{linesaround}
+
+\let\v_spac_lines_around_action_set\relax
+\let\m_spac_lines_around \empty
+
+% \setvalue{\??linesaround\v!blank }{\blank}
+% \letvalue{\??linesaround\empty }\relax
+% \setvalue{\??linesaround\s!unknown}{\blank[\m_spac_lines_around]}
+%
+% \unexpanded\def\startlinecorrection
+% {\bgroup
+% \dodoubleempty\spac_lines_start_correction}
+%
+% \def\spac_lines_start_correction[#1][#2]% #2 gobbles spaces
+% {\edef\m_spac_lines_around{#1}%
+% \expandafter\let\expandafter\spac_lines_action_around\csname\??linesaround
+% \ifcsname\??linesaround\m_spac_lines_around\endcsname\m_spac_lines_around\else\s!unknown\fi
+% \endcsname
+% \spac_lines_action_around
+% \startbaselinecorrection
+% \offbaselinecorrection
+% \ignorespaces}
+%
+% \unexpanded\def\stoplinecorrection
+% {\stopbaselinecorrection
+% \spac_lines_action_around
+% \egroup}
+
+\setvalue{\??linesaround\v!blank }{\blank}
+\letvalue{\??linesaround\empty }\relax
+\setvalue{\??linesaround\s!unknown}{\blank[\m_spac_lines_around]}
+
+\def\spac_lines_action_around % we used to let this one but it's cleaner this way
+ {\csname\??linesaround % i.e. do it twice
+ \ifcsname\??linesaround\m_spac_lines_around\endcsname\m_spac_lines_around\else\s!unknown\fi
+ \endcsname}
\unexpanded\def\startlinecorrection
- {\dodoubleempty\dostartlinecorrection}
+ {\endgraf
+ \bgroup
+ \dosingleempty\spac_lines_start_correction}
+
+\unexpanded\def\startlocallinecorrection
+ {\endgraf
+ \bgroup
+ \setlocalhsize
+ \hsize\localhsize
+ \dosingleempty\spac_lines_start_correction}
+
+\def\spac_lines_start_correction
+ {\ifvmode
+ \expandafter\spac_lines_start_correction_yes
+ \else
+ \expandafter\spac_lines_start_correction_nop
+ \fi}
-\def\dostartlinecorrection[#1][#2]% #2 gobbles spaces
- {\bgroup
- \processaction
- [#1]
- [ \v!blank=>\let\doaroundlinecorrection\blank,
- \s!default=>\let\doaroundlinecorrection\relax,
- \s!unknown=>{\def\doaroundlinecorrection{\blank[#1]}}]%
- \doaroundlinecorrection
- \startbaselinecorrection
- \offbaselinecorrection
- \ignorespaces}
+\def\spac_lines_start_correction_nop[#1]%
+ {\vbox\bgroup
+ \ignorespaces
+ \let\spac_lines_stop_correction\spac_lines_stop_correction_nop}
+
+\def\spac_lines_stop_correction_nop
+ {\removeunwantedspaces
+ \egroup}
+
+\newdimen\d_spac_prevdepth
-\unexpanded\def\stoplinecorrection
- {\stopbaselinecorrection
- \doaroundlinecorrection
+\def\spac_lines_start_correction_yes[#1]%
+ {\edef\m_spac_lines_around{#1}%
+ \spac_lines_action_around
+ \d_spac_prevdepth\prevdepth
+ \spac_lines_initialize_corrections
+ \offbaselinecorrection % ???
+ \setbox\scratchbox\vbox\bgroup
+ \ignorespaces
+ \let\spac_lines_stop_correction\spac_lines_stop_correction_yes}
+
+\unexpanded\def\spac_lines_stop_correction_yes
+ {\removeunwantedspaces
+ \egroup
+ \ifgridsnapping
+ \blank[\v!white]%
+ \snaptogrid\hbox{\box\scratchbox}%
+ \else
+ \ifdim\d_spac_prevdepth<\maxdimen
+ \unless\ifdim\d_spac_prevdepth<\zeropoint
+ \ifdim\d_spac_prevdepth<\strutdp \relax
+ \pushlastnode
+ \ifdim\d_spac_prevdepth>\zeropoint
+ \kern-\d_spac_prevdepth
+ \fi
+ \kern\strutdp
+ \prevdepth\strutdp
+ \poplastnode
+ \fi
+ \fi
+ \fi
+ \ifdim\pagegoal<\maxdimen
+ \blank[\v!white,\the\d_spac_lines_correction_before]% \blank[\v!white]\dotopbaselinecorrection
+ \fi
+ \nointerlineskip % new
+ \dontleavehmode
+ \box\scratchbox
+ \endgraf
+ \blank[\the\d_spac_lines_correction_after]% \dobotbaselinecorrection
+ % \allowbreak % new, otherwise problems when many in a row
+ \prevdepth\strutdp
+ \fi
+ \spac_lines_action_around
\egroup}
-\def\correctwhitespace
- {\dowithnextbox
- {\startbaselinecorrection
- \flushnextbox
- \stopbaselinecorrection}%
- \vbox}
-
-\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}}
-\def\horizontalstrut{\normalhbox {\strut}}
-
+\unexpanded\def\stoplinecorrection{\spac_lines_stop_correction}
+
+\let\stoplocallinecorrection\stoplinecorrection
+
+% todo:
+
+\unexpanded\def\correctwhitespace
+ {\dowithnextboxcs\correctwhitespacefinish\vbox}
+
+\unexpanded\def\correctwhitespacefinish
+ {\startbaselinecorrection
+ \flushnextbox
+ \stopbaselinecorrection}
+
+\unexpanded\def\verticalstrut {\vbox{\hsize\zeropoint\forgetall\strut}}
+\unexpanded\def\horizontalstrut{\hbox {\strut}}
+
% Hieronder volgen enkele instellingen en macro's ten behoeve
% van de interlinie en \strut. De waarden 2.8, 0.07, 0.72 en
% 0.28 zijn ooit eens ontleend aan INRS-TEX en moeten wellicht
@@ -581,15 +642,15 @@
\def\baselinefactor {2.8}
\def\baselinegluefactor {0}
-\def\minimumstrutheight {0pt}
-\def\minimumstrutdepth {0pt}
+\def\minimumstrutheight {\zeropoint}
+\def\minimumstrutdepth {\zeropoint}
\def\normallineheight {\baselinefactor ex}
\def\minimumlinedistance {\lineskip}
-\def\strutheight {0pt}
-\def\strutdepth {0pt}
-\def\strutwidth {0pt}
+\def\strutheight {\zeropoint}
+\def\strutdepth {\zeropoint}
+\def\strutwidth {\zeropoint}
\let\spacingfactor \plusone
@@ -599,61 +660,59 @@
\def\systemtopskipfactor {\topskipfactor}
\def\systemmaxdepthfactor {\maxdepthfactor}
-\ifdefined\globalbodyfontsize\else
- \newdimen\globalbodyfontsize
- \globalbodyfontsize=12pt
+\ifdefined\globalbodyfontsize \else
+ \newdimen\globalbodyfontsize
+ \globalbodyfontsize=12pt
\fi
-\ifdefined\normalizedbodyfontsize\else
- \def\normalizedbodyfontsize{12pt}
+\ifdefined\normalizedbodyfontsize \else
+ \def\normalizedbodyfontsize{12pt}
\fi
-% door een \dimen. Dit is geen probleem omdat (1) de default
-% korpsgrootte 12pt is en (2) de fonts nog niet geladen zijn
-% en de instellingen bij het laden nogmaals plaatsvinden.
-
-\def\topskipcorrection
+\unexpanded\def\topskipcorrection
{\simpletopskipcorrection
\vskip-\struttotal
\verticalstrut}
-\def\simpletopskipcorrection
+\unexpanded\def\simpletopskipcorrection
{\ifdim\topskip>\openstrutheight
% == \vskip\topskipgap
\vskip\topskip
\vskip-\openstrutheight
\fi}
-\def\settopskip % the extra test is needed for the lbr family
- {\topskip\systemtopskipfactor\globalbodyfontsize
- \ifgridsnapping \else
- \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi
+\unexpanded\def\settopskip % the extra test is needed for the lbr family
+ {\topskip
+ \ifgridsnapping
+ \zeropoint
+ \else
+ \systemtopskipfactor\globalbodyfontsize
+ \ifcase\bottomraggednessmode % ragged bottom
+ \!!plus5\globalbodyfontsize
+ \fi
\fi
-\ifgridsnapping
- \topskip\zeropoint
-\fi
- \relax % the skip
+ %\relax
\topskipgap\topskip
\advance\topskipgap -\openstrutheight\relax
\ifdim\minimumstrutheight>\zeropoint
\ifdim\topskip<\minimumstrutheight
\topskip\minimumstrutheight\relax
\fi
- \else
+ \else
\ifdim\topskip<\strutheightfactor\openlineheight
\topskip\strutheightfactor\openlineheight\relax
\fi
- \fi}
+ \fi}
-\def\setmaxdepth
+\unexpanded\def\setmaxdepth
{\maxdepth\systemmaxdepthfactor\globalbodyfontsize}
-\def\normalbaselines
+\unexpanded\def\normalbaselines
{\baselineskip \normalbaselineskip
\lineskip \normallineskip
\lineskiplimit\normallineskiplimit}
-\def\setnormalbaselines
+\unexpanded\def\setnormalbaselines
{\ifdim\normallineheight>\zeropoint
\lineheight\normallineheight
\fi
@@ -678,13 +737,10 @@
\fi
\normallineskip\minimumlinedistance\relax % \onepoint\relax
\normallineskiplimit\zeropoint\relax
- \normalbaselines
- %\dosetupgridsnapping
- }
+ \normalbaselines}
-\def\spacing#1%
+\unexpanded\def\spacing#1% vertical
{\ifgridsnapping
- %\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{\withoutpt\the\dimexpr#1\points\relax}\fi
\let\spacingfactor\plusone
\else
\edef\spacingfactor{#1}%
@@ -702,8 +758,8 @@
\let\restoreinterlinespace\relax
-\def\saveinterlinespace
- {\edef\restoreinterlinespace
+\unexpanded\def\saveinterlinespace
+ {\unexpanded\edef\restoreinterlinespace
{\lineheight \the\lineheight
\openstrutheight \the\openstrutheight
\openstrutdepth \the\openstrutdepth
@@ -722,15 +778,11 @@
%
% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
-\ifx\strutbox\undefined
+\newbox\strutbox
- \newbox\strutbox
+\setbox\strutbox\hbox{\vrule\!!height8.5pt\!!depth3.5pt\!!width\zeropoint} % just a start
- \setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint}
-
- \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
-
-\fi
+\def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
\let\normalstrut\strut
@@ -778,7 +830,7 @@
\dosetstrut}
\unexpanded\def\setcharstrut#1%
- {\setbox\strutbox\normalhbox{#1}%
+ {\setbox\strutbox\hbox{#1}%
\strutht\ht\strutbox
\strutdp\dp\strutbox
\dosetstrut}
@@ -791,13 +843,13 @@
%D Handy for math (used in mathml):
-\def\charhtstrut
+\unexpanded\def\charhtstrut
{\begingroup
\setcharstrut{GJY}%
\vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht
\endgroup}
-\def\chardpstrut
+\unexpanded\def\chardpstrut
{\begingroup
\setcharstrut{gjy}%
\vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint
@@ -808,35 +860,34 @@
% treatment; tests with using an attribute so far have shown that
% it's slower because testing the attribute takes time too
-\newdimen\tempstrutdimen
-
-\def\dosetstrut
+\unexpanded\def\dosetstrut
{\let\strut\normalstrut
- \tempstrutdimen\dimexpr\strutht+\strutdp-\lineheight\relax
- \ifabsnum\tempstrutdimen<\plustwo
- % compensate rounding error /- 1sp to avoid too many
- % 1sp baselineskips in for instance verbatim
- \strutht\dimexpr\strutht-\tempstrutdimen\relax
+ \ifabsnum\dimexpr\strutht+\strutdp-\lineheight\relax<\plustwo
+ % compensate rounding error /- 1sp to avoid too many
+ % 1sp baselineskips in for instance verbatim
+ \strutht\dimexpr\lineheight-\strutdp\relax
+ \struttotal\lineheight
+ \else
+ \struttotal\dimexpr\strutht+\strutdp\relax
\fi
- \edef\strutheight{\the\strutht}% maybe better \number\strutht sp
+ \edef\strutheight{\the\strutht}%
\edef\strutdepth {\the\strutdp}%
\ifdim\strutwidth=\zeropoint
- \dosetstruthide
+ \spac_struts_set_hide
\else
- \dosetstrutvide
- \fi
- \struttotal\dimexpr\strutht+\strutdp\relax}
+ \spac_struts_set_vide
+ \fi}
-\def\dosetstruthide
- {\setbox\strutbox\normalhbox
+\def\spac_struts_set_hide
+ {\setbox\strutbox\hbox
{\vrule
\!!width \zeropoint
\!!height\strutht
\!!depth \strutdp}}
-\def\dosetstrutvide
- {\setbox\strutbox\normalhbox
- {\normalhbox to \zeropoint
+\def\spac_struts_set_vide
+ {\setbox\strutbox\hbox
+ {\hbox to \zeropoint
{% \hss % new, will be option
\vrule
\!!width \strutwidth
@@ -848,16 +899,19 @@
%D strut; occasionally a one scaled point difference can show
%D up with the lineheight.
-% experiment
+% This is more efficient (less callbacks):
-\newbox\emptystrutbox \setbox\emptystrutbox\emptyhbox
+\newbox\b_spac_struts_empty \setbox\b_spac_struts_empty\emptyhbox
-\def\dosetstruthide
- {\setbox\strutbox\copy\emptystrutbox
+\def\spac_struts_set_hide
+ {\setbox\strutbox\copy\b_spac_struts_empty
\ht\strutbox\strutht
\dp\strutbox\strutdp}
-\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut}
+\unexpanded\def\strut % still callbacks for \hbox{\strut}
+ {\relax
+ \dontleavehmode
+ \copy\strutbox}
\let\normalstrut\strut
@@ -871,36 +925,38 @@
%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR
%D \stoptabulate
-\setvalue{@strut@\v!yes }{\setstrut}
-\setvalue{@strut@\v!auto }{\setautostrut}
-\setvalue{@strut@\v!no }{\setnostrut}
-\setvalue{@strut@\v!cap }{\setcapstrut}
-\setvalue{@strut@\v!fit }{\setfontstrut}
-\setvalue{@strut@\v!line }{\setstrut}
-\setvalue{@strut@\s!default}{\setstrut}
-\setvalue{@strut@\s!empty }{\setstrut}
+%D Beware: using an unknown value results in char struts.
+
+\installcorenamespace{struts}
\unexpanded\def\setupstrut
- {\dosingleempty\dosetupstrut}
+ {\dosingleempty\spac_struts_setup}
-\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut
- {\ifcsname @strut@#1\endcsname
- \csname @strut@#1\endcsname
+\def\spac_struts_setup[#1]%
+ {\ifcsname\??struts#1\endcsname
+ \csname\??struts#1\endcsname % these are defined later
\else
\setcharstrut{#1}%
\fi}
-\def\showstruts
+\def\synchronizestrut#1% no [] parsing, faster for internal
+ {\ifcsname\??struts#1\endcsname
+ \csname\??struts#1\endcsname
+ \else
+ \setcharstrut{#1}%
+ \fi}
+
+\unexpanded\def\showstruts
{\setteststrut
\settestcrlf}
-
-\def\setteststrut
+
+\unexpanded\def\setteststrut
{\def\strutwidth{.8pt}%
\setstrut}
\def\autostrutfactor{1.1}
-\def\setautostrut
+\unexpanded\def\setautostrut
{\begingroup
\setbox\scratchbox\copy\strutbox
\setstrut
@@ -912,52 +968,79 @@
\endgroup
\fi\fi}
+\newbox\nostrutbox \setbox\nostrutbox\emptyhbox
+
+\unexpanded\def\setnostrut
+ {\setbox\strutbox\copy\nostrutbox
+ \let\strut\empty
+ \let\endstrut\empty
+ \let\begstrut\empty
+ \let\crlfplaceholder\empty}
+
% when enabled, sigstruts will remove themselves if nothing
% goes inbetween
\newsignal\strutsignal \setfalse\sigstruts
-\def\begstrut
- {\relax\ifcase\strutht\else
- \ifconditional\sigstruts
- \noindent\horizontalstrut
- \normalpenalty\plustenthousand
- \normalhskip-\strutsignal
- \normalhskip\strutsignal
- \else
- \strut
- \normalpenalty\plustenthousand
- \normalhskip\zeropoint
- \fi
- \expandafter \ignorespaces
+\unexpanded\def\begstrut
+ {\relax\ifcase\strutht
+ % \ignorespaces % maybe
+ \else
+ \spac_struts_beg
\fi}
-\def\endstrut
- {\relax\ifhmode\ifcase\strutht\else
- \ifconditional\sigstruts
- \ifdim\lastskip=\strutsignal
- \unskip\unskip\unpenalty\setbox\scratchbox\lastbox
- \else
- \normalpenalty\plustenthousand
- \normalhskip\zeropoint
- \strut
- \fi
+\def\spac_struts_beg
+ {\ifconditional\sigstruts
+ \spac_struts_beg_signal
+ \else
+ \spac_struts_beg_normal
+ \fi
+ \ignorespaces}
+
+\def\spac_struts_beg_signal
+ {\noindent\horizontalstrut
+ \penalty\plustenthousand
+ \hskip-\strutsignal
+ \hskip\strutsignal}
+
+\def\spac_struts_beg_normal
+ {\strut
+ \penalty\plustenthousand
+ \hskip\zeropoint}
+
+\unexpanded\def\endstrut
+ {\relax\ifhmode
+ \ifcase\strutht
+ % \removeunwantedspaces % maybe
\else
- \removeunwantedspaces
- \normalpenalty\plustenthousand
- \normalhskip\zeropoint
- \strut
+ \spac_struts_end
\fi
- \fi\fi}
+ \fi}
-\newbox\nostrutbox \setbox\nostrutbox\emptyhbox
+\def\spac_struts_end
+ {\ifconditional\sigstruts
+ \spac_struts_end_signal
+ \else
+ \spac_struts_end_normal
+ \fi}
-\def\setnostrut
- {\setbox\strutbox\copy\nostrutbox
- \let\strut\empty
- \let\endstrut\empty
- \let\begstrut\empty
- \let\crlfplaceholder\empty}
+\def\spac_struts_end_signal
+ {\ifdim\lastskip=\strutsignal
+ \unskip
+ \unskip
+ \unpenalty
+ \setbox\scratchbox\lastbox
+ \else
+ \penalty\plustenthousand
+ \hskip\zeropoint
+ \strut
+ \fi}
+
+\def\spac_struts_end_normal
+ {\removeunwantedspaces
+ \penalty\plustenthousand
+ \hskip\zeropoint
+ \strut}
% unsave:
%
@@ -975,22 +1058,31 @@
%
% so:
-\def\pseudostrut
+\unexpanded\def\pseudostrut
{\noindent} % better: \dontleavehmode
\let\pseudobegstrut\pseudostrut
-
\let\pseudoendstrut\removeunwantedspaces
-\def\resetteststrut
+\unexpanded\def\resetteststrut
{\def\strutwidth{\zeropoint}% no let
\setstrut}
-\ifdefined\setfontparameters\else
- % problems ! ! ! !
- \def\setfontparameters{\the\everybodyfont}
+\ifdefined\setfontparameters \else
+ \def\setfontparameters{\the\everybodyfont}
\fi
+%D Keyword based strutting:
+
+\letvalue{\??struts\v!yes }\setstrut % \setvalue{\??struts\v!yes }{\setstrut}
+\letvalue{\??struts\v!auto }\setautostrut % \setvalue{\??struts\v!auto }{\setautostrut}
+\letvalue{\??struts\v!no }\setnostrut % \setvalue{\??struts\v!no }{\setnostrut}
+\letvalue{\??struts\v!cap }\setcapstrut % \setvalue{\??struts\v!cap }{\setcapstrut}
+\letvalue{\??struts\v!fit }\setfontstrut % \setvalue{\??struts\v!fit }{\setfontstrut}
+\letvalue{\??struts\v!line }\setstrut % \setvalue{\??struts\v!line }{\setstrut}
+\letvalue{\??struts\s!default}\setstrut % \setvalue{\??struts\s!default}{\setstrut}
+\letvalue{\??struts\empty }\setstrut % \setvalue{\??struts\empty }{\setstrut}
+
%D Handy:
\def\baselinedistance{\the\lineheight}
@@ -1000,64 +1092,56 @@
%D why|>| this assignment gives troubles in for instance the
%D visual debugger.
-\def\offinterlineskip
+\unexpanded\def\offinterlineskip
{\baselineskip-\thousandpoint
\lineskip\zeropoint
\lineskiplimit\maxdimen
% We also need this here now; thanks to taco for figuring that out!
\def\minimumlinedistance{\zeropoint}}
-\def\nointerlineskip
+\unexpanded\def\nointerlineskip
{\prevdepth-\thousandpoint}
-\let\normaloffinterlineskip=\offinterlineskip % knuth's original
+\let\normaloffinterlineskip\offinterlineskip % knuth's original
%D My own one:
-\def\dopushinterlineskip
+\unexpanded\def\spac_helpers_push_interlineskip_yes
{\edef\oninterlineskip
{\baselineskip\the\baselineskip
\lineskip\the\lineskip
\lineskiplimit\the\lineskiplimit
\noexpand\edef\noexpand\minimumlinedistance{\the\dimexpr\minimumlinedistance}%
- \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}}
+ \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}} % \noexpand not needed
-\def\nopushinterlineskip
+\unexpanded\def\spac_helpers_push_interlineskip_nop
{\let\oninterlineskip\setnormalbaselines}
-\def\offinterlineskip
+\unexpanded\def\offinterlineskip
{\ifdim\baselineskip>\zeropoint
- \dopushinterlineskip
+ \spac_helpers_push_interlineskip_yes
\else
- \nopushinterlineskip
+ \spac_helpers_push_interlineskip_nop
\fi
\normaloffinterlineskip}
-\let\oninterlineskip=\relax
-
-\def\leaveoutervmode
+\let\oninterlineskip\relax
+
+\unexpanded\def\leaveoutervmode
{\ifvmode\ifinner\else
\leavevmode
\fi\fi}
-% We stellen enkele penalties anders in dan Plain TEX:
-%
-% \widowpenalty=\defaultwidowpenalty\relax
-% \clubpenalty =\defaultclubpenalty \relax
-
-\def\resetpenalties#1%
+\unexpanded\def\resetpenalties#1%
{\ifdefined#1%
#1\minusone
\fi}
-\def\setpenalties#1#2#3%
+\unexpanded\def\setpenalties#1#2#3%
{\ifdefined#1% space before #3 prevents lookahead problems, needed when #3=text
#1\numexpr#2+\plusone\relax\space\doexpandedrecurse{\the\numexpr#2\relax}{ #3}\zerocount\relax
\fi}
-\def\doexpandedrecurse#1#2%
- {\ifnum#1>\zerocount#2\@EA\doexpandedrecurse\@EA{\the\numexpr#1-1\relax}{#2}\fi}
-
%D \macros
%D {keeplinestogether}
%D
@@ -1066,19 +1150,19 @@
% just before margintexts ... will eventually be done differently in mkiv using
% attributes
-\newcount\nofkeeplinestogether
+\newcount\c_spac_keep_lines_together
\let\restoreinterlinepenalty\relax
-\def\dorestoreinterlinepenalty
+\unexpanded\def\spac_penalties_restore
{\global\let\restoreinterlinepenalty\relax
\global\resetpenalties\interlinepenalties
- \global\nofkeeplinestogether\zerocount}
+ \global\c_spac_keep_lines_together\zerocount}
-\def\keeplinestogether#1%
- {\ifnum#1>\nofkeeplinestogether
- \global\nofkeeplinestogether#1%
- \global\setpenalties\interlinepenalties\nofkeeplinestogether\plustenthousand
- \global\let\restoreinterlinepenalty\dorestoreinterlinepenalty
+\unexpanded\def\keeplinestogether#1%
+ {\ifnum#1>\c_spac_keep_lines_together
+ \global\c_spac_keep_lines_together#1%
+ \global\setpenalties\interlinepenalties\c_spac_keep_lines_together\plustenthousand
+ \global\let\restoreinterlinepenalty\spac_penalties_restore
\fi}
\newif\ifgridsnapping % to be sure
@@ -1093,7 +1177,7 @@
\def\defaultgriddisplaywidowpenalty {0}
\def\defaultgridbrokenpenalty {0}
-\def\nopenalties
+\unexpanded\def\nopenalties
{\widowpenalty \zerocount
\clubpenalty \zerocount
\brokenpenalty \zerocount
@@ -1101,36 +1185,36 @@
\finalhyphendemerits \zerocount
\adjdemerits \zerocount}
-\def\setdefaultpenalties
+\unexpanded\def\setdefaultpenalties
{\directsetup{\systemsetupsprefix\s!default}}
\startsetups [\systemsetupsprefix\s!reset]
- \resetpenalties\widowpenalties
- \resetpenalties\clubpenalties
- \resetpenalties\interlinepenalties
+ \resetpenalties\widowpenalties
+ \resetpenalties\clubpenalties
+ \resetpenalties\interlinepenalties
\stopsetups
% we use \directsetup because it's faster and we know there is no csl
\startsetups [\systemsetupsprefix\s!default]
- \directsetup{\systemsetupsprefix\s!reset}
+ \directsetup{\systemsetupsprefix\s!reset}
- \widowpenalty \defaultwidowpenalty
- \clubpenalty \defaultclubpenalty
- \displaywidowpenalty\defaultdisplaywidowpenalty
- \brokenpenalty \defaultbrokenpenalty
+ \widowpenalty \defaultwidowpenalty
+ \clubpenalty \defaultclubpenalty
+ \displaywidowpenalty\defaultdisplaywidowpenalty
+ \brokenpenalty \defaultbrokenpenalty
\stopsetups
\startsetups [\v!grid] [\systemsetupsprefix\s!default]
- \directsetup{\systemsetupsprefix\s!reset}
+ \directsetup{\systemsetupsprefix\s!reset}
- \widowpenalty \defaultgridwidowpenalty
- \clubpenalty \defaultgridclubpenalty
- \displaywidowpenalty\defaultgriddisplaywidowpenalty
- \brokenpenalty \defaultgridbrokenpenalty
+ \widowpenalty \defaultgridwidowpenalty
+ \clubpenalty \defaultgridclubpenalty
+ \displaywidowpenalty\defaultgriddisplaywidowpenalty
+ \brokenpenalty \defaultgridbrokenpenalty
\stopsetups
@@ -1138,11 +1222,11 @@
\startsetups [\systemsetupsprefix\v!strict]
- \directsetup{\systemsetupsprefix\s!reset}
+ \directsetup{\systemsetupsprefix\s!reset}
- \setpenalties\widowpenalties2\maxdimen
- \setpenalties\clubpenalties 2\maxdimen
- \brokenpenalty \maxdimen
+ \setpenalties\widowpenalties\plustwo\maxdimen
+ \setpenalties\clubpenalties \plustwo\maxdimen
+ \brokenpenalty \maxdimen
\stopsetups
@@ -1150,59 +1234,10 @@
%D To be checked:
-\ifx\savedstrutbox\undefined \newbox\savedstrutbox \fi
-
-\def\savestrut {\setbox\savedstrutbox\copy\strutbox}
-\def\savedstrut{\copy \savedstrutbox}
-
-%D Page spacing
-
-\newconstant\bottomraggednessmode % 0=ragged 1=normal/align 2=baseline
-
-\def\bottomalignlimit{3\lineheight}
-
-\newif\ifn@rmalbottom
-\newif\ifr@ggedbottom
-\newif\ifb@selinebottom
-
-\def\normalbottom
- {% \topskip 10pt
- \r@ggedbottomfalse}
-
-\def\raggedbottom
- {\bottomraggednessmode\zerocount
- \n@rmalbottomfalse
- \r@ggedbottomtrue
- \b@selinebottomfalse
- \settopskip}
+\newbox\b_spac_struts_saved
-\def\alignbottom
- {\bottomraggednessmode\plusone
- \n@rmalbottomtrue
- \r@ggedbottomfalse
- \b@selinebottomfalse
- \settopskip}
-
-\def\baselinebottom
- {\bottomraggednessmode\plustwo
- \n@rmalbottomfalse
- \r@ggedbottomfalse
- \b@selinebottomtrue
- \settopskip}
-
-\let\normalbottom=\alignbottom % downward compatible
-
-% so, the new one will be
-%
-% \bottomraggednessmode=0 % 0=ragged 1=normal/align 2=baseline
-%
-% \def\bottomalignlimit{3\lineheight} % will be settable
-%
-% \def\raggedbottom {\bottomraggednessmode\zerocount\settopskip}
-% \def\alignbottom {\bottomraggednessmode\plusone \settopskip}
-% \def\baselinebottom{\bottomraggednessmode\plustwo \settopskip}
-%
-% \let\normalbottom =\alignbottom
+\unexpanded\def\savestrut {\setbox\b_spac_struts_saved\copy\strutbox}
+\unexpanded\def\savedstrut{\copy \b_spac_struts_saved}
%D Good old blank redone:
@@ -1217,6 +1252,9 @@
% TODO: NAMED SNAPPERS
+\installcorenamespace{gridsnappers}
+\installcorenamespace{gridsnapperattributes}
+
\newskip \bodyfontlineheight
\newdimen \bodyfontstrutheight
\newdimen \bodyfontstrutdepth
@@ -1228,40 +1266,40 @@
\def\snappedvboxattribute{\ifgridsnapping attr \snapvboxattribute \attribute\snapmethodattribute\fi}
\def\setlocalgridsnapping{\ifgridsnapping \attribute \snapvboxattribute \attribute\snapmethodattribute\fi}
-\def\dosetlocalgridsnapping#1%
+\def\spac_grids_set_local_snapping#1%
{\ifgridsnapping
\doifsomething{#1}%
- {\autosetsnapvalue{#1}%
+ {\spac_grids_snap_value_set{#1}%
\attribute \snapvboxattribute \attribute\snapmethodattribute}%
\fi}
-\def\installsnapvalues#1#2% todo: a proper define
+\unexpanded\def\installsnapvalues#1#2% todo: a proper define
{\edef\currentsnapper{#1:#2}%
- \ifcsname\currentsnapper\endcsname \else
- \setevalue\currentsnapper{\ctxlua{builders.vspacing.definesnapmethod("#1","#2")}}%
+ \ifcsname\??gridsnapperattributes\currentsnapper\endcsname \else
+ \setevalue{\??gridsnapperattributes\currentsnapper}{\ctxlua{builders.vspacing.definesnapmethod("#1","#2")}}%
\fi
- \setevalue{\??gr:#1}{\attribute\snapmethodattribute\csname\currentsnapper\endcsname\space}}
+ \setevalue{\??gridsnappers#1}{\attribute\snapmethodattribute\csname\??gridsnapperattributes\currentsnapper\endcsname\space}}
\unexpanded\def\definegridsnapping
- {\dodoubleargument\dodefinegridsnapping}
+ {\dodoubleargument\spac_grids_define}
-\def\dodefinegridsnapping[#1][#2]%
+\def\spac_grids_define[#1][#2]%
{\installsnapvalues{#1}{#2}}
-\edef\resetsnapvalue
+\edef\spac_grids_snap_value_reset
{%\gridsnappingfalse
\attribute\snapmethodattribute\attributeunsetvalue}
-\def\setsnapvalue#1%
+\def\spac_grids_snap_value_set#1%
{%\gridsnappingtrue
- \ifcsname\??gr:#1\endcsname\csname\??gr:#1\endcsname\fi}
+ \ifcsname\??gridsnappers#1\endcsname\csname\??gridsnappers#1\endcsname\fi}
-\def\autosetsnapvalue#1%
- {\ifcsname\??gr:#1\endcsname
- \csname\??gr:#1\endcsname
+\def\spac_grids_snap_value_auto#1%
+ {\ifcsname\??gridsnappers#1\endcsname
+ \csname\??gridsnappers#1\endcsname
\else
\installsnapvalues\s!dummy{#1}%
- \csname\??gr:\s!dummy\endcsname
+ \csname\??gridsnappers\s!dummy\endcsname
\fi}
% \installsnapvalues{loose} {\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut}
@@ -1279,7 +1317,9 @@
% minheight round height down
% maxheight round height up
% local use local interline space
-% shift:-3tp vertical shift within box
+% offset:-3tp vertical shift within box
+% bottom:lines
+% top:lines
%D We're not downward compatible with \MKII !
@@ -1300,23 +1340,23 @@
\definegridsnapping[\v!first] [\v!first]
\definegridsnapping[\v!last] [\v!last]
\definegridsnapping[\v!high] [\v!minheight,\v!maxdepth,\v!none]
+\definegridsnapping[\v!one] [\v!minheight,\v!mindepth]
\definegridsnapping[\v!low] [\v!maxheight,\v!mindepth,\v!none]
+\definegridsnapping[\v!none] [\v!none]
\definegridsnapping[\v!line] [\v!line]
\definegridsnapping[\v!strut] [\v!strut]
\definegridsnapping[\v!max] [\v!maxdepth,\v!maxheight,\v!strut]
\definegridsnapping[\v!min] [\v!mindepth,\v!minheight,\v!strut]
-\newtoks\everysetupgridsnapping % this only happens at the setuplayout level
+\definegridsnapping[\v!middle] [\v!maxheight,\v!maxdepth] % used in placement
-\def\dosetupgridsnapping{\the\everysetupgridsnapping} % not used !
-
-\def\synchronizelocallinespecs
+\unexpanded\def\synchronizelocallinespecs
{\bodyfontlineheight \normallineheight
\bodyfontstrutheight\strutheight
\bodyfontstrutdepth \strutdepth}
-\def\synchronizegloballinespecs
+\unexpanded\def\synchronizegloballinespecs
{\global\globalbodyfontlineheight \normallineheight
\global\globalbodyfontstrutheight\strutheight
\global\globalbodyfontstrutdepth \strutdepth}
@@ -1330,65 +1370,84 @@
\synchronizelocallinespecs
\to \everysetuplocalinterlinespace
+%D We still have to synchronize these:
+
+\unexpanded\def\synchronizeskipamounts
+ {\bigskipamount
+ \skipfactor\baselineskip
+ plus\skipgluefactor\baselineskip
+ minus\skipgluefactor\baselineskip
+ \relax
+ \medskipamount \bigskipamount \divide\medskipamount \plustwo
+ \smallskipamount\bigskipamount \divide\smallskipamount\plusfour}
+
+\appendtoks
+ \synchronizeskipamounts
+\to \everysetupglobalinterlinespace
+
+\appendtoks
+ \synchronizeskipamounts
+\to \everysetuplocalinterlinespace
+
%D Snapping.
\newif\ifgridsnapping
\let\showgridsnapping\relax
-\def\snaptogrid {\dosingleempty\dosnaptogrid}
-\def\moveongrid {\dosingleempty\domoveongrid}
-\unexpanded\def\placeongrid{\dosingleempty\doplaceongrid}
+%unexpanded\def\moveongrid {\dosingleempty\spac_grids_move_on}
+\unexpanded\def\snaptogrid {\dosingleempty\spac_grids_snap_to}
+\unexpanded\def\placeongrid{\dosingleempty\spac_grids_place_on}
-\def\dodomoveongrid[#1]%
- {} % gone, unless we set an attribute
+% \def\spac_grids_move_on[#1]%
+% {[obsolete]} % gone, unless we set an attribute
-\def\doplaceongrid[#1]%
+\def\spac_grids_place_on[#1]%
{\snaptogrid[#1]\vbox} % mark as done
-\def\dosnaptogrid[#1]% list or predefined
+\def\spac_grids_snap_to[#1]% list or predefined
{\ifgridsnapping
- \expandafter\dodosnaptogrid
+ \expandafter\spac_grids_snap_to_indeed
\else
\expandafter\gobbleoneargument
\fi{#1}}
-\def\dodosnaptogrid#1%
+\def\spac_grids_snap_to_indeed#1%
{\bgroup
- \resetsnapvalue
- \dowithnextbox{\dododosnaptogrid{#1}}}
+ \spac_grids_snap_value_reset
+ \dowithnextbox{\spac_grids_snap_to_finish{#1}}}
% eventually there will always be a line snap
-\def\dododosnaptogrid#1%
+\def\spac_grids_snap_to_finish#1%
{\ifvbox\nextbox % this will go away
- \ctxlua{builders.vspacing.collapsevbox(\number\nextbox)}% isn't that already done?
+ \ctxcommand{vspacingcollapse(\number\nextbox)}% isn't that already done?
\fi
- \doifelsenothing{#1}{\setsnapvalue\v!normal}{\autosetsnapvalue{#1}}%
- \ctxlua{builders.vspacing.snapbox(\number\nextbox,\number\attribute\snapmethodattribute)}%
+ \doifelsenothing{#1}{\spac_grids_snap_value_set\v!normal}{\spac_grids_snap_value_set{#1}}%
+ \ctxcommand{vspacingsnap(\number\nextbox,\number\attribute\snapmethodattribute)}%
\ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}%
\egroup}
-\def\docheckgridsnappingnop
+\def\spac_grids_check_nop
{\gridsnappingfalse
\resetsystemmode\v!grid
- \resetsnapvalue}
+ \spac_grids_snap_value_reset}
-\def\docheckgridsnappingyes
+\def\spac_grids_check_yes
{\gridsnappingtrue
\setsystemmode\v!grid
- \autosetsnapvalue\askedgridmode}
+ \spac_grids_snap_value_set\askedgridmode}
-\def\docheckgridsnapping
+\unexpanded\def\synchronizegridsnapping
{\edef\askedgridmode{\layoutparameter\c!grid}%
\ifx\askedgridmode\v!no % official
- \docheckgridsnappingnop
+ \spac_grids_check_nop
\else\ifx\askedgridmode\v!off % for taco and luigi
- \docheckgridsnappingnop
+ \spac_grids_check_nop
\else\ifx\askedgridmode\empty % to be sure
- \docheckgridsnappingnop
+ \spac_grids_check_nop
\else
- \docheckgridsnappingyes
+ \spac_grids_check_yes
\fi\fi\fi}
%D Visualization:
@@ -1400,11 +1459,11 @@
three=blue,
four=gray]
-\def\setgridtracebox#1[#2]% % maybe reverse the order
+\unexpanded\def\setgridtracebox#1[#2]% % maybe reverse the order
{\setbox\nextbox#1%
{\hbox
{\hbox to \zeropoint
- {\setlayoutcomponentattribute\v!grid\v!test
+ {\setlayoutcomponentattribute{\v!grid:\v!test}%
\color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}%
\hss}%
\flushnextbox}}}
@@ -1412,10 +1471,22 @@
\setnewconstant\gridboxlinenomode\plusone % 0:nothing 1:all 2:lines 3:frame 4:l/r
\setnewconstant\gridboxlinemode \plusone
-\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi}
+\unexpanded\def\gridboxvbox
+ {\ifcase\gridboxlinemode
+ \vbox
+ \or
+ \ruledvbox
+ \or
+ \vbox
+ \or
+ \ruledvbox
+ \else
+ \ruledvbox
+ \fi}
+
\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth}
-\def\setgridbox#1#2#3% maybe ifgridsnapping at outer level
+\unexpanded\def\setgridbox#1#2#3% maybe ifgridsnapping at outer level
{\setbox#1\gridboxvbox to #3 % given size
{\forgetall
\resetteststrut
@@ -1427,10 +1498,10 @@
\fi
\gridboxvbox % calculated size
{\getrawnoflines{#3}% \getnoflines{#3}%
- \scratchdimen#2\advance\scratchdimen \lineheight
+ \scratchdimen\dimexpr#2+\lineheight\relax
\dorecurse\noflines
{\strut
- \hskip-.5\lineheight
+ \hskip-.5\lineheight\relax
\ifcase\gridboxlinenomode\or
\rlap
{\hskip.2\bodyfontsize\hskip\scratchdimen
@@ -1452,22 +1523,22 @@
\def\fuzzysnappedbox#1#2% \box<n> \unvbox<n>
{#1#2}
-\def\moveboxontogrid#1#2#3% will become obsolete
+\def\moveboxontogrid#1#2#3% will become obsolete, but it needs checking
{}
%D Helper:
-\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap
- {\doifelse{#1}\v!line
- {#2\ifgridsnapping
+\unexpanded\def\spac_helpers_assign_skip#1#2% ook nog \v!halfline+fuzzysnap
+ {\doifelse{#2}\v!line
+ {#1\ifgridsnapping
\bodyfontlineheight
\else
\openlineheight
\fi}
{\ifgridsnapping
- \assigndimension{#1}{#2}{.25\bodyfontlineheight}{.5\bodyfontlineheight}\bodyfontlineheight
+ \assigndimension{#2}{#1}{.25\bodyfontlineheight}{.5\bodyfontlineheight}\bodyfontlineheight
\else
- \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount
+ \assigndimension{#2}{#1}\smallskipamount\medskipamount\bigskipamount
\fi}%
\relax}
@@ -1493,9 +1564,25 @@
% \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi}
% todo, in grid mode: builders.vspacing.fixed = false
+%
+% \ifgridsnapping will go
+
+\installcorenamespace{vspacingamount}
+
+\unexpanded\def\definevspacingamount
+ {\dotripleempty\spac_vspacing_define_amount}
+
+\def\spac_vspacing_define_amount[#1][#2][#3]% can be combined
+ {\setvalue{\??vspacingamount#1}{\ifgridsnapping#3\else#2\fi}%
+ \ctxcommand{vspacingsetamount("#1")}}
+
+\unexpanded\def\definevspacing
+ {\dodoubleempty\spac_vspacing_define}
+
+\def\spac_vspacing_define[#1][#2]%
+ {\ctxcommand{vspacingdefine("#1","#2")}}
-\let\saveouterspacing \relax % for old times sake
-\let\restoreouterspacing\relax % for old times sake
+%D The injector code (generated at the \LUA\ end):
\newtoks\everybeforeblankhandling
\newtoks\everyafterblankhandling
@@ -1503,28 +1590,10 @@
\newconditional\someblankdone
\appendtoks
- \blankskip\zeropoint
+ \s_spac_vspacing_temp\zeropoint
\attribute\skipcategoryattribute\plusone
\attribute\skippenaltyattribute \attributeunsetvalue
\attribute\skiporderattribute \attributeunsetvalue
- \ifgridsnapping % \ifblankflexible
- \setfalse\blankisfixed
- \else
- \settrue\blankisfixed
- \fi
-\to \everybeforeblankhandling
-
-\appendtoks
- \ifconditional\blankisfixed
- \blankskip1\blankskip
- \else
- \blankskip1\blankskip\!!plus\skipgluefactor\blankskip\!!minus\skipgluefactor\blankskip
- \fi
-\to \everyafterblankhandling
-
-% \ifgridsnapping will go
-
-\appendtoks
\ifgridsnapping
\settrue\blankisfixed
\else
@@ -1532,6 +1601,14 @@
\fi
\to \everybeforeblankhandling
+\appendtoks
+ \s_spac_vspacing_temp\plusone\s_spac_vspacing_temp
+ \ifconditional\blankisfixed \else
+ \!!plus \skipgluefactor\s_spac_vspacing_temp
+ \!!minus\skipgluefactor\s_spac_vspacing_temp
+ \fi
+\to \everyafterblankhandling
+
\def\setblankcategory#1%
{\settrue\someblankdone
\attribute\skipcategoryattribute#1\relax}
@@ -1547,9 +1624,9 @@
\def\addblankskip#1#2#3%
{\settrue\someblankdone
- \advance\blankskip#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax}
+ \advance\s_spac_vspacing_temp#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax}
-\def\setblankpenalty #1%
+\def\setblankpenalty#1%
{\flushblankhandling
\settrue\someblankdone
\attribute\skipcategoryattribute \plusthree
@@ -1575,101 +1652,116 @@
\unexpanded\def\stopblankhandling
{\the\everyafterblankhandling
\ifconditional\someblankdone
- \vskip\blankskip
+ \vskip\s_spac_vspacing_temp
\fi
\endgroup}
\def\flushblankhandling
{\the\everyafterblankhandling
\ifconditional\someblankdone
- \vskip\blankskip
+ \vskip\s_spac_vspacing_temp
\fi
\setfalse\someblankdone
\the\everybeforeblankhandling}
-% % % % we can move much to lua once we can expand there % % % %
-
-\unexpanded\def\definevspacingamount
- {\dotripleempty\dodefinevspacingamount}
-
-\def\dodefinevspacingamount[#1][#2][#3]% can be combined
- {\setvalue{\??vs:#1}{\ifgridsnapping#3\else#2\fi}%
- \ctxlua{builders.vspacing.setskip("#1")}}
-
\def\addpredefinedblankskip#1#2%
{\settrue\someblankdone
- \advance\blankskip#1\dimexpr\csname\??vs:#2\endcsname\relax}
+ \advance\s_spac_vspacing_temp#1\dimexpr\csname\??vspacingamount#2\endcsname\relax}
\def\addaskedblankskip#1#2%
{\settrue\someblankdone
- \advance\blankskip#1\dimexpr#2\relax}
+ \advance\s_spac_vspacing_temp#1\dimexpr#2\relax}
-\unexpanded\def\definevspacing
- {\dodoubleempty\dodefinevspacing}
-
-\def\dodefinevspacing[#1][#2]%
- {\ctxlua{builders.vspacing.setmap("#1","#2")}}
+% The main spacer:
\unexpanded\def\vspacing
- {\dosingleempty\dovspacing}
+ {\doifnextoptionalelse\spac_vspacing_yes\spac_vspacing_nop}
-% todo: when packed blocks blank, we need to enable forced
+\def\spac_vspacing_yes
+ {\ifinpagebody % somewhat weird
+ \singleexpandafter\spac_vspacing_yes_indeed
+ \else\ifconditional\c_spac_packed_blank
+ \doubleexpandafter\spac_vspacing_yes_indeed
+ \else
+ \doubleexpandafter\spac_vspacing_yes_ignore
+ \fi\fi}
-\def\dovspacing % blank also has a \flushnotes
- {\ifinpagebody
- \expandafter\dovspacingyes
- \else\ifconditional\noblankinpacked % todo: better reset this conditional in pagebody
- \expandafter\expandafter\expandafter\dovspacingnop
+\def\spac_vspacing_nop
+ {\ifinpagebody % somewhat weird
+ \singleexpandafter\spac_vspacing_nop_indeed
+ \else\ifconditional\c_spac_packed_blank
+ \doubleexpandafter\spac_vspacing_nop_indeed
\else
- \expandafter\expandafter\expandafter\dovspacingyes
+ \doubleexpandafter\spac_vspacing_nop_ignore
\fi\fi}
-\def\dovspacingyes[#1]%
- %{\ifmmode\else\ctxlua{builders.vspacing.analyze("\iffirstargument#1\else\s!default\fi")}\fi}
- {\ifmmode\else\ctxlua{builders.vspacing.analyze("\iffirstargument#1\else\currentvspacing\fi")}\fi}
+\def\spac_vspacing_yes_indeed[#1]%
+ {\ifmmode\else\ctxcommand{vspacing("#1")}\fi}
-\def\dovspacingnop[#1]%
+\def\spac_vspacing_yes_ignore[#1]%
{\ifmmode\else\par\fi}
-% todo: check them and make them faster:
+\def\spac_vspacing_nop_indeed
+ {\ifmmode\else\ctxcommand{vspacing("\currentvspacing")}\fi}
-\definecomplexorsimple\setupvspacing
+\def\spac_vspacing_nop_ignore
+ {\ifmmode\else\par\fi}
-\let\currentvspacing\s!default
+% these depend on bigskipamount cum suis so we'd better sync them
-\def\complexsetupvspacing[#1]%
- {\edef\currentvspacing{#1}}
+\unexpanded\def\setupvspacing
+ {\doifnextoptionalelse\setupvspacing_yes\setupvspacing_nop}
-\def\simplesetupvspacing
- {\ifx\empty\currentvspacing\else
+\let\currentvspacing\s!default % hm, default, standard ...
+
+\def\setupvspacing_yes[#1]%
+ {\edef\currentvspacing{#1}%
+ \spac_whitespace_setup_nop % yes or no, was forgotten
+ }
+
+\def\setupvspacing_nop
+ {\ifx\empty\currentvspacing % mistakenly had an \else
\let\currentvspacing\s!default
\fi
- \simplesetupwhitespace}
+ \spac_whitespace_setup_nop}
-\def\restorestandardblank
+\unexpanded\def\restorestandardblank % or default ?
{\let\currentvspacing\v!standard}
+\let\synchronizevspacing\setupvspacing_nop
+
% used both
-\def\doinhibitblank{\vspacing[\v!disable]} % can be made faster (keep this command, used in styles)
-\def\inhibitblank {\vspacing[\v!disable]} % can be made faster
+\unexpanded\def\inhibitblank
+ {\vspacing[\v!disable]} % can be made faster
+
+\let\doinhibitblank\inhibitblank % keep this command, used in styles
\let\setupblank \setupvspacing
-\let\simplesetupblank\simplesetupvspacing
\let\blank \vspacing
+\let\synchronizeblank\synchronizevspacing
% category:4 is default
-\definevspacingamount[\v!none] [\zeropoint] [\zeropoint]
-\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight]
-\definevspacingamount[\v!medium] [\medskipamount] [0.50\bodyfontlineheight]
-\definevspacingamount[\v!small] [\smallskipamount] [0.25\bodyfontlineheight]
-\definevspacingamount[\v!line] [\openlineheight] [\bodyfontlineheight]
-\definevspacingamount[\v!halfline][0.50\openlineheight][0.50\bodyfontlineheight]
-\definevspacingamount[\v!formula] [\medskipamount] [0.50\bodyfontlineheight]
-\definevspacingamount[\v!white] [\parskip] [\bodyfontwhitespace]
-\definevspacingamount[\v!height] [\strutheight] [\bodyfontstrutheight]
-\definevspacingamount[\v!depth] [\strutdepth] [\bodyfontstrutdepth]
+% this interface might change (into an \install, buw we will then keep this one hidden)
+
+\definevspacingamount[\v!none] [\zeropoint] [\zeropoint]
+\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight]
+\definevspacingamount[\v!medium] [\medskipamount] [.5\bodyfontlineheight]
+\definevspacingamount[\v!small] [\smallskipamount] [.25\bodyfontlineheight]
+\definevspacingamount[\v!line] [\openlineheight] [\bodyfontlineheight]
+\definevspacingamount[\v!halfline] [.5\openlineheight] [.5\bodyfontlineheight]
+\definevspacingamount[\v!quarterline] [.25\openlineheight] [.25\bodyfontlineheight]
+\definevspacingamount[\v!formula] [\medskipamount] [.5\bodyfontlineheight]
+\definevspacingamount[\v!white] [\parskip] [\bodyfontwhitespace]
+\definevspacingamount[\v!height] [\strutheight] [\bodyfontstrutheight]
+\definevspacingamount[\v!depth] [\strutdepth] [\bodyfontstrutdepth]
+
+\definevspacingamount[-\v!line] [-\openlineheight] [-\bodyfontlineheight]
+\definevspacingamount[-\v!halfline] [-.5\openlineheight] [-.5\bodyfontlineheight]
+\definevspacingamount[-\v!quarterline][-.25\openlineheight][-.25\bodyfontlineheight]
+
+\definevspacingamount[\v!standard] [.75\openlineheight] [.75\openlineheight] % mkii compatible
\def\bodyfontwhitespace
{\dimexpr
@@ -1696,7 +1788,11 @@
\definevspacing[\s!default] [\v!white] % was big for a while
\dorecurse{10} % todo: other values < 4000
- {\expanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr4000+250*\recurselevel\relax]}}
+ {\normalexpanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr4000+250*\recurselevel\relax]}}
+
+%D Maybe at some point we will differ between \type {\vspacing} and
+%D \type {\blank} (we needed the first one while playing with the
+%D new code).
\let\blank \vspacing
\let\defineblank \definevspacing
@@ -1706,163 +1802,52 @@
%D care as it does {\em not} work in tandem with the other spacing
%D commands.
+\installcorenamespace{vspace}
+
\unexpanded\def\definevspace
- {\dotripleempty\dodefinevspace}
+ {\dotripleempty\spac_vspace_define}
-\def\dodefinevspace[#1][#2][#3]%
+\def\spac_vspace_define[#1][#2][#3]%
{\ifthirdargument
- \setvalue{\??va#1:#2}{#3}%
+ \setvalue{\??vspace#1:#2}{#3}%
\else
- \setvalue{\??va:#1}{#2}%
+ \setvalue{\??vspace:#1}{#2}%
\fi}
-\unexpanded\def\vspace
- {\dodoubleempty\dovspace}
+\letvalue{\??vspace:\s!unknown}\zeropoint
-\def\dovspace[#1][#2]%
- {\ifsecondargument
- \dodovspace[#1][#2]%
- \else\iffirstargument
- \vspace[][#1]%
- \else
- \vspace[][\s!default]%
- \fi\fi}
+\unexpanded\def\vspace
+ {\dodoubleempty\spac_vspace_inject}
-\def\dodovspace[#1][#2]%
+\def\spac_vspace_inject[#1][#2]%
{\par
\ifvmode
\removelastskip
- \vskip\vspaceamount{#1}{#2}\relax
+ \vskip
+ \csname\??vspace
+ \ifsecondargument
+ \ifcsname\??vspace#1:#2\endcsname
+ #1:#2%
+ \else\ifcsname\??vspace:#2\endcsname
+ :#2%
+ \else
+ :\s!unknown
+ \fi\fi
+ \else\iffirstargument
+ \ifcsname\??vspace:#1\endcsname
+ :#1%
+ \else
+ :\s!unknown
+ \fi
+ \else
+ \ifcsname\??vspace:\s!default\endcsname
+ :\s!default
+ \else
+ :\s!unknown
+ \fi
+ \fi\fi
+ \endcsname
+ \relax
\fi}
-\def\vspaceamount#1#2%
- {\executeifdefined{\??va#1:#2}{\executeifdefined{\??va:#2}\zeropoint}}
-
-%D When spacing is active we need to handle commands in
-%D a special way:
-%D
-%D \starttyping
-%D \setuplines[space=on]
-%D
-%D \startlines
-%D Let's talk about this{\ttsl\gobbleoneargument or}that.
-%D \stoplines
-%D
-%D \startlines
-%D Let's talk about this{\getvalue{ttsl}or}that.
-%D \stoplines
-%D \stoptyping
-%D
-%D One can indent in several ways:
-%D
-%D \starttyping
-%D \setupindenting[medium] \setuplines[indenting=odd] % no yes odd even
-%D
-%D \startlines
-%D first
-%D second
-%D third
-%D fourth
-%D \stoplines
-%D \stoptyping
-
-%D Contrary to \MKII\ we can now define classes of lines (generalized by
-%D Wolfgang). I will probably rewrite bits in \LUA.
-
-\let\currentlines\empty
-
-\def\linesparameter #1{\csname\dolinesparameter{\??rg\currentlines}#1\endcsname}
-\def\linesparameterhash#1{\dolinesparameterhash {\??rg\currentlines}#1}
-
-\def\dolinesparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dolinesparentparameter \csname#1\s!parent\endcsname#2\fi}
-\def\dolinesparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dolinesparentparameterhash\csname#1\s!parent\endcsname#2\fi}
-
-\def\dolinesparentparameter #1#2{\ifx#1\relax\s!empty\else\dolinesparameter #1#2\fi}
-\def\dolinesparentparameterhash#1#2{\ifx#1\relax \else\dolinesparameterhash#1#2\fi}
-
-\def\dosetlinesattributes#1#2% style color
- {\edef\fontattributehash {\linesparameterhash#1}%
- \edef\colorattributehash{\linesparameterhash#2}%
- \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
- \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
-
-\getparameters
- [\??rg]
- [\c!option=,
- \c!command=,
- \c!before=\blank,
- \c!after=\blank,
- \c!inbetween=\blank,
- \c!indenting=\v!no,
- \c!space=\v!default]
-
-\unexpanded\def\definelines
- {\dodoubleempty\dodefinelines}
-
-\def\dodefinelines[#1][#2]%
- {\getparameters[\??rg#1][\s!parent=\??rg,#2]%
- \setvalue{\e!start#1}{\dostartlines[#1]}%
- \setvalue{\e!stop #1}{\dostoplines}}
-
-\unexpanded\def\setuplines
- {\dodoubleempty\dosetuplines}
-
-\def\dosetuplines[#1][#2]%
- {\doifelsenothing{#2}
- {\getparameters[\??rg][#1]}
- {\def\docommand##1{\getparameters[\??rg##1][#2]}%
- \processcommacommand[#1]\docommand}}
-
-\def\dostartlines[#1]%
- {\bgroup
- \edef\currentlines{#1}%
- \obeylines
- \dosingleempty\dodostartlines}
-
-\def\dodostartlines[#1]% new: optional second argument (WS)
- {\iffirstargument
- \getparameters[\??rg\currentlines][#1]%
- \fi
- \edef\linesoption{\linesparameter\c!option}%
- \linesparameter\c!before
- \pushmacro\checkindentation
- \whitespace
- \begingroup
- \dosetlinesattributes\c!style\c!color
- \setupindenting[\linesparameter\c!indenting]%
- \setupalign[\linesparameter\c!align]%
- \typesettinglinestrue
- \setupwhitespace[\v!none]%
- %\obeylines % move upwards to keep spaces in the first line due to optional argument
- \ignorespaces
- \gdef\afterfirstobeyedline % tzt two pass, net als opsomming
- {\linesparameter\c!command
- \gdef\afterfirstobeyedline
- {\ifx\linesoption\v!packed\nobreak\fi
- \linesparameter\c!command}}%
- \def\obeyedline
- {\par
- \futurelet\next\dobetweenthelines}%
- \activatespacehandler{\linesparameter\c!space}%
- \GotoPar}
-
-\def\dostoplines
- {\endgroup
- \popmacro\checkindentation
- \linesparameter\c!after
- \egroup}
-
-\def\dobetweenthelines
- {\doifmeaningelse\next\obeyedline
- {\linesparameter\c!inbetween}
- {\afterfirstobeyedline}}
-
-\definelines[\v!lines]
-
-\def\emptylines
- {\dosingleempty\doemptylines}
-
-\def\doemptylines[#1]%
- {\endgraf\dorecurse{\iffirstargument#1\else3\fi}\crlf}
-
\protect \endinput