From 15995e10bfc68edf79970c4ea4fbb6678566c46e Mon Sep 17 00:00:00 2001 From: Mojca Miklavec Date: Mon, 14 May 2012 17:38:55 +0000 Subject: ConTeXt 2012.05.14 16:00 git-svn-id: svn://tug.org/texlive/trunk@26371 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/context/base/spac-ver.mkiv | 1585 +++++++++++----------- 1 file changed, 785 insertions(+), 800 deletions(-) (limited to 'Master/texmf-dist/tex/context/base/spac-ver.mkiv') 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 \unvbox {#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 -- cgit v1.2.3