From 0c00e8e4486fe1cc526eee6df2e4b9b3ab0ba519 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Wed, 16 Sep 2009 20:07:00 +0200 Subject: beta 2009.09.16 20:07 --- tex/context/base/anch-pgr.mkiv | 12 + tex/context/base/cont-new.tex | 2 +- tex/context/base/context.mkii | 5 +- tex/context/base/context.mkiv | 10 +- tex/context/base/context.tex | 2 +- tex/context/base/core-grd.mkii | 1074 ------ tex/context/base/core-grd.mkiv | 1074 ------ tex/context/base/core-spa.lua | 720 ----- tex/context/base/core-spa.mkii | 4656 --------------------------- tex/context/base/core-spa.mkiv | 4250 ------------------------ tex/context/base/font-syn.lua | 40 +- tex/context/base/math-for.mkiv | 1 + tex/context/base/meta-ini.mkiv | 2 +- tex/context/base/mult-sys.tex | 1 + tex/context/base/pack-rul.mkiv | 6 +- tex/context/base/page-txt.mkiv | 2 +- tex/context/base/s-mod-01.tex | 17 +- tex/context/base/spac-ali.mkiv | 653 ++++ tex/context/base/spac-def.mkiv | 119 + tex/context/base/spac-fnt.mkiv | 91 + tex/context/base/spac-gen.mkii | 4656 +++++++++++++++++++++++++++ tex/context/base/spac-grd.lua | 41 + tex/context/base/spac-grd.mkii | 1074 ++++++ tex/context/base/spac-grd.mkiv | 1095 +++++++ tex/context/base/spac-hor.mkiv | 821 +++++ tex/context/base/spac-pag.mkiv | 201 ++ tex/context/base/spac-par.mkiv | 206 ++ tex/context/base/spac-ver.lua | 732 +++++ tex/context/base/spac-ver.mkiv | 1485 +++++++++ tex/context/base/strc-flt.mkiv | 22 +- tex/context/base/strc-itm.mkiv | 65 +- tex/context/base/strc-mat.mkiv | 28 +- tex/context/base/strc-not.mkiv | 15 +- tex/context/base/strc-num.mkiv | 67 +- tex/context/base/strc-ref.lua | 8 +- tex/context/base/strc-ref.mkiv | 4 +- tex/context/base/strc-sec.mkiv | 3 +- tex/context/base/x-mathml.mkiv | 2 +- tex/context/base/x-set-11.tex | 3 +- tex/generic/context/luatex-fonts-merged.lua | 2 +- 40 files changed, 11404 insertions(+), 11863 deletions(-) delete mode 100644 tex/context/base/core-grd.mkii delete mode 100644 tex/context/base/core-grd.mkiv delete mode 100644 tex/context/base/core-spa.lua delete mode 100644 tex/context/base/core-spa.mkii delete mode 100644 tex/context/base/core-spa.mkiv create mode 100644 tex/context/base/spac-ali.mkiv create mode 100644 tex/context/base/spac-def.mkiv create mode 100644 tex/context/base/spac-fnt.mkiv create mode 100644 tex/context/base/spac-gen.mkii create mode 100644 tex/context/base/spac-grd.lua create mode 100644 tex/context/base/spac-grd.mkii create mode 100644 tex/context/base/spac-grd.mkiv create mode 100644 tex/context/base/spac-hor.mkiv create mode 100644 tex/context/base/spac-pag.mkiv create mode 100644 tex/context/base/spac-par.mkiv create mode 100644 tex/context/base/spac-ver.lua create mode 100644 tex/context/base/spac-ver.mkiv (limited to 'tex') diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv index c558bb04f..9e6bc027d 100644 --- a/tex/context/base/anch-pgr.mkiv +++ b/tex/context/base/anch-pgr.mkiv @@ -26,6 +26,18 @@ \ifx\textheight\undefined \def\textheight{\vsize} \fi +%D Helper: + +\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap + {\doifelse{#1}\v!line + {#2\openlineheight} + {\ifgridsnapping + \assigndimension{#1}{#2}{.25\openlineheight}{.5\openlineheight}\openlineheight + \else + \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount + \fi}% + \relax} + %D The next macros so some housekeeping. \def\pageanchor{page:0} % for the moment only one pagesize diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 1379af14b..d09e31d67 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2009.09.15 12:27} +\newcontextversion{2009.09.16 20:07} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii index e418d7a26..bbc05ae50 100644 --- a/tex/context/base/context.mkii +++ b/tex/context/base/context.mkii @@ -181,8 +181,9 @@ %D macros' that are seen by the users. The order of loading %D is important, due to dependancies. -\loadmarkfile{core-spa} -\loadmarkfile{core-grd} +\loadmarkfile{spac-gen} +\loadmarkfile{spac-grd} + \loadmarkfile{strc-mar} \loadmarkfile{anch-pos} diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 1f8de3e0a..387c8aa90 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -164,8 +164,14 @@ \loadmarkfile{strc-ref} \loadmarkfile{strc-reg} -\loadmarkfile{core-spa} -\loadmarkfile{core-grd} +\loadmarkfile{spac-hor} +\loadmarkfile{spac-ver} +\loadmarkfile{spac-ali} +\loadmarkfile{spac-pag} +\loadmarkfile{spac-fnt} +\loadmarkfile{spac-par} +\loadmarkfile{spac-def} +\loadmarkfile{spac-grd} \loadmarkfile{anch-pos} diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 4124f5924..bd0c49d95 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2009.09.15 12:27} +\edef\contextversion{2009.09.16 20:07} %D For those who want to use this: diff --git a/tex/context/base/core-grd.mkii b/tex/context/base/core-grd.mkii deleted file mode 100644 index 249e2e430..000000000 --- a/tex/context/base/core-grd.mkii +++ /dev/null @@ -1,1074 +0,0 @@ -%D \module -%D [ file=core-grd, -%D version=1998.03.10, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Grid Snapping (Experimental), -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Core Macros / Grid Snapping} - -\unprotect - -%D Moved from supp-box: - -%D \macros -%D {startbaselinecorrection,baselinecorrection, -%D showbaselinecorrection,offbaselinecorrection} -%D -%D Spacing around ruled boxes can get pretty messed up. The -%D next macro tries as good as possible to fix this. -%D -%D \startbuffer[1] -%D \startbaselinecorrection -%D \ruledhbox{Rule Brittanica} -%D \stopbaselinecorrection -%D \stopbuffer -%D -%D \typebuffer[1] -%D -%D The macros put some white space around the box: -%D -%D \getbuffer[1] -%D -%D A simple alternative is \type {\baselinecorrection}, which -%D only looks at the previous line. -%D -%D \startbuffer[2] -%D \baselinecorrection -%D \ruledhbox{Rule Brittanica} -%D \baselinecorrection -%D \stopbuffer -%D -%D \typebuffer[2] -%D -%D This time the last preceding line gets a correction,% -%D dependant on the depth. -%D -%D \getbuffer[2] -%D -%D One can make the correction visible by saying \type -%D {\showbaselinecorrection}. Part of the correction is -%D calculated from the dimensions of a~(. One can disble the -%D correction by calling \type {\offbaselinecorrection}. -%D -%D When visualize the first example looks like: -%D -%D {\showbaselinecorrection\getbuffer[1]} -%D -%D and the second one comes out as: -%D -%D {\showbaselinecorrection\getbuffer[2]} - -% \definecolor[GridLineColor][red] -% \definecolor[GridTextColor][blue] - -\definepalet - [grid] - [ one=red, - two=green, - three=blue, - four=gray] - -\def\setbaselinecorrections - {\setbox0\hbox{\setstrut\strut}% - \setbox2\hbox{(}% - \dimen0\ht0\advance\dimen0 -\ht2 - \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi - \dimen2\dp0\advance\dimen2 -\dp2 - \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi - \edef\thetopbaselinecorrection {\the\dimen0}\dimen0-\dimen0 - \edef\thebotbaselinecorrection {\the\dimen2}\dimen2-\dimen2 - \edef\thenegtopbaselinecorrection{\the\dimen0}% - \edef\thenegbotbaselinecorrection{\the\dimen2}} - -\def\dotopbaselinecorrection {\kern\thetopbaselinecorrection} -\def\dobotbaselinecorrection {\kern\thebotbaselinecorrection} -\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection} -\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection} - -\def\showbaselinecorrection - {\def\dobaselinecorrection % visualization is not watertight! - {\bgroup -\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi - \setbox0\null - \wd0\hsize - \dp0\strutdp - \nointerlineskip - \forgetall - \ruledvbox{\box0}% - \egroup - \prevdepth\strutdp}% - \def\dotopbaselinecorrection - {\hrule\!!height\thetopbaselinecorrection}% - \def\dobotbaselinecorrection - {\hrule\!!height\thebotbaselinecorrection}} - -\def\dobaselinecorrection - {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi - \kern\strutdp - \prevdepth\strutdp} - -% \def\baselinecorrection -% {\endgraf -% \ifvmode -% \ifdim\prevdepth<\maxdimen -% \ifdim\prevdepth<\zeropoint \else -% \ifdim\prevdepth<\strutdp -% \dobaselinecorrection -% \fi -% \fi -% \fi -% \fi} - -\def\baselinecorrection - {\endgraf - \ifvmode - \ifdim\prevdepth<\maxdimen - \ifdim\prevdepth<\zeropoint \else - \ifdim\prevdepth<\strutdepth \relax - \pushlastnode - \dobaselinecorrection - \poplastnode - \fi - \fi - \fi - \fi} - -\def\pagebaselinecorrection - {\ifdim\pagegoal<\maxdimen - \ifdim\pagetotal>\lineheight % or \topskip - \scratchdimen\pagetotal - \advance\scratchdimen\lineheight - \ifdim\scratchdimen<\pagegoal - \baselinecorrection - \fi - \fi - \fi} - -% Beware, keep this one as it is, see for instance module -% m-steps.tex, where we apply a \localhsize to the \vbox, in -% order to follow narrower and side floats ! - -% \def\startbaselinecorrection -% {\baselinecorrection -% \ifvmode -% \bgroup -% \setbox\scratchbox\vbox\bgroup -% \ignorespaces -% \let\stopbaselinecorrection\dostopbaselinecorrection -% \else -% \let\stopbaselinecorrection\relax -% \fi} - -% \def\dostopbaselinecorrection % I have to check columns yet. -% {\endgraf -% \egroup -% \topbaselinecorrection -% \box\scratchbox -% \botbaselinecorrection -% \egroup} - -% \let\stopbaselinecorrection=\relax - -\def\startbaselinecorrection - {\bgroup - \let\stopbaselinecorrection\egroup - \ifcase\baselinecorrectionmode - \or % normal - \baselinecorrection - \ifvmode - \setbox\scratchbox\vbox\bgroup\ignorespaces - \let\stopbaselinecorrection\donormalstopbaselinecorrection - \fi - \or % off - \or % force - \baselinecorrection - \ifvmode - \setbox\scratchbox\vbox\bgroup\ignorespaces - \let\stopbaselinecorrection\doforcedstopbaselinecorrection - \fi - \fi} - -\let\stopbaselinecorrection\relax - -\def\donormalstopbaselinecorrection % I have to check columns yet. - {\egroup - \topbaselinecorrection - \box\scratchbox - \botbaselinecorrection - \egroup} - -\def\doforcedstopbaselinecorrection % I have to check columns yet. - {\egroup - \forcedtopbaselinecorrection - \box\scratchbox - \forcedbotbaselinecorrection - \egroup} - -%D We do a bit more checking than needed. The pageborder check -%D is not needed, but I want to look the visualization as good -%D as possible too. - -% \def\offbaselinecorrection % Can be used inside correction. -% {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}} - -\chardef\baselinecorrectionmode\plusone - -\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone } -\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo } -\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree} - -%D \macros -%D {topbaselinecorrection,botbaselinecorrection} -%D -%D The actual top and bottom corrections are implemented as: - -% \def\topbaselinecorrection -% {\ifvmode \ifdim\pagegoal<\maxdimen -% \bgroup -% \setbaselinecorrections -% \whitespace -% \nointerlineskip -% \dotopbaselinecorrection -% \egroup -% \fi \fi} - - -\def\topbaselinecorrection - {\ifvmode \ifdim\pagegoal<\maxdimen - \forcedtopbaselinecorrection - \fi \fi} - -\def\forcedtopbaselinecorrection - {\ifvmode - \bgroup - \setbaselinecorrections - \whitespace - \nointerlineskip - \dotopbaselinecorrection - \egroup - \fi} - -\def\botbaselinecorrection - {\ifvmode - \bgroup - \setbaselinecorrections - \dobotbaselinecorrection - \allowbreak % new, otherwise problems when many in a row - \prevdepth\strutdp - \egroup - \fi} - -\let\forcedbotbaselinecorrection\botbaselinecorrection - -%D Still very experimental and therefore undocumented. - -\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE -\newif\ifforcepresnap \forcepresnaptrue % false in mixed single/double -\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false - -\def\positiveextrasnap {\gdef\extrasnapsign{+}} -\def\negativeextrasnap {\gdef\extrasnapsign{-}} - -\def\extrasnapreset {\global\chardef\@@extrasnap0 - \positiveextrasnap} -\def\extrasnapbefore {\global\chardef\@@extrasnap1 } -\def\extrasnaparound {\global\chardef\@@extrasnap2 } -\def\extrasnapafter {\global\chardef\@@extrasnap3 } - -\def\enablepresnapcorrection {\global\chardef\@@presnap\zerocount} -\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone} - -\extrasnapreset \enablepresnapcorrection - -\newif\iftracegridsnapping -\newif\ifshowgridboxes -\newif\ifshowfuzzyskips - -\let\showgridboxes\showgridboxestrue - -\def\showgridsnapping - {\tracegridsnappingtrue - \showgridboxestrue} - -\chardef\@@alignsnap =0 -\chardef\@@alignsnapbox =0 -\chardef\@@alignsnapmethod=0 - -\let\presnapskip \!!zeropoint \def\presnap {-} -\let\postsnapskip\!!zeropoint \let\postsnap\presnap - -\newcount\currentgridsnap - -\def\tracedsnapping - {\iftracegridsnapping - \llap - {\startlayoutcomponent{gridsnaps}{grid snaps}% - \infofont - \global\advance\currentgridsnap\plusone - \color[grid:three]{\vl\presnapskip - \vl\presnap - \vl\postsnap - \ifcase\@@alignsnapbox\relax - \vl\ifcase\@@extrasnap - 00\or - \extrasnapsign0\or - \extrasnapsign\extrasnapsign\or - 0\extrasnapsign\fi - \fi - \vl\the\currentgridsnap\vl}% - \stoplayoutcomponent}% - \fi} - -\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox - {\dosingleempty\dosnaptogrid} - -% \def\dosnaptogrid[#1]% -% {\ifgridsnapping -% \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi -% \expandafter\dodosnaptogrid -% \fi} - -% \def\dosnaptogrid[#1]% -% {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up -% \ifgridsnapping -% \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi -% \expandafter\dodosnaptogrid -% \fi} - -\def\dosnaptogrid[#1]% - {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up - \doifinsetelse\v!force{#1}% - {\moveongrid[#1]% - \dodosnaptogrid} - {\ifgridsnapping - \doifsomething{#1}{\moveongrid[#1]}% - \expandafter\dodosnaptogrid - \fi}} - -% \def\forcedpresnapcorrection % test this on 'details' -% {\ifforcepresnap -% \ifvmode \else \par \fi % new -% % we don't want top of page space when 'top' option -% %\verticalstrut\nobreak\vskip-\struttotal -% %\verticalstrut\vskip-\struttotal -% % nobreak really needed -% \allowbreak\verticalstrut\nobreak\vskip-\struttotal -% %\ifdim\pagetotal>\topskip \else -% % eigenlijk signal -% %\writestatus{grid}{removing dummy at top of page}% -% %\bgroup -% %\output{\setbox\scratchbox\box255}% -% %\penalty\outputpenalty -% %\egroup -% %\fi -% \fi} - -\def\forcedpresnapcorrection % test this on 'details' - {\ifforcepresnap - \ifvmode \else \par \fi % new - % we don't want top of page space when 'top' option - % \verticalstrut\nobreak\vskip-\struttotal - % \verticalstrut\vskip-\struttotal - % \nobreak really needed - % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper - \verticalstrut - \nobreak - \vskip-\struttotal - %\ifdim\pagetotal>\topskip \else - % eigenlijk signal - %\writestatus{grid}{removing dummy at top of page}% - %\bgroup - %\output{\setbox\scratchbox\box255}% - %\penalty\outputpenalty - %\egroup - %\fi - \fi} - -\def\setgridtracebox#1[#2]% % maybe reverse the order - {\setbox\nextbox#1% - {\hbox - {\hbox to \zeropoint - {\startlayoutcomponent{gridsnaps}{grid snaps}% - \color[grid:#2]{\ruledhbox{\fakebox\nextbox}}% - \stoplayoutcomponent - \hss}% - \flushnextbox}}} - -\newif\ifboxedsnapping \boxedsnappingtrue - -\chardef\depthsnapmethod \plusone % downward compatible, minus one line -\chardef\heightsnapmethod\plusone % downward compatible, minus one line - -\def\dodosnaptogrid - {\dowithnextbox - {\bgroup - \ifcase\@@alignsnapmethod \or - % we're dealing with text with a possible big depth/height - \chardef\depthsnapmethod \plustwo - \chardef\heightsnapmethod\plustwo - \fi - \ifdim\nextboxht<\textheight % handle special case (like page fig) - \ifcase\@@alignsnapbox\relax - \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low - \ifshowgridboxes - \setgridtracebox\hbox[two]% - \fi - %\getnoflines{\nextboxht}% - \getnoflines\nextboxht - \setbox\nextbox\vbox to \noflines\lineheight - {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi - \ifnum\@@alignsnap>2 \vfill\fi - \flushnextbox - \ifnum\@@alignsnap<4 \vfill\fi}% - \fi - \ifshowgridboxes - \setgridtracebox\hbox[three]% - \fi - \forgetall - \par - \ifvbox\nextbox - \setbox\nextbox\hbox{\flushnextbox}% don't ask - \fi - \scratchskip\lastskip - \edef\presnapskip{\the\lastskip}% - % mixing single/double columns sometimes goes wrong, - % check 'som' document - \ifinsidecolumns - \forcepresnaptrue - \fi - \forcedpresnapcorrection - \ifdim\nextboxht>\strutht - \scratchdimen\nextboxht - \ifcase\@@presnap\relax - \ifdim\scratchskip>\zeropoint\relax - \scratchcounter\scratchskip - \advance\scratchcounter -\openlineheight - \ifnum\scratchcounter<0 - \scratchcounter-\scratchcounter - \fi - \ifnum\scratchcounter<10 % \lastkip is about \openlineheight - \advance\scratchdimen -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \else\ifdim\scratchskip>\openlineheight - %<\openlineheight \else - \advance\scratchdimen -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \fi\fi - \fi - \fi - % \getnoflines\scratchdimen % maybe raw ? - % \advance\noflines -1 - \ifcase\heightsnapmethod - % raw - \or - \advance\scratchdimen-\lineheight % tight (default) - \or - \advance\scratchdimen-\strutheight % fit (text) - \or - \advance\scratchdimen-\strutheight % tolerant - \advance\scratchdimen-\roundingeps - \fi - \getnoflines\scratchdimen - \ifnum\noflines>0 - \scratchdimen\noflines\lineheight - \else - \scratchdimen\zeropoint - \fi - \else - \scratchdimen\zeropoint - \fi - \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign \lineheight \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi - \edef\presnap{\the\scratchdimen}% - \ifstrutsnapping - \ifboxedsnapping - \getrawnoflines\scratchdimen - \advance\scratchdimen-\noflines\lineheight - \vskip\scratchdimen % disappears at top of page - \dorecurse\noflines{\verticalstrut\nobreak}% - \else \ifdim\scratchdimen=\zeropoint - % nothing to skip - \else % disappears at top of page - \vskip\scratchdimen - \fi \fi - \fi - \ifdim\nextboxdp>\strutdp - % \getnoflines\nextboxdp - % \advance\noflines \minusone - \scratchdimen\nextboxdp\relax - \ifcase\depthsnapmethod - % raw - \or - \advance\scratchdimen-\lineheight % tight (default) - \or - \advance\scratchdimen-\strutdepth % fit (text) - \or - \advance\scratchdimen-\strutdepth % tolerant - \advance\scratchdimen-\roundingeps - \fi - \getnoflines\scratchdimen - \ifnum\noflines>0 - \scratchdimen\noflines\lineheight - \else - \scratchdimen\zeropoint - \fi - \else - \scratchdimen\zeropoint - \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi - \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign \lineheight \fi - \edef\postsnap{\the\scratchdimen}% - \ifstrutsnapping - \nextboxht\strutht - \nextboxdp\strutdp - \else - \scratchdimen\presnap - \advance\scratchdimen \strutht - \nextboxht\scratchdimen - \scratchdimen\postsnap - \advance\scratchdimen \strutdp - \nextboxdp\scratchdimen - \fi - \hbox{\tracedsnapping\flushnextbox}% - \ifstrutsnapping - \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi - \fi - \else - \scratchdimen\nextboxht\relax - \ifcase\@@alignsnapbox - % can't happen here - \or - \getrawnoflines\scratchdimen - \else - \getnoflines \scratchdimen - \fi - \scratchdimen\noflines\lineheight\relax - \advance\scratchdimen-\strutdepth - % spoils the whole game (fit/broad/line) - % \ifnum\pagetotal>\zeropoint \else % disable this as option - % \advance\scratchdimen-\strutheight - % \advance\scratchdimen+\topskip - % \fi - \dimen0=\scratchdimen - \dimen2=\strutdepth - \ifshowgridboxes - \setgridtracebox\hbox[two]% - \fi - \nextboxdp\strutdp - \dimen4=\nextboxht - \dimen6=\nextboxdp - \iftracegridsnapping - \setbox\scratchbox\hbox - {\scratchdimen\@@alignsnapamount\relax - \ifdim\scratchdimen<\zeropoint - \tracedgridamount\zeropoint{-\scratchdimen}% - \else - \tracedgridamount\scratchdimen\zeropoint - \fi}% - \smashbox\scratchbox - \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}% - \fi - \setbox\nextbox\hbox - {\scratchdimen\@@alignsnapamount\relax - \ifcase\@@alignsnapdepth\or - % don't change this ever ! - \ifdim\dimen0<\lineheight - % otherwise it is ok, but ending up inside - % the next paragraph is seldom what we want, - % so we move one line up - \advance\scratchdimen-\lineheight - \advance\scratchdimen\strutheight - \else - % otherwise we can move down to the - % baseline - \advance\scratchdimen\dimen6 % == \strutdepth - \fi - \fi - \lower\scratchdimen\flushnextbox}% - \nextboxht\dimen4 - \nextboxdp\dimen6 - \ifnum\@@alignsnap<4 % 4 = regel - \setbox\nextbox\vbox to \scratchdimen - {\forgetall - \ifnum\@@alignsnap>2 \vfill\fi % 3 4 - \flushnextbox - \nointerlineskip % \offinterlineskip - \ifnum\@@alignsnap<4 \vfill\fi % 2 3 - \kern\zeropoint}% - \fi - \ifshowgridboxes - \setgridtracebox\vbox[three]% - \fi - \scratchdimen\@@alignsnapamount - \edef\presnapskip{\the\scratchdimen}% - \ifnum\@@alignsnap>2 \def\presnap {+}\fi - \ifnum\@@alignsnap<4 \def\postsnap{+}\fi - \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}% - \par - \nextboxht\dimen0 - \nextboxdp\dimen2 - \forcedpresnapcorrection - \nointerlineskip - \flushnextbox - \fi - \else - \setbox\nextbox\vbox to \textheight - {\ifdim\nextboxdp=\zeropoint - \hbox{\lower\strutdepth\flushnextbox} - \else % this branch is yet untested - \vss - \hbox{\lower\nextboxdp\flushnextbox} - \vskip-\strutdepth - \fi}% - \nextboxdp\strutdepth - \flushnextbox - \fi - \extrasnapreset - \enablepresnapcorrection - \global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount - \egroup}} - -\def\tracedgridamount#1#2% - {\startlayoutcomponent{gridsnaps}{grid snaps}% - \color[grid:four]{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}% - \stoplayoutcomponent} - -\def\snaptomathgrid % probably not working ok, also kind of obsolete - {\ifgridsnapping - \dowithnextbox - {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]} - \vbox\bgroup - \forgetdisplayskips - \@EA\let\@EA\next - \fi} - -\def\topsnaptogrid - {\ifgridsnapping - \dowithnextbox - {\scratchdimen\nextboxht - \advance\scratchdimen -\strutht - \advance\scratchdimen \topskip - \nextboxht\scratchdimen - \nextboxdp\zeropoint - \flushnextbox - \kern\lineheight - \kern-\topskip - \nointerlineskip} - \hbox - \fi} - -% \def\centertogrid % meant for special situations -% {\ifgridsnapping -% \dowithnextboxcontent -% {\ignorespaces} -% {\bgroup -% \par -% \scratchdimen\nextboxht -% \advance\scratchdimen \nextboxdp -% \getnoflines\scratchdimen -% \setbox\nextbox\vbox to \noflines\lineheight -% {\forgetall -% \vskip\zeropoint \!!plus \nextboxht -% \copy\nextbox -% \kern.5\strutdp % VOORLOPIGE WAARDE -% \vskip\zeropoint \!!plus \nextboxdp}% -% \noindent\snaptogrid\vbox{\flushnextbox}% -% \egroup} -% \vbox % was \hbox -% \fi} - -% The next implementation is sub-optimal -% -% \def\centertogrid % usage: see ie pascal / stepcharts -% {\snaptogrid[\v!midden,.5\strutdp]\vbox} - -\def\centertogrid % meant for special situations - {\ifgridsnapping - \dowithnextboxcontent - {\ignorespaces} - {\bgroup - \par - \scratchdimen\nextboxht - \advance\scratchdimen \nextboxdp - \getnoflines\scratchdimen - \setbox\nextbox\vbox to \noflines\lineheight - {\forgetall - \vss - \topbaselinecorrection - \copy\nextbox - \botbaselinecorrection - \vss}% - \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}% - \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace - \noindent\snaptogrid\vbox{\flushnextbox}% - \egroup} - \vbox % was \hbox - \fi} - -% testbed for \centertogrid -% -% \strut Bruggetje -% \startlinecorrection -% \startcombination -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination[2*2] -% {\framed{test}} {} {\framed{test}} {} -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination[2*2] -% {\framed{test}} {} {\framed{test}} {} -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination[2*2] -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination[2*2] -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection - -\ifx\startbaselinecorrection\undefined \wait \fi % change order - -\let\normalstartbaselinecorrection=\startbaselinecorrection - -\def\startbaselinecorrection - {\ifgridsnapping - \centertogrid\bgroup - \let\stopbaselinecorrection\egroup - \else - \normalstartbaselinecorrection - \fi} - -\chardef\gridboxlinenomode\plusone -\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame - -\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% - {\setbox#1\gridboxvbox to #3 % given size - {\forgetall - \resetteststrut - \offinterlineskip - \hsize#2% - \baselinerulefalse - \gridboxvbox % calculated size - {\getrawnoflines{#3}% \getnoflines{#3}% - \vskip\topskip - \vskip-\strutht - \scratchdimen#2\advance\scratchdimen \lineheight - \dorecurse\noflines - {\strut - \hskip-.5\lineheight - \ifcase\gridboxlinenomode\or - \rlap - {\hskip.2\bodyfontsize\hskip\scratchdimen - \infofont\hbox to 1em{\hss\recurselevel}}% - \or - \llap - {\infofont\hbox to 1em{\hss\recurselevel}% - \hskip.2\bodyfontsize}% - \fi - \vrule - \!!height \gridboxwidth - \!!depth \gridboxwidth - \!!width \scratchdimen - \par}} - \vfill}} - -%D Some intervention macros: - -\def\gridwarning#1{\message{[beware of #1 extra snap]}} - -\global\let\@@alignsnapamount\!!zeropoint -\global\chardef\@@alignsnapdepth0 - -\def\@@unknowngriddisplacement - {\global\chardef\@@alignsnapbox\plusthree - \global\let\@@alignsnapamount\commalistelement} - -\def\domoveongrid[#1]% - {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi} - -\def\dodomoveongrid[#1]% some day : speed up - {\global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount - \global\chardef\@@alignsnapdepth\zerocount - \global\chardef\@@alignsnapmethod\zerocount - \global\let\@@alignsnapamount\!!zeropoint - \donefalse - \expanded{\processallactionsinset[#1]} - [\v!standard=>, - \v!normal=>, % to be sure - \v!yes=>, % to be sure - \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore, - \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter, - \v!both=>\positiveextrasnap\extrasnaparound, - -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore, - -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter, - -\v!both=>\negativeextrasnap\extrasnaparound, - \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations - \v!page=>\global\chardef\@@alignsnap\plusone, % topskip - \v!high=>\global\chardef\@@alignsnap\plustwo, - \v!middle=>\global\chardef\@@alignsnap\plusthree, - \v!low=>\global\chardef\@@alignsnap\plusfour, - \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new - \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new - \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new - \v!line=>\global\chardef\@@alignsnapbox\plusthree -% \global\chardef\@@alignsnapdepth\plusone - \global\chardef\@@alignsnap\plusfour, - \v!reset=>\positiveextrasnap\extrasnapreset, - \v!none=>\global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount, - \v!force=>, % turns on grid snapping even when not on - \s!default=>, - \s!unknown=>\@@unknowngriddisplacement]} - -\def\moveongrid - {\dosingleempty\domoveongrid} - -\def\doplaceongrid[#1]% - {\domoveongrid[#1]\snaptogrid\vbox} - -\def\placeongrid - {\dosingleempty\doplaceongrid} - -%D Snapping is rather robust as long as we use whole lines. -%D Half lines of white space can however be handled when they -%D come in pairs. The corrections needed when crossing page -%D boundaries in the middle of such a pair, are handled by -%D macros that are (named) sort of fuzzy. This fuzzy mechanism -%D was written as an extension to the grid typesetting needed -%D for typesetting (part of) the \MAPS. -%D -%D \starttyping -%D \setuptyping -%D [before={\blank[halfline]}, -%D after={\blank[halfline]}] -%D \stoptyping - -\newif \iffuzzyvskip -\newif \iffuzzysnapdone -\newif \iffuzzysnapping -\newif \iffuzzysnapped -\chardef \fuzzysnappedleft=0 % ==1 when fuzzybegin still open -\newpersistentmark\fuzzymark % (!) -\newcount \fuzzymarker -\newbox \fuzzysnapbox -\newbox \fuzzysnapsplit - -\def\dosyncfuzzyvskip - {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint - \bgroup % - added 28/2/2003: check this, there was no - - \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal - \egroup - \fi\fi\fi} - -\def\fuzzyvskip#1% - {\iffuzzysnapdone - \dosyncfuzzyvskip % NEWER - \endfuzzysnapping - \vskip#1\relax - \global\fuzzysnapdonefalse - \else - \vskip#1\relax - \beginfuzzysnapping - \global\fuzzysnapdonetrue - \fi} - -\def\setfuzzymark#1#2#3% #1/#2 => error recovery - {\ifgridsnapping - \global\fuzzysnappingtrue - \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi - \nobreak - \ifshowfuzzyskips - \hbox{\color[grid:three] - {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak - \vrule\!!width\hsize\!!height.1\lineheight}} - \nobreak - \fi - %[\the\fuzzymarker] - %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% - \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% - \nobreak - \fi} - -\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd -\def\endfuzzysnapping {\setfuzzymark12\v!stop } % even - -\def\removelastfuzzyvskip - {\ifgridsnapping - \iffuzzysnapping - \ifdim\lastskip<\openlineheight - \else - \removelastskip - \fi - \else - \removelastskip - \fi - \else - \removelastskip - \fi} - -\def\docheckfuzzysnap#1% - {\bgroup - \dontcomplain - \setbox\fuzzysnapbox\copy#1\relax - \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight - \let\topfuzzymark\empty % indeed here ... no real mark - \getsplitmarks\fuzzymark -% \ifcase0\topfuzzymark - \ifcase0\rawgetsplittopmark\fuzzymark - \global\chardef\fuzzysnappedleft\zerocount - \global\fuzzysnappedfalse -% \else\ifodd\topfuzzymark - \else\ifodd\rawgetsplittopmark\fuzzymark - \global\chardef\fuzzysnappedleft\plusone - \global\fuzzysnappedtrue - \else - \global\chardef\fuzzysnappedleft=2 - \global\fuzzysnappedtrue - \fi\fi - \iffuzzysnapped \else - \doloop - {\ifvoid\fuzzysnapbox - \exitloop - \else - \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight - %\let\topfuzzymark=\empty % ... but not here - \getsplitmarks\fuzzymark -% \ifcase0\topfuzzymark - \ifcase0\rawgetsplittopmark\fuzzymark - % continue -% \else\ifodd\topfuzzymark - \else\ifodd\rawgetsplittopmark\fuzzymark - \exitloop - \else - \global\chardef\fuzzysnappedleft\plusone - \global\fuzzysnappedtrue - \exitloop - \fi\fi - \fi}% - \fi - \egroup} - -\def\getfuzzysnapcorrection#1% - {\global\let\presnapcorrection \relax - \global\let\postsnapcorrection\relax - \ifgridsnapping\iffuzzysnapping - \docheckfuzzysnap{#1}% - \iffuzzysnapped - \iftracegridsnapping - \gdef\presnapcorrection - {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}% - \else - \gdef\presnapcorrection{\kern.5\openlineheight}% - \fi - \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok - \fi - \fi\fi} - -\def\fuzzysnappedbox#1#2% \box \unvbox - {\getfuzzysnapcorrection{#2}% - \presnapcorrection - #1#2% - \postsnapcorrection} - -\def\adaptfuzzypagegoal - {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents - \scratchdimen\pagegoal - \advance\scratchdimen -.5\openlineheight - \global\pagegoal\scratchdimen - \global\advance\vsize -.5\openlineheight - \global\chardef\fuzzysnappedleft0 - \fi\fi\fi} - -%D New, experimental, used in caption snapping: -%D -%D \starttyping -%D \startcolumnset -%D -%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top] -%D -%D \placefigure [lrtb] {\dorecurse{5}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D \placefigure [lrtb] {\dorecurse{15}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D -%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom] -%D -%D \placefigure [rltb] {\dorecurse{5}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D \placefigure [rltb] {\dorecurse{15}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D -%D \input thuan -%D -%D \stopcolumnset -%D \stoptyping - -\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! ! - {\doifsomething{#2} - {\getnoflines{\ht#1}% no depth taken into account, depth preserved - \scratchdimen\noflines\lineheight - \advance\scratchdimen-\strutdp - \bgroup - \advance\scratchdimen-\onepoint % be a bit tolerant - \ifdim\scratchdimen>\ht#1\relax - \egroup - \doif{#2}\v!top {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}% - \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}% - \dp#1\strutdp - \else - \egroup - \ht#1\scratchdimen - \dp#1\strutdp - \fi}} - -%D New: - -\let\checkgridsnapping\relax - -\protect \endinput diff --git a/tex/context/base/core-grd.mkiv b/tex/context/base/core-grd.mkiv deleted file mode 100644 index d6cc93735..000000000 --- a/tex/context/base/core-grd.mkiv +++ /dev/null @@ -1,1074 +0,0 @@ -%D \module -%D [ file=core-grd, -%D version=1998.03.10, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Grid Snapping (Experimental), -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Core Macros / Grid Snapping} - -\unprotect - -%D Moved from supp-box: - -%D \macros -%D {startbaselinecorrection,baselinecorrection, -%D showbaselinecorrection,offbaselinecorrection} -%D -%D Spacing around ruled boxes can get pretty messed up. The -%D next macro tries as good as possible to fix this. -%D -%D \startbuffer[1] -%D \startbaselinecorrection -%D \ruledhbox{Rule Brittanica} -%D \stopbaselinecorrection -%D \stopbuffer -%D -%D \typebuffer[1] -%D -%D The macros put some white space around the box: -%D -%D \getbuffer[1] -%D -%D A simple alternative is \type {\baselinecorrection}, which -%D only looks at the previous line. -%D -%D \startbuffer[2] -%D \baselinecorrection -%D \ruledhbox{Rule Brittanica} -%D \baselinecorrection -%D \stopbuffer -%D -%D \typebuffer[2] -%D -%D This time the last preceding line gets a correction,% -%D dependant on the depth. -%D -%D \getbuffer[2] -%D -%D One can make the correction visible by saying \type -%D {\showbaselinecorrection}. Part of the correction is -%D calculated from the dimensions of a~(. One can disble the -%D correction by calling \type {\offbaselinecorrection}. -%D -%D When visualize the first example looks like: -%D -%D {\showbaselinecorrection\getbuffer[1]} -%D -%D and the second one comes out as: -%D -%D {\showbaselinecorrection\getbuffer[2]} - -% \definecolor[GridLineColor][red] -% \definecolor[GridTextColor][blue] - -\let\thetopbaselinecorrection \!!zeropoint -\let\thebotbaselinecorrection \!!zeropoint -\let\thenegtopbaselinecorrection\!!zeropoint -\let\thenegbotbaselinecorrection\!!zeropoint - -\definepalet - [grid] - [ one=red, - two=green, - three=blue, - four=gray] - -\def\setbaselinecorrections - {\setbox0\hbox{\setstrut\strut}% - \setbox2\hbox{(}% - \dimen0\ht0\advance\dimen0 -\ht2 - \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi - \dimen2\dp0\advance\dimen2 -\dp2 - \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi - \edef\thetopbaselinecorrection {\the\dimen0}\dimen0-\dimen0 - \edef\thebotbaselinecorrection {\the\dimen2}\dimen2-\dimen2 - \edef\thenegtopbaselinecorrection{\the\dimen0}% - \edef\thenegbotbaselinecorrection{\the\dimen2}} - -\def\dotopbaselinecorrection {\kern\thetopbaselinecorrection} -\def\dobotbaselinecorrection {\kern\thebotbaselinecorrection} -\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection} -\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection} - -\def\showbaselinecorrection - {\def\dobaselinecorrection % visualization is not watertight! - {\bgroup -\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi - \setbox0\null - \wd0\hsize - \dp0\strutdp - \nointerlineskip - \forgetall - \ruledvbox{\box0}% - \egroup - \prevdepth\strutdp}% - \def\dotopbaselinecorrection - {\hrule\!!height\thetopbaselinecorrection}% - \def\dobotbaselinecorrection - {\hrule\!!height\thebotbaselinecorrection}} - -\def\dobaselinecorrection - {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi - \kern\strutdp - \prevdepth\strutdp} - -% \def\baselinecorrection -% {\endgraf -% \ifvmode -% \ifdim\prevdepth<\maxdimen -% \ifdim\prevdepth<\zeropoint \else -% \ifdim\prevdepth<\strutdp -% \dobaselinecorrection -% \fi -% \fi -% \fi -% \fi} - -\def\baselinecorrection - {\endgraf - \ifvmode - \ifdim\prevdepth<\maxdimen - \ifdim\prevdepth<\zeropoint \else - \ifdim\prevdepth<\strutdepth \relax - \pushlastnode - \dobaselinecorrection - \poplastnode - \fi - \fi - \fi - \fi} - -\def\pagebaselinecorrection - {\ifdim\pagegoal<\maxdimen - \ifdim\pagetotal>\lineheight % or \topskip - \scratchdimen\pagetotal - \advance\scratchdimen\lineheight - \ifdim\scratchdimen<\pagegoal - \baselinecorrection - \fi - \fi - \fi} - -% Beware, keep this one as it is, see for instance module -% m-steps.tex, where we apply a \localhsize to the \vbox, in -% order to follow narrower and side floats ! - -% \def\startbaselinecorrection -% {\baselinecorrection -% \ifvmode -% \bgroup -% \setbox\scratchbox\vbox\bgroup -% \ignorespaces -% \let\stopbaselinecorrection\dostopbaselinecorrection -% \else -% \let\stopbaselinecorrection\relax -% \fi} - -% \def\dostopbaselinecorrection % I have to check columns yet. -% {\endgraf -% \egroup -% \topbaselinecorrection -% \box\scratchbox -% \botbaselinecorrection -% \egroup} - -% \let\stopbaselinecorrection=\relax - -\def\startbaselinecorrection - {\bgroup - \let\stopbaselinecorrection\egroup - \ifcase\baselinecorrectionmode - \or % normal - \baselinecorrection - \ifvmode - \setbox\scratchbox\vbox\bgroup\ignorespaces - \let\stopbaselinecorrection\donormalstopbaselinecorrection - \fi - \or % off - \or % force - \baselinecorrection - \ifvmode - \setbox\scratchbox\vbox\bgroup\ignorespaces - \let\stopbaselinecorrection\doforcedstopbaselinecorrection - \fi - \fi} - -\let\stopbaselinecorrection\relax - -\def\donormalstopbaselinecorrection % I have to check columns yet. - {\egroup - \topbaselinecorrection - \box\scratchbox - \botbaselinecorrection - \egroup} - -\def\doforcedstopbaselinecorrection % I have to check columns yet. - {\egroup - \forcedtopbaselinecorrection - \box\scratchbox - \forcedbotbaselinecorrection - \egroup} - -%D We do a bit more checking than needed. The pageborder check -%D is not needed, but I want to look the visualization as good -%D as possible too. - -% \def\offbaselinecorrection % Can be used inside correction. -% {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}} - -\chardef\baselinecorrectionmode\plusone - -\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone } -\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo } -\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree} - -%D \macros -%D {topbaselinecorrection,botbaselinecorrection} -%D -%D The actual top and bottom corrections are implemented as: - -% \def\topbaselinecorrection -% {\ifvmode \ifdim\pagegoal<\maxdimen -% \bgroup -% \setbaselinecorrections -% \whitespace -% \nointerlineskip -% \dotopbaselinecorrection -% \egroup -% \fi \fi} - - -\def\topbaselinecorrection - {\ifvmode \ifdim\pagegoal<\maxdimen - \forcedtopbaselinecorrection - \fi \fi} - -\def\forcedtopbaselinecorrection - {\ifvmode - \bgroup - \setbaselinecorrections - \whitespace - \nointerlineskip - \dotopbaselinecorrection - \egroup - \fi} - -\def\botbaselinecorrection - {\ifvmode - \bgroup - \setbaselinecorrections - \dobotbaselinecorrection - \allowbreak % new, otherwise problems when many in a row - \prevdepth\strutdp - \egroup - \fi} - -\let\forcedbotbaselinecorrection\botbaselinecorrection - -%D Still very experimental and therefore undocumented. - -\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE -\newif\ifforcepresnap \forcepresnaptrue % false in mixed single/double -\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false - -\def\positiveextrasnap {\gdef\extrasnapsign{+}} -\def\negativeextrasnap {\gdef\extrasnapsign{-}} - -\def\extrasnapreset {\global\chardef\@@extrasnap0 - \positiveextrasnap} -\def\extrasnapbefore {\global\chardef\@@extrasnap1 } -\def\extrasnaparound {\global\chardef\@@extrasnap2 } -\def\extrasnapafter {\global\chardef\@@extrasnap3 } - -\def\enablepresnapcorrection {\global\chardef\@@presnap\zerocount} -\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone} - -\extrasnapreset \enablepresnapcorrection - -\newif\iftracegridsnapping -\newif\ifshowgridboxes -\newif\ifshowfuzzyskips - -\let\showgridboxes\showgridboxestrue - -\def\showgridsnapping - {\tracegridsnappingtrue - \showgridboxestrue} - -\chardef\@@alignsnap =0 -\chardef\@@alignsnapbox =0 -\chardef\@@alignsnapmethod=0 - -\let\presnapskip \!!zeropoint \def\presnap {-} -\let\postsnapskip\!!zeropoint \let\postsnap\presnap - -\newcount\currentgridsnap - -\def\tracedsnapping - {\iftracegridsnapping - \llap - {\setlayoutcomponentattribute\v!grid\v!test - \hbox \layoutcomponentboxattribute - {\infofont - \global\advance\currentgridsnap\plusone - \color[grid:three] - {\vl\presnapskip - \vl\presnap - \vl\postsnap - \ifcase\@@alignsnapbox\relax\vl\ifcase\@@extrasnap00\or\extrasnapsign0\or\extrasnapsign\extrasnapsign\or0\extrasnapsign\fi\fi - \vl\the\currentgridsnap\vl}}}% - \fi} - -\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox - {\dosingleempty\dosnaptogrid} - -% \def\dosnaptogrid[#1]% -% {\ifgridsnapping -% \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi -% \expandafter\dodosnaptogrid -% \fi} - -% \def\dosnaptogrid[#1]% -% {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up -% \ifgridsnapping -% \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi -% \expandafter\dodosnaptogrid -% \fi} - -\def\dosnaptogrid[#1]% - {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up - \doifinsetelse\v!force{#1}% - {\moveongrid[#1]% - \dodosnaptogrid} - {\ifgridsnapping - \doifsomething{#1}{\moveongrid[#1]}% - \expandafter\dodosnaptogrid - \fi}} - -% \def\forcedpresnapcorrection % test this on 'details' -% {\ifforcepresnap -% \ifvmode \else \par \fi % new -% % we don't want top of page space when 'top' option -% %\verticalstrut\nobreak\vskip-\struttotal -% %\verticalstrut\vskip-\struttotal -% % nobreak really needed -% \allowbreak\verticalstrut\nobreak\vskip-\struttotal -% %\ifdim\pagetotal>\topskip \else -% % eigenlijk signal -% %\writestatus{grid}{removing dummy at top of page}% -% %\bgroup -% %\output{\setbox\scratchbox\box255}% -% %\penalty\outputpenalty -% %\egroup -% %\fi -% \fi} - -\def\forcedpresnapcorrection % test this on 'details' - {\ifforcepresnap - \ifvmode \else \par \fi % new - % we don't want top of page space when 'top' option - % \verticalstrut\nobreak\vskip-\struttotal - % \verticalstrut\vskip-\struttotal - % \nobreak really needed - % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper - \verticalstrut - \nobreak - \vskip-\struttotal - %\ifdim\pagetotal>\topskip \else - % eigenlijk signal - %\writestatus{grid}{removing dummy at top of page}% - %\bgroup - %\output{\setbox\scratchbox\box255}% - %\penalty\outputpenalty - %\egroup - %\fi - \fi} - -\def\setgridtracebox#1[#2]% % maybe reverse the order - {\setbox\nextbox#1% - {\hbox - {\hbox to \zeropoint - {\setlayoutcomponentattribute\v!grid\v!test - \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}% - \hss}% - \flushnextbox}}} - -\newif\ifboxedsnapping \boxedsnappingtrue - -\chardef\depthsnapmethod \plusone % downward compatible, minus one line -\chardef\heightsnapmethod\plusone % downward compatible, minus one line - -\def\dodosnaptogrid - {\dowithnextbox - {\bgroup - \ifcase\@@alignsnapmethod \or - % we're dealing with text with a possible big depth/height - \chardef\depthsnapmethod \plustwo - \chardef\heightsnapmethod\plustwo - \fi - \ifdim\nextboxht<\textheight % handle special case (like page fig) - \ifcase\@@alignsnapbox\relax - \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low - \ifshowgridboxes - \setgridtracebox\hbox[two]% - \fi - %\getnoflines{\nextboxht}% - \getnoflines\nextboxht - \setbox\nextbox\vbox to \noflines\lineheight - {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi - \ifnum\@@alignsnap>2 \vfill\fi - \flushnextbox - \ifnum\@@alignsnap<4 \vfill\fi}% - \fi - \ifshowgridboxes - \setgridtracebox\hbox[three]% - \fi - \forgetall - \par - \ifvbox\nextbox - \setbox\nextbox\hbox{\flushnextbox}% don't ask - \fi - \scratchskip\lastskip - \edef\presnapskip{\the\lastskip}% - % mixing single/double columns sometimes goes wrong, - % check 'som' document - \ifinsidecolumns - \forcepresnaptrue - \fi - \forcedpresnapcorrection - \ifdim\nextboxht>\strutht - \scratchdimen\nextboxht - \ifcase\@@presnap\relax - \ifdim\scratchskip>\zeropoint\relax - \scratchcounter\scratchskip - \advance\scratchcounter -\openlineheight - \ifnum\scratchcounter<0 - \scratchcounter-\scratchcounter - \fi - \ifnum\scratchcounter<10 % \lastkip is about \openlineheight - \advance\scratchdimen -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \else\ifdim\scratchskip>\openlineheight - %<\openlineheight \else - \advance\scratchdimen -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \fi\fi - \fi - \fi - % \getnoflines\scratchdimen % maybe raw ? - % \advance\noflines -1 - \ifcase\heightsnapmethod - % raw - \or - \advance\scratchdimen-\lineheight % tight (default) - \or - \advance\scratchdimen-\strutheight % fit (text) - \or - \advance\scratchdimen-\strutheight % tolerant - \advance\scratchdimen-\roundingeps - \fi - \getnoflines\scratchdimen - \ifnum\noflines>0 - \scratchdimen\noflines\lineheight - \else - \scratchdimen\zeropoint - \fi - \else - \scratchdimen\zeropoint - \fi - \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign \lineheight \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi - \edef\presnap{\the\scratchdimen}% - \ifstrutsnapping - \ifboxedsnapping - \getrawnoflines\scratchdimen - \advance\scratchdimen-\noflines\lineheight - \vskip\scratchdimen % disappears at top of page - \dorecurse\noflines{\verticalstrut\nobreak}% - \else \ifdim\scratchdimen=\zeropoint - % nothing to skip - \else % disappears at top of page - \vskip\scratchdimen - \fi \fi - \fi - \ifdim\nextboxdp>\strutdp - % \getnoflines\nextboxdp - % \advance\noflines \minusone - \scratchdimen\nextboxdp\relax - \ifcase\depthsnapmethod - % raw - \or - \advance\scratchdimen-\lineheight % tight (default) - \or - \advance\scratchdimen-\strutdepth % fit (text) - \or - \advance\scratchdimen-\strutdepth % tolerant - \advance\scratchdimen-\roundingeps - \fi - \getnoflines\scratchdimen - \ifnum\noflines>0 - \scratchdimen\noflines\lineheight - \else - \scratchdimen\zeropoint - \fi - \else - \scratchdimen\zeropoint - \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi - \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign \lineheight \fi - \edef\postsnap{\the\scratchdimen}% - \ifstrutsnapping - \nextboxht\strutht - \nextboxdp\strutdp - \else - \scratchdimen\presnap - \advance\scratchdimen \strutht - \nextboxht\scratchdimen - \scratchdimen\postsnap - \advance\scratchdimen \strutdp - \nextboxdp\scratchdimen - \fi - \hbox{\tracedsnapping\flushnextbox}% - \ifstrutsnapping - \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi - \fi - \else - \scratchdimen\nextboxht\relax - \ifcase\@@alignsnapbox - % can't happen here - \or - \getrawnoflines\scratchdimen - \else - \getnoflines \scratchdimen - \fi - \scratchdimen\noflines\lineheight\relax - \advance\scratchdimen-\strutdepth - % spoils the whole game (fit/broad/line) - % \ifnum\pagetotal>\zeropoint \else % disable this as option - % \advance\scratchdimen-\strutheight - % \advance\scratchdimen+\topskip - % \fi - \dimen0=\scratchdimen - \dimen2=\strutdepth - \ifshowgridboxes - \setgridtracebox\hbox[two]% - \fi - \nextboxdp\strutdp - \dimen4=\nextboxht - \dimen6=\nextboxdp - \iftracegridsnapping - \setbox\scratchbox\hbox - {\scratchdimen\@@alignsnapamount\relax - \ifdim\scratchdimen<\zeropoint - \tracedgridamount\zeropoint{-\scratchdimen}% - \else - \tracedgridamount\scratchdimen\zeropoint - \fi}% - \smashbox\scratchbox - \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}% - \fi - \setbox\nextbox\hbox - {\scratchdimen\@@alignsnapamount\relax - \ifcase\@@alignsnapdepth\or - % don't change this ever ! - \ifdim\dimen0<\lineheight - % otherwise it is ok, but ending up inside - % the next paragraph is seldom what we want, - % so we move one line up - \advance\scratchdimen-\lineheight - \advance\scratchdimen\strutheight - \else - % otherwise we can move down to the - % baseline - \advance\scratchdimen\dimen6 % == \strutdepth - \fi - \fi - \lower\scratchdimen\flushnextbox}% - \nextboxht\dimen4 - \nextboxdp\dimen6 - \ifnum\@@alignsnap<4 % 4 = regel - \setbox\nextbox\vbox to \scratchdimen - {\forgetall - \ifnum\@@alignsnap>2 \vfill\fi % 3 4 - \flushnextbox - \nointerlineskip % \offinterlineskip - \ifnum\@@alignsnap<4 \vfill\fi % 2 3 - \kern\zeropoint}% - \fi - \ifshowgridboxes - \setgridtracebox\vbox[three]% - \fi - \scratchdimen\@@alignsnapamount - \edef\presnapskip{\the\scratchdimen}% - \ifnum\@@alignsnap>2 \def\presnap {+}\fi - \ifnum\@@alignsnap<4 \def\postsnap{+}\fi - \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}% - \par - \nextboxht\dimen0 - \nextboxdp\dimen2 - \forcedpresnapcorrection - \nointerlineskip - \flushnextbox - \fi - \else - \setbox\nextbox\vbox to \textheight - {\ifdim\nextboxdp=\zeropoint - \hbox{\lower\strutdepth\flushnextbox} - \else % this branch is yet untested - \vss - \hbox{\lower\nextboxdp\flushnextbox} - \vskip-\strutdepth - \fi}% - \nextboxdp\strutdepth - \flushnextbox - \fi - \extrasnapreset - \enablepresnapcorrection - \global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount - \egroup}} - -\def\tracedgridamount#1#2% - {\startcolor[grid:four]% - \setlayoutcomponentattribute\v!grid\v!test - \hbox \layoutcomponentboxattribute{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}% - \stopcolor} - -\def\snaptomathgrid % probably not working ok, also kind of obsolete - {\ifgridsnapping - \dowithnextbox - {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]} - \vbox\bgroup - \forgetdisplayskips - \@EA\let\@EA\next - \fi} - -\def\topsnaptogrid - {\ifgridsnapping - \dowithnextbox - {\scratchdimen\nextboxht - \advance\scratchdimen -\strutht - \advance\scratchdimen \topskip - \nextboxht\scratchdimen - \nextboxdp\zeropoint - \flushnextbox - \kern\lineheight - \kern-\topskip - \nointerlineskip} - \hbox - \fi} - -% \def\centertogrid % meant for special situations -% {\ifgridsnapping -% \dowithnextboxcontent -% {\ignorespaces} -% {\bgroup -% \par -% \scratchdimen\nextboxht -% \advance\scratchdimen \nextboxdp -% \getnoflines\scratchdimen -% \setbox\nextbox\vbox to \noflines\lineheight -% {\forgetall -% \vskip\zeropoint \!!plus \nextboxht -% \copy\nextbox -% \kern.5\strutdp % VOORLOPIGE WAARDE -% \vskip\zeropoint \!!plus \nextboxdp}% -% \noindent\snaptogrid\vbox{\flushnextbox}% -% \egroup} -% \vbox % was \hbox -% \fi} - -% The next implementation is sub-optimal -% -% \def\centertogrid % usage: see ie pascal / stepcharts -% {\snaptogrid[\v!midden,.5\strutdp]\vbox} - -\def\centertogrid % meant for special situations - {\ifgridsnapping - \dowithnextboxcontent - {\ignorespaces} - {\bgroup - \par - \scratchdimen\nextboxht - \advance\scratchdimen \nextboxdp - \getnoflines\scratchdimen - \setbox\nextbox\vbox to \noflines\lineheight - {\forgetall - \vss - \topbaselinecorrection - \copy\nextbox - \botbaselinecorrection - \vss}% - \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}% - \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace - \noindent\snaptogrid\vbox{\flushnextbox}% - \egroup} - \vbox % was \hbox - \fi} - -% testbed for \centertogrid -% -% \strut Bruggetje -% \startlinecorrection -% \startcombination -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination[2*2] -% {\framed{test}} {} {\framed{test}} {} -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination[2*2] -% {\framed{test}} {} {\framed{test}} {} -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination[2*2] -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination[2*2] -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection - -\ifx\startbaselinecorrection\undefined \wait \fi % change order - -\let\normalstartbaselinecorrection=\startbaselinecorrection - -\def\startbaselinecorrection - {\ifgridsnapping - \centertogrid\bgroup - \let\stopbaselinecorrection\egroup - \else - \normalstartbaselinecorrection - \fi} - -\chardef\gridboxlinenomode\plusone -\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame - -\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% - {\setbox#1\gridboxvbox to #3 % given size - {\forgetall - \resetteststrut - \offinterlineskip - \hsize#2% - \baselinerulefalse - \gridboxvbox % calculated size - {\getrawnoflines{#3}% \getnoflines{#3}% - \vskip\topskip - \vskip-\strutht - \scratchdimen#2\advance\scratchdimen \lineheight - \dorecurse\noflines - {\strut - \hskip-.5\lineheight - \ifcase\gridboxlinenomode\or - \rlap - {\hskip.2\bodyfontsize\hskip\scratchdimen - \infofont\hbox to 1em{\hss\recurselevel}}% - \or - \llap - {\infofont\hbox to 1em{\hss\recurselevel}% - \hskip.2\bodyfontsize}% - \fi - \vrule - \!!height \gridboxwidth - \!!depth \gridboxwidth - \!!width \scratchdimen - \par}} - \vfill}} - -%D Some intervention macros: - -\def\gridwarning#1{\message{[beware of #1 extra snap]}} - -\global\let\@@alignsnapamount\!!zeropoint -\global\chardef\@@alignsnapdepth0 - -\def\@@unknowngriddisplacement - {\global\chardef\@@alignsnapbox\plusthree - \global\let\@@alignsnapamount\commalistelement} - -\def\domoveongrid[#1]% - {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi} - -\def\dodomoveongrid[#1]% some day : speed up - {\global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount - \global\chardef\@@alignsnapdepth\zerocount - \global\chardef\@@alignsnapmethod\zerocount - \global\let\@@alignsnapamount\!!zeropoint - \donefalse - \expanded{\processallactionsinset[#1]} - [\v!standard=>, - \v!normal=>, % to be sure - \v!yes=>, % to be sure - \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore, - \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter, - \v!both=>\positiveextrasnap\extrasnaparound, - -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore, - -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter, - -\v!both=>\negativeextrasnap\extrasnaparound, - \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations - \v!page=>\global\chardef\@@alignsnap\plusone, % topskip - \v!high=>\global\chardef\@@alignsnap\plustwo, - \v!middle=>\global\chardef\@@alignsnap\plusthree, - \v!low=>\global\chardef\@@alignsnap\plusfour, - \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new - \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new - \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new - \v!line=>\global\chardef\@@alignsnapbox\plusthree -% \global\chardef\@@alignsnapdepth\plusone - \global\chardef\@@alignsnap\plusfour, - \v!reset=>\positiveextrasnap\extrasnapreset, - \v!none=>\global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount, - \v!force=>, % turns on grid snapping even when not on - \s!default=>, - \s!unknown=>\@@unknowngriddisplacement]} - -\def\moveongrid - {\dosingleempty\domoveongrid} - -\def\doplaceongrid[#1]% - {\domoveongrid[#1]\snaptogrid\vbox} - -\def\placeongrid - {\dosingleempty\doplaceongrid} - -%D Snapping is rather robust as long as we use whole lines. -%D Half lines of white space can however be handled when they -%D come in pairs. The corrections needed when crossing page -%D boundaries in the middle of such a pair, are handled by -%D macros that are (named) sort of fuzzy. This fuzzy mechanism -%D was written as an extension to the grid typesetting needed -%D for typesetting (part of) the \MAPS. -%D -%D \starttyping -%D \setuptyping -%D [before={\blank[halfline]}, -%D after={\blank[halfline]}] -%D \stoptyping - -\newif \iffuzzyvskip -\newif \iffuzzysnapdone -\newif \iffuzzysnapping -\newif \iffuzzysnapped -\chardef \fuzzysnappedleft=0 % ==1 when fuzzybegin still open -\newpersistentmark\fuzzymark % (!) -\newcount \fuzzymarker -\newbox \fuzzysnapbox -\newbox \fuzzysnapsplit - -\def\dosyncfuzzyvskip - {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint - \bgroup % - added 28/2/2003: check this, there was no - - \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal - \egroup - \fi\fi\fi} - -\def\fuzzyvskip#1% - {\iffuzzysnapdone - \dosyncfuzzyvskip % NEWER - \endfuzzysnapping - \vskip#1\relax - \global\fuzzysnapdonefalse - \else - \vskip#1\relax - \beginfuzzysnapping - \global\fuzzysnapdonetrue - \fi} - -\def\setfuzzymark#1#2#3% #1/#2 => error recovery - {\ifgridsnapping - \global\fuzzysnappingtrue - \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi - \nobreak - \ifshowfuzzyskips - \hbox{\color[grid:three] - {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak - \vrule\!!width\hsize\!!height.1\lineheight}} - \nobreak - \fi - %[\the\fuzzymarker] - %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% - \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% - \nobreak - \fi} - -\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd -\def\endfuzzysnapping {\setfuzzymark12\v!stop } % even - -\def\removelastfuzzyvskip - {\ifgridsnapping - \iffuzzysnapping - \ifdim\lastskip<\openlineheight - \else - \removelastskip - \fi - \else - \removelastskip - \fi - \else - \removelastskip - \fi} - -\def\docheckfuzzysnap#1% - {\bgroup - \dontcomplain - \setbox\fuzzysnapbox\copy#1\relax - \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight - \let\topfuzzymark\empty % indeed here ... no real mark - \getsplitmarks\fuzzymark -% \ifcase0\topfuzzymark - \ifcase0\rawgetsplittopmark\fuzzymark - \global\chardef\fuzzysnappedleft\zerocount - \global\fuzzysnappedfalse -% \else\ifodd\topfuzzymark - \else\ifodd\rawgetsplittopmark\fuzzymark - \global\chardef\fuzzysnappedleft\plusone - \global\fuzzysnappedtrue - \else - \global\chardef\fuzzysnappedleft=2 - \global\fuzzysnappedtrue - \fi\fi - \iffuzzysnapped \else - \doloop - {\ifvoid\fuzzysnapbox - \exitloop - \else - \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight - %\let\topfuzzymark=\empty % ... but not here - \getsplitmarks\fuzzymark -% \ifcase0\topfuzzymark - \ifcase0\rawgetsplittopmark\fuzzymark - % continue -% \else\ifodd\topfuzzymark - \else\ifodd\rawgetsplittopmark\fuzzymark - \exitloop - \else - \global\chardef\fuzzysnappedleft\plusone - \global\fuzzysnappedtrue - \exitloop - \fi\fi - \fi}% - \fi - \egroup} - -\def\getfuzzysnapcorrection#1% - {\global\let\presnapcorrection \relax - \global\let\postsnapcorrection\relax - \ifgridsnapping\iffuzzysnapping - \docheckfuzzysnap{#1}% - \iffuzzysnapped - \iftracegridsnapping - \gdef\presnapcorrection - {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}% - \else - \gdef\presnapcorrection{\kern.5\openlineheight}% - \fi - \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok - \fi - \fi\fi} - -\def\fuzzysnappedbox#1#2% \box \unvbox - {\getfuzzysnapcorrection{#2}% - \presnapcorrection - #1#2% - \postsnapcorrection} - -\def\adaptfuzzypagegoal - {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents - \scratchdimen\pagegoal - \advance\scratchdimen -.5\openlineheight - \global\pagegoal\scratchdimen - \global\advance\vsize -.5\openlineheight - \global\chardef\fuzzysnappedleft0 - \fi\fi\fi} - -%D New, experimental, used in caption snapping: -%D -%D \starttyping -%D \startcolumnset -%D -%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top] -%D -%D \placefigure [lrtb] {\dorecurse{5}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D \placefigure [lrtb] {\dorecurse{15}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D -%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom] -%D -%D \placefigure [rltb] {\dorecurse{5}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D \placefigure [rltb] {\dorecurse{15}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D -%D \input thuan -%D -%D \stopcolumnset -%D \stoptyping - -\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! ! - {\doifsomething{#2} - {\getnoflines{\ht#1}% no depth taken into account, depth preserved - \scratchdimen\noflines\lineheight - \advance\scratchdimen-\strutdp - \bgroup - \advance\scratchdimen-\onepoint % be a bit tolerant - \ifdim\scratchdimen>\ht#1\relax - \egroup - \doif{#2}\v!top {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}% - \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}% - \dp#1\strutdp - \else - \egroup - \ht#1\scratchdimen - \dp#1\strutdp - \fi}} - -%D New: - -\let\checkgridsnapping\relax - -\protect \endinput diff --git a/tex/context/base/core-spa.lua b/tex/context/base/core-spa.lua deleted file mode 100644 index e32e968e1..000000000 --- a/tex/context/base/core-spa.lua +++ /dev/null @@ -1,720 +0,0 @@ -if not modules then modules = { } end modules ['core-spa'] = { - version = 1.001, - comment = "companion to core-spa.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- this code dates from the beginning and is kind of experimental; it --- will be optimized and improved soon - -local next, type = next, type -local format, gmatch, concat = string.format, string.gmatch, table.concat -local texsprint, texlists = tex.sprint, tex.lists - -local ctxcatcodes = tex.ctxcatcodes - --- vertical space handler - -local trace_vbox_vspacing = false trackers.register("nodes.vbox_vspacing", function(v) trace_vbox_vspacing = v end) -local trace_page_vspacing = false trackers.register("nodes.page_vspacing", function(v) trace_page_vspacing = v end) -local trace_collect_vspacing = false trackers.register("nodes.collect_vspacing", function(v) trace_collect_vspacing = v end) -local trace_vspacing = false trackers.register("nodes.vspacing", function(v) trace_vspacing = v end) - -local skip_category = attributes.private('skip-category') -local skip_penalty = attributes.private('skip-penalty') -local skip_order = attributes.private('skip-order') -local snap_category = attributes.private('snap-category') -local display_math = attributes.private('display-math') - -local has_attribute = node.has_attribute -local unset_attribute = node.unset_attribute -local set_attribute = node.set_attribute -local find_node_tail = node.tail -local free_node = node.free -local copy_node = node.copy -local traverse_nodes = node.traverse -local insert_node_before = node.insert_before -local insert_node_after = node.insert_after -local remove_node = nodes.remove -local make_penalty_node = nodes.penalty -local count_nodes = nodes.count -local node_ids_to_string = nodes.ids_to_string -local hpack_node = node.hpack - -local glyph = node.id("glyph") -local penalty = node.id("penalty") -local kern = node.id("kern") -local glue = node.id('glue') -local hlist = node.id('hlist') -local vlist = node.id('vlist') -local adjust = node.id('adjust') - -vspacing = vspacing or { } - -vspacing.categories = { - [0] = 'discard', - [1] = 'largest', - [2] = 'force' , - [3] = 'penalty', - [4] = 'add' , - [5] = 'disable', - [6] = 'nowhite', - [7] = 'goback', -} - -local categories = vspacing.categories - -function vspacing.tocategories(str) - local t = { } - for s in gmatch(str,"[^, ]") do - local n = tonumber(s) - if n then - t[categories[n]] = true - else - t[b] = true - end - end - return t -end - -function vspacing.tocategory(str) - if type(str) == "string" then - return set.tonumber(vspacing.tocategories(str)) - else - return set.tonumber({ [categories[str]] = true }) - end -end - -vspacing.data = vspacing.data or { } -vspacing.data.map = vspacing.data.map or { } -vspacing.data.skip = vspacing.data.skip or { } - -storage.register("vspacing/data/map", vspacing.data.map, "vspacing.data.map") -storage.register("vspacing/data/skip", vspacing.data.skip, "vspacing.data.skip") - -do -- todo: interface.variables - - local function logger(c,s) - logs.report("vspacing",s) - texsprint(c,s) - end - - vspacing.fixed = false - - local map = vspacing.data.map - local skip = vspacing.data.skip - - local multiplier = lpeg.C(lpeg.S("+-")^0 * lpeg.R("09")^1) * lpeg.P("*") - local category = lpeg.P(":") * lpeg.C(lpeg.P(1)^1) - local keyword = lpeg.C((1-category)^1) - local splitter = (multiplier + lpeg.Cc(1)) * keyword * (category + lpeg.Cc(false)) - - local function analyse(str,oldcategory,texsprint) - for s in gmatch(str,"([^ ,]+)") do - local amount, keyword, detail = splitter:match(s) - if keyword then - local mk = map[keyword] - if mk then - category = analyse(mk,category,texsprint) - elseif keyword == "fixed" then - texsprint(ctxcatcodes,"\\fixedblankskip") - elseif keyword == "flexible" then - texsprint(ctxcatcodes,"\\flexibleblankskip") - elseif keyword == "category" then - local category = tonumber(detail) - if category then - texsprint(ctxcatcodes,format("\\setblankcategory{%s}",category)) - if category ~= oldcategory then - texsprint(ctxcatcodes,"\\flushblankhandling") - oldcategory = category - end - end - elseif keyword == "order" and detail then - local order = tonumber(detail) - if order then - texsprint(ctxcatcodes,format("\\setblankorder{%s}",order)) - end - elseif keyword == "penalty" and detail then - local penalty = tonumber(detail) - if penalty then - texsprint(ctxcatcodes,format("\\setblankpenalty{%s}",penalty)) - texsprint(ctxcatcodes,"\\flushblankhandling") - end - else - amount = tonumber(amount) or 1 - local sk = skip[keyword] - if sk then - texsprint(ctxcatcodes,format("\\addblankskip{%s}{%s}{%s}",amount,sk[1],sk[2] or sk[1])) - else -- no check - texsprint(ctxcatcodes,format("\\addblankskip{%s}{%s}{%s}",amount,keyword,keyword)) - end - end - else - logs.report("vspacing","unknown directive: %s",s) - end - end - return category - end - - function vspacing.analyse(str) - local texsprint = (trace_vspacing and logger) or texsprint - texsprint(ctxcatcodes,"\\startblankhandling") - analyse(str,1,texsprint) - texsprint(ctxcatcodes,"\\stopblankhandling") - end - - -- - - function vspacing.setmap(from,to) - map[from] = to - end - - function vspacing.setskip(key,value,grid) - if value ~= "" then - if grid == "" then grid = value end - skip[key] = { value, grid } - end - end - -end - --- implementation - -nodes.snapvalues = { } - -function nodes.setsnapvalue(n,ht,dp) - nodes.snapvalues[n] = { ht, dp, ht+dp } -end - -local trace_list, tracing_info, before, after = { }, false, "", "" - -local function glue_to_string(glue) - local spec = glue.spec - if spec then - local t = { } - t[#t+1] = aux.strip_zeros(number.topoints(spec.width)) - if spec.stretch_order and spec.stretch_order ~= 0 then - t[#t+1] = format("plus -%sfi%s",spec.stretch/65536,string.rep("l",math.abs(spec.stretch_order)-1)) - elseif spec.stretch and spec.stretch ~= 0 then - t[#t+1] = format("plus %s",aux.strip_zeros(number.topoints(spec.stretch))) - end - if spec.shrink_order and spec.shrink_order ~= 0 then - t[#t+1] = format("minus -%sfi%s",spec.shrink/65536,string.rep("l",math.abs(spec.shrink_order)-1)) - elseif spec.shrink and spec.shrink ~= 0 then - t[#t+1] = format("minus %s",aux.strip_zeros(number.topoints(spec.shrink))) - end - return concat(t," ") - else - return "[0pt]" - end -end - -local function nodes_to_string(head) - local current, t = head, { } - while current do - local id = current.id - local ty = node.type(id) - if id == penalty then - t[#t+1] = format("%s:%s",ty,current.penalty) - elseif id == glue then - if current.spec then - t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.spec.width))) - else - t[#t+1] = format("%s:[0pt]",ty) - end - elseif id == kern then - t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.kern))) - else - t[#t+1] = ty - end - current = current.next - end - return concat(t," + ") -end - -local function reset_tracing(head) - trace_list, tracing_info, before, after = { }, false, nodes_to_string(head), "" -end - -local function trace_skip(str,sc,so,sp,data) - trace_list[#trace_list+1] = { "skip", format("%s | %s | category %s | order %s | penalty %s", str, glue_to_string(data), sc or "-", so or "-", sp or "-") } - tracing_info = true -end - -local function trace_natural(str,data) - trace_list[#trace_list+1] = { "skip", format("%s | %s", str, glue_to_string(data)) } - tracing_info = true -end - -local function trace_info(message, where, what) - trace_list[#trace_list+1] = { "info", format("%s: %s/%s",message,where,what) } -end - -local function trace_node(what) - local nt = node.type(what.id) - local tl = trace_list[#trace_list] - if tl[1] == "node" then - trace_list[#trace_list] = { "node", tl[2] .. " + " .. nt } - else - trace_list[#trace_list+1] = { "node", nt } - end -end - -local function trace_done(str,data) - if data.id == penalty then - trace_list[#trace_list+1] = { "penalty", format("%s | %s", str, data.penalty) } - else - trace_list[#trace_list+1] = { "glue", format("%s | %s", str, glue_to_string(data)) } - end - tracing_info = true -end - -local function show_tracing(head) - if tracing_info then - after = nodes_to_string(head) - for i=1,#trace_list do - local tag, text = unpack(trace_list[i]) - if tag == "info" then - logs.report("collapse",text) - else - logs.report("collapse"," %s: %s",tag,text) - end - end - logs.report("collapse","before: %s",before) - logs.report("collapse","after : %s",after) - end -end - --- alignment box begin_of_par vmode_par hmode_par insert penalty before_display after_display - -local user_skip = 0 -local line_skip = 1 -local baseline_skip = 2 -local par_skip = 3 -local above_display_skip = 4 -local below_display_skip = 5 -local above_display_short_skip = 6 -local below_display_short_skip = 7 -local left_skip_code = 8 -local right_skip_code = 9 -local top_skip_code = 10 -local split_top_skip_code = 11 -local tab_skip_code = 12 -local space_skip_code = 13 -local xspace_skip_code = 14 -local par_fill_skip_code = 15 -local thin_mu_skip_code = 16 -local med_mu_skip_code = 17 -local thick_mu_skip_code = 18 - -local skips = { - [ 0] = "user_skip", - [ 1] = "line_skip", - [ 2] = "baseline_skip", - [ 3] = "par_skip", - [ 4] = "above_display_skip", - [ 5] = "below_display_skip", - [ 6] = "above_display_short_skip", - [ 7] = "below_display_short_skip", - [ 8] = "left_skip_code", - [ 9] = "right_skip_code", - [10] = "top_skip_code", - [11] = "split_top_skip_code", - [12] = "tab_skip_code", - [13] = "space_skip_code", - [14] = "xspace_skip_code", - [15] = "par_fill_skip_code", - [16] = "thin_mu_skip_code", - [17] = "med_mu_skip_code", - [18] = "thick_mu_skip_code", -} - -local free_glue_node = free_node -local free_glue_spec = free_node -local discard, largest, force, penalty, add, disable, nowhite, goback = 0, 1, 2, 3, 4, 5, 6, 7 - -local function collapser(head,where,what,trace) -- maybe also pass tail - if trace then - reset_tracing(head) - trace_info("start analyzing",where,what) - end - local current = head - local glue_order, glue_data = 0, nil - local penalty_order, penalty_data, natural_penalty = 0, nil, nil - local parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false - while current do - local id = current.id - if id == glue and current.subtype == 0 then -- todo, other subtypes, like math - local sc = has_attribute(current,skip_category) -- has no default, no unset (yet) - local so = has_attribute(current,skip_order ) or 1 -- has 1 default, no unset (yet) - local sp = has_attribute(current,skip_penalty ) -- has no degault, no unset (yet) - if not sc then - if glue_data then - if trace then trace_done("flush",glue_data) end - head, current = nodes.before(head,current,glue_data) - if trace then trace_natural("natural",current) end - else - -- not look back across head - local previous = current.prev - if previous and previous.id == glue and previous.subtype == 0 then - local ps = previous.spec - if ps then - local cs = current.spec - if cs and ps.stretch_order == 0 and ps.shrink_order == 0 and cs.stretch_order == 0 and cs.shrink_order == 0 then - local pw, pp, pm = ps.width, ps.stretch, ps.shrink - local cw, cp, cm = cs.width, cs.stretch, cs.shrink - ps.width, ps.stretch, ps.shrink = pw + cw, pp + cp, pm + cm - if trace then trace_natural("removed",current) end - head, current = remove_node(head, current, true) - current = previous - if trace then trace_natural("collapsed",current) end - else - if trace then trace_natural("filler",current) end - end - else - if trace then trace_natural("natural (no prev spec)",current) end - end - else - if trace then trace_natural("natural (no prev)",current) end - end - end - glue_order, glue_data = 0, nil - if current then - current = current.next - end - else - if sc == disable then - ignore_following = true - if trace then trace_skip("disable",sc,so,sp,current) end - head, current = remove_node(head, current, true) - elseif sc == nowhite then - ignore_whitespace = true - head, current = remove_node(head, current, true) - elseif sc == discard then - if trace then trace_skip("discard",sc,so,sp,current) end - head, current = remove_node(head, current, true) - else - if sp then - if not penalty_data then - penalty_data = sp - elseif penalty_order < so then - penalty_order, penalty_data = so, sp - elseif penalty_order == so and sp > penalty_data then - penalty_data = sp - end - end - if ignore_following then - if trace then trace_skip("disabled",sc,so,sp,current) end - head, current = remove_node(head, current, true) - elseif not glue_data then - if trace then trace_skip("assign",sc,so,sp,current) end - glue_order = so - head, current, glue_data = remove_node(head, current) - elseif glue_order < so then - if trace then trace_skip("force",sc,so,sp,current) end - glue_order = so - free_glue_node(glue_data) - head, current, glue_data = remove_node(head, current) - elseif glue_order == so then - -- is now exclusive, maybe support goback as combi, else why a set - if sc == largest then - local cs, gs = current.spec, glue_data.spec - local cw = (cs and cs.width) or 0 - local gw = (gs and gs.width) or 0 - if cw > gw then - if trace then trace_skip('largest',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - head, current, glue_data = remove_node(head, current) - else - if trace then trace_skip('remove smallest',sc,so,sp,current) end - head, current = remove_node(head, current, true) - end - elseif sc == goback then - if trace then trace_skip('goback',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - head, current, glue_data = remove_node(head, current) - elseif sc == force then - -- todo: inject kern - if trace then trace_skip('force',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - head, current, glue_data = remove_node(head, current) - elseif sc == penalty then - if trace then trace_skip('penalty',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - glue_data = nil - head, current = remove_node(head, current, true) - elseif sc == add then - if trace then trace_skip('add',sc,so,sp,current) end - local old, new = glue_data.spec, current.spec - old.width = old.width + new.width - old.stretch = old.stretch + new.stretch - old.shrink = old.shrink + new.shrink - -- toto: order - head, current = remove_node(head, current, true) - else - if trace then trace_skip("unknown",sc,so,sp,current) end - head, current = remove_node(head, current, true) - end - else - if trace then trace_skip("unknown",sc,so,sp,current) end - head, current = remove_node(head, current, true) - end - end - end - elseif id == penalty then - --~ natural_penalty = current.penalty - --~ if trace then trace_done("removed penalty",current) end - --~ head, current = remove_node(head, current, true) - current = current.next - elseif id == glue and current.subtype == 2 then - local sn = has_attribute(current,snap_category) - if sn then - -- local sv = nodes.snapvalues[sn] - -- if sv then - if trace then trace_natural("removed baselineskip",current) end - head, current = remove_node(head, current, true) - -- else - -- current = current.next - -- end - else - if trace then trace_natural("keep baselineskip",current) end - current = current.next - end - elseif id == glue and current.subtype == 3 then - -- parskip always comes later - if ignore_whitespace then - if trace then trace_natural("ignored parskip",current) end - head, current = remove_node(head,current,true) - elseif glue_data then - local ps, gs = current.spec, glue_data.spec - if ps and gs and ps.width > gs.width then - -- free_glue_spec(glue_data.spec) -- result in double free - glue_data.spec = copy_node(ps) - if trace then trace_natural("taking parskip",current) end - else - if trace then trace_natural("removed parskip",current) end - end - head, current = remove_node(head, current,true) - else - if trace then trace_natural("honored parskip",current) end - head, current, glue_data = remove_node(head, current) - end - --~ if trace then trace_natural("removed parskip",current) end - --~ current.spec = nil - --~ current = current.next - else --- reversed - if penalty_data then - local p = make_penalty_node(penalty_data) - if trace then trace_done("flushed",p) end - head, current = insert_node_before(head,current,p) - penalty_data = nil - end - if glue_data then - if trace then trace_done("flushed",glue_data) end - head, current = insert_node_before(head,current,glue_data) - glue_order, glue_data = 0, nil - end - if trace then trace_node(current) end - if id == hlist and where == 'hmode_par' then - local list = current.list - if list then - local sn = has_attribute(list,snap_category) - if sn then - local sv = nodes.snapvalues[sn] - if sv then - local height, depth, lineheight = sv[1], sv[2], sv[3] - -- is math.ceil really needed? - current.height = math.ceil((current.height-height)/lineheight)*lineheight + height - current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth - end - end - end - end - current = current.next - end - end - if trace then trace_info("stop analyzing",where,what) end - --~ if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then - --~ penalty_data = natural_penalty - --~ end - if trace and (glue_data or penalty_data) then - trace_info("start flushing",where,what) - end - local tail - if penalty_data then - tail = find_node_tail(head) - local p = make_penalty_node(penalty_data) - if trace then trace_done("result",p) end - head, tail = insert_node_after(head,tail,p) - end - if glue_data then - if not tail then tail = find_node_tail(head) end - if trace then trace_done("result",glue_data) end - head, tail = insert_node_after(head,tail,glue_data) - end - if trace then - if glue_data or penalty_data then - trace_info("stop flushing",where,what) - end - show_tracing(head) - end - return head, true -end - --- alignment after_output end box new_graf vmode_par hmode_par insert penalty before_display after_display --- \par -> vmode_par --- --- status.best_page_break --- tex.lists.best_page_break --- tex.lists.best_size (natural size to best_page_break) --- tex.lists.least_page_cost (badness of best_page_break) --- tex.lists.page_head --- tex.lists.contrib_head - -local stackhead, stacktail, stackhack = nil, nil, false - -local function report(message,lst) - logs.report("vspacing",message,count_nodes(lst,true),node_ids_to_string(lst)) -end - -function nodes.handle_page_spacing(where) - local newhead = texlists.contrib_head - if newhead then - statistics.starttiming(vspacing) - local newtail = find_node_tail(newhead) - local flush = false - for n in traverse_nodes(newhead) do -- we could just look for glue nodes - local id = n.id - if id == glue then - if n.subtype == 0 then - if has_attribute(n,skip_category) then - stackhack = true - else - flush = true - end - else - -- tricky - end - else - flush = true - end - end - if flush then - if stackhead then - if trace_collect_vspacing then report("appending %s nodes to stack (final): %s",newhead) end - stacktail.next = newhead - newhead.prev = stacktail - newhead = stackhead - stackhead, stacktail = nil, nil - end - if stackhack then - stackhack = false - if trace_collect_vspacing then report("processing %s nodes: %s",newhead) end - texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing) - else - if trace_collect_vspacing then report("flushing %s nodes: %s",newhead) end - texlists.contrib_head = newhead - end - else - if stackhead then - if trace_collect_vspacing then report("appending %s nodes to stack (intermediate): %s",newhead) end - stacktail.next = newhead - newhead.prev = stacktail - else - if trace_collect_vspacing then report("storing %s nodes in stack (initial): %s",newhead) end - stackhead = newhead - end - stacktail = newtail - texlists.contrib_head = nil - end - statistics.stoptiming(vspacing) - end -end - -local ignore = table.tohash { - "split_keep", - "split_off", - -- "vbox", -} - -function nodes.handle_vbox_spacing(head,where) - if head and not ignore[where] and head.next then - statistics.starttiming(vspacing) - head = collapser(head,"vbox",where,trace_vbox_vspacing) - statistics.stoptiming(vspacing) - end - return head -end - -statistics.register("v-node processing time", function() - if statistics.elapsedindeed(vspacing) then - return format("%s seconds", statistics.elapsedtime(vspacing)) - end -end) - --- these are experimental callback definitions that definitely will --- be moved elsewhere as part of a chain of vnode handling - -function vspacing.enable() ---~ callback.register('vpack_filter', nodes.handle_vbox_spacing) - callback.register('buildpage_filter', nodes.handle_page_spacing) -end - -function vspacing.disable() - callback.register('vpack_filter', nil) - callback.register('buildpage_filter', nil) -end - --- we will split this module hence the locals - -local attribute = attributes.private('graphicvadjust') - -local hlist = node.id('hlist') -local vlist = node.id('vlist') - -local remove_node = nodes.remove -local hpack_node = node.hpack -local has_attribute = node.has_attribute - -function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only - if groupcode == "" then -- mvl only - local h, p, done = head, nil, false - while h do - local id = h.id - if id == hlist or id == vlist then - local a = has_attribute(h,attribute) - if a then - if p then - local n - head, h, n = remove_node(head,h) - local pl = p.list - if n.width ~= 0 then - n = hpack_node(n,0,'exactly') - end - if pl then - pl.prev = n - n.next = pl - end - p.list = n - done = true - else - -- can't happen - end - else - p = h - h = h.next - end - else - h = h.next - end - end - return head, done - else - return head, false - end -end - ---~ tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust") diff --git a/tex/context/base/core-spa.mkii b/tex/context/base/core-spa.mkii deleted file mode 100644 index 4f365b498..000000000 --- a/tex/context/base/core-spa.mkii +++ /dev/null @@ -1,4656 +0,0 @@ -%D \module -%D [ file=core-spa, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Spacing, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Core Macros / Spacing} - -% to be sorted out: dependencies, order of initialization / also some dutch code here - -\unprotect - -% some will move to core-var - -\newif \ifgridsnapping -\newif \iffuzzyvskip -\let \fuzzyvskip \gobbleoneargument -\let \removelastfuzzyvskip \relax - -\let \startbaselinecorrection \relax -\let \stopbaselinecorrection \relax -\let \baselinecorrection \relax -\let \offbaselinecorrection \relax - -\appendtoks \spacing 1\to \everybodyfont -\appendtoks \presetnormallineheight \to \everybodyfont -\appendtoks \setnormalbaselines \to \everybodyfont % check if redundant -\appendtoks \setstrut \to \everybodyfont % check if redundant -\appendtoks \settopskip \to \everybodyfont -\appendtoks \setmaxdepth \to \everybodyfont -%appendtoks \spacing 1\to \everybodyfont -\appendtoks \simplesetupindenting \to \everybodyfont -\appendtoks \simplesetupblank \to \everybodyfont -\appendtoks \simplesetupwhitespace \to \everybodyfont -%appendtoks \checknotes \to \everybodyfont % not -\appendtoks \simplesetupspacing \to \everybodyfont % nieuw -\appendtoks \setrelativeinterlinespace \to \everybodyfont - -\appendtoks \updateraggedskips \to \everyfontswitch % under test -\prependtoks \let\par\endgraf \to \everypagebody % see \fillinline -\appendtoks \simplesetupspacing \to \everydefinedfont - -% if you want to hyphenate the first word of a paragraph ... \appendtoks\hskip0pt\to\everypar - -\def\stelfactorenin - {\simplesetupwhitespace - \simplesetupblank - \settopskip - \setmaxdepth} - -\def\softbreak - {\relax\ifhmode\hskip\parfillskip\break\fi} - -\let\poplastnode\relax - -\def\pushlastnode - {\ifdim\lastskip=\zeropoint - \ifnum\lastpenalty=\zerocount - \ifnum\lastkern=\zerocount - \let\poplastnode\relax - \else - \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested - \fi - \else - \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested - \fi - \else - \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip - \fi} - -%D The dreadful sequence \type {\bgroup} \unknown\ -%D \type {\carryoverpar} \unknown\ \type {\egroup} is needed -%D when for instance sidefloats are used in combination with -%D something that starts with a group. This is because -%D otherwise the indentation as set (by the output routine) -%D inside the group are forgotten afterwards. (I must -%D not forget its existence). - -\global\let\carriedoverpar\relax - -\def\carryoverpar#1% - {\expanded % \scratchtoks{#1}% - {\noexpand#1% \the\scratchtoks - \hangindent\the\hangindent - \hangafter \the\hangafter - \parskip \the\parskip - \leftskip \the\leftskip - \rightskip \the\rightskip}} - -%D A quick way to determine left|/|middle|/|right states -%D (experimental). - -\setvalue{\??as\v!left }{0} -\setvalue{\??as\v!middle}{1} -\setvalue{\??as\v!right }{2} - -\def\setalignmentswitch#1% - {\chardef\alignmentswitch0\csname\??as#1\endcsname\relax} - -%D There are two ways to influence the interline spacing. The -%D most general and often most consistent way is using -%D -%D \showsetup{setupinterlinespace} -%D -%D For instance -%D -%D \starttyping -%D \setupinterlinespace[line=2.8ex] -%D \stoptyping -%D -%D This setting adapts itself to the bodyfontsize, while for -%D instance saying -%D -%D \starttyping -%D \setupinterlinespace[line=12pt] -%D \stoptyping -%D -%D sets things fixed for all sizes, which is definitely not -%D what we want. Therefore one can also say: -%D -%D \starttyping -%D \definebodyfontenvironment[9pt][interlinespace=11pt] -%D \stoptyping -%D -%D One can still use \type{\setupinterlinespace} (without -%D arguments) to set the interline space according to the -%D current font, e.g. a \type{\bfa}. - -\newif\iflocalinterlinespace - -% font-ini - -\ifx\bodyfontinterlinespecs\undefined - - \let\bodyfontinterlinespecs\empty - \let\bodyfontinterlinespace\empty - -\fi - -\def\presetnormallineheight - {\edef\normallineheight{\@@itline}% -% done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed - \iflocalinterlinespace \else - \doifdefined\bodyfontinterlinespecs - {\doifsomething\bodyfontinterlinespace - {\edef\normallineheight{\bodyfontinterlinespace}}}% - \fi} - -\def\setupspecifiedinterlinespace[#1]% - {\getparameters[\??it][#1]% - \scratchdimen0\@@itheight\points - \advance\scratchdimen 0\@@itdepth\points - \ifdim\scratchdimen>\onepoint - \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}% - \let\@@itheight\strutheightfactor - \let\@@itdepth \strutdepthfactor - \else - \let\strutheightfactor\@@itheight - \let\strutdepthfactor \@@itdepth - \fi - \let\minimumstrutheight \@@itminheight - \let\minimumstrutdepth \@@itmindepth - \let\minimumlinedistance\@@itdistance - \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex - \doifelse\@@ittop\v!height % new, topskip does more bad than good - {\let\topskipfactor \@@itheight} - {\let\topskipfactor \@@ittop }% - \let\maxdepthfactor \@@itbottom - \let\baselinegluefactor \@@itstretch - \setfontparameters % redundant, can be \setstrut, test first - \updateraggedskips} % yes indeed - -% \let\currentrelativeinterlinespace\empty -% -% \def\setuprelativeinterlinespace[#1]% -% {\processallactionsinset -% [#1] -% [ \v!on=>\oninterlineskip, -% \v!off=>\offinterlineskip, -% \v!reset=>\let\currentrelativeinterlinespace\empty -% \setfontparameters,% just \setstrut, test first -% \s!unknown=>\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}% -% \spacing\currentrelativeinterlinespace]} - -% \setupinterlinespace[big] \switchtobodyfont[11pt] -> forgotten -% \setupinterlinespace[auto,big] \switchtobodyfont[11pt] -> remembered - -\let\currentrelativeinterlinespace\empty - -\def\setuprelativeinterlinespace[#1]% - {\processallactionsinset - [#1] - [ \v!on=>\oninterlineskip, - \v!off=>\offinterlineskip, - \v!reset=>\let\currentrelativeinterlinespace\empty - \let\setrelativeinterlinespace\relax - \setfontparameters, - \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace, - \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}% - \spacing\currentrelativeinterlinespace]} - -\def\dosetrelativeinterlinespace - {\ifx\currentrelativeinterlinespace\empty\else - \spacing\currentrelativeinterlinespace - \fi} - -\let\setrelativeinterlinespace\relax - -% \appendtoks \setrelativeinterlinespace \to \everybodyfont - -\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1 - {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]} - -\def\setuplocalinterlinespace[#1]% - {\localinterlinespacetrue - \setupinterlinespace[#1]% - \localinterlinespacefalse} - -\def\simplesetupinterlinespace - {\localinterlinespacetrue - \setfontparameters - \updateraggedskips % funny one here - \localinterlinespacefalse} - -\definecomplexorsimple\setupinterlinespace - -% In earlier versions \type{\bigskipamount} was -% \type{\ht\strutbox} and the stretch was plus or minus -% \type{.4\dp\strutbox}. Don't ask me why. The most recent -% implementation is based on a user supplied distance, which -% is by default \type{.75\normalskipamount} where -% \type{\normalskipamount} equals the current baseline -% distance. - -% \lineskiplimit = -\maxdimen -> freezes baselineskip - -% can be conditionals - -\newif\ifblanknowhite \blanknowhitefalse -\newif\ifblankindeed \blankindeedfalse -\newif\ifblankreset \blankresetfalse -\newif\ifblankdisable \blankdisablefalse -\newif\ifblankflexible \blankflexibletrue -\newif\ifblankouter -\newif\ifblankforce -\newif\ifblankgoback - -\newskip\blankskip \blankskip=\bigskipamount -\newskip\blankskipamount - -\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 - -\newif\iflocalblankfixed -\newif\iflocalblankflexible - -\def\geenblanko{\removelastskip} % will become obsolete - -%%%% pas op, wordt ook in core-pos gebruikt - -\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap - {\doifelse{#1}\v!line - {#2\openlineheight} - {\ifgridsnapping - \assigndimension{#1}{#2}{.25\openlineheight}{.5\openlineheight}\openlineheight - \else - \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount - \fi}% - \relax} - -% \relax is really needed, else we may loose stretch due to lookahead; somehow -% this bug was introduced a while ago but somehow went unnoticed; fixed 2/7/2008 - -\def\addblankskip#1#2#3{\global\advance\blankskip#1\ifgridsnapping#3\else#2\fi\relax} - -\def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}} - -\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight} -\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight} -\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}} -\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}} -\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}} -\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}} -\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight} -\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight} -\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight} -\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight} - -\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount} -\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue} -\defineblankmethod [\v!disable] {\global\blankdisabletrue} -\defineblankmethod [\v!force] {\global\blankforcetrue} -\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi} -\defineblankmethod [\v!reset] {\global\blankresettrue} -\defineblankmethod [\v!flexible] {\global\localblankflexibletrue} -\defineblankmethod [\v!fixed] {\global\localblankfixedtrue} -\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko} -\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi - \global\advance\blankskip .5\lineheight} -\defineblankmethod [\v!none] {\global\blankresettrue} -\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} -\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut} - -% \vtop{\blank[synchronize]\blank[line]test} - -\defineblankmethod [\v!always] {\redowhitespace} % experimental - -% happens often, so we speed this up: -% -% \defineblankmethod [2*\v!line] {\addblankskip+{2\openlineheight}{2\openlineheight}} -% \defineblankmethod [2*\v!big] {\addblankskip+{2\bigskipamount }{2\openlineheight}} -% -% no, with 2\whatever we loose the stretch and shrink! Taco's alternative: - -\defineblankmethod - [2*\v!line] - {\addblankskip+\openlineheight\openlineheight - \addblankskip+\openlineheight\openlineheight} - -\defineblankmethod - [2*\v!big] - {\addblankskip+\bigskipamount\openlineheight - \addblankskip+\bigskipamount\openlineheight} - -\def\doblank#1% - {\edefconvertedargument\ascii{#1}% - \ifx\ascii\empty\else - \ifcsname\??bo\??bo\ascii\endcsname % internal def - \csname\??bo\??bo\ascii\endcsname - \else\ifcsname\??bo\ascii\endcsname % user def / slow - \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax - \else - \dorepeatwithcommand[#1]\redoblank - \fi\fi - \fi - \relax} - -\def\redoblank#1% - {\edefconvertedargument\ascii{#1}% - \ifx\ascii\empty\else - \ifcsname\??bo\??bo\ascii\endcsname % internal def - \csname\??bo\??bo\ascii\endcsname - \else\ifcsname\??bo\ascii\endcsname % user def / slow - \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax - \else - \global\advance\blankskip#1\relax - \fi\fi - \fi - \relax} - -\unexpanded\def\blank % the \relax is definitely needed due to the many \if's - {\relax\complexorsimple\doblank} - -\def\complexdoblank - {\flushnotes - \ifmmode - \@EA\nocomplexdoblank - \else - \ifopelkaar - \ifinpagebody - \@EA\@EAEAEA\@EA\docomplexdoblank - \else - \@EA\@EAEAEA\@EA\nocomplexdoblank - \fi - \else - \@EAEAEA\docomplexdoblank - \fi - \fi} - -\def\nocomplexdoblank[#1]% - {% evt blokkeerfalse - \ifmmode\else\par\fi} - -% Overloaded in cont-new! - -\newsignal\noblanksignal - -% \def\doinhibitblank -% {\kern\noblanksignal} - -% \def\inhibitblank% the fast, local way -% {\endgraf\ifvmode\prevdepth\newprevdepth\fi} - -% \def\docomplexdoblank[#1]% pas op \relax's zijn nodig ivm volgende \if -% {\global\blankresetfalse -% \global\blankdisablefalse -% \global\blanknowhitefalse -% \global\localblankflexiblefalse -% \global\localblankfixedfalse -% \global\blankskip\zeropoint -% \global\blankforcefalse -% \global\blankgobackfalse -% \blankouterfalse -% \expanded{\rawprocesscommalist[#1]}\doblank -% \ifdim\blankskip=\zeropoint\relax -% \iflocalblankflexible -% \doglobal\advance\blankskip \currentblank -% \else\iflocalblankfixed -% \doglobal\advance\blankskip \currentblank -% \fi\fi -% \fi -% \ifblankouter -% \else -% \par -% \ifvmode -% \ifblankgoback -% \removelastskip -% \fi -% \ifblankforce -% % dit gaat mis in pos fonts -% % \ifdim\prevdepth>\zeropoint\else ... -% % -1000pt signals top of page or column (\ejectcolumn) -% \bgroup\forgeteverypar\verticalstrut\egroup\kern-\struttotal -% \fi -% \ifblankdisable -% \global\blankindeedfalse -% \ifgridsnapping -% \ifdim\prevdepth<\zeropoint -% % brrr -% \else -% % dirty trick: smaller blanks are ignored after -% % a larger one, so 10 lines is probably safe; first make -% % sure that we honor penalties -% \scratchcounter\lastpenalty -% % now comes the trick (cross our fingers that this works -% % well in multi columns; maybe an ifinner test is needed -% % \vskip-10\lineheight -% % \ifnum\scratchcounter=\zerocount \else \penalty\lastpenalty \fi -% % \vskip 10\lineheight -% % allas, this leads to overfull pages, so we try this: -% \kern-\noblanksignal -% \ifnum\scratchcounter=\zerocount -% \else -% \penalty\lastpenalty -% \fi -% \kern\noblanksignal -% % end-of-dirty-trick -% \fi -% \else -% \ifdim\prevdepth<\zeropoint -% % brrr -% \else -% % ensure at least a proper prevdepth, this should be -% % an option -% \vskip-\prevdepth -% \vskip\strutdepth -% \prevdepth\strutdepth -% \fi -% % the old crappy piece of code -% \edef\oldprevdepth{\the\prevdepth}% -% \prevdepth\newprevdepth -% \fi -% \else -% \global\blankindeedtrue -% \fi -% \ifblankreset -% \global\blankindeedtrue -% \ifgridsnapping -% % let's play safe and not fool around with the depth, if -% % only because it took a lot of effort to sort out the grid -% % stuff in the first place -% \else -% \ifdim\prevdepth=\newprevdepth -% \prevdepth\oldprevdepth -% \fi -% \fi -% \fi -% \ifblankindeed -% \ifdim1\lastskip<1\blankskip\relax -% % else when \blanko[2*groot] + \blanko[3*groot] with parskip -% % equaling 1*groot, gives a groot=\parskip so adding a small -% % value makes it distinguishable; can also be done at parskip -% % setting time (better) -% \global\advance\blankskip \mindimen\relax % = skip -% % test this on 2* + 3* and parskip groot -% \ifblanknowhite -% \global\advance\blankskip -\parskip -% \else -% \ifdim\lastskip=\parskip -% \else % force this due to previous comment -% \ifdim\parskip>\zeropoint\relax -% \ifdim\blankskip<\parskip\relax -% \global\blankskip\zeropoint -% \else -% \global\advance\blankskip -\parskip -% \fi -% \fi -% \fi -% \fi -% \ifblankflexible \else -% \blankskip1\blankskip -% \fi -% \iflocalblankfixed -% \blankskip1\blankskip -% \fi -% \iflocalblankflexible -% \blankskip1\blankskip -% \!!plus\skipgluefactor\blankskip -% \!!minus\skipgluefactor\blankskip -% \fi -% \ifdim\lastkern=\noblanksignal % controled and grid -% \global\blankindeedfalse -% \else\ifgridsnapping\else\ifdim\prevdepth=\newprevdepth -% \global\blankindeedfalse -% \fi\fi\fi -% \ifblankindeed -% \iffuzzyvskip -% \removelastfuzzyvskip -% \fuzzyvskip\blankskip\relax -% \else -% \removelastskip -% \vskip\blankskip\relax -% \fi -% \fi -% \else -% \iffuzzyvskip -% \removelastfuzzyvskip -% \fuzzyvskip\blankskip\relax -% \else -% % new, test this on pascal -% \ifdim\blankskip<\zeropoint -% \advance\blankskip-\lastskip -% \removelastskip -% \ifdim\blankskip>\zeropoint -% \vskip\blankskip -% \else -% \vskip\zeropoint -% \fi -% \else -% % also new -% \ifdim\blankskip=\zeropoint -% \ifblanknowhite -% \geenwitruimte -% \fi -% \fi -% \fi -% \fi -% \fi -% \fi -% \fi -% \fi -% \global\fuzzyvskipfalse -% \presetindentation} - -% goback was broken: - -% \def\doinhibitblank -% {\kern\noblanksignal} - -% \def\inhibitblank% the fast, local way -% {\endgraf\ifvmode\prevdepth\newprevdepth\fi} - -% problem: we cannot look back in the mvl so we need 3 kinds of signals - -\def\noblankpsignal{1010101} - -\def\inhibitgridblank % was doinhibitblank - {\ifvmode\else\endgraf\fi - \ifvmode - \ifnum\lastpenalty<10000 - \kern-\noblanksignal % new - \kern \noblanksignal - \else - \penalty\noblankpsignal - \fi - \fi} - -\def\inhibittextblank % was inhibitblank - {\endgraf - \ifvmode - \prevdepth\newprevdepth - \fi} - -% new macro -% -% \def\inhibitblank % need some work -% {\endgraf -% \ifvmode -% \ifgridsnapping -% \inhibitgridblank -% \else -% % this one spoils the grid -% \inhibittextblank -% \fi -% \fi} - -\def\doinhibitblank{\inhibitgridblank} -\def\inhibitblank {\inhibittextblank} - -% will become obsolete - -\ifx\undefined\savedlastskip \newskip \savedlastskip \fi -\ifx\undefined\savedlastpenalty \newcount\savedlastpenalty \fi - -% beware, prevdepth can have funny values (e.g. mvl value when in box) - -\def\docomplexdoblank[#1]% pas op \relax's zijn nodig ivm volgende \if - {\global\blankresetfalse - \global\blankdisablefalse - \global\blanknowhitefalse - \global\localblankflexiblefalse - \global\localblankfixedfalse - \global\blankforcefalse - \global\blankgobackfalse - \blankouterfalse - \global\blankskip\zeropoint -% -\edefconvertedargument\ascii{#1}% todo fast check for simple -\ifcsname\??bo\??bo\ascii\endcsname % internal def - \csname\??bo\??bo\ascii\endcsname -\else\ifcsname\??bo\ascii\endcsname % user def / slow - \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax -\else - \expanded{\rawprocesscommalist[#1]}\doblank -\fi\fi -% - \relax % to be sure - \ifdim\blankskip=\zeropoint\relax - \iflocalblankflexible - \doglobal\advance\blankskip \currentblank - \else\iflocalblankfixed - \doglobal\advance\blankskip \currentblank - \fi\fi - \fi - \relax % to be sure - \ifblankouter - % do nothing - \else - \par - \ifvmode - \ifblankgoback - \ifdim\lastskip>\zeropoint \vskip-\lastskip \fi - \savedlastskip\zeropoint - \else\ifdim\lastskip>\zeropoint - \savedlastskip\lastskip - \else % todo: lastnode, dan namelijk geen skip ! - \savedlastskip\zeropoint - \fi\fi - \ifblankforce - % dit gaat mis in pos fonts - % \ifdim\prevdepth>\zeropoint\else ... - % -1000pt signals top of page or column (\ejectcolumn) - \bgroup\forgeteverypar\verticalstrut\egroup\kern-\struttotal - \savedlastskip\zeropoint - \fi - \savedlastpenalty\lastpenalty % hm, now it gets lost - \ifblankdisable - \global\blankindeedfalse % keep this, i.e. disable current too - \ifgridsnapping - \ifdim\prevdepth<\zeropoint - % brrr - \else - % dirty trick: smaller blanks are ignored after a - % larger one, so 10 lines is probably safe; we need - % to make sure that we honor penalties; here comes the - % trick (cross our fingers that this works well in - % multi columns; maybe an ifinner test is needed - % \scratchcounter\lastpenalty - % \vskip-10\lineheight - % \ifnum\scratchcounter=\zerocount \else \penalty\lastpenalty \fi - % \vskip 10\lineheight - % alas, this leads to overfull pages, so we try this: - \inhibitgridblank - \fi - \else - \ifdim\prevdepth<\zeropoint - % brrr - \else - % ensure at least a proper prevdepth, this should be - % an option - \vskip-\prevdepth - \vskip\strutdepth - \prevdepth\strutdepth - \fi - % the old crappy piece of code - \edef\oldprevdepth{\the\prevdepth}% - \prevdepth\newprevdepth % == \inhibittextblank - \fi - \else - \global\blankindeedtrue - \fi - \ifblankreset - \global\blankindeedtrue - \ifgridsnapping - % let's play safe and not fool around with the depth, if - % only because it took a lot of effort to sort out the grid - % stuff in the first place - \else - \ifdim\prevdepth=\newprevdepth - \prevdepth\oldprevdepth - \fi - \fi - \fi - \ifblankindeed - \ifdim1\savedlastskip<1\blankskip\relax - % else when \blank[2*groot] + \blank[3*groot] with parskip - % equaling 1*groot, gives a groot=\parskip so adding a small - % value makes it distinguishable; can also be done at parskip - % setting time (better) - \global\advance\blankskip \mindimen\relax % = skip - % test this on 2* + 3* and parskip groot - \ifblanknowhite - \global\advance\blankskip -\parskip - \else - \ifdim\savedlastskip=\parskip - \else % force this due to previous comment - \ifdim\parskip>\zeropoint\relax - \ifdim\blankskip<\parskip\relax - \global\blankskip\zeropoint - \else - \global\advance\blankskip -\parskip - \fi - \fi - \fi - \fi - \ifblankflexible \else - \blankskip1\blankskip - \fi - \iflocalblankfixed - \blankskip1\blankskip - \fi - \iflocalblankflexible - \blankskip1\blankskip - \!!plus \skipgluefactor\blankskip - \!!minus\skipgluefactor\blankskip - \fi - \ifdim\lastkern=\noblanksignal\relax % controlled and grid - \global\blankindeedfalse - \else\ifnum\savedlastpenalty=\noblankpsignal\relax % controlled and grid - \global\blankindeedfalse - \else\ifgridsnapping\else\ifdim\prevdepth=\newprevdepth - \global\blankindeedfalse - \fi\fi\fi\fi - \ifblankindeed - \iffuzzyvskip - \removelastfuzzyvskip - \fuzzyvskip\blankskip\relax - \else - \relax\ifdim\savedlastskip=\zeropoint\else - \vskip-\savedlastskip - \fi - \vskip\blankskip\relax - \fi - \fi - \else - \iffuzzyvskip - \removelastfuzzyvskip - \fuzzyvskip\blankskip\relax - \else - % new, test this on pascal - \ifdim\blankskip<\zeropoint - \relax\ifdim\savedlastskip=\zeropoint\else - \advance\blankskip-\savedlastskip - \vskip-\savedlastskip - \fi - \ifdim\blankskip>\zeropoint - \vskip\blankskip - \else - \vskip\zeropoint - \fi - \else - % also new - \ifdim\blankskip=\zeropoint - \ifblanknowhite - \nowhitespace - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \global\fuzzyvskipfalse - \presetindentation} - -%D For a long time we had: -%D -%D \starttyping -%D \def\simpledoblank% -%D {\doifelse{\currentwhitespace}{\v!geen} -%D {\blank[\currentblank]} -%D {\blank[\currentwhitespace]}} -%D \stoptyping -%D -%D But Berend de Boer wanted more control, so now we have: - -\def\simpledoblank % ... - {\doifelse\currentwhitespace\v!none - {\blank[\currentblank]} - {\blank[\s!default]}} - -%D Another useful definition would be: -%D -%D \starttyping -%D \defineblank -%D [\s!default] -%D [\v!groot] -%D \stoptyping - -\def\dosetupblank#1% amount are an plain inheritance - {\bigskipamount#1\relax - \ifblankflexible \else - \bigskipamount1\bigskipamount - \fi - \medskipamount \bigskipamount \divide\medskipamount \plustwo - \smallskipamount\bigskipamount \divide\smallskipamount\plusfour}% - -\def\complexsetupblank[#1]% more \let's -> this also wil become installable - {\ifgridsnapping - \blankflexiblefalse - \else - \ExpandFirstAfter\processallactionsinset - [#1] - [ \v!flexible=>\blankflexibletrue, - \v!fixed=>\blankflexiblefalse]% - \fi - \ExpandFirstAfter\processallactionsinset - [#1] - [ \v!flexible=>\dosetupblank\appliedblankskip, - \v!fixed=>\dosetupblank\appliedblankskip, - \v!line=>\edef\appliedblankskip{\linedistance}% - \dosetupblank\appliedblankskip, - \v!halfline=>\scratchskip.5\linedistance - \edef\appliedblankskip{\the\scratchskip}% - \dosetupblank\appliedblankskip, - \v!big=>\ifgridsnapping - \edef\appliedblankskip{\linedistance}% - \dosetupblank\appliedblankskip - \fi - \let\currentblank\v!big, - \v!medium=>\let\currentblank\v!medium, - \v!small=>\let\currentblank\v!small, - \v!global=>\let\currentblank\v!global, - \v!normal=>\dosetupblank\appliedblankskip, - \v!standard=>\edef\appliedblankskip{\skipfactor\linedistance}% - \dosetupblank\appliedblankskip, - \s!default=>\dosetupblank\appliedblankskip, - \s!unknown=>\let\appliedblankskip\commalistelement - \dosetupblank\appliedblankskip]% - \simplesetupwhitespace} - -% \definecomplexorsimpleempty\setupblank -% -% speed gain: 60 sec -> 30 sec - -\definecomplexorsimple\setupblank - -\def\simplesetupblank % == snelle \setupblank[\s!default] - {\ifgridsnapping - \blankflexiblefalse - \fi - \dosetupblank\appliedblankskip - % \let\deblanko\v!big - \simplesetupwhitespace} - -\def\restorestandardblank% \v!standard - {\edef\appliedblankskip{\skipfactor\linedistance}% - \dosetupblank\appliedblankskip - }%\let\deblanko\v!big} - -\def\dodefineblank[#1][#2]% - {\def\docommand##1{\setvalue{\??bo##1}{#2}}% - \processcommalist[#1]\docommand} - -\def\defineblank - {\dodoubleargument\dodefineblank} - -\def\savecurrentblank - {\edef\restorecurrentblank - {\bigskipamount\the\bigskipamount - \medskipamount\the\medskipamount - \smallskipamount\the\smallskipamount - \noexpand\def\noexpand\currentblank{\currentblank}% - \ifblankflexible - \noexpand\blankflexibletrue - \else - \noexpand\blankflexiblefalse - \fi}} - -%D Now. - -\defineblank [\s!default] [\v!white] -\defineblank [\v!height] [\strutheight] -\defineblank [\v!depth] [\strutdepth] - -% old implementation -% -% \let\currentindentation=\empty -% -% \newdimen\ctxparindent -% -% \newif\ifindentfirstparagraph % \indentfirstparagraphtrue -% -% \def\presetindentation -% {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}} -% -% \definecomplexorsimple\setupindenting -% -% \def\complexsetupindenting[#1]% -% {\processallactionsinset -% [#1] -% [ \v!first=>\indentfirstparagraphtrue, -% \v!next=>\indentfirstparagraphfalse, -% \s!default=>\simplesetupindenting, -% \s!unknown=>\edef\currentindentation{\commalistelement}% -% \simplesetupindenting]} -% -% \def\simplesetupindenting -% {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}% -% \parindent\ctxparindent\relax} -% -% \def\indenting % watch out: \dodo and no \do -% {\dosingleargument\dodoindenting} -% -% \def\dodoindenting[#1]% oeps, we needed a commalist handler here! -% {\edef\currentindenting{#1}% -% \processcommacommand[#1]\dododoindenting} -% -% \def\dododoindenting#1% -% {\executeifdefined{\??in:#1}\donothing} -% -% \let\currentindenting\empty -% -% \def\defineindentingmethod[#1]#2% -% {\setvalue{\??in:#1}{#2}} -% -% \defineindentingmethod [\v!no] {\parindent\ctxparindent\noindent} -% \defineindentingmethod [\v!not] {\parindent\ctxparindent\noindent} -% -% \defineindentingmethod [\v!first] {\indentfirstparagraphtrue} -% \defineindentingmethod [\v!next] {\indentfirstparagraphfalse} -% -% \defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent ! -% \defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent ! -% -% \defineindentingmethod [\v!never] {\parindent\zeropoint\relax} % no \indent ! -% -% \def\noindenting{\indenting[\v!no,\v!next]} % was \nietinspringen -% \def\doindenting{\indenting[\v!yes,\v!first]} % was \welinspringen -% -% \def\dochecknextindentation#1% internal one -% {\checknextindentation[\getvalue{#1\c!indentnext}]} -% -% \def\checknextindentation[#1]% -% {\processaction[#1][%\v!keep=>, -% \v!yes=>\doindentation, -% \v!no=>\noindentation, -% \v!auto=>\autoindentation]} -% -% \def\doindentation% too simple -% {\gdef\checkindentation{\global\indentationtrue}} -% -% \ifx\autoindentation\undefined -% \let\autoindentation\relax -% \fi -% -% \newif\ifindentation \indentationtrue % documenteren, naar buiten -% -% \let\checkindentation=\relax -% -% \def\donoindentation -% {\ifdim\parindent=\zeropoint \else -% \bgroup \setbox\scratchbox\lastbox \egroup -% \fi} -% -% \def\noindentation % made global -% {\ifinpagebody \else -% \global\indentationfalse -% \gdef\checkindentation -% {\donoindentation -% \gdef\checkindentation{\global\indentationtrue}}% -% \fi} -% -% \def\nonoindentation % bv bij floats -% {\ifinpagebody \else -% \global\indentationtrue -% \gdef\checkindentation{\global\indentationtrue}% -% \fi} -% -% \def\indentation -% {\ifvmode \ifdim\parindent=\zeropoint \else -% % was : \hskip\parindent -% % can be: \indent -% % but we test: -% \noindent\hskip\parindent -% \fi \fi} - -\let\currentindentation\empty % amount/keyword -% \let\normalindentation \empty % used for reinstating normal indentation -\let\currentindenting \empty % method - -\newdimen\ctxparindent - -\newif\ifindentfirstparagraph % \indentfirstparagraphtrue - -\chardef\indentingtoggle\zerocount - -%D After a blank or comparable situation (left side floats) we -%D need to check if the next paragraph has to be indented. - -\def\presetindentation - {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}} - -%D This sets up the (normally) global indentation behavior as well -%D as the amounts. - -\definecomplexorsimple\setupindenting - -% \def\complexsetupindenting[#1]% -% {\edef\currentindenting{#1}% -% \indentfirstparagraphtrue -% \parindent\ctxparindent -% \chardef\indentingtoggle\zerocount -% \processcommalist[#1]\docomplexsetupindenting -% \ifindentfirstparagraph\else\noindentation\fi % added -% \toggleindentation} - -\indentfirstparagraphtrue -\parindent\ctxparindent -\chardef\indentingtoggle\zerocount - -% \newtoks\savedeverypar \savedeverypar\everypar -% \def\restoreeverypar{\everypar\savedeverypar} - -% we need a better everypar model: for each option a switch, which we -% set to false with \forgetall and can enable when needed (context 4); -% that way we can control the order of execution of options - -\def\checkeverypar % currently a hack - {\ifzeropt\parindent\else - \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}% - \fi} - -\def\complexsetupindenting[#1]% - {\edef\currentindenting{#1}% - \doifsomething\currentindenting % handy when a parameter is passed - {% not here: \indentfirstparagraphtrue - % not here: \parindent\ctxparindent - % not here: \chardef\indentingtoggle\zerocount - % we use commacommand in order to catch #1 being a command (expanded parameter) - \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc - \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest - \checkeverypar % only when non-empty #1 - \ifindentfirstparagraph\else\noindentation\fi % added - \toggleindentation}} - -\def\docomplexsetupindentingA#1% - {\edefconvertedargument\!!stringa{#1}% - \doifundefined{\??in:\!!stringa}% - {\edef\currentindentation{#1}% - \let\normalindentation\currentindentation - \simplesetupindenting}} - -\def\docomplexsetupindentingB#1% - {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen - \executeifdefined{\??in:\!!stringa}\donothing} - -\def\simplesetupindenting % empty case, a it strange, needed this way? - {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}} - -\def\indenting % kind of obsolete - {\dosingleargument\complexsetupindenting} - -% use \noindentation to suppress next indentation - -\def\defineindentingmethod[#1]#2% - {\setvalue{\??in:#1}{#2}} - -\defineindentingmethod [\v!no] {\parindent\zeropoint}% was: \ctxparindent\noindent} -\defineindentingmethod [\v!not] {\parindent\zeropoint}% was: \ctxparindent\noindent} - -\defineindentingmethod [\v!first] {\indentfirstparagraphtrue} -\defineindentingmethod [\v!next] {\indentfirstparagraphfalse} - -\defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent ! -\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent ! - -\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent ! - \chardef\indentingtoggle\zerocount} - -\defineindentingmethod [\v!odd] {\chardef\indentingtoggle\plusone} -\defineindentingmethod [\v!even] {\chardef\indentingtoggle\plustwo} - -\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else - \let\currentindentation\normalindentation - \simplesetupindenting - \fi} - -\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue - \parindent\zeropoint - \chardef\indentingtoggle\zerocount} - -\def\noindenting{\indenting[\v!no, \v!next ]} -\def\doindenting{\indenting[\v!yes,\v!first]} - -%D This one sets up the local indentation behaviour (i.e. either or not -%D a next paragraph will be indented). - -\def\dochecknextindentation#1% internal one - {\checknextindentation[\getvalue{#1\c!indentnext}]} - -\def\checknextindentation[#1]% - {\processaction - [#1] - [%\v!keep=>, - \v!yes=>\doindentation, - \v!no=>\noindentation, - \v!auto=>\autoindentation]} - -%D Here come the handlers. - -\newif\ifindentation \indentationtrue % documenteren, naar buiten - -\let\checkindentation\relax - -\ifx\autoindentation\undefined \let\autoindentation\relax \fi % hook - -\def\doindentation - {\gdef\checkindentation{\global\indentationtrue}} - -\def\noindentation % made global - {\ifinpagebody \else - \global\indentationfalse - \gdef\checkindentation - {\donoindentation - \gdef\checkindentation{\global\indentationtrue}}% - \fi} - -\def\nonoindentation % bv bij floats - {\ifinpagebody \else - \global\indentationtrue - \gdef\checkindentation{\global\indentationtrue}% - \fi} - -\def\donoindentation - {\ifdim\parindent=\zeropoint \else - \bgroup \setbox\scratchbox\lastbox \egroup - \fi} - -\def\indentation - {\ifvmode \ifdim\parindent=\zeropoint \else - % was : \hskip\parindent - % can be: \indent - % but we test: - \noindent\hskip\parindent - \fi \fi} - -\def\toggleindentation - {\ifcase\indentingtoggle - % nothing - \or - \notoggleindentation - \or - \dotoggleindentation - \fi} - -\def\dokillindentation - {\gdef\checkindentation{\global\indentationfalse\donoindentation}} - -\def\dotoggleindentation - {\gdef\checkindentation{\global\indentationfalse\notoggleindentation\donoindentation}} - -\def\notoggleindentation - {\gdef\checkindentation{\global\indentationtrue\dotoggleindentation}} - -\appendtoks - \pushmacro\checkindentation - \pushmacro\ifindentation -\to \everypushsomestate - -\appendtoks - \popmacro\ifindentation - \popmacro\checkindentation -\to \everypopsomestate - -% we need to save the state if we want to adapt behaviour to empty lines -% -% \def\setlasthvmode -% {\global\chardef\savedhvmode\ifhmode\plusone\else\ifvmode\plustwo\else\zerocount\fi\fi} -% -% \def\resetlasthvmode -% {\global\chardef\savedhvmode\zerocount} -% -% \chardef\savedhvmode\zerocount - -% This is a user requested hack (using the auto-hook). - -\chardef\recheckindentationmode\zerocount - -\def\dontrechecknextindentation - {\global\chardef\recheckindentationmode\zerocount} - -\def\dorechecknextindentation - {\ifcase\recheckindentationmode - % nothing - \or - \dontrechecknextindentation - \expandafter\doautoindentation - \fi} - -\def\doautoindentation - {\doifnextcharelse\par\donothing\noindentation} - -\def\autoindentation - {\global\chardef\recheckindentationmode\plusone} - -%D An example of usage: -%D -%D \starttyping -%D \setupindenting[small,yes] -%D -%D \setupitemize [indentnext=auto] -%D \setuptyping [indentnext=auto] -%D \setupformulas[indentnext=auto] -%D -%D \input tufte -%D -%D \startitemize -%D \item itemize -%D \stopitemize -%D \input tufte -%D -%D \startitemize -%D \item itemize -%D \stopitemize -%D -%D \input tufte -%D -%D \startitemize -%D \item itemize -%D \stopitemize -%D -%D \page -%D -%D \input tufte -%D -%D \starttyping -%D verbatim -%D \stoptyping -%D \input tufte -%D -%D \starttyping -%D verbatim -%D \stoptyping -%D -%D \input tufte -%D -%D \starttyping -%D verbatim -%D \stoptyping -%D -%D \page -%D -%D \input tufte -%D -%D \startformula -%D a = b -%D \stopformula -%D \input tufte -%D -%D \startformula -%D a = b -%D \stopformula -%D -%D \input tufte -%D -%D \startformula -%D a = b -%D \stopformula - - -%D \macros -%D {frenchspacing,nonfrenchspacing} -%D -%D Smehow \type{\frenchspacing} can lead to hyphenation between -%D dashes so we now have \type {\newfrenchspacing} (moved from -%D \type {syst-chr}). - -%D Hm ... todo: - -\sfcode`\)=0 -\sfcode`\'=0 -\sfcode`\]=0 - -\def\setfrenchspacing#1% - {\sfcode`\.#1 \sfcode`\,#1\relax - \sfcode`\?#1 \sfcode`\!#1\relax - \sfcode`\:#1 \sfcode`\;#1\relax} - -\def\frenchspacing - {\setfrenchspacing{1000}} - -\def\resetfrenchspacing - {\sfcode`\.3000 \sfcode`\,1250 - \sfcode`\?3000 \sfcode`\!3000 - \sfcode`\:2000 \sfcode`\;1500 } - -\def\frenchspacing {\setfrenchspacing{1000}} -\def\newfrenchspacing{\setfrenchspacing{1050}} -\def\nonfrenchspacing{\resetfrenchspacing} - -\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}} - -\definespacingmethod[\v!packed]{\newfrenchspacing} -\definespacingmethod[\v!broad ]{\nonfrenchspacing} - -\def\complexsetupspacing[#1]% - {\executeifdefined{\??sg\??sg#1}\relax - \updateraggedskips} - -\def\simplesetupspacing - {\updateraggedskips} - -\definecomplexorsimple\setupspacing - -% \dorecurse{100}{\recurselevel\spacefactor 800 \space} \par -% \dorecurse{100}{\recurselevel\spacefactor1200 \space} \par -% \dorecurse{100}{\recurselevel\spacefactor 800 \normalspaceprimitive} \par -% \dorecurse{100}{\recurselevel\spacefactor1200 \normalspaceprimitive} \par - -% When we don't add the % here, we effectively get \ and -% since we have by default \def\^^M{\ } we get into a loop. - -\let\normalspaceprimitive=\ % space-comment is really needed - -\unexpanded\def\ {\mathortext\normalspaceprimitive\space} % no \dontleavehmode\space (else no frenchspacing) - -\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\space} - -\letcatcodecommand \ctxcatcodes `\~ \nonbreakablespace % overloaded later - -\def\space { } -\def\removelastspace{\ifhmode\unskip\fi} -\def\nospace {\removelastspace\ignorespaces} - -% in tables we need: -% -% \def\fixedspace {\hskip.5em\relax} -% -% but, since not all fonts have .5em digits: - -\unexpanded\def\fixedspace - {\setbox\scratchbox\normalhbox{\mathortext{0}{0}}% - \hskip\wd\scratchbox\relax} - -\def\fixedspaces - {\letcatcodecommand \ctxcatcodes `\~ \fixedspace} - -\def\removeunwantedspaces - {\ifhmode % we also need to unskip 0pt skips - \unskip\unskip\unskip\unskip\unskip - \unskip\unskip\unskip\unskip\unskip - \fi} - -\appendtoks\let~\space\to\simplifiedcommands - -% still not fixed in aleph / luatex -% -% \def\removeunwantedspaces -% {\ifhmode \ifnum\lastnodetype=\@@gluenode -% \unskip \@EAEAEA\removeunwantedspaces -% \fi \fi} - -%D For old time sake, will disappear soon. - -\let\hardespatie\fixedspace -\let\geenspatie \nospace - -% \startbuffer -% \startlines \tt \fixedspaces -% 0~1~~2~~~3~~~~4~~~~~5 -% 0~~~~~~~~~~~~~~~~~~~5 -% $0~1~~2~~~3~~~~4~~~~~5$ -% $0~~~~~~~~~~~~~~~~~~~5$ -% \stoplines -% -% \starttabulate[|~|] -% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \NR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \NR -% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \NR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \NR -% \stoptabulate -% -% \starttable[||] -% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \AR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \AR -% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \AR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \AR -% \stoptable -% \stopbuffer -% -% \setupbodyfont[cmr] \getbuffer -% \setupbodyfont[lbr] \getbuffer - -\def\packed - {\nointerlineskip} - -\def\godown[#1]% - {\relax - \ifhmode\endgraf\fi - \ifvmode\nointerlineskip\vskip#1\relax\fi} - -%D A couple of plain macros: - -\ifx\thinspace\undefined - - \def\thinspace {\kern .16667em } - \def\negthinspace{\kern-.16667em } - \def\enspace {\kern .5em } - - \def\thinspace {\kern .16667\emwidth} - \def\negthinspace{\kern-.16667\emwidth} - \def\enspace {\kern .5\emwidth} - -\fi - -\ifx\quad\undefined - - \def\enskip{\hskip.5em\relax} - \def\quad {\hskip 1em\relax} - \def\qquad {\hskip 2em\relax} - - \def\enskip{\hskip.5\emwidth} - \def\quad {\hskip \emwidth} - \def\qquad {\hskip 2\emwidth} - -\fi - -\let\emspace\quad - -\ifx\smallskip\undefined - - \def\smallskip{\vskip\smallskipamount} - \def\medskip {\vskip\medskipamount} - \def\bigskip {\vskip\bigskipamount} - -\fi - -\ifx\allowbreak\undefined - - \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 - {\par - \ifdim\lastskip<\smallskipamount - \removelastskip - \penalty-50 - \smallskip - \fi} - -\def\medbreak - {\par - \ifdim\lastskip<\medskipamount - \removelastskip - \penalty-100 - \medskip - \fi} - -\def\bigbreak - {\par - \ifdim\lastskip<\bigskipamount - \removelastskip - \penalty-200 - \bigskip - \fi} - -\fi - -\newskip\ctxparskip \ctxparskip\zeropoint - -\newconditional \flexiblewhitespace \settrue\flexiblewhitespace - -\def\blankokleinmaat {\smallskipamount} -\def\blankomiddelmaat {\medskipamount} -\def\blankogrootmaat {\bigskipamount} -\def\currentwhitespace {\zeropoint} - -\definecomplexorsimple\setupwhitespace - -% \def\simplesetupwhitespace -% {\doifnot\currentwhitespace\v!none\dosetupwhitespace} -% -% \def\complexsetupwhitespace[#1]% -% {\doifelsenothing{#1} -% {\simplesetupwhitespace} -% {\edef\currentwhitespace{#1}% -% \dosetupwhitespace}} -% -% \def\dosetupwhitespace -% {\processcommacommand[\currentwhitespace]\dowhitespacemethod -% \dodosetupwhitespace} - -\def\simplesetupwhitespace - {\doifnot\currentwhitespace\v!none\dosetupwhitespace} - -\def\complexsetupwhitespace[#1]% - {\edef\nextcurrentwhitespace{#1}% - \ifx\nextcurrentwhitespace\empty - \simplesetupwhitespace - \else - \let\currentwhitespace\nextcurrentwhitespace - \dosetupwhitespace - \fi} - -\def\dosetupwhitespace % quick test for no list - {\doifdefinedelse{\??ws\??ws\currentwhitespace}% no ifcsname due to nested \lineheight - {\getvalue{\??ws\??ws\currentwhitespace}}% - {\processcommacommand[\currentwhitespace]\dowhitespacemethod}% - \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 - \else - \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi - \fi - \parskip\ctxparskip} - -\chardef\baselinegridmode=0 % option in layout / 1=permit_half_lines - -\def\dodosetupwhitespace - {\ifgridsnapping - \setfalse\flexiblewhitespace - \ctxparskip1\ctxparskip - \ifdim\ctxparskip>\zeropoint - \ifcase\baselinegridmode - \ctxparskip\baselineskip % normal ! ! ! ! !! - \or - \ifdim\scratchdimen=\baselineskip % maybe range - \ctxparskip\baselineskip % normal ! ! ! ! !! - \else - \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax - \fi - \else - \ctxparskip\baselineskip % normal ! ! ! ! !! - \fi - \fi - \else - \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi - \fi - \parskip\ctxparskip} - -\definesystemvariable {ws} % whitespace - -\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#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} - -\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin} - -% \def\dowhitespacemethod#1% -% {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax} - -\def\dowhitespacemethod#1% \doifdefined because of \lineheight - {\doifdefinedelse{\??ws\??ws#1}{\getvalue{\??ws\??ws#1}}{\ctxparskip#1}\relax} - -\def\nowhitespace - {\ifdim\parskip>\zeropoint\relax - \ifdim\lastskip=-\parskip - \else - \vskip-\parskip - \fi - \fi} - -\def\nowhitespaceunlessskip - {\ifdim\lastskip>\zeropoint \else - \nowhitespace - \fi} - -\def\redowhitespace - {\ifdim\lastskip>-\parskip \else - \vskip\parskip - \fi} - -\def\savecurrentwhitespace - {\edef\restorecurrentwhitespace - {\ctxparskip\the\ctxparskip - \parskip\the\parskip - \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}% - \ifconditional\flexiblewhitespace - \noexpand\settrue\flexiblewhitespace - \else - \noexpand\setfalse\flexiblewhitespace - \fi}} - -% deze variant is nodig binnen \startopelkaar -% steeds testen: -% -% \hoofdstuk{..} -% \plaatslijst[..] -% \hoofdstuk{..} -% \input tufte -% -% met/zonder witruimte - -\def\whitespace - {\par - \ifdim\parskip>\zeropoint\relax - %\ifdim\lastskip>\parskip \else - % \removelastskip interferes with blanko blokkeer en klein - \vskip\parskip - %\fi - \fi} - -\def\nonoblanko[#1]% - {\par} - -\def\noblanko - {\dosingleempty\nonoblanko} - -% 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. - -\newif\ifopelkaar - -\newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt} -\def\lastdoneparskip {0pt} - -\def\startpacked - {\dosingleempty\dostartpacked} - -\def\dostartpacked[#1]% nesting afvangen - {\par - \ifvmode - \edef\lastdoneparskip {\the\lastskip}% - \edef\lastdoneprevdepth{\the\prevdepth}% zeer recent toegevoegd - \ifdim\prevdepth=-\thousandpoint % toegevoegd omdat binnen - \else % een vbox een extra skip - \whitespace % ongewenst is; dit kan - \baselinecorrection %% zie in \placeregister[n=1] - \vskip\noparskipsignal % waarschijnlijk ook in - \fi % blanko blokkeer - \bgroup - \doifelse{#1}\v!blank - \opelkaarfalse - \opelkaartrue - \blank[\v!disable] % dit is nog niet ok, gaat fout - \setupwhitespace[\v!none] % bovenin vtop (dwz, baseline) - \fi} - -\def\stoppacked - {\par - \ifvmode - \egroup - \ifdim\lastskip=\noparskipsignal\relax - \removelastskip - \nowhitespace - \vskip-\lastdoneparskip - \vskip+\lastdoneparskip - \prevdepth-\lastdoneprevdepth % zeer recent toegevoegd - \fi - \fi} - -\def\startunpacked - {\blank - \leavevmode - \bgroup} - -\def\stopunpacked - {\egroup - \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. - -\def\toonregelcorrectie{\showbaselinecorrection} -\def\regelcorrectie {\baselinecorrection} - -% \prevdepth crosses pageboundaries! -% -% todo: a version that works ok inside a box - -\let\doaroundlinecorrection\relax - -\def\startlinecorrection - {\dodoubleempty\dostartlinecorrection} - -\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\stoplinecorrection - {\stopbaselinecorrection - \doaroundlinecorrection - \egroup} - -\def\correctwhitespace - {\dowithnextbox - {\startbaselinecorrection - \flushnextbox - \stopbaselinecorrection}% - \vbox} - -\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}} -\def\horizontalstrut{\normalhbox {\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 -% nog eens instelbaar worden. -% -% \lineheight : de hoogte van een regel -% \spacing{getal} : instellen interlinie -% \normalbaselines : instellen regelafstend -% -% \setstrut : instellen \strut -% \setnostrut : resetten \strut, \endstrut, \begstrut -% -% \setteststrut : instellen zichtbare struts -% \resetteststrut : instellen onzichtbare struts -% -% \setfontparameters : instellen na fontset -% -% De hoogte van een regel (\lineheight) is gelijk aan de -% som van de hoogte (\ht) en diepte (\dp) van \strutbox. -% -% \strut : denkbeeldig blokje met hoogte en diepte -% -% Een \hbox kan als deze aan het begin van een regel staat -% een breedte \hsize krijgen. Dit is soms te voorkomen met het -% commando \leavevmode. Binnen een \vbox geeft dit echter -% niet altijd het gewenste resultaat, vandaar het commando -% -% \leaveoutervmode - -% Pas op: niet zomaar \topskip en \baselineskip aanpassen -% en zeker niet \widowpenalty. Dit kan ernstige gevolgen -% hebben voor kolommen. -% -% Enige glue kan op zich geen kwaad, echter als blanko=vast, -% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook -% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet, -% omdat een positieve glue eindeloos rekbaar is. - -\newdimen\strutdimen -\newdimen\lineheight -\newdimen\openlineheight -\newdimen\openstrutheight -\newdimen\openstrutdepth -\newdimen\topskipgap -\newdimen\struttotal - -\def\strutheightfactor {.72} -\def\strutdepthfactor {.28} - -\def\baselinefactor {2.8} -\def\baselinegluefactor {0} - -\def\minimumstrutheight {0pt} -\def\minimumstrutdepth {0pt} - -\def\normallineheight {\baselinefactor ex} -\def\minimumlinedistance {\lineskip} - -\def\strutheight {0pt} -\def\strutdepth {0pt} -\def\strutwidth {0pt} - -\def\spacingfactor {1} - -\def\topskipfactor {1.0} -\def\maxdepthfactor {0.5} - -\def\systemtopskipfactor {\topskipfactor} -\def\systemmaxdepthfactor {\maxdepthfactor} - -% De onderstaande definitie wordt in de font-module overruled - -\ifdefined\globalbodyfontsize\else - \newdimen\globalbodyfontsize - \globalbodyfontsize=12pt -\fi - -\ifx\normalizedbodyfontsize\undefined - \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 -% {\ifdim\topskip>\openstrutheight -% % == \vskip\topskipgap -% \vskip\topskip -% \vskip-\openstrutheight -% \fi -% \verticalstrut -% \vskip-\struttotal} - -\def\topskipcorrection - {\simpletopskipcorrection - \vskip-\struttotal - \verticalstrut} - -\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 -% \fi -% \relax % the skip -% \topskipgap\topskip -% \advance\topskipgap -\openstrutheight\relax -% \ifdim\topskip<\strutheightfactor\openlineheight -% \topskip\strutheightfactor\openlineheight\relax -% \fi} - -\def\settopskip % the extra test is needed for the lbr family - {\topskip\systemtopskipfactor\globalbodyfontsize - \ifgridsnapping \else - \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi - \fi - \relax % the skip - \topskipgap\topskip - \advance\topskipgap -\openstrutheight\relax -\ifdim\minimumstrutheight>\zeropoint - \ifdim\topskip<\minimumstrutheight - \topskip\minimumstrutheight\relax - \fi -\else - \ifdim\topskip<\strutheightfactor\openlineheight - \topskip\strutheightfactor\openlineheight\relax - \fi -\fi} - -\def\setmaxdepth - {\maxdepth\systemmaxdepthfactor\globalbodyfontsize} - -\def\normalbaselines - {\baselineskip \normalbaselineskip - \lineskip \normallineskip - \lineskiplimit\normallineskiplimit} - -% \def\setnormalbaselines -% {\ifdim\normallineheight>\zeropoint -% \lineheight\normallineheight -% \fi -% \openlineheight\spacingfactor\lineheight -% \openstrutheight\strutheightfactor\openlineheight -% \openstrutdepth \strutdepthfactor \openlineheight -% \normalbaselineskip\openlineheight -% \!!plus\baselinegluefactor\openlineheight -% \!!minus\baselinegluefactor\openlineheight -% \normallineskip\minimumlinedistance\relax % \onepoint\relax -% \normallineskiplimit\zeropoint\relax -% \normalbaselines} - -\def\setnormalbaselines - {\ifdim\normallineheight>\zeropoint - \lineheight\normallineheight - \fi - \openlineheight\spacingfactor\lineheight - \openstrutheight \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight % new - \else - \strutheightfactor\openlineheight - \fi - \openstrutdepth \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth % new - \else - \strutdepthfactor \openlineheight - \fi - \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint - \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new - \fi - \normalbaselineskip\openlineheight - \ifgridsnapping\else - \!!plus \baselinegluefactor\openlineheight - \!!minus\baselinegluefactor\openlineheight - \fi - \normallineskip\minimumlinedistance\relax % \onepoint\relax - \normallineskiplimit\zeropoint\relax - \normalbaselines} - -% \def\setspacingfactor#1\to#2\by#3\\% -% {\strutdimen#2\points -% \strutdimen#3\strutdimen -% \edef#1{\withoutpt\the\strutdimen}} -% -% \def\spacing#1% -% {\ifgridsnapping -% %\doifnot{#1}{1}{\showmessage\m!layouts{11}{#1}}% -% \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi -% \edef\spacingfactor{1}% -% \else -% \edef\spacingfactor{#1}% -% \fi -% \setspacingfactor\systemtopskipfactor \to\topskipfactor \by#1\\% why no \spacingfactor ? -% \setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\% why no \spacingfactor ? -% \setnormalbaselines -% \setstrut} -% -% \def\setspacingfactor#1#2#3% -% {\edef#1{\withoutpt\the\dimexpr#2\points*#3\relax}} - -\def\spacing#1% - {\ifgridsnapping - \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi - \edef\spacingfactor{1}% - \else - \edef\spacingfactor{#1}% - \fi - %\setspacingfactor\systemtopskipfactor \topskipfactor {#1}% why no \spacingfactor ? - %\setspacingfactor\systemmaxdepthfactor\maxdepthfactor{#1}% why no \spacingfactor ? - \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}% - \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}% - \setnormalbaselines - \setstrut} - -%D Sometimes one needs to freeze the interlinespacing -%D -%D \starttyping -%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf} -%D \stoptyping - -\let\restoreinterlinespace\relax - -\def\saveinterlinespace - {\edef\restoreinterlinespace - {\lineheight \the\lineheight - \openstrutheight \the\openstrutheight - \openstrutdepth \the\openstrutdepth - \openlineheight \the\openlineheight - \normalbaselineskip \the\normalbaselineskip - \normallineskip \the\normallineskip - \normallineskiplimit\the\normallineskiplimit - \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}% - \noexpand\normalbaselines}} - -% plain definition: -% -% \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} -% -% could be: -% -% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} - -\ifx\strutbox\undefined - - \newbox\strutbox - - \setbox\strutbox=\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} - - %\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} - \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} - -\fi - -\let\normalstrut\strut - -% The double \hbox construction enables us to \backtrack -% boxes. - -% \def\setstrutdimen#1#2#3% % een strut is n.m maal ex -% {\strutdimen\normallineheight % wat niet per se \lineheight -% \strutdimen#2\strutdimen % is omdat een strut lokaal -% \strutdimen#3\strutdimen % kan afwijken van de globale -% \edef#1{\the\strutdimen}} % macro % strut - -% \def\setstrutdimen#1#2#3% % een strut is n.m maal ex -% {\strutdimen\normallineheight % wat niet per se \lineheight -% \strutdimen#2\strutdimen % is omdat een strut lokaal -% \strutdimen#3\strutdimen % kan afwijken van de globale -% \edef#1{\the\strutdimen}} % macro % strut - -% \def\setstrut -% {\setstrutdimen\strutheight\strutheightfactor\spacingfactor -% \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor -% \let\strut=\normalstrut -% \setbox\strutbox=\normalhbox -% {\normalhbox -% {\vrule -% \!!width \strutwidth -% \!!height \strutheight -% \!!depth \strutdepth -% \normalkern-\strutwidth}}} - -% \def\setstrut -% {\setstrutdimen\strutheight\strutheightfactor\spacingfactor -% \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor -% \dosetstrut} - -% \def\setstrut -% {\strutdimen\normallineheight -% \strutdimen\strutheightfactor\strutdimen -% \strutdimen\spacingfactor\strutdimen -% \edef\strutheight{\the\strutdimen}% -% \strutdimen\normallineheight -% \ifgridsnapping -% \advance\strutdimen-\strutheight -% \else -% \strutdimen\strutdepthfactor\strutdimen -% \strutdimen\spacingfactor\strutdimen -% \fi -% \edef\strutdepth{\the\strutdimen}% -% \dosetstrut} - -% interesting, strutdepth is 4.05064pt vs 4.05066pt depending on grid -% nasty rounding problem - -% \def\setstrut -% {% height -% \strutdimen\normallineheight -% \ifdim\minimumstrutheight>\zeropoint -% \strutdimen\minimumstrutheight -% \else -% \strutdimen\strutheightfactor\strutdimen -% \fi -% \strutdimen\spacingfactor\strutdimen -% \edef\strutheight{\the\strutdimen}% -% % depth -% \strutdimen\normallineheight -% \ifgridsnapping -% \ifdim\minimumstrutdepth>\zeropoint -% \strutdimen\minimumstrutdepth -% \else -% \advance\strutdimen-\strutheight -% \fi -% \else -% \ifdim\minimumstrutdepth>\zeropoint -% \strutdimen\minimumstrutdepth -% \else -% \strutdimen\strutdepthfactor\strutdimen -% \fi -% \strutdimen\spacingfactor\strutdimen -% \fi -% \edef\strutdepth{\the\strutdimen}% -% % finish -% \dosetstrut} - -% \def\setstrut -% {% height -% \ifdim\minimumstrutheight>\zeropoint -% \edef\strutheight{\the\dimexpr\spacingfactor\dimexpr\minimumstrutheight}% -% \else -% \edef\strutheight{\the\dimexpr\spacingfactor\dimexpr\strutheightfactor\dimexpr\normallineheight}% -% \fi -% % depth -% \ifgridsnapping -% \ifdim\minimumstrutdepth>\zeropoint -% \edef\strutdepth{\the\dimexpr\minimumstrutdepth}% -% \else -% \edef\strutdepth{\the\dimexpr\normallineheight-\strutheight}% -% \fi -% \else -% \ifdim\minimumstrutdepth>\zeropoint -% \edef\strutdepth{\the\dimexpr\spacingfactor\dimexpr\minimumstrutdepth}% -% \else -% \edef\strutdepth{\the\dimexpr\spacingfactor\dimexpr\strutdepthfactor\dimexpr\normallineheight}% -% \fi -% \fi -% % finish -% \dosetstrut} - -\unexpanded\def\setstrut - {% height - \edef\strutheight - {\the\dimexpr\spacingfactor\dimexpr - \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight - \else - \strutheightfactor\dimexpr\normallineheight - \fi}% - % depth - \edef\strutdepth - {\the\dimexpr - \ifgridsnapping - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \normallineheight-\strutheight - \fi - \else - \spacingfactor\dimexpr - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \strutdepthfactor\dimexpr\normallineheight - \fi - \fi}% - % finish - \dosetstrut} - -\unexpanded\def\setcharstrut#1% - {\setbox\strutbox\normalhbox{#1}% - \edef\strutheight{\the\strutht}% - \edef\strutdepth {\the\strutdp}% - \dosetstrut} - -% \def\setfontstrut -% {\setcharstrut{(}} -% -% better, since some fonts have small (but descending Q etc) - -\unexpanded\def\setfontstrut - {\setcharstrut{(gplQT}} - -\unexpanded\def\setcapstrut% could be M, but Q has descender - {\setcharstrut{Q}} - -%D Handy for math (used in mathml): - -\def\charhtstrut - {\begingroup - \setcharstrut{GJY}% - \vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht - \endgroup} - -\def\chardpstrut - {\begingroup - \setcharstrut{gjy}% - \vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint - \endgroup} - -%D Centered looks nicer: - -% \def\dosetstrut -% {\let\strut\normalstrut -% \setbox\strutbox\normalhbox -% {\normalhbox to \zeropoint -% {% \hss % new, will be option -% \vrule -% \!!width \strutwidth -% \!!height\strutheight -% \!!depth \strutdepth -% \hss}}% -% \struttotal\dimexpr\strutht+\strutdp\relax} -% -% because of all the callbacks in mkiv, we avoid unnecessary boxes ... -% maybe use an attribute so that we can tag boxes that don't need a -% treatment; tests with using an attribute so far have shown that -% it's slower because testing the attribute takes time too - -\def\dosetstrut - {\let\strut\normalstrut - \ifdim\strutwidth=\zeropoint - \setbox\strutbox\normalhbox - {\vrule - \!!width \zeropoint - \!!height\strutheight - \!!depth \strutdepth}% - \else - \setbox\strutbox\normalhbox - {\normalhbox to \zeropoint - {% \hss % new, will be option - \vrule - \!!width \strutwidth - \!!height\strutheight - \!!depth \strutdepth - \hss}}% - \fi - \struttotal\dimexpr\strutht+\strutdp\relax} - -%D The dimen \type {\struttotal} holds the exact size of the -%D strut; occasionally a one scaled point difference can show -%D up with the lineheight. - -%D Sometimes a capstrut comes in handy -%D -%D \starttabulate[|Tl|l|l|] -%D \NC yes \NC normal strut \NC {\showstruts\setupstrut[yes]\strut} \NC \NR -%D \NC no \NC no strut \NC {\showstruts\setupstrut[no]\strut} \NC \NR -%D \NC kap \NC a capital strut (i.e. Q) \NC {\showstruts\setupstrut[cap]\strut} \NC \NR -%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR -%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR -%D \stoptabulate - -\def\setupstrut - {\dosingleempty\dosetupstrut} - -\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut - {\processaction - [#1] - [ \v!yes=>\setstrut, - \v!auto=>\setautostrut, - \v!no=>\setnostrut, - \v!cap=>\setcapstrut, - \v!fit=>\setfontstrut, - \v!line=>\setstrut, - \s!default=>\setstrut, - \s!unknown=>\setcharstrut\commalistelement]} - -\def\setteststrut - {\def\strutwidth{.8pt}% - \setstrut} - -\def\autostrutfactor{1.1} - -\def\setautostrut - {\begingroup - \setbox\scratchbox\copy\strutbox - \setstrut - \ifdim\ht\strutbox>\autostrutfactor\ht\scratchbox - \endgroup \setstrut - \else\ifdim\dp\strutbox>\autostrutfactor\dp\scratchbox - \endgroup \setstrut - \else - \endgroup - \fi\fi} - -% simple version -% -% \def\begstrut -% {\relax\ifcase\strutht\else -% \strut -% \normalpenalty\plustenthousand -% \normalhskip\zeropoint -% \ignorespaces -% \fi} -% -% \def\endstrut -% {\relax\ifhmode\ifcase\strutht\else -% \removeunwantedspaces -% \normalpenalty\plustenthousand -% \normalhskip\zeropoint -% \strut -% \fi\fi} - -% 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 - \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 - \else - \removeunwantedspaces - \normalpenalty\plustenthousand - \normalhskip\zeropoint - \strut - \fi - \fi\fi} - -\newbox\nostrutbox \setbox\nostrutbox\normalhbox{} % {\normalhbox{}} - -\def\setnostrut - {\setbox\strutbox\copy\nostrutbox - \let\strut\empty - \let\endstrut\empty - \let\begstrut\empty - \let\crlfplaceholder\empty} - -% unsave: -% -% \def\pseudostrut -% {\bgroup -% \setnostrut -% \normalstrut -% \egroup} -% -% try: -% -% \startchemie -% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C] -% \stopchemie -% -% so: - -\def\pseudostrut - {\noindent} % better: \dontleavehmode - -\let\pseudobegstrut\pseudostrut - -\let\pseudoendstrut\removeunwantedspaces - -\def\resetteststrut - {\let\strutwidth\zeropoint - \setstrut} - -\ifx\setfontparameters\undefined - % problems ! ! ! ! - \def\setfontparameters{\the\everybodyfont} -\fi - -%D Handy: - -\def\baselinedistance{\the\lineheight} - -%D We need \type{\normaloffinterlineskip} because the new -%D definition contains an assignment, and |<|don't ask me -%D why|>| this assignment gives troubles in for instance the -%D visual debugger. - -%D The plain ones: - -\def\offinterlineskip - {\baselineskip-\thousandpoint - \lineskip\zeropoint - \lineskiplimit\maxdimen} - -\def\nointerlineskip - {\prevdepth-\thousandpoint} - -\let\normaloffinterlineskip=\offinterlineskip % knuth's original - -%D My own one: - -\def\offinterlineskip - {\ifdim\baselineskip>\zeropoint - \edef\oninterlineskip - {\baselineskip\the\baselineskip - \lineskip\the\lineskip - \lineskiplimit\the\lineskiplimit - \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}% - \else - \let\oninterlineskip\setnormalbaselines - \fi - \normaloffinterlineskip} - -\let\oninterlineskip=\relax - -\def\leaveoutervmode - {\ifvmode\ifinner\else - \leavevmode - \fi\fi} - -% We stellen enkele penalties anders in dan Plain TEX: - -% oud -% -% \widowpenalty=\defaultwidowpenalty\relax -% \clubpenalty =\defaultclubpenalty \relax - -\def\resetpenalties#1% - {\ifx#1\undefined\else - #1\minusone - \fi} - -\def\setpenalties#1#2#3% - {\ifx#1\undefined\else % 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 -%D Dirty hack, needed in margin content that can run of a page. - -\def\keeplinestogether#1% - {\xdef\restoreinterlinepenalty{\global\resetpenalties\interlinepenalties}% - \global\setpenalties\interlinepenalties{#1}\plustenthousand} - -\newif\ifgridsnapping % to be sure - -\def\defaultwidowpenalty {2000} % was: 1000 -\def\defaultclubpenalty {2000} % was: 800 -\def\defaultdisplaywidowpenalty {50} -\def\defaultbrokenpenalty {100} - -\def\defaultgridwidowpenalty {0} -\def\defaultgridclubpenalty {0} -\def\defaultgriddisplaywidowpenalty {0} -\def\defaultgridbrokenpenalty {0} - -% The original approach: -% -% \def\setdefaultpenalties -% {\ifgridsnapping -% \widowpenalty\defaultgridwidowpenalty -% \clubpenalty \defaultgridclubpenalty -% \else -% \widowpenalty\defaultwidowpenalty -% \clubpenalty \defaultclubpenalty -% \fi} -% -% However, we will use setups: - -% to be documented - -\def\nopenalties - {\widowpenalty \zerocount - \clubpenalty \zerocount - \brokenpenalty \zerocount - \doublehyphendemerits\zerocount - \finalhyphendemerits \zerocount - \adjdemerits \zerocount} - -\def\setdefaultpenalties - {\directsetup{\systemsetupsprefix\s!default}} - -\startsetups [\systemsetupsprefix\s!reset] - \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} - - \widowpenalty \defaultwidowpenalty - \clubpenalty \defaultclubpenalty - \displaywidowpenalty\defaultdisplaywidowpenalty - \brokenpenalty \defaultbrokenpenalty - -\stopsetups - -\startsetups [\v!grid] [\systemsetupsprefix\s!default] - - \directsetup{\systemsetupsprefix\s!reset} - - \widowpenalty \defaultgridwidowpenalty - \clubpenalty \defaultgridclubpenalty - \displaywidowpenalty\defaultgriddisplaywidowpenalty - \brokenpenalty \defaultgridbrokenpenalty - -\stopsetups - -% as an illustration: - -\startsetups [\systemsetupsprefix\v!strict] - - \directsetup{\systemsetupsprefix\s!reset} - - \setpenalties\widowpenalties2\maxdimen - \setpenalties\clubpenalties 2\maxdimen - \brokenpenalty \maxdimen - -\stopsetups - -\setdefaultpenalties % will happen later in \setuplayout - -% Suggested by GB (not the name -): - -\def\rapfillskip{.5\hsize plus .092\hsize minus .5\hsize} % D.A.'s value - -% Bovendien definieren we enkele extra \fill's: - -\def\hfilll{\hskip\zeropoint\!!plus1filll\relax} -\def\vfilll{\vskip\zeropoint\!!plus1filll\relax} - -% De onderstaande hulpmacro's moeten nog eens instelbaar worden -% gemaakt. - -\def\tfskipsize{1em\relax} -\def\tfkernsize{1ex\relax} - -\def\tfskip{\dotfskip\tfskipsize} -\def\tfkern{\dotfkern\tfkernsize} - -\def\dotfskip#1{{\tf\hskip#1}} -\def\dotfkern#1{{\tf\kern #1}} - -% needs a proper \definenarrower or installnarrower - -\newskip\ctxleftskip -\newskip\ctxrightskip -\newskip\ctxmidskip - -\def\dosinglenarrower#1% - {\processaction - [#1] - [ \v!left=>\global\advance\ctxleftskip \@@slleft, - \v!middle=>\global\advance\ctxmidskip \@@slmiddle, - \v!right=>\global\advance\ctxrightskip \@@slright, - \v!reset=>\global\ctxleftskip \zeropoint - \global\ctxmidskip \zeropoint - \global\ctxrightskip\zeropoint, - \v!none=>, - \s!unknown=>\global\advance\ctxmidskip \commalistelement]} - -% \def\donarrower[#1]% hm, can be dorepeat directly -% {\processaction -% [#1] -% [ \v!left=>\global\advance\ctxleftskip \@@slleft, -% \v!middle=>\global\advance\ctxmidskip \@@slmiddle, -% \v!right=>\global\advance\ctxrightskip \@@slright, -% \v!none=>,% handy for delimitedtexts -% \s!unknown=>{\dorepeatwithcommand[#1]\dosinglenarrower}]} - -\def\donarrower[#1]% hm, can be dorepeat directly - {\dorepeatwithcommand[#1]\dosinglenarrower} - -\def\complexstartnarrower[#1]% - {\@@slbefore % was hard coded \par - \bgroup - \global\ctxleftskip \zeropoint - \global\ctxrightskip\zeropoint - \global\ctxmidskip \zeropoint - \processcommalistwithparameters[#1]\donarrower - \advance\leftskip \ctxleftskip - \advance\rightskip \ctxrightskip - \advance\leftskip \ctxmidskip - \advance\rightskip \ctxmidskip - \seteffectivehsize} - -% todo: definenarrower - -\def\simplestartnarrower - {\startnarrower[\v!middle]} - -\definecomplexorsimple\startnarrower - -\def\stopnarrower - {\@@slafter % was hard coded \par / needed, else skips forgotten - \egroup} - -\def\setupnarrower - {\dodoubleargument\getparameters[\??sl]} - -\newdimen\@@effectivehsize \def\effectivehsize {\hsize} -\newdimen\@@effectiveleftskip \def\effectiveleftskip {\leftskip} -\newdimen\@@effectiverightskip \def\effectiverightskip{\rightskip} - -\def\seteffectivehsize - {\setlocalhsize - \@@effectivehsize \localhsize - \@@effectiveleftskip \leftskip - \@@effectiverightskip \rightskip - \let\effectivehsize \@@effectivehsize - \let\effectiveleftskip \@@effectiveleftskip - \let\effectiverightskip\@@effectiverightskip} - -\def\dodefinehbox[#1][#2]% - {\setvalue{hbox#1}##1% - {\hbox to #2{\begstrut##1\endstrut\hss}}} - -\def\definehbox - {\dodoubleargument\dodefinehbox} - -\def\iobox#1#2#3#% here #3# is not really needed - {\vbox\bgroup % we want to return a vbox like the others - \hbox\bgroup% we need to pack the signal with the box - \signalrightpage - \dowithnextboxcontent - {\let\\=\endgraf\forgetall\doifrightpageelse#1#2} - {\box\nextbox\egroup\egroup} - \vbox#3} - -\def\obox{\iobox\raggedleft \raggedright} % outerbox -\def\ibox{\iobox\raggedright\raggedleft} % innerbox - -\def\dosetraggedvbox#1% - {\let\raggedbox\vbox - \processfirstactioninset - [#1] - [ \v!left=>\let\raggedbox\lbox, - \v!right=>\let\raggedbox\rbox, - \v!middle=>\let\raggedbox\cbox, - \v!inner=>\let\raggedbox\ibox, - \v!outer=>\let\raggedbox\obox, - \v!flushleft=>\let\raggedbox\rbox, - \v!flushright=>\let\raggedbox\lbox, - \v!center=>\let\raggedbox\cbox, - \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]} - -\def\dosetraggedhbox#1% - {\let\raggedbox\hbox - \processaction % slow - [#1] - [ \v!left=>\def\raggedbox{\doalignedline\v!left }, - \v!right=>\def\raggedbox{\doalignedline\v!right }, - \v!middle=>\def\raggedbox{\doalignedline\v!middle}, - \v!inner=>\def\raggedbox{\doalignedline\v!inner }, - \v!outer=>\def\raggedbox{\doalignedline\v!outer }, - \v!flushleft=>\def\raggedbox{\doalignedline\v!right }, - \v!flushright=>\def\raggedbox{\doalignedline\v!left }, - \v!center=>\def\raggedbox{\doalignedline\v!middle}]} - -\def\dosetraggedcommand#1% - {\expanded{\dodosetraggedcommand{#1}}} - -% \def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! -% {\let\raggedcommand \relax -% \let\raggedtopcommand \empty -% \let\raggedbottomcommand\empty -% \chardef\raggedoneliner\zerocount -% \doifsomething{#1} -% {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse -% \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse -% \!!donectrue -% \rawprocesscommalist[#1]\dododosetraggedcommand}} - -\newtoks\everyraggedcommand - -\def\raggedcommand{\the\everyraggedcommand} - -\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! - {\everyraggedcommand \emptytoks - \let\raggedtopcommand \empty - \let\raggedbottomcommand\empty - \chardef\raggedoneliner\zerocount - \doifsomething{#1} - {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse - \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse - \!!donectrue - \rawprocesscommalist[#1]\dododosetraggedcommand}} - -\def\dododosetraggedcommand#1% - {\executeifdefined{\@@ragged@@command\string#1}\relax} - -\def\@@ragged@@command{@@raggedcommand} - -\setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nohz }{\appendtoks\disableadjusting \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!spacing }{\appendtoks\enablespacehandling - \enablekernhandling \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nospacing }{\appendtoks\disablespacehandling - \disablekernhandling \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!hyphenated }{\appendtoks\dohyphens \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nothyphenated}{\appendtoks\nohyphens \to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!tolerant }{\appendtoks\tolerance3000\relax \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!verytolerant}{\appendtoks\tolerance4500\relax \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!stretch }{\appendtoks\emergencystretch\bodyfontsize\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!left}% - {\if!!donea \appendtoks\veryraggedleft\to\everyraggedcommand - \else \appendtoks\raggedleft \to\everyraggedcommand - \fi - \!!donecfalse} - -\setvalue{\@@ragged@@command\v!right}% - {\if!!donea \appendtoks\veryraggedright\to\everyraggedcommand - \else \appendtoks\raggedright \to\everyraggedcommand - \fi - \!!donecfalse} - -\setvalue{\@@ragged@@command\v!middle}% - {\if!!donec - \if!!doneb \appendtoks\raggedwidecenter\to\everyraggedcommand - \else\if!!donea \appendtoks\veryraggedcenter\to\everyraggedcommand - \else \appendtoks\raggedcenter \to\everyraggedcommand - \fi\fi - \!!donecfalse - \else - \let\raggedbottomcommand\vfilll % bonus, pretty strong - \let\raggedtopcommand \vfilll % used with \framed for - \fi} % instance in tables - -\setvalue{\@@ragged@@command\v!flushleft }{\getvalue{\@@ragged@@command\v!right }} -\setvalue{\@@ragged@@command\v!flushright}{\getvalue{\@@ragged@@command\v!left }} -\setvalue{\@@ragged@@command\v!center }{\getvalue{\@@ragged@@command\v!middle}} - -\setvalue{\@@ragged@@command\v!high}% - {\let\raggedbottomcommand\vfilll} % and since we lack a - -\setvalue{\@@ragged@@command\v!low}% - {\let\raggedtopcommand\vfilll} % proper keyword, but - -\setvalue{\@@ragged@@command\v!lohi}% - {\let\raggedbottomcommand\vfilll % we do support the - \let\raggedtopcommand\vfilll} % ugly laho (lohi) - -\setvalue{\@@ragged@@command\v!no}% - {\appendtoks\raggedright\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!yes}% - {\appendtoks\notragged\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!normal}% - {\appendtoks\notragged\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!inner}% not yet perfect - {\signalrightpage % may interfere - \doifrightpageelse - {\getvalue{\@@ragged@@command\v!right}} - {\getvalue{\@@ragged@@command\v!left}}} - -\setvalue{\@@ragged@@command\v!outer}% not yet perfect - {\signalrightpage % may interfere - \doifrightpageelse - {\getvalue{\@@ragged@@command\v!left}} - {\getvalue{\@@ragged@@command\v!right}}} - -\setvalue{\@@ragged@@command\v!lesshyphenation}% - {\appendtoks\lesshyphens\to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!morehyphenation}% - {\appendtoks\morehyphens\to\everyraggedcommand} - -% compare: -% -% \framed[width=4cm,align=no] {\hfil xxx} -% \framed[width=4cm,align=disable]{\hfil xxx} - -\setvalue{\@@ragged@@command\v!disable}% for one liners - {\appendtoks\raggedright\parfillskip\zeropoint\to\everyraggedcommand} - -\chardef\raggedoneliner\zerocount - -\setvalue{\@@ragged@@command\v!line}% - {\chardef\raggedoneliner\plusone} - -%D Unofficial, may disappear. Now handled directly in the -%D core-rul module. - -% \def\@@startraggedoneliner -% {\ifcase\raggedoneliner\else -% \dontleavehmode\hbox to \hsize \bgroup % hsize added, else useless -% \ifcase\raggedstatus\or\hss\or\hss\fi -% \ignorespaces -% \bgroup -% \aftergroup\removeunwantedspaces -% \fi} - -% \def\@@stopraggedoneliner -% {\ifcase\raggedoneliner\else -% \egroup -% \ifcase\raggedstatus\or\or\hss\or\hss\fi -% \egroup -% \ignorespaces % ? ? ? -% \fi} - -% \def\@@handleoneliner -% {\ifcase\raggedoneliner\else -% \@@startraggedoneliner -% \aftergroup\@@stopraggedoneliner -% \fi} - -% Nog doen: -% -% \goodbreak -> \allowbreak en \dosomebreak{..} in koppen -% -% bij koppen zowieso: \blanko[reset] - -% Nog in commando verwerken: -% -% \voorkeur … la \blanko -% -% Om ongewenste witruimte te voorkomen kan met \dosomebreak{\break} -% een \penalty voor witruimte worden geplaatst. - -\def\removelastskip % a redefinition of plain - {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi} - -% first version: -% -% \def\dosomebreak#1% -% {\scratchskip\lastskip -% \removelastskip -% %\type{#1}% -% #1\relax -% \ifdim\scratchskip=\zeropoint \else -% \vskip\scratchskip -% \fi} -% -% don't change the next improvement: - -% \def\dosomebreak#1% -% {\endgraf % beware, this forces a newline -% \ifvmode -% \ifdim\lastskip=\zeropoint -% #1\relax -% \else -% \scratchskip\lastskip -% \removelastskip -% #1\relax -% \vskip\scratchskip -% \fi -% \fi} - -% beter, vooral in \vbox; nog in \pagina toepassen s! - -\def\doifoutervmode#1% - {\ifvmode\ifinner\else#1\fi\fi} - -\ifx\dosomebreak\undefined % defined in mkiv - - \def\dosomebreak#1% - {\doifoutervmode - {\scratchskip\lastskip - \removelastskip - %\leavevmode\type{#1}% - #1\relax - \ifdim\scratchskip=\zeropoint % else interference with footnotes - \else - \vskip\scratchskip - \fi}} - -\fi - -\def\forgeteverypar - {\everypar{\the\neverypar}} - -%\def\forgetparindent -% {\forgeteverypar -% \indentfirstparagraphtrue % recently added -% \setupindenting[\v!geen]} - -%\def\forgetparskip -% {\setupwhitespace[\v!geen]} - -\def\forgetparindent - {\forgeteverypar - \indentfirstparagraphtrue % recently added - \let\currentindentation\v!none - \ctxparindent\zeropoint - \parindent\zeropoint\relax} - -\def\forgetparskip - {\let\currentwhitespace\v!none - \ctxparskip\zeropoint - \parskip\zeropoint\relax} - -\def\forgetbothskips - {\tolerance1500 - \leftskip\zeropoint - \rightskip\zeropoint\relax} - -\def\forgetspacing - {\emergencystretch\zeropoint} - -\newif\ifforgotten % rather good signal for inner - -\appendtoks \forgottentrue \to \everyforgetall -\appendtoks \forgetragged \to \everyforgetall -\appendtoks \forgetparskip \to \everyforgetall -\appendtoks \forgetparindent \to \everyforgetall -\appendtoks \forgetbothskips \to \everyforgetall -\appendtoks \forgetspacing \to \everyforgetall % i.v.m. funny spacing in pagebody -\appendtoks \spacing\!!plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed -\appendtoks \everypar\emptytoks \to \everyforgetall % indeed! - -\def\localvbox#1#% - {\vbox#1\bgroup - \forgetparskip - \setlocalhsize - \hsize\localhsize - \forgetparindent - \forgetbothskips - \forgeteverypar - \let\next=} - -% ach ja, hoort niet hier - -% \unexpanded\def\dostartattributes#1#2#3% -% {\begingroup % geen \bgroup, anders in mathmode lege \hbox -% \doifdefinedelse{#1#2} -% {\def\fontattribute{\getvalue{#1#2}}} -% {\let\fontattribute=\empty}% -% \doifdefinedelse{#1#3} -% {\def\colorattribute{\getvalue{#1#3}}} -% {\let\colorattribute=\empty}% -% \startcolor[\colorattribute]% -% \@EA\doconvertfont\@EA{\fontattribute}} -% -% \unexpanded\def\dostopattributes% -% {\stopcolor -% \endgroup} -% -% \unexpanded\def\doattributes#1#2#3#4% -% {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes} - -%D A hardly faster implementation follows. We cannot use -%D \type {csname} testing since the first argument can be -%D anything, even a raw fontswitch. No a real improvement -%D (some 5 seconds on 260 seconds for the maps bibliography). - -\let\dostopattributes\relax % in case these commands end up in an edef - -\unexpanded\def\dostartattributes#1#2#3% - {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \ifcsname#1#3\endcsname - \let\dostopattributes\@@dostopattributes - \startcolor[\csname#1#3\endcsname]% - \else - \let\dostopattributes\@@nostopattributes - \fi - \ifcsname#1#2\endcsname - \expandafter\doconvertfont - \else - \expandafter\gobbleoneargument - \fi{\csname#1#2\endcsname}} - -\newconditional \parbasedattributes - -\def\finishparbasedattributes - {\ifconditional\parbasedattributes - \setfalse\parbasedattributes - \par - \fi} - -\def\dostopparbasedattributes - {\settrue\parbasedattributes - \dostopattributes} - -\unexpanded\def\@@dostopattributes - {\stopcolor - \finishparbasedattributes - \endgroup} - -\unexpanded\def\@@nostopattributes - {\finishparbasedattributes - \endgroup} - -\unexpanded\def\doattributes#1#2#3#4% - {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes} - -% An even faster \ETEX\ version: - -\unexpanded\def\dostartattributes#1#2#3% - {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \ifincolor - \ifcsname#1#3\endcsname - \let\dostopattributes\@@dostopattributes - \faststartcolor[\csname#1#3\endcsname]% - \else - \let\dostopattributes\@@nostopattributes - \fi - \else - \let\dostopattributes\@@nostopattributes - \fi - \ifcsname#1#2\endcsname - % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi} - -\unexpanded\def\@@dostopattributes - {\faststopcolor - \finishparbasedattributes - \endgroup} - -\unexpanded\def\@@nostopattributes - {\finishparbasedattributes - \endgroup} - -%D Bonus macro, see core-sec.tex - -\unexpanded\def\dosetfontattribute#1#2% - {\ifcsname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi\empty} - -%D Since this happens a lot, and sometimes large arguments -%D are passed in \type {#4}, we just copy some code: - -\unexpanded\def\doattributes#1#2#3#4% - {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \ifincolor - \ifcsname#1#3\endcsname - \let\dostopattributes\@@dostopattributes - \faststartcolor[\csname#1#3\endcsname]% - \else - \let\dostopattributes\endgroup - \fi - \else - \let\dostopattributes\endgroup - \fi - \ifcsname#1#2\endcsname - % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi - {#4}% - \dostopattributes} - -% Kan vaker worden toegepast en moet bovendien sneller! - -\newskip\leftskipadaption -\newskip\rightskipadaption - -\def\doadaptleftskip#1% - {\dosetleftskipadaption{#1}% - \advance\leftskip \leftskipadaption} - -\def\doadaptrightskip#1% - {\dosetrightskipadaption{#1}% - \advance\rightskip \rightskipadaption} - -\setvalue{@lsa@\v!standard}{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} -\setvalue{@lsa@\v!yes }{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} -\letvalue{@lsa@\v!no }\zeropoint -\letvalue{@lsa@\empty }\zeropoint -\setvalue{@rsa@\v!standard}{\@@slright} -\setvalue{@rsa@\v!yes }{\@@slright} -\letvalue{@rsa@\v!no }\zeropoint -\letvalue{@rsa@\empty }\zeropoint - -% not safe for 2\parindent -% -% \def\dosetleftskipadaption#1% -% {\leftskipadaption -% \ifcsname @lsa@#1\endcsname -% \csname @lsa@#1\endcsname -% \else -% #1% -% \fi -% \relax} - -\def\dosetleftskipadaption#1% - {\edefconvertedargument\ascii{@lsa@#1}% - \leftskipadaption - \ifcsname\ascii\endcsname - \csname\ascii\endcsname - \else - #1% - \fi - \relax} - -\def\dosetrightskipadaption#1% - {\edefconvertedargument\ascii{@rsa@#1}% - \rightskipadaption - \ifcsname\ascii\endcsname - \csname\ascii\endcsname - \else - #1% - \fi - \relax} - -\newcount \noftrackedpagestates -\newif \ifpagestatemismatch -\newcount \realpagestateno -\chardef \frozenpagestate \zerocount - -\def\dotrackpagestate#1#2% - {\ifdoublesided \ifinpagebody \else - \doforcedtrackpagestate{#1}{#2}% - \fi \fi} - -\def\doforcedtrackpagestate#1#2% - {\ifcase\frozenpagestate - \global\advance\noftrackedpagestates\plusone - \global\advance#2\plusone - \lazysavetaggedtwopassdata{#1}{\number\noftrackedpagestates}{\number#2}{\noexpand\realfolio}% - %\llap{\infofont\number\noftrackedpagestates/\number#2}% tracing - \fi} - -\def\doifrightpagestateelse#1#2% - {\ifcase\frozenpagestate - \pagestatemismatchfalse - \realpagestateno\realfolio - \ifinpagebody - \ifdoublesided - \ifodd\realpageno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \else - \twopassdatafoundtrue - \fi - \else\ifdoublesided - \findtwopassdata{#1}{\number#2}% - \iftwopassdatafound - \realpagestateno\twopassdata\relax - \ifnum\twopassdata=\realpageno \else - \pagestatemismatchtrue - \fi - \ifodd\twopassdata\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \else - \ifodd\realpageno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \else - \twopassdatafoundtrue - \fi\fi - \else - \ifodd\realpagestateno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \iftwopassdatafound - \@EA\firstoftwoarguments - \else - \@EA\secondoftwoarguments - \fi} - -\def\doifforcedrightpagestateelse#1#2% - {\ifcase\frozenpagestate - \pagestatemismatchfalse - \realpagestateno\realfolio - \findtwopassdata{#1}{\number#2}% - \iftwopassdatafound - \realpagestateno\twopassdata\relax - \ifnum\twopassdata=\realpageno \else - \pagestatemismatchtrue - \fi - \ifodd\twopassdata\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \else - \ifodd\realpageno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \else - \ifodd\realpagestateno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \iftwopassdatafound - \@EA\firstoftwoarguments - \else - \@EA\secondoftwoarguments - \fi} - -\def\freezepagestate {\chardef\frozenpagestate\plusone } -\def\defrostpagestate{\chardef\frozenpagestate\zerocount} - -% we can make more of these on top, but how to deal with mixed frozen states - -\definetwopasslist\s!paragraph \newcount \nofraggedparagraphs - -\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs} -\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs} - -\newcount\pagesignallevel - -\def\startsignalrightpage % one may do a \postsignalrightplace - {\advance\pagesignallevel\plusone - \presignalrightpage - \let\signalrightpage\relax - \let\presignalrightpage\relax - \let\startsignalrightpage\relax - \doifrightpageelse\donothing\donothing - \freezepagestate} - -\def\stopsignalrightpage - {\ifcase\pagesignallevel\or\postsignalrightpage\fi - \advance\pagesignallevel\minusone} - -\def\setraggedparagraphmode - {\signalrightpage\doifrightpageelse} % move it there - -\ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo - -\def\doifswappedrightpageelse#1#2% alleen in box construction ! - {\doifrightpageelse - {#1} - {\scratchcounter\realpageno - \realpageno\realpagestateno\relax - \swapmargins - \realpageno\scratchcounter - #2}} - -\newbox\signaledrightpage % this way we can avoid interference, i.e. postpone placement - -\def\presignalrightpage {\global\setbox\signaledrightpage\hbox{\signalrightpage}} -\def\postsignalrightpage{\ifvoid\signaledrightpage\else\box\signaledrightpage\fi} - -% The next feature is is used in: -% -% \definenumber[test][way=bypage] -% -% \def\Test -% {\incrementnumber[test]\rawnumber[test]/% -% \incrementnumber[test]\rawnumber[test]/% -% \incrementnumber[test]\rawnumber[test]\space -% \checkpagechange{oeps}\changedpage{oeps}\space -% \ifpagechanged TRUE\else FALSE\fi} -% -% \Test\page \Test\par \Test\page \Test\par \Test\page \Test\page -% -% (adapted from cont-new.tex:) - -\newif\ifpagechanged \let\lastchangedpage\empty - -\def\docheckpagestatechange#1#2#3% - {\pagechangedfalse - \doforcedtrackpagestate{#2}{#3}% - \findtwopassdata{#2}{\number#3}% - \iftwopassdatafound - \ifnum\twopassdata>0\getvalue{#2:p:#1}\relax - \pagechangedtrue - \fi - \fi - \ifpagechanged - \letgvalue{#2:p:#1}\twopassdata - \globallet\lastchangedpage\twopassdata - \else - \globallet\lastchangedpage\realfolio - \fi} - -\def\changedpagestate#1#2% - {\executeifdefined{#2:p:#1}{0}} - -\def\checkpagechange#1{\docheckpagestatechange{#1}\s!paragraph\nofraggedparagraphs} -\def\changedpage #1{\changedpagestate{#1}\s!paragraph} - -% saved struts - -\ifx\savedstrutbox\undefined \newbox\savedstrutbox \fi - -\def\savestrut {\setbox\savedstrutbox\copy\strutbox} -\def\savedstrut{\copy \savedstrutbox} - -% De onderstaande macro's zijn opgenomen in Plain TeX. -% -% \def\raggedright% -% {\rightskip\zeropoint plus2em \spaceskip.3333em \xspaceskip.5em\relax} -% -% \def\ttraggedright% -% {\tttf\rightskip\zeropoint plus2em\relax} -% -% \newif\ifr@ggedbottom -% -% \def\raggedbottom% -% {\topskip 10\points plus60\points \r@ggedbottomtrue} -% -% \def\normalbottom% -% {\topskip 10\points \r@ggedbottomfalse} -% -% en worden hieronder wat aangepast. - -% the three boolean will become obsolete some day in favour -% of \bottomraggedness - -\chardef\bottomraggedness=0 % 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 - {\chardef\bottomraggedness\zerocount - \n@rmalbottomfalse - \r@ggedbottomtrue - \b@selinebottomfalse - \settopskip} - -\def\alignbottom - {\chardef\bottomraggedness\plusone - \n@rmalbottomtrue - \r@ggedbottomfalse - \b@selinebottomfalse - \settopskip} - -\def\baselinebottom - {\chardef\bottomraggedness\plustwo - \n@rmalbottomfalse - \r@ggedbottomfalse - \b@selinebottomtrue - \settopskip} - -\let\normalbottom=\alignbottom % downward compatible - -% so, the new one will be -% -% \chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline -% -% \def\bottomalignlimit{3\lineheight} % will be settable -% -% \def\raggedbottom {\chardef\bottomraggedness=0 \settopskip} -% \def\alignbottom {\chardef\bottomraggedness=1 \settopskip} -% \def\baselinebottom{\chardef\bottomraggedness=2 \settopskip} -% -% \let\normalbottom =\alignbottom - -% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness -% \tolerance >= 1500 % was 200 -% \raggedness = 2 .. 6\bodyfontsize - -\chardef\raggedstatus=0 % normal left center right - -\def\leftraggedness {2\bodyfontsize} -\def\rightraggedness {2\bodyfontsize} -\def\middleraggedness {6\bodyfontsize} - -\def\middleraggedness {.5\hsize} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} - -% oeps, hsize can be 0pt in which case we get a strange division - -\def\middleraggedness {\ifdim\hsize=\zeropoint6\bodyfontsize\else.5\hsize\fi} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} - -%D More hyphenation control, will be combined with align -%D setup. - -\def\nohyphens - {\ifx\dohyphens\relax - \edef\dohyphens - {\hyphenpenalty\the\hyphenpenalty - \exhyphenpenalty\the\exhyphenpenalty\relax}% - \fi - \hyphenpenalty\plustenthousand - \exhyphenpenalty\plustenthousand} - -\let\dohyphens\relax - -%D To prevent unwanted side effects, we also have to check -%D for hyphens here: - -% \def\setraggedness#1% -% {\ifnum\tolerance<1500\relax % small values have -% \tolerance1500\relax % unwanted side effects -% \fi -% \spaceskip2.5\hsize % we misuse these registers -% \xspaceskip#1\relax % for temporary storage; -% \divide\spaceskip \xspaceskip % they are changed anyway -% \ifx\dohyphens\relax -% \hyphenpenalty\spaceskip % \else no hyphens is active -% \fi} - -\newskip\@@raggedskipa -\newskip\@@raggedskipb - -\def\setraggedness#1% - {\ifnum\tolerance<1500\relax % small values have - \tolerance1500\relax % unwanted side effects - \fi - \ifx\dohyphens\relax - % this code will be reconsidered / kind of fuzzy (and old) - \@@raggedskipa 2.5\hsize - \@@raggedskipb #1\relax - \divide\@@raggedskipa \@@raggedskipb - \hyphenpenalty\@@raggedskipa - \fi} - -\let\updateraggedskips\relax - -\def\setraggedskips#1#2#3#4#5#6#7% never change this name - {\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}% - \updateraggedskips} - -\def\dosetraggedskips#1#2#3#4#5#6#7% - {\chardef \raggedstatus#1\relax - \leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3 - \rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3 - \spaceskip #4\relax - \xspaceskip #5\relax - \parfillskip\zeropoint\!!plus#6\relax - \parindent #7\relax} - -% \def\notragged% -% {\setraggedskips{0}{0em}{0em}{0em}{0em}{1fil}{\parindent}} - -% older (context) names: - -\let\spaceamount \interwordspace -\let\emspaceamount\emwidth - -% tracing: - -\def\doshowpardata#1% - {\ifx#1\relax\else - \hbox{\string#1: \the#1}\endgraf - \expandafter\doshowpardata - \fi} - -\def\showpardata - {\edef\thepardata - {\hbox{font: \fontname\font}\endgraf - \doshowpardata - \interwordspace \interwordstretch \interwordshrink \emwidth \exheight \extraspace - \hsize \vsize - \leftskip \rightskip - \spaceskip \xspaceskip - \parindent \parfillskip - \hyphenpenalty \exhyphenpenalty - \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty - \doublehyphendemerits \finalhyphendemerits \adjdemerits - \relax}% - \begingroup - \dontshowcomposition - \inleftmargin{\vsmash - {\switchtobodyfont[7pt,tt]% - \framed[\c!align=\v!right]{\thepardata}}}% - \endgroup} - -\def\startshowpardata - {\begingroup - \showcomposition - \showstruts\tracepositionstrue \tracingparagraphs\maxdimen - \appendtoksonce\showpardata\let\showpardata\relax\to\everypar} - -\def\stopshowpardata - {\endgraf - \endgroup} - -% \defineXMLenvironment[showpardata] \startshowpardata \stopshowpardata -% \defineXMLsingular [showpardata] \showpardata - -% defaults - -\def\raggedfillamount {1fil} -\def\raggedhalffillamount{.5fil} -\def\raggedspaceamount {\interwordspace} % {.3333em} -\def\raggedxspaceamount {.5em} - -\def\notragged - {\chardef\raggedstatus\zerocount - \leftskip 1\leftskip - \rightskip 1\rightskip - \spaceskip \zeropoint - \xspaceskip \zeropoint - \parfillskip\zeropoint\!!plus\raggedfillamount\relax - \let\updateraggedskips\relax} % new - -\let\forgetragged\notragged - -\def\raggedleft - {\setraggedness\leftraggedness - \setraggedskips1\leftraggedness\zeropoint\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -\def\raggedcenter - {\setraggedness\middleraggedness - \setraggedskips2\middleraggedness\middleraggedness\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -%D We used to have: -%D -%D \starttyping -%D \def\raggedright -%D {\setraggedness\rightraggedness -%D \setraggedskips{3}{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}} -%D \stoptyping -%D -%D However, the next alternative, suggested by Taco, is better. - -\def\raggedright - {\setraggedness\rightraggedness - \setraggedskips3\zeropoint\rightraggedness\raggedspaceamount - \raggedxspaceamount\raggedfillamount\parindent} - -\def\veryraggedleft - {\setraggedskips1\raggedfillamount\zeropoint\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -%D When we want the last line to have a natural width: -%D -%D \starttyping -%D \def\veryraggedleft% -%D {\setraggedskips{1}{1fil}{0em}{.3333em}{.5em}{0em}{-1fil}} -%D \stoptyping -%D -%D but this one is not accepted by the macros. - -\def\veryraggedcenter - {\setraggedskips2\raggedfillamount\raggedfillamount\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -\def\veryraggedright - {\setraggedskips3\zeropoint\raggedfillamount\raggedspaceamount - \raggedxspaceamount\zeropoint\parindent} - -\def\ttraggedright - {\tttf - \setraggedskips3\zeropoint\rightraggedness - \zeropoint\zeropoint\zeropoint\parindent} % \ctxparindent - -%D A bonus one: - -\def\raggedwidecenter - {\setraggedness\middleraggedness - \setraggedskips2\raggedhalffillamount\raggedhalffillamount - \raggedspaceamount\raggedxspaceamount\zeropoint\zeropoint} - -\newif\if@@asragged \@@asraggedtrue % old method - -% todo -% -% \setuplayout[grid=yes,lines=44] \showgrid -% \starttext -% test \vfill test \endgraf \strut \endgraf \vskip-\lineheight \removedepth \pagina test -% \stoptext - -% \setupalign[reset,new,right,old] - -\def\@@align@@rl{\if!!donea\veryraggedleft \else\raggedleft \fi} -\def\@@align@@rr{\if!!donea\veryraggedright \else\raggedright \fi} -\def\@@align@@rc{\if!!donea\veryraggedcenter\else\raggedcenter\fi} - -\setvalue{@@ngila@@\v!broad }{\!!doneatrue} -\setvalue{@@ngila@@\v!wide }{\!!donebtrue} - -\def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads - -\installalign \v!new {\@@asraggedfalse} -\installalign \v!old {\@@asraggedtrue} -\installalign \empty {} - -\installalign \v!line {\baselinebottom} -\installalign \v!bottom {\raggedbottom} -\installalign \v!height {\normalbottom} -\installalign \v!width {\notragged} -\installalign \v!normal {\notragged} -\installalign \v!yes {\notragged} -\installalign \v!no {\raggedright} -\installalign \v!inner {\if@@asragged \setraggedparagraphmode\@@align@@rl\@@align@@rr \else - \setraggedparagraphmode\@@align@@rr\@@align@@rl \fi} -\installalign \v!outer {\if@@asragged \setraggedparagraphmode\@@align@@rr\@@align@@rl \else - \setraggedparagraphmode\@@align@@rl\@@align@@rr \fi} -\installalign \v!left {\if@@asragged\@@align@@rl\else\@@align@@rr\fi} -\installalign \v!right {\if@@asragged\@@align@@rr\else\@@align@@rl\fi} -\installalign \v!middle {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} -\installalign \v!flushleft {\if!!donea\veryraggedright \else\raggedright\fi} -\installalign \v!flushright {\if!!donea\veryraggedleft \else\raggedleft \fi} -\installalign \v!flushouter {\setraggedparagraphmode\raggedleft\raggedright} -\installalign \v!flushinner {\setraggedparagraphmode\raggedright\raggedleft} -\installalign \v!center {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} -\installalign \v!hanging {\enableprotruding} -\installalign \v!nothanging {\disableprotruding} -\installalign \v!hz {\enableadjusting} -\installalign \v!nohz {\disableadjusting} -\installalign \v!spacing {\enablespacehandling \enablekernhandling} -\installalign \v!nospacing {\disablespacehandling\disablekernhandling} -\installalign \v!hyphenated {\dohyphens} -\installalign \v!nothyphenated {\nohyphens} -\installalign \v!new {\@@asraggedfalse} % so new will give you consistency -\installalign \v!reset {\notragged\normalbottom} - -\installalign \v!tolerant {\tolerance3000 \relax} -\installalign \v!verytolerant {\tolerance4500 \relax} -\installalign \v!stretch {\emergencystretch\bodyfontsize} - -\newcount\hyphenminoffset - -\ifx\sethyphenationvariables\undefined \let\sethyphenationvariables\relax \fi - -\def\lesshyphens - {\advance\hyphenminoffset\plusone - \sethyphenationvariables} - -\def\morehyphens - {\ifcase\hyphenminoffset \else - \advance\hyphenminoffset\minusone - \fi - \sethyphenationvariables} - -\installalign \v!lesshyphenation {\lesshyphens} -\installalign \v!morehyphenation {\morehyphens} - -\def\dodosetupalign#1{\csname @@align@@#1\endcsname} -\def\dodosetupngila#1{\csname @@ngila@@#1\endcsname} - -\def\setupalign - {\dosingleargument\dosetupalign} - -\def\dosetupalign[#1]% can be made faster by checking for defined #1 - {\!!doneafalse - \!!donebfalse - \processcommacommand[#1]\dodosetupngila - \processcommacommand[#1]\dodosetupalign} - -% \setupalign[flushleft] \input ward \par % lijnlinks -% \setupalign[right] \input ward \par - -% \setupalign[flushright] \input ward \par % lijnrechts -% \setupalign[left] \input ward \par - -% \setupalign[middle] \input ward \par % centreer -% \setupalign[center] \input ward \par - -\def\startalignment - {\bgroup - \setupalign} - -\def\stopalignment - {\par - \egroup} - -\chardef\alignstrutmode=1 - -% see later for the real definition, which in the simple case is: - -\newtoks \everyleftofalignedline -\newtoks \everyrightofalignedline - -\def\shiftalignedline#1#2#3#4% left, right, inner, outer - {\rightorleftpageaction - {\everyleftofalignedline {\hskip\dimexpr#1+#3\relax}% - \everyrightofalignedline{\hskip\dimexpr#2+#4\relax}} - {\everyleftofalignedline {\hskip\dimexpr#1+#4\relax}% - \everyrightofalignedline{\hskip\dimexpr#2+#3\relax}}} - -% \def\doalignline#1#2% \\ == newline -% {\begingroup -% \setlocalhsize % new -% \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}% -% \dowithnextbox -% {\noindentation % was \noindent -% \dontleavehmode % added in marrakesch at TUG 2006 -% \hbox to \localhsize -% {\ifcase\alignstrutmode\or\strut\fi -% \the\everyleftofalignedline -% #1\unhbox\nextbox#2\relax -% \the\everyrightofalignedline}% -% \endgroup} -% \hbox} - -\def\doalignline#1#2% \\ == newline - {\noindentation % was \noindent - \dontleavehmode % added in marrakesch at TUG 2006\begingroup - \begingroup - \setlocalhsize % new - \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}% - \dowithnextbox - {\hbox to \localhsize - {\ifcase\alignstrutmode\or\strut\fi - \the\everyleftofalignedline - #1\unhbox\nextbox#2\relax - \the\everyrightofalignedline}% - \endgroup} - \hbox} - -% plain commands - -\ifx\undefined\line \def\line {\hbox to\hsize} \fi -\ifx\undefined\leftline \def\leftline #1{\line{#1\hss}} \fi -\ifx\undefined\rightline \def\rightline #1{\line{\hss#1}} \fi -\ifx\undefined\centerline \def\centerline#1{\line{\hss#1\hss}} \fi - -% directe commando's - -\def\leftaligned {\doalignline \relax \hss } -\def\midaligned {\doalignline \hss \hss } -\def\rightaligned{\doalignline \hss \relax} - -\let\centeraligned\midaligned - -\def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated - -% indirecte commando's - -\letvalue{\s!do\v!line\v!left }\leftaligned -\letvalue{\s!do\v!line\v!right }\rightaligned -\letvalue{\s!do\v!line\v!middle }\midaligned -\letvalue{\s!do\v!line\v!flushleft }\rightaligned -\letvalue{\s!do\v!line\v!flushright}\leftaligned -\letvalue{\s!do\v!line\v!center }\midaligned - -\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} - -%D Experimental: - -% simple version -% -% \def\doxalignline#1#2% -% {\bgroup -% \setlocalhsize -% \def\\{\egroup\par\doxalignline{#1}{#2}\bgroup}% inefficient -% \dowithnextbox -% {\noindent\hbox to \localhsize -% {\ifcase\alignstrutmode\or\strut\fi -% \signalrightpage -% \doifrightpageelse{#1\unhbox\nextbox#2}{#2\unhbox\nextbox#1}}% -% \egroup} -% \hbox} -% -% \setvalue{\s!do\v!regel\v!binnen}{\doxalignline\relax\hss} -% \setvalue{\s!do\v!regel\v!buiten}{\doxalignline\hss\relax} -% -% more extensive: - -\def\doxalignline#1#2#3#4#5#6% - {\noindentation % was \noindent - \dontleavehmode % added in marrakesch at TUG 2006\begingroup - \begingroup - \setlocalhsize - \def\\{\egroup\par\doxalignline#1#2#3#4#5#6\bgroup}% inefficient - \dowithnextbox - {%\noindent moved up - \hbox to \localhsize - {#1\hskip\ifdone#2\else#3\fi#4% - \hbox to \localhsize - {\the\everyleftofalignedline - \ifcase\alignstrutmode\or\strut\fi - \ifdone#5\unhbox\nextbox#6\else#6\unhbox\nextbox#5\fi - \the\everyrightofalignedline}% - \hss}% - \endgroup} - \hbox} - -\def\doxcheckline - {\signalrightpage\doifrightpageelse\donetrue\donefalse} - -\setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss } -\setvalue{\s!do\v!line\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax} -\setvalue{\s!do\v!line\v!innermargin}{\doxalignline\doxcheckline-+\innermargintotal\relax\hss } -\setvalue{\s!do\v!line\v!outermargin}{\doxalignline\doxcheckline+-\outermargintotal\hss \relax} -\setvalue{\s!do\v!line\v!inneredge }{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss } -\setvalue{\s!do\v!line\v!outeredge }{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax} -\setvalue{\s!do\v!line\v!backspace }{\doxalignline\doxcheckline-+\backspace \relax\hss } -\setvalue{\s!do\v!line\v!cutspace }{\doxalignline\doxcheckline+-\cutspace \hss \relax} - -\setvalue{\s!do\v!line\v!leftmargin }{\doxalignline\donefalse --\leftmargintotal \hss \relax} -\setvalue{\s!do\v!line\v!rightmargin}{\doxalignline\donefalse ++\rightmargintotal\relax\hss } -\setvalue{\s!do\v!line\v!leftedge }{\doxalignline\donefalse --\leftedgetotal \hss \relax} -\setvalue{\s!do\v!line\v!rightedge }{\doxalignline\donefalse ++\rightedgetotal \relax\hss } - -% ! ! ! beware, redefining \doalignline gives the wrong results ! ! ! -% -% \def\doalignline{\doxalignline\donefalse++\zeropoint} - -%D Better: - -\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} - -% \def\alignedline#1#2% setting default -% {\csname -% \s!do\v!line -% \ifundefined{\s!do\v!line#1}#2\else#1\fi -% \endcsname} - -\def\alignedline#1#2% setting default - {\csname\s!do\v!line\ifcsname\s!do\v!line#1\endcsname#1\else#2\fi\endcsname} - -%D ... - -\def\dosetuptolerance[#1]% - {\doifinsetelse\v!vertical{#1}% - {\ExpandFirstAfter\processallactionsinset - [#1] - [ \v!verystrict=>\def\bottomtolerance{}, - \v!strict=>\def\bottomtolerance{.050}, - \v!tolerant=>\def\bottomtolerance{.075}, - \v!verytolerant=>\def\bottomtolerance{.100}]}% - {\ExpandFirstAfter\processallactionsinset - [#1] - [ \v!stretch=>\emergencystretch\bodyfontsize, - \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax, - \v!verystrict=>\tolerance 200, - \v!strict=>\tolerance1500, - \v!tolerant=>\tolerance3000, - \v!verytolerant=>\tolerance4500]}} - -\def\setuptolerance - {\dosingleargument\dosetuptolerance} - -% \def\woordrechts -% {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}} - -% beware: \wordright{whatever\kern-\rightskip} should work! -% so, no funny boxing here - -\def\dowordright[#1]% - {% don't change - \groupedcommand - {\removeunwantedspaces - \hfill - \allowbreak % changed back from \hskip\zeropoint - \strut - \hfill - \quad % decent spacing - \hbox} - {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}% - \parfillskip\zeropoint - %\finalhyphendemerits\zerocount % yes or no - \par}} - -\def\wordright - {\dosingleempty\dowordright} - -% \dorecurse{5}{something } \wordright{--someone} \endgraf -% \dorecurse{6}{something } \wordright{--someone} \endgraf -% \dorecurse{7}{something } \wordright{--someone} \endgraf -% -% \dorecurse{5}{something } \wordright{--someone else entirely} \endgraf -% \dorecurse{6}{something } \wordright{--someone else entirely} \endgraf -% \dorecurse{7}{something } \wordright{--someone else entirely} \endgraf -% -% \wordright[\rightskip]{whatever} - -% \simplealignedbox{2cm}{right}{x} - -\setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}} -\setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}} -\setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}} -\setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}} -\setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}} - -\def\simplealignedbox#1{\executeifdefined{\s!simple\c!align#1}{\getvalue{\s!simple\c!align\v!right}}} - -%D \macros -%D {pushindentation,popindentation} -%D -%D The pushing and popping is done by: - -\newbox\indentationboxA -\newbox\indentationboxB - -\def\pushindentation - {\bgroup - \ifhmode - \unskip - \setbox\indentationboxA\lastbox % get \strut if present - \unskip - \setbox\indentationboxB\lastbox % get \indent generated box - \unskip - \else - \hskip\zeropoint % switch to horizontal mode - \unskip - \setbox\indentationboxA\lastbox % get \indent generated box - \setbox\indentationboxB\emptybox - \fi} - -\def\popindentation - {\box\indentationboxB\box\indentationboxA % put back the boxes - \egroup} - -%D The only complication lays in \type{\strut}. In \PLAIN\ -%D \TEX\ a \type{\strut} is defined as: -%D -%D \starttyping -%D \def\strut% -%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} -%D \stoptyping -%D -%D But what is a \type{\strut}? Normally it's a rule of width -%D zero, but when made visual, it's a rule and a negative skip. -%D The mechanism for putting things in the margins described -%D here cannot handle this situation very well. One -%D characteristic of \type{\strut} is that the \type{\unhcopy} -%D results in entering horizontal mode, which in return leads -%D to some indentation. -%D -%D To serve our purpose a bit better, the macro \type{\strut} -%D can be redefined as: -%D -%D \starttyping -%D \def\strut -%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox} -%D \stoptyping -%D -%D Or more compatible: -%D -%D \starttyping -%D \def\strut -%D {\relax\ifmmode -%D \copy\strutbox -%D \else -%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup -%D \fi} -%D \stoptyping -%D -%D In \CONTEXT\ however we save some processing time by putting -%D an extra \type{\hbox} around the \type{\strutbox}. - -% moved from page-lin.tex to here (due to visualization added -% in august 2003) -% -% \unexpanded \def\crlf -% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break} - -\unexpanded \def\crlf - {\ifhmode - \unskip - \prewordbreak\crlfplaceholder - \ifcase\raggedstatus\hfil\or\or\or\hfil\fi - \break - \else - \crlfplaceholder - \endgraf - \fi} - -\def\crlfplaceholder - {\strut} - -\def\settestcrlf - {\def\crlfplaceholder - {\hbox to \zeropoint - {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}} - -%D \starttyping -%D % \setuplayout[gridgrid=yes] \showgrid -%D -%D \startbuffer -%D test 1\crlf -%D test 2\crlf -%D -%D \crlf test 3 -%D -%D test 4\crlf -%D test 5 -%D -%D \crlf -%D \crlf -%D \crlf -%D test 6 -%D \stopbuffer -%D -%D \hbox -%D {\hsize5em -%D \ruledvtop{\getbuffer}\enspace -%D \ruledvtop{\showstruts\getbuffer}\enspace -%D \hsize15em \setuptyping[before=,after=]% -%D \ruledvtop{\typebuffer}} -%D \stoptyping - -\def\opeenregel % to be used grouped - {\def\crlf{\removelastspace\space}\let\\\crlf} - -\def\showstruts - {\setteststrut - \settestcrlf} - -\def\definehspace - {\dotripleempty\dodefinehspace} - -\def\dodefinehspace[#1][#2][#3]% #1 = optional namespace - {\ifthirdargument - \setvalue{\??hs#1:#2}{#3}% - \else - \setvalue{\??hs:#1}{#2}% - \fi} - -\unexpanded\def\hspace - {\dodoubleempty\dohspace} - -%\def\dohspace[#1][#2]% -% {\ifhmode -% \removeunwantedspaces -% \hskip -% \ifsecondargument -% \hspaceamount{#1}{#2}% -% \else -% \hspaceamount\empty{\iffirstargument#1\else\s!default\fi}% -% \fi -% \expandafter\ignorespaces -% \fi} - -\def\dohspace[#1][#2]% - {\ifsecondargument - \dodohspace[#1][#2]% - \else\iffirstargument - \hspace[][#1]% - \else - \hspace[][\s!default]% - \fi\fi} - -% \def\dodohspace[#1][#2#3]% -% {\ifhmode -% \removeunwantedspaces -% \doifelse{#2}{-} -% {{\scratchskip\hspaceamount{#1}{#3}\hskip-\scratchskip}} -% {\hskip\hspaceamount{#1}{#2#3}}% -% \expandafter\ignorespaces -% \fi} -% -% not needed, tex handles -- as + - -\def\dodohspace[#1][#2]% - {\ifhmode - \removeunwantedspaces - \hskip\hspaceamount{#1}{#2}% - \expandafter\ignorespaces - \fi} - -\def\hspaceamount#1#2% - {\executeifdefined{\??hs#1:#2}{\executeifdefined{\??hs:#2}\zeropoint}} - -\definehspace [\v!small] [.25\emspaceamount] -\definehspace [\v!medium] [.5\emspaceamount] -\definehspace [\v!big] [1\emspaceamount] -\definehspace [\v!normal] [1\spaceamount] -\definehspace [\v!default] [\spaceamount] - -%D Taken from Taco's math module (cq. \AMS\ macros), but -%D adapted to \type {\hspace}: - -\unexpanded\def\textormathspace#1#2#3% - {\ifmmode\mskip#1#2\else\kern#1\hspaceamount\empty{#3}\fi\relax} - -\newmuskip\hairmuskip \hairmuskip=.15mu - -\def\hairspace {\textormathspace+\hairmuskip{.5}} -\def\thinspace {\textormathspace+\thinmuskip 1} -\def\medspace {\textormathspace+\medmuskip 2} -\def\thickspace {\textormathspace+\thickmuskip3} -\def\neghairspace {\textormathspace-\thinmuskip{.5}} -\def\negthinspace {\textormathspace-\thinmuskip 1} -\def\negmedspace {\textormathspace-\medmuskip 2} -\def\negthickspace{\textormathspace-\thickmuskip3} - -% needed for unicode: - -\def\twoperemspace {\hskip\dimexpr\emwidth/2\relax} % == \enspace -\def\threeperemspace {\hskip\dimexpr\emwidth/3\relax} -\def\fourperemspace {\hskip\dimexpr\emwidth/4\relax} -\def\fiveperemspace {\hskip\dimexpr\emwidth/5\relax} % goodie -\def\sixperemspace {\hskip\dimexpr\emwidth/6\relax} -\def\figurespace {\begingroup\setbox\scratchbox\hbox{0}\hskip\wd\scratchbox\endgroup} % there is a command for this -\def\punctuationspace {\begingroup\setbox\scratchbox\hbox{.}\hskip\wd\scratchbox\endgroup} -\def\ideographicspace {\hskip\dimexpr\emwidth/1\relax} -\def\ideographichalffillspace{\hskip\dimexpr\emwidth/2\relax} -%def\nobreakspace {\penalty\plustenthousand\space} -\def\nobreakspace {\penalty\plustenthousand\kern\interwordspace} -\def\narrownobreakspace {\penalty\plustenthousand\thinspace} -%def\zerowidthnobreakspace {\penalty\plustenthousand\hskip\zeropoint} -\def\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint} -\def\zerowidthspace {\hskip\zeropoint} - -\definehspace[.5][.1250\emspaceamount] % could also be [.1250\spaceamount] -\definehspace[1] [.1667\emspaceamount] -\definehspace[2] [.2222\emspaceamount] -\definehspace[3] [.2777\emspaceamount] - -\let \, \thinspace -\let \: \medspace -\let \; \thickspace -\let \! \negthinspace - -% this will become an alternative bunch of \blank settings -% -% \startlines -% \scratchskip=.23pt plus 10pt minus 4pt \relax \number\scratchskip \space \the\scratchskip -% \setsimplifiedskip\scratchskip1 \number\scratchskip \space \the\scratchskip -% \setsimplifiedskip\scratchskip2 \number\scratchskip \space \the\scratchskip -% \getsimplifiedskip\scratchskip\scratchcounter \number\scratchcounter -% \stoplines -% -% \hrule width10cm \endgraf -% \discardedskip{10pt} -% \retainedskip {4pt} -% \discardedskip {5pt} -% \hrule width10cm \endgraf -% \blockedskip{0pt} -% \discardedskip{10pt} -% \retainedskip {4pt} -% \discardedskip {5pt} -% \hrule width10cm \endgraf -% \frozenskip {4cm} -% \hrule width10cm \endgraf -% \vskip10pt -% \hrule width10cm \endgraf - -% ! ! ! etex only, evt splitskip macro gebruiken (syst-new) - -\newskip\simplifiedskip -\newskip\simplifiedcounter - -\chardef\@@discardedskip1 -\chardef\@@retainedskip 2 -\chardef\@@forcedskip 3 -\chardef\@@blockedskip 4 -\chardef\@@frozenskip 5 % after heads, no break - -\def\setsimplifiedskip#1#2% - {#1\dimexpr(10\dimexpr(#1/10)) plus \gluestretch#1 minus \glueshrink#1\relax - \advance#1\numexpr(#2)sp\relax} - -\def\getsimplifiedskip#1#2% - {\simplifiedskip#1\relax - \ifzeropt\simplifiedskip % \ifdim\simplifiedskip=\zeropoint - #2\zerocount - \else - \simplifiedcounter\dimexpr10\dimexpr#1/10\relax\relax - \advance\simplifiedskip-\simplifiedcounter - #2\number\simplifiedskip\relax - \fi} - -\def\conditionalskip#1#2% - {\scratchskip#1\relax - \setsimplifiedskip\scratchskip#2\relax - \vskip\scratchskip\relax} - -\def\defrostskip - {\scratchskip\lastskip\penalty50000\normalvskip-\scratchskip\penalty50000\relax} - -\def\frozenskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \fi} - -\def\discardedskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifcase\scratchcounter - \conditionalskip{#1}\@@discardedskip - \or % discard - \ifdim\lastskip>#1\else - \normalvskip-\lastskip - \conditionalskip{#1}\@@discardedskip - \fi - \or % retain - \ifdim\lastskip>#1\else - \normalvskip-\lastskip - \conditionalskip{#1}\@@discardedskip - \fi - \or % forced - \conditionalskip{#1}\@@discardedskip - \or % ignored - \or % frozen - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \else\ifdim#1=\zeropoint\else - \vskip#1\relax - \fi\fi - \fi} - -\def\retainedskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifcase\scratchcounter - \conditionalskip{#1}\@@retainedskip - \or % discard - \normalvskip-\lastskip - \conditionalskip{#1}\@@retainedskip - \or % retain - \ifdim\lastskip>#1\else - \normalvskip-\lastskip - \conditionalskip{#1}\@@retainedskip - \fi - \or % forced - \conditionalskip{#1}\@@retainedskip - \or % ignored - \or % frozen - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \else\ifdim#1=\zeropoint\else - \vskip#1\relax - \fi\fi - \fi} - -\def\forcedskip#1% - {\endgraf - \ifvmode - \conditionalskip{#1}\@@forcedskip - \fi} - -\def\blockedskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifcase\scratchcounter - \conditionalskip{#1}\@@blockedskip - \or % discard - \conditionalskip{#1}\@@blockedskip - \or % retain - \conditionalskip{#1}\@@blockedskip - \or % forced - \conditionalskip{#1}\@@blockedskip - \or % ignored - \or % frozen - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \else\ifdim#1=\zeropoint\else - \vskip#1\relax - \fi\fi - \fi} - -% beware, changing this will break some code (like pos/backgrounds) - -\newtoks\everyfirstparagraphintro -\newtoks\everynextparagraphintro -\newtoks\@@everyparagraphtoks - -\chardef\everyparagraphintro\zerocount - -\def\setupparagraphintro - {\dodoubleempty\dosetupparagraphintro} - -\def\dosetupparagraphintro[#1][#2]% - {\processallactionsinset - [#1] - [ \v!reset=>\global\chardef\everyparagraphintro\zerocount - \global\everyfirstparagraphintro\emptytoks - \global\everynextparagraphintro \emptytoks, - \v!first=>\global\chardef\everyparagraphintro\plusone - \doglobal\appendtoks#2\to\everyfirstparagraphintro, - \v!next=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plusone\fi - \doglobal\appendtoks#2\to\everynextparagraphintro, - \v!each=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plustwo\fi - \doglobal\appendtoks#2\to\everyfirstparagraphintro - \doglobal\appendtoks#2\to\everynextparagraphintro]} - -%D We can say: -%D -%D \starttyping -%D \setupparagraphintro[first][\index{Knuth}] -%D \stoptyping -%D -%D Maybe more convenient is: -%D -%D \starttyping -%D \flushatparagraph{\index{Zapf}} -%D \stoptyping - -\def\flushatparagraph#1% - {\global\chardef\everyparagraphintro\plusone - \global\appendtoks{#1}\to\everyfirstparagraphintro} - -% \def\doinsertparagraphintro -% {\ifcase\everyparagraphintro\relax -% % no data -% \@@everyparagraphtoks\emptytoks -% \or -% % first data -% \global\chardef\everyparagraphintro\plustwo -% \@@everyparagraphtoks\everyfirstparagraphintro -% \global\everyfirstparagraphintro\emptytoks -% \or -% % next data -% \@@everyparagraphtoks\everynextparagraphintro -% \fi -% \the\@@everyparagraphtoks} - -\def\doinsertparagraphintro - {\begingroup - \everypar\emptytoks - \ifcase\everyparagraphintro\relax - % no data - \@@everyparagraphtoks\emptytoks - \or - % first data - \global\chardef\everyparagraphintro\plustwo - \@@everyparagraphtoks\everyfirstparagraphintro - \global\everyfirstparagraphintro\emptytoks - \or - % next data - \@@everyparagraphtoks\everynextparagraphintro - \fi - \the\@@everyparagraphtoks - \endgroup} - -\def\insertparagraphintro - {\ifcase\everyparagraphintro\else\@EA\doinsertparagraphintro\fi} - -% \appendtoksonce\insertparagraphintro\to\everypar % should come last - -%D \starttyping -%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}] -%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}] -%D \setupparagraphintro[next] [\hbox to 3.5em{\tt NEXT \hss}] -%D \setupparagraphintro[next] [\hbox to 3.5em{\tt TXEN \hss}] -%D \setupparagraphintro[each] [\hbox to 3.0em{\tt EACH \hss}] -%D \setupparagraphintro[each] [\hbox to 3.0em{\tt HCEA \hss}] -%D -%D some paragraph \par -%D some paragraph \par -%D some paragraph \par -%D -%D \definelabel[parnumber] -%D -%D \setupparagraphintro[reset,each][\inleft{\slxx\parnumber}] -%D -%D some paragraph \par -%D some paragraph \par -%D some paragraph \par -%D \stoptyping - -%D \macros -%D {flushatnextpar} -%D -%D This macro collects data that will be flushed at the next paragraph. -%D By using this macro you can avoid interfering nodes (writes, etc). - -\newbox \postponednodedata - -\def\flushatnextpar - {\bgroup - \dowithnextbox - {\global\setbox\postponednodedata\hbox{\box\postponednodedata\box\nextbox}\egroup}% - \hbox} - -\def\flushpostponednodedata - {\ifvoid\postponednodedata\else - \hbox{\smashedbox\postponednodedata}% - \fi} - -% Very nasty but needed for margin stuff inside colored -% paragraphs. - -\let\normalvadjust\vadjust - -% \def\graphicvadjust % bad, those low level color calls here -% {\dowithnextbox -% {\normalvadjust -% {\dostartgraphicgroup -% \localstarttextcolor -% \unvbox\nextbox -% \localstoptextcolor -% \dostopgraphicgroup}}% -% \vbox} - -% test this prikkels/pascal margin text before heads (mode -% 1) as well as uitwerkingen (mode 2) - -%chardef\graphicvadjustmode=0 % fake -%chardef\graphicvadjustmode=1 % normal -\chardef\graphicvadjustmode=2 % normal + compensate (== default) - -\def\graphicvadjust % bad, those low level color calls here - {\dowithnextboxcontent - {\forgetall} - {\ifcase\graphicvadjustmode \@EA \fakedvadjust \else \@EA\normalvadjust \fi - {\dostartgraphicgroup % don't ask - \localstarttextcolor - \unvbox\nextbox - \localstoptextcolor % don't ask - \dostopgraphicgroup - \ifcase\graphicvadjustmode \or \or - % corrects for one line paragraphs - \nointerlineskip - \kern-\struttotal - \nointerlineskip - \verticalstrut - \fi}}% - \vbox} - -%D This works only in a properly strutted line, and is meant -%D for deeply burried operations, like in heads. - -\def\fakedvadjust - {\dowithnextbox - {\setbox\nextbox\hbox{\llap{\lower\strutdepth\box\nextbox}}% - \smashedbox\nextbox}% - \vtop} - -\def\flexiblespaceamount#1#2#3% - {#1\interwordspace - \!!plus#2\interwordstretch - \!!minus#3\interwordshrink} - -\def\fixedspaceamount#1% - {#1\interwordspace} - -%D This is a dangerous feature because it makes the \TEX\ source -%D less portable, i.e. any parser now needs to apply exactly the -%D same algorithm when it wants to interpret the source. We -%D strongly recommend not to mention this feature in manuals! It's -%D provided for users who are hooked to such a mechanism. -%D -%D \starttyping -%D \setupsorting[logo][next=\autoinsertnextspace] \logo[TEX]{\TeX} -%D -%D bla bla \TEX bla bla \TEX (bla) bla (\TEX) -%D \stoptyping - -\def\autoinsertnextspace{\futurelet\nexttoken\doautoinsertnextspace} - -\def\doautoinsertnextspace % slightly extended version of a user supplied macro - {\ifx\nexttoken \bgroup\else \ifx\nexttoken\begingroup\else - \ifx\nexttoken \egroup\else \ifx\nexttoken \endgroup\else - \ifx\nexttoken \/\else \ifx\nexttoken /\else \ifx\nexttoken ~\else - \ifx\nexttoken \ \else \ifx\nexttoken \blankspace\else \ifx\nexttoken \space\else - \ifx\nexttoken .\else \ifx\nexttoken ,\else - \ifx\nexttoken !\else \ifx\nexttoken ?\else - \ifx\nexttoken :\else \ifx\nexttoken ;\else - \ifx\nexttoken '\else \ifx\nexttoken "\else - \ifx\nexttoken )\else \ifx\nexttoken -\else \ifx\nexttoken |\else - \ifx\nexttoken \%\else \ifx\nexttoken \&\else - \space - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} - -% moved from page-lin - -\def\installspacehandler#1#2% needs to set \obeyedspace - {\setvalue{\??sr#1}{#2}} - -\installspacehandler \v!on - {\obeyspaces - \def\obeyedspace{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}% - \let\ =\obeyedspace} - -\installspacehandler \v!yes - {\obeyspaces - \def\obeyedspace{\mathortext\normalspace{\dontleavehmode \normalspace }}% - \let\ =\obeyedspace} - -\installspacehandler \v!off - {\normalspaces - \let\obeyedspace\normalspace - \let\ =\normalspace} - -\installspacehandler \v!fixed - {\obeyspaces - \def\obeyedspace{\mathortext\normalspace{\dontleavehmode\fixedspace}}% - \let\ =\obeyedspace} - -\def\activatespacehandler#1% - {\executeifdefined{\??sr#1}{\activatespacehandler\v!off}} - -% moved from page-lin - -%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 - -\def\setuplines - {\dodoubleargument\getparameters[\??rg]} - -\def\startlines - {\@@rgbefore - \pushmacro\checkindentation - \whitespace - %\page[\v!preference]} gaat mis na koppen, nieuw: later \nobreak - \begingroup - \setupindenting[\@@rgindenting]% - \typesettinglinestrue - \setupwhitespace[\v!none]% - \obeylines - \ignorespaces - \gdef\afterfirstobeyedline % tzt two pass, net als opsomming - {\gdef\afterfirstobeyedline - {\nobreak - \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}% - \def\obeyedline - {\par - \futurelet\next\dobetweenthelines}% - \activatespacehandler\@@rgspace - \GotoPar} - -\def\stoplines - {\endgroup - \popmacro\checkindentation - \@@rgafter} - -\def\dobetweenthelines - {\doifmeaningelse\next\obeyedline - {\@@rginbetween} - {\afterfirstobeyedline}} - -\setuplines - [\c!option=, - \c!before=\blank, - \c!after=\blank, - \c!inbetween=\blank, - \c!indenting=\v!no, - \c!space=\v!default] - -\def\emptylines - {\dosingleempty\doemptylines} - -\def\doemptylines[#1]% - {\endgraf\dorecurse{\iffirstargument#1\else3\fi}\crlf} - -\setupwhitespace - [\v!none] - -% still old-fashioned - -\indenting - [\v!never] - -\setupindenting - [\v!none] - -\setupblank - [\v!standard, - \v!big] - -\defineblank[\v!default] [\currentblank] -\defineblank[\v!before] [\v!default] -\defineblank[\v!inbetween][\v!default] -\defineblank[\v!after] [\v!before] - -\setupinterlinespace - [\c!minheight=0pt, % only special purpose - \c!mindepth=0pt, % only special purpose - \c!height=.72, - \c!depth=.28, - \c!top=1.0, - \c!bottom=0.4, - \c!distance=1pt, - \c!line=2.8ex, - \c!stretch=0] - -\setupnarrower - [\c!before=\endgraf, - \c!after=\endgraf, - \c!left=1.5em, - \c!right=1.5em, - \c!middle=1.5em] - -\setuptolerance - [\v!horizontal,\v!verystrict] - -\setuptolerance - [\v!vertical,\v!strict] - -\setupalign - [\v!bottom, - \v!width] - -\setupspacing - [\v!packed] - -\protect \endinput diff --git a/tex/context/base/core-spa.mkiv b/tex/context/base/core-spa.mkiv deleted file mode 100644 index 2b17cad11..000000000 --- a/tex/context/base/core-spa.mkiv +++ /dev/null @@ -1,4250 +0,0 @@ -%D \module -%D [ file=core-spa, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Spacing, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Core Macros / Spacing} - -% to be sorted out: dependencies, order of initialization / also some dutch code here -% more documentation in the mkii file - -\unprotect - -% some will move to core-var - -\newif \ifgridsnapping -\newif \iffuzzyvskip -\let \fuzzyvskip \gobbleoneargument -\let \removelastfuzzyvskip \relax - -\let \startbaselinecorrection \relax -\let \stopbaselinecorrection \relax -\let \baselinecorrection \relax -\let \offbaselinecorrection \relax - -\appendtoks \spacing\plusone \to \everybodyfont -\appendtoks \presetnormallineheight \to \everybodyfont -\appendtoks \setnormalbaselines \to \everybodyfont % check if redundant -\appendtoks \setstrut \to \everybodyfont % check if redundant -\appendtoks \settopskip \to \everybodyfont -\appendtoks \setmaxdepth \to \everybodyfont -\appendtoks \simplesetupindenting \to \everybodyfont -\appendtoks \simplesetupblank \to \everybodyfont -\appendtoks \simplesetupwhitespace \to \everybodyfont -%appendtoks \checknotes \to \everybodyfont % not -\appendtoks \simplesetupspacing \to \everybodyfont % nieuw -\appendtoks \setrelativeinterlinespace \to \everybodyfont - -\appendtoks \updateraggedskips \to \everyfontswitch % under test -\prependtoks \let\par\endgraf \to \everypagebody % see \fillinline -\appendtoks \simplesetupspacing \to \everydefinedfont - -% if you want to hyphenate the first word of a paragraph ... \appendtoks\hskip0pt\to\everypar - -\def\stelfactorenin - {\simplesetupwhitespace - \simplesetupblank - \settopskip - \setmaxdepth} - -\def\softbreak - {\relax\ifhmode\hskip\parfillskip\break\fi} - -\let\poplastnode\relax - -\def\pushlastnode - {\ifdim\lastskip=\zeropoint - \ifnum\lastpenalty=\zerocount - \ifnum\lastkern=\zerocount - \let\poplastnode\relax - \else - \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested - \fi - \else - \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested - \fi - \else - \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip - \fi} - -%D The dreadful sequence \type {\bgroup} \unknown\ -%D \type {\carryoverpar} \unknown\ \type {\egroup} is needed -%D when for instance sidefloats are used in combination with -%D something that starts with a group. This is because -%D otherwise the indentation as set (by the output routine) -%D inside the group are forgotten afterwards. (I must -%D not forget its existence). - -\global\let\carriedoverpar\relax - -\def\carryoverpar#1% - {\normalexpanded % \scratchtoks{#1}% - {\noexpand#1% \the\scratchtoks - \hangindent\the\hangindent - \hangafter \the\hangafter - \parskip \the\parskip - \leftskip \the\leftskip - \rightskip \the\rightskip}} - -%D A quick way to determine left|/|middle|/|right states -%D (experimental). - -\setvalue{\??as\v!left }{0} -\setvalue{\??as\v!middle}{1} -\setvalue{\??as\v!right }{2} - -\def\setalignmentswitch#1% - {\chardef\alignmentswitch0\csname\??as#1\endcsname\relax} - -%D There are two ways to influence the interline spacing. The -%D most general and often most consistent way is using -%D -%D \showsetup{setupinterlinespace} -%D -%D For instance -%D -%D \starttyping -%D \setupinterlinespace[line=2.8ex] -%D \stoptyping -%D -%D This setting adapts itself to the bodyfontsize, while for -%D instance saying -%D -%D \starttyping -%D \setupinterlinespace[line=12pt] -%D \stoptyping -%D -%D sets things fixed for all sizes, which is definitely not -%D what we want. Therefore one can also say: -%D -%D \starttyping -%D \definebodyfontenvironment[9pt][interlinespace=11pt] -%D \stoptyping -%D -%D One can still use \type{\setupinterlinespace} (without -%D arguments) to set the interline space according to the -%D current font, e.g. a \type{\bfa}. - -\newif\iflocalinterlinespace - -% font-ini - -\ifx\bodyfontinterlinespecs\undefined - - \let\bodyfontinterlinespecs\empty - \let\bodyfontinterlinespace\empty - -\fi - -\def\presetnormallineheight - {\edef\normallineheight{\@@itline}% -% done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed - \iflocalinterlinespace \else - \doifdefined\bodyfontinterlinespecs - {\doifsomething\bodyfontinterlinespace - {\edef\normallineheight{\bodyfontinterlinespace}}}% - \fi} - -\def\setupspecifiedinterlinespace[#1]% - {\getparameters[\??it][#1]% - \scratchdimen0\@@itheight\points - \advance\scratchdimen 0\@@itdepth\points - \ifdim\scratchdimen>\onepoint - \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}% - \let\@@itheight\strutheightfactor - \let\@@itdepth \strutdepthfactor - \else - \let\strutheightfactor\@@itheight - \let\strutdepthfactor \@@itdepth - \fi - \let\minimumstrutheight \@@itminheight - \let\minimumstrutdepth \@@itmindepth - \let\minimumlinedistance\@@itdistance - \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex - \doifelse\@@ittop\v!height % new, topskip does more bad than good - {\let\topskipfactor \@@itheight} - {\let\topskipfactor \@@ittop }% - \let\maxdepthfactor \@@itbottom - \let\baselinegluefactor \@@itstretch - \setfontparameters % redundant, can be \setstrut, test first - \updateraggedskips} % yes indeed - -\let\currentrelativeinterlinespace\empty - -\def\setuprelativeinterlinespace[#1]% - {\processallactionsinset - [#1] - [ \v!on=>\oninterlineskip, - \v!off=>\offinterlineskip, - \v!reset=>\let\currentrelativeinterlinespace\empty - \let\setrelativeinterlinespace\relax - \setfontparameters, - \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace, - \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}% - \spacing\currentrelativeinterlinespace]} - -\def\dosetrelativeinterlinespace - {\ifx\currentrelativeinterlinespace\empty\else - \spacing\currentrelativeinterlinespace - \fi} - -\let\setrelativeinterlinespace\relax - -% \appendtoks \setrelativeinterlinespace \to \everybodyfont - -\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1 - {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]} - -\def\setuplocalinterlinespace[#1]% - {\localinterlinespacetrue - \setupinterlinespace[#1]% - \localinterlinespacefalse} - -\def\simplesetupinterlinespace - {\localinterlinespacetrue - \setfontparameters - \updateraggedskips % funny one here - \localinterlinespacefalse} - -\definecomplexorsimple\setupinterlinespace - -% In earlier versions \type{\bigskipamount} was -% \type{\ht\strutbox} and the stretch was plus or minus -% \type{.4\dp\strutbox}. Don't ask me why. The most recent -% implementation is based on a user supplied distance, which -% is by default \type{.75\normalskipamount} where -% \type{\normalskipamount} equals the current baseline -% distance. - -% \lineskiplimit = -\maxdimen -> freezes baselineskip - -% can be conditionals - -\newif\ifblanknowhite \blanknowhitefalse -\newif\ifblankindeed \blankindeedfalse -\newif\ifblankreset \blankresetfalse -\newif\ifblankdisable \blankdisablefalse -\newif\ifblankflexible \blankflexibletrue -\newif\ifblankouter -\newif\ifblankforce -\newif\ifblankgoback - -\newskip\blankskip \blankskip=\bigskipamount -\newskip\blankskipamount - -\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 - -\newif\iflocalblankfixed -\newif\iflocalblankflexible - -\def\geenblanko{\removelastskip} % will become obsolete - -%%%% pas op, wordt ook in core-pos gebruikt - -\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap - {\doifelse{#1}\v!line - {#2\openlineheight} - {\ifgridsnapping - \assigndimension{#1}{#2}{.25\openlineheight}{.5\openlineheight}\openlineheight - \else - \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount - \fi}% - \relax} - -% \relax is really needed, else we may loose stretch due to lookahead; somehow -% this bug was introduced a while ago but somehow went unnoticed; fixed 2/7/2008 - -\def\addblankskip#1#2#3{\global\advance\blankskip#1\ifgridsnapping#3\else#2\fi\relax} - -\def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}} - -\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight} -\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight} -\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}} -\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}} -\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}} -\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}} -\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight} -\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight} -\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight} -\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight} - -\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount} -\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue} -\defineblankmethod [\v!disable] {\global\blankdisabletrue} -\defineblankmethod [\v!force] {\global\blankforcetrue} -\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi} -\defineblankmethod [\v!reset] {\global\blankresettrue} -\defineblankmethod [\v!flexible] {\global\localblankflexibletrue} -\defineblankmethod [\v!fixed] {\global\localblankfixedtrue} -\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko} -\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi - \global\advance\blankskip .5\lineheight} -\defineblankmethod [\v!none] {\global\blankresettrue} -\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} -\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut} - -% \vtop{\blank[synchronize]\blank[line]test} - -\defineblankmethod [\v!always] {\redowhitespace} % experimental - -% happens often, so we speed this up: -% -% \defineblankmethod [2*\v!line] {\addblankskip+{2\openlineheight}{2\openlineheight}} -% \defineblankmethod [2*\v!big] {\addblankskip+{2\bigskipamount }{2\openlineheight}} -% -% no, with 2\whatever we loose the stretch and shrink! Taco's alternative: - -\defineblankmethod - [2*\v!line] - {\addblankskip+\openlineheight\openlineheight - \addblankskip+\openlineheight\openlineheight} - -\defineblankmethod - [2*\v!big] - {\addblankskip+\bigskipamount\openlineheight - \addblankskip+\bigskipamount\openlineheight} - -\def\doblank#1% - {\edefconvertedargument\ascii{#1}% - \ifx\ascii\empty\else - \ifcsname\??bo\??bo\ascii\endcsname % internal def - \csname\??bo\??bo\ascii\endcsname - \else\ifcsname\??bo\ascii\endcsname % user def / slow - \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax - \else - \dorepeatwithcommand[#1]\redoblank - \fi\fi - \fi - \relax} - -\def\redoblank#1% - {\edefconvertedargument\ascii{#1}% - \ifx\ascii\empty\else - \ifcsname\??bo\??bo\ascii\endcsname % internal def - \csname\??bo\??bo\ascii\endcsname - \else\ifcsname\??bo\ascii\endcsname % user def / slow - \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax - \else - \global\advance\blankskip#1\relax - \fi\fi - \fi - \relax} - -\unexpanded\def\blank % the \relax is definitely needed due to the many \if's - {\relax\complexorsimple\doblank} - -\def\complexdoblank - {\flushnotes - \ifmmode - \@EA\nocomplexdoblank - \else - \ifopelkaar - \ifinpagebody - \@EA\@EAEAEA\@EA\docomplexdoblank - \else - \@EA\@EAEAEA\@EA\nocomplexdoblank - \fi - \else - \@EAEAEA\docomplexdoblank - \fi - \fi} - -\def\nocomplexdoblank[#1]% - {% evt blokkeerfalse - \ifmmode\else\par\fi} - -% Overloaded in cont-new! - -\newsignal\noblanksignal - -% problem: we cannot look back in the mvl so we need 3 kinds of signals - -\def\noblankpsignal{1010101} - -\def\inhibitgridblank % was doinhibitblank - {\ifvmode\else\endgraf\fi - \ifvmode - \ifnum\lastpenalty<10000 - \kern-\noblanksignal % new - \kern \noblanksignal - \else - \penalty\noblankpsignal - \fi - \fi} - -\def\inhibittextblank % was inhibitblank - {\endgraf - \ifvmode - \prevdepth\newprevdepth - \fi} - -% new macro -% -% \def\inhibitblank % need some work -% {\endgraf -% \ifvmode -% \ifgridsnapping -% \inhibitgridblank -% \else -% % this one spoils the grid -% \inhibittextblank -% \fi -% \fi} - -\def\doinhibitblank{\inhibitgridblank} -\def\inhibitblank {\inhibittextblank} - -% will become obsolete - -\ifx\undefined\savedlastskip \newskip \savedlastskip \fi -\ifx\undefined\savedlastpenalty \newcount\savedlastpenalty \fi - -% beware, prevdepth can have funny values (e.g. mvl value when in box) - -\def\docomplexdoblank[#1]% pas op \relax's zijn nodig ivm volgende \if - {\global\blankresetfalse - \global\blankdisablefalse - \global\blanknowhitefalse - \global\localblankflexiblefalse - \global\localblankfixedfalse - \global\blankforcefalse - \global\blankgobackfalse - \blankouterfalse - \global\blankskip\zeropoint -% -\edefconvertedargument\ascii{#1}% todo fast check for simple -\ifcsname\??bo\??bo\ascii\endcsname % internal def - \csname\??bo\??bo\ascii\endcsname -\else\ifcsname\??bo\ascii\endcsname % user def / slow - \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax -\else - \rawprocesscommacommand[#1]\doblank -\fi\fi -% - \relax % to be sure - \ifdim\blankskip=\zeropoint\relax - \iflocalblankflexible - \doglobal\advance\blankskip \currentblank - \else\iflocalblankfixed - \doglobal\advance\blankskip \currentblank - \fi\fi - \fi - \relax % to be sure - \ifblankouter - % do nothing - \else - \par - \ifvmode - \ifblankgoback - \ifdim\lastskip>\zeropoint \vskip-\lastskip \fi - \savedlastskip\zeropoint - \else\ifdim\lastskip>\zeropoint - \savedlastskip\lastskip - \else % todo: lastnode, dan namelijk geen skip ! - \savedlastskip\zeropoint - \fi\fi - \ifblankforce - % dit gaat mis in pos fonts - % \ifdim\prevdepth>\zeropoint\else ... - % -1000pt signals top of page or column (\ejectcolumn) - \bgroup\forgeteverypar\verticalstrut\egroup\kern-\struttotal - \savedlastskip\zeropoint - \fi - \savedlastpenalty\lastpenalty % hm, now it gets lost - \ifblankdisable - \global\blankindeedfalse % keep this, i.e. disable current too - \ifgridsnapping - \ifdim\prevdepth<\zeropoint - % brrr - \else - % dirty trick: smaller blanks are ignored after a - % larger one, so 10 lines is probably safe; we need - % to make sure that we honor penalties; here comes the - % trick (cross our fingers that this works well in - % multi columns; maybe an ifinner test is needed - % \scratchcounter\lastpenalty - % \vskip-10\lineheight - % \ifnum\scratchcounter=\zerocount \else \penalty\lastpenalty \fi - % \vskip 10\lineheight - % alas, this leads to overfull pages, so we try this: - \inhibitgridblank - \fi - \else - \ifdim\prevdepth<\zeropoint - % brrr - \else - % ensure at least a proper prevdepth, this should be - % an option - \vskip-\prevdepth - \vskip\strutdepth - \prevdepth\strutdepth - \fi - % the old crappy piece of code - \edef\oldprevdepth{\the\prevdepth}% - \prevdepth\newprevdepth % == \inhibittextblank - \fi - \else - \global\blankindeedtrue - \fi - \ifblankreset - \global\blankindeedtrue - \ifgridsnapping - % let's play safe and not fool around with the depth, if - % only because it took a lot of effort to sort out the grid - % stuff in the first place - \else - \ifdim\prevdepth=\newprevdepth - \prevdepth\oldprevdepth - \fi - \fi - \fi - \ifblankindeed - \ifdim1\savedlastskip<1\blankskip\relax - % else when \blank[2*groot] + \blank[3*groot] with parskip - % equaling 1*groot, gives a groot=\parskip so adding a small - % value makes it distinguishable; can also be done at parskip - % setting time (better) - \global\advance\blankskip \mindimen\relax % = skip - % test this on 2* + 3* and parskip groot - \ifblanknowhite - \global\advance\blankskip -\parskip - \else - \ifdim\savedlastskip=\parskip - \else % force this due to previous comment - \ifdim\parskip>\zeropoint\relax - \ifdim\blankskip<\parskip\relax - \global\blankskip\zeropoint - \else - \global\advance\blankskip -\parskip - \fi - \fi - \fi - \fi - \ifblankflexible \else - \blankskip1\blankskip - \fi - \iflocalblankfixed - \blankskip1\blankskip - \fi - \iflocalblankflexible - \blankskip1\blankskip - \!!plus \skipgluefactor\blankskip - \!!minus\skipgluefactor\blankskip - \fi - \ifdim\lastkern=\noblanksignal\relax % controlled and grid - \global\blankindeedfalse - \else\ifnum\savedlastpenalty=\noblankpsignal\relax % controlled and grid - \global\blankindeedfalse - \else\ifgridsnapping\else\ifdim\prevdepth=\newprevdepth - \global\blankindeedfalse - \fi\fi\fi\fi - \ifblankindeed - \iffuzzyvskip - \removelastfuzzyvskip - \fuzzyvskip\blankskip\relax - \else - \relax\ifdim\savedlastskip=\zeropoint\else - \vskip-\savedlastskip - \fi - \vskip\blankskip\relax - \fi - \fi - \else - \iffuzzyvskip - \removelastfuzzyvskip - \fuzzyvskip\blankskip\relax - \else - % new, test this on pascal - \ifdim\blankskip<\zeropoint - \relax\ifdim\savedlastskip=\zeropoint\else - \advance\blankskip-\savedlastskip - \vskip-\savedlastskip - \fi - \ifdim\blankskip>\zeropoint - \vskip\blankskip - \else - \vskip\zeropoint - \fi - \else - % also new - \ifdim\blankskip=\zeropoint - \ifblanknowhite - \nowhitespace - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \global\fuzzyvskipfalse - \presetindentation} - -%D For a long time we had: -%D -%D \starttyping -%D \def\simpledoblank% -%D {\doifelse{\currentwhitespace}{\v!geen} -%D {\blank[\currentblank]} -%D {\blank[\currentwhitespace]}} -%D \stoptyping -%D -%D But Berend de Boer wanted more control, so now we have: - -\def\simpledoblank % ... - {\doifelse\currentwhitespace\v!none - {\blank[\currentblank]} - {\blank[\s!default]}} - -%D Another useful definition would be: -%D -%D \starttyping -%D \defineblank -%D [\s!default] -%D [\v!groot] -%D \stoptyping - -\def\dosetupblank#1% amount are an plain inheritance - {\bigskipamount#1\relax - \ifblankflexible \else - \bigskipamount1\bigskipamount - \fi - \medskipamount \bigskipamount \divide\medskipamount \plustwo - \smallskipamount\bigskipamount \divide\smallskipamount\plusfour}% - -\def\complexsetupblank[#1]% more \let's -> this also wil become installable - {\ifgridsnapping - \blankflexiblefalse - \else - \normalexpanded{\noexpand\processallactionsinset[#1]} - [ \v!flexible=>\blankflexibletrue, - \v!fixed=>\blankflexiblefalse]% - \fi - \normalexpanded{\noexpand\processallactionsinset[#1]} - [ \v!flexible=>\dosetupblank\appliedblankskip, - \v!fixed=>\dosetupblank\appliedblankskip, - \v!line=>\edef\appliedblankskip{\linedistance}% - \dosetupblank\appliedblankskip, - \v!halfline=>\scratchskip.5\linedistance - \edef\appliedblankskip{\the\scratchskip}% - \dosetupblank\appliedblankskip, - \v!big=>\ifgridsnapping - \edef\appliedblankskip{\linedistance}% - \dosetupblank\appliedblankskip - \fi - \let\currentblank\v!big, - \v!medium=>\let\currentblank\v!medium, - \v!small=>\let\currentblank\v!small, - \v!global=>\let\currentblank\v!global, - \v!normal=>\dosetupblank\appliedblankskip, - \v!standard=>\edef\appliedblankskip{\skipfactor\linedistance}% - \dosetupblank\appliedblankskip, - \s!default=>\dosetupblank\appliedblankskip, - \s!unknown=>\let\appliedblankskip\commalistelement - \dosetupblank\appliedblankskip]% - \simplesetupwhitespace} - -% \definecomplexorsimpleempty\setupblank -% -% speed gain: 60 sec -> 30 sec - -\definecomplexorsimple\setupblank - -\def\simplesetupblank % == snelle \setupblank[\s!default] - {\ifgridsnapping - \blankflexiblefalse - \fi - \dosetupblank\appliedblankskip - % \let\deblanko\v!big - \simplesetupwhitespace} - -\def\restorestandardblank% \v!standard - {\edef\appliedblankskip{\skipfactor\linedistance}% - \dosetupblank\appliedblankskip - }%\let\deblanko\v!big} - -\def\dodefineblank[#1][#2]% why #1 commalist? - {\def\docommand##1{\setvalue{\??bo##1}{#2}}% - \processcommalist[#1]\docommand} - -\def\defineblank - {\dodoubleargument\dodefineblank} - -% \def\savecurrentblank -% {\edef\restorecurrentblank -% {\bigskipamount\the\bigskipamount -% \medskipamount\the\medskipamount -% \smallskipamount\the\smallskipamount -% \noexpand\def\noexpand\currentblank{\currentblank}% -% \ifblankflexible -% \noexpand\blankflexibletrue -% \else -% \noexpand\blankflexiblefalse -% \fi}} - -\def\savecurrentblank {\edef\savedcurrentblank{\currentblank}} -\def\restorecurrentblank{\edef\currentblank{\savedcurrentblank}} - -\def\savedcurrentblank{\currentblank} - -%D Now. - -\defineblank [\s!default] [\v!white] -\defineblank [\v!height] [\strutheight] -\defineblank [\v!depth] [\strutdepth] - -\let\currentindentation\empty % amount/keyword -% \let\normalindentation \empty % used for reinstating normal indentation -\let\currentindenting \empty % method - -\newdimen\ctxparindent - -\newif\ifindentfirstparagraph % \indentfirstparagraphtrue - -\chardef\indentingtoggle\zerocount - -%D After a blank or comparable situation (left side floats) we -%D need to check if the next paragraph has to be indented. - -\def\presetindentation - {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}} - -%D This sets up the (normally) global indentation behavior as well -%D as the amounts. - -\definecomplexorsimple\setupindenting - -\indentfirstparagraphtrue -\parindent\ctxparindent -\chardef\indentingtoggle\zerocount - -% we need a better everypar model: for each option a switch, which we -% set to false with \forgetall and can enable when needed (context 4); -% that way we can control the order of execution of options - -\def\checkeverypar % currently a hack - {\ifzeropt\parindent\else - \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}% - \fi} - -\def\complexsetupindenting[#1]% - {\edef\currentindenting{#1}% - \doifsomething\currentindenting % handy when a parameter is passed - {% not here: \indentfirstparagraphtrue - % not here: \parindent\ctxparindent - % not here: \chardef\indentingtoggle\zerocount - % we use commacommand in order to catch #1 being a command (expanded parameter) - \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc - \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest - \checkeverypar % only when non-empty #1 - \ifindentfirstparagraph\else\noindentation\fi % added - \toggleindentation}} - -\def\docomplexsetupindentingA#1% - {\edefconvertedargument\!!stringa{#1}% can this be doen differently now? - \ifcsname\??in:\!!stringa\endcsname \else - \edef\currentindentation{#1}% - \let\normalindentation\currentindentation - \simplesetupindenting - \fi} - -\def\docomplexsetupindentingB#1% - {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen - \executeifdefined{\??in:\!!stringa}\donothing} - -\def\simplesetupindenting % empty case, a it strange, needed this way? - {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}} - -\def\indenting % kind of obsolete - {\dosingleargument\complexsetupindenting} - -% use \noindentation to suppress next indentation - -\def\defineindentingmethod[#1]#2% - {\setvalue{\??in:#1}{#2}} - -\defineindentingmethod [\v!no] {\parindent\zeropoint}% was: \ctxparindent\noindent} -\defineindentingmethod [\v!not] {\parindent\zeropoint}% was: \ctxparindent\noindent} - -\defineindentingmethod [\v!first] {\indentfirstparagraphtrue} -\defineindentingmethod [\v!next] {\indentfirstparagraphfalse} - -\defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent ! -\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent ! - -\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent ! - \chardef\indentingtoggle\zerocount} - -\defineindentingmethod [\v!odd] {\chardef\indentingtoggle\plusone} -\defineindentingmethod [\v!even] {\chardef\indentingtoggle\plustwo} - -\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else - \let\currentindentation\normalindentation - \simplesetupindenting - \fi} - -\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue - \parindent\zeropoint - \chardef\indentingtoggle\zerocount} - -\def\noindenting{\indenting[\v!no, \v!next ]} -\def\doindenting{\indenting[\v!yes,\v!first]} - -%D This one sets up the local indentation behaviour (i.e. either or not -%D a next paragraph will be indented). - -\def\dochecknextindentation#1% internal one - {\checknextindentation[\csname#1\c!indentnext\endcsname]} - -\setvalue{\??in->\s!empty}{} -\setvalue{\??in->\v!yes }{\doindentation} -\setvalue{\??in->\v!no }{\noindentation} -\setvalue{\??in->\v!auto }{\autoindentation} - -\def\checknextindentation[#1]% - {\csname\??in->\ifcsname\??in->#1\endcsname#1\else\s!empty\fi\endcsname} - -%D Here come the handlers. - -\newif\ifindentation \indentationtrue % documenteren, naar buiten - -\let\checkindentation\relax - -\ifx\autoindentation\undefined \let\autoindentation\relax \fi % hook - -\def\doindentation - {\gdef\checkindentation{\global\indentationtrue}} - -\def\noindentation % made global - {\ifinpagebody \else - \global\indentationfalse - \gdef\checkindentation - {\donoindentation - \gdef\checkindentation{\global\indentationtrue}}% - \fi} - -\def\nonoindentation % bv bij floats - {\ifinpagebody \else - \global\indentationtrue - \gdef\checkindentation{\global\indentationtrue}% - \fi} - -\def\donoindentation - {\ifdim\parindent=\zeropoint \else - \bgroup \setbox\scratchbox\lastbox \egroup - \fi} - -\def\indentation - {\ifvmode \ifdim\parindent=\zeropoint \else - % was : \hskip\parindent - % can be: \indent - % but we test: - \noindent\hskip\parindent - \fi \fi} - -\def\toggleindentation - {\ifcase\indentingtoggle - % nothing - \or - \notoggleindentation - \or - \dotoggleindentation - \fi} - -\def\dokillindentation - {\gdef\checkindentation{\global\indentationfalse\donoindentation}} - -\def\dotoggleindentation - {\gdef\checkindentation{\global\indentationfalse\notoggleindentation\donoindentation}} - -\def\notoggleindentation - {\gdef\checkindentation{\global\indentationtrue\dotoggleindentation}} - -\appendtoks - \pushmacro\checkindentation - \pushmacro\ifindentation -\to \everypushsomestate - -\appendtoks - \popmacro\ifindentation - \popmacro\checkindentation -\to \everypopsomestate - -% we need to save the state if we want to adapt behaviour to empty lines -% -% \def\setlasthvmode -% {\global\chardef\savedhvmode\ifhmode\plusone\else\ifvmode\plustwo\else\zerocount\fi\fi} -% -% \def\resetlasthvmode -% {\global\chardef\savedhvmode\zerocount} -% -% \chardef\savedhvmode\zerocount - -% This is a user requested hack (using the auto-hook). - -\chardef\recheckindentationmode\zerocount - -\def\dontrechecknextindentation - {\global\chardef\recheckindentationmode\zerocount} - -\def\dorechecknextindentation - {\ifcase\recheckindentationmode - % nothing - \or - \dontrechecknextindentation - \expandafter\doautoindentation - \fi} - -\def\doautoindentation - {\doifnextcharelse\par\donothing\noindentation} - -\def\autoindentation - {\global\chardef\recheckindentationmode\plusone} - -%D An example of usage: -%D -%D \starttyping -%D \setupindenting[small,yes] -%D -%D \setupitemize [indentnext=auto] -%D \setuptyping [indentnext=auto] -%D \setupformulas[indentnext=auto] -%D -%D \input tufte \startitemize \item itemize \stopitemize -%D \input tufte \startitemize \item itemize \stopitemize -%D \input tufte \startitemize \item itemize \stopitemize -%D -%D \page -%D -%D \input tufte -%D \starttyping -%D verbatim -%D \stoptyping -%D -%D \input tufte -%D \starttyping -%D verbatim -%D \stoptyping -%D -%D \input tufte -%D \starttyping -%D verbatim -%D \stoptyping -%D -%D \page -%D -%D \input tufte \startformula a = b \stopformula -%D \input tufte \startformula a = b \stopformula -%D \input tufte \startformula a = b \stopformula -%D \stoptyping - - -%D \macros -%D {frenchspacing,nonfrenchspacing} -%D -%D Smehow \type{\frenchspacing} can lead to hyphenation between -%D dashes so we now have \type {\newfrenchspacing} (moved from -%D \type {syst-chr}). - -%D Hm ... todo: - -\sfcode`\)=0 -\sfcode`\'=0 -\sfcode`\]=0 - -\def\setfrenchspacing#1% - {\sfcode`\.#1 \sfcode`\,#1\relax - \sfcode`\?#1 \sfcode`\!#1\relax - \sfcode`\:#1 \sfcode`\;#1\relax} - -\def\frenchspacing - {\setfrenchspacing{1000}} - -\def\resetfrenchspacing - {\sfcode`\.3000 \sfcode`\,1250 - \sfcode`\?3000 \sfcode`\!3000 - \sfcode`\:2000 \sfcode`\;1500 } - -\def\frenchspacing {\setfrenchspacing{1000}} -\def\newfrenchspacing{\setfrenchspacing{1050}} -\def\nonfrenchspacing{\resetfrenchspacing} - -\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}} - -\definespacingmethod[\v!packed]{\newfrenchspacing} -\definespacingmethod[\v!broad ]{\nonfrenchspacing} - -\def\complexsetupspacing[#1]% - {\executeifdefined{\??sg\??sg#1}\relax - \updateraggedskips} - -\def\simplesetupspacing - {\updateraggedskips} - -\definecomplexorsimple\setupspacing - -% \dorecurse{100}{\recurselevel\spacefactor 800 \space} \par -% \dorecurse{100}{\recurselevel\spacefactor1200 \space} \par -% \dorecurse{100}{\recurselevel\spacefactor 800 \normalspaceprimitive} \par -% \dorecurse{100}{\recurselevel\spacefactor1200 \normalspaceprimitive} \par - -% When we don't add the % here, we effectively get \ and -% since we have by default \def\^^M{\ } we get into a loop. - -\let\normalspaceprimitive=\ % space-comment is really needed - -% hm ... - -\unexpanded\def\ {\mathortext\normalspaceprimitive\space} % no \dontleavehmode\space (else no frenchspacing) - -% Because I strip spaces at the end of lines (in the editor) we need a bit of -% a trick to define slash+newline, so \ and \ are the same - -\ctxlua{tex.sprint(tex.ctxcatcodes,"\string\\unexpanded\string\\def\string\\\string\n{\string\\ }")} - -\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\mathortext\ \space} % no space in math - -\letcatcodecommand \ctxcatcodes `\~ \nonbreakablespace % overloaded later - -\def\space { } -\def\removelastspace{\ifhmode\unskip\fi} -\def\nospace {\removelastspace\ignorespaces} - -% in tables we need: -% -% \def\fixedspace {\hskip.5em\relax} -% -% but, since not all fonts have .5em digits: - -\unexpanded\def\fixedspace - {\setbox\scratchbox\normalhbox{\mathortext{0}{0}}% - \hskip\wd\scratchbox\relax} - -\def\fixedspaces - {\letcatcodecommand \ctxcatcodes `\~ \fixedspace} - -\appendtoks\let~\space\to\simplifiedcommands - -% \def\removeunwantedspaces -% {\ifhmode % we also need to unskip 0pt skips -% \unskip\unskip\unskip\unskip\unskip -% \unskip\unskip\unskip\unskip\unskip -% \fi} - -\unexpanded\def\removeunwantedspaces - {\ifhmode - \expandafter \doremoveunwantedspace - \fi} - -\def\doremoveunwantedspace - {\ifnum\lastnodetype=\@@gluenode - \unskip \expandafter\doremoveunwantedspace - \fi} - -% \startbuffer -% \startlines \tt \fixedspaces -% 0~1~~2~~~3~~~~4~~~~~5 -% 0~~~~~~~~~~~~~~~~~~~5 -% $0~1~~2~~~3~~~~4~~~~~5$ -% $0~~~~~~~~~~~~~~~~~~~5$ -% \stoplines -% -% \starttabulate[|~|] -% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \NR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \NR -% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \NR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \NR -% \stoptabulate -% -% \starttable[||] -% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \AR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \AR -% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \AR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \AR -% \stoptable -% \stopbuffer -% -% \setupbodyfont[cmr] \getbuffer -% \setupbodyfont[lbr] \getbuffer - -\def\packed - {\nointerlineskip} - -\def\godown[#1]% - {\relax - \ifhmode\endgraf\fi - \ifvmode\nointerlineskip\vskip#1\relax\fi} - -%D A couple of plain macros: - -\ifx\thinspace\undefined - - \def\thinspace {\kern .16667em } - \def\negthinspace{\kern-.16667em } - \def\enspace {\kern .5em } - - \def\thinspace {\kern .16667\emwidth} - \def\negthinspace{\kern-.16667\emwidth} - \def\enspace {\kern .5\emwidth} - -\fi - -\ifx\quad\undefined - - \def\enskip{\hskip.5em\relax} - \def\quad {\hskip 1em\relax} - \def\qquad {\hskip 2em\relax} - - \def\enskip{\hskip.5\emwidth} - \def\quad {\hskip \emwidth} - \def\qquad {\hskip 2\emwidth} - -\fi - -\let\emspace\quad - -\ifx\smallskip\undefined - - \def\smallskip{\vskip\smallskipamount} - \def\medskip {\vskip\medskipamount} - \def\bigskip {\vskip\bigskipamount} - -\fi - -\ifx\allowbreak\undefined - - \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 - {\par - \ifdim\lastskip<\smallskipamount - \removelastskip - \penalty-50 - \smallskip - \fi} - -\def\medbreak - {\par - \ifdim\lastskip<\medskipamount - \removelastskip - \penalty-100 - \medskip - \fi} - -\def\bigbreak - {\par - \ifdim\lastskip<\bigskipamount - \removelastskip - \penalty-200 - \bigskip - \fi} - -\fi - -\newskip\ctxparskip \ctxparskip\zeropoint - -\newconditional \flexiblewhitespace \settrue\flexiblewhitespace - -\def\blankokleinmaat {\smallskipamount} -\def\blankomiddelmaat {\medskipamount} -\def\blankogrootmaat {\bigskipamount} -\def\currentwhitespace {\zeropoint} - -\definecomplexorsimple\setupwhitespace - -\def\simplesetupwhitespace - {\doifnot\currentwhitespace\v!none\dosetupwhitespace} - -\def\complexsetupwhitespace[#1]% - {\edef\nextcurrentwhitespace{#1}% - \ifx\nextcurrentwhitespace\empty - \simplesetupwhitespace - \else - \let\currentwhitespace\nextcurrentwhitespace - \dosetupwhitespace - \fi} - -\def\dosetupwhitespace % quick test for no list - {\ifcsname\??ws\??ws\currentwhitespace\endcsname - \csname\??ws\??ws\currentwhitespace\endcsname - \else - \expandafter\processcommalist\expandafter[\currentwhitespace]\dowhitespacemethod % 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 - \else - \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi - \fi - \parskip\ctxparskip} - -\chardef\baselinegridmode=0 % option in layout / 1=permit_half_lines - -\def\dodosetupwhitespace - {\ifgridsnapping - \setfalse\flexiblewhitespace - \ctxparskip1\ctxparskip - \ifdim\ctxparskip>\zeropoint - \ifcase\baselinegridmode - \ctxparskip\baselineskip % normal ! ! ! ! !! - \or - \ifdim\scratchdimen=\baselineskip % maybe range - \ctxparskip\baselineskip % normal ! ! ! ! !! - \else - \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax - \fi - \else - \ctxparskip\baselineskip % normal ! ! ! ! !! - \fi - \fi - \else - \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi - \fi - \parskip\ctxparskip} - -\definesystemvariable {ws} % whitespace - -\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#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} - -\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin} - -% \def\dowhitespacemethod#1% -% {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax} - -\def\dowhitespacemethod#1% - {\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax} - -\def\nowhitespace - {\ifdim\parskip>\zeropoint\relax - \ifdim\lastskip=-\parskip - \else - \vskip-\parskip - \fi - \fi} - -\def\nowhitespaceunlessskip - {\ifdim\lastskip>\zeropoint \else - \nowhitespace - \fi} - -\def\redowhitespace - {\ifdim\lastskip>-\parskip \else - \vskip\parskip - \fi} - -% \def\savecurrentwhitespace -% {\edef\restorecurrentwhitespace -% {\ctxparskip\the\ctxparskip -% \parskip\the\parskip -% \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}% -% \ifconditional\flexiblewhitespace -% \noexpand\settrue\flexiblewhitespace -% \else -% \noexpand\setfalse\flexiblewhitespace -% \fi}} - -\def\savecurrentwhitespace {\edef\savedcurrentwhitespace{\currentwhitespace}} -\def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}} - -\def\savedcurrentwhitespace{\currentwhitespace} - -% deze variant is nodig binnen \startopelkaar -% steeds testen: -% -% \hoofdstuk{..} -% \plaatslijst[..] -% \hoofdstuk{..} -% \input tufte -% -% met/zonder witruimte - -\def\whitespace - {\par - \ifdim\parskip>\zeropoint\relax - %\ifdim\lastskip>\parskip \else - % \removelastskip interferes with blanko blokkeer en klein - \vskip\parskip - %\fi - \fi} - -\def\nonoblanko[#1]% - {\par} - -\def\noblanko - {\dosingleempty\nonoblanko} - -% I'm not sure if the restore is still needed. Anyway, when we do -% restore, we get a parskip someplace in the output that will push -% the content off page (\vbox to pageheight{skip smashed-box}) so -% we have now disabled this hack. If it is introduced again it needs -% to be more controlled. Test case: -% -% \setupwhitespace[big] -% \starttext -% \startcolumns[n=2]\dorecurse{200}{test\crlf}\stopcolumns -% \stoptext -% -% \def\saveouterspacing -% {\savecurrentblank -% \savecurrentwhitespace -% \def\restoreouterspacing -% {\restorecurrentblank -% \restorecurrentwhitespace}} -% -% \let\restoreouterspacing\relax -% \let\saveouterspacing \relax % mult-ini: i will look into it when needed -% -% let's test this (restore before we restore the global bodyfont): - -\def\saveouterspacing - {\savecurrentblank - \savecurrentwhitespace} - -\def\restoreouterspacing - {\restorecurrentblank - \restorecurrentwhitespace} - -% 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. - -\newif\ifopelkaar - -\newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt} -\def\lastdoneparskip {0pt} - -\def\startpacked - {\dosingleempty\dostartpacked} - -\def\dostartpacked[#1]% nesting afvangen - {\par - \ifvmode - \edef\lastdoneparskip {\the\lastskip}% - \edef\lastdoneprevdepth{\the\prevdepth}% zeer recent toegevoegd - \ifdim\prevdepth=-\thousandpoint % toegevoegd omdat binnen - \else % een vbox een extra skip - \whitespace % ongewenst is; dit kan - \baselinecorrection %% zie in \placeregister[n=1] - \vskip\noparskipsignal % waarschijnlijk ook in - \fi % blanko blokkeer - \bgroup - \doifelse{#1}\v!blank - \opelkaarfalse - \opelkaartrue - \blank[\v!disable] % dit is nog niet ok, gaat fout - \setupwhitespace[\v!none] % bovenin vtop (dwz, baseline) - \fi} - -\def\stoppacked - {\par - \ifvmode - \egroup - \ifdim\lastskip=\noparskipsignal\relax - \removelastskip - \nowhitespace - \vskip-\lastdoneparskip - \vskip+\lastdoneparskip - \prevdepth-\lastdoneprevdepth % zeer recent toegevoegd - \fi - \fi} - -\def\startunpacked - {\blank - \leavevmode - \bgroup} - -\def\stopunpacked - {\egroup - \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. - -\def\toonregelcorrectie{\showbaselinecorrection} -\def\regelcorrectie {\baselinecorrection} - -% \prevdepth crosses pageboundaries! -% -% todo: a version that works ok inside a box - -\let\doaroundlinecorrection\relax - -\def\startlinecorrection - {\dodoubleempty\dostartlinecorrection} - -\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\stoplinecorrection - {\stopbaselinecorrection - \doaroundlinecorrection - \egroup} - -\def\correctwhitespace - {\dowithnextbox - {\startbaselinecorrection - \flushnextbox - \stopbaselinecorrection}% - \vbox} - -\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}} -\def\horizontalstrut{\normalhbox {\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 -% nog eens instelbaar worden. -% -% \lineheight : de hoogte van een regel -% \spacing{getal} : instellen interlinie -% \normalbaselines : instellen regelafstend -% -% \setstrut : instellen \strut -% \setnostrut : resetten \strut, \endstrut, \begstrut -% -% \setteststrut : instellen zichtbare struts -% \resetteststrut : instellen onzichtbare struts -% -% \setfontparameters : instellen na fontset -% -% De hoogte van een regel (\lineheight) is gelijk aan de -% som van de hoogte (\ht) en diepte (\dp) van \strutbox. -% -% \strut : denkbeeldig blokje met hoogte en diepte -% -% Een \hbox kan als deze aan het begin van een regel staat -% een breedte \hsize krijgen. Dit is soms te voorkomen met het -% commando \leavevmode. Binnen een \vbox geeft dit echter -% niet altijd het gewenste resultaat, vandaar het commando -% -% \leaveoutervmode - -% Pas op: niet zomaar \topskip en \baselineskip aanpassen -% en zeker niet \widowpenalty. Dit kan ernstige gevolgen -% hebben voor kolommen. -% -% Enige glue kan op zich geen kwaad, echter als blanko=vast, -% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook -% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet, -% omdat een positieve glue eindeloos rekbaar is. - -\newdimen\strutdimen -\newdimen\lineheight -\newdimen\openlineheight -\newdimen\openstrutheight -\newdimen\openstrutdepth -\newdimen\topskipgap -\newdimen\struttotal - -\def\strutheightfactor {.72} -\def\strutdepthfactor {.28} - -\def\baselinefactor {2.8} -\def\baselinegluefactor {0} - -\def\minimumstrutheight {0pt} -\def\minimumstrutdepth {0pt} - -\def\normallineheight {\baselinefactor ex} -\def\minimumlinedistance {\lineskip} - -\def\strutheight {0pt} -\def\strutdepth {0pt} -\def\strutwidth {0pt} - -\let\spacingfactor \plusone - -\def\topskipfactor {1.0} -\def\maxdepthfactor {0.5} - -\def\systemtopskipfactor {\topskipfactor} -\def\systemmaxdepthfactor {\maxdepthfactor} - -% De onderstaande definitie wordt in de font-module overruled - -\ifdefined\globalbodyfontsize\else - \newdimen\globalbodyfontsize - \globalbodyfontsize=12pt -\fi - -\ifx\normalizedbodyfontsize\undefined - \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 - {\simpletopskipcorrection - \vskip-\struttotal - \verticalstrut} - -\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 - \fi - \relax % the skip - \topskipgap\topskip - \advance\topskipgap -\openstrutheight\relax -\ifdim\minimumstrutheight>\zeropoint - \ifdim\topskip<\minimumstrutheight - \topskip\minimumstrutheight\relax - \fi -\else - \ifdim\topskip<\strutheightfactor\openlineheight - \topskip\strutheightfactor\openlineheight\relax - \fi -\fi} - -\def\setmaxdepth - {\maxdepth\systemmaxdepthfactor\globalbodyfontsize} - -\def\normalbaselines - {\baselineskip \normalbaselineskip - \lineskip \normallineskip - \lineskiplimit\normallineskiplimit} - -\def\setnormalbaselines - {\ifdim\normallineheight>\zeropoint - \lineheight\normallineheight - \fi - \openlineheight\spacingfactor\lineheight - \openstrutheight \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight % new - \else - \strutheightfactor\openlineheight - \fi - \openstrutdepth \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth % new - \else - \strutdepthfactor \openlineheight - \fi - \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint - \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new - \fi - \normalbaselineskip\openlineheight - \ifgridsnapping\else - \!!plus \baselinegluefactor\openlineheight - \!!minus\baselinegluefactor\openlineheight - \fi - \normallineskip\minimumlinedistance\relax % \onepoint\relax - \normallineskiplimit\zeropoint\relax - \normalbaselines - \dosetupgridsnapping} - -\def\spacing#1% - {\ifgridsnapping - %\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{\withoutpt\the\dimexpr#1\points\relax}\fi - \let\spacingfactor\plusone - \else - \edef\spacingfactor{#1}% - \fi - \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}% - \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}% - \setnormalbaselines - \setstrut} - -%D Sometimes one needs to freeze the interlinespacing -%D -%D \starttyping -%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf} -%D \stoptyping - -\let\restoreinterlinespace\relax - -\def\saveinterlinespace - {\edef\restoreinterlinespace - {\lineheight \the\lineheight - \openstrutheight \the\openstrutheight - \openstrutdepth \the\openstrutdepth - \openlineheight \the\openlineheight - \normalbaselineskip \the\normalbaselineskip - \normallineskip \the\normallineskip - \normallineskiplimit\the\normallineskiplimit - \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}% - \noexpand\normalbaselines}} - -% plain definition: -% -% \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} -% -% could be: -% -% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} - -\ifx\strutbox\undefined - - \newbox\strutbox - - \setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} - - \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} - -\fi - -\let\normalstrut\strut - -% The double \hbox construction enables us to \backtrack -% boxes. - -\let\strutht\undefined \newdimen\strutht -\let\strutdp\undefined \newdimen\strutdp - -\unexpanded\def\setstrut - {\ifgridsnapping - \setstrutgridyes - \else - \setstrutgridnop - \fi} - -\unexpanded\def\setstrutgridyes - {\strutht\spacingfactor\dimexpr - \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight - \else - \strutheightfactor\dimexpr\normallineheight - \fi - \strutdp\dimexpr - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \normallineheight-\strutht - \fi - \dosetstrut} - -\unexpanded\def\setstrutgridnop - {\strutht\spacingfactor\dimexpr - \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight - \else - \strutheightfactor\dimexpr\normallineheight - \fi - \strutdp\spacingfactor\dimexpr - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \strutdepthfactor\dimexpr\normallineheight - \fi - \dosetstrut} - -\unexpanded\def\setcharstrut#1% - {\setbox\strutbox\normalhbox{#1}% - \strutht\ht\strutbox - \strutdp\dp\strutbox - \dosetstrut} - -\unexpanded\def\setfontstrut - {\setcharstrut{(gplQT}} - -\unexpanded\def\setcapstrut% could be M, but Q has descender - {\setcharstrut{Q}} - -%D Handy for math (used in mathml): - -\def\charhtstrut - {\begingroup - \setcharstrut{GJY}% - \vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht - \endgroup} - -\def\chardpstrut - {\begingroup - \setcharstrut{gjy}% - \vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint - \endgroup} - -% because of all the callbacks in mkiv, we avoid unnecessary boxes ... -% maybe use an attribute so that we can tag boxes that don't need a -% treatment; tests with using an attribute so far have shown that -% it's slower because testing the attribute takes time too - -\def\dosetstrut - {\let\strut\normalstrut - \edef\strutheight{\the\strutht}% - \edef\strutdepth {\the\strutdp}% - \ifdim\strutwidth=\zeropoint - \dosetstruthide - \else - \dosetstrutvide - \fi - \struttotal\dimexpr\strutht+\strutdp\relax} - -\def\dosetstruthide - {\setbox\strutbox\normalhbox - {\vrule - \!!width \zeropoint - \!!height\strutht - \!!depth \strutdp}} - -\def\dosetstrutvide - {\setbox\strutbox\normalhbox - {\normalhbox to \zeropoint - {% \hss % new, will be option - \vrule - \!!width \strutwidth - \!!height\strutht - \!!depth \strutdp - \hss}}} - -%D The dimen \type {\struttotal} holds the exact size of the -%D strut; occasionally a one scaled point difference can show -%D up with the lineheight. - -% experiment - -\newbox\emptystrutbox \setbox\emptystrutbox\hbox{} - -\def\dosetstruthide - {\setbox\strutbox\copy\emptystrutbox - \ht\strutbox\strutht - \dp\strutbox\strutdp} - -\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut} - - -\let\normalstrut\strut - -%D Sometimes a capstrut comes in handy -%D -%D \starttabulate[|Tl|l|l|] -%D \NC yes \NC normal strut \NC {\showstruts\setupstrut[yes]\strut} \NC \NR -%D \NC no \NC no strut \NC {\showstruts\setupstrut[no]\strut} \NC \NR -%D \NC kap \NC a capital strut (i.e. Q) \NC {\showstruts\setupstrut[cap]\strut} \NC \NR -%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR -%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR -%D \stoptabulate - -\def\setupstrut - {\dosingleempty\dosetupstrut} - -\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut - {\processaction - [#1] - [ \v!yes=>\setstrut, - \v!auto=>\setautostrut, - \v!no=>\setnostrut, - \v!cap=>\setcapstrut, - \v!fit=>\setfontstrut, - \v!line=>\setstrut, - \s!default=>\setstrut, - \s!unknown=>\setcharstrut\commalistelement]} - -\def\setteststrut - {\def\strutwidth{.8pt}% - \setstrut} - -\def\autostrutfactor{1.1} - -\def\setautostrut - {\begingroup - \setbox\scratchbox\copy\strutbox - \setstrut - \ifdim\strutht>\autostrutfactor\ht\scratchbox - \endgroup \setstrut - \else\ifdim\strutdp>\autostrutfactor\dp\scratchbox - \endgroup \setstrut - \else - \endgroup - \fi\fi} - -% 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 - \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 - \else - \removeunwantedspaces - \normalpenalty\plustenthousand - \normalhskip\zeropoint - \strut - \fi - \fi\fi} - -\newbox\nostrutbox \setbox\nostrutbox\normalhbox{} % {\normalhbox{}} - -\def\setnostrut - {\setbox\strutbox\copy\nostrutbox - \let\strut\empty - \let\endstrut\empty - \let\begstrut\empty - \let\crlfplaceholder\empty} - -% unsave: -% -% \def\pseudostrut -% {\bgroup -% \setnostrut -% \normalstrut -% \egroup} -% -% try: -% -% \startchemie -% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C] -% \stopchemie -% -% so: - -\def\pseudostrut - {\noindent} % better: \dontleavehmode - -\let\pseudobegstrut\pseudostrut - -\let\pseudoendstrut\removeunwantedspaces - -\def\resetteststrut - {\let\strutwidth\zeropoint - \setstrut} - -\ifx\setfontparameters\undefined - % problems ! ! ! ! - \def\setfontparameters{\the\everybodyfont} -\fi - -%D Handy: - -\def\baselinedistance{\the\lineheight} - -%D We need \type{\normaloffinterlineskip} because the new -%D definition contains an assignment, and |<|don't ask me -%D why|>| this assignment gives troubles in for instance the -%D visual debugger. - -%D The plain ones: - -\def\offinterlineskip - {\baselineskip-\thousandpoint - \lineskip\zeropoint - \lineskiplimit\maxdimen} - -\def\nointerlineskip - {\prevdepth-\thousandpoint} - -\let\normaloffinterlineskip=\offinterlineskip % knuth's original - -%D My own one: - -\def\dopushinterlineskip - {\edef\oninterlineskip - {\baselineskip\the\baselineskip - \lineskip\the\lineskip - \lineskiplimit\the\lineskiplimit - \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}} - -\def\nopushinterlineskip - {\let\oninterlineskip\setnormalbaselines} - -\def\offinterlineskip - {\ifdim\baselineskip>\zeropoint - \dopushinterlineskip - \else - \nopushinterlineskip - \fi - \normaloffinterlineskip} - -\let\oninterlineskip=\relax - -\def\leaveoutervmode - {\ifvmode\ifinner\else - \leavevmode - \fi\fi} - -% We stellen enkele penalties anders in dan Plain TEX: - -% oud -% -% \widowpenalty=\defaultwidowpenalty\relax -% \clubpenalty =\defaultclubpenalty \relax - -\def\resetpenalties#1% - {\ifx#1\undefined\else - #1\minusone - \fi} - -\def\setpenalties#1#2#3% - {\ifx#1\undefined\else % 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 -%D Dirty hack, needed in margin content that can run of a page. - -% just before margintexts ... will eventually be done differently in mkiv using -% attributes - -\newcount\nofkeeplinestogether -\let\restoreinterlinepenalty\relax - -\def\dorestoreinterlinepenalty - {\global\let\restoreinterlinepenalty\relax - \global\resetpenalties\interlinepenalties - \global\nofkeeplinestogether\zerocount} - -\def\keeplinestogether#1% - {\ifnum#1>\nofkeeplinestogether - \global\nofkeeplinestogether#1% - \global\setpenalties\interlinepenalties\nofkeeplinestogether\plustenthousand - \global\let\restoreinterlinepenalty\dorestoreinterlinepenalty - \fi} - -\newif\ifgridsnapping % to be sure - -\def\defaultwidowpenalty {2000} % was: 1000 -\def\defaultclubpenalty {2000} % was: 800 -\def\defaultdisplaywidowpenalty {50} -\def\defaultbrokenpenalty {100} - -\def\defaultgridwidowpenalty {0} -\def\defaultgridclubpenalty {0} -\def\defaultgriddisplaywidowpenalty {0} -\def\defaultgridbrokenpenalty {0} - -\def\nopenalties - {\widowpenalty \zerocount - \clubpenalty \zerocount - \brokenpenalty \zerocount - \doublehyphendemerits\zerocount - \finalhyphendemerits \zerocount - \adjdemerits \zerocount} - -\def\setdefaultpenalties - {\directsetup{\systemsetupsprefix\s!default}} - -\startsetups [\systemsetupsprefix\s!reset] - \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} - - \widowpenalty \defaultwidowpenalty - \clubpenalty \defaultclubpenalty - \displaywidowpenalty\defaultdisplaywidowpenalty - \brokenpenalty \defaultbrokenpenalty - -\stopsetups - -\startsetups [\v!grid] [\systemsetupsprefix\s!default] - - \directsetup{\systemsetupsprefix\s!reset} - - \widowpenalty \defaultgridwidowpenalty - \clubpenalty \defaultgridclubpenalty - \displaywidowpenalty\defaultgriddisplaywidowpenalty - \brokenpenalty \defaultgridbrokenpenalty - -\stopsetups - -% as an illustration: - -\startsetups [\systemsetupsprefix\v!strict] - - \directsetup{\systemsetupsprefix\s!reset} - - \setpenalties\widowpenalties2\maxdimen - \setpenalties\clubpenalties 2\maxdimen - \brokenpenalty \maxdimen - -\stopsetups - -\setdefaultpenalties % will happen later in \setuplayout - -% Suggested by GB (not the name -): - -\def\rapfillskip{.5\hsize plus .092\hsize minus .5\hsize} % D.A.'s value - -% Bovendien definieren we enkele extra \fill's: - -\def\hfilll{\hskip\zeropoint\!!plus1filll\relax} -\def\vfilll{\vskip\zeropoint\!!plus1filll\relax} - -% De onderstaande hulpmacro's moeten nog eens instelbaar worden -% gemaakt. - -\def\tfskipsize{1em\relax} -\def\tfkernsize{1ex\relax} - -\def\tfskip{\dotfskip\tfskipsize} -\def\tfkern{\dotfkern\tfkernsize} - -\def\dotfskip#1{{\tf\hskip#1}} -\def\dotfkern#1{{\tf\kern #1}} - -% needs a proper \definenarrower or installnarrower - -\newskip\ctxleftskip -\newskip\ctxrightskip -\newskip\ctxmidskip - -\def\dosinglenarrower#1% - {\processaction - [#1] - [ \v!left=>\global\advance\ctxleftskip \@@slleft, - \v!middle=>\global\advance\ctxmidskip \@@slmiddle, - \v!right=>\global\advance\ctxrightskip \@@slright, - \v!reset=>\global\ctxleftskip \zeropoint - \global\ctxmidskip \zeropoint - \global\ctxrightskip\zeropoint, - \v!none=>, - \s!unknown=>\global\advance\ctxmidskip \commalistelement]} - -\def\donarrower[#1]% hm, can be dorepeat directly - {\dorepeatwithcommand[#1]\dosinglenarrower} - -\def\complexstartnarrower[#1]% - {\@@slbefore % was hard coded \par - \bgroup - \global\ctxleftskip \zeropoint - \global\ctxrightskip\zeropoint - \global\ctxmidskip \zeropoint - \processcommalistwithparameters[#1]\donarrower - \advance\leftskip \ctxleftskip - \advance\rightskip \ctxrightskip - \advance\leftskip \ctxmidskip - \advance\rightskip \ctxmidskip - \seteffectivehsize} - -% todo: definenarrower - -\def\simplestartnarrower - {\startnarrower[\v!middle]} - -\definecomplexorsimple\startnarrower - -\def\stopnarrower - {\@@slafter % was hard coded \par / needed, else skips forgotten - \egroup} - -\def\setupnarrower - {\dodoubleargument\getparameters[\??sl]} - -\newdimen\@@effectivehsize \def\effectivehsize {\hsize} -\newdimen\@@effectiveleftskip \def\effectiveleftskip {\leftskip} -\newdimen\@@effectiverightskip \def\effectiverightskip{\rightskip} - -\def\seteffectivehsize - {\setlocalhsize - \@@effectivehsize \localhsize - \@@effectiveleftskip \leftskip - \@@effectiverightskip \rightskip - \let\effectivehsize \@@effectivehsize - \let\effectiveleftskip \@@effectiveleftskip - \let\effectiverightskip\@@effectiverightskip} - -% We will not use bodydir and pagedir so we disable them. That way we get -% normal hyperlink support. - -\let\@@bodydir\normalbodydir -\let\@@pagedir\normalpagedir - -\unexpanded\def\bodydir{\afterassignment\do@@bodydir\@@bodydir} \let\normalbodydir\bodydir -\unexpanded\def\pagedir{\afterassignment\do@@pagedir\@@pagedir} \let\normalpagedir\pagedir - -\def\do@@bodydir{\@@bodydir TLT\relax} -\def\do@@pagedir{\@@pagedir TLT\relax} - -% This will become a more advanced layout controller soon: - -\unexpanded\def\lefttoright{\textdir TLT\pardir TLT\relax} -\unexpanded\def\righttoleft{\textdir TRT\pardir TRT\relax} - -\def\dodefinehbox[#1][#2]% - {\setvalue{hbox#1}##1% - {\hbox to #2{\begstrut##1\endstrut\hss}}} - -\def\definehbox - {\dodoubleargument\dodefinehbox} - -\def\iobox#1#2#3#% here #3# is not really needed - {\vbox\bgroup % we want to return a vbox like the others - \hbox\bgroup% we need to pack the signal with the box - \signalrightpage - \dowithnextboxcontent - {\let\\=\endgraf\forgetall\doifrightpageelse#1#2} - {\box\nextbox\egroup\egroup} - \vbox#3} - -\def\obox{\iobox\raggedleft \raggedright} % outerbox -\def\ibox{\iobox\raggedright\raggedleft} % innerbox - -\def\dosetraggedvbox#1% - {\let\raggedbox\vbox - \processfirstactioninset - [#1] - [ \v!left=>\let\raggedbox\lbox, - \v!right=>\let\raggedbox\rbox, - \v!middle=>\let\raggedbox\cbox, - \v!inner=>\let\raggedbox\ibox, - \v!outer=>\let\raggedbox\obox, - \v!flushleft=>\let\raggedbox\rbox, - \v!flushright=>\let\raggedbox\lbox, - \v!center=>\let\raggedbox\cbox, - \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]} - -\def\dosetraggedhbox#1% - {\let\raggedbox\hbox - \processaction % slow - [#1] - [ \v!left=>\def\raggedbox{\doalignedline\v!left }, - \v!right=>\def\raggedbox{\doalignedline\v!right }, - \v!middle=>\def\raggedbox{\doalignedline\v!middle}, - \v!inner=>\def\raggedbox{\doalignedline\v!inner }, - \v!outer=>\def\raggedbox{\doalignedline\v!outer }, - \v!flushleft=>\def\raggedbox{\doalignedline\v!right }, - \v!flushright=>\def\raggedbox{\doalignedline\v!left }, - \v!center=>\def\raggedbox{\doalignedline\v!middle}]} - -\def\dosetraggedcommand#1% - {\normalexpanded{\noexpand\dodosetraggedcommand{#1}}} - -\newtoks\everyraggedcommand - -\def\raggedcommand{\the\everyraggedcommand} - -\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! - {\everyraggedcommand \emptytoks - \let\raggedtopcommand \empty - \let\raggedbottomcommand\empty - \chardef\raggedoneliner\zerocount - \doifsomething{#1} - {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse - \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse - \!!donectrue - \rawprocesscommalist[#1]\dododosetraggedcommand}} - -\def\dododosetraggedcommand#1% - {\executeifdefined{\@@ragged@@command\string#1}\relax} - -\def\@@ragged@@command{@@raggedcommand} - -\setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nohz }{\appendtoks\disableadjusting \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!spacing }{\appendtoks\enablespacehandling - \enablekernhandling \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nospacing }{\appendtoks\disablespacehandling - \disablekernhandling \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!hyphenated }{\appendtoks\dohyphens \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!nothyphenated}{\appendtoks\nohyphens \to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!tolerant }{\appendtoks\tolerance3000\relax \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!verytolerant}{\appendtoks\tolerance4500\relax \to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!stretch }{\appendtoks\emergencystretch\bodyfontsize\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!left}% - {\if!!donea \appendtoks\veryraggedleft\to\everyraggedcommand - \else \appendtoks\raggedleft \to\everyraggedcommand - \fi - \!!donecfalse} - -\setvalue{\@@ragged@@command\v!right}% - {\if!!donea \appendtoks\veryraggedright\to\everyraggedcommand - \else \appendtoks\raggedright \to\everyraggedcommand - \fi - \!!donecfalse} - -\setvalue{\@@ragged@@command\v!middle}% - {\if!!donec - \if!!doneb \appendtoks\raggedwidecenter\to\everyraggedcommand - \else\if!!donea \appendtoks\veryraggedcenter\to\everyraggedcommand - \else \appendtoks\raggedcenter \to\everyraggedcommand - \fi\fi - \!!donecfalse - \else - \let\raggedbottomcommand\vfilll % bonus, pretty strong - \let\raggedtopcommand \vfilll % used with \framed for - \fi} % instance in tables - -\setvalue{\@@ragged@@command\v!flushleft }{\getvalue{\@@ragged@@command\v!right }} -\setvalue{\@@ragged@@command\v!flushright}{\getvalue{\@@ragged@@command\v!left }} -\setvalue{\@@ragged@@command\v!center }{\getvalue{\@@ragged@@command\v!middle}} - -\setvalue{\@@ragged@@command\v!high}% - {\let\raggedbottomcommand\vfilll} % and since we lack a - -\setvalue{\@@ragged@@command\v!low}% - {\let\raggedtopcommand\vfilll} % proper keyword, but - -\setvalue{\@@ragged@@command\v!lohi}% - {\let\raggedbottomcommand\vfilll % we do support the - \let\raggedtopcommand\vfilll} % ugly laho (lohi) - -\setvalue{\@@ragged@@command\v!no}% - {\appendtoks\raggedright\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!yes}% - {\appendtoks\notragged\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!normal}% - {\appendtoks\notragged\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!inner}% not yet perfect - {\signalrightpage % may interfere - \doifrightpageelse - {\getvalue{\@@ragged@@command\v!right}} - {\getvalue{\@@ragged@@command\v!left}}} - -\setvalue{\@@ragged@@command\v!outer}% not yet perfect - {\signalrightpage % may interfere - \doifrightpageelse - {\getvalue{\@@ragged@@command\v!left}} - {\getvalue{\@@ragged@@command\v!right}}} - -\setvalue{\@@ragged@@command\v!lesshyphenation}% - {\appendtoks\lesshyphens\to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!morehyphenation}% - {\appendtoks\morehyphens\to\everyraggedcommand} - -\setvalue{\@@ragged@@command\v!lefttoright}{\appendtoks\lefttoright\to\everyraggedcommand} -\setvalue{\@@ragged@@command\v!righttoleft}{\appendtoks\righttoleft\to\everyraggedcommand} -\setvalue{\@@ragged@@command l2r}{\appendtoks\lefttoright\to\everyraggedcommand} -\setvalue{\@@ragged@@command r2l}{\appendtoks\righttoleft\to\everyraggedcommand} - -% compare: -% -% \framed[width=4cm,align=no] {\hfil xxx} -% \framed[width=4cm,align=disable]{\hfil xxx} - -\setvalue{\@@ragged@@command\v!disable}% for one liners - {\appendtoks\raggedright\parfillskip\zeropoint\to\everyraggedcommand} - -\chardef\raggedoneliner\zerocount - -\setvalue{\@@ragged@@command\v!line}% - {\chardef\raggedoneliner\plusone} - -% Nog doen: -% -% \goodbreak -> \allowbreak en \dosomebreak{..} in koppen -% -% bij koppen zowieso: \blanko[reset] - -% Nog in commando verwerken: -% -% \voorkeur … la \blanko -% -% Om ongewenste witruimte te voorkomen kan met \dosomebreak{\break} -% een \penalty voor witruimte worden geplaatst. - -\def\removelastskip % a redefinition of plain - {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi} - -\def\doifoutervmode#1% - {\ifvmode\ifinner\else#1\fi\fi} - -\ifx\dosomebreak\undefined % defined in mkiv - - \def\dosomebreak#1% - {\doifoutervmode - {\scratchskip\lastskip - \removelastskip - %\leavevmode\type{#1}% - #1\relax - \ifdim\scratchskip=\zeropoint % else interference with footnotes - \else - \vskip\scratchskip - \fi}} - -\fi - -\def\forgeteverypar - {\everypar{\the\neverypar}} - -\def\forgetparindent - {\forgeteverypar - \indentfirstparagraphtrue % recently added - \let\currentindentation\v!none - \ctxparindent\zeropoint - \parindent\zeropoint\relax} - -\def\forgetparskip - {\let\currentwhitespace\v!none - \ctxparskip\zeropoint - \parskip\zeropoint\relax} - -\def\forgetbothskips - {\tolerance1500 - \leftskip\zeropoint - \rightskip\zeropoint\relax} - -\def\forgetspacing - {\emergencystretch\zeropoint} - -\newif\ifforgotten % rather good signal for inner - -\appendtoks \forgottentrue \to \everyforgetall -\appendtoks \forgetragged \to \everyforgetall -\appendtoks \forgetparskip \to \everyforgetall -\appendtoks \forgetparindent \to \everyforgetall -\appendtoks \forgetbothskips \to \everyforgetall -\appendtoks \forgetspacing \to \everyforgetall % i.v.m. funny spacing in pagebody -\appendtoks \spacing\plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed -\appendtoks \everypar\emptytoks \to \everyforgetall % indeed! - -\def\localvbox#1#% - {\vbox#1\bgroup - \forgetparskip - \setlocalhsize - \hsize\localhsize - \forgetparindent - \forgetbothskips - \forgeteverypar - \let\next=} - -\let\dostopattributes\relax % in case these commands end up in an edef - -% \unexpanded\def\dostartattributes#1#2#3% -% {\begingroup % geen \bgroup, anders in mathmode lege \hbox -% \ifcsname#1#3\endcsname -% \let\dostopattributes\@@dostopattributes -% \startcolor[\csname#1#3\endcsname]% -% \else -% \let\dostopattributes\@@nostopattributes -% \fi -% \ifcsname#1#2\endcsname -% \expandafter\doconvertfont -% \else -% \expandafter\gobbleoneargument -% \fi{\csname#1#2\endcsname}} - -\newconditional \parbasedattributes - -\def\finishparbasedattributes - {\ifconditional\parbasedattributes - \setfalse\parbasedattributes - \par - \fi} - -\def\dostopparbasedattributes - {\settrue\parbasedattributes - \dostopattributes} - -\unexpanded\def\@@dostopattributes - {\stopcolor - \finishparbasedattributes - \endgroup} - -\unexpanded\def\@@nostopattributes - {\finishparbasedattributes - \endgroup} - -\unexpanded\def\doattributes#1#2#3#4% - {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes} - -% An even faster \ETEX\ version: - -\unexpanded\def\dostartattributes#1#2#3% - {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \ifincolor - \ifcsname#1#3\endcsname - \let\dostopattributes\@@dostopattributes - \faststartcolor[\csname#1#3\endcsname]% - \else - \let\dostopattributes\@@nostopattributes - \fi - \else - \let\dostopattributes\@@nostopattributes - \fi - \ifcsname#1#2\endcsname - % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi} - -\unexpanded\def\@@dostopattributes - {\faststopcolor - \finishparbasedattributes - \endgroup} - -\unexpanded\def\@@nostopattributes - {\finishparbasedattributes - \endgroup} - -%D Bonus macro, see core-sec.tex - -\unexpanded\def\dosetfontattribute#1#2% - {\ifcsname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi\empty} - -%D Since this happens a lot, and sometimes large arguments -%D are passed in \type {#4}, we just copy some code: - -\unexpanded\def\doattributes#1#2#3#4% - {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \ifincolor - \ifcsname#1#3\endcsname - \let\dostopattributes\@@dostopattributes - \faststartcolor[\csname#1#3\endcsname]% - \else - \let\dostopattributes\endgroup - \fi - \else - \let\dostopattributes\endgroup - \fi - \ifcsname#1#2\endcsname - % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi - {#4}% - \dostopattributes} - -% Kan vaker worden toegepast en moet bovendien sneller! - -\newskip\leftskipadaption -\newskip\rightskipadaption - -\def\doadaptleftskip#1% - {\dosetleftskipadaption{#1}% - \advance\leftskip \leftskipadaption} - -\def\doadaptrightskip#1% - {\dosetrightskipadaption{#1}% - \advance\rightskip \rightskipadaption} - -\setvalue{@lsa@\v!standard}{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} -\setvalue{@lsa@\v!yes }{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} -\letvalue{@lsa@\v!no }\zeropoint -\letvalue{@lsa@\empty }\zeropoint -\setvalue{@rsa@\v!standard}{\@@slright} -\setvalue{@rsa@\v!yes }{\@@slright} -\letvalue{@rsa@\v!no }\zeropoint -\letvalue{@rsa@\empty }\zeropoint - -\def\dosetleftskipadaption#1% - {\edefconvertedargument\ascii{@lsa@#1}% - \leftskipadaption - \ifcsname\ascii\endcsname - \csname\ascii\endcsname - \else - #1% - \fi - \relax} - -\def\dosetrightskipadaption#1% - {\edefconvertedargument\ascii{@rsa@#1}% - \rightskipadaption - \ifcsname\ascii\endcsname - \csname\ascii\endcsname - \else - #1% - \fi - \relax} - -\newcount \noftrackedpagestates -\newif \ifpagestatemismatch -\newcount \realpagestateno -\chardef \frozenpagestate \zerocount - -\def\dotrackpagestate#1#2% - {\ifdoublesided \ifinpagebody \else - \doforcedtrackpagestate{#1}{#2}% - \fi \fi} - -\def\doforcedtrackpagestate#1#2% - {\ifcase\frozenpagestate - \global\advance\noftrackedpagestates\plusone - \global\advance#2\plusone - \lazysavetaggedtwopassdata{#1}{\number\noftrackedpagestates}{\number#2}{\noexpand\realfolio}% - %\llap{\infofont\number\noftrackedpagestates/\number#2}% tracing - \fi} - -\def\doifrightpagestateelse#1#2% - {\ifcase\frozenpagestate - \pagestatemismatchfalse - \realpagestateno\realfolio - \ifinpagebody - \ifdoublesided - \ifodd\realpageno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \else - \twopassdatafoundtrue - \fi - \else\ifdoublesided - \findtwopassdata{#1}{\number#2}% - \iftwopassdatafound - \realpagestateno\twopassdata\relax - \ifnum\twopassdata=\realpageno \else - \pagestatemismatchtrue - \fi - \ifodd\twopassdata\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \else - \ifodd\realpageno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \else - \twopassdatafoundtrue - \fi\fi - \else - \ifodd\realpagestateno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \iftwopassdatafound - \@EA\firstoftwoarguments - \else - \@EA\secondoftwoarguments - \fi} - -\def\doifforcedrightpagestateelse#1#2% - {\ifcase\frozenpagestate - \pagestatemismatchfalse - \realpagestateno\realfolio - \findtwopassdata{#1}{\number#2}% - \iftwopassdatafound - \realpagestateno\twopassdata\relax - \ifnum\twopassdata=\realpageno \else - \pagestatemismatchtrue - \fi - \ifodd\twopassdata\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \else - \ifodd\realpageno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \else - \ifodd\realpagestateno\relax - \twopassdatafoundtrue \else \twopassdatafoundfalse - \fi - \fi - \iftwopassdatafound - \@EA\firstoftwoarguments - \else - \@EA\secondoftwoarguments - \fi} - -\def\freezepagestate {\chardef\frozenpagestate\plusone } -\def\defrostpagestate{\chardef\frozenpagestate\zerocount} - -% we can make more of these on top, but how to deal with mixed frozen states - -\definetwopasslist\s!paragraph \newcount \nofraggedparagraphs - -\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs} -\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs} - -\newcount\pagesignallevel - -\def\startsignalrightpage % one may do a \postsignalrightplace - {\advance\pagesignallevel\plusone - \presignalrightpage - \let\signalrightpage\relax - \let\presignalrightpage\relax - \let\startsignalrightpage\relax - \doifrightpageelse\donothing\donothing - \freezepagestate} - -\def\stopsignalrightpage - {\ifcase\pagesignallevel\or\postsignalrightpage\fi - \advance\pagesignallevel\minusone} - -\def\setraggedparagraphmode - {\signalrightpage\doifrightpageelse} % move it there - -\ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo - -\def\doifswappedrightpageelse#1#2% alleen in box construction ! - {\doifrightpageelse - {#1} - {\scratchcounter\realpageno - \realpageno\realpagestateno\relax - \swapmargins - \realpageno\scratchcounter - #2}} - -\newbox\signaledrightpage % this way we can avoid interference, i.e. postpone placement - -\def\presignalrightpage {\global\setbox\signaledrightpage\hbox{\signalrightpage}} -\def\postsignalrightpage{\ifvoid\signaledrightpage\else\box\signaledrightpage\fi} - -% The next feature is is used in: -% -% \definenumber[test][way=bypage] -% -% \def\Test -% {\incrementnumber[test]\rawnumber[test]/% -% \incrementnumber[test]\rawnumber[test]/% -% \incrementnumber[test]\rawnumber[test]\space -% \checkpagechange{oeps}\changedpage{oeps}\space -% \ifpagechanged TRUE\else FALSE\fi} -% -% \Test\page \Test\par \Test\page \Test\par \Test\page \Test\page -% -% (adapted from cont-new.tex:) - -\newif\ifpagechanged \let\lastchangedpage\empty - -\def\docheckpagestatechange#1#2#3% - {\pagechangedfalse - \doforcedtrackpagestate{#2}{#3}% - \findtwopassdata{#2}{\number#3}% - \iftwopassdatafound - \ifnum\twopassdata>0\getvalue{#2:p:#1}\relax - \pagechangedtrue - \fi - \fi - \ifpagechanged - \letgvalue{#2:p:#1}\twopassdata - \globallet\lastchangedpage\twopassdata - \else - \globallet\lastchangedpage\realfolio - \fi} - -\def\changedpagestate#1#2% - {\executeifdefined{#2:p:#1}{0}} - -\def\checkpagechange#1{\docheckpagestatechange{#1}\s!paragraph\nofraggedparagraphs} -\def\changedpage #1{\changedpagestate{#1}\s!paragraph} - -% saved struts - -\ifx\savedstrutbox\undefined \newbox\savedstrutbox \fi - -\def\savestrut {\setbox\savedstrutbox\copy\strutbox} -\def\savedstrut{\copy \savedstrutbox} - -\chardef\bottomraggedness=0 % 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 - {\chardef\bottomraggedness\zerocount - \n@rmalbottomfalse - \r@ggedbottomtrue - \b@selinebottomfalse - \settopskip} - -\def\alignbottom - {\chardef\bottomraggedness\plusone - \n@rmalbottomtrue - \r@ggedbottomfalse - \b@selinebottomfalse - \settopskip} - -\def\baselinebottom - {\chardef\bottomraggedness\plustwo - \n@rmalbottomfalse - \r@ggedbottomfalse - \b@selinebottomtrue - \settopskip} - -\let\normalbottom=\alignbottom % downward compatible - -% new code, not in use yet - -% for future chinese typo-module: -% -% % \let\raggedleft\veryraggedleft -% % \let\raggedleft\veryraggedright -% -% \startbuffer -% 中中中中中中中中中中中中中中中中中中中中中中中中中% -% 中中中中中中中中中中中中中中中中中中中中中中中中中% -% 中中中中中中中中中中中中中中中中中中中中中中中中中% -% 中中中中中中中中中中中中中中中中中中中中中中中中中% -% \stopbuffer -% -% \framedtext -% [align={broad,flushright},width=90mm] -% {\getbuffer} -% -% \framedtext -% [align={broad,flushleft},width=90mm] -% {\getbuffer} -% -% \framedtext -% [align=middle,width=90mm] -% {\getbuffer} -% -% using just flushleft is not okay here due to the fact that -% leftskip has less stretch than the inter character spacing - -\registerctxluafile{core-spa}{1.001} - -\definesystemattribute[kern-chars] -\definesystemattribute[skip-category] \chardef\skipcategoryattribute \dogetattributeid{skip-category} -\definesystemattribute[skip-penalty] \chardef\skippenaltyattribute \dogetattributeid{skip-penalty} -\definesystemattribute[skip-order] \chardef\skiporderattribute \dogetattributeid{skip-order} -\definesystemattribute[snap-category] -\definesystemattribute[display-math] - -% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop -% \start \dosetstretch{.5em} effe flink doorfietsen \stop - -\def\dosetupgridsnapping % calls too often, only needed in gridsnapping - {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}} - -\def\doenablegridsnapping - {\dosetattribute{snap-category}{1}% - \topskip\strutht - \offinterlineskip} - -\def\dodisablegridsnapping - {\doresetattribute{snap-category}% - % reset topskip - \oninterlineskip} - -% experimental code, not yet interfaced: - -% category: -% 0 == discard discard -% 1 == only if larger largest -% 2 == force even if smaller force -% 3 == only take penalty component penalty -% 4 == add to existing skip add -% 5 == disable (ignore following) disable -% 6 == kill whitespace nowhite -% 7 == discard previous back -% -% penalty: larger wins -% order: larger wins -% category:2,order:5,penalty:10000,skip:value|kw -% -% always -- obsolete -% none -- obsolete -% outer -- obsolete -% reset -- obsolete -% \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} - -% todo, in grid mode: vspacing.fixed = false - -\newtoks\everybeforeblankhandling -\newtoks\everyafterblankhandling - -\appendtoks - \blankskip\zeropoint - \attribute\skipcategoryattribute\plusone - \attribute\skippenaltyattribute \attributeunsetvalue - \attribute\skiporderattribute \attributeunsetvalue - \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 - -\def\setblankcategory#1{\attribute\skipcategoryattribute#1\relax} -\def\setblankorder #1{\attribute\skiporderattribute #1\relax} -\def\setblankpenalty #1{\attribute\skippenaltyattribute #1\relax} -\def\addblankskip#1#2#3{\advance\blankskip#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax} -\def\fixedblankskip {\settrue \blankisfixed} % \blankskip1\blankskip} -\def\flexibleblankskip {\setfalse\blankisfixed} % \blankskip1\blankskip\!!plus\skipgluefactor\blankskip\!!minus\skipgluefactor\blankskip} - -\def\startblankhandling - {\begingroup - \the\everybeforeblankhandling} - -\def\stopblankhandling - {\the\everyafterblankhandling - \vskip\blankskip - \endgroup} - -\def\flushblankhandling - {\the\everyafterblankhandling - \vskip\blankskip - \the\everybeforeblankhandling} - -% % % % - -\def\definevspacingamount - {\dotripleempty\dodefinevspacingamount} - -\def\dodefinevspacingamount[#1][#2][#3]% - {\ctxlua{vspacing.setskip("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}} - -\def\definevspacing - {\dodoubleempty\dodefinevspacing} - -\def\dodefinevspacing[#1][#2]% - {\ctxlua{vspacing.setmap("#1","#2")}} - -\unexpanded\def\vspacing - {\dosingleempty\dovspacing} - -\def\dovspacing[#1]% - {\ctxlua{vspacing.analyse("\iffirstargument#1\else default\fi")}} - -% category:4 is default - -\definevspacingamount[\v!big] [\bigskipamount] [\openlineheight] -\definevspacingamount[\v!medium] [\medskipamount] [0.50\openlineheight] -\definevspacingamount[\v!small] [\smallskipamount] [0.25\openlineheight] -\definevspacingamount[\v!line] [\openlineheight] [\openlineheight] -\definevspacingamount[\v!halfline][0.50\openlineheight][0.50\openlineheight] -\definevspacingamount[\v!formula] [\medskipamount] [0.50\openlineheight] -\definevspacingamount[\v!white] [\parskip] [\openlineheight] - -\definevspacing[\s!default] [\v!big] -\definevspacing[\v!samepage][penalty:10000] -\definevspacing[\v!max] [category:1] -\definevspacing[\v!force] [category:2] -\definevspacing[\v!disable] [category:5] -\definevspacing[\v!nowhite] [category:6] -\definevspacing[\v!back] [category:7] -\definevspacing[\v!always] [category:0] -\definevspacing[\v!weak] [order:0] -\definevspacing[\v!strong] [order:100] - -\defineblankmethod[\v!samepage]{\writestatus\m!systems{ignoring blank method '\v!samepage'}} -\defineblankmethod[\v!max] {\writestatus\m!systems{ignoring blank method '\v!max'}} -\defineblankmethod[\v!weak] {\writestatus\m!systems{ignoring blank method '\v!weak'}} -\defineblankmethod[\v!strong] {\writestatus\m!systems{ignoring blank method '\v!strong'}} - -% \definevspacing[whatever][4*big] -% \vspacing[2*big,-medium,-3*small,whatever,halfline,order:10,category:4,strong,samepage] -% \vspacing[2*big,category:disable] -% \vspacing[2*big,disable] -% \vspacing[2*big,back] - -% some temporary hacks - -\setfalse\vspacingenabled - -% ! ! ! ! ! later, now each newline does a \par and call to the callback - -\newtoks\everyenablevspacing -\newtoks\everydisablevspacing - -\def\enablevspacing {\the\everyenablevspacing} -\def\disablevspacing{\the\everydisablevspacing} - -\appendtoks - \writestatus\m!systems{! ! enabling vspacing ! !}% - \settrue\vspacingenabled - \ctxlua{vspacing.enable()}% -\to \everyenablevspacing - -\appendtoks - \writestatus\m!systems{! ! disabling vspacing ! !}% - \setfalse\vspacingenabled - \ctxlua{vspacing.disable()}% -\to \everydisablevspacing - -\let\originalblank \blank % we use \original for non-primitives -\let\originalvspacing\vspacing - -\let\setupvspacing\setupblank % for the moment - -% so, the new one will be -% -% \chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline -% -% \def\bottomalignlimit{3\lineheight} % will be settable -% -% \def\raggedbottom {\chardef\bottomraggedness=0 \settopskip} -% \def\alignbottom {\chardef\bottomraggedness=1 \settopskip} -% \def\baselinebottom{\chardef\bottomraggedness=2 \settopskip} -% -% \let\normalbottom =\alignbottom - -% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness -% \tolerance >= 1500 % was 200 -% \raggedness = 2 .. 6\bodyfontsize - -\chardef\raggedstatus=0 % normal left center right - -\def\leftraggedness {2\bodyfontsize} -\def\rightraggedness {2\bodyfontsize} -\def\middleraggedness {6\bodyfontsize} - -\def\middleraggedness {.5\hsize} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} - -% oeps, hsize can be 0pt in which case we get a strange division - -\def\middleraggedness {\ifdim\hsize=\zeropoint6\bodyfontsize\else.5\hsize\fi} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} - -%D More hyphenation control, will be combined with align -%D setup. - -\def\nohyphens - {\ifx\dohyphens\relax - \edef\dohyphens - {\hyphenpenalty\the\hyphenpenalty - \exhyphenpenalty\the\exhyphenpenalty\relax}% - \fi - \hyphenpenalty\plustenthousand - \exhyphenpenalty\plustenthousand} - -\let\dohyphens\relax - -%D To prevent unwanted side effects, we also have to check -%D for hyphens here: - -\newskip\@@raggedskipa -\newskip\@@raggedskipb - -\def\setraggedness#1% - {\ifnum\tolerance<1500\relax % small values have - \tolerance1500\relax % unwanted side effects - \fi - \ifx\dohyphens\relax - % this code will be reconsidered / kind of fuzzy (and old) - \@@raggedskipa 2.5\hsize - \@@raggedskipb #1\relax - \divide\@@raggedskipa \@@raggedskipb - \hyphenpenalty\@@raggedskipa - \fi} - -\let\updateraggedskips\relax - -\def\setraggedskips#1#2#3#4#5#6#7% never change this name - {\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}% - \updateraggedskips} - -\def\dosetraggedskips#1#2#3#4#5#6#7% - {\chardef \raggedstatus#1\relax - \leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3 - \rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3 - \spaceskip #4\relax - \xspaceskip #5\relax - \parfillskip\zeropoint\!!plus#6\relax - \parindent #7\relax} - -% \def\notragged% -% {\setraggedskips{0}{0em}{0em}{0em}{0em}{1fil}{\parindent}} - -% older (context) names: - -\let\spaceamount \interwordspace -\let\emspaceamount\emwidth - -% tracing: - -\def\doshowpardata#1% - {\ifx#1\relax\else - \hbox{\string#1: \the#1}\endgraf - \expandafter\doshowpardata - \fi} - -\def\showpardata - {\edef\thepardata - {\hbox{font: \fontname\font}\endgraf - \doshowpardata - \interwordspace \interwordstretch \interwordshrink \emwidth \exheight \extraspace - \hsize \vsize - \leftskip \rightskip - \spaceskip \xspaceskip - \parindent \parfillskip - \hyphenpenalty \exhyphenpenalty - \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty - \doublehyphendemerits \finalhyphendemerits \adjdemerits - \relax}% - \begingroup - \dontshowcomposition - \inleftmargin{\vsmash - {\switchtobodyfont[7pt,tt]% - \framed[\c!align=\v!right]{\thepardata}}}% - \endgroup} - -\def\startshowpardata - {\begingroup - \showcomposition - \showstruts\tracepositionstrue \tracingparagraphs\maxdimen - \appendtoksonce\showpardata\let\showpardata\relax\to\everypar} - -\def\stopshowpardata - {\endgraf - \endgroup} - -% \defineXMLenvironment[showpardata] \startshowpardata \stopshowpardata -% \defineXMLsingular [showpardata] \showpardata - -% defaults - -\def\raggedfillamount {1fil} -\def\raggedhalffillamount{.5fil} -\def\raggedspaceamount {\interwordspace} % {.3333em} -\def\raggedxspaceamount {.5em} - -\def\notragged - {\chardef\raggedstatus\zerocount - \leftskip 1\leftskip - \rightskip 1\rightskip - \spaceskip \zeropoint - \xspaceskip \zeropoint - \parfillskip\zeropoint\!!plus\raggedfillamount\relax - \let\updateraggedskips\relax} % new - -\let\forgetragged\notragged - -\def\raggedleft - {\setraggedness\leftraggedness - \setraggedskips1\leftraggedness\zeropoint\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -\def\raggedcenter - {\setraggedness\middleraggedness - \setraggedskips2\middleraggedness\middleraggedness\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -%D We used to have: -%D -%D \starttyping -%D \def\raggedright -%D {\setraggedness\rightraggedness -%D \setraggedskips{3}{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}} -%D \stoptyping -%D -%D However, the next alternative, suggested by Taco, is better. - -\def\raggedright - {\setraggedness\rightraggedness - \setraggedskips3\zeropoint\rightraggedness\raggedspaceamount - \raggedxspaceamount\raggedfillamount\parindent} - -\def\veryraggedleft - {\setraggedskips1\raggedfillamount\zeropoint\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -%D When we want the last line to have a natural width: -%D -%D \starttyping -%D \def\veryraggedleft% -%D {\setraggedskips{1}{1fil}{0em}{.3333em}{.5em}{0em}{-1fil}} -%D \stoptyping -%D -%D but this one is not accepted by the macros. - -\def\veryraggedcenter - {\setraggedskips2\raggedfillamount\raggedfillamount\raggedspaceamount - \raggedxspaceamount\zeropoint\zeropoint} - -\def\veryraggedright - {\setraggedskips3\zeropoint\raggedfillamount\raggedspaceamount - \raggedxspaceamount\zeropoint\parindent} - -\def\ttraggedright - {\tttf - \setraggedskips3\zeropoint\rightraggedness - \zeropoint\zeropoint\zeropoint\parindent} % \ctxparindent - -%D A bonus one: - -\def\raggedwidecenter - {\setraggedness\middleraggedness - \setraggedskips2\raggedhalffillamount\raggedhalffillamount - \raggedspaceamount\raggedxspaceamount\zeropoint\zeropoint} - -\newif\if@@asragged \@@asraggedtrue % old method - -% todo -% -% \setuplayout[grid=yes,lines=44] \showgrid -% \starttext -% test \vfill test \endgraf \strut \endgraf \vskip-\lineheight \removedepth \pagina test -% \stoptext - -% \setupalign[reset,new,right,old] - -\def\@@align@@rl{\if!!donea\veryraggedleft \else\raggedleft \fi} -\def\@@align@@rr{\if!!donea\veryraggedright \else\raggedright \fi} -\def\@@align@@rc{\if!!donea\veryraggedcenter\else\raggedcenter\fi} - -\setvalue{@@ngila@@\v!broad }{\!!doneatrue} -\setvalue{@@ngila@@\v!wide }{\!!donebtrue} - -\def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads - -\installalign \v!new {\@@asraggedfalse} -\installalign \v!old {\@@asraggedtrue} -\installalign \empty {} - -\installalign \v!line {\baselinebottom} -\installalign \v!bottom {\raggedbottom} -\installalign \v!height {\normalbottom} -\installalign \v!width {\notragged} -\installalign \v!normal {\notragged} -\installalign \v!yes {\notragged} -\installalign \v!no {\raggedright} -\installalign \v!inner {\if@@asragged \setraggedparagraphmode\@@align@@rl\@@align@@rr \else - \setraggedparagraphmode\@@align@@rr\@@align@@rl \fi} -\installalign \v!outer {\if@@asragged \setraggedparagraphmode\@@align@@rr\@@align@@rl \else - \setraggedparagraphmode\@@align@@rl\@@align@@rr \fi} -\installalign \v!left {\if@@asragged\@@align@@rl\else\@@align@@rr\fi} -\installalign \v!right {\if@@asragged\@@align@@rr\else\@@align@@rl\fi} -\installalign \v!middle {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} -\installalign \v!flushleft {\if!!donea\veryraggedright \else\raggedright\fi} -\installalign \v!flushright {\if!!donea\veryraggedleft \else\raggedleft \fi} -\installalign \v!flushouter {\setraggedparagraphmode\raggedleft\raggedright} -\installalign \v!flushinner {\setraggedparagraphmode\raggedright\raggedleft} -\installalign \v!center {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} -\installalign \v!hanging {\enableprotruding} -\installalign \v!nothanging {\disableprotruding} -\installalign \v!hz {\enableadjusting} -\installalign \v!nohz {\disableadjusting} -\installalign \v!spacing {\enablespacehandling \enablekernhandling} -\installalign \v!nospacing {\disablespacehandling\disablekernhandling} -\installalign \v!hyphenated {\dohyphens} -\installalign \v!nothyphenated {\nohyphens} -\installalign \v!new {\@@asraggedfalse} % so new will give you consistency -\installalign \v!reset {\notragged\normalbottom} - -\installalign \v!tolerant {\tolerance3000 \relax} -\installalign \v!verytolerant {\tolerance4500 \relax} -\installalign \v!stretch {\emergencystretch\bodyfontsize} - -\installalign \v!grid {\doenablegridsnapping } % only mkiv -\installalign \v!nogrid {\dodisablegridsnapping} % only mkiv - -\installalign \v!righttoleft {\lefttoright} -\installalign \v!lefttoright {\righttoleft} -\installalign {l2r} {\lefttoright} -\installalign {r2l} {\righttoleft} - -\newcount\hyphenminoffset - -\ifx\sethyphenationvariables\undefined \let\sethyphenationvariables\relax \fi - -\def\lesshyphens - {\advance\hyphenminoffset\plusone - \sethyphenationvariables} - -\def\morehyphens - {\ifcase\hyphenminoffset \else - \advance\hyphenminoffset\minusone - \fi - \sethyphenationvariables} - -\installalign \v!lesshyphenation {\lesshyphens} -\installalign \v!morehyphenation {\morehyphens} - -\def\dodosetupalign#1{\csname @@align@@#1\endcsname} -\def\dodosetupngila#1{\csname @@ngila@@#1\endcsname} - -\def\setupalign - {\dosingleargument\dosetupalign} - -\def\dosetupalign[#1]% can be made faster by checking for defined #1 - {\!!doneafalse - \!!donebfalse - \processcommacommand[#1]\dodosetupngila - \processcommacommand[#1]\dodosetupalign} - -% \setupalign[flushleft] \input ward \par % lijnlinks -% \setupalign[right] \input ward \par - -% \setupalign[flushright] \input ward \par % lijnrechts -% \setupalign[left] \input ward \par - -% \setupalign[middle] \input ward \par % centreer -% \setupalign[center] \input ward \par - -\def\startalignment - {\bgroup - \setupalign} - -\def\stopalignment - {\par - \egroup} - -\chardef\alignstrutmode=1 - -% see later for the real definition, which in the simple case is: - -\newtoks \everyleftofalignedline -\newtoks \everyrightofalignedline - -\def\shiftalignedline#1#2#3#4% left, right, inner, outer - {\rightorleftpageaction - {\everyleftofalignedline {\hskip\dimexpr#1+#3\relax}% - \everyrightofalignedline{\hskip\dimexpr#2+#4\relax}} - {\everyleftofalignedline {\hskip\dimexpr#1+#4\relax}% - \everyrightofalignedline{\hskip\dimexpr#2+#3\relax}}} - -\def\doalignline#1#2% \\ == newline - {\noindentation % was \noindent - \dontleavehmode % added in marrakesch at TUG 2006\begingroup - \begingroup - \setlocalhsize % new - \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}% - \dowithnextbox - {\hbox to \localhsize - {\ifcase\alignstrutmode\or\strut\fi - \the\everyleftofalignedline - #1\unhbox\nextbox#2\relax - \the\everyrightofalignedline}% - \endgroup} - \hbox} - -% plain commands - -\ifx\undefined\line \def\line {\hbox to\hsize} \fi -\ifx\undefined\leftline \def\leftline #1{\line{#1\hss}} \fi -\ifx\undefined\rightline \def\rightline #1{\line{\hss#1}} \fi -\ifx\undefined\centerline \def\centerline#1{\line{\hss#1\hss}} \fi - -% directe commando's - -\def\leftaligned {\doalignline \relax \hss } -\def\midaligned {\doalignline \hss \hss } -\def\rightaligned{\doalignline \hss \relax} - -\let\centeraligned\midaligned - -\def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated - -% indirecte commando's - -\letvalue{\s!do\v!line\v!left }\leftaligned -\letvalue{\s!do\v!line\v!right }\rightaligned -\letvalue{\s!do\v!line\v!middle }\midaligned -\letvalue{\s!do\v!line\v!flushleft }\rightaligned -\letvalue{\s!do\v!line\v!flushright}\leftaligned -\letvalue{\s!do\v!line\v!center }\midaligned - -\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} - -%D Experimental: - -\def\doxalignline#1#2#3#4#5#6% - {\noindentation % was \noindent - \dontleavehmode % added in marrakesch at TUG 2006\begingroup - \begingroup - \setlocalhsize - \def\\{\egroup\par\doxalignline#1#2#3#4#5#6\bgroup}% inefficient - \dowithnextbox - {%\noindent moved up - \hbox to \localhsize - {#1\hskip\ifdone#2\else#3\fi#4% - \hbox to \localhsize - {\the\everyleftofalignedline - \ifcase\alignstrutmode\or\strut\fi - \ifdone#5\unhbox\nextbox#6\else#6\unhbox\nextbox#5\fi - \the\everyrightofalignedline}% - \hss}% - \endgroup} - \hbox} - -\def\doxcheckline - {\signalrightpage\doifrightpageelse\donetrue\donefalse} - -\setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss } -\setvalue{\s!do\v!line\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax} -\setvalue{\s!do\v!line\v!innermargin}{\doxalignline\doxcheckline-+\innermargintotal\relax\hss } -\setvalue{\s!do\v!line\v!outermargin}{\doxalignline\doxcheckline+-\outermargintotal\hss \relax} -\setvalue{\s!do\v!line\v!inneredge }{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss } -\setvalue{\s!do\v!line\v!outeredge }{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax} -\setvalue{\s!do\v!line\v!backspace }{\doxalignline\doxcheckline-+\backspace \relax\hss } -\setvalue{\s!do\v!line\v!cutspace }{\doxalignline\doxcheckline+-\cutspace \hss \relax} - -\setvalue{\s!do\v!line\v!leftmargin }{\doxalignline\donefalse --\leftmargintotal \hss \relax} -\setvalue{\s!do\v!line\v!rightmargin}{\doxalignline\donefalse ++\rightmargintotal\relax\hss } -\setvalue{\s!do\v!line\v!leftedge }{\doxalignline\donefalse --\leftedgetotal \hss \relax} -\setvalue{\s!do\v!line\v!rightedge }{\doxalignline\donefalse ++\rightedgetotal \relax\hss } - -% ! ! ! beware, redefining \doalignline gives the wrong results ! ! ! -% -% \def\doalignline{\doxalignline\donefalse++\zeropoint} - -%D Better: - -\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} - -\def\alignedline#1#2% setting default - {\csname\s!do\v!line\ifcsname\s!do\v!line#1\endcsname#1\else#2\fi\endcsname} - -%D ... - -\def\dosetuptolerance[#1]% - {\doifinsetelse\v!vertical{#1}% - {\normalexpanded{\noexpand\processallactionsinset[#1]} - [ \v!verystrict=>\def\bottomtolerance{}, - \v!strict=>\def\bottomtolerance{.050}, - \v!tolerant=>\def\bottomtolerance{.075}, - \v!verytolerant=>\def\bottomtolerance{.100}]}% - {\normalexpanded{\noexpand\processallactionsinset[#1]} - [ \v!stretch=>\emergencystretch\bodyfontsize, - \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax, - \v!verystrict=>\tolerance 200, - \v!strict=>\tolerance1500, - \v!tolerant=>\tolerance3000, - \v!verytolerant=>\tolerance4500]}} - -\def\setuptolerance - {\dosingleargument\dosetuptolerance} - -% \def\woordrechts -% {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}} - -% beware: \wordright{whatever\kern-\rightskip} should work! -% so, no funny boxing here - -\def\dowordright[#1]% - {% don't change - \groupedcommand - {\removeunwantedspaces - \hfill - \allowbreak % changed back from \hskip\zeropoint - \strut - \hfill - \quad % decent spacing - \hbox} - {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}% - \parfillskip\zeropoint - %\finalhyphendemerits\zerocount % yes or no - \par}} - -\def\wordright - {\dosingleempty\dowordright} - -% \dorecurse{5}{something } \wordright{--someone} \endgraf -% \dorecurse{6}{something } \wordright{--someone} \endgraf -% \dorecurse{7}{something } \wordright{--someone} \endgraf -% -% \dorecurse{5}{something } \wordright{--someone else entirely} \endgraf -% \dorecurse{6}{something } \wordright{--someone else entirely} \endgraf -% \dorecurse{7}{something } \wordright{--someone else entirely} \endgraf -% -% \wordright[\rightskip]{whatever} - -% \simplealignedbox{2cm}{right}{x} - -\setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}} -\setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}} -\setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}} -\setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}} -\setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}} - -\def\simplealignedbox#1{\executeifdefined{\s!simple\c!align#1}{\getvalue{\s!simple\c!align\v!right}}} - -%D \macros -%D {pushindentation,popindentation} -%D -%D The pushing and popping is done by: - -\newbox\indentationboxA -\newbox\indentationboxB - -\def\pushindentation - {\bgroup - \ifhmode - \unskip - \setbox\indentationboxA\lastbox % get \strut if present - \unskip - \setbox\indentationboxB\lastbox % get \indent generated box - \unskip - \else - \hskip\zeropoint % switch to horizontal mode - \unskip - \setbox\indentationboxA\lastbox % get \indent generated box - \setbox\indentationboxB\emptybox - \fi} - -\def\popindentation - {\box\indentationboxB\box\indentationboxA % put back the boxes - \egroup} - -%D The only complication lays in \type{\strut}. In \PLAIN\ -%D \TEX\ a \type{\strut} is defined as: -%D -%D \starttyping -%D \def\strut% -%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} -%D \stoptyping -%D -%D But what is a \type{\strut}? Normally it's a rule of width -%D zero, but when made visual, it's a rule and a negative skip. -%D The mechanism for putting things in the margins described -%D here cannot handle this situation very well. One -%D characteristic of \type{\strut} is that the \type{\unhcopy} -%D results in entering horizontal mode, which in return leads -%D to some indentation. -%D -%D To serve our purpose a bit better, the macro \type{\strut} -%D can be redefined as: -%D -%D \starttyping -%D \def\strut -%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox} -%D \stoptyping -%D -%D Or more compatible: -%D -%D \starttyping -%D \def\strut -%D {\relax\ifmmode -%D \copy\strutbox -%D \else -%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup -%D \fi} -%D \stoptyping -%D -%D In \CONTEXT\ however we save some processing time by putting -%D an extra \type{\hbox} around the \type{\strutbox}. - -% moved from page-lin.tex to here (due to visualization added -% in august 2003) -% -% \unexpanded \def\crlf -% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break} - -\unexpanded \def\crlf - {\ifhmode - \unskip - \prewordbreak\crlfplaceholder - \ifcase\raggedstatus\hfil\or\or\or\hfil\fi - \break - \else - \crlfplaceholder - \endgraf - \fi} - -\def\crlfplaceholder - {\strut} - -\def\settestcrlf - {\def\crlfplaceholder - {\hbox to \zeropoint - {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}} - -%D \starttyping -%D % \setuplayout[gridgrid=yes] \showgrid -%D -%D \startbuffer -%D test 1\crlf -%D test 2\crlf -%D -%D \crlf test 3 -%D -%D test 4\crlf -%D test 5 -%D -%D \crlf -%D \crlf -%D \crlf -%D test 6 -%D \stopbuffer -%D -%D \hbox -%D {\hsize5em -%D \ruledvtop{\getbuffer}\enspace -%D \ruledvtop{\showstruts\getbuffer}\enspace -%D \hsize15em \setuptyping[before=,after=]% -%D \ruledvtop{\typebuffer}} -%D \stoptyping - -\def\justonespace - {\removelastspace\space} % \removeunwantedspaces\space - -\def\ignorecrlf - {\let\crlf\justonespace\let\\\crlf} - -\def\showstruts - {\setteststrut - \settestcrlf} - -\def\definehspace - {\dotripleempty\dodefinehspace} - -\def\dodefinehspace[#1][#2][#3]% #1 = optional namespace - {\ifthirdargument - \setvalue{\??hs#1:#2}{#3}% - \else - \setvalue{\??hs:#1}{#2}% - \fi} - -\unexpanded\def\hspace - {\dodoubleempty\dohspace} - -\def\dohspace[#1][#2]% - {\ifsecondargument - \dodohspace[#1][#2]% - \else\iffirstargument - \hspace[][#1]% - \else - \hspace[][\s!default]% - \fi\fi} - -\def\dodohspace[#1][#2]% - {\ifhmode - \removeunwantedspaces - \hskip\hspaceamount{#1}{#2}% - \expandafter\ignorespaces - \fi} - -\def\hspaceamount#1#2% - {\executeifdefined{\??hs#1:#2}{\executeifdefined{\??hs:#2}\zeropoint}} - -\definehspace [\v!small] [.25\emspaceamount] -\definehspace [\v!medium] [.5\emspaceamount] -\definehspace [\v!big] [1\emspaceamount] -\definehspace [\v!normal] [1\spaceamount] -\definehspace [\v!default] [\spaceamount] - -%D Taken from Taco's math module (cq. \AMS\ macros), but -%D adapted to \type {\hspace}: - -\unexpanded\def\textormathspace #1#2#3{\ifmmode\mskip#1#2\else\kern #1\hspaceamount\empty{#3}\fi\relax} -\unexpanded\def\breakabletextormathspace#1#2#3{\ifmmode\mskip#1#2\else\hskip#1\hspaceamount\empty{#3}\fi\relax} - -\newmuskip\hairmuskip \hairmuskip=.15mu - -\unexpanded\def\hairspace {\textormathspace+\hairmuskip{.5}} -\unexpanded\def\thinspace {\textormathspace+\thinmuskip 1} -\unexpanded\def\medspace {\textormathspace+\medmuskip 2} -\unexpanded\def\thickspace {\textormathspace+\thickmuskip3} -\unexpanded\def\neghairspace {\textormathspace-\thinmuskip{.5}} -\unexpanded\def\negthinspace {\textormathspace-\thinmuskip 1} -\unexpanded\def\negmedspace {\textormathspace-\medmuskip 2} -\unexpanded\def\negthickspace{\textormathspace-\thickmuskip3} - -% needed for unicode: - -\unexpanded\def\breakablethinspace {\breakabletextormathspace+\thinmuskip 1} - -\unexpanded\def\twoperemspace {\hskip\dimexpr\emwidth/2\relax} % == \enspace -\unexpanded\def\threeperemspace {\hskip\dimexpr\emwidth/3\relax} -\unexpanded\def\fourperemspace {\hskip\dimexpr\emwidth/4\relax} -\unexpanded\def\fiveperemspace {\hskip\dimexpr\emwidth/5\relax} % goodie -\unexpanded\def\sixperemspace {\hskip\dimexpr\emwidth/6\relax} -\unexpanded\def\figurespace {\begingroup\setbox\scratchbox\hbox{0}\hskip\wd\scratchbox\endgroup} % there is a command for this -\unexpanded\def\punctuationspace {\begingroup\setbox\scratchbox\hbox{.}\hskip\wd\scratchbox\endgroup} -\unexpanded\def\ideographicspace {\hskip\dimexpr\emwidth/1\relax} -\unexpanded\def\ideographichalffillspace{\hskip\dimexpr\emwidth/2\relax} -%unexpanded\def\nobreakspace {\penalty\plustenthousand\space} -\unexpanded\def\nobreakspace {\penalty\plustenthousand\kern\interwordspace} -\unexpanded\def\narrownobreakspace {\penalty\plustenthousand\thinspace} -%unexpanded\def\zerowidthnobreakspace {\penalty\plustenthousand\hskip\zeropoint} -\unexpanded\def\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint} -\unexpanded\def\zerowidthspace {\hskip\zeropoint} - -\definehspace[.5][.1250\emspaceamount] % could also be [.1250\spaceamount] -\definehspace[1] [.1667\emspaceamount] -\definehspace[2] [.2222\emspaceamount] -\definehspace[3] [.2777\emspaceamount] - -\let \, \thinspace -\let \: \medspace -\let \; \thickspace -\let \! \negthinspace - -% this will become an alternative bunch of \blank settings -% -% \startlines -% \scratchskip=.23pt plus 10pt minus 4pt \relax \number\scratchskip \space \the\scratchskip -% \setsimplifiedskip\scratchskip1 \number\scratchskip \space \the\scratchskip -% \setsimplifiedskip\scratchskip2 \number\scratchskip \space \the\scratchskip -% \getsimplifiedskip\scratchskip\scratchcounter \number\scratchcounter -% \stoplines -% -% \hrule width10cm \endgraf -% \discardedskip{10pt} -% \retainedskip {4pt} -% \discardedskip {5pt} -% \hrule width10cm \endgraf -% \blockedskip{0pt} -% \discardedskip{10pt} -% \retainedskip {4pt} -% \discardedskip {5pt} -% \hrule width10cm \endgraf -% \frozenskip {4cm} -% \hrule width10cm \endgraf -% \vskip10pt -% \hrule width10cm \endgraf - -\newskip\simplifiedskip -\newskip\simplifiedcounter - -\chardef\@@discardedskip1 -\chardef\@@retainedskip 2 -\chardef\@@forcedskip 3 -\chardef\@@blockedskip 4 -\chardef\@@frozenskip 5 % after heads, no break - -\def\setsimplifiedskip#1#2% - {#1\dimexpr(10\dimexpr(#1/10)) plus \gluestretch#1 minus \glueshrink#1\relax - \advance#1\numexpr(#2)sp\relax} - -\def\getsimplifiedskip#1#2% - {\simplifiedskip#1\relax - \ifzeropt\simplifiedskip % \ifdim\simplifiedskip=\zeropoint - #2\zerocount - \else - \simplifiedcounter\dimexpr10\dimexpr#1/10\relax\relax - \advance\simplifiedskip-\simplifiedcounter - #2\number\simplifiedskip\relax - \fi} - -\def\conditionalskip#1#2% - {\scratchskip#1\relax - \setsimplifiedskip\scratchskip#2\relax - \vskip\scratchskip\relax} - -\def\defrostskip - {\scratchskip\lastskip\penalty50000\normalvskip-\scratchskip\penalty50000\relax} - -\def\frozenskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \fi} - -\def\discardedskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifcase\scratchcounter - \conditionalskip{#1}\@@discardedskip - \or % discard - \ifdim\lastskip>#1\else - \normalvskip-\lastskip - \conditionalskip{#1}\@@discardedskip - \fi - \or % retain - \ifdim\lastskip>#1\else - \normalvskip-\lastskip - \conditionalskip{#1}\@@discardedskip - \fi - \or % forced - \conditionalskip{#1}\@@discardedskip - \or % ignored - \or % frozen - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \else\ifdim#1=\zeropoint\else - \vskip#1\relax - \fi\fi - \fi} - -\def\retainedskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifcase\scratchcounter - \conditionalskip{#1}\@@retainedskip - \or % discard - \normalvskip-\lastskip - \conditionalskip{#1}\@@retainedskip - \or % retain - \ifdim\lastskip>#1\else - \normalvskip-\lastskip - \conditionalskip{#1}\@@retainedskip - \fi - \or % forced - \conditionalskip{#1}\@@retainedskip - \or % ignored - \or % frozen - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \else\ifdim#1=\zeropoint\else - \vskip#1\relax - \fi\fi - \fi} - -\def\forcedskip#1% - {\endgraf - \ifvmode - \conditionalskip{#1}\@@forcedskip - \fi} - -\def\blockedskip#1% - {\endgraf - \ifvmode - \getsimplifiedskip\lastskip\scratchcounter - \ifcase\scratchcounter - \conditionalskip{#1}\@@blockedskip - \or % discard - \conditionalskip{#1}\@@blockedskip - \or % retain - \conditionalskip{#1}\@@blockedskip - \or % forced - \conditionalskip{#1}\@@blockedskip - \or % ignored - \or % frozen - \ifdim\lastskip>#1\else - \defrostskip - \conditionalskip{#1}\@@frozenskip - \fi - \else\ifdim#1=\zeropoint\else - \vskip#1\relax - \fi\fi - \fi} - -% beware, changing this will break some code (like pos/backgrounds) - -\newtoks\everyfirstparagraphintro -\newtoks\everynextparagraphintro -\newtoks\@@everyparagraphtoks - -\chardef\everyparagraphintro\zerocount - -\def\setupparagraphintro - {\dodoubleempty\dosetupparagraphintro} - -\def\dosetupparagraphintro[#1][#2]% - {\processallactionsinset - [#1] - [ \v!reset=>\global\chardef\everyparagraphintro\zerocount - \global\everyfirstparagraphintro\emptytoks - \global\everynextparagraphintro \emptytoks, - \v!first=>\global\chardef\everyparagraphintro\plusone - \doglobal\appendtoks#2\to\everyfirstparagraphintro, - \v!next=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plusone\fi - \doglobal\appendtoks#2\to\everynextparagraphintro, - \v!each=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plustwo\fi - \doglobal\appendtoks#2\to\everyfirstparagraphintro - \doglobal\appendtoks#2\to\everynextparagraphintro]} - -%D We can say: -%D -%D \starttyping -%D \setupparagraphintro[first][\index{Knuth}] -%D \stoptyping -%D -%D Maybe more convenient is: -%D -%D \starttyping -%D \flushatparagraph{\index{Zapf}} -%D \stoptyping - -\def\flushatparagraph#1% - {\global\chardef\everyparagraphintro\plusone - \global\appendtoks{#1}\to\everyfirstparagraphintro - \global\let\insertparagraphintro\doinsertparagraphintro} - -\def\doinsertparagraphintro % can be merged with the next - {\ifcase\everyparagraphintro\else\@EA\dodoinsertparagraphintro\fi} - -\def\dodoinsertparagraphintro - {\begingroup - \everypar\emptytoks - \ifcase\everyparagraphintro\relax - % no data - \@@everyparagraphtoks\emptytoks - \or - % first data - \global\chardef\everyparagraphintro\plustwo - \@@everyparagraphtoks\everyfirstparagraphintro - \global\everyfirstparagraphintro\emptytoks - \or - % next data - \@@everyparagraphtoks\everynextparagraphintro - \fi - \the\@@everyparagraphtoks - \global\let\insertparagraphintro\relax - \endgroup} - -\let\insertparagraphintro\relax - -%D \starttyping -%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}] -%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}] -%D \setupparagraphintro[next] [\hbox to 3.5em{\tt NEXT \hss}] -%D \setupparagraphintro[next] [\hbox to 3.5em{\tt TXEN \hss}] -%D \setupparagraphintro[each] [\hbox to 3.0em{\tt EACH \hss}] -%D \setupparagraphintro[each] [\hbox to 3.0em{\tt HCEA \hss}] -%D -%D some paragraph \par -%D some paragraph \par -%D some paragraph \par -%D -%D \definelabel[parnumber] -%D -%D \setupparagraphintro[reset,each][\inleft{\slxx\parnumber}] -%D -%D some paragraph \par -%D some paragraph \par -%D some paragraph \par -%D \stoptyping - -%D \macros -%D {flushatnextpar} -%D -%D This macro collects data that will be flushed at the next paragraph. -%D By using this macro you can avoid interfering nodes (writes, etc). - -\newbox\postponednodedata -\let\flushpostponednodedata\relax - -\def\flushatnextpar - {\bgroup - \global\let\flushpostponednodedata\doflushpostponednodedata - \dowithnextbox{\global\setbox\postponednodedata\hbox{\box\postponednodedata\box\nextbox}\egroup}\hbox} - -\def\doflushpostponednodedata - {\ifvoid\postponednodedata\else - \hbox{\smashedbox\postponednodedata}% - \fi - \global\let\flushpostponednodedata\relax} - -% Very nasty but needed for margin stuff inside colored -% paragraphs. - -\let\normalvadjust\vadjust - -% \def\graphicvadjust % bad, those low level color calls here -% {\dowithnextboxcontent -% {\forgetall} -% {\normalvadjust -% {\unvbox\nextbox -% % corrects for one line paragraphs -% \nointerlineskip -% \kern-\struttotal -% \nointerlineskip -% \verticalstrut}}% -% \vbox} - -\def\graphicvadjust % nasty bidi handling - {\dowithnextboxcontent - {\forgetall} - {\vadjust{\vbox attr \graphicvadjustattribute \plusone - {\unvbox\nextbox - % corrects for one line paragraphs - \nointerlineskip - \kern-\struttotal - \nointerlineskip - \verticalstrut}}}% - \vbox} - -%D This works only in a properly strutted line, and is meant -%D for deeply burried operations, like in heads. - -\def\fakedvadjust - {\dowithnextbox - {\setbox\nextbox\hbox{\llap{\lower\strutdepth\box\nextbox}}% - \smashedbox\nextbox}% - \vtop} - -\def\flexiblespaceamount#1#2#3% - {#1\interwordspace - \!!plus#2\interwordstretch - \!!minus#3\interwordshrink} - -\def\fixedspaceamount#1% - {#1\interwordspace} - -%D This is a dangerous feature because it makes the \TEX\ source -%D less portable, i.e. any parser now needs to apply exactly the -%D same algorithm when it wants to interpret the source. We -%D strongly recommend not to mention this feature in manuals! It's -%D provided for users who are hooked to such a mechanism. -%D -%D \starttyping -%D \setupsorting[logo][next=\autoinsertnextspace] \logo[TEX]{\TeX} -%D -%D bla bla \TEX bla bla \TEX (bla) bla (\TEX) -%D \stoptyping - -\def\autoinsertnextspace{\futurelet\nexttoken\doautoinsertnextspace} - -\def\doautoinsertnextspace % slightly extended version of a user supplied macro - {\ifx\nexttoken \bgroup\else \ifx\nexttoken\begingroup\else - \ifx\nexttoken \egroup\else \ifx\nexttoken \endgroup\else - \ifx\nexttoken \/\else \ifx\nexttoken /\else \ifx\nexttoken ~\else - \ifx\nexttoken \ \else \ifx\nexttoken \blankspace\else \ifx\nexttoken \space\else - \ifx\nexttoken .\else \ifx\nexttoken ,\else - \ifx\nexttoken !\else \ifx\nexttoken ?\else - \ifx\nexttoken :\else \ifx\nexttoken ;\else - \ifx\nexttoken '\else \ifx\nexttoken "\else - \ifx\nexttoken )\else \ifx\nexttoken -\else \ifx\nexttoken |\else - \ifx\nexttoken \%\else \ifx\nexttoken \&\else - \space - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} - -% moved from page-lin - -\def\installspacehandler#1#2% needs to set \obeyedspace - {\setvalue{\??sr#1}{#2}} - -\installspacehandler \v!on - {\obeyspaces - \def\obeyedspace{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}% - \let\ =\obeyedspace} - -\installspacehandler \v!yes - {\obeyspaces - \def\obeyedspace{\mathortext\normalspace{\dontleavehmode \normalspace }}% - \let\ =\obeyedspace} - -\installspacehandler \v!off - {\normalspaces - \let\obeyedspace\normalspace - \let\ =\normalspace} - -\installspacehandler \v!fixed - {\obeyspaces - \def\obeyedspace{\mathortext\normalspace{\dontleavehmode\fixedspace}}% - \let\ =\obeyedspace} - -\def\activatespacehandler#1% - {\executeifdefined{\??sr#1}{\activatespacehandler\v!off}} - -% moved from page-lin - -%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 - -\def\setuplines - {\dodoubleargument\getparameters[\??rg]} - -\def\startlines - {\@@rgbefore - \pushmacro\checkindentation - \whitespace - %\page[\v!preference]} gaat mis na koppen, nieuw: later \nobreak - \begingroup - \setupindenting[\@@rgindenting]% - \typesettinglinestrue - \setupwhitespace[\v!none]% - \obeylines - \ignorespaces - \gdef\afterfirstobeyedline % tzt two pass, net als opsomming - {\gdef\afterfirstobeyedline - {\nobreak - \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}% - \def\obeyedline - {\par - \futurelet\next\dobetweenthelines}% - \activatespacehandler\@@rgspace - \GotoPar} - -\def\stoplines - {\endgroup - \popmacro\checkindentation - \@@rgafter} - -\def\dobetweenthelines - {\doifmeaningelse\next\obeyedline - {\@@rginbetween} - {\afterfirstobeyedline}} - -\setuplines - [\c!option=, - \c!before=\blank, - \c!after=\blank, - \c!inbetween=\blank, - \c!indenting=\v!no, - \c!space=\v!default] - -\def\emptylines - {\dosingleempty\doemptylines} - -\def\doemptylines[#1]% - {\endgraf\dorecurse{\iffirstargument#1\else3\fi}\crlf} - -\setupwhitespace - [\v!none] - -% still old-fashioned - -\indenting - [\v!never] - -\setupindenting - [\v!none] - -\setupblank - [\v!standard, - \v!big] - -\defineblank[\v!default] [\currentblank] -\defineblank[\v!before] [\v!default] -\defineblank[\v!inbetween][\v!default] -\defineblank[\v!after] [\v!before] - -\setupinterlinespace - [\c!minheight=0pt, % only special purpose - \c!mindepth=0pt, % only special purpose - \c!height=.72, - \c!depth=.28, - \c!top=1.0, - \c!bottom=0.4, - \c!distance=1pt, - \c!line=2.8ex, - \c!stretch=0] - -\setupnarrower - [\c!before=\endgraf, - \c!after=\endgraf, - \c!left=1.5em, - \c!right=1.5em, - \c!middle=1.5em] - -\setuptolerance - [\v!horizontal,\v!verystrict] - -\setuptolerance - [\v!vertical,\v!strict] - -\setupalign - [\v!bottom, - \v!width] - -\setupspacing - [\v!packed] - -\protect \endinput - -\dorecurse{2}{ - $2^{2^{2^{2}}}$ $2_{2_{2_{2}}}^{2^{2^{2^{2^{2^{2^{2^{2^{2}}}}}}}}}$ - \input tufte \inframed {tufte} - \par -} - -\dorecurse{100} { - - \kern \recurselevel pt - - \vbox { - \endgraf \strut first \endgraf - {\dosetattribute{skip-category}{1}\vskip10pt} - {\dosetattribute{skip-category}{1}\vskip40pt} - {\dosetattribute{skip-category}{1}\vskip20pt} - {\dosetattribute{skip-category}{2}\vskip10pt} - \endgraf \strut second \endgraf - } - - \endgraf \strut first \endgraf - {\dosetattribute{skip-category}{1}\vskip10pt} - {\dosetattribute{skip-category}{1}\vskip40pt} - {\dosetattribute{skip-category}{1}\vskip20pt} - {\dosetattribute{skip-category}{1}\vskip40pt} - \endgraf \strut second \endgraf - - {\dosetattribute{skip-category}{0}\vskip10pt} % remove - {\dosetattribute{skip-category}{1}\vskip10pt} % take largest - {\dosetattribute{skip-category}{1}\vskip40pt} - {\dosetattribute{skip-category}{1}\vskip40pt} - {\dosetattribute{skip-category}{1}\vskip40pt} - {\dosetattribute{skip-category}{1}\vskip40pt} - {\dosetattribute{skip-category}{1}\vskip40pt} - {\dosetattribute{skip-category}{1}\dosetattribute{skip-order}{10}\vskip20pt} - {\dosetattribute{skip-category}{4}\dosetattribute{skip-order}{10}\vskip20pt} - {\dosetattribute{skip-category}{1}\vskip60pt} - {\dosetattribute{skip-category}{1}\vskip20pt} - {\dosetattribute{skip-category}{0}\vskip10pt} - - third (no break after this) - - {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip10pt} - {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip20pt} - {\dosetattribute{skip-category}{1}\vskip10pt} - {\dosetattribute{skip-category}{1}\vskip20pt} - - fourth - \vskip10pt - fifth -} diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua index 8b7aa72ef..bd6413f41 100644 --- a/tex/context/base/font-syn.lua +++ b/tex/context/base/font-syn.lua @@ -48,6 +48,20 @@ filters.ttf = fontloader.info filters.ttc = fontloader.info filters.dfont = fontloader.info +function fontloader.fullinfo(...) + local ff = fontloader.open(...) + if ff then + local d = ff and fontloader.to_table(ff) + d.glyphs, d.subfonts, d.gpos, d.gsub, d.lookups = nil, nil, nil, nil, nil + fontloader.close(ff) + return d + else + return nil, "error in loading font" + end +end + +filters.otf = fontloader.fullinfo + function filters.afm(name) -- we could parse the afm file as well, and then report an error but -- it's not worth the trouble @@ -191,7 +205,7 @@ function names.identify(verbose) -- lsr is for kpse end end if result.fontname then - fontname = fontname or result.fontname + fontname = result.fontname or fontname local n = cleanname(result.fontname) if not mapping[n] then mapping[n], nofok = { lower(suffix), fontname, filename, is_sub }, nofok + 1 @@ -199,12 +213,34 @@ function names.identify(verbose) -- lsr is for kpse end if result.familyname and result.weight and result.italicangle == 0 then local madename = result.familyname .. " " .. result.weight - fontname = fontname or madename + fontname = madename or fontname local n = cleanname(fontname) if not mapping[n] and not fallback_mapping[n] then fallback_mapping[n], nofok = { lower(suffix), fontname, filename, is_sub }, nofok + 1 end end + if result.names then + for k, v in ipairs(result.names) do + local lang, names = v.lang, v.names + if lang == "English (US)" then + local family, subfamily, fullnamet = names.family, names.subfamily, names.fullname + local preffamilyname, prefmodifiers, weight = names.preffamilyname, names.prefmodifiers, names.weight + if preffamilyname then + if subfamily then + local n = cleanname(preffamilyname .. " " .. subfamily) + if not mapping[n] and not fallback_mapping[n] then + fallback_mapping[n], nofok = { lower(suffix), fontname, filename, is_sub }, nofok + 1 + end + end + -- okay? + local n = cleanname(preffamilyname) + if not mapping[n] and not fallback_mapping[n] then + fallback_mapping[n], nofok = { lower(suffix), fontname, filename, is_sub }, nofok + 1 + end + end + end + end + end end local trace = verbose or trace_names local skip_paths = filters.paths diff --git a/tex/context/base/math-for.mkiv b/tex/context/base/math-for.mkiv index b8f6beb5e..c8f73a8a3 100644 --- a/tex/context/base/math-for.mkiv +++ b/tex/context/base/math-for.mkiv @@ -53,6 +53,7 @@ \else \getparameters[\??fm][#1]% \fi + \edef\currentformula{#1}% \the\everysetupformulas} %D Not yet cleanup up: diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv index ff4d48c1d..eab739d04 100644 --- a/tex/context/base/meta-ini.mkiv +++ b/tex/context/base/meta-ini.mkiv @@ -435,7 +435,7 @@ \xdef\MPlly{#3}% ugly as well \xdef\MPurx{#4}% \xdef\MPury{#5}% - \getobject{MP}{#1}} + \forcecolorhack\getobject{MP}{#1}} % else no proper color intent \long\def\handleuniqueMPgraphic#1#2#3% {\begingroup diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex index 6a6cba5d5..123ff79bd 100644 --- a/tex/context/base/mult-sys.tex +++ b/tex/context/base/mult-sys.tex @@ -517,6 +517,7 @@ \definesystemvariable {mx} % MatriX \definesystemvariable {ng} % parbuilders \definesystemvariable {nh} % new heads (structure) +\definesystemvariable {nn} % structurenumbering \definesystemvariable {nm} % Nummering \definesystemvariable {np} % NaastPlaatsen \definesystemvariable {nr} % Nummeren diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index 04d9cc9a7..807532665 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -1866,9 +1866,9 @@ %D framecolorkaderkleur=DemoBlue, %D rulethickness=2pt] %D \def\status% -%D {backgroundoffset=\framedparameter\c!backgroundoffset\\ -%D frameoffset=\framedparameter\c!frameoffset\\ -%D depth=\framedparameter\c!depth} +%D {backgroundoffset=\the\dimexpr\framedparameter\c!backgroundoffset\relax\\ +%D frameoffset=\the\dimexpr\framedparameter\c!frameoffset\relax\\ +%D depth=\the\dimexpr\framedparameter\c!depth\relax} %D \dontleavehmode \ruledhbox{\framed[backgroundoffset=0pt,frameoffset=0pt]{\status}} %D \vss %D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=0pt]{\status}} diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv index 4df499d84..e13590bbc 100644 --- a/tex/context/base/page-txt.mkiv +++ b/tex/context/base/page-txt.mkiv @@ -197,7 +197,7 @@ \def\dosingletexts#1#2#3#4#5#6% {\bgroup - \defconvertedargument\ascii{#6}% no longer \defconvertedargument + \defconvertedargument\ascii{#6}% no longer \defconvertedargument, this also does not permit \v!pagenumber (i.e. v!) \ifx\ascii\empty\else \dostartattributes{\??tk#1#2}#3#4\empty \placetextlinestrut{\??tk#1}% here ! diff --git a/tex/context/base/s-mod-01.tex b/tex/context/base/s-mod-01.tex index dc695a44d..4454986ce 100644 --- a/tex/context/base/s-mod-01.tex +++ b/tex/context/base/s-mod-01.tex @@ -16,10 +16,19 @@ \usemodule[mod-00,abr-01] +\dontcomplain + \unprotect \setupbodyfont - [10pt,ams] + [10pt] + +\definetypeface + [narrowtt] [tt] + [mono] [modern-cond] [default] [encoding=\defaultencoding] + +\setuptyping[\v!typing][\c!style=\narrowtt] +\setuptype [\v!type] [\c!style=\narrowtt] \mainlanguage [en] @@ -44,7 +53,7 @@ \c!topspace=2cm, \c!header=1.25cm, \c!footer=1.25cm, - \c!height=25cm, + \c!height=middle, \c!style=\ss] \setupsetup @@ -60,9 +69,9 @@ \setuppagenumbering [\c!location=] -\setupfootertexts +\expanded{\setupfootertexts [\v!edge] - [][\v!pagenumber] + [][\v!pagenumber]} \startmode[single] diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv new file mode 100644 index 000000000..47d44e24b --- /dev/null +++ b/tex/context/base/spac-ali.mkiv @@ -0,0 +1,653 @@ +%D \module +%D [ file=spac-ali, +%D version=2009.10.16, % 1997.03.31, was core-spa.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Alignments, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Alignments} + +\unprotect + +% We will not use bodydir and pagedir so we disable them. That way we get +% normal hyperlink support. + +\let\@@bodydir\normalbodydir +\let\@@pagedir\normalpagedir + +\unexpanded\def\bodydir{\afterassignment\do@@bodydir\@@bodydir} \let\normalbodydir\bodydir +\unexpanded\def\pagedir{\afterassignment\do@@pagedir\@@pagedir} \let\normalpagedir\pagedir + +\def\do@@bodydir{\@@bodydir TLT\relax} +\def\do@@pagedir{\@@pagedir TLT\relax} + +% This will become a more advanced layout controller soon: + +\unexpanded\def\lefttoright{\textdir TLT\pardir TLT\relax} +\unexpanded\def\righttoleft{\textdir TRT\pardir TRT\relax} + +\def\dodefinehbox[#1][#2]% + {\setvalue{hbox#1}##1% + {\hbox to #2{\begstrut##1\endstrut\hss}}} + +\def\definehbox + {\dodoubleargument\dodefinehbox} + +\def\iobox#1#2#3#% here #3# is not really needed + {\vbox\bgroup % we want to return a vbox like the others + \hbox\bgroup% we need to pack the signal with the box + \signalrightpage + \dowithnextboxcontent + {\let\\=\endgraf\forgetall\doifrightpageelse#1#2} + {\box\nextbox\egroup\egroup} + \vbox#3} + +\def\obox{\iobox\raggedleft \raggedright} % outerbox +\def\ibox{\iobox\raggedright\raggedleft} % innerbox + +\def\dosetraggedvbox#1% + {\let\raggedbox\vbox + \processfirstactioninset + [#1] + [ \v!left=>\let\raggedbox\lbox, + \v!right=>\let\raggedbox\rbox, + \v!middle=>\let\raggedbox\cbox, + \v!inner=>\let\raggedbox\ibox, + \v!outer=>\let\raggedbox\obox, + \v!flushleft=>\let\raggedbox\rbox, + \v!flushright=>\let\raggedbox\lbox, + \v!center=>\let\raggedbox\cbox, + \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]} + +\def\dosetraggedhbox#1% + {\let\raggedbox\hbox + \processaction % slow + [#1] + [ \v!left=>\def\raggedbox{\doalignedline\v!left }, + \v!right=>\def\raggedbox{\doalignedline\v!right }, + \v!middle=>\def\raggedbox{\doalignedline\v!middle}, + \v!inner=>\def\raggedbox{\doalignedline\v!inner }, + \v!outer=>\def\raggedbox{\doalignedline\v!outer }, + \v!flushleft=>\def\raggedbox{\doalignedline\v!right }, + \v!flushright=>\def\raggedbox{\doalignedline\v!left }, + \v!center=>\def\raggedbox{\doalignedline\v!middle}]} + +\def\dosetraggedcommand#1% + {\normalexpanded{\noexpand\dodosetraggedcommand{#1}}} + +\newtoks\everyraggedcommand + +\def\raggedcommand{\the\everyraggedcommand} + +\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! + {\everyraggedcommand \emptytoks + \let\raggedtopcommand \empty + \let\raggedbottomcommand\empty + \chardef\raggedoneliner\zerocount + \doifsomething{#1} + {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse + \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse + \!!donectrue + \rawprocesscommalist[#1]\dododosetraggedcommand}} + +\def\dododosetraggedcommand#1% + {\executeifdefined{\@@ragged@@command\string#1}\relax} + +\def\@@ragged@@command{@@raggedcommand} + +\setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nohz }{\appendtoks\disableadjusting \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!spacing }{\appendtoks\enablespacehandling + \enablekernhandling \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nospacing }{\appendtoks\disablespacehandling + \disablekernhandling \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!hyphenated }{\appendtoks\dohyphens \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nothyphenated}{\appendtoks\nohyphens \to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!tolerant }{\appendtoks\tolerance3000\relax \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!verytolerant}{\appendtoks\tolerance4500\relax \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!stretch }{\appendtoks\emergencystretch\bodyfontsize\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!left}% + {\if!!donea \appendtoks\veryraggedleft\to\everyraggedcommand + \else \appendtoks\raggedleft \to\everyraggedcommand + \fi + \!!donecfalse} + +\setvalue{\@@ragged@@command\v!right}% + {\if!!donea \appendtoks\veryraggedright\to\everyraggedcommand + \else \appendtoks\raggedright \to\everyraggedcommand + \fi + \!!donecfalse} + +\setvalue{\@@ragged@@command\v!middle}% + {\if!!donec + \if!!doneb \appendtoks\raggedwidecenter\to\everyraggedcommand + \else\if!!donea \appendtoks\veryraggedcenter\to\everyraggedcommand + \else \appendtoks\raggedcenter \to\everyraggedcommand + \fi\fi + \!!donecfalse + \else + \let\raggedbottomcommand\vfilll % bonus, pretty strong + \let\raggedtopcommand \vfilll % used with \framed for + \fi} % instance in tables + +\setvalue{\@@ragged@@command\v!flushleft }{\getvalue{\@@ragged@@command\v!right }} +\setvalue{\@@ragged@@command\v!flushright}{\getvalue{\@@ragged@@command\v!left }} +\setvalue{\@@ragged@@command\v!center }{\getvalue{\@@ragged@@command\v!middle}} + +\setvalue{\@@ragged@@command\v!high}% + {\let\raggedbottomcommand\vfilll} % and since we lack a + +\setvalue{\@@ragged@@command\v!low}% + {\let\raggedtopcommand\vfilll} % proper keyword, but + +\setvalue{\@@ragged@@command\v!lohi}% + {\let\raggedbottomcommand\vfilll % we do support the + \let\raggedtopcommand\vfilll} % ugly laho (lohi) + +\setvalue{\@@ragged@@command\v!no}% + {\appendtoks\raggedright\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!yes}% + {\appendtoks\notragged\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!normal}% + {\appendtoks\notragged\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!inner}% not yet perfect + {\signalrightpage % may interfere + \doifrightpageelse + {\getvalue{\@@ragged@@command\v!right}} + {\getvalue{\@@ragged@@command\v!left}}} + +\setvalue{\@@ragged@@command\v!outer}% not yet perfect + {\signalrightpage % may interfere + \doifrightpageelse + {\getvalue{\@@ragged@@command\v!left}} + {\getvalue{\@@ragged@@command\v!right}}} + +\setvalue{\@@ragged@@command\v!lesshyphenation}% + {\appendtoks\lesshyphens\to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!morehyphenation}% + {\appendtoks\morehyphens\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!lefttoright}{\appendtoks\lefttoright\to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!righttoleft}{\appendtoks\righttoleft\to\everyraggedcommand} +\setvalue{\@@ragged@@command l2r}{\appendtoks\lefttoright\to\everyraggedcommand} +\setvalue{\@@ragged@@command r2l}{\appendtoks\righttoleft\to\everyraggedcommand} + +% compare: +% +% \framed[width=4cm,align=no] {\hfil xxx} +% \framed[width=4cm,align=disable]{\hfil xxx} + +\setvalue{\@@ragged@@command\v!disable}% for one liners + {\appendtoks\raggedright\parfillskip\zeropoint\to\everyraggedcommand} + +\chardef\raggedoneliner\zerocount + +\setvalue{\@@ragged@@command\v!line}% + {\chardef\raggedoneliner\plusone} + +% More alignments: + +% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness +% \tolerance >= 1500 % was 200 +% \raggedness = 2 .. 6\bodyfontsize + +\chardef\raggedstatus=0 % normal left center right + +\def\leftraggedness {2\bodyfontsize} +\def\rightraggedness {2\bodyfontsize} +\def\middleraggedness {6\bodyfontsize} + +\def\middleraggedness {.5\hsize} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} + +% oeps, hsize can be 0pt in which case we get a strange division + +\def\middleraggedness {\ifdim\hsize=\zeropoint6\bodyfontsize\else.5\hsize\fi} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} + +%D More hyphenation control, will be combined with align +%D setup. + +\def\nohyphens + {\ifx\dohyphens\relax + \edef\dohyphens + {\hyphenpenalty\the\hyphenpenalty + \exhyphenpenalty\the\exhyphenpenalty\relax}% + \fi + \hyphenpenalty\plustenthousand + \exhyphenpenalty\plustenthousand} + +\let\dohyphens\relax + +%D To prevent unwanted side effects, we also have to check +%D for hyphens here: + +\newskip\@@raggedskipa +\newskip\@@raggedskipb + +\def\setraggedness#1% + {\ifnum\tolerance<1500\relax % small values have + \tolerance1500\relax % unwanted side effects + \fi + \ifx\dohyphens\relax + % this code will be reconsidered / kind of fuzzy (and old) + \@@raggedskipa 2.5\hsize + \@@raggedskipb #1\relax + \divide\@@raggedskipa \@@raggedskipb + \hyphenpenalty\@@raggedskipa + \fi} + +\let\updateraggedskips\relax + +\def\setraggedskips#1#2#3#4#5#6#7% never change this name + {\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}% + \updateraggedskips} + +\def\dosetraggedskips#1#2#3#4#5#6#7% + {\chardef \raggedstatus#1\relax + \leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3 + \rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3 + \spaceskip #4\relax + \xspaceskip #5\relax + \parfillskip\zeropoint\!!plus#6\relax + \parindent #7\relax} + +% \def\notragged% +% {\setraggedskips{0}{0em}{0em}{0em}{0em}{1fil}{\parindent}} + +% older (context) names: + +\let\spaceamount \interwordspace +\let\emspaceamount\emwidth + +% tracing: + +\def\doshowpardata#1% + {\ifx#1\relax\else + \hbox{\string#1: \the#1}\endgraf + \expandafter\doshowpardata + \fi} + +\def\showpardata + {\edef\thepardata + {\hbox{font: \fontname\font}\endgraf + \doshowpardata + \interwordspace \interwordstretch \interwordshrink \emwidth \exheight \extraspace + \hsize \vsize + \leftskip \rightskip + \spaceskip \xspaceskip + \parindent \parfillskip + \hyphenpenalty \exhyphenpenalty + \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty + \doublehyphendemerits \finalhyphendemerits \adjdemerits + \relax}% + \begingroup + \dontshowcomposition + \inleftmargin{\vsmash + {\switchtobodyfont[7pt,tt]% + \framed[\c!align=\v!right]{\thepardata}}}% + \endgroup} + +\def\startshowpardata + {\begingroup + \showcomposition + \showstruts\tracepositionstrue \tracingparagraphs\maxdimen + \appendtoksonce\showpardata\let\showpardata\relax\to\everypar} + +\def\stopshowpardata + {\endgraf + \endgroup} + +% \defineXMLenvironment[showpardata] \startshowpardata \stopshowpardata +% \defineXMLsingular [showpardata] \showpardata + +% defaults + +\def\raggedfillamount {1fil} +\def\raggedhalffillamount{.5fil} +\def\raggedspaceamount {\interwordspace} % {.3333em} +\def\raggedxspaceamount {.5em} + +\def\notragged + {\chardef\raggedstatus\zerocount + \leftskip 1\leftskip + \rightskip 1\rightskip + \spaceskip \zeropoint + \xspaceskip \zeropoint + \parfillskip\zeropoint\!!plus\raggedfillamount\relax + \let\updateraggedskips\relax} % new + +\let\forgetragged\notragged + +\def\raggedleft + {\setraggedness\leftraggedness + \setraggedskips1\leftraggedness\zeropoint\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +\def\raggedcenter + {\setraggedness\middleraggedness + \setraggedskips2\middleraggedness\middleraggedness\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +%D We used to have: +%D +%D \starttyping +%D \def\raggedright +%D {\setraggedness\rightraggedness +%D \setraggedskips{3}{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}} +%D \stoptyping +%D +%D However, the next alternative, suggested by Taco, is better. + +\def\raggedright + {\setraggedness\rightraggedness + \setraggedskips3\zeropoint\rightraggedness\raggedspaceamount + \raggedxspaceamount\raggedfillamount\parindent} + +\def\veryraggedleft + {\setraggedskips1\raggedfillamount\zeropoint\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +%D When we want the last line to have a natural width: +%D +%D \starttyping +%D \def\veryraggedleft% +%D {\setraggedskips{1}{1fil}{0em}{.3333em}{.5em}{0em}{-1fil}} +%D \stoptyping +%D +%D but this one is not accepted by the macros. + +\def\veryraggedcenter + {\setraggedskips2\raggedfillamount\raggedfillamount\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +\def\veryraggedright + {\setraggedskips3\zeropoint\raggedfillamount\raggedspaceamount + \raggedxspaceamount\zeropoint\parindent} + +\def\ttraggedright + {\tttf + \setraggedskips3\zeropoint\rightraggedness + \zeropoint\zeropoint\zeropoint\parindent} % \ctxparindent + +%D A bonus one: + +\def\raggedwidecenter + {\setraggedness\middleraggedness + \setraggedskips2\raggedhalffillamount\raggedhalffillamount + \raggedspaceamount\raggedxspaceamount\zeropoint\zeropoint} + +\newif\if@@asragged \@@asraggedtrue % old method + +% todo +% +% \setuplayout[grid=yes,lines=44] \showgrid +% \starttext +% test \vfill test \endgraf \strut \endgraf \vskip-\lineheight \removedepth \pagina test +% \stoptext + +% \setupalign[reset,new,right,old] + +\def\@@align@@rl{\if!!donea\veryraggedleft \else\raggedleft \fi} +\def\@@align@@rr{\if!!donea\veryraggedright \else\raggedright \fi} +\def\@@align@@rc{\if!!donea\veryraggedcenter\else\raggedcenter\fi} + +\setvalue{@@ngila@@\v!broad }{\!!doneatrue} +\setvalue{@@ngila@@\v!wide }{\!!donebtrue} + +\def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads + +\installalign \v!new {\@@asraggedfalse} +\installalign \v!old {\@@asraggedtrue} +\installalign \empty {} + +\installalign \v!line {\baselinebottom} +\installalign \v!bottom {\raggedbottom} +\installalign \v!height {\normalbottom} +\installalign \v!width {\notragged} +\installalign \v!normal {\notragged} +\installalign \v!yes {\notragged} +\installalign \v!no {\raggedright} +\installalign \v!inner {\if@@asragged \setraggedparagraphmode\@@align@@rl\@@align@@rr \else + \setraggedparagraphmode\@@align@@rr\@@align@@rl \fi} +\installalign \v!outer {\if@@asragged \setraggedparagraphmode\@@align@@rr\@@align@@rl \else + \setraggedparagraphmode\@@align@@rl\@@align@@rr \fi} +\installalign \v!left {\if@@asragged\@@align@@rl\else\@@align@@rr\fi} +\installalign \v!right {\if@@asragged\@@align@@rr\else\@@align@@rl\fi} +\installalign \v!middle {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} +\installalign \v!flushleft {\if!!donea\veryraggedright \else\raggedright\fi} +\installalign \v!flushright {\if!!donea\veryraggedleft \else\raggedleft \fi} +\installalign \v!flushouter {\setraggedparagraphmode\raggedleft\raggedright} +\installalign \v!flushinner {\setraggedparagraphmode\raggedright\raggedleft} +\installalign \v!center {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} +\installalign \v!hanging {\enableprotruding} +\installalign \v!nothanging {\disableprotruding} +\installalign \v!hz {\enableadjusting} +\installalign \v!nohz {\disableadjusting} +\installalign \v!spacing {\enablespacehandling \enablekernhandling} +\installalign \v!nospacing {\disablespacehandling\disablekernhandling} +\installalign \v!hyphenated {\dohyphens} +\installalign \v!nothyphenated {\nohyphens} +\installalign \v!new {\@@asraggedfalse} % so new will give you consistency +\installalign \v!reset {\notragged\normalbottom} + +\installalign \v!tolerant {\tolerance3000 \relax} +\installalign \v!verytolerant {\tolerance4500 \relax} +\installalign \v!stretch {\emergencystretch\bodyfontsize} + +\installalign \v!grid {\doenablegridsnapping } % only mkiv +\installalign \v!nogrid {\dodisablegridsnapping} % only mkiv + +\installalign \v!righttoleft {\lefttoright} +\installalign \v!lefttoright {\righttoleft} +\installalign {l2r} {\lefttoright} +\installalign {r2l} {\righttoleft} + +\newcount\hyphenminoffset + +\ifx\sethyphenationvariables\undefined \let\sethyphenationvariables\relax \fi + +\def\lesshyphens + {\advance\hyphenminoffset\plusone + \sethyphenationvariables} + +\def\morehyphens + {\ifcase\hyphenminoffset \else + \advance\hyphenminoffset\minusone + \fi + \sethyphenationvariables} + +\installalign \v!lesshyphenation {\lesshyphens} +\installalign \v!morehyphenation {\morehyphens} + +\def\dodosetupalign#1{\csname @@align@@#1\endcsname} +\def\dodosetupngila#1{\csname @@ngila@@#1\endcsname} + +\def\setupalign + {\dosingleargument\dosetupalign} + +\def\dosetupalign[#1]% can be made faster by checking for defined #1 + {\!!doneafalse + \!!donebfalse + \processcommacommand[#1]\dodosetupngila + \processcommacommand[#1]\dodosetupalign} + +% \setupalign[flushleft] \input ward \par % lijnlinks +% \setupalign[right] \input ward \par + +% \setupalign[flushright] \input ward \par % lijnrechts +% \setupalign[left] \input ward \par + +% \setupalign[middle] \input ward \par % centreer +% \setupalign[center] \input ward \par + +\def\startalignment + {\bgroup + \setupalign} + +\def\stopalignment + {\par + \egroup} + +\chardef\alignstrutmode=1 + +% see later for the real definition, which in the simple case is: + +\newtoks \everyleftofalignedline +\newtoks \everyrightofalignedline + +\def\shiftalignedline#1#2#3#4% left, right, inner, outer + {\rightorleftpageaction + {\everyleftofalignedline {\hskip\dimexpr#1+#3\relax}% + \everyrightofalignedline{\hskip\dimexpr#2+#4\relax}} + {\everyleftofalignedline {\hskip\dimexpr#1+#4\relax}% + \everyrightofalignedline{\hskip\dimexpr#2+#3\relax}}} + +\def\doalignline#1#2% \\ == newline + {\noindentation % was \noindent + \dontleavehmode % added in marrakesch at TUG 2006\begingroup + \begingroup + \setlocalhsize % new + \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}% + \dowithnextbox + {\hbox to \localhsize + {\ifcase\alignstrutmode\or\strut\fi + \the\everyleftofalignedline + #1\unhbox\nextbox#2\relax + \the\everyrightofalignedline}% + \endgroup} + \hbox} + +% plain commands + +\ifx\undefined\line \def\line {\hbox to\hsize} \fi +\ifx\undefined\leftline \def\leftline #1{\line{#1\hss}} \fi +\ifx\undefined\rightline \def\rightline #1{\line{\hss#1}} \fi +\ifx\undefined\centerline \def\centerline#1{\line{\hss#1\hss}} \fi + +% directe commando's + +\def\leftaligned {\doalignline \relax \hss } +\def\midaligned {\doalignline \hss \hss } +\def\rightaligned{\doalignline \hss \relax} + +\let\centeraligned\midaligned + +\def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated + +% indirecte commando's + +\letvalue{\s!do\v!line\v!left }\leftaligned +\letvalue{\s!do\v!line\v!right }\rightaligned +\letvalue{\s!do\v!line\v!middle }\midaligned +\letvalue{\s!do\v!line\v!flushleft }\rightaligned +\letvalue{\s!do\v!line\v!flushright}\leftaligned +\letvalue{\s!do\v!line\v!center }\midaligned + +\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} + +%D Experimental: + +\def\doxalignline#1#2#3#4#5#6% + {\noindentation % was \noindent + \dontleavehmode % added in marrakesch at TUG 2006\begingroup + \begingroup + \setlocalhsize + \def\\{\egroup\par\doxalignline#1#2#3#4#5#6\bgroup}% inefficient + \dowithnextbox + {%\noindent moved up + \hbox to \localhsize + {#1\hskip\ifdone#2\else#3\fi#4% + \hbox to \localhsize + {\the\everyleftofalignedline + \ifcase\alignstrutmode\or\strut\fi + \ifdone#5\unhbox\nextbox#6\else#6\unhbox\nextbox#5\fi + \the\everyrightofalignedline}% + \hss}% + \endgroup} + \hbox} + +\def\doxcheckline + {\signalrightpage\doifrightpageelse\donetrue\donefalse} + +\setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss } +\setvalue{\s!do\v!line\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax} +\setvalue{\s!do\v!line\v!innermargin}{\doxalignline\doxcheckline-+\innermargintotal\relax\hss } +\setvalue{\s!do\v!line\v!outermargin}{\doxalignline\doxcheckline+-\outermargintotal\hss \relax} +\setvalue{\s!do\v!line\v!inneredge }{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss } +\setvalue{\s!do\v!line\v!outeredge }{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax} +\setvalue{\s!do\v!line\v!backspace }{\doxalignline\doxcheckline-+\backspace \relax\hss } +\setvalue{\s!do\v!line\v!cutspace }{\doxalignline\doxcheckline+-\cutspace \hss \relax} + +\setvalue{\s!do\v!line\v!leftmargin }{\doxalignline\donefalse --\leftmargintotal \hss \relax} +\setvalue{\s!do\v!line\v!rightmargin}{\doxalignline\donefalse ++\rightmargintotal\relax\hss } +\setvalue{\s!do\v!line\v!leftedge }{\doxalignline\donefalse --\leftedgetotal \hss \relax} +\setvalue{\s!do\v!line\v!rightedge }{\doxalignline\donefalse ++\rightedgetotal \relax\hss } + +% ! ! ! beware, redefining \doalignline gives the wrong results ! ! ! +% +% \def\doalignline{\doxalignline\donefalse++\zeropoint} + +%D Better: + +\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} + +\def\alignedline#1#2% setting default + {\csname\s!do\v!line\ifcsname\s!do\v!line#1\endcsname#1\else#2\fi\endcsname} + +% \def\woordrechts +% {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}} + +% beware: \wordright{whatever\kern-\rightskip} should work! +% so, no funny boxing here + +\def\dowordright[#1]% + {% don't change + \groupedcommand + {\removeunwantedspaces + \hfill + \allowbreak % changed back from \hskip\zeropoint + \strut + \hfill + \quad % decent spacing + \hbox} + {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}% + \parfillskip\zeropoint + %\finalhyphendemerits\zerocount % yes or no + \par}} + +\def\wordright + {\dosingleempty\dowordright} + +% \dorecurse{5}{something } \wordright{--someone} \endgraf +% \dorecurse{6}{something } \wordright{--someone} \endgraf +% \dorecurse{7}{something } \wordright{--someone} \endgraf +% +% \dorecurse{5}{something } \wordright{--someone else entirely} \endgraf +% \dorecurse{6}{something } \wordright{--someone else entirely} \endgraf +% \dorecurse{7}{something } \wordright{--someone else entirely} \endgraf +% +% \wordright[\rightskip]{whatever} + +% \simplealignedbox{2cm}{right}{x} + +\setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}} +\setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}} +\setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}} +\setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}} +\setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}} + +\def\simplealignedbox#1{\executeifdefined{\s!simple\c!align#1}{\getvalue{\s!simple\c!align\v!right}}} + +\protect \endinput diff --git a/tex/context/base/spac-def.mkiv b/tex/context/base/spac-def.mkiv new file mode 100644 index 000000000..db4f4c2a4 --- /dev/null +++ b/tex/context/base/spac-def.mkiv @@ -0,0 +1,119 @@ +%D \module +%D [ file=spac-def, +%D version=2009.10.16, % 1997.03.31, was core-spa.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Definitions, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Definitions} + +\unprotect + +\def\forgeteverypar + {\everypar{\the\neverypar}} + +\def\forgetparindent + {\forgeteverypar + \indentfirstparagraphtrue % recently added + \let\currentindentation\v!none + \ctxparindent\zeropoint + \parindent\zeropoint\relax} + +\def\forgetparskip + {\let\currentwhitespace\v!none + \ctxparskip\zeropoint + \parskip\zeropoint\relax} + +\def\forgetbothskips + {\tolerance1500 + \leftskip\zeropoint + \rightskip\zeropoint\relax} + +\def\forgetspacing + {\emergencystretch\zeropoint} + +\newif\ifforgotten % rather good signal for inner + +\appendtoks \forgottentrue \to \everyforgetall +\appendtoks \forgetragged \to \everyforgetall +\appendtoks \forgetparskip \to \everyforgetall +\appendtoks \forgetparindent \to \everyforgetall +\appendtoks \forgetbothskips \to \everyforgetall +\appendtoks \forgetspacing \to \everyforgetall % i.v.m. funny spacing in pagebody +\appendtoks \spacing\plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed +\appendtoks \everypar\emptytoks \to \everyforgetall % indeed! + + +\appendtoks \spacing\plusone \to \everybodyfont +\appendtoks \presetnormallineheight \to \everybodyfont +\appendtoks \setnormalbaselines \to \everybodyfont % check if redundant +\appendtoks \setstrut \to \everybodyfont % check if redundant +\appendtoks \settopskip \to \everybodyfont +\appendtoks \setmaxdepth \to \everybodyfont +\appendtoks \simplesetupindenting \to \everybodyfont +\appendtoks \simplesetupblank \to \everybodyfont +\appendtoks \simplesetupwhitespace \to \everybodyfont +%appendtoks \checknotes \to \everybodyfont % not +\appendtoks \simplesetupspacing \to \everybodyfont % nieuw +\appendtoks \setrelativeinterlinespace \to \everybodyfont + +\appendtoks \updateraggedskips \to \everyfontswitch % under test +\prependtoks \let\par\endgraf \to \everypagebody % see \fillinline +\appendtoks \simplesetupspacing \to \everydefinedfont + +\setupwhitespace + [\v!none] + +\indenting + [\v!never] + +\setupindenting + [\v!none] + +\setupvspacing + [\v!standard, + \v!big] + +\definevspacing[\v!default] [\currentblank] +\definevspacing[\v!before] [\v!default] +\definevspacing[\v!inbetween][\v!default] +\definevspacing[\v!after] [\v!before] + +\setupinterlinespace + [\c!minheight=0pt, % only special purpose + \c!mindepth=0pt, % only special purpose + \c!height=.72, + \c!depth=.28, + \c!top=1.0, + \c!bottom=0.4, + \c!distance=1pt, + \c!line=2.8ex, + \c!stretch=0] + +\setupnarrower + [\c!before=\endgraf, + \c!after=\endgraf, + \c!left=1.5em, + \c!right=1.5em, + \c!middle=1.5em] + +\setuptolerance + [\v!horizontal,\v!verystrict] + +\setuptolerance + [\v!vertical,\v!strict] + +\setupalign + [\v!bottom, + \v!width] + +\setupspacing + [\v!packed] + +\protect \endinput diff --git a/tex/context/base/spac-fnt.mkiv b/tex/context/base/spac-fnt.mkiv new file mode 100644 index 000000000..fae32c94b --- /dev/null +++ b/tex/context/base/spac-fnt.mkiv @@ -0,0 +1,91 @@ +%D \module +%D [ file=spac-fnt, +%D version=2009.10.16, % 1997.03.31, was core-spa.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Fonts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Fonts} + +%D For historic reasons here, will move: + +\unprotect + +\let\dostopattributes\relax % in case these commands end up in an edef + +\unexpanded\def\@@dostopattributes + {\stopcolor + \finishparbasedattributes + \endgroup} + +\unexpanded\def\@@nostopattributes + {\finishparbasedattributes + \endgroup} + +\unexpanded\def\doattributes#1#2#3#4% + {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes} + +% An even faster \ETEX\ version: + +\unexpanded\def\dostartattributes#1#2#3% + {\begingroup % geen \bgroup, anders in mathmode lege \hbox + \ifincolor + \ifcsname#1#3\endcsname + \let\dostopattributes\@@dostopattributes + \faststartcolor[\csname#1#3\endcsname]% + \else + \let\dostopattributes\@@nostopattributes + \fi + \else + \let\dostopattributes\@@nostopattributes + \fi + \ifcsname#1#2\endcsname + % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname + \@EA\doconvertfont\csname#1#2\@EA\endcsname + \fi} + +\unexpanded\def\@@dostopattributes + {\faststopcolor + \finishparbasedattributes + \endgroup} + +\unexpanded\def\@@nostopattributes + {\finishparbasedattributes + \endgroup} + +%D Bonus macro, see core-sec.tex + +\unexpanded\def\dosetfontattribute#1#2% + {\ifcsname#1#2\endcsname + \@EA\doconvertfont\csname#1#2\@EA\endcsname + \fi\empty} + +%D Since this happens a lot, and sometimes large arguments +%D are passed in \type {#4}, we just copy some code: + +\unexpanded\def\doattributes#1#2#3#4% + {\begingroup % geen \bgroup, anders in mathmode lege \hbox + \ifincolor + \ifcsname#1#3\endcsname + \let\dostopattributes\@@dostopattributes + \faststartcolor[\csname#1#3\endcsname]% + \else + \let\dostopattributes\endgroup + \fi + \else + \let\dostopattributes\endgroup + \fi + \ifcsname#1#2\endcsname + % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname + \@EA\doconvertfont\csname#1#2\@EA\endcsname + \fi + {#4}% + \dostopattributes} + +\protect \endinput diff --git a/tex/context/base/spac-gen.mkii b/tex/context/base/spac-gen.mkii new file mode 100644 index 000000000..4f365b498 --- /dev/null +++ b/tex/context/base/spac-gen.mkii @@ -0,0 +1,4656 @@ +%D \module +%D [ file=core-spa, +%D version=1997.03.31, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Spacing, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Core Macros / Spacing} + +% to be sorted out: dependencies, order of initialization / also some dutch code here + +\unprotect + +% some will move to core-var + +\newif \ifgridsnapping +\newif \iffuzzyvskip +\let \fuzzyvskip \gobbleoneargument +\let \removelastfuzzyvskip \relax + +\let \startbaselinecorrection \relax +\let \stopbaselinecorrection \relax +\let \baselinecorrection \relax +\let \offbaselinecorrection \relax + +\appendtoks \spacing 1\to \everybodyfont +\appendtoks \presetnormallineheight \to \everybodyfont +\appendtoks \setnormalbaselines \to \everybodyfont % check if redundant +\appendtoks \setstrut \to \everybodyfont % check if redundant +\appendtoks \settopskip \to \everybodyfont +\appendtoks \setmaxdepth \to \everybodyfont +%appendtoks \spacing 1\to \everybodyfont +\appendtoks \simplesetupindenting \to \everybodyfont +\appendtoks \simplesetupblank \to \everybodyfont +\appendtoks \simplesetupwhitespace \to \everybodyfont +%appendtoks \checknotes \to \everybodyfont % not +\appendtoks \simplesetupspacing \to \everybodyfont % nieuw +\appendtoks \setrelativeinterlinespace \to \everybodyfont + +\appendtoks \updateraggedskips \to \everyfontswitch % under test +\prependtoks \let\par\endgraf \to \everypagebody % see \fillinline +\appendtoks \simplesetupspacing \to \everydefinedfont + +% if you want to hyphenate the first word of a paragraph ... \appendtoks\hskip0pt\to\everypar + +\def\stelfactorenin + {\simplesetupwhitespace + \simplesetupblank + \settopskip + \setmaxdepth} + +\def\softbreak + {\relax\ifhmode\hskip\parfillskip\break\fi} + +\let\poplastnode\relax + +\def\pushlastnode + {\ifdim\lastskip=\zeropoint + \ifnum\lastpenalty=\zerocount + \ifnum\lastkern=\zerocount + \let\poplastnode\relax + \else + \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested + \fi + \else + \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested + \fi + \else + \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip + \fi} + +%D The dreadful sequence \type {\bgroup} \unknown\ +%D \type {\carryoverpar} \unknown\ \type {\egroup} is needed +%D when for instance sidefloats are used in combination with +%D something that starts with a group. This is because +%D otherwise the indentation as set (by the output routine) +%D inside the group are forgotten afterwards. (I must +%D not forget its existence). + +\global\let\carriedoverpar\relax + +\def\carryoverpar#1% + {\expanded % \scratchtoks{#1}% + {\noexpand#1% \the\scratchtoks + \hangindent\the\hangindent + \hangafter \the\hangafter + \parskip \the\parskip + \leftskip \the\leftskip + \rightskip \the\rightskip}} + +%D A quick way to determine left|/|middle|/|right states +%D (experimental). + +\setvalue{\??as\v!left }{0} +\setvalue{\??as\v!middle}{1} +\setvalue{\??as\v!right }{2} + +\def\setalignmentswitch#1% + {\chardef\alignmentswitch0\csname\??as#1\endcsname\relax} + +%D There are two ways to influence the interline spacing. The +%D most general and often most consistent way is using +%D +%D \showsetup{setupinterlinespace} +%D +%D For instance +%D +%D \starttyping +%D \setupinterlinespace[line=2.8ex] +%D \stoptyping +%D +%D This setting adapts itself to the bodyfontsize, while for +%D instance saying +%D +%D \starttyping +%D \setupinterlinespace[line=12pt] +%D \stoptyping +%D +%D sets things fixed for all sizes, which is definitely not +%D what we want. Therefore one can also say: +%D +%D \starttyping +%D \definebodyfontenvironment[9pt][interlinespace=11pt] +%D \stoptyping +%D +%D One can still use \type{\setupinterlinespace} (without +%D arguments) to set the interline space according to the +%D current font, e.g. a \type{\bfa}. + +\newif\iflocalinterlinespace + +% font-ini + +\ifx\bodyfontinterlinespecs\undefined + + \let\bodyfontinterlinespecs\empty + \let\bodyfontinterlinespace\empty + +\fi + +\def\presetnormallineheight + {\edef\normallineheight{\@@itline}% +% done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed + \iflocalinterlinespace \else + \doifdefined\bodyfontinterlinespecs + {\doifsomething\bodyfontinterlinespace + {\edef\normallineheight{\bodyfontinterlinespace}}}% + \fi} + +\def\setupspecifiedinterlinespace[#1]% + {\getparameters[\??it][#1]% + \scratchdimen0\@@itheight\points + \advance\scratchdimen 0\@@itdepth\points + \ifdim\scratchdimen>\onepoint + \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}% + \let\@@itheight\strutheightfactor + \let\@@itdepth \strutdepthfactor + \else + \let\strutheightfactor\@@itheight + \let\strutdepthfactor \@@itdepth + \fi + \let\minimumstrutheight \@@itminheight + \let\minimumstrutdepth \@@itmindepth + \let\minimumlinedistance\@@itdistance + \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex + \doifelse\@@ittop\v!height % new, topskip does more bad than good + {\let\topskipfactor \@@itheight} + {\let\topskipfactor \@@ittop }% + \let\maxdepthfactor \@@itbottom + \let\baselinegluefactor \@@itstretch + \setfontparameters % redundant, can be \setstrut, test first + \updateraggedskips} % yes indeed + +% \let\currentrelativeinterlinespace\empty +% +% \def\setuprelativeinterlinespace[#1]% +% {\processallactionsinset +% [#1] +% [ \v!on=>\oninterlineskip, +% \v!off=>\offinterlineskip, +% \v!reset=>\let\currentrelativeinterlinespace\empty +% \setfontparameters,% just \setstrut, test first +% \s!unknown=>\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}% +% \spacing\currentrelativeinterlinespace]} + +% \setupinterlinespace[big] \switchtobodyfont[11pt] -> forgotten +% \setupinterlinespace[auto,big] \switchtobodyfont[11pt] -> remembered + +\let\currentrelativeinterlinespace\empty + +\def\setuprelativeinterlinespace[#1]% + {\processallactionsinset + [#1] + [ \v!on=>\oninterlineskip, + \v!off=>\offinterlineskip, + \v!reset=>\let\currentrelativeinterlinespace\empty + \let\setrelativeinterlinespace\relax + \setfontparameters, + \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace, + \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}% + \spacing\currentrelativeinterlinespace]} + +\def\dosetrelativeinterlinespace + {\ifx\currentrelativeinterlinespace\empty\else + \spacing\currentrelativeinterlinespace + \fi} + +\let\setrelativeinterlinespace\relax + +% \appendtoks \setrelativeinterlinespace \to \everybodyfont + +\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1 + {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]} + +\def\setuplocalinterlinespace[#1]% + {\localinterlinespacetrue + \setupinterlinespace[#1]% + \localinterlinespacefalse} + +\def\simplesetupinterlinespace + {\localinterlinespacetrue + \setfontparameters + \updateraggedskips % funny one here + \localinterlinespacefalse} + +\definecomplexorsimple\setupinterlinespace + +% In earlier versions \type{\bigskipamount} was +% \type{\ht\strutbox} and the stretch was plus or minus +% \type{.4\dp\strutbox}. Don't ask me why. The most recent +% implementation is based on a user supplied distance, which +% is by default \type{.75\normalskipamount} where +% \type{\normalskipamount} equals the current baseline +% distance. + +% \lineskiplimit = -\maxdimen -> freezes baselineskip + +% can be conditionals + +\newif\ifblanknowhite \blanknowhitefalse +\newif\ifblankindeed \blankindeedfalse +\newif\ifblankreset \blankresetfalse +\newif\ifblankdisable \blankdisablefalse +\newif\ifblankflexible \blankflexibletrue +\newif\ifblankouter +\newif\ifblankforce +\newif\ifblankgoback + +\newskip\blankskip \blankskip=\bigskipamount +\newskip\blankskipamount + +\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 + +\newif\iflocalblankfixed +\newif\iflocalblankflexible + +\def\geenblanko{\removelastskip} % will become obsolete + +%%%% pas op, wordt ook in core-pos gebruikt + +\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap + {\doifelse{#1}\v!line + {#2\openlineheight} + {\ifgridsnapping + \assigndimension{#1}{#2}{.25\openlineheight}{.5\openlineheight}\openlineheight + \else + \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount + \fi}% + \relax} + +% \relax is really needed, else we may loose stretch due to lookahead; somehow +% this bug was introduced a while ago but somehow went unnoticed; fixed 2/7/2008 + +\def\addblankskip#1#2#3{\global\advance\blankskip#1\ifgridsnapping#3\else#2\fi\relax} + +\def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}} + +\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight} +\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight} +\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}} +\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}} +\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}} +\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}} +\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight} +\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight} +\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight} +\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight} + +\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount} +\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue} +\defineblankmethod [\v!disable] {\global\blankdisabletrue} +\defineblankmethod [\v!force] {\global\blankforcetrue} +\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi} +\defineblankmethod [\v!reset] {\global\blankresettrue} +\defineblankmethod [\v!flexible] {\global\localblankflexibletrue} +\defineblankmethod [\v!fixed] {\global\localblankfixedtrue} +\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko} +\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi + \global\advance\blankskip .5\lineheight} +\defineblankmethod [\v!none] {\global\blankresettrue} +\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} +\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut} + +% \vtop{\blank[synchronize]\blank[line]test} + +\defineblankmethod [\v!always] {\redowhitespace} % experimental + +% happens often, so we speed this up: +% +% \defineblankmethod [2*\v!line] {\addblankskip+{2\openlineheight}{2\openlineheight}} +% \defineblankmethod [2*\v!big] {\addblankskip+{2\bigskipamount }{2\openlineheight}} +% +% no, with 2\whatever we loose the stretch and shrink! Taco's alternative: + +\defineblankmethod + [2*\v!line] + {\addblankskip+\openlineheight\openlineheight + \addblankskip+\openlineheight\openlineheight} + +\defineblankmethod + [2*\v!big] + {\addblankskip+\bigskipamount\openlineheight + \addblankskip+\bigskipamount\openlineheight} + +\def\doblank#1% + {\edefconvertedargument\ascii{#1}% + \ifx\ascii\empty\else + \ifcsname\??bo\??bo\ascii\endcsname % internal def + \csname\??bo\??bo\ascii\endcsname + \else\ifcsname\??bo\ascii\endcsname % user def / slow + \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax + \else + \dorepeatwithcommand[#1]\redoblank + \fi\fi + \fi + \relax} + +\def\redoblank#1% + {\edefconvertedargument\ascii{#1}% + \ifx\ascii\empty\else + \ifcsname\??bo\??bo\ascii\endcsname % internal def + \csname\??bo\??bo\ascii\endcsname + \else\ifcsname\??bo\ascii\endcsname % user def / slow + \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax + \else + \global\advance\blankskip#1\relax + \fi\fi + \fi + \relax} + +\unexpanded\def\blank % the \relax is definitely needed due to the many \if's + {\relax\complexorsimple\doblank} + +\def\complexdoblank + {\flushnotes + \ifmmode + \@EA\nocomplexdoblank + \else + \ifopelkaar + \ifinpagebody + \@EA\@EAEAEA\@EA\docomplexdoblank + \else + \@EA\@EAEAEA\@EA\nocomplexdoblank + \fi + \else + \@EAEAEA\docomplexdoblank + \fi + \fi} + +\def\nocomplexdoblank[#1]% + {% evt blokkeerfalse + \ifmmode\else\par\fi} + +% Overloaded in cont-new! + +\newsignal\noblanksignal + +% \def\doinhibitblank +% {\kern\noblanksignal} + +% \def\inhibitblank% the fast, local way +% {\endgraf\ifvmode\prevdepth\newprevdepth\fi} + +% \def\docomplexdoblank[#1]% pas op \relax's zijn nodig ivm volgende \if +% {\global\blankresetfalse +% \global\blankdisablefalse +% \global\blanknowhitefalse +% \global\localblankflexiblefalse +% \global\localblankfixedfalse +% \global\blankskip\zeropoint +% \global\blankforcefalse +% \global\blankgobackfalse +% \blankouterfalse +% \expanded{\rawprocesscommalist[#1]}\doblank +% \ifdim\blankskip=\zeropoint\relax +% \iflocalblankflexible +% \doglobal\advance\blankskip \currentblank +% \else\iflocalblankfixed +% \doglobal\advance\blankskip \currentblank +% \fi\fi +% \fi +% \ifblankouter +% \else +% \par +% \ifvmode +% \ifblankgoback +% \removelastskip +% \fi +% \ifblankforce +% % dit gaat mis in pos fonts +% % \ifdim\prevdepth>\zeropoint\else ... +% % -1000pt signals top of page or column (\ejectcolumn) +% \bgroup\forgeteverypar\verticalstrut\egroup\kern-\struttotal +% \fi +% \ifblankdisable +% \global\blankindeedfalse +% \ifgridsnapping +% \ifdim\prevdepth<\zeropoint +% % brrr +% \else +% % dirty trick: smaller blanks are ignored after +% % a larger one, so 10 lines is probably safe; first make +% % sure that we honor penalties +% \scratchcounter\lastpenalty +% % now comes the trick (cross our fingers that this works +% % well in multi columns; maybe an ifinner test is needed +% % \vskip-10\lineheight +% % \ifnum\scratchcounter=\zerocount \else \penalty\lastpenalty \fi +% % \vskip 10\lineheight +% % allas, this leads to overfull pages, so we try this: +% \kern-\noblanksignal +% \ifnum\scratchcounter=\zerocount +% \else +% \penalty\lastpenalty +% \fi +% \kern\noblanksignal +% % end-of-dirty-trick +% \fi +% \else +% \ifdim\prevdepth<\zeropoint +% % brrr +% \else +% % ensure at least a proper prevdepth, this should be +% % an option +% \vskip-\prevdepth +% \vskip\strutdepth +% \prevdepth\strutdepth +% \fi +% % the old crappy piece of code +% \edef\oldprevdepth{\the\prevdepth}% +% \prevdepth\newprevdepth +% \fi +% \else +% \global\blankindeedtrue +% \fi +% \ifblankreset +% \global\blankindeedtrue +% \ifgridsnapping +% % let's play safe and not fool around with the depth, if +% % only because it took a lot of effort to sort out the grid +% % stuff in the first place +% \else +% \ifdim\prevdepth=\newprevdepth +% \prevdepth\oldprevdepth +% \fi +% \fi +% \fi +% \ifblankindeed +% \ifdim1\lastskip<1\blankskip\relax +% % else when \blanko[2*groot] + \blanko[3*groot] with parskip +% % equaling 1*groot, gives a groot=\parskip so adding a small +% % value makes it distinguishable; can also be done at parskip +% % setting time (better) +% \global\advance\blankskip \mindimen\relax % = skip +% % test this on 2* + 3* and parskip groot +% \ifblanknowhite +% \global\advance\blankskip -\parskip +% \else +% \ifdim\lastskip=\parskip +% \else % force this due to previous comment +% \ifdim\parskip>\zeropoint\relax +% \ifdim\blankskip<\parskip\relax +% \global\blankskip\zeropoint +% \else +% \global\advance\blankskip -\parskip +% \fi +% \fi +% \fi +% \fi +% \ifblankflexible \else +% \blankskip1\blankskip +% \fi +% \iflocalblankfixed +% \blankskip1\blankskip +% \fi +% \iflocalblankflexible +% \blankskip1\blankskip +% \!!plus\skipgluefactor\blankskip +% \!!minus\skipgluefactor\blankskip +% \fi +% \ifdim\lastkern=\noblanksignal % controled and grid +% \global\blankindeedfalse +% \else\ifgridsnapping\else\ifdim\prevdepth=\newprevdepth +% \global\blankindeedfalse +% \fi\fi\fi +% \ifblankindeed +% \iffuzzyvskip +% \removelastfuzzyvskip +% \fuzzyvskip\blankskip\relax +% \else +% \removelastskip +% \vskip\blankskip\relax +% \fi +% \fi +% \else +% \iffuzzyvskip +% \removelastfuzzyvskip +% \fuzzyvskip\blankskip\relax +% \else +% % new, test this on pascal +% \ifdim\blankskip<\zeropoint +% \advance\blankskip-\lastskip +% \removelastskip +% \ifdim\blankskip>\zeropoint +% \vskip\blankskip +% \else +% \vskip\zeropoint +% \fi +% \else +% % also new +% \ifdim\blankskip=\zeropoint +% \ifblanknowhite +% \geenwitruimte +% \fi +% \fi +% \fi +% \fi +% \fi +% \fi +% \fi +% \fi +% \global\fuzzyvskipfalse +% \presetindentation} + +% goback was broken: + +% \def\doinhibitblank +% {\kern\noblanksignal} + +% \def\inhibitblank% the fast, local way +% {\endgraf\ifvmode\prevdepth\newprevdepth\fi} + +% problem: we cannot look back in the mvl so we need 3 kinds of signals + +\def\noblankpsignal{1010101} + +\def\inhibitgridblank % was doinhibitblank + {\ifvmode\else\endgraf\fi + \ifvmode + \ifnum\lastpenalty<10000 + \kern-\noblanksignal % new + \kern \noblanksignal + \else + \penalty\noblankpsignal + \fi + \fi} + +\def\inhibittextblank % was inhibitblank + {\endgraf + \ifvmode + \prevdepth\newprevdepth + \fi} + +% new macro +% +% \def\inhibitblank % need some work +% {\endgraf +% \ifvmode +% \ifgridsnapping +% \inhibitgridblank +% \else +% % this one spoils the grid +% \inhibittextblank +% \fi +% \fi} + +\def\doinhibitblank{\inhibitgridblank} +\def\inhibitblank {\inhibittextblank} + +% will become obsolete + +\ifx\undefined\savedlastskip \newskip \savedlastskip \fi +\ifx\undefined\savedlastpenalty \newcount\savedlastpenalty \fi + +% beware, prevdepth can have funny values (e.g. mvl value when in box) + +\def\docomplexdoblank[#1]% pas op \relax's zijn nodig ivm volgende \if + {\global\blankresetfalse + \global\blankdisablefalse + \global\blanknowhitefalse + \global\localblankflexiblefalse + \global\localblankfixedfalse + \global\blankforcefalse + \global\blankgobackfalse + \blankouterfalse + \global\blankskip\zeropoint +% +\edefconvertedargument\ascii{#1}% todo fast check for simple +\ifcsname\??bo\??bo\ascii\endcsname % internal def + \csname\??bo\??bo\ascii\endcsname +\else\ifcsname\??bo\ascii\endcsname % user def / slow + \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax +\else + \expanded{\rawprocesscommalist[#1]}\doblank +\fi\fi +% + \relax % to be sure + \ifdim\blankskip=\zeropoint\relax + \iflocalblankflexible + \doglobal\advance\blankskip \currentblank + \else\iflocalblankfixed + \doglobal\advance\blankskip \currentblank + \fi\fi + \fi + \relax % to be sure + \ifblankouter + % do nothing + \else + \par + \ifvmode + \ifblankgoback + \ifdim\lastskip>\zeropoint \vskip-\lastskip \fi + \savedlastskip\zeropoint + \else\ifdim\lastskip>\zeropoint + \savedlastskip\lastskip + \else % todo: lastnode, dan namelijk geen skip ! + \savedlastskip\zeropoint + \fi\fi + \ifblankforce + % dit gaat mis in pos fonts + % \ifdim\prevdepth>\zeropoint\else ... + % -1000pt signals top of page or column (\ejectcolumn) + \bgroup\forgeteverypar\verticalstrut\egroup\kern-\struttotal + \savedlastskip\zeropoint + \fi + \savedlastpenalty\lastpenalty % hm, now it gets lost + \ifblankdisable + \global\blankindeedfalse % keep this, i.e. disable current too + \ifgridsnapping + \ifdim\prevdepth<\zeropoint + % brrr + \else + % dirty trick: smaller blanks are ignored after a + % larger one, so 10 lines is probably safe; we need + % to make sure that we honor penalties; here comes the + % trick (cross our fingers that this works well in + % multi columns; maybe an ifinner test is needed + % \scratchcounter\lastpenalty + % \vskip-10\lineheight + % \ifnum\scratchcounter=\zerocount \else \penalty\lastpenalty \fi + % \vskip 10\lineheight + % alas, this leads to overfull pages, so we try this: + \inhibitgridblank + \fi + \else + \ifdim\prevdepth<\zeropoint + % brrr + \else + % ensure at least a proper prevdepth, this should be + % an option + \vskip-\prevdepth + \vskip\strutdepth + \prevdepth\strutdepth + \fi + % the old crappy piece of code + \edef\oldprevdepth{\the\prevdepth}% + \prevdepth\newprevdepth % == \inhibittextblank + \fi + \else + \global\blankindeedtrue + \fi + \ifblankreset + \global\blankindeedtrue + \ifgridsnapping + % let's play safe and not fool around with the depth, if + % only because it took a lot of effort to sort out the grid + % stuff in the first place + \else + \ifdim\prevdepth=\newprevdepth + \prevdepth\oldprevdepth + \fi + \fi + \fi + \ifblankindeed + \ifdim1\savedlastskip<1\blankskip\relax + % else when \blank[2*groot] + \blank[3*groot] with parskip + % equaling 1*groot, gives a groot=\parskip so adding a small + % value makes it distinguishable; can also be done at parskip + % setting time (better) + \global\advance\blankskip \mindimen\relax % = skip + % test this on 2* + 3* and parskip groot + \ifblanknowhite + \global\advance\blankskip -\parskip + \else + \ifdim\savedlastskip=\parskip + \else % force this due to previous comment + \ifdim\parskip>\zeropoint\relax + \ifdim\blankskip<\parskip\relax + \global\blankskip\zeropoint + \else + \global\advance\blankskip -\parskip + \fi + \fi + \fi + \fi + \ifblankflexible \else + \blankskip1\blankskip + \fi + \iflocalblankfixed + \blankskip1\blankskip + \fi + \iflocalblankflexible + \blankskip1\blankskip + \!!plus \skipgluefactor\blankskip + \!!minus\skipgluefactor\blankskip + \fi + \ifdim\lastkern=\noblanksignal\relax % controlled and grid + \global\blankindeedfalse + \else\ifnum\savedlastpenalty=\noblankpsignal\relax % controlled and grid + \global\blankindeedfalse + \else\ifgridsnapping\else\ifdim\prevdepth=\newprevdepth + \global\blankindeedfalse + \fi\fi\fi\fi + \ifblankindeed + \iffuzzyvskip + \removelastfuzzyvskip + \fuzzyvskip\blankskip\relax + \else + \relax\ifdim\savedlastskip=\zeropoint\else + \vskip-\savedlastskip + \fi + \vskip\blankskip\relax + \fi + \fi + \else + \iffuzzyvskip + \removelastfuzzyvskip + \fuzzyvskip\blankskip\relax + \else + % new, test this on pascal + \ifdim\blankskip<\zeropoint + \relax\ifdim\savedlastskip=\zeropoint\else + \advance\blankskip-\savedlastskip + \vskip-\savedlastskip + \fi + \ifdim\blankskip>\zeropoint + \vskip\blankskip + \else + \vskip\zeropoint + \fi + \else + % also new + \ifdim\blankskip=\zeropoint + \ifblanknowhite + \nowhitespace + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \global\fuzzyvskipfalse + \presetindentation} + +%D For a long time we had: +%D +%D \starttyping +%D \def\simpledoblank% +%D {\doifelse{\currentwhitespace}{\v!geen} +%D {\blank[\currentblank]} +%D {\blank[\currentwhitespace]}} +%D \stoptyping +%D +%D But Berend de Boer wanted more control, so now we have: + +\def\simpledoblank % ... + {\doifelse\currentwhitespace\v!none + {\blank[\currentblank]} + {\blank[\s!default]}} + +%D Another useful definition would be: +%D +%D \starttyping +%D \defineblank +%D [\s!default] +%D [\v!groot] +%D \stoptyping + +\def\dosetupblank#1% amount are an plain inheritance + {\bigskipamount#1\relax + \ifblankflexible \else + \bigskipamount1\bigskipamount + \fi + \medskipamount \bigskipamount \divide\medskipamount \plustwo + \smallskipamount\bigskipamount \divide\smallskipamount\plusfour}% + +\def\complexsetupblank[#1]% more \let's -> this also wil become installable + {\ifgridsnapping + \blankflexiblefalse + \else + \ExpandFirstAfter\processallactionsinset + [#1] + [ \v!flexible=>\blankflexibletrue, + \v!fixed=>\blankflexiblefalse]% + \fi + \ExpandFirstAfter\processallactionsinset + [#1] + [ \v!flexible=>\dosetupblank\appliedblankskip, + \v!fixed=>\dosetupblank\appliedblankskip, + \v!line=>\edef\appliedblankskip{\linedistance}% + \dosetupblank\appliedblankskip, + \v!halfline=>\scratchskip.5\linedistance + \edef\appliedblankskip{\the\scratchskip}% + \dosetupblank\appliedblankskip, + \v!big=>\ifgridsnapping + \edef\appliedblankskip{\linedistance}% + \dosetupblank\appliedblankskip + \fi + \let\currentblank\v!big, + \v!medium=>\let\currentblank\v!medium, + \v!small=>\let\currentblank\v!small, + \v!global=>\let\currentblank\v!global, + \v!normal=>\dosetupblank\appliedblankskip, + \v!standard=>\edef\appliedblankskip{\skipfactor\linedistance}% + \dosetupblank\appliedblankskip, + \s!default=>\dosetupblank\appliedblankskip, + \s!unknown=>\let\appliedblankskip\commalistelement + \dosetupblank\appliedblankskip]% + \simplesetupwhitespace} + +% \definecomplexorsimpleempty\setupblank +% +% speed gain: 60 sec -> 30 sec + +\definecomplexorsimple\setupblank + +\def\simplesetupblank % == snelle \setupblank[\s!default] + {\ifgridsnapping + \blankflexiblefalse + \fi + \dosetupblank\appliedblankskip + % \let\deblanko\v!big + \simplesetupwhitespace} + +\def\restorestandardblank% \v!standard + {\edef\appliedblankskip{\skipfactor\linedistance}% + \dosetupblank\appliedblankskip + }%\let\deblanko\v!big} + +\def\dodefineblank[#1][#2]% + {\def\docommand##1{\setvalue{\??bo##1}{#2}}% + \processcommalist[#1]\docommand} + +\def\defineblank + {\dodoubleargument\dodefineblank} + +\def\savecurrentblank + {\edef\restorecurrentblank + {\bigskipamount\the\bigskipamount + \medskipamount\the\medskipamount + \smallskipamount\the\smallskipamount + \noexpand\def\noexpand\currentblank{\currentblank}% + \ifblankflexible + \noexpand\blankflexibletrue + \else + \noexpand\blankflexiblefalse + \fi}} + +%D Now. + +\defineblank [\s!default] [\v!white] +\defineblank [\v!height] [\strutheight] +\defineblank [\v!depth] [\strutdepth] + +% old implementation +% +% \let\currentindentation=\empty +% +% \newdimen\ctxparindent +% +% \newif\ifindentfirstparagraph % \indentfirstparagraphtrue +% +% \def\presetindentation +% {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}} +% +% \definecomplexorsimple\setupindenting +% +% \def\complexsetupindenting[#1]% +% {\processallactionsinset +% [#1] +% [ \v!first=>\indentfirstparagraphtrue, +% \v!next=>\indentfirstparagraphfalse, +% \s!default=>\simplesetupindenting, +% \s!unknown=>\edef\currentindentation{\commalistelement}% +% \simplesetupindenting]} +% +% \def\simplesetupindenting +% {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}% +% \parindent\ctxparindent\relax} +% +% \def\indenting % watch out: \dodo and no \do +% {\dosingleargument\dodoindenting} +% +% \def\dodoindenting[#1]% oeps, we needed a commalist handler here! +% {\edef\currentindenting{#1}% +% \processcommacommand[#1]\dododoindenting} +% +% \def\dododoindenting#1% +% {\executeifdefined{\??in:#1}\donothing} +% +% \let\currentindenting\empty +% +% \def\defineindentingmethod[#1]#2% +% {\setvalue{\??in:#1}{#2}} +% +% \defineindentingmethod [\v!no] {\parindent\ctxparindent\noindent} +% \defineindentingmethod [\v!not] {\parindent\ctxparindent\noindent} +% +% \defineindentingmethod [\v!first] {\indentfirstparagraphtrue} +% \defineindentingmethod [\v!next] {\indentfirstparagraphfalse} +% +% \defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent ! +% \defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent ! +% +% \defineindentingmethod [\v!never] {\parindent\zeropoint\relax} % no \indent ! +% +% \def\noindenting{\indenting[\v!no,\v!next]} % was \nietinspringen +% \def\doindenting{\indenting[\v!yes,\v!first]} % was \welinspringen +% +% \def\dochecknextindentation#1% internal one +% {\checknextindentation[\getvalue{#1\c!indentnext}]} +% +% \def\checknextindentation[#1]% +% {\processaction[#1][%\v!keep=>, +% \v!yes=>\doindentation, +% \v!no=>\noindentation, +% \v!auto=>\autoindentation]} +% +% \def\doindentation% too simple +% {\gdef\checkindentation{\global\indentationtrue}} +% +% \ifx\autoindentation\undefined +% \let\autoindentation\relax +% \fi +% +% \newif\ifindentation \indentationtrue % documenteren, naar buiten +% +% \let\checkindentation=\relax +% +% \def\donoindentation +% {\ifdim\parindent=\zeropoint \else +% \bgroup \setbox\scratchbox\lastbox \egroup +% \fi} +% +% \def\noindentation % made global +% {\ifinpagebody \else +% \global\indentationfalse +% \gdef\checkindentation +% {\donoindentation +% \gdef\checkindentation{\global\indentationtrue}}% +% \fi} +% +% \def\nonoindentation % bv bij floats +% {\ifinpagebody \else +% \global\indentationtrue +% \gdef\checkindentation{\global\indentationtrue}% +% \fi} +% +% \def\indentation +% {\ifvmode \ifdim\parindent=\zeropoint \else +% % was : \hskip\parindent +% % can be: \indent +% % but we test: +% \noindent\hskip\parindent +% \fi \fi} + +\let\currentindentation\empty % amount/keyword +% \let\normalindentation \empty % used for reinstating normal indentation +\let\currentindenting \empty % method + +\newdimen\ctxparindent + +\newif\ifindentfirstparagraph % \indentfirstparagraphtrue + +\chardef\indentingtoggle\zerocount + +%D After a blank or comparable situation (left side floats) we +%D need to check if the next paragraph has to be indented. + +\def\presetindentation + {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}} + +%D This sets up the (normally) global indentation behavior as well +%D as the amounts. + +\definecomplexorsimple\setupindenting + +% \def\complexsetupindenting[#1]% +% {\edef\currentindenting{#1}% +% \indentfirstparagraphtrue +% \parindent\ctxparindent +% \chardef\indentingtoggle\zerocount +% \processcommalist[#1]\docomplexsetupindenting +% \ifindentfirstparagraph\else\noindentation\fi % added +% \toggleindentation} + +\indentfirstparagraphtrue +\parindent\ctxparindent +\chardef\indentingtoggle\zerocount + +% \newtoks\savedeverypar \savedeverypar\everypar +% \def\restoreeverypar{\everypar\savedeverypar} + +% we need a better everypar model: for each option a switch, which we +% set to false with \forgetall and can enable when needed (context 4); +% that way we can control the order of execution of options + +\def\checkeverypar % currently a hack + {\ifzeropt\parindent\else + \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}% + \fi} + +\def\complexsetupindenting[#1]% + {\edef\currentindenting{#1}% + \doifsomething\currentindenting % handy when a parameter is passed + {% not here: \indentfirstparagraphtrue + % not here: \parindent\ctxparindent + % not here: \chardef\indentingtoggle\zerocount + % we use commacommand in order to catch #1 being a command (expanded parameter) + \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc + \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest + \checkeverypar % only when non-empty #1 + \ifindentfirstparagraph\else\noindentation\fi % added + \toggleindentation}} + +\def\docomplexsetupindentingA#1% + {\edefconvertedargument\!!stringa{#1}% + \doifundefined{\??in:\!!stringa}% + {\edef\currentindentation{#1}% + \let\normalindentation\currentindentation + \simplesetupindenting}} + +\def\docomplexsetupindentingB#1% + {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen + \executeifdefined{\??in:\!!stringa}\donothing} + +\def\simplesetupindenting % empty case, a it strange, needed this way? + {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}} + +\def\indenting % kind of obsolete + {\dosingleargument\complexsetupindenting} + +% use \noindentation to suppress next indentation + +\def\defineindentingmethod[#1]#2% + {\setvalue{\??in:#1}{#2}} + +\defineindentingmethod [\v!no] {\parindent\zeropoint}% was: \ctxparindent\noindent} +\defineindentingmethod [\v!not] {\parindent\zeropoint}% was: \ctxparindent\noindent} + +\defineindentingmethod [\v!first] {\indentfirstparagraphtrue} +\defineindentingmethod [\v!next] {\indentfirstparagraphfalse} + +\defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent ! +\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent ! + +\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent ! + \chardef\indentingtoggle\zerocount} + +\defineindentingmethod [\v!odd] {\chardef\indentingtoggle\plusone} +\defineindentingmethod [\v!even] {\chardef\indentingtoggle\plustwo} + +\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else + \let\currentindentation\normalindentation + \simplesetupindenting + \fi} + +\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue + \parindent\zeropoint + \chardef\indentingtoggle\zerocount} + +\def\noindenting{\indenting[\v!no, \v!next ]} +\def\doindenting{\indenting[\v!yes,\v!first]} + +%D This one sets up the local indentation behaviour (i.e. either or not +%D a next paragraph will be indented). + +\def\dochecknextindentation#1% internal one + {\checknextindentation[\getvalue{#1\c!indentnext}]} + +\def\checknextindentation[#1]% + {\processaction + [#1] + [%\v!keep=>, + \v!yes=>\doindentation, + \v!no=>\noindentation, + \v!auto=>\autoindentation]} + +%D Here come the handlers. + +\newif\ifindentation \indentationtrue % documenteren, naar buiten + +\let\checkindentation\relax + +\ifx\autoindentation\undefined \let\autoindentation\relax \fi % hook + +\def\doindentation + {\gdef\checkindentation{\global\indentationtrue}} + +\def\noindentation % made global + {\ifinpagebody \else + \global\indentationfalse + \gdef\checkindentation + {\donoindentation + \gdef\checkindentation{\global\indentationtrue}}% + \fi} + +\def\nonoindentation % bv bij floats + {\ifinpagebody \else + \global\indentationtrue + \gdef\checkindentation{\global\indentationtrue}% + \fi} + +\def\donoindentation + {\ifdim\parindent=\zeropoint \else + \bgroup \setbox\scratchbox\lastbox \egroup + \fi} + +\def\indentation + {\ifvmode \ifdim\parindent=\zeropoint \else + % was : \hskip\parindent + % can be: \indent + % but we test: + \noindent\hskip\parindent + \fi \fi} + +\def\toggleindentation + {\ifcase\indentingtoggle + % nothing + \or + \notoggleindentation + \or + \dotoggleindentation + \fi} + +\def\dokillindentation + {\gdef\checkindentation{\global\indentationfalse\donoindentation}} + +\def\dotoggleindentation + {\gdef\checkindentation{\global\indentationfalse\notoggleindentation\donoindentation}} + +\def\notoggleindentation + {\gdef\checkindentation{\global\indentationtrue\dotoggleindentation}} + +\appendtoks + \pushmacro\checkindentation + \pushmacro\ifindentation +\to \everypushsomestate + +\appendtoks + \popmacro\ifindentation + \popmacro\checkindentation +\to \everypopsomestate + +% we need to save the state if we want to adapt behaviour to empty lines +% +% \def\setlasthvmode +% {\global\chardef\savedhvmode\ifhmode\plusone\else\ifvmode\plustwo\else\zerocount\fi\fi} +% +% \def\resetlasthvmode +% {\global\chardef\savedhvmode\zerocount} +% +% \chardef\savedhvmode\zerocount + +% This is a user requested hack (using the auto-hook). + +\chardef\recheckindentationmode\zerocount + +\def\dontrechecknextindentation + {\global\chardef\recheckindentationmode\zerocount} + +\def\dorechecknextindentation + {\ifcase\recheckindentationmode + % nothing + \or + \dontrechecknextindentation + \expandafter\doautoindentation + \fi} + +\def\doautoindentation + {\doifnextcharelse\par\donothing\noindentation} + +\def\autoindentation + {\global\chardef\recheckindentationmode\plusone} + +%D An example of usage: +%D +%D \starttyping +%D \setupindenting[small,yes] +%D +%D \setupitemize [indentnext=auto] +%D \setuptyping [indentnext=auto] +%D \setupformulas[indentnext=auto] +%D +%D \input tufte +%D +%D \startitemize +%D \item itemize +%D \stopitemize +%D \input tufte +%D +%D \startitemize +%D \item itemize +%D \stopitemize +%D +%D \input tufte +%D +%D \startitemize +%D \item itemize +%D \stopitemize +%D +%D \page +%D +%D \input tufte +%D +%D \starttyping +%D verbatim +%D \stoptyping +%D \input tufte +%D +%D \starttyping +%D verbatim +%D \stoptyping +%D +%D \input tufte +%D +%D \starttyping +%D verbatim +%D \stoptyping +%D +%D \page +%D +%D \input tufte +%D +%D \startformula +%D a = b +%D \stopformula +%D \input tufte +%D +%D \startformula +%D a = b +%D \stopformula +%D +%D \input tufte +%D +%D \startformula +%D a = b +%D \stopformula + + +%D \macros +%D {frenchspacing,nonfrenchspacing} +%D +%D Smehow \type{\frenchspacing} can lead to hyphenation between +%D dashes so we now have \type {\newfrenchspacing} (moved from +%D \type {syst-chr}). + +%D Hm ... todo: + +\sfcode`\)=0 +\sfcode`\'=0 +\sfcode`\]=0 + +\def\setfrenchspacing#1% + {\sfcode`\.#1 \sfcode`\,#1\relax + \sfcode`\?#1 \sfcode`\!#1\relax + \sfcode`\:#1 \sfcode`\;#1\relax} + +\def\frenchspacing + {\setfrenchspacing{1000}} + +\def\resetfrenchspacing + {\sfcode`\.3000 \sfcode`\,1250 + \sfcode`\?3000 \sfcode`\!3000 + \sfcode`\:2000 \sfcode`\;1500 } + +\def\frenchspacing {\setfrenchspacing{1000}} +\def\newfrenchspacing{\setfrenchspacing{1050}} +\def\nonfrenchspacing{\resetfrenchspacing} + +\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}} + +\definespacingmethod[\v!packed]{\newfrenchspacing} +\definespacingmethod[\v!broad ]{\nonfrenchspacing} + +\def\complexsetupspacing[#1]% + {\executeifdefined{\??sg\??sg#1}\relax + \updateraggedskips} + +\def\simplesetupspacing + {\updateraggedskips} + +\definecomplexorsimple\setupspacing + +% \dorecurse{100}{\recurselevel\spacefactor 800 \space} \par +% \dorecurse{100}{\recurselevel\spacefactor1200 \space} \par +% \dorecurse{100}{\recurselevel\spacefactor 800 \normalspaceprimitive} \par +% \dorecurse{100}{\recurselevel\spacefactor1200 \normalspaceprimitive} \par + +% When we don't add the % here, we effectively get \ and +% since we have by default \def\^^M{\ } we get into a loop. + +\let\normalspaceprimitive=\ % space-comment is really needed + +\unexpanded\def\ {\mathortext\normalspaceprimitive\space} % no \dontleavehmode\space (else no frenchspacing) + +\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\space} + +\letcatcodecommand \ctxcatcodes `\~ \nonbreakablespace % overloaded later + +\def\space { } +\def\removelastspace{\ifhmode\unskip\fi} +\def\nospace {\removelastspace\ignorespaces} + +% in tables we need: +% +% \def\fixedspace {\hskip.5em\relax} +% +% but, since not all fonts have .5em digits: + +\unexpanded\def\fixedspace + {\setbox\scratchbox\normalhbox{\mathortext{0}{0}}% + \hskip\wd\scratchbox\relax} + +\def\fixedspaces + {\letcatcodecommand \ctxcatcodes `\~ \fixedspace} + +\def\removeunwantedspaces + {\ifhmode % we also need to unskip 0pt skips + \unskip\unskip\unskip\unskip\unskip + \unskip\unskip\unskip\unskip\unskip + \fi} + +\appendtoks\let~\space\to\simplifiedcommands + +% still not fixed in aleph / luatex +% +% \def\removeunwantedspaces +% {\ifhmode \ifnum\lastnodetype=\@@gluenode +% \unskip \@EAEAEA\removeunwantedspaces +% \fi \fi} + +%D For old time sake, will disappear soon. + +\let\hardespatie\fixedspace +\let\geenspatie \nospace + +% \startbuffer +% \startlines \tt \fixedspaces +% 0~1~~2~~~3~~~~4~~~~~5 +% 0~~~~~~~~~~~~~~~~~~~5 +% $0~1~~2~~~3~~~~4~~~~~5$ +% $0~~~~~~~~~~~~~~~~~~~5$ +% \stoplines +% +% \starttabulate[|~|] +% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \NR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \NR +% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \NR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \NR +% \stoptabulate +% +% \starttable[||] +% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \AR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \AR +% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \AR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \AR +% \stoptable +% \stopbuffer +% +% \setupbodyfont[cmr] \getbuffer +% \setupbodyfont[lbr] \getbuffer + +\def\packed + {\nointerlineskip} + +\def\godown[#1]% + {\relax + \ifhmode\endgraf\fi + \ifvmode\nointerlineskip\vskip#1\relax\fi} + +%D A couple of plain macros: + +\ifx\thinspace\undefined + + \def\thinspace {\kern .16667em } + \def\negthinspace{\kern-.16667em } + \def\enspace {\kern .5em } + + \def\thinspace {\kern .16667\emwidth} + \def\negthinspace{\kern-.16667\emwidth} + \def\enspace {\kern .5\emwidth} + +\fi + +\ifx\quad\undefined + + \def\enskip{\hskip.5em\relax} + \def\quad {\hskip 1em\relax} + \def\qquad {\hskip 2em\relax} + + \def\enskip{\hskip.5\emwidth} + \def\quad {\hskip \emwidth} + \def\qquad {\hskip 2\emwidth} + +\fi + +\let\emspace\quad + +\ifx\smallskip\undefined + + \def\smallskip{\vskip\smallskipamount} + \def\medskip {\vskip\medskipamount} + \def\bigskip {\vskip\bigskipamount} + +\fi + +\ifx\allowbreak\undefined + + \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 + {\par + \ifdim\lastskip<\smallskipamount + \removelastskip + \penalty-50 + \smallskip + \fi} + +\def\medbreak + {\par + \ifdim\lastskip<\medskipamount + \removelastskip + \penalty-100 + \medskip + \fi} + +\def\bigbreak + {\par + \ifdim\lastskip<\bigskipamount + \removelastskip + \penalty-200 + \bigskip + \fi} + +\fi + +\newskip\ctxparskip \ctxparskip\zeropoint + +\newconditional \flexiblewhitespace \settrue\flexiblewhitespace + +\def\blankokleinmaat {\smallskipamount} +\def\blankomiddelmaat {\medskipamount} +\def\blankogrootmaat {\bigskipamount} +\def\currentwhitespace {\zeropoint} + +\definecomplexorsimple\setupwhitespace + +% \def\simplesetupwhitespace +% {\doifnot\currentwhitespace\v!none\dosetupwhitespace} +% +% \def\complexsetupwhitespace[#1]% +% {\doifelsenothing{#1} +% {\simplesetupwhitespace} +% {\edef\currentwhitespace{#1}% +% \dosetupwhitespace}} +% +% \def\dosetupwhitespace +% {\processcommacommand[\currentwhitespace]\dowhitespacemethod +% \dodosetupwhitespace} + +\def\simplesetupwhitespace + {\doifnot\currentwhitespace\v!none\dosetupwhitespace} + +\def\complexsetupwhitespace[#1]% + {\edef\nextcurrentwhitespace{#1}% + \ifx\nextcurrentwhitespace\empty + \simplesetupwhitespace + \else + \let\currentwhitespace\nextcurrentwhitespace + \dosetupwhitespace + \fi} + +\def\dosetupwhitespace % quick test for no list + {\doifdefinedelse{\??ws\??ws\currentwhitespace}% no ifcsname due to nested \lineheight + {\getvalue{\??ws\??ws\currentwhitespace}}% + {\processcommacommand[\currentwhitespace]\dowhitespacemethod}% + \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 + \else + \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi + \fi + \parskip\ctxparskip} + +\chardef\baselinegridmode=0 % option in layout / 1=permit_half_lines + +\def\dodosetupwhitespace + {\ifgridsnapping + \setfalse\flexiblewhitespace + \ctxparskip1\ctxparskip + \ifdim\ctxparskip>\zeropoint + \ifcase\baselinegridmode + \ctxparskip\baselineskip % normal ! ! ! ! !! + \or + \ifdim\scratchdimen=\baselineskip % maybe range + \ctxparskip\baselineskip % normal ! ! ! ! !! + \else + \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax + \fi + \else + \ctxparskip\baselineskip % normal ! ! ! ! !! + \fi + \fi + \else + \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi + \fi + \parskip\ctxparskip} + +\definesystemvariable {ws} % whitespace + +\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#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} + +\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin} + +% \def\dowhitespacemethod#1% +% {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax} + +\def\dowhitespacemethod#1% \doifdefined because of \lineheight + {\doifdefinedelse{\??ws\??ws#1}{\getvalue{\??ws\??ws#1}}{\ctxparskip#1}\relax} + +\def\nowhitespace + {\ifdim\parskip>\zeropoint\relax + \ifdim\lastskip=-\parskip + \else + \vskip-\parskip + \fi + \fi} + +\def\nowhitespaceunlessskip + {\ifdim\lastskip>\zeropoint \else + \nowhitespace + \fi} + +\def\redowhitespace + {\ifdim\lastskip>-\parskip \else + \vskip\parskip + \fi} + +\def\savecurrentwhitespace + {\edef\restorecurrentwhitespace + {\ctxparskip\the\ctxparskip + \parskip\the\parskip + \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}% + \ifconditional\flexiblewhitespace + \noexpand\settrue\flexiblewhitespace + \else + \noexpand\setfalse\flexiblewhitespace + \fi}} + +% deze variant is nodig binnen \startopelkaar +% steeds testen: +% +% \hoofdstuk{..} +% \plaatslijst[..] +% \hoofdstuk{..} +% \input tufte +% +% met/zonder witruimte + +\def\whitespace + {\par + \ifdim\parskip>\zeropoint\relax + %\ifdim\lastskip>\parskip \else + % \removelastskip interferes with blanko blokkeer en klein + \vskip\parskip + %\fi + \fi} + +\def\nonoblanko[#1]% + {\par} + +\def\noblanko + {\dosingleempty\nonoblanko} + +% 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. + +\newif\ifopelkaar + +\newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt} +\def\lastdoneparskip {0pt} + +\def\startpacked + {\dosingleempty\dostartpacked} + +\def\dostartpacked[#1]% nesting afvangen + {\par + \ifvmode + \edef\lastdoneparskip {\the\lastskip}% + \edef\lastdoneprevdepth{\the\prevdepth}% zeer recent toegevoegd + \ifdim\prevdepth=-\thousandpoint % toegevoegd omdat binnen + \else % een vbox een extra skip + \whitespace % ongewenst is; dit kan + \baselinecorrection %% zie in \placeregister[n=1] + \vskip\noparskipsignal % waarschijnlijk ook in + \fi % blanko blokkeer + \bgroup + \doifelse{#1}\v!blank + \opelkaarfalse + \opelkaartrue + \blank[\v!disable] % dit is nog niet ok, gaat fout + \setupwhitespace[\v!none] % bovenin vtop (dwz, baseline) + \fi} + +\def\stoppacked + {\par + \ifvmode + \egroup + \ifdim\lastskip=\noparskipsignal\relax + \removelastskip + \nowhitespace + \vskip-\lastdoneparskip + \vskip+\lastdoneparskip + \prevdepth-\lastdoneprevdepth % zeer recent toegevoegd + \fi + \fi} + +\def\startunpacked + {\blank + \leavevmode + \bgroup} + +\def\stopunpacked + {\egroup + \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. + +\def\toonregelcorrectie{\showbaselinecorrection} +\def\regelcorrectie {\baselinecorrection} + +% \prevdepth crosses pageboundaries! +% +% todo: a version that works ok inside a box + +\let\doaroundlinecorrection\relax + +\def\startlinecorrection + {\dodoubleempty\dostartlinecorrection} + +\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\stoplinecorrection + {\stopbaselinecorrection + \doaroundlinecorrection + \egroup} + +\def\correctwhitespace + {\dowithnextbox + {\startbaselinecorrection + \flushnextbox + \stopbaselinecorrection}% + \vbox} + +\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}} +\def\horizontalstrut{\normalhbox {\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 +% nog eens instelbaar worden. +% +% \lineheight : de hoogte van een regel +% \spacing{getal} : instellen interlinie +% \normalbaselines : instellen regelafstend +% +% \setstrut : instellen \strut +% \setnostrut : resetten \strut, \endstrut, \begstrut +% +% \setteststrut : instellen zichtbare struts +% \resetteststrut : instellen onzichtbare struts +% +% \setfontparameters : instellen na fontset +% +% De hoogte van een regel (\lineheight) is gelijk aan de +% som van de hoogte (\ht) en diepte (\dp) van \strutbox. +% +% \strut : denkbeeldig blokje met hoogte en diepte +% +% Een \hbox kan als deze aan het begin van een regel staat +% een breedte \hsize krijgen. Dit is soms te voorkomen met het +% commando \leavevmode. Binnen een \vbox geeft dit echter +% niet altijd het gewenste resultaat, vandaar het commando +% +% \leaveoutervmode + +% Pas op: niet zomaar \topskip en \baselineskip aanpassen +% en zeker niet \widowpenalty. Dit kan ernstige gevolgen +% hebben voor kolommen. +% +% Enige glue kan op zich geen kwaad, echter als blanko=vast, +% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook +% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet, +% omdat een positieve glue eindeloos rekbaar is. + +\newdimen\strutdimen +\newdimen\lineheight +\newdimen\openlineheight +\newdimen\openstrutheight +\newdimen\openstrutdepth +\newdimen\topskipgap +\newdimen\struttotal + +\def\strutheightfactor {.72} +\def\strutdepthfactor {.28} + +\def\baselinefactor {2.8} +\def\baselinegluefactor {0} + +\def\minimumstrutheight {0pt} +\def\minimumstrutdepth {0pt} + +\def\normallineheight {\baselinefactor ex} +\def\minimumlinedistance {\lineskip} + +\def\strutheight {0pt} +\def\strutdepth {0pt} +\def\strutwidth {0pt} + +\def\spacingfactor {1} + +\def\topskipfactor {1.0} +\def\maxdepthfactor {0.5} + +\def\systemtopskipfactor {\topskipfactor} +\def\systemmaxdepthfactor {\maxdepthfactor} + +% De onderstaande definitie wordt in de font-module overruled + +\ifdefined\globalbodyfontsize\else + \newdimen\globalbodyfontsize + \globalbodyfontsize=12pt +\fi + +\ifx\normalizedbodyfontsize\undefined + \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 +% {\ifdim\topskip>\openstrutheight +% % == \vskip\topskipgap +% \vskip\topskip +% \vskip-\openstrutheight +% \fi +% \verticalstrut +% \vskip-\struttotal} + +\def\topskipcorrection + {\simpletopskipcorrection + \vskip-\struttotal + \verticalstrut} + +\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 +% \fi +% \relax % the skip +% \topskipgap\topskip +% \advance\topskipgap -\openstrutheight\relax +% \ifdim\topskip<\strutheightfactor\openlineheight +% \topskip\strutheightfactor\openlineheight\relax +% \fi} + +\def\settopskip % the extra test is needed for the lbr family + {\topskip\systemtopskipfactor\globalbodyfontsize + \ifgridsnapping \else + \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi + \fi + \relax % the skip + \topskipgap\topskip + \advance\topskipgap -\openstrutheight\relax +\ifdim\minimumstrutheight>\zeropoint + \ifdim\topskip<\minimumstrutheight + \topskip\minimumstrutheight\relax + \fi +\else + \ifdim\topskip<\strutheightfactor\openlineheight + \topskip\strutheightfactor\openlineheight\relax + \fi +\fi} + +\def\setmaxdepth + {\maxdepth\systemmaxdepthfactor\globalbodyfontsize} + +\def\normalbaselines + {\baselineskip \normalbaselineskip + \lineskip \normallineskip + \lineskiplimit\normallineskiplimit} + +% \def\setnormalbaselines +% {\ifdim\normallineheight>\zeropoint +% \lineheight\normallineheight +% \fi +% \openlineheight\spacingfactor\lineheight +% \openstrutheight\strutheightfactor\openlineheight +% \openstrutdepth \strutdepthfactor \openlineheight +% \normalbaselineskip\openlineheight +% \!!plus\baselinegluefactor\openlineheight +% \!!minus\baselinegluefactor\openlineheight +% \normallineskip\minimumlinedistance\relax % \onepoint\relax +% \normallineskiplimit\zeropoint\relax +% \normalbaselines} + +\def\setnormalbaselines + {\ifdim\normallineheight>\zeropoint + \lineheight\normallineheight + \fi + \openlineheight\spacingfactor\lineheight + \openstrutheight \ifdim\minimumstrutheight>\zeropoint + \minimumstrutheight % new + \else + \strutheightfactor\openlineheight + \fi + \openstrutdepth \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth % new + \else + \strutdepthfactor \openlineheight + \fi + \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint + \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new + \fi + \normalbaselineskip\openlineheight + \ifgridsnapping\else + \!!plus \baselinegluefactor\openlineheight + \!!minus\baselinegluefactor\openlineheight + \fi + \normallineskip\minimumlinedistance\relax % \onepoint\relax + \normallineskiplimit\zeropoint\relax + \normalbaselines} + +% \def\setspacingfactor#1\to#2\by#3\\% +% {\strutdimen#2\points +% \strutdimen#3\strutdimen +% \edef#1{\withoutpt\the\strutdimen}} +% +% \def\spacing#1% +% {\ifgridsnapping +% %\doifnot{#1}{1}{\showmessage\m!layouts{11}{#1}}% +% \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi +% \edef\spacingfactor{1}% +% \else +% \edef\spacingfactor{#1}% +% \fi +% \setspacingfactor\systemtopskipfactor \to\topskipfactor \by#1\\% why no \spacingfactor ? +% \setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\% why no \spacingfactor ? +% \setnormalbaselines +% \setstrut} +% +% \def\setspacingfactor#1#2#3% +% {\edef#1{\withoutpt\the\dimexpr#2\points*#3\relax}} + +\def\spacing#1% + {\ifgridsnapping + \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi + \edef\spacingfactor{1}% + \else + \edef\spacingfactor{#1}% + \fi + %\setspacingfactor\systemtopskipfactor \topskipfactor {#1}% why no \spacingfactor ? + %\setspacingfactor\systemmaxdepthfactor\maxdepthfactor{#1}% why no \spacingfactor ? + \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}% + \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}% + \setnormalbaselines + \setstrut} + +%D Sometimes one needs to freeze the interlinespacing +%D +%D \starttyping +%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf} +%D \stoptyping + +\let\restoreinterlinespace\relax + +\def\saveinterlinespace + {\edef\restoreinterlinespace + {\lineheight \the\lineheight + \openstrutheight \the\openstrutheight + \openstrutdepth \the\openstrutdepth + \openlineheight \the\openlineheight + \normalbaselineskip \the\normalbaselineskip + \normallineskip \the\normallineskip + \normallineskiplimit\the\normallineskiplimit + \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}% + \noexpand\normalbaselines}} + +% plain definition: +% +% \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} +% +% could be: +% +% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} + +\ifx\strutbox\undefined + + \newbox\strutbox + + \setbox\strutbox=\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} + + %\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} + \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} + +\fi + +\let\normalstrut\strut + +% The double \hbox construction enables us to \backtrack +% boxes. + +% \def\setstrutdimen#1#2#3% % een strut is n.m maal ex +% {\strutdimen\normallineheight % wat niet per se \lineheight +% \strutdimen#2\strutdimen % is omdat een strut lokaal +% \strutdimen#3\strutdimen % kan afwijken van de globale +% \edef#1{\the\strutdimen}} % macro % strut + +% \def\setstrutdimen#1#2#3% % een strut is n.m maal ex +% {\strutdimen\normallineheight % wat niet per se \lineheight +% \strutdimen#2\strutdimen % is omdat een strut lokaal +% \strutdimen#3\strutdimen % kan afwijken van de globale +% \edef#1{\the\strutdimen}} % macro % strut + +% \def\setstrut +% {\setstrutdimen\strutheight\strutheightfactor\spacingfactor +% \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor +% \let\strut=\normalstrut +% \setbox\strutbox=\normalhbox +% {\normalhbox +% {\vrule +% \!!width \strutwidth +% \!!height \strutheight +% \!!depth \strutdepth +% \normalkern-\strutwidth}}} + +% \def\setstrut +% {\setstrutdimen\strutheight\strutheightfactor\spacingfactor +% \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor +% \dosetstrut} + +% \def\setstrut +% {\strutdimen\normallineheight +% \strutdimen\strutheightfactor\strutdimen +% \strutdimen\spacingfactor\strutdimen +% \edef\strutheight{\the\strutdimen}% +% \strutdimen\normallineheight +% \ifgridsnapping +% \advance\strutdimen-\strutheight +% \else +% \strutdimen\strutdepthfactor\strutdimen +% \strutdimen\spacingfactor\strutdimen +% \fi +% \edef\strutdepth{\the\strutdimen}% +% \dosetstrut} + +% interesting, strutdepth is 4.05064pt vs 4.05066pt depending on grid +% nasty rounding problem + +% \def\setstrut +% {% height +% \strutdimen\normallineheight +% \ifdim\minimumstrutheight>\zeropoint +% \strutdimen\minimumstrutheight +% \else +% \strutdimen\strutheightfactor\strutdimen +% \fi +% \strutdimen\spacingfactor\strutdimen +% \edef\strutheight{\the\strutdimen}% +% % depth +% \strutdimen\normallineheight +% \ifgridsnapping +% \ifdim\minimumstrutdepth>\zeropoint +% \strutdimen\minimumstrutdepth +% \else +% \advance\strutdimen-\strutheight +% \fi +% \else +% \ifdim\minimumstrutdepth>\zeropoint +% \strutdimen\minimumstrutdepth +% \else +% \strutdimen\strutdepthfactor\strutdimen +% \fi +% \strutdimen\spacingfactor\strutdimen +% \fi +% \edef\strutdepth{\the\strutdimen}% +% % finish +% \dosetstrut} + +% \def\setstrut +% {% height +% \ifdim\minimumstrutheight>\zeropoint +% \edef\strutheight{\the\dimexpr\spacingfactor\dimexpr\minimumstrutheight}% +% \else +% \edef\strutheight{\the\dimexpr\spacingfactor\dimexpr\strutheightfactor\dimexpr\normallineheight}% +% \fi +% % depth +% \ifgridsnapping +% \ifdim\minimumstrutdepth>\zeropoint +% \edef\strutdepth{\the\dimexpr\minimumstrutdepth}% +% \else +% \edef\strutdepth{\the\dimexpr\normallineheight-\strutheight}% +% \fi +% \else +% \ifdim\minimumstrutdepth>\zeropoint +% \edef\strutdepth{\the\dimexpr\spacingfactor\dimexpr\minimumstrutdepth}% +% \else +% \edef\strutdepth{\the\dimexpr\spacingfactor\dimexpr\strutdepthfactor\dimexpr\normallineheight}% +% \fi +% \fi +% % finish +% \dosetstrut} + +\unexpanded\def\setstrut + {% height + \edef\strutheight + {\the\dimexpr\spacingfactor\dimexpr + \ifdim\minimumstrutheight>\zeropoint + \minimumstrutheight + \else + \strutheightfactor\dimexpr\normallineheight + \fi}% + % depth + \edef\strutdepth + {\the\dimexpr + \ifgridsnapping + \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth + \else + \normallineheight-\strutheight + \fi + \else + \spacingfactor\dimexpr + \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth + \else + \strutdepthfactor\dimexpr\normallineheight + \fi + \fi}% + % finish + \dosetstrut} + +\unexpanded\def\setcharstrut#1% + {\setbox\strutbox\normalhbox{#1}% + \edef\strutheight{\the\strutht}% + \edef\strutdepth {\the\strutdp}% + \dosetstrut} + +% \def\setfontstrut +% {\setcharstrut{(}} +% +% better, since some fonts have small (but descending Q etc) + +\unexpanded\def\setfontstrut + {\setcharstrut{(gplQT}} + +\unexpanded\def\setcapstrut% could be M, but Q has descender + {\setcharstrut{Q}} + +%D Handy for math (used in mathml): + +\def\charhtstrut + {\begingroup + \setcharstrut{GJY}% + \vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht + \endgroup} + +\def\chardpstrut + {\begingroup + \setcharstrut{gjy}% + \vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint + \endgroup} + +%D Centered looks nicer: + +% \def\dosetstrut +% {\let\strut\normalstrut +% \setbox\strutbox\normalhbox +% {\normalhbox to \zeropoint +% {% \hss % new, will be option +% \vrule +% \!!width \strutwidth +% \!!height\strutheight +% \!!depth \strutdepth +% \hss}}% +% \struttotal\dimexpr\strutht+\strutdp\relax} +% +% because of all the callbacks in mkiv, we avoid unnecessary boxes ... +% maybe use an attribute so that we can tag boxes that don't need a +% treatment; tests with using an attribute so far have shown that +% it's slower because testing the attribute takes time too + +\def\dosetstrut + {\let\strut\normalstrut + \ifdim\strutwidth=\zeropoint + \setbox\strutbox\normalhbox + {\vrule + \!!width \zeropoint + \!!height\strutheight + \!!depth \strutdepth}% + \else + \setbox\strutbox\normalhbox + {\normalhbox to \zeropoint + {% \hss % new, will be option + \vrule + \!!width \strutwidth + \!!height\strutheight + \!!depth \strutdepth + \hss}}% + \fi + \struttotal\dimexpr\strutht+\strutdp\relax} + +%D The dimen \type {\struttotal} holds the exact size of the +%D strut; occasionally a one scaled point difference can show +%D up with the lineheight. + +%D Sometimes a capstrut comes in handy +%D +%D \starttabulate[|Tl|l|l|] +%D \NC yes \NC normal strut \NC {\showstruts\setupstrut[yes]\strut} \NC \NR +%D \NC no \NC no strut \NC {\showstruts\setupstrut[no]\strut} \NC \NR +%D \NC kap \NC a capital strut (i.e. Q) \NC {\showstruts\setupstrut[cap]\strut} \NC \NR +%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR +%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR +%D \stoptabulate + +\def\setupstrut + {\dosingleempty\dosetupstrut} + +\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut + {\processaction + [#1] + [ \v!yes=>\setstrut, + \v!auto=>\setautostrut, + \v!no=>\setnostrut, + \v!cap=>\setcapstrut, + \v!fit=>\setfontstrut, + \v!line=>\setstrut, + \s!default=>\setstrut, + \s!unknown=>\setcharstrut\commalistelement]} + +\def\setteststrut + {\def\strutwidth{.8pt}% + \setstrut} + +\def\autostrutfactor{1.1} + +\def\setautostrut + {\begingroup + \setbox\scratchbox\copy\strutbox + \setstrut + \ifdim\ht\strutbox>\autostrutfactor\ht\scratchbox + \endgroup \setstrut + \else\ifdim\dp\strutbox>\autostrutfactor\dp\scratchbox + \endgroup \setstrut + \else + \endgroup + \fi\fi} + +% simple version +% +% \def\begstrut +% {\relax\ifcase\strutht\else +% \strut +% \normalpenalty\plustenthousand +% \normalhskip\zeropoint +% \ignorespaces +% \fi} +% +% \def\endstrut +% {\relax\ifhmode\ifcase\strutht\else +% \removeunwantedspaces +% \normalpenalty\plustenthousand +% \normalhskip\zeropoint +% \strut +% \fi\fi} + +% 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 + \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 + \else + \removeunwantedspaces + \normalpenalty\plustenthousand + \normalhskip\zeropoint + \strut + \fi + \fi\fi} + +\newbox\nostrutbox \setbox\nostrutbox\normalhbox{} % {\normalhbox{}} + +\def\setnostrut + {\setbox\strutbox\copy\nostrutbox + \let\strut\empty + \let\endstrut\empty + \let\begstrut\empty + \let\crlfplaceholder\empty} + +% unsave: +% +% \def\pseudostrut +% {\bgroup +% \setnostrut +% \normalstrut +% \egroup} +% +% try: +% +% \startchemie +% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C] +% \stopchemie +% +% so: + +\def\pseudostrut + {\noindent} % better: \dontleavehmode + +\let\pseudobegstrut\pseudostrut + +\let\pseudoendstrut\removeunwantedspaces + +\def\resetteststrut + {\let\strutwidth\zeropoint + \setstrut} + +\ifx\setfontparameters\undefined + % problems ! ! ! ! + \def\setfontparameters{\the\everybodyfont} +\fi + +%D Handy: + +\def\baselinedistance{\the\lineheight} + +%D We need \type{\normaloffinterlineskip} because the new +%D definition contains an assignment, and |<|don't ask me +%D why|>| this assignment gives troubles in for instance the +%D visual debugger. + +%D The plain ones: + +\def\offinterlineskip + {\baselineskip-\thousandpoint + \lineskip\zeropoint + \lineskiplimit\maxdimen} + +\def\nointerlineskip + {\prevdepth-\thousandpoint} + +\let\normaloffinterlineskip=\offinterlineskip % knuth's original + +%D My own one: + +\def\offinterlineskip + {\ifdim\baselineskip>\zeropoint + \edef\oninterlineskip + {\baselineskip\the\baselineskip + \lineskip\the\lineskip + \lineskiplimit\the\lineskiplimit + \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}% + \else + \let\oninterlineskip\setnormalbaselines + \fi + \normaloffinterlineskip} + +\let\oninterlineskip=\relax + +\def\leaveoutervmode + {\ifvmode\ifinner\else + \leavevmode + \fi\fi} + +% We stellen enkele penalties anders in dan Plain TEX: + +% oud +% +% \widowpenalty=\defaultwidowpenalty\relax +% \clubpenalty =\defaultclubpenalty \relax + +\def\resetpenalties#1% + {\ifx#1\undefined\else + #1\minusone + \fi} + +\def\setpenalties#1#2#3% + {\ifx#1\undefined\else % 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 +%D Dirty hack, needed in margin content that can run of a page. + +\def\keeplinestogether#1% + {\xdef\restoreinterlinepenalty{\global\resetpenalties\interlinepenalties}% + \global\setpenalties\interlinepenalties{#1}\plustenthousand} + +\newif\ifgridsnapping % to be sure + +\def\defaultwidowpenalty {2000} % was: 1000 +\def\defaultclubpenalty {2000} % was: 800 +\def\defaultdisplaywidowpenalty {50} +\def\defaultbrokenpenalty {100} + +\def\defaultgridwidowpenalty {0} +\def\defaultgridclubpenalty {0} +\def\defaultgriddisplaywidowpenalty {0} +\def\defaultgridbrokenpenalty {0} + +% The original approach: +% +% \def\setdefaultpenalties +% {\ifgridsnapping +% \widowpenalty\defaultgridwidowpenalty +% \clubpenalty \defaultgridclubpenalty +% \else +% \widowpenalty\defaultwidowpenalty +% \clubpenalty \defaultclubpenalty +% \fi} +% +% However, we will use setups: + +% to be documented + +\def\nopenalties + {\widowpenalty \zerocount + \clubpenalty \zerocount + \brokenpenalty \zerocount + \doublehyphendemerits\zerocount + \finalhyphendemerits \zerocount + \adjdemerits \zerocount} + +\def\setdefaultpenalties + {\directsetup{\systemsetupsprefix\s!default}} + +\startsetups [\systemsetupsprefix\s!reset] + \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} + + \widowpenalty \defaultwidowpenalty + \clubpenalty \defaultclubpenalty + \displaywidowpenalty\defaultdisplaywidowpenalty + \brokenpenalty \defaultbrokenpenalty + +\stopsetups + +\startsetups [\v!grid] [\systemsetupsprefix\s!default] + + \directsetup{\systemsetupsprefix\s!reset} + + \widowpenalty \defaultgridwidowpenalty + \clubpenalty \defaultgridclubpenalty + \displaywidowpenalty\defaultgriddisplaywidowpenalty + \brokenpenalty \defaultgridbrokenpenalty + +\stopsetups + +% as an illustration: + +\startsetups [\systemsetupsprefix\v!strict] + + \directsetup{\systemsetupsprefix\s!reset} + + \setpenalties\widowpenalties2\maxdimen + \setpenalties\clubpenalties 2\maxdimen + \brokenpenalty \maxdimen + +\stopsetups + +\setdefaultpenalties % will happen later in \setuplayout + +% Suggested by GB (not the name -): + +\def\rapfillskip{.5\hsize plus .092\hsize minus .5\hsize} % D.A.'s value + +% Bovendien definieren we enkele extra \fill's: + +\def\hfilll{\hskip\zeropoint\!!plus1filll\relax} +\def\vfilll{\vskip\zeropoint\!!plus1filll\relax} + +% De onderstaande hulpmacro's moeten nog eens instelbaar worden +% gemaakt. + +\def\tfskipsize{1em\relax} +\def\tfkernsize{1ex\relax} + +\def\tfskip{\dotfskip\tfskipsize} +\def\tfkern{\dotfkern\tfkernsize} + +\def\dotfskip#1{{\tf\hskip#1}} +\def\dotfkern#1{{\tf\kern #1}} + +% needs a proper \definenarrower or installnarrower + +\newskip\ctxleftskip +\newskip\ctxrightskip +\newskip\ctxmidskip + +\def\dosinglenarrower#1% + {\processaction + [#1] + [ \v!left=>\global\advance\ctxleftskip \@@slleft, + \v!middle=>\global\advance\ctxmidskip \@@slmiddle, + \v!right=>\global\advance\ctxrightskip \@@slright, + \v!reset=>\global\ctxleftskip \zeropoint + \global\ctxmidskip \zeropoint + \global\ctxrightskip\zeropoint, + \v!none=>, + \s!unknown=>\global\advance\ctxmidskip \commalistelement]} + +% \def\donarrower[#1]% hm, can be dorepeat directly +% {\processaction +% [#1] +% [ \v!left=>\global\advance\ctxleftskip \@@slleft, +% \v!middle=>\global\advance\ctxmidskip \@@slmiddle, +% \v!right=>\global\advance\ctxrightskip \@@slright, +% \v!none=>,% handy for delimitedtexts +% \s!unknown=>{\dorepeatwithcommand[#1]\dosinglenarrower}]} + +\def\donarrower[#1]% hm, can be dorepeat directly + {\dorepeatwithcommand[#1]\dosinglenarrower} + +\def\complexstartnarrower[#1]% + {\@@slbefore % was hard coded \par + \bgroup + \global\ctxleftskip \zeropoint + \global\ctxrightskip\zeropoint + \global\ctxmidskip \zeropoint + \processcommalistwithparameters[#1]\donarrower + \advance\leftskip \ctxleftskip + \advance\rightskip \ctxrightskip + \advance\leftskip \ctxmidskip + \advance\rightskip \ctxmidskip + \seteffectivehsize} + +% todo: definenarrower + +\def\simplestartnarrower + {\startnarrower[\v!middle]} + +\definecomplexorsimple\startnarrower + +\def\stopnarrower + {\@@slafter % was hard coded \par / needed, else skips forgotten + \egroup} + +\def\setupnarrower + {\dodoubleargument\getparameters[\??sl]} + +\newdimen\@@effectivehsize \def\effectivehsize {\hsize} +\newdimen\@@effectiveleftskip \def\effectiveleftskip {\leftskip} +\newdimen\@@effectiverightskip \def\effectiverightskip{\rightskip} + +\def\seteffectivehsize + {\setlocalhsize + \@@effectivehsize \localhsize + \@@effectiveleftskip \leftskip + \@@effectiverightskip \rightskip + \let\effectivehsize \@@effectivehsize + \let\effectiveleftskip \@@effectiveleftskip + \let\effectiverightskip\@@effectiverightskip} + +\def\dodefinehbox[#1][#2]% + {\setvalue{hbox#1}##1% + {\hbox to #2{\begstrut##1\endstrut\hss}}} + +\def\definehbox + {\dodoubleargument\dodefinehbox} + +\def\iobox#1#2#3#% here #3# is not really needed + {\vbox\bgroup % we want to return a vbox like the others + \hbox\bgroup% we need to pack the signal with the box + \signalrightpage + \dowithnextboxcontent + {\let\\=\endgraf\forgetall\doifrightpageelse#1#2} + {\box\nextbox\egroup\egroup} + \vbox#3} + +\def\obox{\iobox\raggedleft \raggedright} % outerbox +\def\ibox{\iobox\raggedright\raggedleft} % innerbox + +\def\dosetraggedvbox#1% + {\let\raggedbox\vbox + \processfirstactioninset + [#1] + [ \v!left=>\let\raggedbox\lbox, + \v!right=>\let\raggedbox\rbox, + \v!middle=>\let\raggedbox\cbox, + \v!inner=>\let\raggedbox\ibox, + \v!outer=>\let\raggedbox\obox, + \v!flushleft=>\let\raggedbox\rbox, + \v!flushright=>\let\raggedbox\lbox, + \v!center=>\let\raggedbox\cbox, + \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]} + +\def\dosetraggedhbox#1% + {\let\raggedbox\hbox + \processaction % slow + [#1] + [ \v!left=>\def\raggedbox{\doalignedline\v!left }, + \v!right=>\def\raggedbox{\doalignedline\v!right }, + \v!middle=>\def\raggedbox{\doalignedline\v!middle}, + \v!inner=>\def\raggedbox{\doalignedline\v!inner }, + \v!outer=>\def\raggedbox{\doalignedline\v!outer }, + \v!flushleft=>\def\raggedbox{\doalignedline\v!right }, + \v!flushright=>\def\raggedbox{\doalignedline\v!left }, + \v!center=>\def\raggedbox{\doalignedline\v!middle}]} + +\def\dosetraggedcommand#1% + {\expanded{\dodosetraggedcommand{#1}}} + +% \def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! +% {\let\raggedcommand \relax +% \let\raggedtopcommand \empty +% \let\raggedbottomcommand\empty +% \chardef\raggedoneliner\zerocount +% \doifsomething{#1} +% {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse +% \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse +% \!!donectrue +% \rawprocesscommalist[#1]\dododosetraggedcommand}} + +\newtoks\everyraggedcommand + +\def\raggedcommand{\the\everyraggedcommand} + +\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! + {\everyraggedcommand \emptytoks + \let\raggedtopcommand \empty + \let\raggedbottomcommand\empty + \chardef\raggedoneliner\zerocount + \doifsomething{#1} + {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse + \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse + \!!donectrue + \rawprocesscommalist[#1]\dododosetraggedcommand}} + +\def\dododosetraggedcommand#1% + {\executeifdefined{\@@ragged@@command\string#1}\relax} + +\def\@@ragged@@command{@@raggedcommand} + +\setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nohz }{\appendtoks\disableadjusting \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!spacing }{\appendtoks\enablespacehandling + \enablekernhandling \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nospacing }{\appendtoks\disablespacehandling + \disablekernhandling \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!hyphenated }{\appendtoks\dohyphens \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!nothyphenated}{\appendtoks\nohyphens \to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!tolerant }{\appendtoks\tolerance3000\relax \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!verytolerant}{\appendtoks\tolerance4500\relax \to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!stretch }{\appendtoks\emergencystretch\bodyfontsize\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!left}% + {\if!!donea \appendtoks\veryraggedleft\to\everyraggedcommand + \else \appendtoks\raggedleft \to\everyraggedcommand + \fi + \!!donecfalse} + +\setvalue{\@@ragged@@command\v!right}% + {\if!!donea \appendtoks\veryraggedright\to\everyraggedcommand + \else \appendtoks\raggedright \to\everyraggedcommand + \fi + \!!donecfalse} + +\setvalue{\@@ragged@@command\v!middle}% + {\if!!donec + \if!!doneb \appendtoks\raggedwidecenter\to\everyraggedcommand + \else\if!!donea \appendtoks\veryraggedcenter\to\everyraggedcommand + \else \appendtoks\raggedcenter \to\everyraggedcommand + \fi\fi + \!!donecfalse + \else + \let\raggedbottomcommand\vfilll % bonus, pretty strong + \let\raggedtopcommand \vfilll % used with \framed for + \fi} % instance in tables + +\setvalue{\@@ragged@@command\v!flushleft }{\getvalue{\@@ragged@@command\v!right }} +\setvalue{\@@ragged@@command\v!flushright}{\getvalue{\@@ragged@@command\v!left }} +\setvalue{\@@ragged@@command\v!center }{\getvalue{\@@ragged@@command\v!middle}} + +\setvalue{\@@ragged@@command\v!high}% + {\let\raggedbottomcommand\vfilll} % and since we lack a + +\setvalue{\@@ragged@@command\v!low}% + {\let\raggedtopcommand\vfilll} % proper keyword, but + +\setvalue{\@@ragged@@command\v!lohi}% + {\let\raggedbottomcommand\vfilll % we do support the + \let\raggedtopcommand\vfilll} % ugly laho (lohi) + +\setvalue{\@@ragged@@command\v!no}% + {\appendtoks\raggedright\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!yes}% + {\appendtoks\notragged\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!normal}% + {\appendtoks\notragged\to\everyraggedcommand} + +\setvalue{\@@ragged@@command\v!inner}% not yet perfect + {\signalrightpage % may interfere + \doifrightpageelse + {\getvalue{\@@ragged@@command\v!right}} + {\getvalue{\@@ragged@@command\v!left}}} + +\setvalue{\@@ragged@@command\v!outer}% not yet perfect + {\signalrightpage % may interfere + \doifrightpageelse + {\getvalue{\@@ragged@@command\v!left}} + {\getvalue{\@@ragged@@command\v!right}}} + +\setvalue{\@@ragged@@command\v!lesshyphenation}% + {\appendtoks\lesshyphens\to\everyraggedcommand} +\setvalue{\@@ragged@@command\v!morehyphenation}% + {\appendtoks\morehyphens\to\everyraggedcommand} + +% compare: +% +% \framed[width=4cm,align=no] {\hfil xxx} +% \framed[width=4cm,align=disable]{\hfil xxx} + +\setvalue{\@@ragged@@command\v!disable}% for one liners + {\appendtoks\raggedright\parfillskip\zeropoint\to\everyraggedcommand} + +\chardef\raggedoneliner\zerocount + +\setvalue{\@@ragged@@command\v!line}% + {\chardef\raggedoneliner\plusone} + +%D Unofficial, may disappear. Now handled directly in the +%D core-rul module. + +% \def\@@startraggedoneliner +% {\ifcase\raggedoneliner\else +% \dontleavehmode\hbox to \hsize \bgroup % hsize added, else useless +% \ifcase\raggedstatus\or\hss\or\hss\fi +% \ignorespaces +% \bgroup +% \aftergroup\removeunwantedspaces +% \fi} + +% \def\@@stopraggedoneliner +% {\ifcase\raggedoneliner\else +% \egroup +% \ifcase\raggedstatus\or\or\hss\or\hss\fi +% \egroup +% \ignorespaces % ? ? ? +% \fi} + +% \def\@@handleoneliner +% {\ifcase\raggedoneliner\else +% \@@startraggedoneliner +% \aftergroup\@@stopraggedoneliner +% \fi} + +% Nog doen: +% +% \goodbreak -> \allowbreak en \dosomebreak{..} in koppen +% +% bij koppen zowieso: \blanko[reset] + +% Nog in commando verwerken: +% +% \voorkeur … la \blanko +% +% Om ongewenste witruimte te voorkomen kan met \dosomebreak{\break} +% een \penalty voor witruimte worden geplaatst. + +\def\removelastskip % a redefinition of plain + {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi} + +% first version: +% +% \def\dosomebreak#1% +% {\scratchskip\lastskip +% \removelastskip +% %\type{#1}% +% #1\relax +% \ifdim\scratchskip=\zeropoint \else +% \vskip\scratchskip +% \fi} +% +% don't change the next improvement: + +% \def\dosomebreak#1% +% {\endgraf % beware, this forces a newline +% \ifvmode +% \ifdim\lastskip=\zeropoint +% #1\relax +% \else +% \scratchskip\lastskip +% \removelastskip +% #1\relax +% \vskip\scratchskip +% \fi +% \fi} + +% beter, vooral in \vbox; nog in \pagina toepassen s! + +\def\doifoutervmode#1% + {\ifvmode\ifinner\else#1\fi\fi} + +\ifx\dosomebreak\undefined % defined in mkiv + + \def\dosomebreak#1% + {\doifoutervmode + {\scratchskip\lastskip + \removelastskip + %\leavevmode\type{#1}% + #1\relax + \ifdim\scratchskip=\zeropoint % else interference with footnotes + \else + \vskip\scratchskip + \fi}} + +\fi + +\def\forgeteverypar + {\everypar{\the\neverypar}} + +%\def\forgetparindent +% {\forgeteverypar +% \indentfirstparagraphtrue % recently added +% \setupindenting[\v!geen]} + +%\def\forgetparskip +% {\setupwhitespace[\v!geen]} + +\def\forgetparindent + {\forgeteverypar + \indentfirstparagraphtrue % recently added + \let\currentindentation\v!none + \ctxparindent\zeropoint + \parindent\zeropoint\relax} + +\def\forgetparskip + {\let\currentwhitespace\v!none + \ctxparskip\zeropoint + \parskip\zeropoint\relax} + +\def\forgetbothskips + {\tolerance1500 + \leftskip\zeropoint + \rightskip\zeropoint\relax} + +\def\forgetspacing + {\emergencystretch\zeropoint} + +\newif\ifforgotten % rather good signal for inner + +\appendtoks \forgottentrue \to \everyforgetall +\appendtoks \forgetragged \to \everyforgetall +\appendtoks \forgetparskip \to \everyforgetall +\appendtoks \forgetparindent \to \everyforgetall +\appendtoks \forgetbothskips \to \everyforgetall +\appendtoks \forgetspacing \to \everyforgetall % i.v.m. funny spacing in pagebody +\appendtoks \spacing\!!plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed +\appendtoks \everypar\emptytoks \to \everyforgetall % indeed! + +\def\localvbox#1#% + {\vbox#1\bgroup + \forgetparskip + \setlocalhsize + \hsize\localhsize + \forgetparindent + \forgetbothskips + \forgeteverypar + \let\next=} + +% ach ja, hoort niet hier + +% \unexpanded\def\dostartattributes#1#2#3% +% {\begingroup % geen \bgroup, anders in mathmode lege \hbox +% \doifdefinedelse{#1#2} +% {\def\fontattribute{\getvalue{#1#2}}} +% {\let\fontattribute=\empty}% +% \doifdefinedelse{#1#3} +% {\def\colorattribute{\getvalue{#1#3}}} +% {\let\colorattribute=\empty}% +% \startcolor[\colorattribute]% +% \@EA\doconvertfont\@EA{\fontattribute}} +% +% \unexpanded\def\dostopattributes% +% {\stopcolor +% \endgroup} +% +% \unexpanded\def\doattributes#1#2#3#4% +% {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes} + +%D A hardly faster implementation follows. We cannot use +%D \type {csname} testing since the first argument can be +%D anything, even a raw fontswitch. No a real improvement +%D (some 5 seconds on 260 seconds for the maps bibliography). + +\let\dostopattributes\relax % in case these commands end up in an edef + +\unexpanded\def\dostartattributes#1#2#3% + {\begingroup % geen \bgroup, anders in mathmode lege \hbox + \ifcsname#1#3\endcsname + \let\dostopattributes\@@dostopattributes + \startcolor[\csname#1#3\endcsname]% + \else + \let\dostopattributes\@@nostopattributes + \fi + \ifcsname#1#2\endcsname + \expandafter\doconvertfont + \else + \expandafter\gobbleoneargument + \fi{\csname#1#2\endcsname}} + +\newconditional \parbasedattributes + +\def\finishparbasedattributes + {\ifconditional\parbasedattributes + \setfalse\parbasedattributes + \par + \fi} + +\def\dostopparbasedattributes + {\settrue\parbasedattributes + \dostopattributes} + +\unexpanded\def\@@dostopattributes + {\stopcolor + \finishparbasedattributes + \endgroup} + +\unexpanded\def\@@nostopattributes + {\finishparbasedattributes + \endgroup} + +\unexpanded\def\doattributes#1#2#3#4% + {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes} + +% An even faster \ETEX\ version: + +\unexpanded\def\dostartattributes#1#2#3% + {\begingroup % geen \bgroup, anders in mathmode lege \hbox + \ifincolor + \ifcsname#1#3\endcsname + \let\dostopattributes\@@dostopattributes + \faststartcolor[\csname#1#3\endcsname]% + \else + \let\dostopattributes\@@nostopattributes + \fi + \else + \let\dostopattributes\@@nostopattributes + \fi + \ifcsname#1#2\endcsname + % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname + \@EA\doconvertfont\csname#1#2\@EA\endcsname + \fi} + +\unexpanded\def\@@dostopattributes + {\faststopcolor + \finishparbasedattributes + \endgroup} + +\unexpanded\def\@@nostopattributes + {\finishparbasedattributes + \endgroup} + +%D Bonus macro, see core-sec.tex + +\unexpanded\def\dosetfontattribute#1#2% + {\ifcsname#1#2\endcsname + \@EA\doconvertfont\csname#1#2\@EA\endcsname + \fi\empty} + +%D Since this happens a lot, and sometimes large arguments +%D are passed in \type {#4}, we just copy some code: + +\unexpanded\def\doattributes#1#2#3#4% + {\begingroup % geen \bgroup, anders in mathmode lege \hbox + \ifincolor + \ifcsname#1#3\endcsname + \let\dostopattributes\@@dostopattributes + \faststartcolor[\csname#1#3\endcsname]% + \else + \let\dostopattributes\endgroup + \fi + \else + \let\dostopattributes\endgroup + \fi + \ifcsname#1#2\endcsname + % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname + \@EA\doconvertfont\csname#1#2\@EA\endcsname + \fi + {#4}% + \dostopattributes} + +% Kan vaker worden toegepast en moet bovendien sneller! + +\newskip\leftskipadaption +\newskip\rightskipadaption + +\def\doadaptleftskip#1% + {\dosetleftskipadaption{#1}% + \advance\leftskip \leftskipadaption} + +\def\doadaptrightskip#1% + {\dosetrightskipadaption{#1}% + \advance\rightskip \rightskipadaption} + +\setvalue{@lsa@\v!standard}{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} +\setvalue{@lsa@\v!yes }{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} +\letvalue{@lsa@\v!no }\zeropoint +\letvalue{@lsa@\empty }\zeropoint +\setvalue{@rsa@\v!standard}{\@@slright} +\setvalue{@rsa@\v!yes }{\@@slright} +\letvalue{@rsa@\v!no }\zeropoint +\letvalue{@rsa@\empty }\zeropoint + +% not safe for 2\parindent +% +% \def\dosetleftskipadaption#1% +% {\leftskipadaption +% \ifcsname @lsa@#1\endcsname +% \csname @lsa@#1\endcsname +% \else +% #1% +% \fi +% \relax} + +\def\dosetleftskipadaption#1% + {\edefconvertedargument\ascii{@lsa@#1}% + \leftskipadaption + \ifcsname\ascii\endcsname + \csname\ascii\endcsname + \else + #1% + \fi + \relax} + +\def\dosetrightskipadaption#1% + {\edefconvertedargument\ascii{@rsa@#1}% + \rightskipadaption + \ifcsname\ascii\endcsname + \csname\ascii\endcsname + \else + #1% + \fi + \relax} + +\newcount \noftrackedpagestates +\newif \ifpagestatemismatch +\newcount \realpagestateno +\chardef \frozenpagestate \zerocount + +\def\dotrackpagestate#1#2% + {\ifdoublesided \ifinpagebody \else + \doforcedtrackpagestate{#1}{#2}% + \fi \fi} + +\def\doforcedtrackpagestate#1#2% + {\ifcase\frozenpagestate + \global\advance\noftrackedpagestates\plusone + \global\advance#2\plusone + \lazysavetaggedtwopassdata{#1}{\number\noftrackedpagestates}{\number#2}{\noexpand\realfolio}% + %\llap{\infofont\number\noftrackedpagestates/\number#2}% tracing + \fi} + +\def\doifrightpagestateelse#1#2% + {\ifcase\frozenpagestate + \pagestatemismatchfalse + \realpagestateno\realfolio + \ifinpagebody + \ifdoublesided + \ifodd\realpageno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \else + \twopassdatafoundtrue + \fi + \else\ifdoublesided + \findtwopassdata{#1}{\number#2}% + \iftwopassdatafound + \realpagestateno\twopassdata\relax + \ifnum\twopassdata=\realpageno \else + \pagestatemismatchtrue + \fi + \ifodd\twopassdata\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \else + \ifodd\realpageno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \else + \twopassdatafoundtrue + \fi\fi + \else + \ifodd\realpagestateno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \iftwopassdatafound + \@EA\firstoftwoarguments + \else + \@EA\secondoftwoarguments + \fi} + +\def\doifforcedrightpagestateelse#1#2% + {\ifcase\frozenpagestate + \pagestatemismatchfalse + \realpagestateno\realfolio + \findtwopassdata{#1}{\number#2}% + \iftwopassdatafound + \realpagestateno\twopassdata\relax + \ifnum\twopassdata=\realpageno \else + \pagestatemismatchtrue + \fi + \ifodd\twopassdata\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \else + \ifodd\realpageno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \else + \ifodd\realpagestateno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \iftwopassdatafound + \@EA\firstoftwoarguments + \else + \@EA\secondoftwoarguments + \fi} + +\def\freezepagestate {\chardef\frozenpagestate\plusone } +\def\defrostpagestate{\chardef\frozenpagestate\zerocount} + +% we can make more of these on top, but how to deal with mixed frozen states + +\definetwopasslist\s!paragraph \newcount \nofraggedparagraphs + +\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs} +\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs} + +\newcount\pagesignallevel + +\def\startsignalrightpage % one may do a \postsignalrightplace + {\advance\pagesignallevel\plusone + \presignalrightpage + \let\signalrightpage\relax + \let\presignalrightpage\relax + \let\startsignalrightpage\relax + \doifrightpageelse\donothing\donothing + \freezepagestate} + +\def\stopsignalrightpage + {\ifcase\pagesignallevel\or\postsignalrightpage\fi + \advance\pagesignallevel\minusone} + +\def\setraggedparagraphmode + {\signalrightpage\doifrightpageelse} % move it there + +\ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo + +\def\doifswappedrightpageelse#1#2% alleen in box construction ! + {\doifrightpageelse + {#1} + {\scratchcounter\realpageno + \realpageno\realpagestateno\relax + \swapmargins + \realpageno\scratchcounter + #2}} + +\newbox\signaledrightpage % this way we can avoid interference, i.e. postpone placement + +\def\presignalrightpage {\global\setbox\signaledrightpage\hbox{\signalrightpage}} +\def\postsignalrightpage{\ifvoid\signaledrightpage\else\box\signaledrightpage\fi} + +% The next feature is is used in: +% +% \definenumber[test][way=bypage] +% +% \def\Test +% {\incrementnumber[test]\rawnumber[test]/% +% \incrementnumber[test]\rawnumber[test]/% +% \incrementnumber[test]\rawnumber[test]\space +% \checkpagechange{oeps}\changedpage{oeps}\space +% \ifpagechanged TRUE\else FALSE\fi} +% +% \Test\page \Test\par \Test\page \Test\par \Test\page \Test\page +% +% (adapted from cont-new.tex:) + +\newif\ifpagechanged \let\lastchangedpage\empty + +\def\docheckpagestatechange#1#2#3% + {\pagechangedfalse + \doforcedtrackpagestate{#2}{#3}% + \findtwopassdata{#2}{\number#3}% + \iftwopassdatafound + \ifnum\twopassdata>0\getvalue{#2:p:#1}\relax + \pagechangedtrue + \fi + \fi + \ifpagechanged + \letgvalue{#2:p:#1}\twopassdata + \globallet\lastchangedpage\twopassdata + \else + \globallet\lastchangedpage\realfolio + \fi} + +\def\changedpagestate#1#2% + {\executeifdefined{#2:p:#1}{0}} + +\def\checkpagechange#1{\docheckpagestatechange{#1}\s!paragraph\nofraggedparagraphs} +\def\changedpage #1{\changedpagestate{#1}\s!paragraph} + +% saved struts + +\ifx\savedstrutbox\undefined \newbox\savedstrutbox \fi + +\def\savestrut {\setbox\savedstrutbox\copy\strutbox} +\def\savedstrut{\copy \savedstrutbox} + +% De onderstaande macro's zijn opgenomen in Plain TeX. +% +% \def\raggedright% +% {\rightskip\zeropoint plus2em \spaceskip.3333em \xspaceskip.5em\relax} +% +% \def\ttraggedright% +% {\tttf\rightskip\zeropoint plus2em\relax} +% +% \newif\ifr@ggedbottom +% +% \def\raggedbottom% +% {\topskip 10\points plus60\points \r@ggedbottomtrue} +% +% \def\normalbottom% +% {\topskip 10\points \r@ggedbottomfalse} +% +% en worden hieronder wat aangepast. + +% the three boolean will become obsolete some day in favour +% of \bottomraggedness + +\chardef\bottomraggedness=0 % 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 + {\chardef\bottomraggedness\zerocount + \n@rmalbottomfalse + \r@ggedbottomtrue + \b@selinebottomfalse + \settopskip} + +\def\alignbottom + {\chardef\bottomraggedness\plusone + \n@rmalbottomtrue + \r@ggedbottomfalse + \b@selinebottomfalse + \settopskip} + +\def\baselinebottom + {\chardef\bottomraggedness\plustwo + \n@rmalbottomfalse + \r@ggedbottomfalse + \b@selinebottomtrue + \settopskip} + +\let\normalbottom=\alignbottom % downward compatible + +% so, the new one will be +% +% \chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline +% +% \def\bottomalignlimit{3\lineheight} % will be settable +% +% \def\raggedbottom {\chardef\bottomraggedness=0 \settopskip} +% \def\alignbottom {\chardef\bottomraggedness=1 \settopskip} +% \def\baselinebottom{\chardef\bottomraggedness=2 \settopskip} +% +% \let\normalbottom =\alignbottom + +% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness +% \tolerance >= 1500 % was 200 +% \raggedness = 2 .. 6\bodyfontsize + +\chardef\raggedstatus=0 % normal left center right + +\def\leftraggedness {2\bodyfontsize} +\def\rightraggedness {2\bodyfontsize} +\def\middleraggedness {6\bodyfontsize} + +\def\middleraggedness {.5\hsize} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} + +% oeps, hsize can be 0pt in which case we get a strange division + +\def\middleraggedness {\ifdim\hsize=\zeropoint6\bodyfontsize\else.5\hsize\fi} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} + +%D More hyphenation control, will be combined with align +%D setup. + +\def\nohyphens + {\ifx\dohyphens\relax + \edef\dohyphens + {\hyphenpenalty\the\hyphenpenalty + \exhyphenpenalty\the\exhyphenpenalty\relax}% + \fi + \hyphenpenalty\plustenthousand + \exhyphenpenalty\plustenthousand} + +\let\dohyphens\relax + +%D To prevent unwanted side effects, we also have to check +%D for hyphens here: + +% \def\setraggedness#1% +% {\ifnum\tolerance<1500\relax % small values have +% \tolerance1500\relax % unwanted side effects +% \fi +% \spaceskip2.5\hsize % we misuse these registers +% \xspaceskip#1\relax % for temporary storage; +% \divide\spaceskip \xspaceskip % they are changed anyway +% \ifx\dohyphens\relax +% \hyphenpenalty\spaceskip % \else no hyphens is active +% \fi} + +\newskip\@@raggedskipa +\newskip\@@raggedskipb + +\def\setraggedness#1% + {\ifnum\tolerance<1500\relax % small values have + \tolerance1500\relax % unwanted side effects + \fi + \ifx\dohyphens\relax + % this code will be reconsidered / kind of fuzzy (and old) + \@@raggedskipa 2.5\hsize + \@@raggedskipb #1\relax + \divide\@@raggedskipa \@@raggedskipb + \hyphenpenalty\@@raggedskipa + \fi} + +\let\updateraggedskips\relax + +\def\setraggedskips#1#2#3#4#5#6#7% never change this name + {\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}% + \updateraggedskips} + +\def\dosetraggedskips#1#2#3#4#5#6#7% + {\chardef \raggedstatus#1\relax + \leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3 + \rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3 + \spaceskip #4\relax + \xspaceskip #5\relax + \parfillskip\zeropoint\!!plus#6\relax + \parindent #7\relax} + +% \def\notragged% +% {\setraggedskips{0}{0em}{0em}{0em}{0em}{1fil}{\parindent}} + +% older (context) names: + +\let\spaceamount \interwordspace +\let\emspaceamount\emwidth + +% tracing: + +\def\doshowpardata#1% + {\ifx#1\relax\else + \hbox{\string#1: \the#1}\endgraf + \expandafter\doshowpardata + \fi} + +\def\showpardata + {\edef\thepardata + {\hbox{font: \fontname\font}\endgraf + \doshowpardata + \interwordspace \interwordstretch \interwordshrink \emwidth \exheight \extraspace + \hsize \vsize + \leftskip \rightskip + \spaceskip \xspaceskip + \parindent \parfillskip + \hyphenpenalty \exhyphenpenalty + \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty + \doublehyphendemerits \finalhyphendemerits \adjdemerits + \relax}% + \begingroup + \dontshowcomposition + \inleftmargin{\vsmash + {\switchtobodyfont[7pt,tt]% + \framed[\c!align=\v!right]{\thepardata}}}% + \endgroup} + +\def\startshowpardata + {\begingroup + \showcomposition + \showstruts\tracepositionstrue \tracingparagraphs\maxdimen + \appendtoksonce\showpardata\let\showpardata\relax\to\everypar} + +\def\stopshowpardata + {\endgraf + \endgroup} + +% \defineXMLenvironment[showpardata] \startshowpardata \stopshowpardata +% \defineXMLsingular [showpardata] \showpardata + +% defaults + +\def\raggedfillamount {1fil} +\def\raggedhalffillamount{.5fil} +\def\raggedspaceamount {\interwordspace} % {.3333em} +\def\raggedxspaceamount {.5em} + +\def\notragged + {\chardef\raggedstatus\zerocount + \leftskip 1\leftskip + \rightskip 1\rightskip + \spaceskip \zeropoint + \xspaceskip \zeropoint + \parfillskip\zeropoint\!!plus\raggedfillamount\relax + \let\updateraggedskips\relax} % new + +\let\forgetragged\notragged + +\def\raggedleft + {\setraggedness\leftraggedness + \setraggedskips1\leftraggedness\zeropoint\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +\def\raggedcenter + {\setraggedness\middleraggedness + \setraggedskips2\middleraggedness\middleraggedness\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +%D We used to have: +%D +%D \starttyping +%D \def\raggedright +%D {\setraggedness\rightraggedness +%D \setraggedskips{3}{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}} +%D \stoptyping +%D +%D However, the next alternative, suggested by Taco, is better. + +\def\raggedright + {\setraggedness\rightraggedness + \setraggedskips3\zeropoint\rightraggedness\raggedspaceamount + \raggedxspaceamount\raggedfillamount\parindent} + +\def\veryraggedleft + {\setraggedskips1\raggedfillamount\zeropoint\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +%D When we want the last line to have a natural width: +%D +%D \starttyping +%D \def\veryraggedleft% +%D {\setraggedskips{1}{1fil}{0em}{.3333em}{.5em}{0em}{-1fil}} +%D \stoptyping +%D +%D but this one is not accepted by the macros. + +\def\veryraggedcenter + {\setraggedskips2\raggedfillamount\raggedfillamount\raggedspaceamount + \raggedxspaceamount\zeropoint\zeropoint} + +\def\veryraggedright + {\setraggedskips3\zeropoint\raggedfillamount\raggedspaceamount + \raggedxspaceamount\zeropoint\parindent} + +\def\ttraggedright + {\tttf + \setraggedskips3\zeropoint\rightraggedness + \zeropoint\zeropoint\zeropoint\parindent} % \ctxparindent + +%D A bonus one: + +\def\raggedwidecenter + {\setraggedness\middleraggedness + \setraggedskips2\raggedhalffillamount\raggedhalffillamount + \raggedspaceamount\raggedxspaceamount\zeropoint\zeropoint} + +\newif\if@@asragged \@@asraggedtrue % old method + +% todo +% +% \setuplayout[grid=yes,lines=44] \showgrid +% \starttext +% test \vfill test \endgraf \strut \endgraf \vskip-\lineheight \removedepth \pagina test +% \stoptext + +% \setupalign[reset,new,right,old] + +\def\@@align@@rl{\if!!donea\veryraggedleft \else\raggedleft \fi} +\def\@@align@@rr{\if!!donea\veryraggedright \else\raggedright \fi} +\def\@@align@@rc{\if!!donea\veryraggedcenter\else\raggedcenter\fi} + +\setvalue{@@ngila@@\v!broad }{\!!doneatrue} +\setvalue{@@ngila@@\v!wide }{\!!donebtrue} + +\def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads + +\installalign \v!new {\@@asraggedfalse} +\installalign \v!old {\@@asraggedtrue} +\installalign \empty {} + +\installalign \v!line {\baselinebottom} +\installalign \v!bottom {\raggedbottom} +\installalign \v!height {\normalbottom} +\installalign \v!width {\notragged} +\installalign \v!normal {\notragged} +\installalign \v!yes {\notragged} +\installalign \v!no {\raggedright} +\installalign \v!inner {\if@@asragged \setraggedparagraphmode\@@align@@rl\@@align@@rr \else + \setraggedparagraphmode\@@align@@rr\@@align@@rl \fi} +\installalign \v!outer {\if@@asragged \setraggedparagraphmode\@@align@@rr\@@align@@rl \else + \setraggedparagraphmode\@@align@@rl\@@align@@rr \fi} +\installalign \v!left {\if@@asragged\@@align@@rl\else\@@align@@rr\fi} +\installalign \v!right {\if@@asragged\@@align@@rr\else\@@align@@rl\fi} +\installalign \v!middle {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} +\installalign \v!flushleft {\if!!donea\veryraggedright \else\raggedright\fi} +\installalign \v!flushright {\if!!donea\veryraggedleft \else\raggedleft \fi} +\installalign \v!flushouter {\setraggedparagraphmode\raggedleft\raggedright} +\installalign \v!flushinner {\setraggedparagraphmode\raggedright\raggedleft} +\installalign \v!center {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi} +\installalign \v!hanging {\enableprotruding} +\installalign \v!nothanging {\disableprotruding} +\installalign \v!hz {\enableadjusting} +\installalign \v!nohz {\disableadjusting} +\installalign \v!spacing {\enablespacehandling \enablekernhandling} +\installalign \v!nospacing {\disablespacehandling\disablekernhandling} +\installalign \v!hyphenated {\dohyphens} +\installalign \v!nothyphenated {\nohyphens} +\installalign \v!new {\@@asraggedfalse} % so new will give you consistency +\installalign \v!reset {\notragged\normalbottom} + +\installalign \v!tolerant {\tolerance3000 \relax} +\installalign \v!verytolerant {\tolerance4500 \relax} +\installalign \v!stretch {\emergencystretch\bodyfontsize} + +\newcount\hyphenminoffset + +\ifx\sethyphenationvariables\undefined \let\sethyphenationvariables\relax \fi + +\def\lesshyphens + {\advance\hyphenminoffset\plusone + \sethyphenationvariables} + +\def\morehyphens + {\ifcase\hyphenminoffset \else + \advance\hyphenminoffset\minusone + \fi + \sethyphenationvariables} + +\installalign \v!lesshyphenation {\lesshyphens} +\installalign \v!morehyphenation {\morehyphens} + +\def\dodosetupalign#1{\csname @@align@@#1\endcsname} +\def\dodosetupngila#1{\csname @@ngila@@#1\endcsname} + +\def\setupalign + {\dosingleargument\dosetupalign} + +\def\dosetupalign[#1]% can be made faster by checking for defined #1 + {\!!doneafalse + \!!donebfalse + \processcommacommand[#1]\dodosetupngila + \processcommacommand[#1]\dodosetupalign} + +% \setupalign[flushleft] \input ward \par % lijnlinks +% \setupalign[right] \input ward \par + +% \setupalign[flushright] \input ward \par % lijnrechts +% \setupalign[left] \input ward \par + +% \setupalign[middle] \input ward \par % centreer +% \setupalign[center] \input ward \par + +\def\startalignment + {\bgroup + \setupalign} + +\def\stopalignment + {\par + \egroup} + +\chardef\alignstrutmode=1 + +% see later for the real definition, which in the simple case is: + +\newtoks \everyleftofalignedline +\newtoks \everyrightofalignedline + +\def\shiftalignedline#1#2#3#4% left, right, inner, outer + {\rightorleftpageaction + {\everyleftofalignedline {\hskip\dimexpr#1+#3\relax}% + \everyrightofalignedline{\hskip\dimexpr#2+#4\relax}} + {\everyleftofalignedline {\hskip\dimexpr#1+#4\relax}% + \everyrightofalignedline{\hskip\dimexpr#2+#3\relax}}} + +% \def\doalignline#1#2% \\ == newline +% {\begingroup +% \setlocalhsize % new +% \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}% +% \dowithnextbox +% {\noindentation % was \noindent +% \dontleavehmode % added in marrakesch at TUG 2006 +% \hbox to \localhsize +% {\ifcase\alignstrutmode\or\strut\fi +% \the\everyleftofalignedline +% #1\unhbox\nextbox#2\relax +% \the\everyrightofalignedline}% +% \endgroup} +% \hbox} + +\def\doalignline#1#2% \\ == newline + {\noindentation % was \noindent + \dontleavehmode % added in marrakesch at TUG 2006\begingroup + \begingroup + \setlocalhsize % new + \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}% + \dowithnextbox + {\hbox to \localhsize + {\ifcase\alignstrutmode\or\strut\fi + \the\everyleftofalignedline + #1\unhbox\nextbox#2\relax + \the\everyrightofalignedline}% + \endgroup} + \hbox} + +% plain commands + +\ifx\undefined\line \def\line {\hbox to\hsize} \fi +\ifx\undefined\leftline \def\leftline #1{\line{#1\hss}} \fi +\ifx\undefined\rightline \def\rightline #1{\line{\hss#1}} \fi +\ifx\undefined\centerline \def\centerline#1{\line{\hss#1\hss}} \fi + +% directe commando's + +\def\leftaligned {\doalignline \relax \hss } +\def\midaligned {\doalignline \hss \hss } +\def\rightaligned{\doalignline \hss \relax} + +\let\centeraligned\midaligned + +\def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated + +% indirecte commando's + +\letvalue{\s!do\v!line\v!left }\leftaligned +\letvalue{\s!do\v!line\v!right }\rightaligned +\letvalue{\s!do\v!line\v!middle }\midaligned +\letvalue{\s!do\v!line\v!flushleft }\rightaligned +\letvalue{\s!do\v!line\v!flushright}\leftaligned +\letvalue{\s!do\v!line\v!center }\midaligned + +\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} + +%D Experimental: + +% simple version +% +% \def\doxalignline#1#2% +% {\bgroup +% \setlocalhsize +% \def\\{\egroup\par\doxalignline{#1}{#2}\bgroup}% inefficient +% \dowithnextbox +% {\noindent\hbox to \localhsize +% {\ifcase\alignstrutmode\or\strut\fi +% \signalrightpage +% \doifrightpageelse{#1\unhbox\nextbox#2}{#2\unhbox\nextbox#1}}% +% \egroup} +% \hbox} +% +% \setvalue{\s!do\v!regel\v!binnen}{\doxalignline\relax\hss} +% \setvalue{\s!do\v!regel\v!buiten}{\doxalignline\hss\relax} +% +% more extensive: + +\def\doxalignline#1#2#3#4#5#6% + {\noindentation % was \noindent + \dontleavehmode % added in marrakesch at TUG 2006\begingroup + \begingroup + \setlocalhsize + \def\\{\egroup\par\doxalignline#1#2#3#4#5#6\bgroup}% inefficient + \dowithnextbox + {%\noindent moved up + \hbox to \localhsize + {#1\hskip\ifdone#2\else#3\fi#4% + \hbox to \localhsize + {\the\everyleftofalignedline + \ifcase\alignstrutmode\or\strut\fi + \ifdone#5\unhbox\nextbox#6\else#6\unhbox\nextbox#5\fi + \the\everyrightofalignedline}% + \hss}% + \endgroup} + \hbox} + +\def\doxcheckline + {\signalrightpage\doifrightpageelse\donetrue\donefalse} + +\setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss } +\setvalue{\s!do\v!line\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax} +\setvalue{\s!do\v!line\v!innermargin}{\doxalignline\doxcheckline-+\innermargintotal\relax\hss } +\setvalue{\s!do\v!line\v!outermargin}{\doxalignline\doxcheckline+-\outermargintotal\hss \relax} +\setvalue{\s!do\v!line\v!inneredge }{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss } +\setvalue{\s!do\v!line\v!outeredge }{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax} +\setvalue{\s!do\v!line\v!backspace }{\doxalignline\doxcheckline-+\backspace \relax\hss } +\setvalue{\s!do\v!line\v!cutspace }{\doxalignline\doxcheckline+-\cutspace \hss \relax} + +\setvalue{\s!do\v!line\v!leftmargin }{\doxalignline\donefalse --\leftmargintotal \hss \relax} +\setvalue{\s!do\v!line\v!rightmargin}{\doxalignline\donefalse ++\rightmargintotal\relax\hss } +\setvalue{\s!do\v!line\v!leftedge }{\doxalignline\donefalse --\leftedgetotal \hss \relax} +\setvalue{\s!do\v!line\v!rightedge }{\doxalignline\donefalse ++\rightedgetotal \relax\hss } + +% ! ! ! beware, redefining \doalignline gives the wrong results ! ! ! +% +% \def\doalignline{\doxalignline\donefalse++\zeropoint} + +%D Better: + +\def\doalignedline#1{\csname\s!do\v!line#1\endcsname} + +% \def\alignedline#1#2% setting default +% {\csname +% \s!do\v!line +% \ifundefined{\s!do\v!line#1}#2\else#1\fi +% \endcsname} + +\def\alignedline#1#2% setting default + {\csname\s!do\v!line\ifcsname\s!do\v!line#1\endcsname#1\else#2\fi\endcsname} + +%D ... + +\def\dosetuptolerance[#1]% + {\doifinsetelse\v!vertical{#1}% + {\ExpandFirstAfter\processallactionsinset + [#1] + [ \v!verystrict=>\def\bottomtolerance{}, + \v!strict=>\def\bottomtolerance{.050}, + \v!tolerant=>\def\bottomtolerance{.075}, + \v!verytolerant=>\def\bottomtolerance{.100}]}% + {\ExpandFirstAfter\processallactionsinset + [#1] + [ \v!stretch=>\emergencystretch\bodyfontsize, + \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax, + \v!verystrict=>\tolerance 200, + \v!strict=>\tolerance1500, + \v!tolerant=>\tolerance3000, + \v!verytolerant=>\tolerance4500]}} + +\def\setuptolerance + {\dosingleargument\dosetuptolerance} + +% \def\woordrechts +% {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}} + +% beware: \wordright{whatever\kern-\rightskip} should work! +% so, no funny boxing here + +\def\dowordright[#1]% + {% don't change + \groupedcommand + {\removeunwantedspaces + \hfill + \allowbreak % changed back from \hskip\zeropoint + \strut + \hfill + \quad % decent spacing + \hbox} + {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}% + \parfillskip\zeropoint + %\finalhyphendemerits\zerocount % yes or no + \par}} + +\def\wordright + {\dosingleempty\dowordright} + +% \dorecurse{5}{something } \wordright{--someone} \endgraf +% \dorecurse{6}{something } \wordright{--someone} \endgraf +% \dorecurse{7}{something } \wordright{--someone} \endgraf +% +% \dorecurse{5}{something } \wordright{--someone else entirely} \endgraf +% \dorecurse{6}{something } \wordright{--someone else entirely} \endgraf +% \dorecurse{7}{something } \wordright{--someone else entirely} \endgraf +% +% \wordright[\rightskip]{whatever} + +% \simplealignedbox{2cm}{right}{x} + +\setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}} +\setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}} +\setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}} +\setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}} +\setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}} + +\def\simplealignedbox#1{\executeifdefined{\s!simple\c!align#1}{\getvalue{\s!simple\c!align\v!right}}} + +%D \macros +%D {pushindentation,popindentation} +%D +%D The pushing and popping is done by: + +\newbox\indentationboxA +\newbox\indentationboxB + +\def\pushindentation + {\bgroup + \ifhmode + \unskip + \setbox\indentationboxA\lastbox % get \strut if present + \unskip + \setbox\indentationboxB\lastbox % get \indent generated box + \unskip + \else + \hskip\zeropoint % switch to horizontal mode + \unskip + \setbox\indentationboxA\lastbox % get \indent generated box + \setbox\indentationboxB\emptybox + \fi} + +\def\popindentation + {\box\indentationboxB\box\indentationboxA % put back the boxes + \egroup} + +%D The only complication lays in \type{\strut}. In \PLAIN\ +%D \TEX\ a \type{\strut} is defined as: +%D +%D \starttyping +%D \def\strut% +%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} +%D \stoptyping +%D +%D But what is a \type{\strut}? Normally it's a rule of width +%D zero, but when made visual, it's a rule and a negative skip. +%D The mechanism for putting things in the margins described +%D here cannot handle this situation very well. One +%D characteristic of \type{\strut} is that the \type{\unhcopy} +%D results in entering horizontal mode, which in return leads +%D to some indentation. +%D +%D To serve our purpose a bit better, the macro \type{\strut} +%D can be redefined as: +%D +%D \starttyping +%D \def\strut +%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox} +%D \stoptyping +%D +%D Or more compatible: +%D +%D \starttyping +%D \def\strut +%D {\relax\ifmmode +%D \copy\strutbox +%D \else +%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup +%D \fi} +%D \stoptyping +%D +%D In \CONTEXT\ however we save some processing time by putting +%D an extra \type{\hbox} around the \type{\strutbox}. + +% moved from page-lin.tex to here (due to visualization added +% in august 2003) +% +% \unexpanded \def\crlf +% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break} + +\unexpanded \def\crlf + {\ifhmode + \unskip + \prewordbreak\crlfplaceholder + \ifcase\raggedstatus\hfil\or\or\or\hfil\fi + \break + \else + \crlfplaceholder + \endgraf + \fi} + +\def\crlfplaceholder + {\strut} + +\def\settestcrlf + {\def\crlfplaceholder + {\hbox to \zeropoint + {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}} + +%D \starttyping +%D % \setuplayout[gridgrid=yes] \showgrid +%D +%D \startbuffer +%D test 1\crlf +%D test 2\crlf +%D +%D \crlf test 3 +%D +%D test 4\crlf +%D test 5 +%D +%D \crlf +%D \crlf +%D \crlf +%D test 6 +%D \stopbuffer +%D +%D \hbox +%D {\hsize5em +%D \ruledvtop{\getbuffer}\enspace +%D \ruledvtop{\showstruts\getbuffer}\enspace +%D \hsize15em \setuptyping[before=,after=]% +%D \ruledvtop{\typebuffer}} +%D \stoptyping + +\def\opeenregel % to be used grouped + {\def\crlf{\removelastspace\space}\let\\\crlf} + +\def\showstruts + {\setteststrut + \settestcrlf} + +\def\definehspace + {\dotripleempty\dodefinehspace} + +\def\dodefinehspace[#1][#2][#3]% #1 = optional namespace + {\ifthirdargument + \setvalue{\??hs#1:#2}{#3}% + \else + \setvalue{\??hs:#1}{#2}% + \fi} + +\unexpanded\def\hspace + {\dodoubleempty\dohspace} + +%\def\dohspace[#1][#2]% +% {\ifhmode +% \removeunwantedspaces +% \hskip +% \ifsecondargument +% \hspaceamount{#1}{#2}% +% \else +% \hspaceamount\empty{\iffirstargument#1\else\s!default\fi}% +% \fi +% \expandafter\ignorespaces +% \fi} + +\def\dohspace[#1][#2]% + {\ifsecondargument + \dodohspace[#1][#2]% + \else\iffirstargument + \hspace[][#1]% + \else + \hspace[][\s!default]% + \fi\fi} + +% \def\dodohspace[#1][#2#3]% +% {\ifhmode +% \removeunwantedspaces +% \doifelse{#2}{-} +% {{\scratchskip\hspaceamount{#1}{#3}\hskip-\scratchskip}} +% {\hskip\hspaceamount{#1}{#2#3}}% +% \expandafter\ignorespaces +% \fi} +% +% not needed, tex handles -- as + + +\def\dodohspace[#1][#2]% + {\ifhmode + \removeunwantedspaces + \hskip\hspaceamount{#1}{#2}% + \expandafter\ignorespaces + \fi} + +\def\hspaceamount#1#2% + {\executeifdefined{\??hs#1:#2}{\executeifdefined{\??hs:#2}\zeropoint}} + +\definehspace [\v!small] [.25\emspaceamount] +\definehspace [\v!medium] [.5\emspaceamount] +\definehspace [\v!big] [1\emspaceamount] +\definehspace [\v!normal] [1\spaceamount] +\definehspace [\v!default] [\spaceamount] + +%D Taken from Taco's math module (cq. \AMS\ macros), but +%D adapted to \type {\hspace}: + +\unexpanded\def\textormathspace#1#2#3% + {\ifmmode\mskip#1#2\else\kern#1\hspaceamount\empty{#3}\fi\relax} + +\newmuskip\hairmuskip \hairmuskip=.15mu + +\def\hairspace {\textormathspace+\hairmuskip{.5}} +\def\thinspace {\textormathspace+\thinmuskip 1} +\def\medspace {\textormathspace+\medmuskip 2} +\def\thickspace {\textormathspace+\thickmuskip3} +\def\neghairspace {\textormathspace-\thinmuskip{.5}} +\def\negthinspace {\textormathspace-\thinmuskip 1} +\def\negmedspace {\textormathspace-\medmuskip 2} +\def\negthickspace{\textormathspace-\thickmuskip3} + +% needed for unicode: + +\def\twoperemspace {\hskip\dimexpr\emwidth/2\relax} % == \enspace +\def\threeperemspace {\hskip\dimexpr\emwidth/3\relax} +\def\fourperemspace {\hskip\dimexpr\emwidth/4\relax} +\def\fiveperemspace {\hskip\dimexpr\emwidth/5\relax} % goodie +\def\sixperemspace {\hskip\dimexpr\emwidth/6\relax} +\def\figurespace {\begingroup\setbox\scratchbox\hbox{0}\hskip\wd\scratchbox\endgroup} % there is a command for this +\def\punctuationspace {\begingroup\setbox\scratchbox\hbox{.}\hskip\wd\scratchbox\endgroup} +\def\ideographicspace {\hskip\dimexpr\emwidth/1\relax} +\def\ideographichalffillspace{\hskip\dimexpr\emwidth/2\relax} +%def\nobreakspace {\penalty\plustenthousand\space} +\def\nobreakspace {\penalty\plustenthousand\kern\interwordspace} +\def\narrownobreakspace {\penalty\plustenthousand\thinspace} +%def\zerowidthnobreakspace {\penalty\plustenthousand\hskip\zeropoint} +\def\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint} +\def\zerowidthspace {\hskip\zeropoint} + +\definehspace[.5][.1250\emspaceamount] % could also be [.1250\spaceamount] +\definehspace[1] [.1667\emspaceamount] +\definehspace[2] [.2222\emspaceamount] +\definehspace[3] [.2777\emspaceamount] + +\let \, \thinspace +\let \: \medspace +\let \; \thickspace +\let \! \negthinspace + +% this will become an alternative bunch of \blank settings +% +% \startlines +% \scratchskip=.23pt plus 10pt minus 4pt \relax \number\scratchskip \space \the\scratchskip +% \setsimplifiedskip\scratchskip1 \number\scratchskip \space \the\scratchskip +% \setsimplifiedskip\scratchskip2 \number\scratchskip \space \the\scratchskip +% \getsimplifiedskip\scratchskip\scratchcounter \number\scratchcounter +% \stoplines +% +% \hrule width10cm \endgraf +% \discardedskip{10pt} +% \retainedskip {4pt} +% \discardedskip {5pt} +% \hrule width10cm \endgraf +% \blockedskip{0pt} +% \discardedskip{10pt} +% \retainedskip {4pt} +% \discardedskip {5pt} +% \hrule width10cm \endgraf +% \frozenskip {4cm} +% \hrule width10cm \endgraf +% \vskip10pt +% \hrule width10cm \endgraf + +% ! ! ! etex only, evt splitskip macro gebruiken (syst-new) + +\newskip\simplifiedskip +\newskip\simplifiedcounter + +\chardef\@@discardedskip1 +\chardef\@@retainedskip 2 +\chardef\@@forcedskip 3 +\chardef\@@blockedskip 4 +\chardef\@@frozenskip 5 % after heads, no break + +\def\setsimplifiedskip#1#2% + {#1\dimexpr(10\dimexpr(#1/10)) plus \gluestretch#1 minus \glueshrink#1\relax + \advance#1\numexpr(#2)sp\relax} + +\def\getsimplifiedskip#1#2% + {\simplifiedskip#1\relax + \ifzeropt\simplifiedskip % \ifdim\simplifiedskip=\zeropoint + #2\zerocount + \else + \simplifiedcounter\dimexpr10\dimexpr#1/10\relax\relax + \advance\simplifiedskip-\simplifiedcounter + #2\number\simplifiedskip\relax + \fi} + +\def\conditionalskip#1#2% + {\scratchskip#1\relax + \setsimplifiedskip\scratchskip#2\relax + \vskip\scratchskip\relax} + +\def\defrostskip + {\scratchskip\lastskip\penalty50000\normalvskip-\scratchskip\penalty50000\relax} + +\def\frozenskip#1% + {\endgraf + \ifvmode + \getsimplifiedskip\lastskip\scratchcounter + \ifdim\lastskip>#1\else + \defrostskip + \conditionalskip{#1}\@@frozenskip + \fi + \fi} + +\def\discardedskip#1% + {\endgraf + \ifvmode + \getsimplifiedskip\lastskip\scratchcounter + \ifcase\scratchcounter + \conditionalskip{#1}\@@discardedskip + \or % discard + \ifdim\lastskip>#1\else + \normalvskip-\lastskip + \conditionalskip{#1}\@@discardedskip + \fi + \or % retain + \ifdim\lastskip>#1\else + \normalvskip-\lastskip + \conditionalskip{#1}\@@discardedskip + \fi + \or % forced + \conditionalskip{#1}\@@discardedskip + \or % ignored + \or % frozen + \ifdim\lastskip>#1\else + \defrostskip + \conditionalskip{#1}\@@frozenskip + \fi + \else\ifdim#1=\zeropoint\else + \vskip#1\relax + \fi\fi + \fi} + +\def\retainedskip#1% + {\endgraf + \ifvmode + \getsimplifiedskip\lastskip\scratchcounter + \ifcase\scratchcounter + \conditionalskip{#1}\@@retainedskip + \or % discard + \normalvskip-\lastskip + \conditionalskip{#1}\@@retainedskip + \or % retain + \ifdim\lastskip>#1\else + \normalvskip-\lastskip + \conditionalskip{#1}\@@retainedskip + \fi + \or % forced + \conditionalskip{#1}\@@retainedskip + \or % ignored + \or % frozen + \ifdim\lastskip>#1\else + \defrostskip + \conditionalskip{#1}\@@frozenskip + \fi + \else\ifdim#1=\zeropoint\else + \vskip#1\relax + \fi\fi + \fi} + +\def\forcedskip#1% + {\endgraf + \ifvmode + \conditionalskip{#1}\@@forcedskip + \fi} + +\def\blockedskip#1% + {\endgraf + \ifvmode + \getsimplifiedskip\lastskip\scratchcounter + \ifcase\scratchcounter + \conditionalskip{#1}\@@blockedskip + \or % discard + \conditionalskip{#1}\@@blockedskip + \or % retain + \conditionalskip{#1}\@@blockedskip + \or % forced + \conditionalskip{#1}\@@blockedskip + \or % ignored + \or % frozen + \ifdim\lastskip>#1\else + \defrostskip + \conditionalskip{#1}\@@frozenskip + \fi + \else\ifdim#1=\zeropoint\else + \vskip#1\relax + \fi\fi + \fi} + +% beware, changing this will break some code (like pos/backgrounds) + +\newtoks\everyfirstparagraphintro +\newtoks\everynextparagraphintro +\newtoks\@@everyparagraphtoks + +\chardef\everyparagraphintro\zerocount + +\def\setupparagraphintro + {\dodoubleempty\dosetupparagraphintro} + +\def\dosetupparagraphintro[#1][#2]% + {\processallactionsinset + [#1] + [ \v!reset=>\global\chardef\everyparagraphintro\zerocount + \global\everyfirstparagraphintro\emptytoks + \global\everynextparagraphintro \emptytoks, + \v!first=>\global\chardef\everyparagraphintro\plusone + \doglobal\appendtoks#2\to\everyfirstparagraphintro, + \v!next=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plusone\fi + \doglobal\appendtoks#2\to\everynextparagraphintro, + \v!each=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plustwo\fi + \doglobal\appendtoks#2\to\everyfirstparagraphintro + \doglobal\appendtoks#2\to\everynextparagraphintro]} + +%D We can say: +%D +%D \starttyping +%D \setupparagraphintro[first][\index{Knuth}] +%D \stoptyping +%D +%D Maybe more convenient is: +%D +%D \starttyping +%D \flushatparagraph{\index{Zapf}} +%D \stoptyping + +\def\flushatparagraph#1% + {\global\chardef\everyparagraphintro\plusone + \global\appendtoks{#1}\to\everyfirstparagraphintro} + +% \def\doinsertparagraphintro +% {\ifcase\everyparagraphintro\relax +% % no data +% \@@everyparagraphtoks\emptytoks +% \or +% % first data +% \global\chardef\everyparagraphintro\plustwo +% \@@everyparagraphtoks\everyfirstparagraphintro +% \global\everyfirstparagraphintro\emptytoks +% \or +% % next data +% \@@everyparagraphtoks\everynextparagraphintro +% \fi +% \the\@@everyparagraphtoks} + +\def\doinsertparagraphintro + {\begingroup + \everypar\emptytoks + \ifcase\everyparagraphintro\relax + % no data + \@@everyparagraphtoks\emptytoks + \or + % first data + \global\chardef\everyparagraphintro\plustwo + \@@everyparagraphtoks\everyfirstparagraphintro + \global\everyfirstparagraphintro\emptytoks + \or + % next data + \@@everyparagraphtoks\everynextparagraphintro + \fi + \the\@@everyparagraphtoks + \endgroup} + +\def\insertparagraphintro + {\ifcase\everyparagraphintro\else\@EA\doinsertparagraphintro\fi} + +% \appendtoksonce\insertparagraphintro\to\everypar % should come last + +%D \starttyping +%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}] +%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}] +%D \setupparagraphintro[next] [\hbox to 3.5em{\tt NEXT \hss}] +%D \setupparagraphintro[next] [\hbox to 3.5em{\tt TXEN \hss}] +%D \setupparagraphintro[each] [\hbox to 3.0em{\tt EACH \hss}] +%D \setupparagraphintro[each] [\hbox to 3.0em{\tt HCEA \hss}] +%D +%D some paragraph \par +%D some paragraph \par +%D some paragraph \par +%D +%D \definelabel[parnumber] +%D +%D \setupparagraphintro[reset,each][\inleft{\slxx\parnumber}] +%D +%D some paragraph \par +%D some paragraph \par +%D some paragraph \par +%D \stoptyping + +%D \macros +%D {flushatnextpar} +%D +%D This macro collects data that will be flushed at the next paragraph. +%D By using this macro you can avoid interfering nodes (writes, etc). + +\newbox \postponednodedata + +\def\flushatnextpar + {\bgroup + \dowithnextbox + {\global\setbox\postponednodedata\hbox{\box\postponednodedata\box\nextbox}\egroup}% + \hbox} + +\def\flushpostponednodedata + {\ifvoid\postponednodedata\else + \hbox{\smashedbox\postponednodedata}% + \fi} + +% Very nasty but needed for margin stuff inside colored +% paragraphs. + +\let\normalvadjust\vadjust + +% \def\graphicvadjust % bad, those low level color calls here +% {\dowithnextbox +% {\normalvadjust +% {\dostartgraphicgroup +% \localstarttextcolor +% \unvbox\nextbox +% \localstoptextcolor +% \dostopgraphicgroup}}% +% \vbox} + +% test this prikkels/pascal margin text before heads (mode +% 1) as well as uitwerkingen (mode 2) + +%chardef\graphicvadjustmode=0 % fake +%chardef\graphicvadjustmode=1 % normal +\chardef\graphicvadjustmode=2 % normal + compensate (== default) + +\def\graphicvadjust % bad, those low level color calls here + {\dowithnextboxcontent + {\forgetall} + {\ifcase\graphicvadjustmode \@EA \fakedvadjust \else \@EA\normalvadjust \fi + {\dostartgraphicgroup % don't ask + \localstarttextcolor + \unvbox\nextbox + \localstoptextcolor % don't ask + \dostopgraphicgroup + \ifcase\graphicvadjustmode \or \or + % corrects for one line paragraphs + \nointerlineskip + \kern-\struttotal + \nointerlineskip + \verticalstrut + \fi}}% + \vbox} + +%D This works only in a properly strutted line, and is meant +%D for deeply burried operations, like in heads. + +\def\fakedvadjust + {\dowithnextbox + {\setbox\nextbox\hbox{\llap{\lower\strutdepth\box\nextbox}}% + \smashedbox\nextbox}% + \vtop} + +\def\flexiblespaceamount#1#2#3% + {#1\interwordspace + \!!plus#2\interwordstretch + \!!minus#3\interwordshrink} + +\def\fixedspaceamount#1% + {#1\interwordspace} + +%D This is a dangerous feature because it makes the \TEX\ source +%D less portable, i.e. any parser now needs to apply exactly the +%D same algorithm when it wants to interpret the source. We +%D strongly recommend not to mention this feature in manuals! It's +%D provided for users who are hooked to such a mechanism. +%D +%D \starttyping +%D \setupsorting[logo][next=\autoinsertnextspace] \logo[TEX]{\TeX} +%D +%D bla bla \TEX bla bla \TEX (bla) bla (\TEX) +%D \stoptyping + +\def\autoinsertnextspace{\futurelet\nexttoken\doautoinsertnextspace} + +\def\doautoinsertnextspace % slightly extended version of a user supplied macro + {\ifx\nexttoken \bgroup\else \ifx\nexttoken\begingroup\else + \ifx\nexttoken \egroup\else \ifx\nexttoken \endgroup\else + \ifx\nexttoken \/\else \ifx\nexttoken /\else \ifx\nexttoken ~\else + \ifx\nexttoken \ \else \ifx\nexttoken \blankspace\else \ifx\nexttoken \space\else + \ifx\nexttoken .\else \ifx\nexttoken ,\else + \ifx\nexttoken !\else \ifx\nexttoken ?\else + \ifx\nexttoken :\else \ifx\nexttoken ;\else + \ifx\nexttoken '\else \ifx\nexttoken "\else + \ifx\nexttoken )\else \ifx\nexttoken -\else \ifx\nexttoken |\else + \ifx\nexttoken \%\else \ifx\nexttoken \&\else + \space + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% moved from page-lin + +\def\installspacehandler#1#2% needs to set \obeyedspace + {\setvalue{\??sr#1}{#2}} + +\installspacehandler \v!on + {\obeyspaces + \def\obeyedspace{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}% + \let\ =\obeyedspace} + +\installspacehandler \v!yes + {\obeyspaces + \def\obeyedspace{\mathortext\normalspace{\dontleavehmode \normalspace }}% + \let\ =\obeyedspace} + +\installspacehandler \v!off + {\normalspaces + \let\obeyedspace\normalspace + \let\ =\normalspace} + +\installspacehandler \v!fixed + {\obeyspaces + \def\obeyedspace{\mathortext\normalspace{\dontleavehmode\fixedspace}}% + \let\ =\obeyedspace} + +\def\activatespacehandler#1% + {\executeifdefined{\??sr#1}{\activatespacehandler\v!off}} + +% moved from page-lin + +%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 + +\def\setuplines + {\dodoubleargument\getparameters[\??rg]} + +\def\startlines + {\@@rgbefore + \pushmacro\checkindentation + \whitespace + %\page[\v!preference]} gaat mis na koppen, nieuw: later \nobreak + \begingroup + \setupindenting[\@@rgindenting]% + \typesettinglinestrue + \setupwhitespace[\v!none]% + \obeylines + \ignorespaces + \gdef\afterfirstobeyedline % tzt two pass, net als opsomming + {\gdef\afterfirstobeyedline + {\nobreak + \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}% + \def\obeyedline + {\par + \futurelet\next\dobetweenthelines}% + \activatespacehandler\@@rgspace + \GotoPar} + +\def\stoplines + {\endgroup + \popmacro\checkindentation + \@@rgafter} + +\def\dobetweenthelines + {\doifmeaningelse\next\obeyedline + {\@@rginbetween} + {\afterfirstobeyedline}} + +\setuplines + [\c!option=, + \c!before=\blank, + \c!after=\blank, + \c!inbetween=\blank, + \c!indenting=\v!no, + \c!space=\v!default] + +\def\emptylines + {\dosingleempty\doemptylines} + +\def\doemptylines[#1]% + {\endgraf\dorecurse{\iffirstargument#1\else3\fi}\crlf} + +\setupwhitespace + [\v!none] + +% still old-fashioned + +\indenting + [\v!never] + +\setupindenting + [\v!none] + +\setupblank + [\v!standard, + \v!big] + +\defineblank[\v!default] [\currentblank] +\defineblank[\v!before] [\v!default] +\defineblank[\v!inbetween][\v!default] +\defineblank[\v!after] [\v!before] + +\setupinterlinespace + [\c!minheight=0pt, % only special purpose + \c!mindepth=0pt, % only special purpose + \c!height=.72, + \c!depth=.28, + \c!top=1.0, + \c!bottom=0.4, + \c!distance=1pt, + \c!line=2.8ex, + \c!stretch=0] + +\setupnarrower + [\c!before=\endgraf, + \c!after=\endgraf, + \c!left=1.5em, + \c!right=1.5em, + \c!middle=1.5em] + +\setuptolerance + [\v!horizontal,\v!verystrict] + +\setuptolerance + [\v!vertical,\v!strict] + +\setupalign + [\v!bottom, + \v!width] + +\setupspacing + [\v!packed] + +\protect \endinput diff --git a/tex/context/base/spac-grd.lua b/tex/context/base/spac-grd.lua new file mode 100644 index 000000000..81e0c6e16 --- /dev/null +++ b/tex/context/base/spac-grd.lua @@ -0,0 +1,41 @@ +-- educational: snapper + +--~ function demo_snapper(head,where) -- snap_category 105 / nodes.snapvalue = { [1] = { 8*65536, 4*65536, 12*65536 } } +--~ if head then +--~ local current, tail, dummy = head, nil, nil +--~ while current do +--~ local id = current.id +--~ if id == glue and current.subtype == 2 then +--~ local sn = has_attribute(current,snap_category) +--~ if sn then +--~ local sv = nodes.snapvalues[sn] +--~ if sv then +--~ head, current, dummy = node.delete(head, current) +--~ free_node(dummy) +--~ else +--~ current = current.next +--~ end +--~ else +--~ current = current.next +--~ end +--~ else +--~ if id == hlist and where == 'hmode_par' and current.list then +--~ local sn = has_attribute(current.list,snap_category) +--~ if sn then +--~ local sv = nodes.snapvalues[sn] +--~ if sv then +--~ local height, depth, lineheight = sv[1], sv[2], sv[3] +--~ current.height = math.ceil((current.height-height)/lineheight)*lineheight + height +--~ current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth +--~ end +--~ end +--~ end +--~ current = current.next +--~ end +--~ tail = current +--~ end +--~ end +--~ return head +--~ end + +--~ callback.register('buildpage_filter', demo_snapper) diff --git a/tex/context/base/spac-grd.mkii b/tex/context/base/spac-grd.mkii new file mode 100644 index 000000000..249e2e430 --- /dev/null +++ b/tex/context/base/spac-grd.mkii @@ -0,0 +1,1074 @@ +%D \module +%D [ file=core-grd, +%D version=1998.03.10, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Grid Snapping (Experimental), +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Core Macros / Grid Snapping} + +\unprotect + +%D Moved from supp-box: + +%D \macros +%D {startbaselinecorrection,baselinecorrection, +%D showbaselinecorrection,offbaselinecorrection} +%D +%D Spacing around ruled boxes can get pretty messed up. The +%D next macro tries as good as possible to fix this. +%D +%D \startbuffer[1] +%D \startbaselinecorrection +%D \ruledhbox{Rule Brittanica} +%D \stopbaselinecorrection +%D \stopbuffer +%D +%D \typebuffer[1] +%D +%D The macros put some white space around the box: +%D +%D \getbuffer[1] +%D +%D A simple alternative is \type {\baselinecorrection}, which +%D only looks at the previous line. +%D +%D \startbuffer[2] +%D \baselinecorrection +%D \ruledhbox{Rule Brittanica} +%D \baselinecorrection +%D \stopbuffer +%D +%D \typebuffer[2] +%D +%D This time the last preceding line gets a correction,% +%D dependant on the depth. +%D +%D \getbuffer[2] +%D +%D One can make the correction visible by saying \type +%D {\showbaselinecorrection}. Part of the correction is +%D calculated from the dimensions of a~(. One can disble the +%D correction by calling \type {\offbaselinecorrection}. +%D +%D When visualize the first example looks like: +%D +%D {\showbaselinecorrection\getbuffer[1]} +%D +%D and the second one comes out as: +%D +%D {\showbaselinecorrection\getbuffer[2]} + +% \definecolor[GridLineColor][red] +% \definecolor[GridTextColor][blue] + +\definepalet + [grid] + [ one=red, + two=green, + three=blue, + four=gray] + +\def\setbaselinecorrections + {\setbox0\hbox{\setstrut\strut}% + \setbox2\hbox{(}% + \dimen0\ht0\advance\dimen0 -\ht2 + \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi + \dimen2\dp0\advance\dimen2 -\dp2 + \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi + \edef\thetopbaselinecorrection {\the\dimen0}\dimen0-\dimen0 + \edef\thebotbaselinecorrection {\the\dimen2}\dimen2-\dimen2 + \edef\thenegtopbaselinecorrection{\the\dimen0}% + \edef\thenegbotbaselinecorrection{\the\dimen2}} + +\def\dotopbaselinecorrection {\kern\thetopbaselinecorrection} +\def\dobotbaselinecorrection {\kern\thebotbaselinecorrection} +\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection} +\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection} + +\def\showbaselinecorrection + {\def\dobaselinecorrection % visualization is not watertight! + {\bgroup +\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi + \setbox0\null + \wd0\hsize + \dp0\strutdp + \nointerlineskip + \forgetall + \ruledvbox{\box0}% + \egroup + \prevdepth\strutdp}% + \def\dotopbaselinecorrection + {\hrule\!!height\thetopbaselinecorrection}% + \def\dobotbaselinecorrection + {\hrule\!!height\thebotbaselinecorrection}} + +\def\dobaselinecorrection + {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi + \kern\strutdp + \prevdepth\strutdp} + +% \def\baselinecorrection +% {\endgraf +% \ifvmode +% \ifdim\prevdepth<\maxdimen +% \ifdim\prevdepth<\zeropoint \else +% \ifdim\prevdepth<\strutdp +% \dobaselinecorrection +% \fi +% \fi +% \fi +% \fi} + +\def\baselinecorrection + {\endgraf + \ifvmode + \ifdim\prevdepth<\maxdimen + \ifdim\prevdepth<\zeropoint \else + \ifdim\prevdepth<\strutdepth \relax + \pushlastnode + \dobaselinecorrection + \poplastnode + \fi + \fi + \fi + \fi} + +\def\pagebaselinecorrection + {\ifdim\pagegoal<\maxdimen + \ifdim\pagetotal>\lineheight % or \topskip + \scratchdimen\pagetotal + \advance\scratchdimen\lineheight + \ifdim\scratchdimen<\pagegoal + \baselinecorrection + \fi + \fi + \fi} + +% Beware, keep this one as it is, see for instance module +% m-steps.tex, where we apply a \localhsize to the \vbox, in +% order to follow narrower and side floats ! + +% \def\startbaselinecorrection +% {\baselinecorrection +% \ifvmode +% \bgroup +% \setbox\scratchbox\vbox\bgroup +% \ignorespaces +% \let\stopbaselinecorrection\dostopbaselinecorrection +% \else +% \let\stopbaselinecorrection\relax +% \fi} + +% \def\dostopbaselinecorrection % I have to check columns yet. +% {\endgraf +% \egroup +% \topbaselinecorrection +% \box\scratchbox +% \botbaselinecorrection +% \egroup} + +% \let\stopbaselinecorrection=\relax + +\def\startbaselinecorrection + {\bgroup + \let\stopbaselinecorrection\egroup + \ifcase\baselinecorrectionmode + \or % normal + \baselinecorrection + \ifvmode + \setbox\scratchbox\vbox\bgroup\ignorespaces + \let\stopbaselinecorrection\donormalstopbaselinecorrection + \fi + \or % off + \or % force + \baselinecorrection + \ifvmode + \setbox\scratchbox\vbox\bgroup\ignorespaces + \let\stopbaselinecorrection\doforcedstopbaselinecorrection + \fi + \fi} + +\let\stopbaselinecorrection\relax + +\def\donormalstopbaselinecorrection % I have to check columns yet. + {\egroup + \topbaselinecorrection + \box\scratchbox + \botbaselinecorrection + \egroup} + +\def\doforcedstopbaselinecorrection % I have to check columns yet. + {\egroup + \forcedtopbaselinecorrection + \box\scratchbox + \forcedbotbaselinecorrection + \egroup} + +%D We do a bit more checking than needed. The pageborder check +%D is not needed, but I want to look the visualization as good +%D as possible too. + +% \def\offbaselinecorrection % Can be used inside correction. +% {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}} + +\chardef\baselinecorrectionmode\plusone + +\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone } +\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo } +\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree} + +%D \macros +%D {topbaselinecorrection,botbaselinecorrection} +%D +%D The actual top and bottom corrections are implemented as: + +% \def\topbaselinecorrection +% {\ifvmode \ifdim\pagegoal<\maxdimen +% \bgroup +% \setbaselinecorrections +% \whitespace +% \nointerlineskip +% \dotopbaselinecorrection +% \egroup +% \fi \fi} + + +\def\topbaselinecorrection + {\ifvmode \ifdim\pagegoal<\maxdimen + \forcedtopbaselinecorrection + \fi \fi} + +\def\forcedtopbaselinecorrection + {\ifvmode + \bgroup + \setbaselinecorrections + \whitespace + \nointerlineskip + \dotopbaselinecorrection + \egroup + \fi} + +\def\botbaselinecorrection + {\ifvmode + \bgroup + \setbaselinecorrections + \dobotbaselinecorrection + \allowbreak % new, otherwise problems when many in a row + \prevdepth\strutdp + \egroup + \fi} + +\let\forcedbotbaselinecorrection\botbaselinecorrection + +%D Still very experimental and therefore undocumented. + +\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE +\newif\ifforcepresnap \forcepresnaptrue % false in mixed single/double +\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false + +\def\positiveextrasnap {\gdef\extrasnapsign{+}} +\def\negativeextrasnap {\gdef\extrasnapsign{-}} + +\def\extrasnapreset {\global\chardef\@@extrasnap0 + \positiveextrasnap} +\def\extrasnapbefore {\global\chardef\@@extrasnap1 } +\def\extrasnaparound {\global\chardef\@@extrasnap2 } +\def\extrasnapafter {\global\chardef\@@extrasnap3 } + +\def\enablepresnapcorrection {\global\chardef\@@presnap\zerocount} +\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone} + +\extrasnapreset \enablepresnapcorrection + +\newif\iftracegridsnapping +\newif\ifshowgridboxes +\newif\ifshowfuzzyskips + +\let\showgridboxes\showgridboxestrue + +\def\showgridsnapping + {\tracegridsnappingtrue + \showgridboxestrue} + +\chardef\@@alignsnap =0 +\chardef\@@alignsnapbox =0 +\chardef\@@alignsnapmethod=0 + +\let\presnapskip \!!zeropoint \def\presnap {-} +\let\postsnapskip\!!zeropoint \let\postsnap\presnap + +\newcount\currentgridsnap + +\def\tracedsnapping + {\iftracegridsnapping + \llap + {\startlayoutcomponent{gridsnaps}{grid snaps}% + \infofont + \global\advance\currentgridsnap\plusone + \color[grid:three]{\vl\presnapskip + \vl\presnap + \vl\postsnap + \ifcase\@@alignsnapbox\relax + \vl\ifcase\@@extrasnap + 00\or + \extrasnapsign0\or + \extrasnapsign\extrasnapsign\or + 0\extrasnapsign\fi + \fi + \vl\the\currentgridsnap\vl}% + \stoplayoutcomponent}% + \fi} + +\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox + {\dosingleempty\dosnaptogrid} + +% \def\dosnaptogrid[#1]% +% {\ifgridsnapping +% \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi +% \expandafter\dodosnaptogrid +% \fi} + +% \def\dosnaptogrid[#1]% +% {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up +% \ifgridsnapping +% \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi +% \expandafter\dodosnaptogrid +% \fi} + +\def\dosnaptogrid[#1]% + {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up + \doifinsetelse\v!force{#1}% + {\moveongrid[#1]% + \dodosnaptogrid} + {\ifgridsnapping + \doifsomething{#1}{\moveongrid[#1]}% + \expandafter\dodosnaptogrid + \fi}} + +% \def\forcedpresnapcorrection % test this on 'details' +% {\ifforcepresnap +% \ifvmode \else \par \fi % new +% % we don't want top of page space when 'top' option +% %\verticalstrut\nobreak\vskip-\struttotal +% %\verticalstrut\vskip-\struttotal +% % nobreak really needed +% \allowbreak\verticalstrut\nobreak\vskip-\struttotal +% %\ifdim\pagetotal>\topskip \else +% % eigenlijk signal +% %\writestatus{grid}{removing dummy at top of page}% +% %\bgroup +% %\output{\setbox\scratchbox\box255}% +% %\penalty\outputpenalty +% %\egroup +% %\fi +% \fi} + +\def\forcedpresnapcorrection % test this on 'details' + {\ifforcepresnap + \ifvmode \else \par \fi % new + % we don't want top of page space when 'top' option + % \verticalstrut\nobreak\vskip-\struttotal + % \verticalstrut\vskip-\struttotal + % \nobreak really needed + % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper + \verticalstrut + \nobreak + \vskip-\struttotal + %\ifdim\pagetotal>\topskip \else + % eigenlijk signal + %\writestatus{grid}{removing dummy at top of page}% + %\bgroup + %\output{\setbox\scratchbox\box255}% + %\penalty\outputpenalty + %\egroup + %\fi + \fi} + +\def\setgridtracebox#1[#2]% % maybe reverse the order + {\setbox\nextbox#1% + {\hbox + {\hbox to \zeropoint + {\startlayoutcomponent{gridsnaps}{grid snaps}% + \color[grid:#2]{\ruledhbox{\fakebox\nextbox}}% + \stoplayoutcomponent + \hss}% + \flushnextbox}}} + +\newif\ifboxedsnapping \boxedsnappingtrue + +\chardef\depthsnapmethod \plusone % downward compatible, minus one line +\chardef\heightsnapmethod\plusone % downward compatible, minus one line + +\def\dodosnaptogrid + {\dowithnextbox + {\bgroup + \ifcase\@@alignsnapmethod \or + % we're dealing with text with a possible big depth/height + \chardef\depthsnapmethod \plustwo + \chardef\heightsnapmethod\plustwo + \fi + \ifdim\nextboxht<\textheight % handle special case (like page fig) + \ifcase\@@alignsnapbox\relax + \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low + \ifshowgridboxes + \setgridtracebox\hbox[two]% + \fi + %\getnoflines{\nextboxht}% + \getnoflines\nextboxht + \setbox\nextbox\vbox to \noflines\lineheight + {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi + \ifnum\@@alignsnap>2 \vfill\fi + \flushnextbox + \ifnum\@@alignsnap<4 \vfill\fi}% + \fi + \ifshowgridboxes + \setgridtracebox\hbox[three]% + \fi + \forgetall + \par + \ifvbox\nextbox + \setbox\nextbox\hbox{\flushnextbox}% don't ask + \fi + \scratchskip\lastskip + \edef\presnapskip{\the\lastskip}% + % mixing single/double columns sometimes goes wrong, + % check 'som' document + \ifinsidecolumns + \forcepresnaptrue + \fi + \forcedpresnapcorrection + \ifdim\nextboxht>\strutht + \scratchdimen\nextboxht + \ifcase\@@presnap\relax + \ifdim\scratchskip>\zeropoint\relax + \scratchcounter\scratchskip + \advance\scratchcounter -\openlineheight + \ifnum\scratchcounter<0 + \scratchcounter-\scratchcounter + \fi + \ifnum\scratchcounter<10 % \lastkip is about \openlineheight + \advance\scratchdimen -\openstrutdepth + \edef\presnapskip{*\presnapskip}% + \else\ifdim\scratchskip>\openlineheight + %<\openlineheight \else + \advance\scratchdimen -\openstrutdepth + \edef\presnapskip{*\presnapskip}% + \fi\fi + \fi + \fi + % \getnoflines\scratchdimen % maybe raw ? + % \advance\noflines -1 + \ifcase\heightsnapmethod + % raw + \or + \advance\scratchdimen-\lineheight % tight (default) + \or + \advance\scratchdimen-\strutheight % fit (text) + \or + \advance\scratchdimen-\strutheight % tolerant + \advance\scratchdimen-\roundingeps + \fi + \getnoflines\scratchdimen + \ifnum\noflines>0 + \scratchdimen\noflines\lineheight + \else + \scratchdimen\zeropoint + \fi + \else + \scratchdimen\zeropoint + \fi + \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign \lineheight \fi + \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi + \edef\presnap{\the\scratchdimen}% + \ifstrutsnapping + \ifboxedsnapping + \getrawnoflines\scratchdimen + \advance\scratchdimen-\noflines\lineheight + \vskip\scratchdimen % disappears at top of page + \dorecurse\noflines{\verticalstrut\nobreak}% + \else \ifdim\scratchdimen=\zeropoint + % nothing to skip + \else % disappears at top of page + \vskip\scratchdimen + \fi \fi + \fi + \ifdim\nextboxdp>\strutdp + % \getnoflines\nextboxdp + % \advance\noflines \minusone + \scratchdimen\nextboxdp\relax + \ifcase\depthsnapmethod + % raw + \or + \advance\scratchdimen-\lineheight % tight (default) + \or + \advance\scratchdimen-\strutdepth % fit (text) + \or + \advance\scratchdimen-\strutdepth % tolerant + \advance\scratchdimen-\roundingeps + \fi + \getnoflines\scratchdimen + \ifnum\noflines>0 + \scratchdimen\noflines\lineheight + \else + \scratchdimen\zeropoint + \fi + \else + \scratchdimen\zeropoint + \fi + \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi + \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign \lineheight \fi + \edef\postsnap{\the\scratchdimen}% + \ifstrutsnapping + \nextboxht\strutht + \nextboxdp\strutdp + \else + \scratchdimen\presnap + \advance\scratchdimen \strutht + \nextboxht\scratchdimen + \scratchdimen\postsnap + \advance\scratchdimen \strutdp + \nextboxdp\scratchdimen + \fi + \hbox{\tracedsnapping\flushnextbox}% + \ifstrutsnapping + \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi + \fi + \else + \scratchdimen\nextboxht\relax + \ifcase\@@alignsnapbox + % can't happen here + \or + \getrawnoflines\scratchdimen + \else + \getnoflines \scratchdimen + \fi + \scratchdimen\noflines\lineheight\relax + \advance\scratchdimen-\strutdepth + % spoils the whole game (fit/broad/line) + % \ifnum\pagetotal>\zeropoint \else % disable this as option + % \advance\scratchdimen-\strutheight + % \advance\scratchdimen+\topskip + % \fi + \dimen0=\scratchdimen + \dimen2=\strutdepth + \ifshowgridboxes + \setgridtracebox\hbox[two]% + \fi + \nextboxdp\strutdp + \dimen4=\nextboxht + \dimen6=\nextboxdp + \iftracegridsnapping + \setbox\scratchbox\hbox + {\scratchdimen\@@alignsnapamount\relax + \ifdim\scratchdimen<\zeropoint + \tracedgridamount\zeropoint{-\scratchdimen}% + \else + \tracedgridamount\scratchdimen\zeropoint + \fi}% + \smashbox\scratchbox + \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}% + \fi + \setbox\nextbox\hbox + {\scratchdimen\@@alignsnapamount\relax + \ifcase\@@alignsnapdepth\or + % don't change this ever ! + \ifdim\dimen0<\lineheight + % otherwise it is ok, but ending up inside + % the next paragraph is seldom what we want, + % so we move one line up + \advance\scratchdimen-\lineheight + \advance\scratchdimen\strutheight + \else + % otherwise we can move down to the + % baseline + \advance\scratchdimen\dimen6 % == \strutdepth + \fi + \fi + \lower\scratchdimen\flushnextbox}% + \nextboxht\dimen4 + \nextboxdp\dimen6 + \ifnum\@@alignsnap<4 % 4 = regel + \setbox\nextbox\vbox to \scratchdimen + {\forgetall + \ifnum\@@alignsnap>2 \vfill\fi % 3 4 + \flushnextbox + \nointerlineskip % \offinterlineskip + \ifnum\@@alignsnap<4 \vfill\fi % 2 3 + \kern\zeropoint}% + \fi + \ifshowgridboxes + \setgridtracebox\vbox[three]% + \fi + \scratchdimen\@@alignsnapamount + \edef\presnapskip{\the\scratchdimen}% + \ifnum\@@alignsnap>2 \def\presnap {+}\fi + \ifnum\@@alignsnap<4 \def\postsnap{+}\fi + \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}% + \par + \nextboxht\dimen0 + \nextboxdp\dimen2 + \forcedpresnapcorrection + \nointerlineskip + \flushnextbox + \fi + \else + \setbox\nextbox\vbox to \textheight + {\ifdim\nextboxdp=\zeropoint + \hbox{\lower\strutdepth\flushnextbox} + \else % this branch is yet untested + \vss + \hbox{\lower\nextboxdp\flushnextbox} + \vskip-\strutdepth + \fi}% + \nextboxdp\strutdepth + \flushnextbox + \fi + \extrasnapreset + \enablepresnapcorrection + \global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount + \egroup}} + +\def\tracedgridamount#1#2% + {\startlayoutcomponent{gridsnaps}{grid snaps}% + \color[grid:four]{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}% + \stoplayoutcomponent} + +\def\snaptomathgrid % probably not working ok, also kind of obsolete + {\ifgridsnapping + \dowithnextbox + {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]} + \vbox\bgroup + \forgetdisplayskips + \@EA\let\@EA\next + \fi} + +\def\topsnaptogrid + {\ifgridsnapping + \dowithnextbox + {\scratchdimen\nextboxht + \advance\scratchdimen -\strutht + \advance\scratchdimen \topskip + \nextboxht\scratchdimen + \nextboxdp\zeropoint + \flushnextbox + \kern\lineheight + \kern-\topskip + \nointerlineskip} + \hbox + \fi} + +% \def\centertogrid % meant for special situations +% {\ifgridsnapping +% \dowithnextboxcontent +% {\ignorespaces} +% {\bgroup +% \par +% \scratchdimen\nextboxht +% \advance\scratchdimen \nextboxdp +% \getnoflines\scratchdimen +% \setbox\nextbox\vbox to \noflines\lineheight +% {\forgetall +% \vskip\zeropoint \!!plus \nextboxht +% \copy\nextbox +% \kern.5\strutdp % VOORLOPIGE WAARDE +% \vskip\zeropoint \!!plus \nextboxdp}% +% \noindent\snaptogrid\vbox{\flushnextbox}% +% \egroup} +% \vbox % was \hbox +% \fi} + +% The next implementation is sub-optimal +% +% \def\centertogrid % usage: see ie pascal / stepcharts +% {\snaptogrid[\v!midden,.5\strutdp]\vbox} + +\def\centertogrid % meant for special situations + {\ifgridsnapping + \dowithnextboxcontent + {\ignorespaces} + {\bgroup + \par + \scratchdimen\nextboxht + \advance\scratchdimen \nextboxdp + \getnoflines\scratchdimen + \setbox\nextbox\vbox to \noflines\lineheight + {\forgetall + \vss + \topbaselinecorrection + \copy\nextbox + \botbaselinecorrection + \vss}% + \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}% + \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace + \noindent\snaptogrid\vbox{\flushnextbox}% + \egroup} + \vbox % was \hbox + \fi} + +% testbed for \centertogrid +% +% \strut Bruggetje +% \startlinecorrection +% \startcombination +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination[2*2] +% {\framed{test}} {} {\framed{test}} {} +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination[2*2] +% {\framed{test}} {} {\framed{test}} {} +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination[2*2] +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination[2*2] +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection + +\ifx\startbaselinecorrection\undefined \wait \fi % change order + +\let\normalstartbaselinecorrection=\startbaselinecorrection + +\def\startbaselinecorrection + {\ifgridsnapping + \centertogrid\bgroup + \let\stopbaselinecorrection\egroup + \else + \normalstartbaselinecorrection + \fi} + +\chardef\gridboxlinenomode\plusone +\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame + +\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% + {\setbox#1\gridboxvbox to #3 % given size + {\forgetall + \resetteststrut + \offinterlineskip + \hsize#2% + \baselinerulefalse + \gridboxvbox % calculated size + {\getrawnoflines{#3}% \getnoflines{#3}% + \vskip\topskip + \vskip-\strutht + \scratchdimen#2\advance\scratchdimen \lineheight + \dorecurse\noflines + {\strut + \hskip-.5\lineheight + \ifcase\gridboxlinenomode\or + \rlap + {\hskip.2\bodyfontsize\hskip\scratchdimen + \infofont\hbox to 1em{\hss\recurselevel}}% + \or + \llap + {\infofont\hbox to 1em{\hss\recurselevel}% + \hskip.2\bodyfontsize}% + \fi + \vrule + \!!height \gridboxwidth + \!!depth \gridboxwidth + \!!width \scratchdimen + \par}} + \vfill}} + +%D Some intervention macros: + +\def\gridwarning#1{\message{[beware of #1 extra snap]}} + +\global\let\@@alignsnapamount\!!zeropoint +\global\chardef\@@alignsnapdepth0 + +\def\@@unknowngriddisplacement + {\global\chardef\@@alignsnapbox\plusthree + \global\let\@@alignsnapamount\commalistelement} + +\def\domoveongrid[#1]% + {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi} + +\def\dodomoveongrid[#1]% some day : speed up + {\global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount + \global\chardef\@@alignsnapdepth\zerocount + \global\chardef\@@alignsnapmethod\zerocount + \global\let\@@alignsnapamount\!!zeropoint + \donefalse + \expanded{\processallactionsinset[#1]} + [\v!standard=>, + \v!normal=>, % to be sure + \v!yes=>, % to be sure + \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore, + \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter, + \v!both=>\positiveextrasnap\extrasnaparound, + -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore, + -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter, + -\v!both=>\negativeextrasnap\extrasnaparound, + \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations + \v!page=>\global\chardef\@@alignsnap\plusone, % topskip + \v!high=>\global\chardef\@@alignsnap\plustwo, + \v!middle=>\global\chardef\@@alignsnap\plusthree, + \v!low=>\global\chardef\@@alignsnap\plusfour, + \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new + \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new + \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new + \v!line=>\global\chardef\@@alignsnapbox\plusthree +% \global\chardef\@@alignsnapdepth\plusone + \global\chardef\@@alignsnap\plusfour, + \v!reset=>\positiveextrasnap\extrasnapreset, + \v!none=>\global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount, + \v!force=>, % turns on grid snapping even when not on + \s!default=>, + \s!unknown=>\@@unknowngriddisplacement]} + +\def\moveongrid + {\dosingleempty\domoveongrid} + +\def\doplaceongrid[#1]% + {\domoveongrid[#1]\snaptogrid\vbox} + +\def\placeongrid + {\dosingleempty\doplaceongrid} + +%D Snapping is rather robust as long as we use whole lines. +%D Half lines of white space can however be handled when they +%D come in pairs. The corrections needed when crossing page +%D boundaries in the middle of such a pair, are handled by +%D macros that are (named) sort of fuzzy. This fuzzy mechanism +%D was written as an extension to the grid typesetting needed +%D for typesetting (part of) the \MAPS. +%D +%D \starttyping +%D \setuptyping +%D [before={\blank[halfline]}, +%D after={\blank[halfline]}] +%D \stoptyping + +\newif \iffuzzyvskip +\newif \iffuzzysnapdone +\newif \iffuzzysnapping +\newif \iffuzzysnapped +\chardef \fuzzysnappedleft=0 % ==1 when fuzzybegin still open +\newpersistentmark\fuzzymark % (!) +\newcount \fuzzymarker +\newbox \fuzzysnapbox +\newbox \fuzzysnapsplit + +\def\dosyncfuzzyvskip + {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint + \bgroup % - added 28/2/2003: check this, there was no - + \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal + \egroup + \fi\fi\fi} + +\def\fuzzyvskip#1% + {\iffuzzysnapdone + \dosyncfuzzyvskip % NEWER + \endfuzzysnapping + \vskip#1\relax + \global\fuzzysnapdonefalse + \else + \vskip#1\relax + \beginfuzzysnapping + \global\fuzzysnapdonetrue + \fi} + +\def\setfuzzymark#1#2#3% #1/#2 => error recovery + {\ifgridsnapping + \global\fuzzysnappingtrue + \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi + \nobreak + \ifshowfuzzyskips + \hbox{\color[grid:three] + {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak + \vrule\!!width\hsize\!!height.1\lineheight}} + \nobreak + \fi + %[\the\fuzzymarker] + %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% + \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% + \nobreak + \fi} + +\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd +\def\endfuzzysnapping {\setfuzzymark12\v!stop } % even + +\def\removelastfuzzyvskip + {\ifgridsnapping + \iffuzzysnapping + \ifdim\lastskip<\openlineheight + \else + \removelastskip + \fi + \else + \removelastskip + \fi + \else + \removelastskip + \fi} + +\def\docheckfuzzysnap#1% + {\bgroup + \dontcomplain + \setbox\fuzzysnapbox\copy#1\relax + \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight + \let\topfuzzymark\empty % indeed here ... no real mark + \getsplitmarks\fuzzymark +% \ifcase0\topfuzzymark + \ifcase0\rawgetsplittopmark\fuzzymark + \global\chardef\fuzzysnappedleft\zerocount + \global\fuzzysnappedfalse +% \else\ifodd\topfuzzymark + \else\ifodd\rawgetsplittopmark\fuzzymark + \global\chardef\fuzzysnappedleft\plusone + \global\fuzzysnappedtrue + \else + \global\chardef\fuzzysnappedleft=2 + \global\fuzzysnappedtrue + \fi\fi + \iffuzzysnapped \else + \doloop + {\ifvoid\fuzzysnapbox + \exitloop + \else + \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight + %\let\topfuzzymark=\empty % ... but not here + \getsplitmarks\fuzzymark +% \ifcase0\topfuzzymark + \ifcase0\rawgetsplittopmark\fuzzymark + % continue +% \else\ifodd\topfuzzymark + \else\ifodd\rawgetsplittopmark\fuzzymark + \exitloop + \else + \global\chardef\fuzzysnappedleft\plusone + \global\fuzzysnappedtrue + \exitloop + \fi\fi + \fi}% + \fi + \egroup} + +\def\getfuzzysnapcorrection#1% + {\global\let\presnapcorrection \relax + \global\let\postsnapcorrection\relax + \ifgridsnapping\iffuzzysnapping + \docheckfuzzysnap{#1}% + \iffuzzysnapped + \iftracegridsnapping + \gdef\presnapcorrection + {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}% + \else + \gdef\presnapcorrection{\kern.5\openlineheight}% + \fi + \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok + \fi + \fi\fi} + +\def\fuzzysnappedbox#1#2% \box \unvbox + {\getfuzzysnapcorrection{#2}% + \presnapcorrection + #1#2% + \postsnapcorrection} + +\def\adaptfuzzypagegoal + {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents + \scratchdimen\pagegoal + \advance\scratchdimen -.5\openlineheight + \global\pagegoal\scratchdimen + \global\advance\vsize -.5\openlineheight + \global\chardef\fuzzysnappedleft0 + \fi\fi\fi} + +%D New, experimental, used in caption snapping: +%D +%D \starttyping +%D \startcolumnset +%D +%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top] +%D +%D \placefigure [lrtb] {\dorecurse{5}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D \placefigure [lrtb] {\dorecurse{15}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D +%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom] +%D +%D \placefigure [rltb] {\dorecurse{5}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D \placefigure [rltb] {\dorecurse{15}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D +%D \input thuan +%D +%D \stopcolumnset +%D \stoptyping + +\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! ! + {\doifsomething{#2} + {\getnoflines{\ht#1}% no depth taken into account, depth preserved + \scratchdimen\noflines\lineheight + \advance\scratchdimen-\strutdp + \bgroup + \advance\scratchdimen-\onepoint % be a bit tolerant + \ifdim\scratchdimen>\ht#1\relax + \egroup + \doif{#2}\v!top {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}% + \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}% + \dp#1\strutdp + \else + \egroup + \ht#1\scratchdimen + \dp#1\strutdp + \fi}} + +%D New: + +\let\checkgridsnapping\relax + +\protect \endinput diff --git a/tex/context/base/spac-grd.mkiv b/tex/context/base/spac-grd.mkiv new file mode 100644 index 000000000..3fa47de57 --- /dev/null +++ b/tex/context/base/spac-grd.mkiv @@ -0,0 +1,1095 @@ +%D \module +%D [ file=spac-grd, +%D version=2009.10.16, % 1998.03.10, was core-grd.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Grid Snapping, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Grid Snapping} + +\unprotect + +\newif \iffuzzyvskip + +%D Helpers: + +\let\poplastnode\relax + +\def\pushlastnode + {\ifdim\lastskip=\zeropoint + \ifnum\lastpenalty=\zerocount + \ifnum\lastkern=\zerocount + \let\poplastnode\relax + \else + \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested + \fi + \else + \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested + \fi + \else + \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip + \fi} + +%D Moved from supp-box: + +%D \macros +%D {startbaselinecorrection,baselinecorrection, +%D showbaselinecorrection,offbaselinecorrection} +%D +%D Spacing around ruled boxes can get pretty messed up. The +%D next macro tries as good as possible to fix this. +%D +%D \startbuffer[1] +%D \startbaselinecorrection +%D \ruledhbox{Rule Brittanica} +%D \stopbaselinecorrection +%D \stopbuffer +%D +%D \typebuffer[1] +%D +%D The macros put some white space around the box: +%D +%D \getbuffer[1] +%D +%D A simple alternative is \type {\baselinecorrection}, which +%D only looks at the previous line. +%D +%D \startbuffer[2] +%D \baselinecorrection +%D \ruledhbox{Rule Brittanica} +%D \baselinecorrection +%D \stopbuffer +%D +%D \typebuffer[2] +%D +%D This time the last preceding line gets a correction,% +%D dependant on the depth. +%D +%D \getbuffer[2] +%D +%D One can make the correction visible by saying \type +%D {\showbaselinecorrection}. Part of the correction is +%D calculated from the dimensions of a~(. One can disble the +%D correction by calling \type {\offbaselinecorrection}. +%D +%D When visualize the first example looks like: +%D +%D {\showbaselinecorrection\getbuffer[1]} +%D +%D and the second one comes out as: +%D +%D {\showbaselinecorrection\getbuffer[2]} + +% \definecolor[GridLineColor][red] +% \definecolor[GridTextColor][blue] + +\let\thetopbaselinecorrection \!!zeropoint +\let\thebotbaselinecorrection \!!zeropoint +\let\thenegtopbaselinecorrection\!!zeropoint +\let\thenegbotbaselinecorrection\!!zeropoint + +\definepalet + [grid] + [ one=red, + two=green, + three=blue, + four=gray] + +\def\setbaselinecorrections + {\setbox0\hbox{\setstrut\strut}% + \setbox2\hbox{(}% + \dimen0\ht0\advance\dimen0 -\ht2 + \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi + \dimen2\dp0\advance\dimen2 -\dp2 + \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi + \edef\thetopbaselinecorrection {\the\dimen0}\dimen0-\dimen0 + \edef\thebotbaselinecorrection {\the\dimen2}\dimen2-\dimen2 + \edef\thenegtopbaselinecorrection{\the\dimen0}% + \edef\thenegbotbaselinecorrection{\the\dimen2}} + +\def\dotopbaselinecorrection {\kern\thetopbaselinecorrection} +\def\dobotbaselinecorrection {\kern\thebotbaselinecorrection} +\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection} +\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection} + +\def\showbaselinecorrection + {\def\dobaselinecorrection % visualization is not watertight! + {\bgroup +\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi + \setbox0\null + \wd0\hsize + \dp0\strutdp + \nointerlineskip + \forgetall + \ruledvbox{\box0}% + \egroup + \prevdepth\strutdp}% + \def\dotopbaselinecorrection + {\hrule\!!height\thetopbaselinecorrection}% + \def\dobotbaselinecorrection + {\hrule\!!height\thebotbaselinecorrection}} + +\def\dobaselinecorrection + {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi + \kern\strutdp + \prevdepth\strutdp} + +% \def\baselinecorrection +% {\endgraf +% \ifvmode +% \ifdim\prevdepth<\maxdimen +% \ifdim\prevdepth<\zeropoint \else +% \ifdim\prevdepth<\strutdp +% \dobaselinecorrection +% \fi +% \fi +% \fi +% \fi} + +\def\baselinecorrection + {\endgraf + \ifvmode + \ifdim\prevdepth<\maxdimen + \ifdim\prevdepth<\zeropoint \else + \ifdim\prevdepth<\strutdepth \relax + \pushlastnode + \dobaselinecorrection + \poplastnode + \fi + \fi + \fi + \fi} + +\def\pagebaselinecorrection + {\ifdim\pagegoal<\maxdimen + \ifdim\pagetotal>\lineheight % or \topskip + \scratchdimen\pagetotal + \advance\scratchdimen\lineheight + \ifdim\scratchdimen<\pagegoal + \baselinecorrection + \fi + \fi + \fi} + +% Beware, keep this one as it is, see for instance module +% m-steps.tex, where we apply a \localhsize to the \vbox, in +% order to follow narrower and side floats ! + +% \def\startbaselinecorrection +% {\baselinecorrection +% \ifvmode +% \bgroup +% \setbox\scratchbox\vbox\bgroup +% \ignorespaces +% \let\stopbaselinecorrection\dostopbaselinecorrection +% \else +% \let\stopbaselinecorrection\relax +% \fi} + +% \def\dostopbaselinecorrection % I have to check columns yet. +% {\endgraf +% \egroup +% \topbaselinecorrection +% \box\scratchbox +% \botbaselinecorrection +% \egroup} + +% \let\stopbaselinecorrection=\relax + +\def\startbaselinecorrection + {\bgroup + \let\stopbaselinecorrection\egroup + \ifcase\baselinecorrectionmode + \or % normal + \baselinecorrection + \ifvmode + \setbox\scratchbox\vbox\bgroup\ignorespaces + \let\stopbaselinecorrection\donormalstopbaselinecorrection + \fi + \or % off + \or % force + \baselinecorrection + \ifvmode + \setbox\scratchbox\vbox\bgroup\ignorespaces + \let\stopbaselinecorrection\doforcedstopbaselinecorrection + \fi + \fi} + +\let\stopbaselinecorrection\relax + +\def\donormalstopbaselinecorrection % I have to check columns yet. + {\egroup + \topbaselinecorrection + \box\scratchbox + \botbaselinecorrection + \egroup} + +\def\doforcedstopbaselinecorrection % I have to check columns yet. + {\egroup + \forcedtopbaselinecorrection + \box\scratchbox + \forcedbotbaselinecorrection + \egroup} + +%D We do a bit more checking than needed. The pageborder check +%D is not needed, but I want to look the visualization as good +%D as possible too. + +% \def\offbaselinecorrection % Can be used inside correction. +% {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}} + +\chardef\baselinecorrectionmode\plusone + +\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone } +\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo } +\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree} + +%D \macros +%D {topbaselinecorrection,botbaselinecorrection} +%D +%D The actual top and bottom corrections are implemented as: + +% \def\topbaselinecorrection +% {\ifvmode \ifdim\pagegoal<\maxdimen +% \bgroup +% \setbaselinecorrections +% \whitespace +% \nointerlineskip +% \dotopbaselinecorrection +% \egroup +% \fi \fi} + + +\def\topbaselinecorrection + {\ifvmode \ifdim\pagegoal<\maxdimen + \forcedtopbaselinecorrection + \fi \fi} + +\def\forcedtopbaselinecorrection + {\ifvmode + \bgroup + \setbaselinecorrections + \whitespace + \nointerlineskip + \dotopbaselinecorrection + \egroup + \fi} + +\def\botbaselinecorrection + {\ifvmode + \bgroup + \setbaselinecorrections + \dobotbaselinecorrection + \allowbreak % new, otherwise problems when many in a row + \prevdepth\strutdp + \egroup + \fi} + +\let\forcedbotbaselinecorrection\botbaselinecorrection + +%D Still very experimental and therefore undocumented. + +\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE +\newif\ifforcepresnap \forcepresnaptrue % false in mixed single/double +\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false + +\def\positiveextrasnap {\gdef\extrasnapsign{+}} +\def\negativeextrasnap {\gdef\extrasnapsign{-}} + +\def\extrasnapreset {\global\chardef\@@extrasnap0 + \positiveextrasnap} +\def\extrasnapbefore {\global\chardef\@@extrasnap1 } +\def\extrasnaparound {\global\chardef\@@extrasnap2 } +\def\extrasnapafter {\global\chardef\@@extrasnap3 } + +\def\enablepresnapcorrection {\global\chardef\@@presnap\zerocount} +\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone} + +\extrasnapreset \enablepresnapcorrection + +\newif\iftracegridsnapping +\newif\ifshowgridboxes +\newif\ifshowfuzzyskips + +\let\showgridboxes\showgridboxestrue + +\def\showgridsnapping + {\tracegridsnappingtrue + \showgridboxestrue} + +\chardef\@@alignsnap =0 +\chardef\@@alignsnapbox =0 +\chardef\@@alignsnapmethod=0 + +\let\presnapskip \!!zeropoint \def\presnap {-} +\let\postsnapskip\!!zeropoint \let\postsnap\presnap + +\newcount\currentgridsnap + +\def\tracedsnapping + {\iftracegridsnapping + \llap + {\setlayoutcomponentattribute\v!grid\v!test + \hbox \layoutcomponentboxattribute + {\infofont + \global\advance\currentgridsnap\plusone + \color[grid:three] + {\vl\presnapskip + \vl\presnap + \vl\postsnap + \ifcase\@@alignsnapbox\relax\vl\ifcase\@@extrasnap00\or\extrasnapsign0\or\extrasnapsign\extrasnapsign\or0\extrasnapsign\fi\fi + \vl\the\currentgridsnap\vl}}}% + \fi} + +\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox + {\dosingleempty\dosnaptogrid} + +% \def\dosnaptogrid[#1]% +% {\ifgridsnapping +% \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi +% \expandafter\dodosnaptogrid +% \fi} + +% \def\dosnaptogrid[#1]% +% {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up +% \ifgridsnapping +% \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi +% \expandafter\dodosnaptogrid +% \fi} + +\def\dosnaptogrid[#1]% + {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up + \doifinsetelse\v!force{#1}% + {\moveongrid[#1]% + \dodosnaptogrid} + {\ifgridsnapping + \doifsomething{#1}{\moveongrid[#1]}% + \expandafter\dodosnaptogrid + \fi}} + +% \def\forcedpresnapcorrection % test this on 'details' +% {\ifforcepresnap +% \ifvmode \else \par \fi % new +% % we don't want top of page space when 'top' option +% %\verticalstrut\nobreak\vskip-\struttotal +% %\verticalstrut\vskip-\struttotal +% % nobreak really needed +% \allowbreak\verticalstrut\nobreak\vskip-\struttotal +% %\ifdim\pagetotal>\topskip \else +% % eigenlijk signal +% %\writestatus{grid}{removing dummy at top of page}% +% %\bgroup +% %\output{\setbox\scratchbox\box255}% +% %\penalty\outputpenalty +% %\egroup +% %\fi +% \fi} + +\def\forcedpresnapcorrection % test this on 'details' + {\ifforcepresnap + \ifvmode \else \par \fi % new + % we don't want top of page space when 'top' option + % \verticalstrut\nobreak\vskip-\struttotal + % \verticalstrut\vskip-\struttotal + % \nobreak really needed + % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper + \verticalstrut + \nobreak + \vskip-\struttotal + %\ifdim\pagetotal>\topskip \else + % eigenlijk signal + %\writestatus{grid}{removing dummy at top of page}% + %\bgroup + %\output{\setbox\scratchbox\box255}% + %\penalty\outputpenalty + %\egroup + %\fi + \fi} + +\def\setgridtracebox#1[#2]% % maybe reverse the order + {\setbox\nextbox#1% + {\hbox + {\hbox to \zeropoint + {\setlayoutcomponentattribute\v!grid\v!test + \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}% + \hss}% + \flushnextbox}}} + +\newif\ifboxedsnapping \boxedsnappingtrue + +\chardef\depthsnapmethod \plusone % downward compatible, minus one line +\chardef\heightsnapmethod\plusone % downward compatible, minus one line + +\def\dodosnaptogrid + {\dowithnextbox + {\bgroup + \ifcase\@@alignsnapmethod \or + % we're dealing with text with a possible big depth/height + \chardef\depthsnapmethod \plustwo + \chardef\heightsnapmethod\plustwo + \fi + \ifdim\nextboxht<\textheight % handle special case (like page fig) + \ifcase\@@alignsnapbox\relax + \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low + \ifshowgridboxes + \setgridtracebox\hbox[two]% + \fi + %\getnoflines{\nextboxht}% + \getnoflines\nextboxht + \setbox\nextbox\vbox to \noflines\lineheight + {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi + \ifnum\@@alignsnap>2 \vfill\fi + \flushnextbox + \ifnum\@@alignsnap<4 \vfill\fi}% + \fi + \ifshowgridboxes + \setgridtracebox\hbox[three]% + \fi + \forgetall + \par + \ifvbox\nextbox + \setbox\nextbox\hbox{\flushnextbox}% don't ask + \fi + \scratchskip\lastskip + \edef\presnapskip{\the\lastskip}% + % mixing single/double columns sometimes goes wrong, + % check 'som' document + \ifinsidecolumns + \forcepresnaptrue + \fi + \forcedpresnapcorrection + \ifdim\nextboxht>\strutht + \scratchdimen\nextboxht + \ifcase\@@presnap\relax + \ifdim\scratchskip>\zeropoint\relax + \scratchcounter\scratchskip + \advance\scratchcounter -\openlineheight + \ifnum\scratchcounter<0 + \scratchcounter-\scratchcounter + \fi + \ifnum\scratchcounter<10 % \lastkip is about \openlineheight + \advance\scratchdimen -\openstrutdepth + \edef\presnapskip{*\presnapskip}% + \else\ifdim\scratchskip>\openlineheight + %<\openlineheight \else + \advance\scratchdimen -\openstrutdepth + \edef\presnapskip{*\presnapskip}% + \fi\fi + \fi + \fi + % \getnoflines\scratchdimen % maybe raw ? + % \advance\noflines -1 + \ifcase\heightsnapmethod + % raw + \or + \advance\scratchdimen-\lineheight % tight (default) + \or + \advance\scratchdimen-\strutheight % fit (text) + \or + \advance\scratchdimen-\strutheight % tolerant + \advance\scratchdimen-\roundingeps + \fi + \getnoflines\scratchdimen + \ifnum\noflines>0 + \scratchdimen\noflines\lineheight + \else + \scratchdimen\zeropoint + \fi + \else + \scratchdimen\zeropoint + \fi + \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign \lineheight \fi + \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi + \edef\presnap{\the\scratchdimen}% + \ifstrutsnapping + \ifboxedsnapping + \getrawnoflines\scratchdimen + \advance\scratchdimen-\noflines\lineheight + \vskip\scratchdimen % disappears at top of page + \dorecurse\noflines{\verticalstrut\nobreak}% + \else \ifdim\scratchdimen=\zeropoint + % nothing to skip + \else % disappears at top of page + \vskip\scratchdimen + \fi \fi + \fi + \ifdim\nextboxdp>\strutdp + % \getnoflines\nextboxdp + % \advance\noflines \minusone + \scratchdimen\nextboxdp\relax + \ifcase\depthsnapmethod + % raw + \or + \advance\scratchdimen-\lineheight % tight (default) + \or + \advance\scratchdimen-\strutdepth % fit (text) + \or + \advance\scratchdimen-\strutdepth % tolerant + \advance\scratchdimen-\roundingeps + \fi + \getnoflines\scratchdimen + \ifnum\noflines>0 + \scratchdimen\noflines\lineheight + \else + \scratchdimen\zeropoint + \fi + \else + \scratchdimen\zeropoint + \fi + \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi + \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign \lineheight \fi + \edef\postsnap{\the\scratchdimen}% + \ifstrutsnapping + \nextboxht\strutht + \nextboxdp\strutdp + \else + \scratchdimen\presnap + \advance\scratchdimen \strutht + \nextboxht\scratchdimen + \scratchdimen\postsnap + \advance\scratchdimen \strutdp + \nextboxdp\scratchdimen + \fi + \hbox{\tracedsnapping\flushnextbox}% + \ifstrutsnapping + \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi + \fi + \else + \scratchdimen\nextboxht\relax + \ifcase\@@alignsnapbox + % can't happen here + \or + \getrawnoflines\scratchdimen + \else + \getnoflines \scratchdimen + \fi + \scratchdimen\noflines\lineheight\relax + \advance\scratchdimen-\strutdepth + % spoils the whole game (fit/broad/line) + % \ifnum\pagetotal>\zeropoint \else % disable this as option + % \advance\scratchdimen-\strutheight + % \advance\scratchdimen+\topskip + % \fi + \dimen0=\scratchdimen + \dimen2=\strutdepth + \ifshowgridboxes + \setgridtracebox\hbox[two]% + \fi + \nextboxdp\strutdp + \dimen4=\nextboxht + \dimen6=\nextboxdp + \iftracegridsnapping + \setbox\scratchbox\hbox + {\scratchdimen\@@alignsnapamount\relax + \ifdim\scratchdimen<\zeropoint + \tracedgridamount\zeropoint{-\scratchdimen}% + \else + \tracedgridamount\scratchdimen\zeropoint + \fi}% + \smashbox\scratchbox + \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}% + \fi + \setbox\nextbox\hbox + {\scratchdimen\@@alignsnapamount\relax + \ifcase\@@alignsnapdepth\or + % don't change this ever ! + \ifdim\dimen0<\lineheight + % otherwise it is ok, but ending up inside + % the next paragraph is seldom what we want, + % so we move one line up + \advance\scratchdimen-\lineheight + \advance\scratchdimen\strutheight + \else + % otherwise we can move down to the + % baseline + \advance\scratchdimen\dimen6 % == \strutdepth + \fi + \fi + \lower\scratchdimen\flushnextbox}% + \nextboxht\dimen4 + \nextboxdp\dimen6 + \ifnum\@@alignsnap<4 % 4 = regel + \setbox\nextbox\vbox to \scratchdimen + {\forgetall + \ifnum\@@alignsnap>2 \vfill\fi % 3 4 + \flushnextbox + \nointerlineskip % \offinterlineskip + \ifnum\@@alignsnap<4 \vfill\fi % 2 3 + \kern\zeropoint}% + \fi + \ifshowgridboxes + \setgridtracebox\vbox[three]% + \fi + \scratchdimen\@@alignsnapamount + \edef\presnapskip{\the\scratchdimen}% + \ifnum\@@alignsnap>2 \def\presnap {+}\fi + \ifnum\@@alignsnap<4 \def\postsnap{+}\fi + \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}% + \par + \nextboxht\dimen0 + \nextboxdp\dimen2 + \forcedpresnapcorrection + \nointerlineskip + \flushnextbox + \fi + \else + \setbox\nextbox\vbox to \textheight + {\ifdim\nextboxdp=\zeropoint + \hbox{\lower\strutdepth\flushnextbox} + \else % this branch is yet untested + \vss + \hbox{\lower\nextboxdp\flushnextbox} + \vskip-\strutdepth + \fi}% + \nextboxdp\strutdepth + \flushnextbox + \fi + \extrasnapreset + \enablepresnapcorrection + \global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount + \egroup}} + +\def\tracedgridamount#1#2% + {\startcolor[grid:four]% + \setlayoutcomponentattribute\v!grid\v!test + \hbox \layoutcomponentboxattribute{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}% + \stopcolor} + +\def\snaptomathgrid % probably not working ok, also kind of obsolete + {\ifgridsnapping + \dowithnextbox + {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]} + \vbox\bgroup + \forgetdisplayskips + \@EA\let\@EA\next + \fi} + +\def\topsnaptogrid + {\ifgridsnapping + \dowithnextbox + {\scratchdimen\nextboxht + \advance\scratchdimen -\strutht + \advance\scratchdimen \topskip + \nextboxht\scratchdimen + \nextboxdp\zeropoint + \flushnextbox + \kern\lineheight + \kern-\topskip + \nointerlineskip} + \hbox + \fi} + +% \def\centertogrid % meant for special situations +% {\ifgridsnapping +% \dowithnextboxcontent +% {\ignorespaces} +% {\bgroup +% \par +% \scratchdimen\nextboxht +% \advance\scratchdimen \nextboxdp +% \getnoflines\scratchdimen +% \setbox\nextbox\vbox to \noflines\lineheight +% {\forgetall +% \vskip\zeropoint \!!plus \nextboxht +% \copy\nextbox +% \kern.5\strutdp % VOORLOPIGE WAARDE +% \vskip\zeropoint \!!plus \nextboxdp}% +% \noindent\snaptogrid\vbox{\flushnextbox}% +% \egroup} +% \vbox % was \hbox +% \fi} + +% The next implementation is sub-optimal +% +% \def\centertogrid % usage: see ie pascal / stepcharts +% {\snaptogrid[\v!midden,.5\strutdp]\vbox} + +\def\centertogrid % meant for special situations + {\ifgridsnapping + \dowithnextboxcontent + {\ignorespaces} + {\bgroup + \par + \scratchdimen\nextboxht + \advance\scratchdimen \nextboxdp + \getnoflines\scratchdimen + \setbox\nextbox\vbox to \noflines\lineheight + {\forgetall + \vss + \topbaselinecorrection + \copy\nextbox + \botbaselinecorrection + \vss}% + \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}% + \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace + \noindent\snaptogrid\vbox{\flushnextbox}% + \egroup} + \vbox % was \hbox + \fi} + +% testbed for \centertogrid +% +% \strut Bruggetje +% \startlinecorrection +% \startcombination +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination[2*2] +% {\framed{test}} {} {\framed{test}} {} +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination[2*2] +% {\framed{test}} {} {\framed{test}} {} +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination[2*2] +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination[2*2] +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection + +\ifx\startbaselinecorrection\undefined \wait \fi % change order + +\let\normalstartbaselinecorrection=\startbaselinecorrection + +\def\startbaselinecorrection + {\ifgridsnapping + \centertogrid\bgroup + \let\stopbaselinecorrection\egroup + \else + \normalstartbaselinecorrection + \fi} + +\chardef\gridboxlinenomode\plusone +\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame + +\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% + {\setbox#1\gridboxvbox to #3 % given size + {\forgetall + \resetteststrut + \offinterlineskip + \hsize#2% + \baselinerulefalse + \gridboxvbox % calculated size + {\getrawnoflines{#3}% \getnoflines{#3}% + \vskip\topskip + \vskip-\strutht + \scratchdimen#2\advance\scratchdimen \lineheight + \dorecurse\noflines + {\strut + \hskip-.5\lineheight + \ifcase\gridboxlinenomode\or + \rlap + {\hskip.2\bodyfontsize\hskip\scratchdimen + \infofont\hbox to 1em{\hss\recurselevel}}% + \or + \llap + {\infofont\hbox to 1em{\hss\recurselevel}% + \hskip.2\bodyfontsize}% + \fi + \vrule + \!!height \gridboxwidth + \!!depth \gridboxwidth + \!!width \scratchdimen + \par}} + \vfill}} + +%D Some intervention macros: + +\def\gridwarning#1{\message{[beware of #1 extra snap]}} + +\global\let\@@alignsnapamount\!!zeropoint +\global\chardef\@@alignsnapdepth0 + +\def\@@unknowngriddisplacement + {\global\chardef\@@alignsnapbox\plusthree + \global\let\@@alignsnapamount\commalistelement} + +\def\domoveongrid[#1]% + {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi} + +\def\dodomoveongrid[#1]% some day : speed up + {\global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount + \global\chardef\@@alignsnapdepth\zerocount + \global\chardef\@@alignsnapmethod\zerocount + \global\let\@@alignsnapamount\!!zeropoint + \donefalse + \expanded{\processallactionsinset[#1]} + [\v!standard=>, + \v!normal=>, % to be sure + \v!yes=>, % to be sure + \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore, + \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter, + \v!both=>\positiveextrasnap\extrasnaparound, + -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore, + -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter, + -\v!both=>\negativeextrasnap\extrasnaparound, + \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations + \v!page=>\global\chardef\@@alignsnap\plusone, % topskip + \v!high=>\global\chardef\@@alignsnap\plustwo, + \v!middle=>\global\chardef\@@alignsnap\plusthree, + \v!low=>\global\chardef\@@alignsnap\plusfour, + \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new + \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new + \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new + \v!line=>\global\chardef\@@alignsnapbox\plusthree +% \global\chardef\@@alignsnapdepth\plusone + \global\chardef\@@alignsnap\plusfour, + \v!reset=>\positiveextrasnap\extrasnapreset, + \v!none=>\global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount, + \v!force=>, % turns on grid snapping even when not on + \s!default=>, + \s!unknown=>\@@unknowngriddisplacement]} + +\def\moveongrid + {\dosingleempty\domoveongrid} + +\def\doplaceongrid[#1]% + {\domoveongrid[#1]\snaptogrid\vbox} + +\def\placeongrid + {\dosingleempty\doplaceongrid} + +%D Snapping is rather robust as long as we use whole lines. +%D Half lines of white space can however be handled when they +%D come in pairs. The corrections needed when crossing page +%D boundaries in the middle of such a pair, are handled by +%D macros that are (named) sort of fuzzy. This fuzzy mechanism +%D was written as an extension to the grid typesetting needed +%D for typesetting (part of) the \MAPS. +%D +%D \starttyping +%D \setuptyping +%D [before={\blank[halfline]}, +%D after={\blank[halfline]}] +%D \stoptyping + +\newif \iffuzzyvskip +\newif \iffuzzysnapdone +\newif \iffuzzysnapping +\newif \iffuzzysnapped +\chardef \fuzzysnappedleft=0 % ==1 when fuzzybegin still open +\newpersistentmark\fuzzymark % (!) +\newcount \fuzzymarker +\newbox \fuzzysnapbox +\newbox \fuzzysnapsplit + +\def\dosyncfuzzyvskip + {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint + \bgroup % - added 28/2/2003: check this, there was no - + \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal + \egroup + \fi\fi\fi} + +\def\fuzzyvskip#1% + {\iffuzzysnapdone + \dosyncfuzzyvskip % NEWER + \endfuzzysnapping + \vskip#1\relax + \global\fuzzysnapdonefalse + \else + \vskip#1\relax + \beginfuzzysnapping + \global\fuzzysnapdonetrue + \fi} + +\def\setfuzzymark#1#2#3% #1/#2 => error recovery + {\ifgridsnapping + \global\fuzzysnappingtrue + \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi + \nobreak + \ifshowfuzzyskips + \hbox{\color[grid:three] + {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak + \vrule\!!width\hsize\!!height.1\lineheight}} + \nobreak + \fi + %[\the\fuzzymarker] + %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% + \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% + \nobreak + \fi} + +\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd +\def\endfuzzysnapping {\setfuzzymark12\v!stop } % even + +\def\removelastfuzzyvskip + {\ifgridsnapping + \iffuzzysnapping + \ifdim\lastskip<\openlineheight + \else + \removelastskip + \fi + \else + \removelastskip + \fi + \else + \removelastskip + \fi} + +\def\docheckfuzzysnap#1% + {\bgroup + \dontcomplain + \setbox\fuzzysnapbox\copy#1\relax + \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight + \let\topfuzzymark\empty % indeed here ... no real mark + \getsplitmarks\fuzzymark +% \ifcase0\topfuzzymark + \ifcase0\rawgetsplittopmark\fuzzymark + \global\chardef\fuzzysnappedleft\zerocount + \global\fuzzysnappedfalse +% \else\ifodd\topfuzzymark + \else\ifodd\rawgetsplittopmark\fuzzymark + \global\chardef\fuzzysnappedleft\plusone + \global\fuzzysnappedtrue + \else + \global\chardef\fuzzysnappedleft=2 + \global\fuzzysnappedtrue + \fi\fi + \iffuzzysnapped \else + \doloop + {\ifvoid\fuzzysnapbox + \exitloop + \else + \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight + %\let\topfuzzymark=\empty % ... but not here + \getsplitmarks\fuzzymark +% \ifcase0\topfuzzymark + \ifcase0\rawgetsplittopmark\fuzzymark + % continue +% \else\ifodd\topfuzzymark + \else\ifodd\rawgetsplittopmark\fuzzymark + \exitloop + \else + \global\chardef\fuzzysnappedleft\plusone + \global\fuzzysnappedtrue + \exitloop + \fi\fi + \fi}% + \fi + \egroup} + +\def\getfuzzysnapcorrection#1% + {\global\let\presnapcorrection \relax + \global\let\postsnapcorrection\relax + \ifgridsnapping\iffuzzysnapping + \docheckfuzzysnap{#1}% + \iffuzzysnapped + \iftracegridsnapping + \gdef\presnapcorrection + {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}% + \else + \gdef\presnapcorrection{\kern.5\openlineheight}% + \fi + \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok + \fi + \fi\fi} + +\def\fuzzysnappedbox#1#2% \box \unvbox + {\getfuzzysnapcorrection{#2}% + \presnapcorrection + #1#2% + \postsnapcorrection} + +\def\adaptfuzzypagegoal + {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents + \scratchdimen\pagegoal + \advance\scratchdimen -.5\openlineheight + \global\pagegoal\scratchdimen + \global\advance\vsize -.5\openlineheight + \global\chardef\fuzzysnappedleft0 + \fi\fi\fi} + +%D New, experimental, used in caption snapping: +%D +%D \starttyping +%D \startcolumnset +%D +%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top] +%D +%D \placefigure [lrtb] {\dorecurse{5}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D \placefigure [lrtb] {\dorecurse{15}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D +%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom] +%D +%D \placefigure [rltb] {\dorecurse{5}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D \placefigure [rltb] {\dorecurse{15}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D +%D \input thuan +%D +%D \stopcolumnset +%D \stoptyping + +\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! ! + {\doifsomething{#2} + {\getnoflines{\ht#1}% no depth taken into account, depth preserved + \scratchdimen\noflines\lineheight + \advance\scratchdimen-\strutdp + \bgroup + \advance\scratchdimen-\onepoint % be a bit tolerant + \ifdim\scratchdimen>\ht#1\relax + \egroup + \doif{#2}\v!top {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}% + \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}% + \dp#1\strutdp + \else + \egroup + \ht#1\scratchdimen + \dp#1\strutdp + \fi}} + +%D New: + +\let\checkgridsnapping\relax + +\protect \endinput diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv new file mode 100644 index 000000000..7dd036a22 --- /dev/null +++ b/tex/context/base/spac-hor.mkiv @@ -0,0 +1,821 @@ +%D \module +%D [ file=spac-hor, +%D version=2009.10.16, % 1997.03.31, was core-spa.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Horizontal, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Horizontal} + +\unprotect + +\let\currentindentation\empty % amount/keyword +\let\currentindenting \empty % method + +\newdimen\ctxparindent + +\newif\ifindentfirstparagraph % \indentfirstparagraphtrue + +\chardef\indentingtoggle\zerocount + +%D After a blank or comparable situation (left side floats) we +%D need to check if the next paragraph has to be indented. + +\def\presetindentation + {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}} + +%D This sets up the (normally) global indentation behavior as well +%D as the amounts. + +\definecomplexorsimple\setupindenting + +\indentfirstparagraphtrue +\parindent\ctxparindent +\chardef\indentingtoggle\zerocount + +% we need a better everypar model: for each option a switch, which we +% set to false with \forgetall and can enable when needed (context 4); +% that way we can control the order of execution of options + +\def\checkeverypar % currently a hack + {\ifzeropt\parindent\else + \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}% + \fi} + +\def\complexsetupindenting[#1]% + {\edef\currentindenting{#1}% + \doifsomething\currentindenting % handy when a parameter is passed + {% not here: \indentfirstparagraphtrue + % not here: \parindent\ctxparindent + % not here: \chardef\indentingtoggle\zerocount + % we use commacommand in order to catch #1 being a command (expanded parameter) + \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc + \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest + \checkeverypar % only when non-empty #1 + \ifindentfirstparagraph\else\noindentation\fi % added + \toggleindentation}} + +\def\docomplexsetupindentingA#1% + {\edefconvertedargument\!!stringa{#1}% can this be doen differently now? + \ifcsname\??in:\!!stringa\endcsname \else + \edef\currentindentation{#1}% + \let\normalindentation\currentindentation + \simplesetupindenting + \fi} + +\def\docomplexsetupindentingB#1% + {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen + \executeifdefined{\??in:\!!stringa}\donothing} + +\def\simplesetupindenting % empty case, a it strange, needed this way? + {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}} + +\def\indenting % kind of obsolete + {\dosingleargument\complexsetupindenting} + +% use \noindentation to suppress next indentation + +\def\defineindentingmethod[#1]#2% + {\setvalue{\??in:#1}{#2}} + +\defineindentingmethod [\v!no] {\parindent\zeropoint}% was: \ctxparindent\noindent} +\defineindentingmethod [\v!not] {\parindent\zeropoint}% was: \ctxparindent\noindent} + +\defineindentingmethod [\v!first] {\indentfirstparagraphtrue} +\defineindentingmethod [\v!next] {\indentfirstparagraphfalse} + +\defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent ! +\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent ! + +\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent ! + \chardef\indentingtoggle\zerocount} + +\defineindentingmethod [\v!odd] {\chardef\indentingtoggle\plusone} +\defineindentingmethod [\v!even] {\chardef\indentingtoggle\plustwo} + +\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else + \let\currentindentation\normalindentation + \simplesetupindenting + \fi} + +\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue + \parindent\zeropoint + \chardef\indentingtoggle\zerocount} + +\def\noindenting{\indenting[\v!no, \v!next ]} +\def\doindenting{\indenting[\v!yes,\v!first]} + +%D This one sets up the local indentation behaviour (i.e. either or not +%D a next paragraph will be indented). + +\def\dochecknextindentation#1% internal one + {\checknextindentation[\csname#1\c!indentnext\endcsname]} + +\setvalue{\??in->\s!empty}{} +\setvalue{\??in->\v!yes }{\doindentation} +\setvalue{\??in->\v!no }{\noindentation} +\setvalue{\??in->\v!auto }{\autoindentation} + +\def\checknextindentation[#1]% + {\csname\??in->\ifcsname\??in->#1\endcsname#1\else\s!empty\fi\endcsname} + +%D Here come the handlers. + +\newif\ifindentation \indentationtrue % documenteren, naar buiten + +\let\checkindentation\relax + +\ifx\autoindentation\undefined \let\autoindentation\relax \fi % hook + +\def\doindentation + {\gdef\checkindentation{\global\indentationtrue}} + +\def\noindentation % made global + {\ifinpagebody \else + \global\indentationfalse + \gdef\checkindentation + {\donoindentation + \gdef\checkindentation{\global\indentationtrue}}% + \fi} + +\def\nonoindentation % bv bij floats + {\ifinpagebody \else + \global\indentationtrue + \gdef\checkindentation{\global\indentationtrue}% + \fi} + +\def\donoindentation + {\ifdim\parindent=\zeropoint \else + \bgroup \setbox\scratchbox\lastbox \egroup + \fi} + +\def\indentation + {\ifvmode \ifdim\parindent=\zeropoint \else + % was : \hskip\parindent + % can be: \indent + % but we test: + \noindent\hskip\parindent + \fi \fi} + +\def\toggleindentation + {\ifcase\indentingtoggle + % nothing + \or + \notoggleindentation + \or + \dotoggleindentation + \fi} + +\def\dokillindentation + {\gdef\checkindentation{\global\indentationfalse\donoindentation}} + +\def\dotoggleindentation + {\gdef\checkindentation{\global\indentationfalse\notoggleindentation\donoindentation}} + +\def\notoggleindentation + {\gdef\checkindentation{\global\indentationtrue\dotoggleindentation}} + +\appendtoks + \pushmacro\checkindentation + \pushmacro\ifindentation +\to \everypushsomestate + +\appendtoks + \popmacro\ifindentation + \popmacro\checkindentation +\to \everypopsomestate + +% we need to save the state if we want to adapt behaviour to empty lines +% +% \def\setlasthvmode +% {\global\chardef\savedhvmode\ifhmode\plusone\else\ifvmode\plustwo\else\zerocount\fi\fi} +% +% \def\resetlasthvmode +% {\global\chardef\savedhvmode\zerocount} +% +% \chardef\savedhvmode\zerocount + +% This is a user requested hack (using the auto-hook). + +\chardef\recheckindentationmode\zerocount + +\def\dontrechecknextindentation + {\global\chardef\recheckindentationmode\zerocount} + +\def\dorechecknextindentation + {\ifcase\recheckindentationmode + % nothing + \or + \dontrechecknextindentation + \expandafter\doautoindentation + \fi} + +\def\doautoindentation + {\doifnextcharelse\par\donothing\noindentation} + +\def\autoindentation + {\global\chardef\recheckindentationmode\plusone} + +%D An example of usage: +%D +%D \starttyping +%D \setupindenting[small,yes] +%D +%D \setupitemize [indentnext=auto] +%D \setuptyping [indentnext=auto] +%D \setupformulas[indentnext=auto] +%D +%D \input tufte \startitemize \item itemize \stopitemize +%D \input tufte \startitemize \item itemize \stopitemize +%D \input tufte \startitemize \item itemize \stopitemize +%D +%D \page +%D +%D \input tufte +%D \starttyping +%D verbatim +%D \stoptyping +%D +%D \input tufte +%D \starttyping +%D verbatim +%D \stoptyping +%D +%D \input tufte +%D \starttyping +%D verbatim +%D \stoptyping +%D +%D \page +%D +%D \input tufte \startformula a = b \stopformula +%D \input tufte \startformula a = b \stopformula +%D \input tufte \startformula a = b \stopformula +%D \stoptyping + +\def\softbreak + {\relax\ifhmode\hskip\parfillskip\break\fi} + +%D {frenchspacing,nonfrenchspacing} +%D +%D Smehow \type{\frenchspacing} can lead to hyphenation between +%D dashes so we now have \type {\newfrenchspacing} (moved from +%D \type {syst-chr}). + +%D Hm ... todo: + +\sfcode`\)=0 +\sfcode`\'=0 +\sfcode`\]=0 + +\def\setfrenchspacing#1% + {\sfcode`\.#1 \sfcode`\,#1\relax + \sfcode`\?#1 \sfcode`\!#1\relax + \sfcode`\:#1 \sfcode`\;#1\relax} + +\def\frenchspacing + {\setfrenchspacing{1000}} + +\def\resetfrenchspacing + {\sfcode`\.3000 \sfcode`\,1250 + \sfcode`\?3000 \sfcode`\!3000 + \sfcode`\:2000 \sfcode`\;1500 } + +\def\frenchspacing {\setfrenchspacing{1000}} +\def\newfrenchspacing{\setfrenchspacing{1050}} +\def\nonfrenchspacing{\resetfrenchspacing} + +\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}} + +\definespacingmethod[\v!packed]{\newfrenchspacing} +\definespacingmethod[\v!broad ]{\nonfrenchspacing} + +\def\complexsetupspacing[#1]% + {\executeifdefined{\??sg\??sg#1}\relax + \updateraggedskips} + +\def\simplesetupspacing + {\updateraggedskips} + +\definecomplexorsimple\setupspacing + +% \dorecurse{100}{\recurselevel\spacefactor 800 \space} \par +% \dorecurse{100}{\recurselevel\spacefactor1200 \space} \par +% \dorecurse{100}{\recurselevel\spacefactor 800 \normalspaceprimitive} \par +% \dorecurse{100}{\recurselevel\spacefactor1200 \normalspaceprimitive} \par + +% When we don't add the % here, we effectively get \ and +% since we have by default \def\^^M{\ } we get into a loop. + +\let\normalspaceprimitive=\ % space-comment is really needed + +% hm ... + +\unexpanded\def\ {\mathortext\normalspaceprimitive\space} % no \dontleavehmode\space (else no frenchspacing) + +% Because I strip spaces at the end of lines (in the editor) we need a bit of +% a trick to define slash+newline, so \ and \ are the same + +\ctxlua{tex.sprint(tex.ctxcatcodes,"\string\\unexpanded\string\\def\string\\\string\n{\string\\ }")} + +\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\mathortext\ \space} % no space in math + +\letcatcodecommand \ctxcatcodes `\~ \nonbreakablespace % overloaded later + +\def\space { } +\def\removelastspace{\ifhmode\unskip\fi} +\def\nospace {\removelastspace\ignorespaces} + +% in tables we need: +% +% \def\fixedspace {\hskip.5em\relax} +% +% but, since not all fonts have .5em digits: + +\unexpanded\def\fixedspace + {\setbox\scratchbox\normalhbox{\mathortext{0}{0}}% + \hskip\wd\scratchbox\relax} + +\def\fixedspaces + {\letcatcodecommand \ctxcatcodes `\~ \fixedspace} + +\appendtoks\let~\space\to\simplifiedcommands + +% \def\removeunwantedspaces +% {\ifhmode % we also need to unskip 0pt skips +% \unskip\unskip\unskip\unskip\unskip +% \unskip\unskip\unskip\unskip\unskip +% \fi} + +\unexpanded\def\removeunwantedspaces + {\ifhmode + \expandafter \doremoveunwantedspace + \fi} + +\def\doremoveunwantedspace + {\ifnum\lastnodetype=\@@gluenode + \unskip \expandafter\doremoveunwantedspace + \fi} + +% \startbuffer +% \startlines \tt \fixedspaces +% 0~1~~2~~~3~~~~4~~~~~5 +% 0~~~~~~~~~~~~~~~~~~~5 +% $0~1~~2~~~3~~~~4~~~~~5$ +% $0~~~~~~~~~~~~~~~~~~~5$ +% \stoplines +% +% \starttabulate[|~|] +% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \NR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \NR +% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \NR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \NR +% \stoptabulate +% +% \starttable[||] +% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \AR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \AR +% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \AR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \AR +% \stoptable +% \stopbuffer +% +% \setupbodyfont[cmr] \getbuffer +% \setupbodyfont[lbr] \getbuffer + +%D A couple of plain macros: + +\ifx\thinspace\undefined + + \def\thinspace {\kern .16667\emwidth} + \def\negthinspace{\kern-.16667\emwidth} + \def\enspace {\kern .5\emwidth} + +\fi + +\ifx\quad\undefined + + \def\enskip{\hskip.5\emwidth} + \def\quad {\hskip \emwidth} + \def\qquad {\hskip 2\emwidth} + +\fi + +\let\emspace\quad + +% Suggested by GB (not the name -): + +\def\rapfillskip{.5\hsize plus .092\hsize minus .5\hsize} % D.A.'s value + +% Bovendien definieren we enkele extra \fill's: + +\def\hfilll{\hskip\zeropoint\!!plus1filll\relax} +\def\vfilll{\vskip\zeropoint\!!plus1filll\relax} + +% De onderstaande hulpmacro's moeten nog eens instelbaar worden +% gemaakt. + +\def\tfskipsize{1em\relax} +\def\tfkernsize{1ex\relax} + +\def\tfskip{\dotfskip\tfskipsize} +\def\tfkern{\dotfkern\tfkernsize} + +\def\dotfskip#1{{\tf\hskip#1}} +\def\dotfkern#1{{\tf\kern #1}} + +% needs a proper \definenarrower or installnarrower + +\newskip\ctxleftskip +\newskip\ctxrightskip +\newskip\ctxmidskip + +\def\dosinglenarrower#1% + {\processaction + [#1] + [ \v!left=>\global\advance\ctxleftskip \@@slleft, + \v!middle=>\global\advance\ctxmidskip \@@slmiddle, + \v!right=>\global\advance\ctxrightskip \@@slright, + \v!reset=>\global\ctxleftskip \zeropoint + \global\ctxmidskip \zeropoint + \global\ctxrightskip\zeropoint, + \v!none=>, + \s!unknown=>\global\advance\ctxmidskip \commalistelement]} + +\def\donarrower[#1]% hm, can be dorepeat directly + {\dorepeatwithcommand[#1]\dosinglenarrower} + +\def\complexstartnarrower[#1]% + {\@@slbefore % was hard coded \par + \bgroup + \global\ctxleftskip \zeropoint + \global\ctxrightskip\zeropoint + \global\ctxmidskip \zeropoint + \processcommalistwithparameters[#1]\donarrower + \advance\leftskip \ctxleftskip + \advance\rightskip \ctxrightskip + \advance\leftskip \ctxmidskip + \advance\rightskip \ctxmidskip + \seteffectivehsize} + +% todo: definenarrower + +\def\simplestartnarrower + {\startnarrower[\v!middle]} + +\definecomplexorsimple\startnarrower + +\def\stopnarrower + {\@@slafter % was hard coded \par / needed, else skips forgotten + \egroup} + +\def\setupnarrower + {\dodoubleargument\getparameters[\??sl]} + +\newdimen\@@effectivehsize \def\effectivehsize {\hsize} +\newdimen\@@effectiveleftskip \def\effectiveleftskip {\leftskip} +\newdimen\@@effectiverightskip \def\effectiverightskip{\rightskip} + +\def\seteffectivehsize + {\setlocalhsize + \@@effectivehsize \localhsize + \@@effectiveleftskip \leftskip + \@@effectiverightskip \rightskip + \let\effectivehsize \@@effectivehsize + \let\effectiveleftskip \@@effectiveleftskip + \let\effectiverightskip\@@effectiverightskip} + +\newskip\leftskipadaption +\newskip\rightskipadaption + +\def\doadaptleftskip#1% + {\dosetleftskipadaption{#1}% + \advance\leftskip \leftskipadaption} + +\def\doadaptrightskip#1% + {\dosetrightskipadaption{#1}% + \advance\rightskip \rightskipadaption} + +\setvalue{@lsa@\v!standard}{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} +\setvalue{@lsa@\v!yes }{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi} +\letvalue{@lsa@\v!no }\zeropoint +\letvalue{@lsa@\empty }\zeropoint +\setvalue{@rsa@\v!standard}{\@@slright} +\setvalue{@rsa@\v!yes }{\@@slright} +\letvalue{@rsa@\v!no }\zeropoint +\letvalue{@rsa@\empty }\zeropoint + +\def\dosetleftskipadaption#1% + {\edefconvertedargument\ascii{@lsa@#1}% + \leftskipadaption + \ifcsname\ascii\endcsname + \csname\ascii\endcsname + \else + #1% + \fi + \relax} + +\def\dosetrightskipadaption#1% + {\edefconvertedargument\ascii{@rsa@#1}% + \rightskipadaption + \ifcsname\ascii\endcsname + \csname\ascii\endcsname + \else + #1% + \fi + \relax} + +%D Tolerance: + +\def\dosetuptolerance[#1]% + {\doifinsetelse\v!vertical{#1}% + {\normalexpanded{\noexpand\processallactionsinset[#1]} + [ \v!verystrict=>\def\bottomtolerance{}, + \v!strict=>\def\bottomtolerance{.050}, + \v!tolerant=>\def\bottomtolerance{.075}, + \v!verytolerant=>\def\bottomtolerance{.100}]}% + {\normalexpanded{\noexpand\processallactionsinset[#1]} + [ \v!stretch=>\emergencystretch\bodyfontsize, + \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax, + \v!verystrict=>\tolerance 200, + \v!strict=>\tolerance1500, + \v!tolerant=>\tolerance3000, + \v!verytolerant=>\tolerance4500]}} + +\def\setuptolerance + {\dosingleargument\dosetuptolerance} + +%D \macros +%D {pushindentation,popindentation} +%D +%D The pushing and popping is done by: + +\newbox\indentationboxA +\newbox\indentationboxB + +\def\pushindentation + {\bgroup + \ifhmode + \unskip + \setbox\indentationboxA\lastbox % get \strut if present + \unskip + \setbox\indentationboxB\lastbox % get \indent generated box + \unskip + \else + \hskip\zeropoint % switch to horizontal mode + \unskip + \setbox\indentationboxA\lastbox % get \indent generated box + \setbox\indentationboxB\emptybox + \fi} + +\def\popindentation + {\box\indentationboxB\box\indentationboxA % put back the boxes + \egroup} + +%D The only complication lays in \type{\strut}. In \PLAIN\ +%D \TEX\ a \type{\strut} is defined as: +%D +%D \starttyping +%D \def\strut% +%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} +%D \stoptyping +%D +%D But what is a \type{\strut}? Normally it's a rule of width +%D zero, but when made visual, it's a rule and a negative skip. +%D The mechanism for putting things in the margins described +%D here cannot handle this situation very well. One +%D characteristic of \type{\strut} is that the \type{\unhcopy} +%D results in entering horizontal mode, which in return leads +%D to some indentation. +%D +%D To serve our purpose a bit better, the macro \type{\strut} +%D can be redefined as: +%D +%D \starttyping +%D \def\strut +%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox} +%D \stoptyping +%D +%D Or more compatible: +%D +%D \starttyping +%D \def\strut +%D {\relax\ifmmode +%D \copy\strutbox +%D \else +%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup +%D \fi} +%D \stoptyping +%D +%D In \CONTEXT\ however we save some processing time by putting +%D an extra \type{\hbox} around the \type{\strutbox}. + +% moved from page-lin.tex to here (due to visualization added +% in august 2003) +% +% \unexpanded \def\crlf +% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break} + +\unexpanded \def\crlf + {\ifhmode + \unskip + \prewordbreak\crlfplaceholder + \ifcase\raggedstatus\hfil\or\or\or\hfil\fi + \break + \else + \crlfplaceholder + \endgraf + \fi} + +\def\crlfplaceholder + {\strut} + +\def\settestcrlf + {\def\crlfplaceholder + {\hbox to \zeropoint + {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}} + +%D \starttyping +%D % \setuplayout[gridgrid=yes] \showgrid +%D +%D \startbuffer +%D test 1\crlf +%D test 2\crlf +%D +%D \crlf test 3 +%D +%D test 4\crlf +%D test 5 +%D +%D \crlf +%D \crlf +%D \crlf +%D test 6 +%D \stopbuffer +%D +%D \hbox +%D {\hsize5em +%D \ruledvtop{\getbuffer}\enspace +%D \ruledvtop{\showstruts\getbuffer}\enspace +%D \hsize15em \setuptyping[before=,after=]% +%D \ruledvtop{\typebuffer}} +%D \stoptyping + +\def\justonespace + {\removelastspace\space} % \removeunwantedspaces\space + +\def\ignorecrlf + {\let\crlf\justonespace\let\\\crlf} + +\def\definehspace + {\dotripleempty\dodefinehspace} + +\def\dodefinehspace[#1][#2][#3]% #1 = optional namespace + {\ifthirdargument + \setvalue{\??hs#1:#2}{#3}% + \else + \setvalue{\??hs:#1}{#2}% + \fi} + +\unexpanded\def\hspace + {\dodoubleempty\dohspace} + +\def\dohspace[#1][#2]% + {\ifsecondargument + \dodohspace[#1][#2]% + \else\iffirstargument + \hspace[][#1]% + \else + \hspace[][\s!default]% + \fi\fi} + +\def\dodohspace[#1][#2]% + {\ifhmode + \removeunwantedspaces + \hskip\hspaceamount{#1}{#2}% + \expandafter\ignorespaces + \fi} + +\def\hspaceamount#1#2% + {\executeifdefined{\??hs#1:#2}{\executeifdefined{\??hs:#2}\zeropoint}} + +\definehspace [\v!small] [.25\emspaceamount] +\definehspace [\v!medium] [.5\emspaceamount] +\definehspace [\v!big] [1\emspaceamount] +\definehspace [\v!normal] [1\spaceamount] +\definehspace [\v!default] [\spaceamount] + +%D Taken from Taco's math module (cq. \AMS\ macros), but +%D adapted to \type {\hspace}: + +\unexpanded\def\textormathspace #1#2#3{\ifmmode\mskip#1#2\else\kern #1\hspaceamount\empty{#3}\fi\relax} +\unexpanded\def\breakabletextormathspace#1#2#3{\ifmmode\mskip#1#2\else\hskip#1\hspaceamount\empty{#3}\fi\relax} + +\newmuskip\hairmuskip \hairmuskip=.15mu + +\unexpanded\def\hairspace {\textormathspace+\hairmuskip{.5}} +\unexpanded\def\thinspace {\textormathspace+\thinmuskip 1} +\unexpanded\def\medspace {\textormathspace+\medmuskip 2} +\unexpanded\def\thickspace {\textormathspace+\thickmuskip3} +\unexpanded\def\neghairspace {\textormathspace-\thinmuskip{.5}} +\unexpanded\def\negthinspace {\textormathspace-\thinmuskip 1} +\unexpanded\def\negmedspace {\textormathspace-\medmuskip 2} +\unexpanded\def\negthickspace{\textormathspace-\thickmuskip3} + +% needed for unicode: + +\unexpanded\def\breakablethinspace {\breakabletextormathspace+\thinmuskip 1} + +\unexpanded\def\twoperemspace {\hskip\dimexpr\emwidth/2\relax} % == \enspace +\unexpanded\def\threeperemspace {\hskip\dimexpr\emwidth/3\relax} +\unexpanded\def\fourperemspace {\hskip\dimexpr\emwidth/4\relax} +\unexpanded\def\fiveperemspace {\hskip\dimexpr\emwidth/5\relax} % goodie +\unexpanded\def\sixperemspace {\hskip\dimexpr\emwidth/6\relax} +\unexpanded\def\figurespace {\begingroup\setbox\scratchbox\hbox{0}\hskip\wd\scratchbox\endgroup} % there is a command for this +\unexpanded\def\punctuationspace {\begingroup\setbox\scratchbox\hbox{.}\hskip\wd\scratchbox\endgroup} +\unexpanded\def\ideographicspace {\hskip\dimexpr\emwidth/1\relax} +\unexpanded\def\ideographichalffillspace{\hskip\dimexpr\emwidth/2\relax} +%unexpanded\def\nobreakspace {\penalty\plustenthousand\space} +\unexpanded\def\nobreakspace {\penalty\plustenthousand\kern\interwordspace} +\unexpanded\def\narrownobreakspace {\penalty\plustenthousand\thinspace} +%unexpanded\def\zerowidthnobreakspace {\penalty\plustenthousand\hskip\zeropoint} +\unexpanded\def\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint} +\unexpanded\def\zerowidthspace {\hskip\zeropoint} + +\definehspace[.5][.1250\emspaceamount] % could also be [.1250\spaceamount] +\definehspace[1] [.1667\emspaceamount] +\definehspace[2] [.2222\emspaceamount] +\definehspace[3] [.2777\emspaceamount] + +\let \, \thinspace +\let \: \medspace +\let \; \thickspace +\let \! \negthinspace + +\def\flexiblespaceamount#1#2#3% + {#1\interwordspace + \!!plus#2\interwordstretch + \!!minus#3\interwordshrink} + +\def\fixedspaceamount#1% + {#1\interwordspace} + +%D This is a dangerous feature because it makes the \TEX\ source +%D less portable, i.e. any parser now needs to apply exactly the +%D same algorithm when it wants to interpret the source. We +%D strongly recommend not to mention this feature in manuals! It's +%D provided for users who are hooked to such a mechanism. +%D +%D \starttyping +%D \setupsorting[logo][next=\autoinsertnextspace] \logo[TEX]{\TeX} +%D +%D bla bla \TEX bla bla \TEX (bla) bla (\TEX) +%D \stoptyping + +\def\autoinsertnextspace{\futurelet\nexttoken\doautoinsertnextspace} + +\def\doautoinsertnextspace % slightly extended version of a user supplied macro + {\ifx\nexttoken \bgroup\else \ifx\nexttoken\begingroup\else + \ifx\nexttoken \egroup\else \ifx\nexttoken \endgroup\else + \ifx\nexttoken \/\else \ifx\nexttoken /\else \ifx\nexttoken ~\else + \ifx\nexttoken \ \else \ifx\nexttoken \blankspace\else \ifx\nexttoken \space\else + \ifx\nexttoken .\else \ifx\nexttoken ,\else + \ifx\nexttoken !\else \ifx\nexttoken ?\else + \ifx\nexttoken :\else \ifx\nexttoken ;\else + \ifx\nexttoken '\else \ifx\nexttoken "\else + \ifx\nexttoken )\else \ifx\nexttoken -\else \ifx\nexttoken |\else + \ifx\nexttoken \%\else \ifx\nexttoken \&\else + \space + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% moved from page-lin + +\def\installspacehandler#1#2% needs to set \obeyedspace + {\setvalue{\??sr#1}{#2}} + +\installspacehandler \v!on + {\obeyspaces + \def\obeyedspace{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}% + \let\ =\obeyedspace} + +\installspacehandler \v!yes + {\obeyspaces + \def\obeyedspace{\mathortext\normalspace{\dontleavehmode \normalspace }}% + \let\ =\obeyedspace} + +\installspacehandler \v!off + {\normalspaces + \let\obeyedspace\normalspace + \let\ =\normalspace} + +\installspacehandler \v!fixed + {\obeyspaces + \def\obeyedspace{\mathortext\normalspace{\dontleavehmode\fixedspace}}% + \let\ =\obeyedspace} + +\def\activatespacehandler#1% + {\executeifdefined{\??sr#1}{\activatespacehandler\v!off}} + +\protect \endinput diff --git a/tex/context/base/spac-pag.mkiv b/tex/context/base/spac-pag.mkiv new file mode 100644 index 000000000..c32992351 --- /dev/null +++ b/tex/context/base/spac-pag.mkiv @@ -0,0 +1,201 @@ +%D \module +%D [ file=spac-pag, +%D version=2009.10.16, % 1997.03.31, was core-spa.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Pages, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Pages} + +\unprotect + +%D A quick way to determine left|/|middle|/|right states +%D (experimental). + +\setvalue{\??as\v!left }{0} +\setvalue{\??as\v!middle}{1} +\setvalue{\??as\v!right }{2} + +\def\setalignmentswitch#1% + {\chardef\alignmentswitch0\csname\??as#1\endcsname\relax} + +%D + +\newcount \noftrackedpagestates +\newif \ifpagestatemismatch +\newcount \realpagestateno +\chardef \frozenpagestate \zerocount + +\def\dotrackpagestate#1#2% + {\ifdoublesided \ifinpagebody \else + \doforcedtrackpagestate{#1}{#2}% + \fi \fi} + +\def\doforcedtrackpagestate#1#2% + {\ifcase\frozenpagestate + \global\advance\noftrackedpagestates\plusone + \global\advance#2\plusone + \lazysavetaggedtwopassdata{#1}{\number\noftrackedpagestates}{\number#2}{\noexpand\realfolio}% + %\llap{\infofont\number\noftrackedpagestates/\number#2}% tracing + \fi} + +\def\doifrightpagestateelse#1#2% + {\ifcase\frozenpagestate + \pagestatemismatchfalse + \realpagestateno\realfolio + \ifinpagebody + \ifdoublesided + \ifodd\realpageno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \else + \twopassdatafoundtrue + \fi + \else\ifdoublesided + \findtwopassdata{#1}{\number#2}% + \iftwopassdatafound + \realpagestateno\twopassdata\relax + \ifnum\twopassdata=\realpageno \else + \pagestatemismatchtrue + \fi + \ifodd\twopassdata\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \else + \ifodd\realpageno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \else + \twopassdatafoundtrue + \fi\fi + \else + \ifodd\realpagestateno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \iftwopassdatafound + \@EA\firstoftwoarguments + \else + \@EA\secondoftwoarguments + \fi} + +\def\doifforcedrightpagestateelse#1#2% + {\ifcase\frozenpagestate + \pagestatemismatchfalse + \realpagestateno\realfolio + \findtwopassdata{#1}{\number#2}% + \iftwopassdatafound + \realpagestateno\twopassdata\relax + \ifnum\twopassdata=\realpageno \else + \pagestatemismatchtrue + \fi + \ifodd\twopassdata\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \else + \ifodd\realpageno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \else + \ifodd\realpagestateno\relax + \twopassdatafoundtrue \else \twopassdatafoundfalse + \fi + \fi + \iftwopassdatafound + \@EA\firstoftwoarguments + \else + \@EA\secondoftwoarguments + \fi} + +\def\freezepagestate {\chardef\frozenpagestate\plusone } +\def\defrostpagestate{\chardef\frozenpagestate\zerocount} + +% we can make more of these on top, but how to deal with mixed frozen states + +\definetwopasslist\s!paragraph \newcount \nofraggedparagraphs + +\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs} +\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs} + +\newcount\pagesignallevel + +\def\startsignalrightpage % one may do a \postsignalrightplace + {\advance\pagesignallevel\plusone + \presignalrightpage + \let\signalrightpage\relax + \let\presignalrightpage\relax + \let\startsignalrightpage\relax + \doifrightpageelse\donothing\donothing + \freezepagestate} + +\def\stopsignalrightpage + {\ifcase\pagesignallevel\or\postsignalrightpage\fi + \advance\pagesignallevel\minusone} + +\def\setraggedparagraphmode + {\signalrightpage\doifrightpageelse} % move it there + +\ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo + +\def\doifswappedrightpageelse#1#2% alleen in box construction ! + {\doifrightpageelse + {#1} + {\scratchcounter\realpageno + \realpageno\realpagestateno\relax + \swapmargins + \realpageno\scratchcounter + #2}} + +\newbox\signaledrightpage % this way we can avoid interference, i.e. postpone placement + +\def\presignalrightpage {\global\setbox\signaledrightpage\hbox{\signalrightpage}} +\def\postsignalrightpage{\ifvoid\signaledrightpage\else\box\signaledrightpage\fi} + +% The next feature is is used in: +% +% \definenumber[test][way=bypage] +% +% \def\Test +% {\incrementnumber[test]\rawnumber[test]/% +% \incrementnumber[test]\rawnumber[test]/% +% \incrementnumber[test]\rawnumber[test]\space +% \checkpagechange{oeps}\changedpage{oeps}\space +% \ifpagechanged TRUE\else FALSE\fi} +% +% \Test\page \Test\par \Test\page \Test\par \Test\page \Test\page +% +% (adapted from cont-new.tex:) + +\newif\ifpagechanged \let\lastchangedpage\empty + +\def\docheckpagestatechange#1#2#3% + {\pagechangedfalse + \doforcedtrackpagestate{#2}{#3}% + \findtwopassdata{#2}{\number#3}% + \iftwopassdatafound + \ifnum\twopassdata>0\getvalue{#2:p:#1}\relax + \pagechangedtrue + \fi + \fi + \ifpagechanged + \letgvalue{#2:p:#1}\twopassdata + \globallet\lastchangedpage\twopassdata + \else + \globallet\lastchangedpage\realfolio + \fi} + +\def\changedpagestate#1#2% + {\executeifdefined{#2:p:#1}{0}} + +\def\checkpagechange#1{\docheckpagestatechange{#1}\s!paragraph\nofraggedparagraphs} +\def\changedpage #1{\changedpagestate{#1}\s!paragraph} + +\protect \endinput diff --git a/tex/context/base/spac-par.mkiv b/tex/context/base/spac-par.mkiv new file mode 100644 index 000000000..92ea945f7 --- /dev/null +++ b/tex/context/base/spac-par.mkiv @@ -0,0 +1,206 @@ +%D \module +%D [ file=spac-par, +%D version=2009.10.16, % 1997.03.31, was core-spa.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Paragraphs, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Paragraphs} + +\unprotect + + +%D The dreadful sequence \type {\bgroup} \unknown\ +%D \type {\carryoverpar} \unknown\ \type {\egroup} is needed +%D when for instance sidefloats are used in combination with +%D something that starts with a group. This is because +%D otherwise the indentation as set (by the output routine) +%D inside the group are forgotten afterwards. (I must +%D not forget its existence). + +\global\let\carriedoverpar\relax + +\def\carryoverpar#1% + {\normalexpanded % \scratchtoks{#1}% + {\noexpand#1% \the\scratchtoks + \hangindent\the\hangindent + \hangafter \the\hangafter + \parskip \the\parskip + \leftskip \the\leftskip + \rightskip \the\rightskip}} + + +\newconditional \parbasedattributes + +\def\finishparbasedattributes + {\ifconditional\parbasedattributes + \setfalse\parbasedattributes + \par + \fi} + +\def\dostopparbasedattributes + {\settrue\parbasedattributes + \dostopattributes} + +% beware, changing this will break some code (like pos/backgrounds) + +\newtoks\everyfirstparagraphintro +\newtoks\everynextparagraphintro +\newtoks\@@everyparagraphtoks + +\chardef\everyparagraphintro\zerocount + +\def\setupparagraphintro + {\dodoubleempty\dosetupparagraphintro} + +\def\dosetupparagraphintro[#1][#2]% + {\processallactionsinset + [#1] + [ \v!reset=>\global\chardef\everyparagraphintro\zerocount + \global\everyfirstparagraphintro\emptytoks + \global\everynextparagraphintro \emptytoks, + \v!first=>\global\chardef\everyparagraphintro\plusone + \doglobal\appendtoks#2\to\everyfirstparagraphintro, + \v!next=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plusone\fi + \doglobal\appendtoks#2\to\everynextparagraphintro, + \v!each=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plustwo\fi + \doglobal\appendtoks#2\to\everyfirstparagraphintro + \doglobal\appendtoks#2\to\everynextparagraphintro]} + +%D We can say: +%D +%D \starttyping +%D \setupparagraphintro[first][\index{Knuth}] +%D \stoptyping +%D +%D Maybe more convenient is: +%D +%D \starttyping +%D \flushatparagraph{\index{Zapf}} +%D \stoptyping + +\def\flushatparagraph#1% + {\global\chardef\everyparagraphintro\plusone + \global\appendtoks{#1}\to\everyfirstparagraphintro + \global\let\insertparagraphintro\doinsertparagraphintro} + +\def\doinsertparagraphintro % can be merged with the next + {\ifcase\everyparagraphintro\else\@EA\dodoinsertparagraphintro\fi} + +\def\dodoinsertparagraphintro + {\begingroup + \everypar\emptytoks + \ifcase\everyparagraphintro\relax + % no data + \@@everyparagraphtoks\emptytoks + \or + % first data + \global\chardef\everyparagraphintro\plustwo + \@@everyparagraphtoks\everyfirstparagraphintro + \global\everyfirstparagraphintro\emptytoks + \or + % next data + \@@everyparagraphtoks\everynextparagraphintro + \fi + \the\@@everyparagraphtoks + \global\let\insertparagraphintro\relax + \endgroup} + +\let\insertparagraphintro\relax + +%D \starttyping +%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}] +%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}] +%D \setupparagraphintro[next] [\hbox to 3.5em{\tt NEXT \hss}] +%D \setupparagraphintro[next] [\hbox to 3.5em{\tt TXEN \hss}] +%D \setupparagraphintro[each] [\hbox to 3.0em{\tt EACH \hss}] +%D \setupparagraphintro[each] [\hbox to 3.0em{\tt HCEA \hss}] +%D +%D some paragraph \par +%D some paragraph \par +%D some paragraph \par +%D +%D \definelabel[parnumber] +%D +%D \setupparagraphintro[reset,each][\inleft{\slxx\parnumber}] +%D +%D some paragraph \par +%D some paragraph \par +%D some paragraph \par +%D \stoptyping + +%D \macros +%D {flushatnextpar} +%D +%D This macro collects data that will be flushed at the next paragraph. +%D By using this macro you can avoid interfering nodes (writes, etc). + +\newbox\postponednodedata +\let\flushpostponednodedata\relax + +\def\flushatnextpar + {\bgroup + \global\let\flushpostponednodedata\doflushpostponednodedata + \dowithnextbox{\global\setbox\postponednodedata\hbox{\box\postponednodedata\box\nextbox}\egroup}\hbox} + +\def\doflushpostponednodedata + {\ifvoid\postponednodedata\else + \hbox{\smashedbox\postponednodedata}% + \fi + \global\let\flushpostponednodedata\relax} + +% Very nasty but needed for margin stuff inside colored +% paragraphs. + +\let\normalvadjust\vadjust + +% \def\graphicvadjust % bad, those low level color calls here +% {\dowithnextboxcontent +% {\forgetall} +% {\normalvadjust +% {\unvbox\nextbox +% % corrects for one line paragraphs +% \nointerlineskip +% \kern-\struttotal +% \nointerlineskip +% \verticalstrut}}% +% \vbox} + +\def\graphicvadjust % nasty bidi handling + {\dowithnextboxcontent + {\forgetall} + {\vadjust{\vbox attr \graphicvadjustattribute \plusone + {\unvbox\nextbox + % corrects for one line paragraphs + \nointerlineskip + \kern-\struttotal + \nointerlineskip + \verticalstrut}}}% + \vbox} + +%D This works only in a properly strutted line, and is meant +%D for deeply burried operations, like in heads. + +\def\fakedvadjust + {\dowithnextbox + {\setbox\nextbox\hbox{\llap{\lower\strutdepth\box\nextbox}}% + \smashedbox\nextbox}% + \vtop} + +\def\localvbox#1#% + {\vbox#1\bgroup + \forgetparskip + \setlocalhsize + \hsize\localhsize + \forgetparindent + \forgetbothskips + \forgeteverypar + \let\next=} + +\protect \endinput diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua new file mode 100644 index 000000000..16291df27 --- /dev/null +++ b/tex/context/base/spac-ver.lua @@ -0,0 +1,732 @@ +if not modules then modules = { } end modules ['spac-ver'] = { + version = 1.001, + comment = "companion to spac-ver.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- this code dates from the beginning and is kind of experimental; it +-- will be optimized and improved soon + +local next, type = next, type +local format, gmatch, concat = string.format, string.gmatch, table.concat +local texsprint, texlists = tex.sprint, tex.lists + +local ctxcatcodes = tex.ctxcatcodes +local variables = interfaces.variables + +local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming + +-- vertical space handler + +local trace_vbox_vspacing = false trackers.register("nodes.vbox_vspacing", function(v) trace_vbox_vspacing = v end) +local trace_page_vspacing = false trackers.register("nodes.page_vspacing", function(v) trace_page_vspacing = v end) +local trace_collect_vspacing = false trackers.register("nodes.collect_vspacing", function(v) trace_collect_vspacing = v end) +local trace_vspacing = false trackers.register("nodes.vspacing", function(v) trace_vspacing = v end) + +local skip_category = attributes.private('skip-category') +local skip_penalty = attributes.private('skip-penalty') +local skip_order = attributes.private('skip-order') +local snap_category = attributes.private('snap-category') +local display_math = attributes.private('display-math') + +local has_attribute = node.has_attribute +local unset_attribute = node.unset_attribute +local set_attribute = node.set_attribute +local find_node_tail = node.tail +local free_node = node.free +local copy_node = node.copy +local traverse_nodes = node.traverse +local insert_node_before = node.insert_before +local insert_node_after = node.insert_after +local remove_node = nodes.remove +local make_penalty_node = nodes.penalty +local count_nodes = nodes.count +local node_ids_to_string = nodes.ids_to_string +local hpack_node = node.hpack + +local glyph = node.id("glyph") +local penalty = node.id("penalty") +local kern = node.id("kern") +local glue = node.id('glue') +local hlist = node.id('hlist') +local vlist = node.id('vlist') +local adjust = node.id('adjust') + +vspacing = vspacing or { } + +vspacing.categories = { + [0] = 'discard', + [1] = 'largest', + [2] = 'force' , + [3] = 'penalty', + [4] = 'add' , + [5] = 'disable', + [6] = 'nowhite', + [7] = 'goback', +} + +local categories = vspacing.categories + +function vspacing.tocategories(str) + local t = { } + for s in gmatch(str,"[^, ]") do + local n = tonumber(s) + if n then + t[categories[n]] = true + else + t[b] = true + end + end + return t +end + +function vspacing.tocategory(str) + if type(str) == "string" then + return set.tonumber(vspacing.tocategories(str)) + else + return set.tonumber({ [categories[str]] = true }) + end +end + +vspacing.data = vspacing.data or { } +vspacing.data.map = vspacing.data.map or { } +vspacing.data.skip = vspacing.data.skip or { } + +storage.register("vspacing/data/map", vspacing.data.map, "vspacing.data.map") +storage.register("vspacing/data/skip", vspacing.data.skip, "vspacing.data.skip") + +do -- todo: interface.variables + + local function logger(c,s) + logs.report("vspacing",s) + texsprint(c,s) + end + + vspacing.fixed = false + + local map = vspacing.data.map + local skip = vspacing.data.skip + + local multiplier = lpeg.C(lpeg.S("+-")^0 * lpeg.R("09")^1) * lpeg.P("*") + local category = lpeg.P(":") * lpeg.C(lpeg.P(1)^1) + local keyword = lpeg.C((1-category)^1) + local splitter = (multiplier + lpeg.Cc(1)) * keyword * (category + lpeg.Cc(false)) + + local k_fixed, k_flexible, k_category, k_penalty, k_order = variables.fixed, variables.flexible, "category", "penalty", "order" + + local function analyse(str,oldcategory,texsprint) +--~ print(table.serialize(map)) +--~ print(table.serialize(skip)) + for s in gmatch(str,"([^ ,]+)") do + local amount, keyword, detail = splitter:match(s) + if not keyword then + logs.report("vspacing","unknown directive: %s",s) + else + local mk = map[keyword] + if mk then + category = analyse(mk,category,texsprint) + elseif keyword == k_fixed then + texsprint(ctxcatcodes,"\\fixedblankskip") + elseif keyword == k_flexible then + texsprint(ctxcatcodes,"\\flexibleblankskip") + elseif keyword == k_category then + local category = tonumber(detail) + if category then + texsprint(ctxcatcodes,format("\\setblankcategory{%s}",category)) + if category ~= oldcategory then + texsprint(ctxcatcodes,"\\flushblankhandling") + oldcategory = category + end + end + elseif keyword == k_order and detail then + local order = tonumber(detail) + if order then + texsprint(ctxcatcodes,format("\\setblankorder{%s}",order)) + end + elseif keyword == k_penalty and detail then + local penalty = tonumber(detail) + if penalty then + texsprint(ctxcatcodes,format("\\setblankpenalty{%s}",penalty)) + texsprint(ctxcatcodes,"\\flushblankhandling") + end + else + amount = tonumber(amount) or 1 + local sk = skip[keyword] + if sk then + texsprint(ctxcatcodes,format("\\addblankskip{%s}{%s}{%s}",amount,sk[1],sk[2] or sk[1])) + else -- no check + texsprint(ctxcatcodes,format("\\addblankskip{%s}{%s}{%s}",amount,keyword,keyword)) + end + end + end + end + return category + end + + function vspacing.analyse(str) + local texsprint = (trace_vspacing and logger) or texsprint + texsprint(ctxcatcodes,"\\startblankhandling") + analyse(str,1,texsprint) + texsprint(ctxcatcodes,"\\stopblankhandling") + end + + -- + + function vspacing.setmap(from,to) + map[from] = to + end + + function vspacing.setskip(key,value,grid) + if value ~= "" then + if grid == "" then grid = value end + skip[key] = { value, grid } + end + end + +end + +-- implementation + +nodes.snapvalues = { } + +function nodes.setsnapvalue(n,ht,dp) + nodes.snapvalues[n] = { ht, dp, ht+dp } +end + +local trace_list, tracing_info, before, after = { }, false, "", "" + +local function glue_to_string(glue) + local spec = glue.spec + if spec then + local t = { } + t[#t+1] = aux.strip_zeros(number.topoints(spec.width)) + if spec.stretch_order and spec.stretch_order ~= 0 then + t[#t+1] = format("plus -%sfi%s",spec.stretch/65536,string.rep("l",math.abs(spec.stretch_order)-1)) + elseif spec.stretch and spec.stretch ~= 0 then + t[#t+1] = format("plus %s",aux.strip_zeros(number.topoints(spec.stretch))) + end + if spec.shrink_order and spec.shrink_order ~= 0 then + t[#t+1] = format("minus -%sfi%s",spec.shrink/65536,string.rep("l",math.abs(spec.shrink_order)-1)) + elseif spec.shrink and spec.shrink ~= 0 then + t[#t+1] = format("minus %s",aux.strip_zeros(number.topoints(spec.shrink))) + end + return concat(t," ") + else + return "[0pt]" + end +end + +local function nodes_to_string(head) + local current, t = head, { } + while current do + local id = current.id + local ty = node.type(id) + if id == penalty then + t[#t+1] = format("%s:%s",ty,current.penalty) + elseif id == glue then + if current.spec then + t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.spec.width))) + else + t[#t+1] = format("%s:[0pt]",ty) + end + elseif id == kern then + t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.kern))) + else + t[#t+1] = ty + end + current = current.next + end + return concat(t," + ") +end + +local function reset_tracing(head) + trace_list, tracing_info, before, after = { }, false, nodes_to_string(head), "" +end + +local function trace_skip(str,sc,so,sp,data) + trace_list[#trace_list+1] = { "skip", format("%s | %s | category %s | order %s | penalty %s", str, glue_to_string(data), sc or "-", so or "-", sp or "-") } + tracing_info = true +end + +local function trace_natural(str,data) + trace_list[#trace_list+1] = { "skip", format("%s | %s", str, glue_to_string(data)) } + tracing_info = true +end + +local function trace_info(message, where, what) + trace_list[#trace_list+1] = { "info", format("%s: %s/%s",message,where,what) } +end + +local function trace_node(what) + local nt = node.type(what.id) + local tl = trace_list[#trace_list] + if tl[1] == "node" then + trace_list[#trace_list] = { "node", tl[2] .. " + " .. nt } + else + trace_list[#trace_list+1] = { "node", nt } + end +end + +local function trace_done(str,data) + if data.id == penalty then + trace_list[#trace_list+1] = { "penalty", format("%s | %s", str, data.penalty) } + else + trace_list[#trace_list+1] = { "glue", format("%s | %s", str, glue_to_string(data)) } + end + tracing_info = true +end + +local function show_tracing(head) + if tracing_info then + after = nodes_to_string(head) + for i=1,#trace_list do + local tag, text = unpack(trace_list[i]) + if tag == "info" then + logs.report("collapse",text) + else + logs.report("collapse"," %s: %s",tag,text) + end + end + logs.report("collapse","before: %s",before) + logs.report("collapse","after : %s",after) + end +end + +-- alignment box begin_of_par vmode_par hmode_par insert penalty before_display after_display + +local user_skip = 0 +local line_skip = 1 +local baseline_skip = 2 +local par_skip = 3 +local above_display_skip = 4 +local below_display_skip = 5 +local above_display_short_skip = 6 +local below_display_short_skip = 7 +local left_skip_code = 8 +local right_skip_code = 9 +local top_skip_code = 10 +local split_top_skip_code = 11 +local tab_skip_code = 12 +local space_skip_code = 13 +local xspace_skip_code = 14 +local par_fill_skip_code = 15 +local thin_mu_skip_code = 16 +local med_mu_skip_code = 17 +local thick_mu_skip_code = 18 + +local skips = { + [ 0] = "user_skip", + [ 1] = "line_skip", + [ 2] = "baseline_skip", + [ 3] = "par_skip", + [ 4] = "above_display_skip", + [ 5] = "below_display_skip", + [ 6] = "above_display_short_skip", + [ 7] = "below_display_short_skip", + [ 8] = "left_skip_code", + [ 9] = "right_skip_code", + [10] = "top_skip_code", + [11] = "split_top_skip_code", + [12] = "tab_skip_code", + [13] = "space_skip_code", + [14] = "xspace_skip_code", + [15] = "par_fill_skip_code", + [16] = "thin_mu_skip_code", + [17] = "med_mu_skip_code", + [18] = "thick_mu_skip_code", +} + +local free_glue_node = free_node +local free_glue_spec = free_node +local discard, largest, force, penalty, add, disable, nowhite, goback = 0, 1, 2, 3, 4, 5, 6, 7 + +local function collapser(head,where,what,trace) -- maybe also pass tail + if trace then + reset_tracing(head) + trace_info("start analyzing",where,what) + end + local current = head + local glue_order, glue_data = 0, nil + local penalty_order, penalty_data, natural_penalty = 0, nil, nil + local parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false + while current do + local id = current.id -- has each node a subtype ? + if id == glue and current.subtype == 0 then -- todo, other subtypes, like math + local sc = has_attribute(current,skip_category) -- has no default, no unset (yet) + local so = has_attribute(current,skip_order ) or 1 -- has 1 default, no unset (yet) + local sp = has_attribute(current,skip_penalty ) -- has no degault, no unset (yet) + if not sc then + if glue_data then + if trace then trace_done("flush",glue_data) end + head, current = nodes.before(head,current,glue_data) + if trace then trace_natural("natural",current) end + else + -- not look back across head + local previous = current.prev + if previous and previous.id == glue and previous.subtype == 0 then + local ps = previous.spec + if ps then + local cs = current.spec + if cs and ps.stretch_order == 0 and ps.shrink_order == 0 and cs.stretch_order == 0 and cs.shrink_order == 0 then + local pw, pp, pm = ps.width, ps.stretch, ps.shrink + local cw, cp, cm = cs.width, cs.stretch, cs.shrink + ps.width, ps.stretch, ps.shrink = pw + cw, pp + cp, pm + cm + if trace then trace_natural("removed",current) end + head, current = remove_node(head, current, true) + current = previous + if trace then trace_natural("collapsed",current) end + else + if trace then trace_natural("filler",current) end + end + else + if trace then trace_natural("natural (no prev spec)",current) end + end + else + if trace then trace_natural("natural (no prev)",current) end + end + end + glue_order, glue_data = 0, nil + if current then + current = current.next + end + else + if sc == disable then + ignore_following = true + if trace then trace_skip("disable",sc,so,sp,current) end + head, current = remove_node(head, current, true) + elseif sc == nowhite then + ignore_whitespace = true + head, current = remove_node(head, current, true) + elseif sc == discard then + if trace then trace_skip("discard",sc,so,sp,current) end + head, current = remove_node(head, current, true) + else + if sp then + if not penalty_data then + penalty_data = sp + elseif penalty_order < so then + penalty_order, penalty_data = so, sp + elseif penalty_order == so and sp > penalty_data then + penalty_data = sp + end + end + if ignore_following then + if trace then trace_skip("disabled",sc,so,sp,current) end + head, current = remove_node(head, current, true) + elseif not glue_data then + if trace then trace_skip("assign",sc,so,sp,current) end + glue_order = so + head, current, glue_data = remove_node(head, current) + elseif glue_order < so then + if trace then trace_skip("force",sc,so,sp,current) end + glue_order = so + free_glue_node(glue_data) + head, current, glue_data = remove_node(head, current) + elseif glue_order == so then + -- is now exclusive, maybe support goback as combi, else why a set + if sc == largest then + local cs, gs = current.spec, glue_data.spec + local cw = (cs and cs.width) or 0 + local gw = (gs and gs.width) or 0 + if cw > gw then + if trace then trace_skip('largest',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + head, current, glue_data = remove_node(head, current) + else + if trace then trace_skip('remove smallest',sc,so,sp,current) end + head, current = remove_node(head, current, true) + end + elseif sc == goback then + if trace then trace_skip('goback',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + head, current, glue_data = remove_node(head, current) + elseif sc == force then + -- todo: inject kern + if trace then trace_skip('force',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + head, current, glue_data = remove_node(head, current) + elseif sc == penalty then + if trace then trace_skip('penalty',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + glue_data = nil + head, current = remove_node(head, current, true) + elseif sc == add then + if trace then trace_skip('add',sc,so,sp,current) end + local old, new = glue_data.spec, current.spec + old.width = old.width + new.width + old.stretch = old.stretch + new.stretch + old.shrink = old.shrink + new.shrink + -- toto: order + head, current = remove_node(head, current, true) + else + if trace then trace_skip("unknown",sc,so,sp,current) end + head, current = remove_node(head, current, true) + end + else + if trace then trace_skip("unknown",sc,so,sp,current) end + head, current = remove_node(head, current, true) + end + end + end + elseif id == penalty then + --~ natural_penalty = current.penalty + --~ if trace then trace_done("removed penalty",current) end + --~ head, current = remove_node(head, current, true) + current = current.next + elseif id == glue and current.subtype == 2 then + local sn = has_attribute(current,snap_category) + if sn then + -- local sv = nodes.snapvalues[sn] + -- if sv then + if trace then trace_natural("removed baselineskip",current) end + head, current = remove_node(head, current, true) + -- else + -- current = current.next + -- end + else + if trace then trace_natural("keep baselineskip",current) end + current = current.next + end + elseif id == glue and current.subtype == 3 then + -- parskip always comes later + if ignore_whitespace then + if trace then trace_natural("ignored parskip",current) end + head, current = remove_node(head,current,true) + elseif glue_data then + local ps, gs = current.spec, glue_data.spec + if ps and gs and ps.width > gs.width then + -- free_glue_spec(glue_data.spec) -- result in double free + glue_data.spec = copy_node(ps) + if trace then trace_natural("taking parskip",current) end + else + if trace then trace_natural("removed parskip",current) end + end + head, current = remove_node(head, current,true) + else + if trace then trace_natural("honored parskip",current) end + head, current, glue_data = remove_node(head, current) + end + --~ if trace then trace_natural("removed parskip",current) end + --~ current.spec = nil + --~ current = current.next + else +-- reversed + if penalty_data then + local p = make_penalty_node(penalty_data) + if trace then trace_done("flushed",p) end + head, current = insert_node_before(head,current,p) + -- penalty_data = nil + end + if glue_data then + if trace then trace_done("flushed",glue_data) end + head, current = insert_node_before(head,current,glue_data) + -- glue_order, glue_data = 0, nil + end + if trace then trace_node(current) end + if id == hlist and where == 'hmode_par' then + local list = current.list + if list then + local sn = has_attribute(list,snap_category) + if sn then + local sv = nodes.snapvalues[sn] + if sv then + local height, depth, lineheight = sv[1], sv[2], sv[3] + -- is math.ceil really needed? + current.height = math.ceil((current.height-height)/lineheight)*lineheight + height + current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth + end + end + end + end + glue_order, glue_data = 0, nil + penalty_order, penalty_data, natural_penalty = 0, nil, nil + parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false + current = current.next + end + end + if trace then trace_info("stop analyzing",where,what) end + --~ if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then + --~ penalty_data = natural_penalty + --~ end + if trace and (glue_data or penalty_data) then + trace_info("start flushing",where,what) + end + local tail + if penalty_data then + tail = find_node_tail(head) + local p = make_penalty_node(penalty_data) + if trace then trace_done("result",p) end + head, tail = insert_node_after(head,tail,p) + end + if glue_data then + if not tail then tail = find_node_tail(head) end + if trace then trace_done("result",glue_data) end + head, tail = insert_node_after(head,tail,glue_data) + end + if trace then + if glue_data or penalty_data then + trace_info("stop flushing",where,what) + end + show_tracing(head) + end + return head, true +end + +-- alignment after_output end box new_graf vmode_par hmode_par insert penalty before_display after_display +-- \par -> vmode_par +-- +-- status.best_page_break +-- tex.lists.best_page_break +-- tex.lists.best_size (natural size to best_page_break) +-- tex.lists.least_page_cost (badness of best_page_break) +-- tex.lists.page_head +-- tex.lists.contrib_head + +local stackhead, stacktail, stackhack = nil, nil, false + +local function report(message,lst) + logs.report("vspacing",message,count_nodes(lst,true),node_ids_to_string(lst)) +end + +function nodes.handle_page_spacing(where) + local newhead = texlists.contrib_head + if newhead then + starttiming(vspacing) + local newtail = find_node_tail(newhead) + local flush = false + for n in traverse_nodes(newhead) do -- we could just look for glue nodes + local id = n.id + if id == glue then + if n.subtype == 0 then + if has_attribute(n,skip_category) then + stackhack = true + else + flush = true + end + else + -- tricky + end + else + flush = true + end + end + if flush then + if stackhead then + if trace_collect_vspacing then report("appending %s nodes to stack (final): %s",newhead) end + stacktail.next = newhead + newhead.prev = stacktail + newhead = stackhead + stackhead, stacktail = nil, nil + end + if stackhack then + stackhack = false + if trace_collect_vspacing then report("processing %s nodes: %s",newhead) end + texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing) + else + if trace_collect_vspacing then report("flushing %s nodes: %s",newhead) end + texlists.contrib_head = newhead + end + else + if stackhead then + if trace_collect_vspacing then report("appending %s nodes to stack (intermediate): %s",newhead) end + stacktail.next = newhead + newhead.prev = stacktail + else + if trace_collect_vspacing then report("storing %s nodes in stack (initial): %s",newhead) end + stackhead = newhead + end + stacktail = newtail + texlists.contrib_head = nil + end + stoptiming(vspacing) + end +end + +local ignore = table.tohash { + "split_keep", + "split_off", + -- "vbox", +} + +function nodes.handle_vbox_spacing(head,where) + if head and not ignore[where] and head.next then + starttiming(vspacing) + head = collapser(head,"vbox",where,trace_vbox_vspacing) + stoptiming(vspacing) + end + return head +end + +statistics.register("v-node processing time", function() + if statistics.elapsedindeed(vspacing) then + return format("%s seconds", statistics.elapsedtime(vspacing)) + end +end) + +-- these are experimental callback definitions that definitely will +-- be moved elsewhere as part of a chain of vnode handling + +function vspacing.enable() + callback.register('vpack_filter', nodes.handle_vbox_spacing) -- enabled per 2009/10/16 + callback.register('buildpage_filter', nodes.handle_page_spacing) +end + +function vspacing.disable() + callback.register('vpack_filter', nil) + callback.register('buildpage_filter', nil) +end + +vspacing.enable() + +-- we will split this module hence the locals + +local attribute = attributes.private('graphicvadjust') + +local hlist = node.id('hlist') +local vlist = node.id('vlist') + +local remove_node = nodes.remove +local hpack_node = node.hpack +local has_attribute = node.has_attribute + +function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only + if groupcode == "" then -- mvl only + local h, p, done = head, nil, false + while h do + local id = h.id + if id == hlist or id == vlist then + local a = has_attribute(h,attribute) + if a then + if p then + local n + head, h, n = remove_node(head,h) + local pl = p.list + if n.width ~= 0 then + n = hpack_node(n,0,'exactly') + end + if pl then + pl.prev = n + n.next = pl + end + p.list = n + done = true + else + -- can't happen + end + else + p = h + h = h.next + end + else + h = h.next + end + end + return head, done + else + return head, false + end +end + +--~ tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust") diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv new file mode 100644 index 000000000..8e612579d --- /dev/null +++ b/tex/context/base/spac-ver.mkiv @@ -0,0 +1,1485 @@ +%D \module +%D [ file=spac-ver, +%D version=2009.10.16, % 1997.03.31, was core-spa.tex +%D title=\CONTEXT\ Spacing Macros, +%D subtitle=Vertical, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Spacing Macros / Vertical} + +\unprotect + +\registerctxluafile{spac-ver}{1.001} + +\newskip\blankskip \blankskip=\bigskipamount + +\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 + +%D There are two ways to influence the interline spacing. The +%D most general and often most consistent way is using +%D +%D \showsetup{setupinterlinespace} +%D +%D For instance +%D +%D \starttyping +%D \setupinterlinespace[line=2.8ex] +%D \stoptyping +%D +%D This setting adapts itself to the bodyfontsize, while for +%D instance saying +%D +%D \starttyping +%D \setupinterlinespace[line=12pt] +%D \stoptyping +%D +%D sets things fixed for all sizes, which is definitely not +%D what we want. Therefore one can also say: +%D +%D \starttyping +%D \definebodyfontenvironment[9pt][interlinespace=11pt] +%D \stoptyping +%D +%D One can still use \type{\setupinterlinespace} (without +%D arguments) to set the interline space according to the +%D current font, e.g. a \type{\bfa}. + +\newif\iflocalinterlinespace + +% font-ini + +\ifx\bodyfontinterlinespecs\undefined + + \let\bodyfontinterlinespecs\empty + \let\bodyfontinterlinespace\empty + +\fi + +\def\presetnormallineheight + {\edef\normallineheight{\@@itline}% +% done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed + \iflocalinterlinespace \else + \doifdefined\bodyfontinterlinespecs + {\doifsomething\bodyfontinterlinespace + {\edef\normallineheight{\bodyfontinterlinespace}}}% + \fi} + +\def\setupspecifiedinterlinespace[#1]% + {\getparameters[\??it][#1]% + \scratchdimen0\@@itheight\points + \advance\scratchdimen 0\@@itdepth\points + \ifdim\scratchdimen>\onepoint + \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}% + \let\@@itheight\strutheightfactor + \let\@@itdepth \strutdepthfactor + \else + \let\strutheightfactor\@@itheight + \let\strutdepthfactor \@@itdepth + \fi + \let\minimumstrutheight \@@itminheight + \let\minimumstrutdepth \@@itmindepth + \let\minimumlinedistance\@@itdistance + \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex + \doifelse\@@ittop\v!height % new, topskip does more bad than good + {\let\topskipfactor \@@itheight} + {\let\topskipfactor \@@ittop }% + \let\maxdepthfactor \@@itbottom + \let\baselinegluefactor \@@itstretch + \setfontparameters % redundant, can be \setstrut, test first + \updateraggedskips} % yes indeed + +\let\currentrelativeinterlinespace\empty + +\def\setuprelativeinterlinespace[#1]% + {\processallactionsinset + [#1] + [ \v!on=>\oninterlineskip, + \v!off=>\offinterlineskip, + \v!reset=>\let\currentrelativeinterlinespace\empty + \let\setrelativeinterlinespace\relax + \setfontparameters, + \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace, + \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}% + \spacing\currentrelativeinterlinespace]} + +\def\dosetrelativeinterlinespace + {\ifx\currentrelativeinterlinespace\empty\else + \spacing\currentrelativeinterlinespace + \fi} + +\let\setrelativeinterlinespace\relax + +% \appendtoks \setrelativeinterlinespace \to \everybodyfont + +\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1 + {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]} + +\def\setuplocalinterlinespace[#1]% + {\localinterlinespacetrue + \setupinterlinespace[#1]% + \localinterlinespacefalse} + +\def\simplesetupinterlinespace + {\localinterlinespacetrue + \setfontparameters + \updateraggedskips % funny one here + \localinterlinespacefalse} + +\definecomplexorsimple\setupinterlinespace + +\def\removelastskip % a redefinition of plain + {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi} + +\def\doifoutervmode#1% + {\ifvmode\ifinner\else#1\fi\fi} + +\ifx\dosomebreak\undefined % defined in mkiv + + \def\dosomebreak#1% + {\doifoutervmode + {\scratchskip\lastskip + \removelastskip + %\leavevmode\type{#1}% + #1\relax + \ifdim\scratchskip=\zeropoint % else interference with footnotes + \else + \vskip\scratchskip + \fi}} + +\fi + +\def\packed + {\nointerlineskip} + +\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 + + \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 + {\par + \ifdim\lastskip<\smallskipamount + \removelastskip + \penalty-50 + \smallskip + \fi} + +\def\medbreak + {\par + \ifdim\lastskip<\medskipamount + \removelastskip + \penalty-100 + \medskip + \fi} + +\def\bigbreak + {\par + \ifdim\lastskip<\bigskipamount + \removelastskip + \penalty-200 + \bigskip + \fi} + +\fi + +\newskip\ctxparskip \ctxparskip\zeropoint + +\newconditional \flexiblewhitespace \settrue\flexiblewhitespace + +\def\currentwhitespace {\zeropoint} + +\definecomplexorsimple\setupwhitespace + +\def\simplesetupwhitespace + {\doifnot\currentwhitespace\v!none\dosetupwhitespace} + +\def\complexsetupwhitespace[#1]% + {\edef\nextcurrentwhitespace{#1}% + \ifx\nextcurrentwhitespace\empty + \simplesetupwhitespace + \else + \let\currentwhitespace\nextcurrentwhitespace + \dosetupwhitespace + \fi} + +\def\dosetupwhitespace % quick test for no list + {\ifcsname\??ws\??ws\currentwhitespace\endcsname + \csname\??ws\??ws\currentwhitespace\endcsname + \else + \expandafter\processcommalist\expandafter[\currentwhitespace]\dowhitespacemethod % 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 + \else + \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi + \fi + \parskip\ctxparskip} + +\chardef\baselinegridmode=0 % option in layout / 1=permit_half_lines + +\def\dodosetupwhitespace + {\ifgridsnapping + \setfalse\flexiblewhitespace + \ctxparskip1\ctxparskip + \ifdim\ctxparskip>\zeropoint + \ifcase\baselinegridmode + \ctxparskip\baselineskip % normal ! ! ! ! !! + \or + \ifdim\scratchdimen=\baselineskip % maybe range + \ctxparskip\baselineskip % normal ! ! ! ! !! + \else + \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax + \fi + \else + \ctxparskip\baselineskip % normal ! ! ! ! !! + \fi + \fi + \else + \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi + \fi + \parskip\ctxparskip} + +\definesystemvariable {ws} % whitespace + +\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#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} + +\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin} + +% \def\dowhitespacemethod#1% +% {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax} + +\def\dowhitespacemethod#1% + {\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax} + +% \def\nowhitespace +% {\ifdim\parskip>\zeropoint\relax +% \ifdim\lastskip=-\parskip +% \else +% \vskip-\parskip +% \fi +% \fi} + +\def\nowhitespace + {} + +\def\nowhitespaceunlessskip + {\ifdim\lastskip>\zeropoint \else + \nowhitespace + \fi} + +\def\redowhitespace + {\ifdim\lastskip>-\parskip \else + \vskip\parskip + \fi} + +\def\savecurrentwhitespace {\edef\savedcurrentwhitespace{\currentwhitespace}} +\def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}} + +\def\savedcurrentwhitespace{\currentwhitespace} + +% deze variant is nodig binnen \startopelkaar +% steeds testen: +% +% \hoofdstuk{..} +% \plaatslijst[..] +% \hoofdstuk{..} +% \input tufte +% +% met/zonder witruimte + +% \def\whitespace +% {\par +% \ifdim\parskip>\zeropoint\relax +% %\ifdim\lastskip>\parskip \else +% % \removelastskip interferes with blanko blokkeer en klein +% \vskip\parskip +% %\fi +% \fi} + +\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. + +\newif\ifopelkaar + +\newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt} +\def\lastdoneparskip {0pt} + +\def\startpacked + {\dosingleempty\dostartpacked} + +\def\dostartpacked[#1]% nesting afvangen + {\par + \ifvmode + \bgroup + \blank[\v!disable] + \setupwhitespace[\v!none] + \fi} + +\def\stoppacked + {\par + \ifvmode + \egroup + \fi} + +\def\startunpacked + {\blank + \bgroup} + +\def\stopunpacked + {\egroup + \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 + +\def\startlinecorrection + {\dodoubleempty\dostartlinecorrection} + +\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\stoplinecorrection + {\stopbaselinecorrection + \doaroundlinecorrection + \egroup} + +\def\correctwhitespace + {\dowithnextbox + {\startbaselinecorrection + \flushnextbox + \stopbaselinecorrection}% + \vbox} + +\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}} +\def\horizontalstrut{\normalhbox {\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 +% nog eens instelbaar worden. +% +% \lineheight : de hoogte van een regel +% \spacing{getal} : instellen interlinie +% \normalbaselines : instellen regelafstend +% +% \setstrut : instellen \strut +% \setnostrut : resetten \strut, \endstrut, \begstrut +% +% \setteststrut : instellen zichtbare struts +% \resetteststrut : instellen onzichtbare struts +% +% \setfontparameters : instellen na fontset +% +% De hoogte van een regel (\lineheight) is gelijk aan de +% som van de hoogte (\ht) en diepte (\dp) van \strutbox. +% +% \strut : denkbeeldig blokje met hoogte en diepte +% +% Een \hbox kan als deze aan het begin van een regel staat +% een breedte \hsize krijgen. Dit is soms te voorkomen met het +% commando \leavevmode. Binnen een \vbox geeft dit echter +% niet altijd het gewenste resultaat, vandaar het commando +% +% \leaveoutervmode + +% Pas op: niet zomaar \topskip en \baselineskip aanpassen +% en zeker niet \widowpenalty. Dit kan ernstige gevolgen +% hebben voor kolommen. +% +% Enige glue kan op zich geen kwaad, echter als blanko=vast, +% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook +% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet, +% omdat een positieve glue eindeloos rekbaar is. + +\newdimen\strutdimen +\newdimen\lineheight +\newdimen\openlineheight +\newdimen\openstrutheight +\newdimen\openstrutdepth +\newdimen\topskipgap +\newdimen\struttotal + +\def\strutheightfactor {.72} +\def\strutdepthfactor {.28} + +\def\baselinefactor {2.8} +\def\baselinegluefactor {0} + +\def\minimumstrutheight {0pt} +\def\minimumstrutdepth {0pt} + +\def\normallineheight {\baselinefactor ex} +\def\minimumlinedistance {\lineskip} + +\def\strutheight {0pt} +\def\strutdepth {0pt} +\def\strutwidth {0pt} + +\let\spacingfactor \plusone + +\def\topskipfactor {1.0} +\def\maxdepthfactor {0.5} + +\def\systemtopskipfactor {\topskipfactor} +\def\systemmaxdepthfactor {\maxdepthfactor} + +% De onderstaande definitie wordt in de font-module overruled + +\ifdefined\globalbodyfontsize\else + \newdimen\globalbodyfontsize + \globalbodyfontsize=12pt +\fi + +\ifx\normalizedbodyfontsize\undefined + \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 + {\simpletopskipcorrection + \vskip-\struttotal + \verticalstrut} + +\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 + \fi + \relax % the skip + \topskipgap\topskip + \advance\topskipgap -\openstrutheight\relax +\ifdim\minimumstrutheight>\zeropoint + \ifdim\topskip<\minimumstrutheight + \topskip\minimumstrutheight\relax + \fi +\else + \ifdim\topskip<\strutheightfactor\openlineheight + \topskip\strutheightfactor\openlineheight\relax + \fi +\fi} + +\def\setmaxdepth + {\maxdepth\systemmaxdepthfactor\globalbodyfontsize} + +\def\normalbaselines + {\baselineskip \normalbaselineskip + \lineskip \normallineskip + \lineskiplimit\normallineskiplimit} + +\def\setnormalbaselines + {\ifdim\normallineheight>\zeropoint + \lineheight\normallineheight + \fi + \openlineheight\spacingfactor\lineheight + \openstrutheight \ifdim\minimumstrutheight>\zeropoint + \minimumstrutheight % new + \else + \strutheightfactor\openlineheight + \fi + \openstrutdepth \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth % new + \else + \strutdepthfactor \openlineheight + \fi + \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint + \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new + \fi + \normalbaselineskip\openlineheight + \ifgridsnapping\else + \!!plus \baselinegluefactor\openlineheight + \!!minus\baselinegluefactor\openlineheight + \fi + \normallineskip\minimumlinedistance\relax % \onepoint\relax + \normallineskiplimit\zeropoint\relax + \normalbaselines + \dosetupgridsnapping} + +\def\spacing#1% + {\ifgridsnapping + %\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{\withoutpt\the\dimexpr#1\points\relax}\fi + \let\spacingfactor\plusone + \else + \edef\spacingfactor{#1}% + \fi + \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}% + \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}% + \setnormalbaselines + \setstrut} + +%D Sometimes one needs to freeze the interlinespacing +%D +%D \starttyping +%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf} +%D \stoptyping + +\let\restoreinterlinespace\relax + +\def\saveinterlinespace + {\edef\restoreinterlinespace + {\lineheight \the\lineheight + \openstrutheight \the\openstrutheight + \openstrutdepth \the\openstrutdepth + \openlineheight \the\openlineheight + \normalbaselineskip \the\normalbaselineskip + \normallineskip \the\normallineskip + \normallineskiplimit\the\normallineskiplimit + \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}% + \noexpand\normalbaselines}} + +% plain definition: +% +% \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} +% +% could be: +% +% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} + +\ifx\strutbox\undefined + + \newbox\strutbox + + \setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} + + \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} + +\fi + +\let\normalstrut\strut + +% The double \hbox construction enables us to \backtrack +% boxes. + +\let\strutht\undefined \newdimen\strutht +\let\strutdp\undefined \newdimen\strutdp + +\unexpanded\def\setstrut + {\ifgridsnapping + \setstrutgridyes + \else + \setstrutgridnop + \fi} + +\unexpanded\def\setstrutgridyes + {\strutht\spacingfactor\dimexpr + \ifdim\minimumstrutheight>\zeropoint + \minimumstrutheight + \else + \strutheightfactor\dimexpr\normallineheight + \fi + \strutdp\dimexpr + \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth + \else + \normallineheight-\strutht + \fi + \dosetstrut} + +\unexpanded\def\setstrutgridnop + {\strutht\spacingfactor\dimexpr + \ifdim\minimumstrutheight>\zeropoint + \minimumstrutheight + \else + \strutheightfactor\dimexpr\normallineheight + \fi + \strutdp\spacingfactor\dimexpr + \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth + \else + \strutdepthfactor\dimexpr\normallineheight + \fi + \dosetstrut} + +\unexpanded\def\setcharstrut#1% + {\setbox\strutbox\normalhbox{#1}% + \strutht\ht\strutbox + \strutdp\dp\strutbox + \dosetstrut} + +\unexpanded\def\setfontstrut + {\setcharstrut{(gplQT}} + +\unexpanded\def\setcapstrut% could be M, but Q has descender + {\setcharstrut{Q}} + +%D Handy for math (used in mathml): + +\def\charhtstrut + {\begingroup + \setcharstrut{GJY}% + \vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht + \endgroup} + +\def\chardpstrut + {\begingroup + \setcharstrut{gjy}% + \vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint + \endgroup} + +% because of all the callbacks in mkiv, we avoid unnecessary boxes ... +% maybe use an attribute so that we can tag boxes that don't need a +% treatment; tests with using an attribute so far have shown that +% it's slower because testing the attribute takes time too + +\def\dosetstrut + {\let\strut\normalstrut + \edef\strutheight{\the\strutht}% + \edef\strutdepth {\the\strutdp}% + \ifdim\strutwidth=\zeropoint + \dosetstruthide + \else + \dosetstrutvide + \fi + \struttotal\dimexpr\strutht+\strutdp\relax} + +\def\dosetstruthide + {\setbox\strutbox\normalhbox + {\vrule + \!!width \zeropoint + \!!height\strutht + \!!depth \strutdp}} + +\def\dosetstrutvide + {\setbox\strutbox\normalhbox + {\normalhbox to \zeropoint + {% \hss % new, will be option + \vrule + \!!width \strutwidth + \!!height\strutht + \!!depth \strutdp + \hss}}} + +%D The dimen \type {\struttotal} holds the exact size of the +%D strut; occasionally a one scaled point difference can show +%D up with the lineheight. + +% experiment + +\newbox\emptystrutbox \setbox\emptystrutbox\hbox{} + +\def\dosetstruthide + {\setbox\strutbox\copy\emptystrutbox + \ht\strutbox\strutht + \dp\strutbox\strutdp} + +\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut} + + +\let\normalstrut\strut + +%D Sometimes a capstrut comes in handy +%D +%D \starttabulate[|Tl|l|l|] +%D \NC yes \NC normal strut \NC {\showstruts\setupstrut[yes]\strut} \NC \NR +%D \NC no \NC no strut \NC {\showstruts\setupstrut[no]\strut} \NC \NR +%D \NC kap \NC a capital strut (i.e. Q) \NC {\showstruts\setupstrut[cap]\strut} \NC \NR +%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR +%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR +%D \stoptabulate + +\def\setupstrut + {\dosingleempty\dosetupstrut} + +\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut + {\processaction + [#1] + [ \v!yes=>\setstrut, + \v!auto=>\setautostrut, + \v!no=>\setnostrut, + \v!cap=>\setcapstrut, + \v!fit=>\setfontstrut, + \v!line=>\setstrut, + \s!default=>\setstrut, + \s!unknown=>\setcharstrut\commalistelement]} + +\def\showstruts + {\setteststrut + \settestcrlf} + +\def\setteststrut + {\def\strutwidth{.8pt}% + \setstrut} + +\def\autostrutfactor{1.1} + +\def\setautostrut + {\begingroup + \setbox\scratchbox\copy\strutbox + \setstrut + \ifdim\strutht>\autostrutfactor\ht\scratchbox + \endgroup \setstrut + \else\ifdim\strutdp>\autostrutfactor\dp\scratchbox + \endgroup \setstrut + \else + \endgroup + \fi\fi} + +% 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 + \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 + \else + \removeunwantedspaces + \normalpenalty\plustenthousand + \normalhskip\zeropoint + \strut + \fi + \fi\fi} + +\newbox\nostrutbox \setbox\nostrutbox\normalhbox{} % {\normalhbox{}} + +\def\setnostrut + {\setbox\strutbox\copy\nostrutbox + \let\strut\empty + \let\endstrut\empty + \let\begstrut\empty + \let\crlfplaceholder\empty} + +% unsave: +% +% \def\pseudostrut +% {\bgroup +% \setnostrut +% \normalstrut +% \egroup} +% +% try: +% +% \startchemie +% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C] +% \stopchemie +% +% so: + +\def\pseudostrut + {\noindent} % better: \dontleavehmode + +\let\pseudobegstrut\pseudostrut + +\let\pseudoendstrut\removeunwantedspaces + +\def\resetteststrut + {\let\strutwidth\zeropoint + \setstrut} + +\ifx\setfontparameters\undefined + % problems ! ! ! ! + \def\setfontparameters{\the\everybodyfont} +\fi + +%D Handy: + +\def\baselinedistance{\the\lineheight} + +%D We need \type{\normaloffinterlineskip} because the new +%D definition contains an assignment, and |<|don't ask me +%D why|>| this assignment gives troubles in for instance the +%D visual debugger. + +%D The plain ones: + +\def\offinterlineskip + {\baselineskip-\thousandpoint + \lineskip\zeropoint + \lineskiplimit\maxdimen} + +\def\nointerlineskip + {\prevdepth-\thousandpoint} + +\let\normaloffinterlineskip=\offinterlineskip % knuth's original + +%D My own one: + +\def\dopushinterlineskip + {\edef\oninterlineskip + {\baselineskip\the\baselineskip + \lineskip\the\lineskip + \lineskiplimit\the\lineskiplimit + \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}} + +\def\nopushinterlineskip + {\let\oninterlineskip\setnormalbaselines} + +\def\offinterlineskip + {\ifdim\baselineskip>\zeropoint + \dopushinterlineskip + \else + \nopushinterlineskip + \fi + \normaloffinterlineskip} + +\let\oninterlineskip=\relax + +\def\leaveoutervmode + {\ifvmode\ifinner\else + \leavevmode + \fi\fi} + +% We stellen enkele penalties anders in dan Plain TEX: + +% oud +% +% \widowpenalty=\defaultwidowpenalty\relax +% \clubpenalty =\defaultclubpenalty \relax + +\def\resetpenalties#1% + {\ifx#1\undefined\else + #1\minusone + \fi} + +\def\setpenalties#1#2#3% + {\ifx#1\undefined\else % 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 +%D Dirty hack, needed in margin content that can run of a page. + +% just before margintexts ... will eventually be done differently in mkiv using +% attributes + +\newcount\nofkeeplinestogether +\let\restoreinterlinepenalty\relax + +\def\dorestoreinterlinepenalty + {\global\let\restoreinterlinepenalty\relax + \global\resetpenalties\interlinepenalties + \global\nofkeeplinestogether\zerocount} + +\def\keeplinestogether#1% + {\ifnum#1>\nofkeeplinestogether + \global\nofkeeplinestogether#1% + \global\setpenalties\interlinepenalties\nofkeeplinestogether\plustenthousand + \global\let\restoreinterlinepenalty\dorestoreinterlinepenalty + \fi} + +\newif\ifgridsnapping % to be sure + +\def\defaultwidowpenalty {2000} % was: 1000 +\def\defaultclubpenalty {2000} % was: 800 +\def\defaultdisplaywidowpenalty {50} +\def\defaultbrokenpenalty {100} + +\def\defaultgridwidowpenalty {0} +\def\defaultgridclubpenalty {0} +\def\defaultgriddisplaywidowpenalty {0} +\def\defaultgridbrokenpenalty {0} + +\def\nopenalties + {\widowpenalty \zerocount + \clubpenalty \zerocount + \brokenpenalty \zerocount + \doublehyphendemerits\zerocount + \finalhyphendemerits \zerocount + \adjdemerits \zerocount} + +\def\setdefaultpenalties + {\directsetup{\systemsetupsprefix\s!default}} + +\startsetups [\systemsetupsprefix\s!reset] + \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} + + \widowpenalty \defaultwidowpenalty + \clubpenalty \defaultclubpenalty + \displaywidowpenalty\defaultdisplaywidowpenalty + \brokenpenalty \defaultbrokenpenalty + +\stopsetups + +\startsetups [\v!grid] [\systemsetupsprefix\s!default] + + \directsetup{\systemsetupsprefix\s!reset} + + \widowpenalty \defaultgridwidowpenalty + \clubpenalty \defaultgridclubpenalty + \displaywidowpenalty\defaultgriddisplaywidowpenalty + \brokenpenalty \defaultgridbrokenpenalty + +\stopsetups + +% as an illustration: + +\startsetups [\systemsetupsprefix\v!strict] + + \directsetup{\systemsetupsprefix\s!reset} + + \setpenalties\widowpenalties2\maxdimen + \setpenalties\clubpenalties 2\maxdimen + \brokenpenalty \maxdimen + +\stopsetups + +\setdefaultpenalties % will happen later in \setuplayout + +%D To be checked: + +\ifx\savedstrutbox\undefined \newbox\savedstrutbox \fi + +\def\savestrut {\setbox\savedstrutbox\copy\strutbox} +\def\savedstrut{\copy \savedstrutbox} + +%D Page spacing + +\chardef\bottomraggedness=0 % 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 + {\chardef\bottomraggedness\zerocount + \n@rmalbottomfalse + \r@ggedbottomtrue + \b@selinebottomfalse + \settopskip} + +\def\alignbottom + {\chardef\bottomraggedness\plusone + \n@rmalbottomtrue + \r@ggedbottomfalse + \b@selinebottomfalse + \settopskip} + +\def\baselinebottom + {\chardef\bottomraggedness\plustwo + \n@rmalbottomfalse + \r@ggedbottomfalse + \b@selinebottomtrue + \settopskip} + +\let\normalbottom=\alignbottom % downward compatible + +% so, the new one will be +% +% \chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline +% +% \def\bottomalignlimit{3\lineheight} % will be settable +% +% \def\raggedbottom {\chardef\bottomraggedness=0 \settopskip} +% \def\alignbottom {\chardef\bottomraggedness=1 \settopskip} +% \def\baselinebottom{\chardef\bottomraggedness=2 \settopskip} +% +% \let\normalbottom =\alignbottom + +%D Good old blank: + +\definesystemattribute[kern-chars] +\definesystemattribute[skip-category] \chardef\skipcategoryattribute \dogetattributeid{skip-category} +\definesystemattribute[skip-penalty] \chardef\skippenaltyattribute \dogetattributeid{skip-penalty} +\definesystemattribute[skip-order] \chardef\skiporderattribute \dogetattributeid{skip-order} +\definesystemattribute[snap-category] +\definesystemattribute[display-math] + +% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop +% \start \dosetstretch{.5em} effe flink doorfietsen \stop + +\def\dosetupgridsnapping % calls too often, only needed in gridsnapping + {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}} + +\def\doenablegridsnapping + {\dosetattribute{snap-category}{1}% + \topskip\strutht + \offinterlineskip} + +\def\dodisablegridsnapping + {\doresetattribute{snap-category}% + % reset topskip + \oninterlineskip} + +% experimental code, not yet interfaced: + +% category: +% 0 == discard discard +% 1 == only if larger largest +% 2 == force even if smaller force +% 3 == only take penalty component penalty +% 4 == add to existing skip add +% 5 == disable (ignore following) disable +% 6 == kill whitespace nowhite +% 7 == discard previous back +% +% penalty: larger wins +% order: larger wins +% category:2,order:5,penalty:10000,skip:value|kw +% +% always -- obsolete +% none -- obsolete +% outer -- obsolete +% reset -- obsolete +% \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} + +% todo, in grid mode: vspacing.fixed = false + +\let\saveouterspacing \relax % for old times sake +\let\restoreouterspacing\relax % for old times sake + +\newtoks\everybeforeblankhandling +\newtoks\everyafterblankhandling + +\appendtoks + \blankskip\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 + +\def\setblankcategory#1{\attribute\skipcategoryattribute#1\relax} +\def\setblankorder #1{\attribute\skiporderattribute #1\relax} +\def\setblankpenalty #1{\attribute\skippenaltyattribute #1\relax} +\def\addblankskip#1#2#3{\advance\blankskip#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax} +\def\fixedblankskip {\settrue \blankisfixed} % \blankskip1\blankskip} +\def\flexibleblankskip {\setfalse\blankisfixed} % \blankskip1\blankskip\!!plus\skipgluefactor\blankskip\!!minus\skipgluefactor\blankskip} + +\def\startblankhandling + {\begingroup + \the\everybeforeblankhandling} + +\def\stopblankhandling + {\the\everyafterblankhandling + \vskip\blankskip + \endgroup} + +\def\flushblankhandling + {\the\everyafterblankhandling + \vskip\blankskip + \the\everybeforeblankhandling} + +% % % % + +\def\definevspacingamount + {\dotripleempty\dodefinevspacingamount} + +\def\dodefinevspacingamount[#1][#2][#3]% + {\ctxlua{vspacing.setskip("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}} + +\def\definevspacing + {\dodoubleempty\dodefinevspacing} + +\def\dodefinevspacing[#1][#2]% + {\ctxlua{vspacing.setmap("#1","#2")}} + +\unexpanded\def\vspacing + {\dosingleempty\dovspacing} + +\def\dovspacing[#1]% + {\ctxlua{vspacing.analyse("\iffirstargument#1\else\s!default\fi")}} + +% todo: checm them and make them faster: + +\definecomplexorsimple\setupvspacing + +\let\currentvspacing\empty + +\def\complexsetupvspacing[#1]% + {\edef\currentvspacing{#1}} + +\def\simplesetupvspacing + {\ifx\empty\currentvspacing\else + \let\currentvspacing\s!default + \fi + \simplesetupwhitespace} + +\def\restorestandardblank + {\let\currentvspacing\v!standard} + +% used both + +\def\doinhibitblank{\vspacing[\v!disable]} % can be made faster +\def\inhibitblank {\vspacing[\v!disable]} % can be made faster + +\let\setupblank \setupvspacing +\let\simplesetupblank\simplesetupvspacing +\let\blank \vspacing + +% category:4 is default + +\definevspacingamount[\v!big] [\bigskipamount] [\openlineheight] +\definevspacingamount[\v!medium] [\medskipamount] [0.50\openlineheight] +\definevspacingamount[\v!small] [\smallskipamount] [0.25\openlineheight] +\definevspacingamount[\v!line] [\openlineheight] [\openlineheight] +\definevspacingamount[\v!halfline][0.50\openlineheight][0.50\openlineheight] +\definevspacingamount[\v!formula] [\medskipamount] [0.50\openlineheight] +\definevspacingamount[\v!white] [\parskip] [\openlineheight] +\definevspacingamount[\v!height] [\strutheight] [\strutheight] +\definevspacingamount[\v!depth] [\strutdepth] [\strutdepth] + +\definevspacing[\v!samepage][penalty:10000] +\definevspacing[\v!max] [category:1] +\definevspacing[\v!force] [category:2] +\definevspacing[\v!disable] [category:5] +\definevspacing[\v!nowhite] [category:6] +\definevspacing[\v!back] [category:7] +\definevspacing[\v!always] [category:0] +\definevspacing[\v!weak] [order:0] +\definevspacing[\v!strong] [order:100] + +\definevspacing[\s!default] [\v!white] % was big for a while + +\setfalse\vspacingenabled + +\newtoks\everyenablevspacing +\newtoks\everydisablevspacing + +\def\enablevspacing {\the\everyenablevspacing} +\def\disablevspacing{\the\everydisablevspacing} + +\appendtoks + \writestatus\m!systems{! ! enabling vspacing ! !}% + \settrue\vspacingenabled + \ctxlua{vspacing.enable()}% +\to \everyenablevspacing + +\appendtoks + \writestatus\m!systems{! ! disabling vspacing ! !}% + \setfalse\vspacingenabled + \ctxlua{vspacing.disable()}% +\to \everydisablevspacing + +\global\let\blank \vspacing +\global\let\defineblank\definevspacing + +% moved from page-lin + +%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 + +\def\setuplines + {\dodoubleargument\getparameters[\??rg]} + +\def\startlines + {\@@rgbefore + \pushmacro\checkindentation + \whitespace + %\page[\v!preference]} gaat mis na koppen, nieuw: later \nobreak + \begingroup + \setupindenting[\@@rgindenting]% + \typesettinglinestrue + \setupwhitespace[\v!none]% + \obeylines + \ignorespaces + \gdef\afterfirstobeyedline % tzt two pass, net als opsomming + {\gdef\afterfirstobeyedline + {\nobreak + \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}% + \def\obeyedline + {\par + \futurelet\next\dobetweenthelines}% + \activatespacehandler\@@rgspace + \GotoPar} + +\def\stoplines + {\endgroup + \popmacro\checkindentation + \@@rgafter} + +\def\dobetweenthelines + {\doifmeaningelse\next\obeyedline + {\@@rginbetween} + {\afterfirstobeyedline}} + +\setuplines + [\c!option=, + \c!before=\blank, + \c!after=\blank, + \c!inbetween=\blank, + \c!indenting=\v!no, + \c!space=\v!default] + +\def\emptylines + {\dosingleempty\doemptylines} + +\def\doemptylines[#1]% + {\endgraf\dorecurse{\iffirstargument#1\else3\fi}\crlf} + +\protect \endinput + +\dorecurse{2}{ + $2^{2^{2^{2}}}$ $2_{2_{2_{2}}}^{2^{2^{2^{2^{2^{2^{2^{2^{2}}}}}}}}}$ + \input tufte \inframed {tufte} + \par +} + +\dorecurse{100} { + + \kern \recurselevel pt + + \vbox { + \endgraf \strut first \endgraf + {\dosetattribute{skip-category}{1}\vskip10pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + {\dosetattribute{skip-category}{2}\vskip10pt} + \endgraf \strut second \endgraf + } + + \endgraf \strut first \endgraf + {\dosetattribute{skip-category}{1}\vskip10pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + \endgraf \strut second \endgraf + + {\dosetattribute{skip-category}{0}\vskip10pt} % remove + {\dosetattribute{skip-category}{1}\vskip10pt} % take largest + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\dosetattribute{skip-order}{10}\vskip20pt} + {\dosetattribute{skip-category}{4}\dosetattribute{skip-order}{10}\vskip20pt} + {\dosetattribute{skip-category}{1}\vskip60pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + {\dosetattribute{skip-category}{0}\vskip10pt} + + third (no break after this) + + {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip10pt} + {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip20pt} + {\dosetattribute{skip-category}{1}\vskip10pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + + fourth + \vskip10pt + fifth +} diff --git a/tex/context/base/strc-flt.mkiv b/tex/context/base/strc-flt.mkiv index cb48d435a..b41a25e5b 100644 --- a/tex/context/base/strc-flt.mkiv +++ b/tex/context/base/strc-flt.mkiv @@ -110,10 +110,10 @@ \c!textcolor=, \c!align=, \c!number=\v!yes, -\c!prefix=\v!no, -\c!prefixconnector=., -\c!way=\v!by\v!chapter, -\c!prefixsegments=2:2, +% \c!prefix=\v!no, +% \c!prefixconnector=., +% \c!way=\v!by\v!chapter, +% \c!prefixsegments=2:2, % \c!way=\@@nrway, % \c!blockway=\@@nrblockway, % \c!sectionnumber=\@@nrsectionnumber, @@ -221,8 +221,11 @@ {\def\docommand##1{\getparameters[\??kj##1][#2]\def\currentfloat{##1}\the\everysetupcaption}% \processcommalist[#1]\docommand} +\presetstructurecountersetup\setupcaptions\sharedstructurecounterparameter + \appendtoks \dostructurecountersetup\currentfloat\floatcaptionparameter + \docheckstructurecountersetup\currentfloat \to \everysetupcaption %D Definitions: @@ -297,11 +300,18 @@ \installstructurelistprocessor{float}{\usestructurelistprocessor{number+title}} +% \def\thecurrentfloatnumber +% {\ifnofloatcaption \else \ifnofloatnumber \else +% % \labeltexts\currentfloat{\convertedstructurecounter[\currentfloat]}% ! ! todo: use a lua call instead +% \ifx\currentfloatnumber\relax\else +% \labeltexts\currentfloat{\ctxlua{structure.lists.savednumber("\currentfloat",\currentfloatnumber)}}% +% \fi +% \fi \fi} + \def\thecurrentfloatnumber {\ifnofloatcaption \else \ifnofloatnumber \else - % \labeltexts\currentfloat{\convertedstructurecounter[\currentfloat]}% ! ! todo: use a lua call instead \ifx\currentfloatnumber\relax\else - \labeltexts\currentfloat{\ctxlua{structure.lists.savednumber("\currentfloat",\currentfloatnumber)}}% + \labeltexts\currentfloat{\ctxlua{structure.lists.savedprefixednumber("\currentfloat",\currentfloatnumber)}}% \fi \fi \fi} diff --git a/tex/context/base/strc-itm.mkiv b/tex/context/base/strc-itm.mkiv index 4b3f09e21..315fb8236 100644 --- a/tex/context/base/strc-itm.mkiv +++ b/tex/context/base/strc-itm.mkiv @@ -141,24 +141,53 @@ \def\@@itemcounter{\s!itemcount\currentitemgroup} -\def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else\dosomebreak#1\fi\fi} +% \def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else\dosomebreak#1\fi\fi} +% +% \def\allowitembreak {\doitembreak\allowbreak} +% \def\noitembreak {\doitembreak\nobreak} +% \def\itembreakspecial {\doitembreak\itembreak} +% \def\noitembreakspecial{\doitembreak\itemnobreak} +% +% \def\itembreak {\flushnotes\penalty-5\relax} % -10 +% \def\itemnobreak{\flushnotes\penalty+5\ifinsidecolumns\else00\fi\relax} % +5 + +\definevspacing[\v!item @0] [penalty:0] % allow +\definevspacing[\v!item @10000] [penalty:10000] % no +\definevspacing[\v!item @-5] [penalty:-5] +\definevspacing[\v!item @5] [penalty:5] +\definevspacing[\v!item @500] [penalty:500] -\def\allowitembreak {\doitembreak\allowbreak} -\def\noitembreak {\doitembreak\nobreak} +\def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else#1\fi\fi} + +\def\allowitembreak {\doitembreak\itembreakallow} +\def\noitembreak {\doitembreak\itembreakno} \def\itembreakspecial {\doitembreak\itembreak} \def\noitembreakspecial{\doitembreak\itemnobreak} -\def\itembreak {\flushnotes\penalty-5\relax} % -10 -\def\itemnobreak{\flushnotes\penalty+5\ifinsidecolumns\else00\fi\relax} % +5 +\def\itembreakallow{\vspacing[\v!item @0]} +\def\itembreakno {\vspacing[\v!item @10000]} +\def\itembreak {\flushnotes\vspacing[\v!item @-5]} +\def\itemnobreak {\flushnotes\ifinsidecolumns\vspacing[\v!item @5]\else\vspacing[\v!item @500]\fi} + +% cool but wrong: +% +% \def\initializeitemgrouplevel#1% +% {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname +% % ok +% \else\ifnum#1>\plusone +% \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup\the\numexpr#1-1\relax}% +% \else +% \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}% +% \fi\fi} +% +% so we have: \def\initializeitemgrouplevel#1% {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname % ok - \else\ifnum#1>\plusone - \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup\the\numexpr#1-1\relax}% \else \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}% - \fi\fi} + \fi} \def\defineitemgroup {\dotripleempty\dodefineitemgroup} @@ -199,8 +228,12 @@ \def\dodosetupitemgroupconstant#1% {\edef\itemgroupconstantvalue{#1}% \ifx\itemgroupconstantvalue\empty\else - \splitstring\itemgroupconstantvalue\at*\to\itemgroupfirst\and\itemgroupsecond - \ifcsname\??op:::\itemgroupfirst\endcsname\csname\??op:::\itemgroupfirst\endcsname\fi + \splitstring\itemgroupconstantvalue\at*\to\itemgroupfirst\and\itemgroupsecond + \ifx\itemgroupsecond\empty + \ifcsname\??op:::\itemgroupfirst\endcsname\csname\??op:::\itemgroupfirst\endcsname\fi + \else + \ifcsname\??op:::\itemgroupsecond\endcsname\csname\??op:::\itemgroupsecond\endcsname\fi + \fi \fi} \newconditional\inlinelistitem \setfalse\inlinelistitem @@ -208,8 +241,8 @@ \setvalue{\??op:::\v!packed }{\packitems} \setvalue{\??op:::\v!intro }{\settrue\introlistitem} % here? not set to false \setvalue{\??op:::\v!autointro}{\settrue\autointrolistitem} -\setvalue{\??op:::\v!broad }{\ifx\itemgroupsecond\empty\def\itemgroupsecond{1}\fi - \letitemparameter\currentitemlevel\c!factor\itemgroupsecond} +\setvalue{\??op:::\v!broad }{\ifx\itemgroupfirst\empty\def\itemgroupfirst{1}\fi + \letitemparameter\currentitemlevel\c!factor\itemgroupfirst} \setvalue{\??op:::\v!text }{\settrue\textlistitem \settrue\inlinelistitem \settrue\joinedlistitem @@ -225,12 +258,12 @@ \setvalue{\??op:::\v!loose }{\setfalse\optimizelistitem} \setvalue{\??op:::\v!fit }{\settrue\fittinglistitems} \setvalue{\??op:::\v!nofit }{\setfalse\fittinglistitems} -\setvalue{\??op:v:\v!paragraph}{\settrue\paragraphlistitem +\setvalue{\??op:::\v!paragraph}{\settrue\paragraphlistitem \packitems} \setvalue{\??op:::\v!joinedup }{\settrue\joinedlistitem \packitems} -\setvalue{\??op:::\v!serried }{\edef\itemgroupsecond{-\ifx\itemgroupsecond\empty1\else\itemgroupsecond\fi}% - \letitemparameter\currentitemlevel\c!factor\itemgroupsecond} +\setvalue{\??op:::\v!serried }{\edef\itemgroupfirst{-\ifx\itemgroupfirst\empty1\else\itemgroupfirst\fi}% + \letitemparameter\currentitemlevel\c!factor\itemgroupfirst} \setvalue{\??op:::\v!stopper }{\letitemparameter\currentitemlevel\c!placestopper\v!yes} % keep {} \setvalue{\??op:::\v!unpacked }{\setfalse\packlistitem} \setvalue{\??op:::\v!repeat }{\settrue\repeatlistitem} @@ -240,7 +273,7 @@ \def\dosetupstandarditemgroup#1% {\getparameters [\??op\currentitemgroup#1] - [\c!width=1.5em,\c!factor=0,\c!distance=.5em,\c!inner=, + [\c!width=1.5em,\c!factor=0,\c!distance=.5em,\c!inner=,\c!factor=0, \c!beforehead=,\c!afterhead=\blank,\c!before=\blank,\c!inbetween=\blank,\c!after=\blank]} % \def\packeditemspacing{\empty} diff --git a/tex/context/base/strc-mat.mkiv b/tex/context/base/strc-mat.mkiv index bff243207..451ea60b4 100644 --- a/tex/context/base/strc-mat.mkiv +++ b/tex/context/base/strc-mat.mkiv @@ -50,6 +50,13 @@ [\v!formula] [\c!numberconversionset=\v!formula] +\presetstructurecountersetup\setupformulas\sharedstructurecounterparameter + +\appendtoks + \dostructurecountersetup\currentformula\formulaparameter + \docheckstructurecountersetup\currentformula +\to \everysetupformulas + \def\storecurrentformulanumber#1#2#3#4#5% ref, todo:str, \sync % todo: title etc (like float) {\dostructurecountercomponent {formula}% @@ -67,10 +74,17 @@ \globallet#3\laststructurecountersynchronize \globallet#4\laststructurecounterattribute} +\newif\ifnoformulanumber + +% \def\thecurrentformulanumber +% {%\ifnoformulacaption \else \ifnoformulanumber \else +% \labeltexts\currentformula{\convertedstructurecounter[formula]}% ! ! todo: use a lua call instead +% }%\fi \fi} + \def\thecurrentformulanumber - {%\ifnoformulacaption \else \ifnoformulanumber \else - \labeltexts\currentformula{\convertedstructurecounter[formula]}% ! ! todo: use a lua call instead - }%\fi \fi} + {\ifx\currentformulanumber\relax\else \ifnoformulanumber \else + \labeltexts\currentformula{\ctxlua{structure.lists.savedprefixednumber("\currentformula",\currentformulanumber)}}% + \fi \fi} \def\placecurrentformulanumber {\currentformulassynchronize \currentformulasattribute % todo @@ -90,6 +104,8 @@ \let\currentsubformulasynchronize\relax \let\currentsubformulaattribute\relax \let\currentformulassynchronize \relax \let\currentformulasattribute \relax +\def\inhibitformulanumberflag{-} + \def\dododoformulanumber#1#2#3#4% (#1,#2)=outer(ref,sub) (#3,#4)=inner(ref,sub) {\hbox\bgroup \ifconditional\handleformulanumber @@ -107,11 +123,13 @@ \setsubstructurecounterown[\v!formula][2]{#2}% \detokenize? \fi \edef\currentformulareference{#1}% - \ifx\currentformulareference\empty + \ifx\currentformulareference\inhibitformulanumberflag \glet\currentformulasynchronize\relax \glet\currentformulaattribute \relax + \noformulanumbertrue \else \storecurrentformulanumber\currentformulareference\empty\currentformulasynchronize\currentformulaattribute1% + \noformulanumberfalse \fi % subcounter \setbox0\hbox{\ignorespaces#4\unskip}% @@ -561,7 +579,7 @@ \checknextindentation[\formulaparameter\c!indentnext]% \dorechecknextindentation} % here ? -%D Named subformulas +%D Named subformulas (to be redone) \def\startnamedsubformulas {\dosingleempty\dostartnamedsubformulas} diff --git a/tex/context/base/strc-not.mkiv b/tex/context/base/strc-not.mkiv index 7c2b082fa..48c48caa0 100644 --- a/tex/context/base/strc-not.mkiv +++ b/tex/context/base/strc-not.mkiv @@ -156,7 +156,6 @@ \setupnotes [\c!location=\v!page, \c!way=\v!by\v!part, - \c!sectionnumber=\v!no, %\c!conversion=, \c!rule=\v!on, \c!before=\blank, @@ -194,18 +193,6 @@ \def\@@defaultnotedefloc{\v!inleft} \def\@@defaultnotedefdis{\!!zeropoint} -% also s!root -% -% \definedescription -% [\??vn\??vn] -% [\c!location=\@@defaultnotedefloc, -% \c!distance=\@@defaultnotedefdis, -% \c!width=\v!fit, -% \c!headstyle=\noteparameter\c!style, -% \c!headcolor=\noteparameter\c!color, -% \c!before=, -% \c!after=] - \def\startnotedef{\resetdescriptions\csname\e!start\??vn\??vn\currentnote\endcsname} \def\stopnotedef {\csname\e!stop \??vn\??vn\currentnote\endcsname} @@ -229,7 +216,7 @@ \c!width=\v!fit, \c!headstyle=\noteparameter\c!style, \c!headcolor=\noteparameter\c!color, -\s!handler=\v!note, + \s!handler=\v!note, \c!text=, \c!before=, \c!after=]% diff --git a/tex/context/base/strc-num.mkiv b/tex/context/base/strc-num.mkiv index 3ea666290..45f71827f 100644 --- a/tex/context/base/strc-num.mkiv +++ b/tex/context/base/strc-num.mkiv @@ -39,21 +39,25 @@ % todo: better inheritane system -\definesystemvariable {nn} - \def\setupstructurecountering{\dodoubleempty\getparameters[\??nn]} \setupstructurecountering [\c!way=\v!by\v!chapter, -% \c!blockway=, -% \c!prefixstopper=, -\c!prefixconnector=., -\c!prefixsegments=\thenamedstructurecounterlevel\currentstructurecounter, -\c!start=0, -\c!state=\v!start, +% \c!blockway=, +% \c!prefixstopper=, + \c!prefixconnector=., + \c!prefixsegments=\thenamedstructurecounterlevel\currentstructurecounter, + \c!start=0, + \c!state=\v!start, \c!prefix=\v!yes, \c!state=\v!start] +\setupstructurecountering + [\c!prefixsegments=\autostructureprefixsegments\sharedstructurecounterparameter] + +\def\autostructureprefixsegments#1% todo: \c!prefixsegments=\v!auto + {2:\thenamedstructureheadlevel{\ctxlua{structure.sections.way("#1\c!way","\v!by")}}} + % \letvalue{\??nn\s!empty}\empty \def\structurecounterparameter#1#2% @@ -76,6 +80,17 @@ #1% \fi} +\def\sharedstructurecounterparameter#1% + {\csname + \ifcsname\??nn#1\endcsname + \??nn#1% + \else + \s!empty + \fi + \endcsname} + +\let\numberingparameter\sharedstructurecounterparameter + % \def\structurecounterparameter #1#2{\csname\dostructurecounterparameter{\??nn#1}#2\endcsname} % \def\dostructurecounterparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dostructurecounterparentparameter\csname#1\s!number\endcsname#2\fi} % \def\dostructurecounterparentparameter#1#2{\ifx#1\relax\s!empty\else\dostructurecounterparameter#1#2\fi} @@ -314,17 +329,6 @@ \c!blockway=, \c!state=\v!start] -\def\numberingparameter#1{\csname\??nr#1\endcsname} - -% \c!prefixconnector=., -% \c!stopper=, - -% \c!prefix=\v!no, -% \c!prefixconnector=., -% \c!way=bychapter, -% \c!prefixsegments=2:2, - - %D Helpers: % call: @@ -353,6 +357,11 @@ \edef\hasstructurecounternumber {#3\s!hasnumber}% \edef\hasstructurecounterlevel {#3\s!haslevel}% % +\edef\askedprefixsegments{#3\c!prefixsegments}% +\ifx\askedprefixsegments\v!auto + \edef\askedprefixsegments{\autostructureprefixsegments#3}% +\fi + % \edef\currentname{#3\c!name}% \ifx\currentname\empty \edef\currentname{#1}% @@ -422,7 +431,8 @@ conversion = \!!bs#3\c!prefixconversion\!!es, conversionset = "#3\c!prefixconversionset", set = "#3\c!prefixset", - segments = "#3\c!prefixsegments", +% segments = "#3\c!prefixsegments", +segments = "\askedprefixsegments", connector = \!!bs#3\c!prefixconnector\!!es, }, numberdata = { @@ -473,4 +483,21 @@ \c!numberstopper=#2\c!numberstopper, \c!numbersegments=#2\c!numbersegments]} +\def\presetstructurecountersetup#1#2% \setupcommand \someparameter + {#1% + [\c!way =#2\c!way, + \c!prefix =#2\c!prefix, + \c!prefixseparatorset =#2\c!prefixseparatorset, + \c!prefixconversion =#2\c!prefixconversion, + \c!prefixconversionset=#2\c!prefixconversionset, + \c!prefixstopper =#2\c!prefixstopper, + \c!prefixsegments =#2\c!prefixsegments, + \c!prefixset =#2\c!prefixset, + \c!prefixconnector =#2\c!prefixconnector, + \c!numberseparatorset =#2\c!numberseparatorset, + \c!numberconversion =#2\c!numberconversion, + \c!numberconversionset=#2\c!numberconversionset, + \c!numberstopper =#2\c!numberstopper, + \c!numbersegments =#2\c!numbersegments]} + \protect \endinput diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 675adcc15..16f5b6c41 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -948,15 +948,11 @@ filters.section.default = filters.section.number filters.formula = {} -filters.formula.default = filters.section.number +filters.formula.default = filters.generic.number filters.float = { } -filters.float.default = filters.section.number - ---~ filters.float.title = filters.generic.title ---~ filters.float.number = filters.generic.number ---~ filters.float.page = filters.generic.page +filters.float.default = filters.generic.number structure.references = structure.references or { } structure.helpers = structure.helpers or { } diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv index 5416c17f1..5b61b48a8 100644 --- a/tex/context/base/strc-ref.mkiv +++ b/tex/context/base/strc-ref.mkiv @@ -1226,13 +1226,15 @@ \hyphenatedurl{\ctxlua{jobreferences.urls.get("#1","\@@uralternative","\@@urspace")}}% \endgroup} +% # fails + %D This macro is hooked into a support macro, and thereby %D \URL's break ok, according to the setting of a switch, %D %D \startbuffer %D \useURL %D [test] -%D [sentence_sentence%sentence#sentence~sentence/sentence//sentence:sentence.sentence] +%D [sentence_sentence~sentence//sentence:sentence.sentence] %D \stopbuffer %D %D \typebuffer diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv index 200ff56f2..b7e18746d 100644 --- a/tex/context/base/strc-sec.mkiv +++ b/tex/context/base/strc-sec.mkiv @@ -608,7 +608,8 @@ % the next one was: \somebreakmethod -\chardef\somestructureheadbreakmethod\plusone % 0=nothing, 1=weighted, 2=strict, 3=vspacing +% \chardef\somestructureheadbreakmethod\plusone % 0=nothing, 1=weighted, 2=strict, 3=vspacing +\chardef\somestructureheadbreakmethod\plusthree \def\dopreventbreakafterstructureheadauto % used after \c!before {\ifcase\somestructureheadbreakmethod diff --git a/tex/context/base/x-mathml.mkiv b/tex/context/base/x-mathml.mkiv index 649798c9f..82db51168 100644 --- a/tex/context/base/x-mathml.mkiv +++ b/tex/context/base/x-mathml.mkiv @@ -99,7 +99,7 @@ %D Remark: from now on this is a module and no longer an xtag %D filter. There is an intermediate cleaner module but it has -%D some namespace limitations. Here we do it the \MKV\ way. +%D some namespace limitations. Here we do it the \MKIV\ way. \def\widevec#1% {\vbox{\mathsurround\zeropoint\ialign{##\crcr diff --git a/tex/context/base/x-set-11.tex b/tex/context/base/x-set-11.tex index 6fcc7f934..6d4cab5ca 100644 --- a/tex/context/base/x-set-11.tex +++ b/tex/context/base/x-set-11.tex @@ -408,8 +408,9 @@ % \setup{setupinterlinespace} % \setup{setupinterlinespace:1} % \setup{setupinterlinespace:2} - +% todo: make this proper mkiv xml + \defineXMLenvironment [cd:command] [name=,type=,generated=,interactive=,variant=] {} {\showSETUPrecord} diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index 6166237f7..b58c25a92 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts.lua --- merge date : 09/15/09 12:29:59 +-- merge date : 09/16/09 20:09:33 do -- begin closure to overcome local limits and interference -- cgit v1.2.3