diff options
Diffstat (limited to 'tex/context/base/mkiv/spac-ver.mkxl')
-rw-r--r-- | tex/context/base/mkiv/spac-ver.mkxl | 2468 |
1 files changed, 0 insertions, 2468 deletions
diff --git a/tex/context/base/mkiv/spac-ver.mkxl b/tex/context/base/mkiv/spac-ver.mkxl deleted file mode 100644 index 92adce2c6..000000000 --- a/tex/context/base/mkiv/spac-ver.mkxl +++ /dev/null @@ -1,2468 +0,0 @@ -%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 ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Spacing Macros / Vertical} - -\unprotect - -\registerctxluafile{spac-ver}{autosuffix,optimize} - -% todo: use usernodes ? - -% todo: itemize : intro ... only when there is one or two lines preceding and then -% keep these together i.e. \blank[intro] - -% Isn't it about time to get rid of topskip i.e. make it equivalent to -% \openstrutheight so that we can remove delta code. -% -% There might be more namespace protection. - -%D There are two ways to influence the interline spacing. The most general and often -%D 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 instance saying -%D -%D \starttyping -%D \setupinterlinespace[line=12pt] -%D \stoptyping -%D -%D sets things fixed for all sizes, which is definitely not what we want. Therefore -%D one can also say: -%D -%D \starttyping -%D \definebodyfontenvironment[9pt][interlinespace=11pt] -%D \stoptyping -%D -%D One can still use \type {\setupinterlinespace} (without arguments) to set the -%D interline space according to the current font, e.g. a \type {\bfa}. - -% will be cleaned up but it will stay messy because we accept so -% many variants - -\newif\iflocalinterlinespace - -\newskip \s_spac_vspacing_temp \s_spac_vspacing_temp\bigskipamount - -\def\skipfactor {.75} -\def\skipgluefactor{.25} - -\permanent\def\normalskipamount - {\openlineheight - \ifgridsnapping \orelse \ifconditional\c_spac_whitespace_flexible - \s!plus \skipgluefactor\openlineheight - \s!minus\skipgluefactor\openlineheight - \fi - \relax} - -\ifdefined\bodyfontinterlinespace \else - \let\bodyfontinterlinespace\empty -\fi - -\permanent\protected\def\presetnormallineheight % each bodyfont - {\edef\normallineheight{\interlinespaceparameter\c!line}% - \iflocalinterlinespace \else - \edef\m_spac_normallineheight{\bodyfontinterlinespace}% - \ifempty\m_spac_normallineheight \else - \let\normallineheight\m_spac_normallineheight - \fi - \fi} - -\permanent\protected\def\setupspecifiedinterlinespace[#1]% - {\setupcurrentinterlinespace[#1]% - \spac_linespacing_setup_specified_interline_space} - -\def\spac_linespacing_setup_specified_interline_space - {\edef\strutheightfactor {\interlinespaceparameter\c!height }% - \edef\strutdepthfactor {\interlinespaceparameter\c!depth }% - \edef\minimumstrutheight {\interlinespaceparameter\c!minheight}% - \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth }% - \edef\minimumlinedistance {\interlinespaceparameter\c!distance }% - \edef\normallineheight {\interlinespaceparameter\c!line }% - \edef\topskipfactor {\interlinespaceparameter\c!top }% - \edef\maxdepthfactor {\interlinespaceparameter\c!bottom }% - \edef\m_spac_vertical_baseline_stretch_factor{\interlinespaceparameter\c!stretch}% - \edef\m_spac_vertical_baseline_shrink_factor {\interlinespaceparameter\c!shrink }% - % often topskip does more bad than good, so: - \ifx\topskipfactor\v!height - \let\topskipfactor\strutheightfactor - \fi - \setfontparameters % redundant, can be \setstrut, test first - \updateraggedskips} % yes indeed - -\installcorenamespace{interlinespacerelative} - -\let\setrelativeinterlinespace \relax % used elsewhere -\let\currentrelativeinterlinespace\empty - -\setvalue{\??interlinespacerelative\v!on }{\oninterlineskip} -\setvalue{\??interlinespacerelative\v!off }{\offinterlineskip} -\setvalue{\??interlinespacerelative\v!reset}{\let\currentrelativeinterlinespace\empty - \let\setrelativeinterlinespace\relax - \setfontparameters} -\setvalue{\??interlinespacerelative\v!auto }{\let\setrelativeinterlinespace\spac_linespacing_set_relative_interlinespace} - -\def\spac_linespacing_set_specified_relative_interlinespace#1% fragile? - {\doifelsedimenstring{#1}% - {\setupspecifiedinterlinespace[\c!line=#1]}% - {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}% - \spacing\currentrelativeinterlinespace}} - -\permanent\protected\def\setuprelativeinterlinespace[#1]% - {\processcommalist[#1]\spac_linespacing_setup_relative_interlinespace} - -\def\spac_linespacing_setup_relative_interlinespace#1% - {\ifcsname\??interlinespacerelative#1\endcsname - \lastnamedcs - \else - \spac_linespacing_set_specified_relative_interlinespace{#1}% - \fi} - -\def\spac_linespacing_set_relative_interlinespace - {\ifempty\currentrelativeinterlinespace\else - \spacing\currentrelativeinterlinespace - \fi} - -\protected\def\spac_linespacing_setup_use - {\ifcsname\namedinterlinespacehash\m_spac_interlinespace\s!parent\endcsname - \let\currentinterlinespace\m_spac_interlinespace - \spac_linespacing_setup_specified_interline_space - % \else - % we only support named interlinespaces - \fi} - -\permanent\protected\def\useinterlinespaceparameter#1% see footnotes - {\edef\m_spac_interlinespace{#1\c!interlinespace}% - \ifempty\m_spac_interlinespace \else - \spac_linespacing_setup_use - \fi} - -\newtoks\everysetupglobalinterlinespace -\newtoks\everysetuplocalinterlinespace - -\newconditional\interlinespaceisset - -\installcorenamespace{interlinespace} - -\installcommandhandler \??interlinespace {interlinespace} \??interlinespace - -\installmacrostack\currentinterlinespace - -\permanent\overloaded\tolerant\protected\def\setupinterlinespace[#1]#*[#2]% - {\ifarguments - \settrue\interlinespaceisset - \spac_linespacing_synchronize_local - \or - \settrue\interlinespaceisset - \ifcsname\namedinterlinespacehash{#1}\s!parent\endcsname - \edef\currentinterlinespace{#1}% - \spac_linespacing_setup_specified_interline_space - %\dosetupspecifiedinterlinespaceindeed - \else - \spac_linespacing_setup_specified_or_relative[#1]% - \fi - \or - \settrue\interlinespaceisset - \setup_interlinespace[#1][#2]% - \fi} - -\def\spac_linespacing_setup_specified_or_relative[#1]% - {\doifelseassignment{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]% - \the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi} - -\def\spac_linespacing_synchronize_local % adapts to the font - {\localinterlinespacetrue - \setfontparameters - \updateraggedskips % funny one here - \the\everysetuplocalinterlinespace - \localinterlinespacefalse} - -\permanent\protected\def\dosetupcheckedinterlinespace#1% often a chain - {\edef\p_spac_checked_interlinespace{#1}% - \ifempty\p_spac_checked_interlinespace - \spac_linespacing_synchronize_local - \orelse\ifcsname\namedinterlinespacehash\p_spac_checked_interlinespace\s!parent\endcsname % we could have a \s!check - \push_macro_currentinterlinespace - \let\currentinterlinespace\p_spac_checked_interlinespace - \spac_linespacing_setup_specified_interline_space % \dosetupspecifiedinterlinespaceindeed - \iflocalinterlinespace - \the\everysetuplocalinterlinespace - \else - \localinterlinespacetrue - \the\everysetuplocalinterlinespace - \localinterlinespacefalse - \fi - \pop_macro_currentinterlinespace - \else - \normalexpanded{\noexpand\doifelseassignment{\p_spac_checked_interlinespace}% - \setupspecifiedinterlinespace\setuprelativeinterlinespace[\p_spac_checked_interlinespace]}% - \iflocalinterlinespace - \the\everysetuplocalinterlinespace - \else - \localinterlinespacetrue - \the\everysetuplocalinterlinespace - \localinterlinespacefalse - \fi - \fi} - -\permanent\protected\def\setuplocalinterlinespace[#1]% - {\localinterlinespacetrue - \push_macro_currentinterlinespace - \setupinterlinespace[#1]% - \pop_macro_currentinterlinespace - \localinterlinespacefalse} - -\let\switchtointerlinespace\setuplocalinterlinespace - -%D Helpers - -\newskip \s_spac_lastskip -\newdimen\d_spac_prevdepth -\newcount\c_spac_spacefactor -\newdimen\d_spac_prevcontent % set by lua - -% \permanent\overloaded\protected\def\removelastskip -% {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi} - -\def\doifoutervmode - {\ifvmode - \ifinner - \doubleexpandafter\gobbleoneargument - \else - \doubleexpandafter\firstofoneargument - \fi - \else - \expandafter\gobbleoneargument - \fi} - -\protected\def\dosomebreak#1% - {\doifoutervmode - {\s_spac_lastskip\lastskip - \removelastskip - #1\relax - \ifzeropt\s_spac_lastskip - % avoid interference with footnotes - \else - \vskip\s_spac_lastskip - \fi}} - -\permanent\protected\def\packed - {\nointerlineskip} - -\permanent\protected\def\godown[#1]% - {\relax - \ifhmode\endgraf\fi - \ifvmode\nointerlineskip\vskip#1\relax\fi} - -\permanent\protected\def\smallskip{\vskip\smallskipamount} -\permanent\protected\def\medskip {\vskip\medskipamount} -\permanent\protected\def\bigskip {\vskip\bigskipamount} - -\permanent\protected\def\smallbreak - {\par - \ifvmode\ifdim\lastskip<\smallskipamount - \removelastskip - \penalty-\plusfifty - \smallskip - \fi\fi} - -\permanent\protected\def\medbreak - {\par - \ifvmode\ifdim\lastskip<\medskipamount - \removelastskip - \penalty-\plusonehundred - \medskip - \fi\fi} - -\permanent\protected\def\bigbreak - {\par - \ifvmode\ifdim\lastskip<\bigskipamount - \removelastskip - \penalty-\plustwohundred - \bigskip - \fi\fi} - -\permanent\protected\def\break {\penalty-\plustenthousand} % can be hmode or vmode -\permanent\protected\def\nobreak {\penalty \plustenthousand} % can be hmode or vmode -\permanent\protected\def\allowbreak{\penalty \zerocount} % can be hmode or vmode - -\permanent\protected\def\goodbreak {\par\ifvmode\penalty-\plusfivehundred\relax\fi} % forces vmode -\permanent\protected\def\filbreak {\par\ifvmode\vfil\penalty-\plustwohundred\vfilneg\fi} % forces vmode - -%D Made slightly more readable: - -\permanent\protected\def\vglue {\afterassignment\spac_helpers_vglue_indeed\s_spac_lastskip=} -\permanent\protected\def\hglue {\afterassignment\spac_helpers_hglue_indeed\s_spac_lastskip=} -\permanent\protected\def\topglue{\par\ifvmode\nointerlineskip\vglue-\topskip\vglue\fi} - -\def\spac_helpers_vglue_indeed - {\par - \ifvmode - \d_spac_prevdepth\prevdepth - \hrule\s!height\zeropoint - \nobreak - \vskip\s_spac_lastskip - \prevdepth\d_spac_prevdepth - \fi} - -\def\spac_helpers_hglue_indeed - {\dontleavehmode - \c_spac_spacefactor\spacefactor - \vrule\s!width\zeropoint - \nobreak - \hskip\s_spac_lastskip - \spacefactor\c_spac_spacefactor} - -%D We adapt plain's \type {\removelastskip} a bit: - -\pushoverloadmode - -\permanent\overloaded\protected\def\removelastskip % also in supp-box - {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi} - -\popoverloadmode - -% The whitespace handler. We could cache settings but normally there are not -% that many in a set. - -\installcorenamespace{whitespacemethod} - -\newskip \s_spac_whitespace_parskip \s_spac_whitespace_parskip\zeropoint -\newconditional\c_spac_whitespace_flexible \settrue\c_spac_whitespace_flexible -\newconstant \c_spac_whitespace_grid_mode % option in layout / 1=permit_half_lines - -%def\v_spac_whitespace_current{\zeropoint} -\let\v_spac_whitespace_current\v!none - -% \permanent\tolerant\protected\def\setupwhitespace[#1]% -% {\ifarguments -% \spac_whitespace_setup_nop -% \or -% \spac_whitespace_setup_yes{#1}% -% \fi} -% -% \def\spac_whitespace_setup_yes#1% -% {\edef\m_spac_whitespace_asked{#1}% -% \ifempty\m_spac_whitespace_asked -% \spac_whitespace_setup_nop -% \else -% \let\v_spac_whitespace_current\m_spac_whitespace_asked -% \spac_whitespace_setup -% \fi} - -\permanent\tolerant\protected\def\setupwhitespace[#1]% - {\ifarguments - \spac_whitespace_setup_nop - \orelse\iftok{#1}\emptytoks - \spac_whitespace_setup_nop - \else - \edef\v_spac_whitespace_current{#1}% - \spac_whitespace_setup - \fi} - -\def\spac_whitespace_setup_nop - {\ifx\v_spac_whitespace_current\v!none\else - \spac_whitespace_setup - \fi} - -\let\synchronizewhitespace\spac_whitespace_setup_nop - -\def\spac_whitespace_setup % quick test for no list - {\ifcsname\??whitespacemethod\v_spac_whitespace_current\endcsname - \lastnamedcs - \else - \expandafter\processcommalist\expandafter[\v_spac_whitespace_current]\spac_whitespace_setup_method % can be raw - \fi\relax - \ifgridsnapping - \spac_whitespace_setup_grid - \else - \spac_whitespace_setup_normal - \fi - \parskip\s_spac_whitespace_parskip} - -\def\spac_whitespace_setup_normal - {\ifconditional\c_spac_whitespace_flexible \else - \s_spac_whitespace_parskip\plusone\s_spac_whitespace_parskip - \fi} - -\def\spac_whitespace_setup_grid - {\setfalse\c_spac_whitespace_flexible - \ifdim\s_spac_whitespace_parskip>\zeropoint - \s_spac_whitespace_parskip - \ifcase\c_spac_whitespace_grid_mode - \baselineskip - \or - \ifdim\scratchdimen=\baselineskip % maybe range - \baselineskip - \else - \numexpr\s_spac_whitespace_parskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax - \fi - \else - \baselineskip - \fi - \fi} - -\permanent\protected\def\installwhitespacemethod#1#2% - {\setvalue{\??whitespacemethod#1}{#2}} - -\installwhitespacemethod \v!fix {} -\installwhitespacemethod \v!fixed {\setfalse\c_spac_whitespace_flexible} -\installwhitespacemethod \v!flexible {\settrue \c_spac_whitespace_flexible} - -\installwhitespacemethod \v!line {\s_spac_whitespace_parskip \baselineskip} -\installwhitespacemethod \v!halfline {\s_spac_whitespace_parskip .5\baselineskip} -\installwhitespacemethod \v!quarterline {\s_spac_whitespace_parskip.25\baselineskip} -\installwhitespacemethod \v!none {\s_spac_whitespace_parskip \zeropoint} -\installwhitespacemethod \v!big {\s_spac_whitespace_parskip \bigskipamount} -\installwhitespacemethod \v!medium {\s_spac_whitespace_parskip \medskipamount} -\installwhitespacemethod \v!small {\s_spac_whitespace_parskip \smallskipamount} - -\installwhitespacemethod \s!default {\spac_whitespace_setup_nop} % also covers none - -\def\spac_whitespace_setup_method#1% - {\ifcsname\??whitespacemethod#1\endcsname - \lastnamedcs - \else - \s_spac_whitespace_parskip#1\fi - \relax} - -\permanent\protected\def\forgetparskip - {\s_spac_whitespace_parskip\zeropoint - \parskip\zeropoint - \let\v_spac_whitespace_current\v!none} - -\appendtoks - \forgetparskip -\to \everyforgetall - -% \installwhitespacemethod \s!unknown {\s_spac_whitespace_parskip\commalistelement\relax} -% -% \def\spac_whitespace_setup_method#1% -% {\csname\??whitespacemethod\ifcsname\??whitespacemethod#1\endcsname#1\else\s!unknown\endcsname\relax} - -\permanent\protected\def\nowhitespace{\directcheckedvspacing\v!nowhite} % {\vspacing[\v!nowhite]} -\permanent\protected\def\whitespace {\directcheckedvspacing\v!white} % {\vspacing[\v!white]} - -\setupwhitespace - [\v!none] - -% Packed: - -% todo: when packed blocks blank, we need to enable forced - -\newconditional\c_spac_packed_blank \settrue\c_spac_packed_blank -\newcount \c_spac_packed_level - -\permanent\tolerant\protected\def\startpacked[#1]% - {\global\advance\c_spac_packed_level\plusone - \par - \ifnum\c_spac_packed_level=\plusone \ifvmode - \begingroup - \whitespace % not combined - \directcheckedvspacing\v!disable % \blank[\v!disable]% or \inhibitblank - \doifelse{#1}\v!blank\settrue\setfalse\c_spac_packed_blank - \setupwhitespace[\v!none]% or \forgetparskip - \fi \fi} - -\permanent\protected\def\stoppacked - {\par - \ifnum\c_spac_packed_level=\plusone \ifvmode - \endgroup - \fi \fi - \global\advance\c_spac_packed_level\minusone} - -\permanent\protected\def\startunpacked - {\directdefaultvspacing % \blank - \begingroup} - -\permanent\protected\def\stopunpacked - {\endgroup - \directdefaultvspacing}% \blank} - -% \prevdepth crosses pageboundaries! -% -% todo: a version that works ok inside a box - -% global : outer hsize + keep skips -% local : inner hsize + reset skips - -\installcorenamespace{linesaround} - -\let\spac_lines_vbox\vbox - -\installtextracker - {linecorrection.boxes} - {\letfrozen\let\spac_lines_vbox\ruledvbox} - {\letfrozen\let\spac_lines_vbox\vbox} - -\let\v_spac_lines_around_action_set\relax -\let\m_spac_lines_around \empty - -\newconstant\c_spac_lines_correction_mode - -\setvalue{\??linesaround\v!blank }{\blank} -\letvalue{\??linesaround\empty }\relax -\setvalue{\??linesaround\s!unknown}{\directcheckedvspacing\m_spac_lines_around} % \blank[\m_spac_lines_around]} - -\def\spac_lines_action_around % we used to let this one but it's cleaner this way - {\csname\??linesaround % i.e. do it twice - \ifcsname\??linesaround\m_spac_lines_around\endcsname\m_spac_lines_around\else\s!unknown\fi - \endcsname} - -\permanent\tolerant\protected\def\startlinecorrection [#1]{\spac_lines_start_correction\plusone{#1}} -\permanent\tolerant\protected\def\startlocallinecorrection[#1]{\spac_lines_start_correction\plustwo{#1}} - -\protected\def\spac_lines_start_correction#1#2% - {\endgraf - \begingroup - \setconstant\c_spac_lines_correction_mode#1% - \edef\m_spac_lines_around{#2}% - \spac_lines_action_around - \d_spac_prevdepth\prevdepth - \spac_lines_initialize_corrections - \offbaselinecorrection % ??? - \setbox\scratchbox\spac_lines_vbox\bgroup - \ifcase\c_spac_lines_correction_mode - % nothing - \or - % global - \or - % local - \setlocalhsize - \hsize\localhsize - \forgetbothskips - \fi - \ignorespaces} - -\protected\def\spac_lines_stop_correction - {\removeunwantedspaces - \egroup - \ifgridsnapping - \spac_lines_stop_correction_ongrid - \else - \spac_lines_stop_correction_normal - \fi - \endgroup} - -\protected\def\spac_lines_stop_correction_ongrid - {\directcheckedvspacing\v!white % \blank[\v!white]% - \spac_lines_action_around - \snaptogrid\hpack{\box\scratchbox}% - \directcheckedvspacing\v!white - \spac_lines_action_around} - -\protected\def\spac_lines_stop_correction_normal - {\directcheckedvspacing\v!nowhite % \blank[\v!nowhite]% - \ifdim\parskip>\zeropoint - % too fuzzy otherwise - \else - % doesn't like whitespace - \ifdim\d_spac_prevdepth<\maxdimen - \unless\ifdim\d_spac_prevdepth<\zeropoint - \ifdim\d_spac_prevdepth<\strutdp \relax - \pushlastnode - \ifdim\d_spac_prevdepth>\zeropoint - \kern-\d_spac_prevdepth - \fi - \kern\strutdp - \prevdepth\strutdp - \poplastnode - \fi - \fi - \fi - \fi - \ifdim\pagegoal<\maxdimen - % \blank[\v!white,\the\d_spac_lines_correction_before]% \blank[\v!white]\dotopbaselinecorrection - \directcheckedvspacing{\v!white,\the\d_spac_lines_correction_before}% \blank[\v!white]\dotopbaselinecorrection - \fi - \nointerlineskip % new - \noindent % not \dontleavehmode ! - \ifcase\c_spac_lines_correction_mode - % nothing - \or - % global - \hskip-\leftskip % more tricky would be hangindent so we ignore that one - \or - % local - \fi - \box\scratchbox - \endgraf - % - % eventually i'll get it right ... (i also need to check all whitespace code elsewhere) - % - % \blank[\the\d_spac_lines_correction_after]% \dobotbaselinecorrection - % \directcheckedvspacing{\the\d_spac_lines_correction_after}% \dobotbaselinecorrection - \directcheckedvspacing{\v!white,\the\d_spac_lines_correction_after}% \dobotbaselinecorrection - % \allowbreak % new, otherwise problems when many in a row - \prevdepth\strutdp - \spac_lines_action_around} - -\let\stoplinecorrection \spac_lines_stop_correction -\let\stoplocallinecorrection\spac_lines_stop_correction - -% todo: - -\permanent\protected\def\correctwhitespace - {\dowithnextboxcs\correctwhitespacefinish\vbox} - -\permanent\protected\def\correctwhitespacefinish - {\startbaselinecorrection - \flushnextbox - \stopbaselinecorrection} - -\permanent\protected\def\verticalstrut {\vpack{\hsize\zeropoint\forgetall\strut}} -\permanent\protected\def\horizontalstrut{\hpack {\strut}} - -%D Here follow some presets related to interline spacing and therefore also struts. -%D The values 2.8, 0.07, 0.72 and 0.28 originate in \INRSTEX, a package that we used -%D a while after we decided that \LATEX\ was not flexible enough. After that -%D \CONTEXT\ evolved, from some wrapper code around (old) \LATEX\ (on a floppy -%D disk), to using modules from \INRSTEX\ (which also fit on a floppy) and finally -%D all written from scratch. I simply didn't understand all that \TEX\ code at that -%D time, and it was easier to figure it out myself. But \unknown\ some settings -%D stayed, as the height|/|depth ratios, and they never proved to be bad ones! The -%D same is true for the font size relations. - -%D \starttabulate -%D \NC \type {\lineheight} \NC the height of a line \NC \NR -%D \NC \type {\spacing{number}} \NC adapting the interline space \NC \NR -%D \NC \type {\normalbaselines} \NC initialize the interline spacing \NC \NR -%D \NC \type {\setstrut} \NC initialize \type {\strut} \NC \NR -%D \NC \type {\setnostrut} \NC disable the \type {\strut}, \type {\endstrut}, \type {\begstrut} \NC \NR -%D \NC \type {\setteststrut} \NC initialize the visual \type {\strut} \NC \NR -%D \NC \type {\resetteststrut} \NC disable the visual \type {\strut} \NC \NR -%D \NC \type {\setfontparameters} \NC synchronize parameters with foints \NC \NR -%D \stoptabulate -%D -%D \unknown\ and many more (this is a decades old list). -%D -%D The lineheight is the sum of the height and depth of \type {strut}, which is -%D an invisible blob that can be used to enforce the proper dimensions. -%D -%D Such a blob, when placed at the beginning of a paragraph can have side effects -%D that can be prevented with \type {\dontleavehmode}. Never use \type -%D {\leavevmode}! - -\newdimen\strutdimen -\newdimen\lineheight -\newdimen\openlineheight -\newdimen\openstrutheight -\newdimen\openstrutdepth -\newdimen\topskipgap -\newdimen\struttotal - -\def\strutheightfactor {.72} -\def\strutdepthfactor {.28} - -\def\baselinefactor {2.8} - -\let\m_spac_vertical_baseline_stretch_factor \zerocount -\let\m_spac_vertical_baseline_shrink_factor \zerocount - -\def\minimumstrutheight {\zeropoint} -\def\minimumstrutdepth {\zeropoint} - -\def\normallineheight {\baselinefactor\exheight} -\def\minimumlinedistance {\lineskip} - -\def\strutheight {\zeropoint} -\def\strutdepth {\zeropoint} -\def\strutwidth {\zeropoint} - -\let\spacingfactor \plusone - -\def\topskipfactor {1.0} -\def\maxdepthfactor {0.5} - -\def\systemtopskipfactor {\topskipfactor} -\def\systemmaxdepthfactor {\maxdepthfactor} - -\ifdefined\globalbodyfontsize \else - \newdimen\globalbodyfontsize - \globalbodyfontsize=12pt -\fi - -\ifdefined\normalizedbodyfontsize \else - \def\normalizedbodyfontsize{12pt} -\fi - -\permanent\protected\def\topskipcorrection - {\simpletopskipcorrection - \vskip-\struttotal - \verticalstrut} - -\permanent\protected\def\simpletopskipcorrection - {\ifdim\topskip>\openstrutheight - % == \vskip\topskipgap - \vskip\topskip - \vskip-\openstrutheight - \fi} - -\permanent\protected\def\settopskip % the extra test is needed for the lbr family - {\topskip - \ifgridsnapping - \zeropoint - \else - \systemtopskipfactor\globalbodyfontsize - \ifcase\bottomraggednessmode % ragged bottom - \s!plus5\globalbodyfontsize - \fi - \fi - %\relax - \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} - -\protected\def\setmaxdepth - {\maxdepth\systemmaxdepthfactor\globalbodyfontsize} - -\newskip \usedbaselineskip % These used to be \normal... but that isn't pretty -\newskip \usedlineskip % in the token interface, so thes few now have new -\newdimen\usedlineskiplimit % names. They are public but not really user commands. - -\permanent\protected\def\normalbaselines - {\baselineskip \usedbaselineskip - \lineskip \usedlineskip - \lineskiplimit\usedlineskiplimit} - -\permanent\protected\def\flexiblebaselines - {\baselineskip \usedbaselineskip - \lineskip 1\usedlineskip \s!plus 1\s!fill - \lineskiplimit\usedlineskiplimit} - -\permanent\protected\def\setnormalbaselines % used in overload - {\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 - \usedbaselineskip\openlineheight - \ifgridsnapping\else - \s!plus \m_spac_vertical_baseline_stretch_factor\openlineheight - \s!minus\m_spac_vertical_baseline_shrink_factor \openlineheight - \fi - \usedlineskip\minimumlinedistance\relax % \onepoint\relax - \usedlineskiplimit\zeropoint\relax - \normalbaselines} - -\permanent\protected\def\spacing#1% vertical - {\ifgridsnapping - \let\spacingfactor\plusone - \else - \edef\spacingfactor{#1}% - \fi - \edef\systemtopskipfactor {\thewithoutunit\dimexpr#1\dimexpr\topskipfactor \points}% - \edef\systemmaxdepthfactor{\thewithoutunit\dimexpr#1\dimexpr\maxdepthfactor\points}% - \setnormalbaselines - \setstrut} - -% \protected\def\forgetverticalstretch % \forgetspacing -% {\spacing\plusone} - -\permanent\protected\def\forgetverticalstretch - {\let\spacingfactor \plusone - \let\systemtopskipfactor \topskipfactor - \let\systemmaxdepthfactor\maxdepthfactor - \setnormalbaselines - \setstrut} - -\appendtoks - \forgetverticalstretch -\to \everyforgetall % needed in otr - -%D Sometimes one needs to freeze the interlinespacing -%D -%D \starttyping -%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf} -%D \stoptyping - -\let\restoreinterlinespace\relax - -\permanent\protected\def\saveinterlinespace - {\protected\edef\restoreinterlinespace - {\lineheight \the\lineheight - \openstrutheight \the\openstrutheight - \openstrutdepth \the\openstrutdepth - \openlineheight \the\openlineheight - \usedbaselineskip \the\usedbaselineskip - \usedlineskip \the\usedlineskip - \usedlineskiplimit \the\usedlineskiplimit - \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}% - \noexpand\normalbaselines}} - -%D This is the plain definition: -%D -%D \starttyping -%D \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} -%D \stoptyping -%D -%D which could be: -%D -%D \starttyping -%D \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} -%D \stoptyping -%D -%D But we do things differently. - -\newbox\strutbox - -\setbox\strutbox\hpack{\vrule\s!height8.5pt\s!depth3.5pt\s!width\zeropoint} % just a start - -\def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} - -% \protected\def\strut -% {\relax -% \ifmmode\copy\else\dontleavehmode\unhcopy\fi\strutbox} - -\let\normalstrut\strut - -%D The double \type {\hbox} construction enables us to backtrack boxes. - -\overloaded\let\strutht\undefined \newdimen\strutht -\overloaded\let\strutdp\undefined \newdimen\strutdp - -\permanent\protected\def\setstrut - {\ifgridsnapping - \setstrutgridyes - \else - \setstrutgridnop - \fi} - -\permanent\protected\def\setstrutgridyes - {\strutht\spacingfactor\dimexpr - \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight - \else - \strutheightfactor\dimexpr\normallineheight - \fi - \relax - \strutdp\dimexpr - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \normallineheight-\strutht - \fi - \relax - \dosetstrut} - -\permanent\protected\def\setstrutgridnop - {\strutht\spacingfactor\dimexpr - \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight - \else - \strutheightfactor\dimexpr\normallineheight - \fi - \relax - \strutdp\spacingfactor\dimexpr - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \strutdepthfactor\dimexpr\normallineheight - \fi - \relax - \dosetstrut} - -\permanent\protected\def\setcharstrut#1% - {\setbox\strutbox\hbox{#1}% no \hpack, in case we have smallcaps - \strutht\ht\strutbox - \strutdp\dp\strutbox - \dosetstrut} - -\permanent\protected\def\settightstrut - {\setcharstrut{(}} - -\permanent\protected\def\setfontstrut - {\setcharstrut{(gplQT}} - -\permanent\protected\def\setcapstrut% could be M, but Q has descender - {\setcharstrut{Q}} - -%D Handy for math (used in mathml): - -\permanent\protected\def\charhtstrut - {\begingroup - \setcharstrut{GJY}% - \vrule\s!width\zeropoint\s!depth\zeropoint\s!height\strutht - \endgroup} - -\permanent\protected\def\chardpstrut - {\begingroup - \setcharstrut{gjy}% - \vrule\s!width\zeropoint\s!depth\strutdp\s!height\zeropoint - \endgroup} - -%D Because of all the callbacks in mkiv, we avoid unnecessary boxes ... maybe use an -%D attribute so that we can tag boxes that don't need a treatment; tests with using -%D an attribute so far have shown that it's slower because testing the attribute -%D takes time too. - -\permanent\protected\def\dosetstrut - {\enforced\let\strut\normalstrut - \ifabsnum\dimexpr\strutht+\strutdp-\lineheight\relax<\plustwo - % compensate rounding error /- 1sp to avoid too many - % 1sp baselineskips in for instance verbatim - % \strutht\dimexpr\lineheight-\strutdp\relax - % better: - \strutdp\dimexpr\lineheight-\strutht\relax - \struttotal\lineheight - \else - \struttotal\dimexpr\strutht+\strutdp\relax - \fi - \edef\strutheight{\the\strutht}% - \edef\strutdepth {\the\strutdp}% - \ifdim\strutwidth=\zeropoint - \spac_struts_set_hide - \else - \spac_struts_set_vide - \fi} - -\def\spac_struts_set_hide - {\setbox\strutbox\hpack - {\vrule - \s!width \zeropoint - \s!height\strutht - \s!depth \strutdp}} - -\newconstant\c_strut_visual_mode - -\def\spac_struts_set_vide - {\setbox\strutbox\hpack % at some time this extra wrapping was needed - {\spac_struts_vide_hbox to \zeropoint - {\ifcase\c_strut_visual_mode - \spac_struts_black - \or - \spac_struts_color - \else - \spac_struts_black - \fi}}} - -\def\spac_struts_black - {\vrule - \s!width \strutwidth - \s!height\strutht - \s!depth \strutdp - \hss} - -\def\spac_struts_color - {\hss % new, will be option - \scratchwidth.1\struthtdp - \begingroup - \directcolor[f:b:t]% - \vrule - \s!width \scratchwidth - \s!height\strutht - \s!depth \strutdp - \kern-\scratchwidth - \vrule - \s!width \scratchwidth - \s!height\zeropoint - \s!depth \strutdp - \endgroup - \kern-.625\scratchwidth - \vrule - \s!width .25\scratchwidth - \s!height\strutht - \s!depth \strutdp - \hss} - -\let\spac_struts_vide_hbox\hbox % overloaded in trac-vis.mkiv - -%D The dimen \type {\struttotal} holds the exact size of the strut; occasionally a -%D one scaled point difference can show up with the lineheight. This is more -%D efficient (less callbacks): - -\newbox\b_spac_struts_empty \setbox\b_spac_struts_empty\emptyhbox - -\def\spac_struts_set_hide - {\setbox\strutbox\copy\b_spac_struts_empty - \ht\strutbox\strutht - \dp\strutbox\strutdp} - -\permanent\protected\def\strut % still callbacks for \hbox{\strut} - {\relax - \dontleavehmode - \copy\strutbox} - -% \protected\def\strut % slightly faster -% {\relax -% \ifmmode\copy\else\dontleavehmode\unhcopy\fi\strutbox} - -\let\normalstrut\strut - -\permanent\protected\def\halfstrut - {\relax - \dontleavehmode - \begingroup - \setbox\scratchbox\copy\strutbox - \ht\scratchbox\dimexpr\strutht/\plustwo\relax - \dp\scratchbox\dimexpr\strutdp/\plustwo\relax - \box\scratchbox - \endgroup} - -\permanent\protected\def\quarterstrut - {\relax - \dontleavehmode - \begingroup - \setbox\scratchbox\copy\strutbox - \ht\scratchbox\dimexpr\strutht/\plusfour\relax - \dp\scratchbox\dimexpr\strutdp/\plusfour\relax - \box\scratchbox - \endgroup} - -\permanent\protected\def\depthstrut - {\relax - \dontleavehmode - \begingroup - \setbox\scratchbox\copy\strutbox - \ht\scratchbox\dimexpr\strutht-\struthtdp/\plustwo\relax % assumes that ht > lineheight/2 - \box\scratchbox - \endgroup} - -\permanent\protected\def\halflinestrut - {\relax - \dontleavehmode - \begingroup - \setbox\scratchbox\copy\strutbox - \ht\scratchbox\dimexpr\strutht-.5\strutht-.5\strutdp\relax - \box\scratchbox - \endgroup} - -\permanent\protected\def\noheightstrut - {\relax - \dontleavehmode - \begingroup - \setbox\scratchbox\copy\strutbox - \ht\scratchbox\zeropoint - \box\scratchbox - \endgroup} - -%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 -%D -%D Beware: using an unknown value results in char struts. - -\installcorenamespace{struts} - -\permanent\tolerant\protected\def\setupstrut[#1]% - {\edef\m_strut{#1}% - \ifcsname\??struts\m_strut\endcsname - \lastnamedcs - \else - \setcharstrut\m_strut - \fi} - -\permanent\protected\def\synchronizestrut#1% no [] parsing, faster for internal - {\edef\m_strut{#1}% - \ifcsname\??struts\m_strut\endcsname - \lastnamedcs - \else - \setcharstrut\m_strut - \fi} - -\permanent\protected\def\dosynchronizestrut#1% no [] parsing, faster for internal - {\ifcsname\??struts#1\endcsname - \lastnamedcs - \else - \setcharstrut{#1}% - \fi} - -\permanent\protected\def\showstruts % adapts .. is wrong - {\c_strut_visual_mode\zerocount - \setteststrut - \settestcrlf} - -\permanent\protected\def\showcolorstruts % adapts .. is wrong - {\c_strut_visual_mode\plusone - \setteststrut - \settestcrlf} - -\permanent\protected\def\setteststrut - {\def\strutwidth{.8pt}% - \setstrut} - -\permanent\protected\def\dontshowstruts - {\unsetteststrut - \settestcrlf} - -\permanent\protected\def\unsetteststrut - {\let\strutwidth\zeropoint - \setstrut} - -\def\autostrutfactor{1.1} - -\permanent\protected\def\setautostrut - {\begingroup - \setbox\scratchbox\copy\strutbox - \setstrut - \ifdim\strutht>\autostrutfactor\ht\scratchbox - \endgroup \setstrut - \orelse\ifdim\strutdp>\autostrutfactor\dp\scratchbox - \endgroup \setstrut - \else - \endgroup - \fi} - -\newbox\nostrutbox \setbox\nostrutbox\emptyhbox - -\newtoks\everysetnostrut - -\permanent\protected\def\setnostrut - {\the\everysetnostrut} - -\appendtoks - \setbox\strutbox\copy\nostrutbox - \enforced\let\strut \empty - \enforced\let\endstrut\empty - \enforced\let\begstrut\empty -\to \everysetnostrut - -%D When enabled, sigstruts will remove themselves if nothing goes inbetween. For -%D practical reasons we define some boundary characters here. - -\permanent\protected\def\leftboundary {\protrusionboundary\plusone} -\permanent\protected\def\rightboundary {\protrusionboundary\plustwo} -\permanent\protected\def\signalcharacter{\boundary\plusone\char\zerocount\boundary\plustwo} % not the same as strut signals - -\newsignal\d_spac_struts_signal \setfalse\sigstruts - -\permanent\protected\def\begstrut - {\relax\ifcase\strutht - % \ignorespaces % maybe - \else - \spac_struts_beg - \fi} - -\def\spac_struts_beg - {\ifconditional\sigstruts - \spac_struts_beg_signal - \else - \spac_struts_beg_normal - \fi - \ignorespaces} - -\def\spac_struts_beg_signal - {\noindent\horizontalstrut - \penalty\plustenthousand - \hskip-\d_spac_struts_signal - \hskip\d_spac_struts_signal} - -\def\spac_struts_beg_normal - {\boundary\plusone - \strut - %\boundary\plusone - \penalty\plustenthousand - %\boundary\plusone - \hskip\zeropoint} - -\permanent\protected\def\endstrut - {\relax\ifhmode - \ifcase\strutht - % \removeunwantedspaces % maybe - \else - \spac_struts_end - \fi - \fi} - -\def\spac_struts_end - {\ifconditional\sigstruts - \spac_struts_end_signal - \else - \spac_struts_end_normal - \fi} - -\def\spac_struts_end_signal - {\ifdim\lastskip=\d_spac_struts_signal - \unskip - \unskip - \unpenalty - \setbox\scratchbox\lastbox - \else - \penalty\plustenthousand - \hskip\zeropoint - \strut - \fi} - -\def\spac_struts_end_normal - {\removeunwantedspaces - \penalty\plustenthousand - %\boundary\plustwo - \hskip\zeropoint - %\boundary\plustwo - \strut - \boundary\plustwo} - -% unsave: -% -% \def\pseudostrut -% {\bgroup -% \setnostrut -% \normalstrut -% \egroup} -% -% try: -% -% \startchemie -% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C] -% \stopchemie -% -% so: - -\permanent\protected\def\pseudostrut - {\noindent} % better: \dontleavehmode - -\let\pseudobegstrut\pseudostrut -\let\pseudoendstrut\removeunwantedspaces - -\permanent\protected\def\resetteststrut - {\def\strutwidth{\zeropoint}% no let - \setstrut} - -\ifdefined\setfontparameters \else - \def\setfontparameters{\the\everybodyfont} -\fi - -%D Keyword based strutting: - -\letvalue{\??struts\v!yes }\setstrut -\letvalue{\??struts\v!auto }\setautostrut -\letvalue{\??struts\v!no }\setnostrut -\letvalue{\??struts\v!cap }\setcapstrut -\letvalue{\??struts\v!fit }\setfontstrut -\letvalue{\??struts\v!line }\setstrut -\letvalue{\??struts\s!default}\setstrut -\letvalue{\??struts\empty }\setstrut - -%D Handy: - -\def\baselinedistance{\the\lineheight} - -%D We need \type {\normaloffinterlineskip} because the new definition contains an -%D assignment, and |<|don't ask me why|>| this assignment gives troubles in for -%D instance the visual debugger. - -\pushoverloadmode - -\overloaded\permanent\protected\def\offinterlineskip - {\baselineskip-\thousandpoint - \lineskip \zeropoint - \lineskiplimit\maxdimen - % We also need this here now; thanks to taco for figuring that out! - \def\minimumlinedistance{\zeropoint}} - -\overloaded\permanent\protected\def\nointerlineskip - {\prevdepth-\thousandpoint} - -\aliased\let\normaloffinterlineskip\offinterlineskip % knuth's original - -\popoverloadmode - -%D This is tricky. The prevdepth value is still set to the last one even if there is -%D nothing on the page. The same is true for prevgraf, which doesn't resemble the -%D value on the current page. -%D -%D So, here we kick in a checker but it has to happen after the output group and it -%D only has to be done once (output can trigger itself!). -%D -%D However, prevgraf is somehow bound to hangindent so we can get very nasty side -%D effects. So, in tne end we use our own variable! - -\ifdefined\getnofpreviouslines - % defined public at the lua end -\else - \let\getnofpreviouslines\!!zerocount -\fi - -\protected\def\page_otr_synchronize_page_yes - {\aftergroup\page_otr_synchronize_page_indeed - \global\enforced\let\page_otr_synchronize_page\relax} - -% \protected\def\page_otr_synchronize_page_indeed -% {\clf_synchronizepage -% \glet\page_otr_synchronize_page\page_otr_synchronize_page_yes} -% -% This has to become an otr method: \s!page_otr_command_synchonize_page - -\protected\def\page_otr_synchronize_page_indeed - {\ifx\currentoutputroutine\s!multicolumn\else\clf_synchronizepage\fi - \global\enforced\let\page_otr_synchronize_page\page_otr_synchronize_page_yes} - -\let\page_otr_synchronize_page\page_otr_synchronize_page_yes - -\appendtoks - \page_otr_synchronize_page -\to \everyaftershipout - -%D My own one: - -\protected\def\spac_helpers_push_interlineskip_yes - {\enforced\edef\oninterlineskip - {\baselineskip \the\baselineskip - \lineskip \the\lineskip - \lineskiplimit\the\lineskiplimit - \noexpand\edef\noexpand\minimumlinedistance{\the\dimexpr\minimumlinedistance}% - \enforced\let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}} % \noexpand not needed - -\protected\def\spac_helpers_push_interlineskip_nop - {\enforced\let\oninterlineskip\setnormalbaselines} - -\pushoverloadmode - -\overloaded\permanent\protected\def\offinterlineskip - {\ifdim\baselineskip>\zeropoint - \spac_helpers_push_interlineskip_yes - \else - \spac_helpers_push_interlineskip_nop - \fi - \normaloffinterlineskip} - -\permanent\let\oninterlineskip\relax - -\popoverloadmode - -\permanent\protected\def\resetpenalties#1% - {\ifdefined#1% - \frozen#1\minusone - \fi} - -\permanent\protected\def\setpenalties#1#2#3% - {\ifdefined#1% space before #3 prevents lookahead problems, needed when #3=text - \frozen#1\numexpr#2+\plusone\relax\space\doexpandedrecurse{\the\numexpr#2\relax}{ #3}\zerocount\relax - \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\c_spac_keep_lines_together -\let\restoreinterlinepenalty\relax - -\protected\def\spac_penalties_restore - {\global\enforced\let\restoreinterlinepenalty\relax - \overloaded\global\resetpenalties\interlinepenalties - \global\c_spac_keep_lines_together\zerocount} - -\protected\def\keeplinestogether#1% - {\ifnum#1>\c_spac_keep_lines_together - \global\c_spac_keep_lines_together#1% - \overloaded\global\setpenalties\interlinepenalties\c_spac_keep_lines_together\plustenthousand - \global\enforced\let\restoreinterlinepenalty\spac_penalties_restore - \fi} - -\def\defaultdisplaywidowpenalty {50} -\def\defaultwidowpenalty {2000} % was: 1000 -\def\defaultclubpenalty {2000} % was: 800 -\def\defaultbrokenpenalty {100} -\def\defaultdoublehyphendemerits {10000} -\def\defaultfinalhyphendemerits {5000} -\def\defaultadjdemerits {10000} - -\def\defaultgriddisplaywidowpenalty {0} -\def\defaultgridwidowpenalty {0} -\def\defaultgridclubpenalty {0} -\def\defaultgridbrokenpenalty {0} -\def\defaultgriddoublehyphendemerits{10000} % always was so -\def\defaultgridfinalhyphendemerits {5000} % always was so -\def\defaultgridadjdemerits {10000} % always was so - -\permanent\protected\def\nopenalties - {\frozen\widowpenalty \zerocount - \frozen\clubpenalty \zerocount - \frozen\brokenpenalty \zerocount - \frozen\doublehyphendemerits\zerocount - \frozen\finalhyphendemerits \zerocount - \frozen\adjdemerits \zerocount} - -\permanent\protected\def\setdefaultpenalties - {\directsetup{\systemsetupsprefix\s!default}} - -\startsetups [\systemsetupsprefix\s!reset] - \resetpenalties\widowpenalties - \resetpenalties\clubpenalties - \resetpenalties\interlinepenalties -\stopsetups - -%D We use \directsetup because it's faster and we know there is no csl: - -\startsetups [\systemsetupsprefix\s!default] - - \directsetup{\systemsetupsprefix\s!reset} - - \frozen\widowpenalty \defaultwidowpenalty - \frozen\clubpenalty \defaultclubpenalty - \frozen\displaywidowpenalty \defaultdisplaywidowpenalty - \frozen\brokenpenalty \defaultbrokenpenalty - \frozen\doublehyphendemerits\defaultdoublehyphendemerits - \frozen\finalhyphendemerits \defaultfinalhyphendemerits - \frozen\adjdemerits \defaultadjdemerits - -\stopsetups - -\startsetups [\v!grid] [\systemsetupsprefix\s!default] - - \directsetup{\systemsetupsprefix\s!reset} - - \frozen\widowpenalty \defaultgridwidowpenalty - \frozen\clubpenalty \defaultgridclubpenalty - \frozen\displaywidowpenalty \defaultgriddisplaywidowpenalty - \frozen\brokenpenalty \defaultgridbrokenpenalty - \frozen\doublehyphendemerits\defaultgriddoublehyphendemerits - \frozen\finalhyphendemerits \defaultgridfinalhyphendemerits - \frozen\adjdemerits \defaultgridadjdemerits - -\stopsetups - -%D As an illustration: - -\startsetups [\systemsetupsprefix\v!strict] - - \directsetup{\systemsetupsprefix\s!reset} - - \setpenalties \widowpenalties \plustwo \maxdimen - \setpenalties \clubpenalties \plustwo \maxdimen - \frozen \brokenpenalty \maxdimen - \frozen \doublehyphendemerits \defaultdoublehyphendemerits - \frozen \finalhyphendemerits \defaultfinalhyphendemerits - \frozen \adjdemerits \defaultadjdemerits - -\stopsetups - -\setdefaultpenalties % will happen later in \setuplayout - -%D To be checked: - -\newbox\b_spac_struts_saved - -\permanent\protected\def\savestrut {\setbox\b_spac_struts_saved\copy\strutbox} -\permanent\protected\def\savedstrut{\copy \b_spac_struts_saved} - -%D Good old blank redone: - -%definesystemattribute[kernchars] [public] -\definesystemattribute[skipcategory] [public] -\definesystemattribute[skippenalty] [public] -\definesystemattribute[skiporder] [public] -\definesystemattribute[snapmethod] [public] -\definesystemattribute[snapvbox] [public] -%definesystemattribute[snapcategory] [public] - -% TODO: NAMED SNAPPERS - -\installcorenamespace{gridsnappers} -\installcorenamespace{gridsnapperattributes} -\installcorenamespace{gridsnappersets} - -\newskip \bodyfontlineheight -\newdimen \bodyfontstrutheight -\newdimen \bodyfontstrutdepth - -\newskip \globalbodyfontlineheight % why a skip -\newdimen \globalbodyfontstrutheight -\newdimen \globalbodyfontstrutdepth - -\permanent\def\snappedvboxattribute{\ifgridsnapping attr\snapvboxattribute\c_attr_snapmethod\fi} -\permanent\def\setlocalgridsnapping{\ifgridsnapping \c_attr_snapvbox \c_attr_snapmethod\fi} - -\def\spac_grids_set_local_snapping#1% - {\ifgridsnapping - \doifsomething{#1}% - {\spac_grids_snap_value_set{#1}% - \c_attr_snapvbox\c_attr_snapmethod}% - \fi} - -\def\spac_grids_expand_snapper#1% - {\edef\m_spac_snapper - {\ifempty\m_spac_snapper\else\m_spac_snapper,\fi - \ifcsname\??gridsnappersets#1\endcsname - \lastnamedcs\else#1% - \fi}} - -\permanent\protected\def\installsnapvalues#1#2% - {\let\m_spac_snapper\empty - \rawprocesscommacommand[#2]\spac_grids_expand_snapper - \edef\currentsnapper{#1:\m_spac_snapper}% - \ifcsname\??gridsnapperattributes\currentsnapper\endcsname - \scratchcounter\lastnamedcs % already defined - \else - \scratchcounter\clf_definesnapmethod{#1}{\m_spac_snapper}% - \setevalue{\??gridsnapperattributes\currentsnapper}{\the\scratchcounter}% - \fi - \setevalue{\??gridsnappers#1}{\c_attr_snapmethod\the\scratchcounter\relax}% - \letvalue{\??gridsnappersets#1}\m_spac_snapper} - -\permanent\def\theexpandedsnapperset#1{\begincsname\??gridsnappersets#1\endcsname} % only for manuals - -\permanent\protected\def\usegridparameter#1% no checking here - {\edef\m_spac_grid_asked{#1\c!grid}% - \ifempty\m_spac_grid_asked - \c_attr_snapvbox\attributeunsetvalue - \else - \spac_grids_snap_value_set\m_spac_grid_asked - \c_attr_snapvbox\c_attr_snapmethod - \fi} - -\permanent\tolerant\protected\def\definegridsnapping[#1]#*[#2]% - {\installsnapvalues{#1}{#2}} - -\edef\spac_grids_snap_value_reset - {%\gridsnappingfalse - \c_attr_snapmethod\attributeunsetvalue} - -\def\spac_grids_snap_value_set#1% - {%\gridsnappingtrue - \begincsname\??gridsnappers#1\endcsname} - -% maybe: -% -% \def\spac_grids_snap_value_set#1% -% {%\gridsnappingtrue -% \ifcsname\??gridsnappers#1\endcsname -% \lastnamedcs -% \else -% \definegridsnapping[#1][#1]% -% \begincsname\??gridsnappers#1\endcsname -% \fi} - -\def\spac_grids_snap_value_auto#1% - {\ifcsname\??gridsnappers#1\endcsname - \lastnamedcs - \else - \installsnapvalues\s!dummy{#1}% - \csname\??gridsnappers\s!dummy\endcsname - \fi} - -% \installsnapvalues{loose} {\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut} -% \installsnapvalues{normal}{\v!maxdepth:1.0,\v!maxheight:1.0,\v!strut} -% \installsnapvalues{tight} {\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut} - -% none don't enlarge -% halfline enlarge by halfline/halfline -% line enlarge by line/line -% strut enlarge by ht/dp (default) -% first align to top line -% last align to bottom line -% mindepth round depth down -% maxdepth round depth up -% minheight round height down -% maxheight round height up -% local use local interline space -% offset:-3tp vertical shift within box -% bottom:lines -% top:lines -% box centers a box rounded upwards (box:.5 -> tolerance) -% min centers a box rounded downwards -% max centers a box rounded upwards - -%D We're not downward compatible with \MKII ! Not yet in interface file: - -\definegridsnapping[\v!normal] [\v!maxheight,\v!maxdepth,\v!strut] -\definegridsnapping[\v!standard] [\v!maxheight,\v!maxdepth,\v!strut] -\definegridsnapping[\v!yes] [\v!maxheight,\v!maxdepth,\v!strut] - -\definegridsnapping[\v!strict] [\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut] -\definegridsnapping[\v!tolerant] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut] -\definegridsnapping[\v!verytolerant] [\v!maxdepth:1.4,\v!maxheight:1.4,\v!strut] - -\definegridsnapping[\v!tolerant:10] [\v!maxdepth:1.1,\v!maxheight:1.1,\v!strut] % 10 pct tolerance -\definegridsnapping[\v!tolerant:20] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut] % 20 pct tolerance -\definegridsnapping[\v!tolerant:30] [\v!maxdepth:1.3,\v!maxheight:1.3,\v!strut] % 30 pct tolerance -\definegridsnapping[\v!tolerant:40] [\v!maxdepth:1.4,\v!maxheight:1.4,\v!strut] % 40 pct tolerance - -\definegridsnapping[\v!top] [\v!minheight,\v!maxdepth,\v!strut] -\definegridsnapping[\v!bottom] [\v!maxheight,\v!mindepth,\v!strut] -\definegridsnapping[\v!both] [\v!minheight,\v!mindepth,\v!strut] - -\definegridsnapping[\v!broad] [\v!maxheight,\v!maxdepth,\v!strut,0.8] % maybe 0.85 -\definegridsnapping[\v!fit] [\v!maxheight,\v!maxdepth,\v!strut,1.2] % tight 0.15 - -\definegridsnapping[\v!first] [\v!first] -\definegridsnapping[\v!last] [\v!last] -\definegridsnapping[\v!high] [\v!minheight,\v!maxdepth,\v!none] -\definegridsnapping[\v!one] [\v!minheight,\v!mindepth] -\definegridsnapping[\v!low] [\v!maxheight,\v!mindepth,\v!none] -\definegridsnapping[\v!none] [\v!none] -\definegridsnapping[\v!line] [\v!line] -\definegridsnapping[\v!strut] [\v!strut] -\definegridsnapping[\v!box] [\v!box] -\definegridsnapping[\v!min] [\v!min] -\definegridsnapping[\v!max] [\v!max] - -\definegridsnapping[\v!middle] [\v!maxheight,\v!maxdepth] % used in placement - -\definegridsnapping[\v!math] [\v!maxdepth:1.05,\v!maxheight:1.05,\v!strut] % experimental, maybe 1.1 -\definegridsnapping[\v!math:\v!line] [\v!math,\v!line,\v!split] -\definegridsnapping[\v!math:\v!halfline] [\v!math,\v!halfline,\v!split] -\definegridsnapping[\v!math:-\v!line] [\v!math,-\v!line,\v!split] -\definegridsnapping[\v!math:-\v!halfline][\v!math,-\v!halfline,\v!split] - -\permanent\protected\def\synchronizelocallinespecs - {\bodyfontlineheight \normallineheight - \bodyfontstrutheight\strutht - \bodyfontstrutdepth \strutdp} - -\permanent\protected\def\synchronizegloballinespecs - {\global\globalbodyfontlineheight \normallineheight - \global\globalbodyfontstrutheight\strutht - \global\globalbodyfontstrutdepth \strutdp} - -\appendtoks - \synchronizegloballinespecs - \synchronizelocallinespecs -\to \everysetupglobalinterlinespace - -\appendtoks - \synchronizelocallinespecs -\to \everysetuplocalinterlinespace - -%D We still have to synchronize these: - -\permanent\protected\def\synchronizeskipamounts - {\bigskipamount - \skipfactor\baselineskip - \s!plus\skipgluefactor\baselineskip - \s!minus\skipgluefactor\baselineskip - \relax - \medskipamount \bigskipamount \divide\medskipamount \plustwo - \smallskipamount\bigskipamount \divide\smallskipamount\plusfour} - -%D Snapping. - -% \newif\ifgridsnapping % already defined - -\permanent\tolerant\protected\def\startgridsnapping[#1]% - {\snaptogrid[#1]\vbox\bgroup} - -\permanent\protected\def\stopgridsnapping - {\egroup} - -\permanent\tolerant\protected\def\placeongrid[#1]% - {\snaptogrid[#1]\vbox} % mark as done - -\permanent\tolerant\protected\def\snaptogrid[#1]% list or predefined - {\ifgridsnapping - \expandafter\spac_grids_snap_to_indeed % todo: move inline - \else - \expandafter\gobbleoneargument - \fi{#1}} - -\def\spac_grids_snap_to_indeed#1% - {\bgroup - \spac_grids_snap_value_reset - \dowithnextbox{\spac_grids_snap_to_finish{#1}}} - -% eventually there will always be a line snap - -\def\spac_grids_snap_to_finish#1% - {\ifvbox\nextbox % this will go away - \clf_vspacingcollapse\nextbox\relax % isn't that already done? - \fi - \doifelsenothing{#1}{\spac_grids_snap_value_set\v!normal}{\spac_grids_snap_value_set{#1}}% - \clf_vspacingsnap\nextbox\c_attr_snapmethod\relax - \ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}% no pack (?), we snap - \egroup} - -\def\spac_grids_check_nop - {\gridsnappingfalse - \resetsystemmode\v!grid - \spac_grids_snap_value_reset} - -\def\spac_grids_check_yes - {\gridsnappingtrue - \setsystemmode\v!grid - \spac_grids_snap_value_set\askedgridmode} - -\protected\def\synchronizegridsnapping - {\edef\askedgridmode{\layoutparameter\c!grid}% - \ifx\askedgridmode\v!no % official - \spac_grids_check_nop - \orelse\ifx\askedgridmode\v!off % for taco and luigi - \spac_grids_check_nop - \orelse\ifempty\askedgridmode % to be sure - \spac_grids_check_nop - \else - \spac_grids_check_yes - \fi} - -\permanent\protected\def\setupgridsnapping[#1]% less overhead than setuplayout (needs testing) - {\setlayoutparameter\c!grid{#1}\synchronizegridsnapping} - -\permanent\protected\def\checkgridmethod#1% - {\edef\p_grid{#1}% - \ifempty\p_grid - \let\checkedgridmethod\empty - \let\checkedgridscope \v!local - \else - \splitatcolon\p_grid\checkedgridscope\checkedgridmethod - \ifempty\checkedgridmethod - \ifx\checkedgridscope\v!local\orelse\ifx\checkedgridscope\v!global\else - \let\checkedgridmethod\checkedgridscope - \let\checkedgridscope \v!local - \fi - \fi - \fi} - -\permanent\protected\def\applygridmethod#1#2#3% content localsettings (used in head rendering) - {\checkgridmethod{#1}% - \ifx\checkedgridscope\v!global - \ifempty\checkedgridmethod \else - % we assume that the call is grouped because grouping here has the side - % effect that the eventually constructed line will get the value outside - % the group - % - % overkill: \setupgridsnapping[\checkedgridmethod]% - % maybe : \spac_grids_snap_value_auto\checkedgridmethod - \spac_grids_snap_value_set\checkedgridmethod - \fi - \hbox{#3}% - \else - % the extra hbox will trigger the global snapper on top of the local and - % we really need that in this case (compatibility etc etc) so here we don't - % het an already done hit (otherwise we would not snap) - \hbox\bgroup - \ifempty\checkedgridmethod\orelse\ifconditional\headisdisplay - #2% - \fi - \snaptogrid[\checkedgridmethod]\hbox{#3}% - \egroup - \fi} - -\protected\gdef\page_layouts_calculate_overshoot - {\ifgridsnapping\ifcase\layoutlines - \getnoflines\textheight - \textovershoot\dimexpr\noflines\globalbodyfontlineheight-\textheight\relax - \fi\fi} - -\protected\def\page_layouts_report_overshoot - {\page_layouts_calculate_overshoot - \ifdim\textovershoot>\zeropoint - \writestatus\m!layouts{gridmode,\space - noflines: \the\noflines,\space - textheight: \the\textheight,\space - textovershoot: \the\textovershoot\space - (maybe set number of lines instead)% - }% - \fi - \glet\page_layouts_report_overshoot\page_layouts_calculate_overshoot} - -\appendtoks - \page_layouts_report_overshoot -\to \everybeforepagebody - -%D Visualization: - -\definepalet - [grid] - [ one=red, - two=green, - three=blue, - four=gray] - -\permanent\protected\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}}} - -\setnewconstant\gridboxlinenomode\plusone % 0:nothing 1:all 2:lines 3:frame 4:l/r -\setnewconstant\gridboxlinemode \plusone - -\permanent\protected\def\gridboxvbox - {\ifcase\gridboxlinemode - \vpack - \or - \ruledvpack - \or - \vpack - \or - \ruledvpack - \else - \ruledvpack - \fi} - -\permanent\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\linewidth} - -\permanent\protected\def\setgridbox#1#2#3% maybe ifgridsnapping at outer level - {\setbox#1\gridboxvbox to #3 % given size - {\forgetall - \resetvisualizers - \resetteststrut - \offinterlineskip - \hsize#2% - \ifcase\gridboxlinenomode\or\or\or - \gridboxlinenomode\doifoddpageelse\plusone\plustwo % 3: outer - \or - \gridboxlinenomode\doifoddpageelse\plustwo\plusone % 4: inner - \fi - \topskipcorrection - \gridboxvbox % calculated size - {\getrawnoflines{#3}% \getnoflines{#3}% - \scratchdimen\dimexpr#2+\lineheight\relax - \dorecurse\noflines - {\strut - \hskip-.5\lineheight\relax - \ifcase\gridboxlinenomode\or - \rlap - {\hskip\dimexpr.2\bodyfontsize+\scratchdimen\relax - \infofont\hbox to \emwidth{\hss\recurselevel}}% - \or - \llap - {\infofont\hbox to \emwidth{\hss\recurselevel}% - \hskip.2\bodyfontsize}% - \fi - \vrule - \s!height \gridboxwidth - \s!depth \gridboxwidth - \s!width \scratchdimen - \par}} - \vfill}} - -%D This has become obsolete: - -% \def\moveboxontogrid#1#2#3% will become obsolete, but it needs checking -% {} - -%D Helper: - -\protected\def\spac_helpers_assign_skip#1#2% ook nog \v!halfline+fuzzysnap - {\doifelse{#2}\v!line - {#1\ifgridsnapping - \bodyfontlineheight - \else - \openlineheight - \fi} - {\ifgridsnapping - \assigndimension{#2}{#1}{.25\bodyfontlineheight}{.5\bodyfontlineheight}\bodyfontlineheight - \else - \assigndimension{#2}{#1}\smallskipamount\medskipamount\bigskipamount - \fi}% - \relax} - -% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop -% \start \dosetstretch{.5em} effe flink doorfietsen \stop - -% 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 -% 10 == no topskip -% -% penalty: larger wins -% order: larger wins -% category:2,order:5,penalty:10000,skip:value|kw -% -% \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} - -% todo, in grid mode: builders.vspacing.fixed = false -% -% \ifgridsnapping will go - -\installcorenamespace{vspacingamount} - -\permanent\tolerant\protected\def\definevspacingamount[#1]#*[#2]#*[#3]% can be combined - {\ifarguments - %setvalue{\??vspacingamount#1}{\lineheight}% - \or - \setvalue{\??vspacingamount#1}{\lineheight}% - \or - \setvalue{\??vspacingamount#1}{\ifgridsnapping\lineheight\else#2\fi}% - \or - \setvalue{\??vspacingamount#1}{\ifgridsnapping#3\else#2\fi}% - \fi - \clf_vspacingsetamount{#1}} - -\def\spac_vspacing_no_topskip % use grouped - {\c_attr_skipcategory\pluseleven} - -%permanent\def\vspacingfromscratchtoks {\scratchdimen\dimexpr\csname\??vspacingamount\the\scratchtoks\endcsname\relax} -\permanent\def\vspacingpredefinedvalue#1{\scratchskip\glueexpr\csname\??vspacingamount#1\endcsname\relax} -%permanent\def\vspacingfromtempstring {\scratchdimen\dimexpr\csname\??vspacingamount\tempstring\endcsname\relax} - -% \installcorenamespace{vspacingamountnormal} -% \installcorenamespace{vspacingamountgrid} - -% \def\spac_vspacing_define_amount[#1][#2][#3]% can be combined -% {\ifcsname n>#1\endcsname\else -% \expandafter\newtoks\csname n>#1\endcsname -% \expandafter\newtoks\csname g>#1\endcsname -% \fi -% \csname n>#1\endcsname{#2}% -% \csname g>#1\endcsname{#3}% -% \clf_vspacingsetamount{#1}} - -\permanent\tolerant\protected\def\definevspacing[#1]#*[#2]% - {\clf_vspacingdefine{#1}{#2}} - -%D The injector code (generated at the \LUA\ end). This will go away! - -\newtoks\everybeforeblankhandling -\newtoks\everyafterblankhandling - -\newconditional\c_space_vspacing_done -\newconditional\c_space_vspacing_fixed -\newconditional\c_space_ignore_parskip - -\appendtoks - \s_spac_vspacing_temp\zeropoint - \c_attr_skipcategory\plusone - \c_attr_skippenalty \attributeunsetvalue - \c_attr_skiporder \attributeunsetvalue - \ifgridsnapping - \settrue\c_space_vspacing_fixed - \else - \setfalse\c_space_vspacing_fixed - \fi -\to \everybeforeblankhandling - -\appendtoks - \s_spac_vspacing_temp\plusone\s_spac_vspacing_temp - \ifconditional\c_space_vspacing_fixed \else - \s!plus \skipgluefactor\s_spac_vspacing_temp - \s!minus\skipgluefactor\s_spac_vspacing_temp - \fi - \relax -\to \everyafterblankhandling - -% The main spacer: - -% \protected\def\vspacing -% {\doifelsenextoptionalcs\spac_vspacing_yes\spac_vspacing_nop} - -\tolerant\protected\def\vspacing[#1]% - {\ifarguments - \spac_vspacing_yes[\currentvspacing]% in the new mechanism no [] needed - \else - \spac_vspacing_yes[#1]% in the new mechanism no [] needed - \fi} - -\def\spac_vspacing_yes - {\ifinpagebody % somewhat weird - \expandafter\spac_vspacing_yes_indeed - \orelse\ifconditional\c_spac_packed_blank - \expandafter\spac_vspacing_yes_indeed - \else - \expandafter\spac_vspacing_yes_ignore - \fi} - -\def\spac_vspacing_nop - {\ifinpagebody % somewhat weird - \expandafter\spac_vspacing_nop_indeed - \orelse\ifconditional\c_spac_packed_blank - \expandafter\spac_vspacing_nop_indeed - \else - \expandafter\spac_vspacing_nop_ignore - \fi} - -\def\spac_vspacing_yes_indeed[#1]{\ifmmode\else\par\ifvmode\clf_injectvspacing\ifgridsnapping\plusone\else\zerocount\fi{#1}\fi\fi} -\def\spac_vspacing_nop_indeed {\ifmmode\else\par\ifvmode\clf_injectvspacing\ifgridsnapping\plusone\else\zerocount\fi{\currentvspacing}\fi\fi} - -\def\spac_vspacing_yes_ignore[#1]{\ifmmode\else\par\fi} -\def\spac_vspacing_nop_ignore {\ifmmode\else\par\fi} - -\installcorenamespace{vspacing} - -\permanent\protected\def\directvspacing#1% - {\ifmmode\else\par\ifvmode\clf_injectvspacing\ifgridsnapping\plusone\else\zerocount\fi{\iftok{#1}\emptytoks\currentvspacing\else#1\fi}\fi\fi} - -\def\spac_vspacing_dim_preset#1% - {\ifcsname\??vspacing#1\endcsname - \lastnamedcs - \else - \spac_vspacing_yes_preset{#1}% - \fi} - -\def\spac_vspacing_yes_preset#1% - {\setxvalue{\??vspacing#1}{\clf_vspacing{#1}}% - %\writestatus{}{}% - %\writestatus{#1}{\expandafter\meaning\csname\??vspacing#1\endcsname}% - %\writestatus{}{}% - \csname\??vspacing#1\endcsname} - -\permanent\protected\def\directdefaultvspacing - {\ifinpagebody % somewhat weird - \directvspacing\currentvspacing - \orelse\ifconditional\c_spac_packed_blank - \directvspacing\currentvspacing - \fi} - -\permanent\protected\def\directcheckedvspacing - {\ifinpagebody % somewhat weird - \expandafter\directvspacing - \orelse\ifconditional\c_spac_packed_blank - \expandafter\directvspacing - \else - \expandafter\gobbleoneargument - \fi} - -\permanent\protected\def\useblankparameter#1% faster local variant - {\edef\m_spac_blank_asked{#1\c!blank}% - \ifempty\m_spac_blank_asked\else - \directvspacing\m_spac_blank_asked - \fi} - -%D Handy (and faster): - -\permanent\protected\def\directvpenalty#1{\ifmmode\else\par\ifvmode\clf_injectvpenalty#1\relax\fi\fi} -\permanent\protected\def\directvskip #1{\ifmmode\else\par\ifvmode\clf_injectvskip #1\relax\fi\fi} - -%D These depend on bigskipamount cum suis so we'd better sync them: - -\mutable\let\currentvspacing\s!default % hm, default, standard ... - -\permanent\tolerant\protected\def\setupvspacing[#1]% - {\ifarguments\else - \edef\currentvspacing{#1}% - \fi - \synchronizevspacing} - -\permanent\protected\def\synchronizevspacing - {\ifempty\currentvspacing % mistakenly had an \else - \let\currentvspacing\s!default - \fi - \spac_whitespace_setup_nop} - -\permanent\protected\def\restorestandardblank % or default ? - {\let\currentvspacing\v!standard} - -%D The \type {category:4} is default. - -\definevspacingamount[\v!none] [\zeropoint] [\zeropoint] -\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight] -\definevspacingamount[\v!medium] [\medskipamount] [.5\bodyfontlineheight] -\definevspacingamount[\v!small] [\smallskipamount] [.25\bodyfontlineheight] -\definevspacingamount[\v!line] [\openlineheight] [\bodyfontlineheight] -\definevspacingamount[\v!halfline] [.5\openlineheight] [.5\bodyfontlineheight] -\definevspacingamount[\v!quarterline] [.25\openlineheight] [.25\bodyfontlineheight] -\definevspacingamount[\v!formula] [\medskipamount] [.5\bodyfontlineheight] -\definevspacingamount[\v!white] [\parskip] [\bodyfontwhitespace] -\definevspacingamount[\v!height] [\strutht] [\bodyfontstrutheight] -\definevspacingamount[\v!depth] [\strutdp] [\bodyfontstrutdepth] - -\definevspacingamount[\v!standard] [.75\openlineheight] [.75\openlineheight] % mkii compatible - -\permanent\def\bodyfontwhitespace - {\dimexpr - \ifzeropt\parskip - \zeropoint - \orelse\ifgridsnapping - \bodyfontlineheight - \else - \parskip - \fi - \relax} - -%D used in itemize \unknown\ always test this: - -\newdimen\d_spac_overlay - -\def\spac_overlay_lines - {\directcheckedvspacing{\v!back,\v!overlay}% \blank[\v!back,\v!overlay]% - \nointerlineskip} - -% \startitemize[n] -% \item \input zapf -% \item \startitemize[a] -% \item \input knuth -% \stopitemize -% \stopitemize -% -% \strut \hfill first line \blank[overlay] second line \hfill \strut -% -% \ruledvbox { -% \strut \hfill line 1 \blank[overlay] -% line 2 \hfill \strut \blank[overlay] -% \strut \hfill line 3 \hfill \strut -% } -% -% \dorecurse{50} -% {\startitemize[n] \startitem \startitemize[a] \item #1 \stopitemize \stopitem \stopitemize} - -\definevspacing[\v!preference][penalty:-500] % goodbreak -\definevspacing[\v!samepage] [penalty:10000] % nobreak - -\definevspacing[\v!always] [category:0] % hm, internally it's discard -\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!packed] [category:8] % noparskip (kind of special) -\definevspacing[\v!overlay] [category:9] -\definevspacing[\v!enable] [category:10] - -%definevspacing[\v!noparskip] [category:8] -%definevspacing[\v!notopskip] [category:11] - -\definevspacing[\v!weak] [order:0] -\definevspacing[\v!strong] [order:100] - -\definevspacing[\s!default] [\v!white] % was big for a while - -\newcount\c_spac_vspacing_special_base \c_spac_vspacing_special_base = 32250 % 4000 -\newcount\c_spac_vspacing_special_step \c_spac_vspacing_special_step = 10 % 250 -\newcount\c_spac_vspacing_special_done - -% 2019-05-31 : upgraded a bit to more distinctive samepage-[level]-[0|1|2] names - -\protected\def\spac_vspacing_define_same_step#1#2% alternatively we could have samepage-n-m - {\begingroup - \scratchcounterone\numexpr\plusthree*#1+#2\relax - \scratchcountertwo\numexpr\c_spac_vspacing_special_base+\c_spac_vspacing_special_step*\scratchcounterone\relax - %\writestatus{defined}{\v!samepage-\number#1-\number#2\space=>\space penalty:\the\scratchcountertwo}% - \normalexpanded{\definevspacing[\v!samepage-\number#1-\number#2][penalty:\the\scratchcountertwo]}% - \endgroup} - -\protected\def\spac_vspacing_define_same_page#1% - {\dostepwiserecurse\c_spac_vspacing_special_done{#1}\plusone - {\spac_vspacing_define_same_step\recurselevel\zerocount % before - \spac_vspacing_define_same_step\recurselevel\plusone % after - \spac_vspacing_define_same_step\recurselevel\plustwo}% % whatever - \global\c_spac_vspacing_special_done#1\relax} - -\spac_vspacing_define_same_page{12} % 12 levels should be more than enough as a start - -\def\spac_vspacing_same_page#1#2% level offset (starts at 0) - {\ifnum#1>\c_spac_vspacing_special_done - \spac_vspacing_define_same_page{#1}% - \fi - %\writestatus{used}{\v!samepage-\number#1-\number#2}% - \vspacing[\v!samepage-\number#1-\number#2]} - -\definevspacing[\v!default] [\v!big] % todo: needs to adapt to \setupblank -\definevspacing[\v!before] [\v!default] % but we need to avoid circular references -\definevspacing[\v!inbetween][\v!default] % then -\definevspacing[\v!after] [\v!before] - -\setupvspacing - [\v!big] % alternatively [\v!standard] - -%D Maybe at some point we will differ between \type {\vspacing} and \type {\blank} -%D (we needed the first one while playing with the new code). - -% We keep this one as reference -% -% \protected\def\inhibitblank -% {\vspacing[\v!disable]} -% -% but use the following more efficient variant instead: - -\permanent\protected\def\inhibitblank{\ifmmode\else\par\ifvmode\clf_injectdisable\fi\fi} - -\let\doinhibitblank\inhibitblank % keep this command, used in styles - -\let\defineblank \definevspacing -\let\setupblank \setupvspacing -\let\blank \vspacing -\let\synchronizeblank \synchronizevspacing -\let\defineblankmethod\definevspacingamount - -%D The following command is for Wolfgang. It has to be used with care as it does -%D {\em not} work in tandem with the other spacing commands. - -\installcorenamespace{vspace} - -\permanent\tolerant\protected\def\definevspace[#1]#*[#2]#*[#3]% - {\ifarguments - \or - \letvalue{\??vspace:#1}\empty % or undefined? - \or - \setvalue{\??vspace:#1}{#2}% - \or - \setvalue{\??vspace#1:#2}{#3}% - \fi} - -\letvalue{\??vspace:\s!unknown}\zeropoint - -\def\spac_vspace_unknown - {\csname\??vspace:\s!unknown\endcsname} - -\permanent\tolerant\protected\def\vspace[#1]#*[#2]% - {\par - \ifvmode - \removelastskip - \vskip - \ifparameter#2\or - \ifcsname\??vspace#1:#2\endcsname - \lastnamedcs - \orelse\ifcsname\??vspace:#2\endcsname - \lastnamedcs - \else - \spac_vspace_unknown - \fi - \orelse\ifparameter#1\or - \ifcsname\??vspace:#1\endcsname - \lastnamedcs - \else - \spac_vspace_unknown - \fi - \else - \ifcsname\??vspace:\s!default\endcsname - \lastnamedcs - \else - \spac_vspace_unknown - \fi - \fi - \relax - \fi} - -%D Some preliminary code: a simple and fast hanger, for usage in macros. - -\installcorenamespace {hanging} - -\installdirectcommandhandler \??hanging {hanging} - -\setuphanging - [\c!distance=.5\emwidth, - \c!location=\v!left, - \c!n=\zerocount] - -\let\m_spac_hanging_location\empty - -\permanent\tolerant\protected\def\starthanging[#1]% - {\dontleavehmode\bgroup - \ifhastok={#1}% - \let\m_spac_hanging_location\empty - \setupcurrenthanging[#1]% - \else - \edef\m_spac_hanging_location{#1}% - \fi - \ifempty\m_spac_hanging_location - \edef\m_spac_hanging_location{\directhangingparameter\c!location}% - \fi - \dowithnextboxcs\spac_hanging_finish\hbox} - -\permanent\protected\def\stophanging - {\endgraf - \egroup} - -\def\spac_hanging_finish - {\scratchdistance\directhangingparameter\c!distance\relax - \ifdim\ht\nextbox>\strutht - \setbox\nextbox\tbox{\box\nextbox}% - \fi - \scratchcounter\directhangingparameter\c!n\relax - \ifnum\scratchcounter>\zerocount - \frozen\hangafter-\scratchcounter - \else - \getboxheight\scratchdimen\of\box\nextbox - \getnoflines\scratchdimen - \frozen\hangafter-\noflines - \fi - \ht\nextbox\strutht - \dp\nextbox\strutdp - \scratchwidth\dimexpr\wd\nextbox+\scratchdistance\relax - \ifx\m_spac_hanging_location\v!right - \frozen\hangindent\ifconditional\displaylefttoright-\fi\scratchwidth - \rlap{\hskip\dimexpr\hsize-\leftskip-\wd\nextbox\relax\box\nextbox}% \leftskip is new - \else - \frozen\hangindent\ifconditional\displaylefttoright\else-\fi\scratchwidth - \llap{\box\nextbox\hskip\scratchdistance}% - \fi - \ignorespaces} - -%D \macros -%D {startfixed} -%D -%D \starttyping -%D \startitemize -%D \startitem \externalfigure[cow][height=1cm] \stopitem -%D \startitem \externalfigure[cow][height=1cm] \stopitem -%D -%D \startitem \startfixed \externalfigure[cow][height=1cm]\stopfixed \stopitem -%D \startitem \startfixed[high]\externalfigure[cow][height=1cm]\stopfixed \stopitem -%D \startitem \startfixed[low] \externalfigure[cow][height=1cm]\stopfixed \stopitem -%D \startitem \startfixed[lohi]\externalfigure[cow][height=1cm]\stopfixed \stopitem -%D -%D \startitem test \par \startfixed \externalfigure[koe][height=1cm]\stopfixed \stopitem -%D \startitem test \par \startfixed[high]\externalfigure[koe][height=1cm]\stopfixed \stopitem -%D \startitem test \par \startfixed[low] \externalfigure[koe][height=1cm]\stopfixed \stopitem -%D \startitem test \par \startfixed[lohi]\externalfigure[koe][height=1cm]\stopfixed \stopitem -%D \stopitemize -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -\installcorenamespace{fixedalternatives} - -\let\stopfixed\relax - -\permanent\protected\def\startfixed - {\bgroup - \ifhmode - \expandafter\typo_fixed_start_h - \else - \expandafter\typo_fixed_start_v - \fi} - -\tolerant\def\typo_fixed_start_h[#1]% - {\enforced\let\stopfixed\typo_fixed_stop_h - \dowithnextbox{\typo_fixed_finish{#1}}% - \vbox\bgroup - %ignorespaces - \setlocalhsize} - -\protected\def\typo_fixed_stop_h - {%removeunwantedspaces - \egroup - \egroup} - -\tolerant\def\typo_fixed_start_v[#1]% - {\enforced\let\stopfixed\typo_fixed_stop_v - \startbaselinecorrection} - -\protected\def\typo_fixed_stop_v - {\stopbaselinecorrection - \egroup} - -\letvalue{\??fixedalternatives \v!high}\bbox -\letvalue{\??fixedalternatives \v!low}\tbox -\letvalue{\??fixedalternatives \v!middle}\vcenter -\letvalue{\??fixedalternatives \v!lohi}\vcenter -\letvalue{\??fixedalternatives\s!unknown}\tbox -\letvalue{\??fixedalternatives\s!default}\tbox - -\protected\def\typo_fixed_finish#1% - {\expandnamespacevalue\??fixedalternatives{#1}\s!default{\box\nextbox}} - -% %D Forgotten already: -% -% \def\shapefill{\vskip\zeropoint\s!plus\lineheight\s!minus\lineheight\relax} - -%D Nasty: - -% \writestatus{1}{\the\prevdepth} \blank[force,5*big] { \writestatus{1}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page -% \writestatus{2}{\the\prevdepth} \blank[force,5*big] { \writestatus{2}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page -% \writestatus{3}{\the\prevdepth} \blank[force,5*big] { \writestatus{3}{\the\prevdepth} \baselineskip5cm xxxxxxxxx \par } \page -% \writestatus{4}{\the\prevdepth} \input tufte \page -% \writestatus{5}{\the\prevdepth} \input tufte \page -% \writestatus{6}{\the\prevdepth} \blank[force,5*big] { \writestatus{6}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page - -% \writestatus{1}{\the\prevdepth} \null\vskip4cm { \writestatus{1}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page -% \writestatus{2}{\the\prevdepth} \null\vskip4cm { \writestatus{2}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page -% \writestatus{3}{\the\prevdepth} \null\vskip4cm { \writestatus{3}{\the\prevdepth} \baselineskip5cm xxxxxxxxx \par } \page -% \writestatus{4}{\the\prevdepth} \input tufte \page -% \writestatus{5}{\the\prevdepth} \input tufte \page -% \writestatus{6}{\the\prevdepth} \null\vskip4cm { \writestatus{6}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page - -\appendtoks - \ifvmode\prevdepth\zeropoint\fi % consistent, else first page -1000pt .. needed for fixed,3*big first/successive pages consistency -\to \everystarttext - -\prevdepth\zeropoint - -%D Helper: - -\permanent\protected\def\checkedblank[#1]% - {\edef\p_blank{#1}% - \ifempty\p_blank - % ignore - \orelse\ifx\p_blank\v!none - % ignore - \else - \blank[\p_blank]% - \fi} - -% \setupwhitespace[line] -% \prerollblank[2*line] \the\prerolledblank -% \prerollblank[-2*line] \the\prerolledblank - -\newskip\prerolledblank - -\permanent\protected\def\prerollblank[#1]% - {\begingroup - \edef\p_blank{#1}% - \ifempty\p_blank - \global\prerolledblank\zeropoint - \orelse\ifx\p_blank\v!none - \global\prerolledblank\zeropoint - \else - % don't mess with \arskip here! - \scratchskip\plusten\lineheight - \setbox\scratchbox\vbox - {\vskip\scratchskip - \kern\zeropoint - \blank[\p_blank]}% - % \dimexpr doesn't work well with skips - \advance\scratchskip-\ht\scratchbox - \global\prerolledblank-\scratchskip - \fi - \endgroup} - -\newcount\c_spac_vspacing_ignore_parskip - -% \setupwhitespace[line] -% \setuphead[subject][after={\blank[packed]},style=\bfb] -% \subject{foo} -% test \par -% test \par -% \blank[packed] % \ignoreparskip -% test \par -% test \par -% \ignoreparskip -% test \par -% test \par -% \setuphead[subject][after={\blank[nowhite]},style=\bfb] -% \subject{foo} -% test \par -% test \par - -\protected\def\ignoreparskip{\c_spac_vspacing_ignore_parskip\plusone} - -\protect \endinput |