summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/spac-hor.mkiv
diff options
context:
space:
mode:
authorMojca Miklavec <mojca.miklavec@gmail.com>2012-05-14 17:38:55 +0000
committerMojca Miklavec <mojca.miklavec@gmail.com>2012-05-14 17:38:55 +0000
commit15995e10bfc68edf79970c4ea4fbb6678566c46e (patch)
tree2de7ca2a83f2d37ef043ad7429a5cb945bb79ddb /Master/texmf-dist/tex/context/base/spac-hor.mkiv
parentc9a39f716f1e5ec820ed3aab2c9aef25c5a9d730 (diff)
ConTeXt 2012.05.14 16:00
git-svn-id: svn://tug.org/texlive/trunk@26371 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/spac-hor.mkiv')
-rw-r--r--Master/texmf-dist/tex/context/base/spac-hor.mkiv876
1 files changed, 447 insertions, 429 deletions
diff --git a/Master/texmf-dist/tex/context/base/spac-hor.mkiv b/Master/texmf-dist/tex/context/base/spac-hor.mkiv
index 39edaa2ff00..eeb5cadfd5b 100644
--- a/Master/texmf-dist/tex/context/base/spac-hor.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-hor.mkiv
@@ -5,7 +5,7 @@
%D subtitle=Horizontal,
%D author=Hans Hagen,
%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
@@ -17,152 +17,176 @@
\registerctxluafile{spac-hor}{1.001}
-\let\currentindentation\empty % amount/keyword
-\let\currentindenting \empty % method
+\let\v_spac_indentation_current\empty % amount/keyword
-\newdimen \ctxparindent
-\parindent\ctxparindent % for the show
+\newdimen \d_spac_indentation_par
+\parindent\d_spac_indentation_par % for the show
-\newif\ifindentfirstparagraph \indentfirstparagraphtrue
-
-\newconstant\indentingtogglestate
+\newconditional\c_spac_indentation_indent_first \settrue\c_spac_indentation_indent_first
+\newconstant \c_spac_indentation_toggle_state
%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}}
+\unexpanded\def\presetindentation
+ {\doifoutervmode{\ifconditional\c_spac_indentation_indent_first\else\spac_indentation_variant_no\fi}}
-% 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
+\unexpanded\def\setupindenting
+ {\doifnextoptionalelse\spac_indentation_setup_options\spac_indentation_setup_size}
-\def\checkeverypar % currently a hack
- {\ifzeropt\parindent\else
- \doifsometokselse\everypar\donothing\docheckupcomingindentation
- \fi}
+\def\spac_indentation_setup_size
+ {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}}
-\def\docheckupcomingindentation
- {\appendtoks\checkindentation\to\everypar}
+\let\synchronizeindenting\spac_indentation_setup_size
-\definecomplexorsimple\setupindenting
+\let\m_spac_indentation_options\empty
-\def\complexsetupindenting[#1]%
- {\edef\currentindenting{#1}%
- \ifx\currentindenting\empty \else
- \doapplycurrentindenting
+\def\spac_indentation_setup_options[#1]%
+ {\edef\m_spac_indentation_options{#1}% comma separated list
+ \ifx\m_spac_indentation_options\empty \else
+ \spac_indentation_setup_indeed
\fi}
-\def\doapplycurrentindenting
- {% not here: \indentfirstparagraphtrue
- % not here: \parindent\ctxparindent
- % not here: \indentingtogglestate\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%
- {\ifcsname\??in:#1\endcsname
- % case b
+\def\spac_indentation_setup_indeed
+ {% not here: \settrue\c_spac_indentation_indent_first
+ % not here: \parindent\d_spac_indentation_par
+ % not here: \c_spac_indentation_toggle_state\zerocount
+ \processcommacommand[\m_spac_indentation_options]\spac_indentation_apply_step_one % catch small, medium, etc
+ \processcommacommand[\m_spac_indentation_options]\spac_indentation_apply_step_two % catch rest
+ \ifzeropt\parindent\else
+ \doifemptytoks\everypar\spac_indentation_set_everypar
+ \fi
+ \ifconditional\c_spac_indentation_indent_first\else
+ \spac_indentation_variant_no
+ \fi
+ \spac_indentation_check_toggle}
+
+\def\spac_indentation_set_everypar
+ {\everypar{\checkindentation}}
+
+\def\spac_indentation_apply_step_one#1%
+ {\ifcsname\??indentingmethod#1\endcsname
+ % case two
\else
- \edef\currentindentation{#1}%
- \let\normalindentation\currentindentation
- \simplesetupindenting
+ \edef\v_spac_indentation_current{#1}% single entry in list
+ \let\normalindentation\v_spac_indentation_current
+ \spac_indentation_setup_size
\fi}
-\def\docomplexsetupindentingB#1%
- {\ifcsname\??in:#1\endcsname
- \csname\??in:#1\endcsname
+\def\spac_indentation_apply_step_two#1%
+ {\ifcsname\??indentingmethod#1\endcsname
+ \csname\??indentingmethod#1\endcsname
\else
- % case a
+ % case one
\fi}
-\def\simplesetupindenting % empty case, a it strange, needed this way?
- {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}}
-
-\def\indenting % kind of obsolete
- {\dosingleargument\complexsetupindenting}
+\unexpanded\def\indenting % kind of obsolete
+ {\doifnextoptionalelse\spac_indentation_setup_options\relax}
% use \noindentation to suppress next indentation
-\unexpanded\def\defineindentingmethod[#1]#2%
- {\setvalue{\??in:#1}{#2}}
+\installcorenamespace{indentingmethod}
-\defineindentingmethod [\v!no] {\parindent\zeropoint}% was: \ctxparindent\noindent}
-\defineindentingmethod [\v!not] {\parindent\zeropoint}% was: \ctxparindent\noindent}
+\unexpanded\def\installindentingmethod#1#2%
+ {\setvalue{\??indentingmethod#1}{#2}}
-\defineindentingmethod [\v!first] {\indentfirstparagraphtrue}
-\defineindentingmethod [\v!next] {\indentfirstparagraphfalse}
+\installindentingmethod \v!no {\parindent\zeropoint}
+\installindentingmethod \v!not {\parindent\zeropoint}
-\defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent !
-\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent !
+\installindentingmethod \v!first {\settrue\c_spac_indentation_indent_first}
+\installindentingmethod \v!next {\setfalse\c_spac_indentation_indent_first}
-\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent !
- \indentingtogglestate\zerocount}
+\installindentingmethod \v!yes {\parindent\d_spac_indentation_par\relax} % not \indent !
+\installindentingmethod \v!always{\parindent\d_spac_indentation_par\relax} % not \indent !
-\defineindentingmethod [\v!odd] {\indentingtogglestate\plusone}
-\defineindentingmethod [\v!even] {\indentingtogglestate\plustwo}
+\installindentingmethod \v!never {\parindent\zeropoint\relax % no \indent !
+ \c_spac_indentation_toggle_state\zerocount}
-\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else
- \let\currentindentation\normalindentation
- \simplesetupindenting
- \fi}
+\installindentingmethod \v!odd {\c_spac_indentation_toggle_state\plusone}
+\installindentingmethod \v!even {\c_spac_indentation_toggle_state\plustwo}
-\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue
- \parindent\zeropoint
- \indentingtogglestate\zerocount}
+\installindentingmethod \v!normal{\ifx\normalindentation\empty\else
+ \let\v_spac_indentation_current\normalindentation
+ \simplesetupindenting
+ \fi}
-\def\noindenting{\indenting[\v!no, \v!next ]}
-\def\doindenting{\indenting[\v!yes,\v!first]}
+\installindentingmethod \v!reset {\settrue\c_spac_indentation_indent_first
+ \parindent\zeropoint
+ \c_spac_indentation_toggle_state\zerocount}
-%D This one sets up the local indentation behaviour (i.e. either or not
-%D a next paragraph will be indented).
+\installindentingmethod \v!toggle{\parindent\ifdim\parindent=\zeropoint
+ \d_spac_indentation_par
+ \else
+ \zeropoint
+ \fi\relax}
-\def\dochecknextindentation#1% internal one
- {\checknextindentation[\csname#1\c!indentnext\endcsname]}
+\unexpanded\def\noindenting{\indenting[\v!no, \v!next ]}
+\unexpanded\def\doindenting{\indenting[\v!yes,\v!first]}
-\setvalue{\??in->\s!empty}{}
-\setvalue{\??in->\v!yes }{\doindentation}
-\setvalue{\??in->\v!no }{\noindentation}
-\setvalue{\??in->\v!auto }{\autoindentation}
+%D Here come the handlers (still rather messy ... we need states).
-\unexpanded\def\checknextindentation[#1]%
- {\csname\??in->\ifcsname\??in->#1\endcsname#1\else\s!empty\fi\endcsname}
+\newif\ifindentation \indentationtrue % will become a mode
+
+\let\checkindentation\relax
+
+\def\spac_indentation_remove
+ {\ifdim\parindent=\zeropoint \else
+ \begingroup
+ \setbox\scratchbox\lastbox
+ \endgroup
+ \fi}
-%D Here come the handlers.
+\def\spac_indentation_kill_indeed
+ {\global\indentationfalse
+ \spac_indentation_remove}
-\newif\ifindentation \indentationtrue % documenteren, naar buiten
+\def\spac_indentation_do_toggle_indeed
+ {\global\indentationfalse
+ \global\let\checkindentation\spac_indentation_no_toggle_indeed
+ \spac_indentation_remove}
-\let\checkindentation\relax
+\def\spac_indentation_no_toggle_indeed
+ {\global\indentationtrue
+ \global\let\checkindentation\spac_indentation_do_toggle_indeed}
+
+\def\spac_indentation_do_indeed
+ {\global\indentationtrue}
-\ifx\autoindentation\undefined \let\autoindentation\relax \fi % hook
+\def\spac_indentation_do_toggle
+ {\global\let\checkindentation\spac_indentation_do_toggle_indeed}
-\def\doindentation
- {\gdef\checkindentation{\global\indentationtrue}}
+\def\spac_indentation_no_toggle
+ {\global\let\checkindentation\spac_indentation_no_toggle_indeed}
-\def\noindentation % made global
+\def\spac_indentation_check_toggle
+ {\ifcase\c_spac_indentation_toggle_state
+ % nothing
+ \or
+ \spac_indentation_no_toggle
+ \or
+ \spac_indentation_do_toggle
+ \fi}
+
+\def\spac_indentation_variant_yes
+ {\global\let\checkindentation\spac_indentation_do_indeed}
+
+\def\spac_indentation_no_next_check
+ {\spac_indentation_remove
+ \global\let\checkindentation\spac_indentation_do_indeed}
+
+\def\spac_indentation_variant_no % made global
{\ifinpagebody \else
\global\indentationfalse
- \gdef\checkindentation
- {\donoindentation
- \gdef\checkindentation{\global\indentationtrue}}%
+ \global\let\checkindentation\spac_indentation_no_next_check
\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
+ \global\let\checkindentation\spac_indentation_do_indeed
\fi}
-\def\indentation
+\def\spac_indentation_variant_force
{\ifvmode \ifdim\parindent=\zeropoint \else
% was : \hskip\parindent
% can be: \indent
@@ -170,52 +194,52 @@
\noindent\hskip\parindent
\fi \fi}
-\def\toggleindentation % does not play well with noindentation
- {\ifcase\indentingtogglestate
- % 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
+ \pushmacro\checkindentation
+ \pushmacro\ifindentation
\to \everypushsomestate
\appendtoks
- \popmacro\ifindentation
- \popmacro\checkindentation
+ \popmacro\ifindentation
+ \popmacro\checkindentation
\to \everypopsomestate
-
-% This is a user requested hack (using the auto-hook).
-\newconditional\recheckindentationmode
+% public:
-\def\dontrechecknextindentation
- {\global\setfalse\recheckindentationmode}
+\let\indentation \spac_indentation_variant_force
+\let\noindentation\spac_indentation_variant_no % public
+\let\doindentation\spac_indentation_variant_yes % public
-\def\dorechecknextindentation
- {\ifconditional\recheckindentationmode
- \dontrechecknextindentation
- \expandafter\doautoindentation
- \fi}
+\def\dontrechecknextindentation % public (in macros)
+ {\global\let\dorechecknextindentation\relax}
+
+\let\dorechecknextindentation\relax % public (in macros)
+
+\def\spac_indentation_check_next_indentation
+ {\global\let\dorechecknextindentation\relax
+ \doifnextcharelse\par\donothing\spac_indentation_variant_no} % messy check as next is seldom \par
+
+\def\spac_indentation_variant_auto
+ {\global\let\dorechecknextindentation\spac_indentation_check_next_indentation}
-\def\doautoindentation
- {\doifnextcharelse\par\donothing\noindentation}
+%D This one sets up the local indentation behaviour (i.e. either or not
+%D a next paragraph will be indented).
+
+\installcorenamespace{indentnext}
+
+\unexpanded\def\checknextindentation[#1]%
+ {\csname\??indentnext\ifcsname\??indentnext#1\endcsname#1\fi\endcsname}
+
+\unexpanded\def\useindentnextparameter#1% new, the more efficient variant
+ {\edef\p_indentnext{#1\c!indentnext}%
+ \ifx\p_indentnext\empty\else
+ \csname\??indentnext\ifcsname\??indentnext\p_indentnext\endcsname\p_indentnext\fi\endcsname
+ \fi}
-\def\autoindentation
- {\global\settrue\recheckindentationmode}
+\letvalue{\??indentnext }\donothing
+\letvalue{\??indentnext\v!yes }\spac_indentation_variant_yes
+\letvalue{\??indentnext\v!no }\spac_indentation_variant_no
+\letvalue{\??indentnext\v!auto}\spac_indentation_variant_auto
%D An example of usage:
%D
@@ -254,7 +278,17 @@
%D \input tufte \startformula a = b \stopformula
%D \stoptyping
-\def\softbreak
+% maybe an everyforgetparindent
+
+\unexpanded\def\forgetparindent
+ {\settrue\c_spac_indentation_indent_first % recently added
+ \d_spac_indentation_par\zeropoint
+ \parindent\zeropoint
+ \let\v_spac_indentation_current\v!none}
+
+%D Helper:
+
+\unexpanded\def\softbreak
{\relax\ifhmode\hskip\parfillskip\break\fi}
%D \macros
@@ -266,40 +300,46 @@
%D Hm ... todo:
-\sfcode`\)=0
-\sfcode`\'=0
-\sfcode`\]=0
+\installcorenamespace{spacecodemethod}
-\def\setfrenchspacing#1%
- {\sfcode`\.#1 \sfcode`\,#1\relax
- \sfcode`\?#1 \sfcode`\!#1\relax
- \sfcode`\:#1 \sfcode`\;#1\relax}
+\sfcode`\)=\zerocount
+\sfcode`\'=\zerocount
+\sfcode`\]=\zerocount
-\def\frenchspacing
- {\setfrenchspacing{1000}}
+\def\spac_spacecodes_set_fixed#1%
+ {\sfcode`\.#1\relax \sfcode`\,#1\relax
+ \sfcode`\?#1\relax \sfcode`\!#1\relax
+ \sfcode`\:#1\relax \sfcode`\;#1\relax}
-\def\resetfrenchspacing
+\def\spac_spacecodes_set_stretch
{\sfcode`\.3000 \sfcode`\,1250
\sfcode`\?3000 \sfcode`\!3000
\sfcode`\:2000 \sfcode`\;1500 }
-\def\frenchspacing {\setfrenchspacing{1000}}
-\def\newfrenchspacing{\setfrenchspacing{1050}}
-\def\nonfrenchspacing{\resetfrenchspacing}
+\unexpanded\def\frenchspacing {\spac_spacecodes_set_fixed\plusthousand}
+\unexpanded\def\newfrenchspacing{\spac_spacecodes_set_fixed{1050}}
+\unexpanded\def\nonfrenchspacing{\spac_spacecodes_set_stretch}
-\unexpanded\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}}
+\unexpanded\def\installspacingmethod#1#2{\setvalue{\??spacecodemethod#1}{#2}}
-\definespacingmethod[\v!packed]{\newfrenchspacing}
-\definespacingmethod[\v!broad ]{\nonfrenchspacing}
+\installspacingmethod \empty {} % keep values
+\installspacingmethod \v!fixed {\frenchspacing } % equal spaces everywhere
+\installspacingmethod \v!packed {\newfrenchspacing} % slighly more after punctuation
+\installspacingmethod \v!broad {\nonfrenchspacing} % more depending on what punctuation
-\def\complexsetupspacing[#1]%
- {\executeifdefined{\??sg\??sg#1}\relax
- \updateraggedskips}
+\unexpanded\def\setupspacing
+ {\doifnextoptionalelse\spac_spacecodes_setup_yes\spac_spacecodes_setup_nop}
-\def\simplesetupspacing
- {\updateraggedskips}
+\def\spac_spacecodes_setup_yes[#1]%
+ {\csname\??spacecodemethod#1\endcsname
+ \updateraggedskips} % not needed, as sf codes are static
-\definecomplexorsimple\setupspacing
+\def\spac_spacecodes_setup_nop
+ {\updateraggedskips} % not needed, as sf codes are static
+
+% This is not needed, as \updateraggedskips is taking care of it:
+
+\let\synchronizespacecodes\spac_spacecodes_setup_nop % \relax
% \dorecurse{100}{\recurselevel\spacefactor 800 \space} \par
% \dorecurse{100}{\recurselevel\spacefactor1200 \space} \par
@@ -341,14 +381,14 @@
\letcatcodecommand \ctxcatcodes \tildeasciicode \nonbreakablespace % overloaded later
-\def\space { }
-\def\removelastspace{\ifhmode\unskip\fi}
-\def\nospace {\removelastspace\ignorespaces}
+ \def\space { }
+\unexpanded\def\removelastspace{\ifhmode\unskip\fi}
+\unexpanded\def\nospace {\removelastspace\ignorespaces}
\ifdefined\softhyphen \else \let\softhyphen\- \fi
-\ctxsprint{"\string\\unexpanded\string\\def\string\\\string\n{\string\\space}"}
-%ctxsprint{"\string\\let\string\\\string\n=\string\\space"}
+\cldcontext{"\string\\unexpanded\string\\def\string\\\string\n{\string\\space}"}
+%cldcontext{"\string\\let\string\\\string\n=\string\\space"}
% in tables we need:
%
@@ -357,27 +397,27 @@
% but, since not all fonts have .5em digits:
\unexpanded\def\fixedspace
- {\setbox\scratchbox\normalhbox{\mathortext{0}{0}}%
+ {\setbox\scratchbox\hbox{\mathortext{0}{0}}%
\hskip\wd\scratchbox\relax}
-\def\fixedspaces
+\unexpanded\def\fixedspaces
{\letcatcodecommand \ctxcatcodes \tildeasciicode \fixedspace}
\appendtoks
- \let~\space
- \let\ \space
-\to\simplifiedcommands
+ \let~\space
+ \let\ \space
+\to \simplifiedcommands
\unexpanded\def\removeunwantedspaces
{\ifhmode
- \expandafter \doremoveunwantedspace
+ \expandafter \spac_helpers_remove_unwantedspace
\fi}
-\def\doremoveunwantedspace
- {\ifnum\lastnodetype=\@@gluenode
- \unskip \expandafter\doremoveunwantedspace
+\def\spac_helpers_remove_unwantedspace
+ {\ifnum\lastnodetype=\gluenodecode
+ \unskip \expandafter\spac_helpers_remove_unwantedspace
\fi}
-
+
% \startbuffer
% \startlines \tt \fixedspaces
% 0~1~~2~~~3~~~~4~~~~~5
@@ -402,7 +442,7 @@
%D A couple of plain macros:
-\ifx\thinspace\undefined
+\ifdefined\thinspace \else
\def\thinspace {\kern .16667\emwidth}
\def\negthinspace{\kern-.16667\emwidth}
@@ -410,7 +450,7 @@
\fi
-\ifx\quad\undefined
+\ifdefined\quad \else
\def\enskip{\hskip.5\emwidth}
\def\quad {\hskip \emwidth}
@@ -426,242 +466,210 @@
% Bovendien definieren we enkele extra \fill's:
-\def\hfilll{\hskip\zeropoint\!!plus1filll\relax}
-\def\vfilll{\vskip\zeropoint\!!plus1filll\relax}
+\unexpanded\def\hfilll{\hskip\zeropoint\!!plus1filll\relax}
+\unexpanded\def\vfilll{\vskip\zeropoint\!!plus1filll\relax}
-% De onderstaande hulpmacro's moeten nog eens instelbaar worden
-% gemaakt.
+\unexpanded\def\tfskip {\begingroup\tf\hskip\emwidth\endgroup}
+\unexpanded\def\dotfskip#1{\begingroup\tf\hskip #1\endgroup} % used elsewhere
-\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]\donarrowermethod}
-
-\unexpanded\def\definenarrowermethod[#1]#2%
- {\setvalue{\??sl:#1}{#2}}
-
-\def\donarrowermethod#1%
- {\ifcsname\??sl:#1\endcsname\csname\??sl:#1\endcsname\else\global\advance\ctxmidskip#1\relax\fi}
-
-\definenarrowermethod[\v!left ]{\global\advance\ctxleftskip \@@slleft \relax}
-\definenarrowermethod[\v!middle ]{\global\advance\ctxmidskip \@@slmiddle\relax}
-\definenarrowermethod[\v!right ]{\global\advance\ctxrightskip \@@slright \relax}
-\definenarrowermethod[-\v!left ]{\global\advance\ctxleftskip -\@@slleft \relax}
-\definenarrowermethod[-\v!middle]{\global\advance\ctxmidskip -\@@slmiddle\relax}
-\definenarrowermethod[-\v!right ]{\global\advance\ctxrightskip-\@@slright \relax}
-\definenarrowermethod[\v!reset ]{\global\ctxleftskip \zeropoint
- \global\ctxmidskip \zeropoint
- \global\ctxrightskip\zeropoint\relax}
-\definenarrowermethod[\v!none ]{}
-
-% todo: definenarrower
-%
-% \definecomplexorsimple\startnarrower
-%
-% \def\simplestartnarrower
-% {\startnarrower[\v!middle]}
-%
-% \def\complexstartnarrower[#1]%
-% {\@@slbefore % was hard coded \par
-% \bgroup
-% \global\ctxleftskip \zeropoint
-% \global\ctxrightskip\zeropoint
-% \global\ctxmidskip \zeropoint
-% \processcommalistwithparameters[#1]\donarrower
-% \advance\leftskip \dimexpr\ctxleftskip +\ctxmidskip\relax
-% \advance\rightskip \dimexpr\ctxrightskip+\ctxmidskip\relax
-% \seteffectivehsize}
-%
-% \unexpanded\def\stopnarrower
-% {\@@slafter % was hard coded \par / needed, else skips forgotten
-% \egroup}
%
-% \unexpanded\def\setupnarrower
-% {\dodoubleargument\getparameters[\??sl]}
+% maybe we should hash the analysis
-%D Contrary to \MKII\ we can now define classes of narrower (generalized
-%D by Wolfgang). This environment will be enhanced for bidi.
+\installcorenamespace{narrower}
+\installcorenamespace{narrowermethod}
-\def\narrowerparameter #1{\csname\donarrowerparameter{\??sl\@@narrower}#1\endcsname}
-\def\donarrowerparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\donarrowerparentparameter\csname#1\s!parent\endcsname#2\fi}
-\def\donarrowerparentparameter#1#2{\ifx#1\relax\s!empty\else\donarrowerparameter#1#2\fi}
+\newskip\s_spac_narrower_left
+\newskip\s_spac_narrower_right
+\newskip\s_spac_narrower_mid
-\getparameters
- [\??sl]
+\installcommandhandler \??narrower {narrower} \??narrower
+
+\setupnarrower
[\c!before=\endgraf,
\c!after=\endgraf,
- \c!left=1.5em,
- \c!right=1.5em,
- \c!middle=1.5em]
-
-\unexpanded\def\definenarrower
- {\dodoubleempty\dodefinenarrower}
-
-\def\dodefinenarrower[#1][#2]%
- {\getparameters[\??sl#1][\s!parent=\??sl,#2]%
- \setvalue{\e!start#1}{\dodoubleempty\dostartnarrower[#1]}%
- \setvalue{\e!stop #1}{\dostopnarrower}}
-
-\unexpanded\def\setupnarrower
- {\dodoubleempty\dosetupnarrower}
-
-\def\dosetupnarrower[#1][#2]%
- {\doifelsenothing{#2}
- {\getparameters[\??sl][#1]}
- {\def\docommand##1{\getparameters[\??sl##1][#2]}%
- \processcommacommand[#1]\docommand}}
-
-\definenarrowermethod[\v!left ]{\global\advance\ctxleftskip \narrowerparameter\c!left \relax}
-\definenarrowermethod[\v!middle ]{\global\advance\ctxmidskip \narrowerparameter\c!middle\relax}
-\definenarrowermethod[\v!right ]{\global\advance\ctxrightskip \narrowerparameter\c!right \relax}
-\definenarrowermethod[-\v!left ]{\global\advance\ctxleftskip -\narrowerparameter\c!left \relax}
-\definenarrowermethod[-\v!middle]{\global\advance\ctxmidskip -\narrowerparameter\c!middle\relax}
-\definenarrowermethod[-\v!right ]{\global\advance\ctxrightskip-\narrowerparameter\c!right \relax}
-\definenarrowermethod[\v!reset ]{\global\ctxleftskip \zeropoint
- \global\ctxmidskip \zeropoint
- \global\ctxrightskip\zeropoint\relax}
-\definenarrowermethod[\v!none ]{}
-
-\def\dostartnarrower[#1][#2]%
- {\bgroup
- \ifsecondargument % \doifsomethingelse{#2}?
- \dodostartnarrower[#1][#2]%
+ \c!left=1.5\emwidth,
+ \c!right=1.5\emwidth,
+ \c!middle=1.5\emwidth,
+ \c!default=\v!middle]
+
+\appendtoks
+ \setuevalue{\e!start\currentnarrower}{\spac_narrower_start{\currentnarrower}}%
+ \setuevalue{\e!stop \currentnarrower}{\spac_narrower_stop}%
+\to \everydefinenarrower
+
+\unexpanded\def\installnarrowermethod#1#2%
+ {\setvalue{\??narrowermethod#1}{#2}}
+
+\unexpanded\def\spac_narrower_method_analyze#1%
+ {\ifcsname\??narrowermethod#1\endcsname
+ \csname\??narrowermethod#1\endcsname
+ \else
+ \global\advance\s_spac_narrower_mid#1\relax
+ \fi}
+
+\def\spac_narrower_initialize[#1]% hm, can be dorepeat directly
+ {\dorepeatwithcommand[#1]\spac_narrower_method_analyze}
+
+\installnarrowermethod \v!left {\global\advance\s_spac_narrower_left \narrowerparameter\c!left \relax}
+\installnarrowermethod \v!middle{\global\advance\s_spac_narrower_mid \narrowerparameter\c!middle\relax}
+\installnarrowermethod \v!right {\global\advance\s_spac_narrower_right \narrowerparameter\c!right \relax}
+\installnarrowermethod-\v!left {\global\advance\s_spac_narrower_left -\narrowerparameter\c!left \relax}
+\installnarrowermethod-\v!middle{\global\advance\s_spac_narrower_mid -\narrowerparameter\c!middle\relax}
+\installnarrowermethod-\v!right {\global\advance\s_spac_narrower_right-\narrowerparameter\c!right \relax}
+\installnarrowermethod \v!reset {\global \s_spac_narrower_left \zeropoint
+ \global \s_spac_narrower_mid \zeropoint
+ \global \s_spac_narrower_right \zeropoint\relax}
+\installnarrowermethod\v!none {}
+
+\unexpanded\def\spac_narrower_start#1%
+ {\begingroup
+ \edef\currentnarrower{#1}%
+ \dosingleempty\spac_narrower_start_indeed}
+
+\unexpanded\def\spac_narrower_start_indeed[#1]%
+ {\iffirstargument
+ \spac_narrower_start_apply{#1}%
\else
- \dodostartnarrower[#1][\v!middle]%
+ \spac_narrower_start_apply{\narrowerparameter\v!default}%
\fi}
-\def\dodostartnarrower[#1][#2]%
- {\edef\@@narrower{#1}%
- \narrowerparameter\c!before
- \global\ctxleftskip \zeropoint
- \global\ctxrightskip\zeropoint
- \global\ctxmidskip \zeropoint
- \processcommalistwithparameters[#2]\donarrower
- \advance\leftskip \dimexpr\ctxleftskip +\ctxmidskip\relax
- \advance\rightskip\dimexpr\ctxrightskip+\ctxmidskip\relax
+\def\spac_narrower_start_apply#1%
+ {\narrowerparameter\c!before
+ \global\s_spac_narrower_left \zeropoint
+ \global\s_spac_narrower_right\zeropoint
+ \global\s_spac_narrower_mid \zeropoint
+ \processcommalistwithparameters[#1]\spac_narrower_initialize
+ \advance\leftskip \dimexpr\s_spac_narrower_left +\s_spac_narrower_mid\relax
+ \advance\rightskip\dimexpr\s_spac_narrower_right+\s_spac_narrower_mid\relax
\seteffectivehsize}
-\def\dostopnarrower
+\unexpanded\def\spac_narrower_stop
{\narrowerparameter\c!after
- \egroup}
+ \endgroup}
-\def\v!narrower{narrower}
+\unexpanded\def\startnarrower
+ {\dosingleempty\spac_narrower_start_basic}
-\definenarrower[\v!narrower]
-
-\newdimen\@@effectivehsize \def\effectivehsize {\hsize}
-\newdimen\@@effectiveleftskip \def\effectiveleftskip {\leftskip}
-\newdimen\@@effectiverightskip \def\effectiverightskip{\rightskip}
+\unexpanded\def\spac_narrower_start_basic[#1]%
+ {\begingroup
+ \let\currentnarrower\empty
+ \iffirstargument
+ \spac_narrower_start_apply{#1}%
+ \else
+ \spac_narrower_start_apply{\narrowerparameter\v!default}%
+ \fi}
+
+\let\stopnarrower\spac_narrower_stop
+
+\unexpanded\def\startnarrow % current how
+ {\begingroup
+ \dodoubleempty\spac_narrower_start_named}
-\def\seteffectivehsize
+\def\spac_narrower_start_named[#1][#2]%
+ {\edef\currentnarrower{#1}%
+ \ifsecondargument
+ \spac_narrower_start_apply{#2}%
+ \else
+ \spac_narrower_start_apply{\narrowerparameter\v!default}%
+ \fi}
+
+\let\stopnarrow\spac_narrower_stop
+
+% \def\v!narrower{narrower}
+% \definenarrower[\v!narrower]
+
+\newdimen\d_spac_effective_hsize \def\effectivehsize {\hsize}
+\newdimen\d_spac_effective_leftskip \def\effectiveleftskip {\leftskip}
+\newdimen\d_spac_effective_rightskip \def\effectiverightskip{\rightskip}
+
+\unexpanded\def\seteffectivehsize
{\setlocalhsize
- \@@effectivehsize \localhsize
- \@@effectiveleftskip \leftskip
- \@@effectiverightskip \rightskip
- \let\effectivehsize \@@effectivehsize
- \let\effectiveleftskip \@@effectiveleftskip
- \let\effectiverightskip\@@effectiverightskip}
+ \d_spac_effective_hsize \localhsize
+ \d_spac_effective_leftskip \leftskip
+ \d_spac_effective_rightskip\rightskip
+ \let\effectivehsize \d_spac_effective_hsize
+ \let\effectiveleftskip \d_spac_effective_leftskip
+ \let\effectiverightskip\d_spac_effective_rightskip}
+
+\installcorenamespace{skipadaptionleft}
+\installcorenamespace{skipadaptionright}
\newskip\leftskipadaption
\newskip\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{\leftskipadaption \ifcsname @lsa@#1\endcsname\csname @lsa@#1\endcsname\else#1\fi\relax}
-\def\dosetrightskipadaption#1{\rightskipadaption\ifcsname @rsa@#1\endcsname\csname @rsa@#1\endcsname\else#1\fi\relax}
+\setvalue{\??skipadaptionleft \v!standard}{\ifdim\d_spac_indentation_par=\zeropoint\narrowerparameter\c!left\else\d_spac_indentation_par\fi}
+\setvalue{\??skipadaptionleft \v!yes }{\ifdim\d_spac_indentation_par=\zeropoint\narrowerparameter\c!left\else\d_spac_indentation_par\fi}
+\letvalue{\??skipadaptionleft \v!no }\zeropoint
+\letvalue{\??skipadaptionleft \empty }\zeropoint
+\setvalue{\??skipadaptionright\v!standard}{\narrowerparameter\c!right}
+\setvalue{\??skipadaptionright\v!yes }{\narrowerparameter\c!right}
+\letvalue{\??skipadaptionright\v!no }\zeropoint
+\letvalue{\??skipadaptionright\empty }\zeropoint
-\def\doadaptleftskip #1{\dosetleftskipadaption {#1}\advance\leftskip \leftskipadaption }
-\def\doadaptrightskip#1{\dosetrightskipadaption{#1}\advance\rightskip\rightskipadaption}
+\unexpanded\def\dosetleftskipadaption #1{\leftskipadaption \ifcsname\??skipadaptionleft #1\endcsname\csname\??skipadaptionleft #1\endcsname\else#1\fi\relax}
+\unexpanded\def\dosetrightskipadaption#1{\rightskipadaption\ifcsname\??skipadaptionright#1\endcsname\csname\??skipadaptionright#1\endcsname\else#1\fi\relax}
-%D Tolerance:
+\unexpanded\def\doadaptleftskip #1{\dosetleftskipadaption {#1}\advance\leftskip \leftskipadaption }
+\unexpanded\def\doadaptrightskip#1{\dosetrightskipadaption{#1}\advance\rightskip\rightskipadaption}
-\unexpanded\def\definetolerancemethod
- {\dodoubleargument\dodefinetolerancemethod}
+%D Tolerance (can also be set with align):
-\def\dodefinetolerancemethod[#1][#2]#3%
- {\setvalue{\??to:#1:#2}{#3}}
+\installcorenamespace{tolerancemethods}
-\definetolerancemethod [\v!vertical] [\v!verystrict ] {\let\bottomtolerance\empty}
-\definetolerancemethod [\v!vertical] [\v!strict ] {\def\bottomtolerance{.050}}
-\definetolerancemethod [\v!vertical] [\v!tolerant ] {\def\bottomtolerance{.075}}
-\definetolerancemethod [\v!vertical] [\v!verytolerant] {\def\bottomtolerance{.100}}
+\unexpanded\def\installtolerancemethod#1#2#3%
+ {\setvalue{\??tolerancemethods#1:#2}{#3}}
-\definetolerancemethod [\v!horizontal] [\v!stretch ] {\emergencystretch\bodyfontsize}
-\definetolerancemethod [\v!horizontal] [\v!space ] {\spaceskip.5em\!!plus.25em\!!minus.25em\relax}
-\definetolerancemethod [\v!horizontal] [\v!verystrict ] {\tolerance 200 }
-\definetolerancemethod [\v!horizontal] [\v!strict ] {\tolerance1500 }
-\definetolerancemethod [\v!horizontal] [\v!tolerant ] {\tolerance3000 }
-\definetolerancemethod [\v!horizontal] [\v!verytolerant] {\tolerance4500 }
+\installtolerancemethod \v!vertical \v!verystrict {\let\bottomtolerance\empty}
+\installtolerancemethod \v!vertical \v!strict {\def\bottomtolerance{.050}}
+\installtolerancemethod \v!vertical \v!tolerant {\def\bottomtolerance{.075}}
+\installtolerancemethod \v!vertical \v!verytolerant {\def\bottomtolerance{.100}}
-\def\dotolerancencemethodvertical #1{\csname\??to:\v!vertical :#1\endcsname}
-\def\dotolerancencemethodhorizontal#1{\csname\??to:\v!horizontal:#1\endcsname}
+\installtolerancemethod \v!horizontal \v!stretch {\emergencystretch\bodyfontsize}
+\installtolerancemethod \v!horizontal \v!space {\spaceskip.5em\!!plus.25em\!!minus.25em\relax}
+\installtolerancemethod \v!horizontal \v!verystrict {\tolerance 200 }
+\installtolerancemethod \v!horizontal \v!strict {\tolerance1500 }
+\installtolerancemethod \v!horizontal \v!tolerant {\tolerance3000 }
+\installtolerancemethod \v!horizontal \v!verytolerant {\tolerance4500 }
-\def\dosetuptolerance[#1]%
- {\doifinsetelse\v!vertical{#1}%
- {\processcommacommand[#1]\dotolerancencemethodvertical}
- {\processcommacommand[#1]\dotolerancencemethodhorizontal}}
+\def\spac_tolerances_step_vertical #1{\csname\??tolerancemethods\v!vertical :#1\endcsname}
+\def\spac_tolerances_step_horizontal#1{\csname\??tolerancemethods\v!horizontal:#1\endcsname}
\unexpanded\def\setuptolerance
- {\dosingleargument\dosetuptolerance}
+ {\dosingleargument\spac_tolerances_setup}
+
+\def\spac_tolerances_setup[#1]%
+ {\doifinsetelse\v!vertical{#1}%
+ {\processcommacommand[#1]\spac_tolerances_step_vertical }
+ {\processcommacommand[#1]\spac_tolerances_step_horizontal}}
%D \macros
%D {pushindentation,popindentation}
%D
%D The pushing and popping is done by:
-\newbox\indentationboxA
-\newbox\indentationboxB
+\newbox\b_spac_indentations_a
+\newbox\b_spac_indentations_b
-\def\pushindentation
- {\bgroup
+\unexpanded\def\pushindentation
+ {\begingroup
\ifhmode
\unskip
- \setbox\indentationboxA\lastbox % get \strut if present
+ \setbox\b_spac_indentations_a\lastbox % get \strut if present
\unskip
- \setbox\indentationboxB\lastbox % get \indent generated box
+ \setbox\b_spac_indentations_b\lastbox % get \indent generated box
\unskip
\else
- \hskip\zeropoint % switch to horizontal mode
+ \dontleavehmode % was \hskip\zeropoint % switch to horizontal mode
\unskip
- \setbox\indentationboxA\lastbox % get \indent generated box
- \setbox\indentationboxB\emptybox
+ \setbox\b_spac_indentations_a\lastbox % get \indent generated box
+ \setbox\b_spac_indentations_b\emptybox
\fi}
-\def\popindentation
- {\box\indentationboxB\box\indentationboxA % put back the boxes
- \egroup}
+\unexpanded\def\popindentation
+ {\box\b_spac_indentations_b
+ \box\b_spac_indentations_a
+ \endgroup}
%D The only complication lays in \type{\strut}. In \PLAIN\
%D \TEX\ a \type{\strut} is defined as:
@@ -694,7 +702,7 @@
%D {\relax\ifmmode
%D \copy\strutbox
%D \else
-%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup
+%D \bgroup\setbox\strutbox=\hbox{\box\strutbox}\unhcopy\strutbox\egroup
%D \fi}
%D \stoptyping
%D
@@ -707,7 +715,7 @@
% \unexpanded \def\crlf
% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break}
-\unexpanded \def\crlf
+\unexpanded\def\crlf
{\ifhmode
\unskip
\prewordbreak\crlfplaceholder
@@ -718,11 +726,11 @@
\endgraf
\fi}
-\def\crlfplaceholder
+\unexpanded\def\crlfplaceholder
{\strut}
-\def\settestcrlf
- {\def\crlfplaceholder
+\unexpanded\def\settestcrlf
+ {\unexpanded\def\crlfplaceholder
{\hbox to \zeropoint
{\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}}
@@ -756,46 +764,51 @@
%unexpanded\def\justaperiod {\removeunwantedspaces.}
%unexpanded\def\justacomma {\removeunwantedspaces,}
-\def\ignorecrlf
+\installcorenamespace{hspace}
+
+\unexpanded\def\ignorecrlf
{\let\crlf\justonespace\let\\\crlf}
\unexpanded\def\definehspace
- {\dotripleempty\dodefinehspace}
+ {\dotripleempty\spac_hspaces_define}
-\def\dodefinehspace[#1][#2][#3]% #1 = optional namespace
+\def\spac_hspaces_define[#1][#2][#3]% #1 = optional namespace
{\ifthirdargument
- \setvalue{\??hs#1:#2}{#3}%
+ \setvalue{\??hspace#1:#2}{#3}%
\else
- \setvalue{\??hs:#1}{#2}%
+ \setvalue{\??hspace:#1}{#2}%
\fi}
\unexpanded\def\hspace
- {\dodoubleempty\dohspace}
+ {\dodoubleempty\spac_hspaces_insert}
-\def\dohspace[#1][#2]%
- {\ifsecondargument
- \dodohspace[#1][#2]%
- \else\iffirstargument
- \hspace[][#1]%
- \else
- \hspace[][\s!default]%
- \fi\fi}
-
-\def\dodohspace[#1][#2]%
+\def\spac_hspaces_insert[#1][#2]%
{\ifhmode
\removeunwantedspaces
- \hskip\hspaceamount{#1}{#2}%
+ \hskip % always a skip even when 0pt
+ \ifsecondargument
+ \hspaceamount{#1}{#2}%
+ \else\iffirstargument
+ \hspaceamount\empty{#1}%
+ \else
+ \hspaceamount\empty\s!default
+ \fi\fi
\expandafter\ignorespaces
- \fi}
+ \fi}
\def\hspaceamount#1#2%
- {\executeifdefined{\??hs#1:#2}{\executeifdefined{\??hs:#2}\zeropoint}}
+ {\csname\??hspace
+ \ifcsname\??hspace#1:#2\endcsname#1:#2\else:\v!none\fi
+ \endcsname}
+
+% no installhspace here (this is already an old command)
\definehspace [\v!small] [.25\emspaceamount]
\definehspace [\v!medium] [.5\emspaceamount]
\definehspace [\v!big] [1\emspaceamount]
\definehspace [\v!normal] [1\spaceamount]
\definehspace [\v!default] [\spaceamount]
+\definehspace [\v!none] [\zeropoint]
%D Taken from Taco's math module (cq. \AMS\ macros), but
%D adapted to \type {\hspace}:
@@ -816,23 +829,20 @@
% 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}
+%unexpanded\def\breakablethinspace {\breakabletextormathspace+\thinmuskip1}
+%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\kern\interwordspace}
+%unexpanded\def\narrownobreakspace {\penalty\plustenthousand\thinspace}
+%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]
@@ -844,6 +854,11 @@
\let \; \thickspace
\let \! \negthinspace
+% plain ...
+%
+% \ifdefined\> \else \unexpanded\def\>{\mskip \medmuskip } \fi
+% \ifdefined\* \else \unexpanded\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} \fi
+
\def\flexiblespaceamount#1#2#3%
{#1\interwordspace
\!!plus#2\interwordstretch
@@ -858,32 +873,38 @@
%
% do we need \normalspaceprimitive here?
-\def\installspacehandler#1#2% needs to set \obeyedspace
- {\setvalue{\??sr#1}{#2}}
+\installcorenamespace{spacemethods}
+
+\unexpanded\def\installspacemethod#1#2% needs to set \obeyedspace
+ {\setvalue{\??spacemethods#1}{#2}}
-\installspacehandler \v!on
+\def\activatespacehandler#1%
+ {\csname\??spacemethods\ifcsname\??spacemethods#1\endcsname#1\else\v!off\fi\endcsname}
+
+\unexpanded\def\spac_spaces_checked_control{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}%
+\unexpanded\def\spac_spaces_checked_normal {\mathortext\normalspace{\dontleavehmode\normalspace}}%
+\unexpanded\def\spac_spaces_checked_fixed {\mathortext\normalspace{\dontleavehmode\fixedspace}}%
+
+\installspacemethod \v!on
{\obeyspaces
- \unexpanded\def\obeyedspace{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}%
+ \let\obeyedspace\spac_spaces_checked_control
\let\ =\obeyedspace}
-\installspacehandler \v!yes
+\installspacemethod \v!yes
{\obeyspaces
- \unexpanded\def\obeyedspace{\mathortext\normalspace{\dontleavehmode\normalspace}}%
+ \let\obeyedspace\spac_spaces_checked_normal
\let\ =\obeyedspace}
-\installspacehandler \v!off % == default
+\installspacemethod \v!off % == default
{\normalspaces
\let\obeyedspace\normalspace
\let\ =\normalspaceprimitive} % was \normalspace
-\installspacehandler \v!fixed
+\installspacemethod \v!fixed
{\obeyspaces
- \unexpanded\def\obeyedspace{\mathortext\normalspace{\dontleavehmode\fixedspace}}%
+ \let\obeyedspace\spac_spaces_checked_fixed
\let\ =\obeyedspace}
-\def\activatespacehandler#1%
- {\executeifdefined{\??sr#1}{\activatespacehandler\v!off}}
-
\appendtoks
\normalspaces % to be sure
\to \everybeforeoutput
@@ -899,18 +920,15 @@
%D
%D \typebuffer \getbuffer
-% unexpanded is important here as it prevents premature expansion in
-% e.g. \normalexpanded{\egroup\sortingparameter\c!next}
-
\unexpanded\def\autoinsertnextspace
- {\futurelet\nexttoken\doautoinsertnextspace}
+ {\futurelet\nexttoken\spac_spaces_auto_insert_next}
-\def\doautoinsertnextspace
+\def\spac_spaces_auto_insert_next
{\ctxcommand{autonextspace("\meaning\nexttoken")}} % todo, just consult nexttoken at the lua end
%D Moved from bib module:
-\def\outdented#1%
+\unexpanded\def\outdented#1%
{\hskip-\hangindent#1\relax}
%D Beware: due to char-def this becomes an active character but that
@@ -918,24 +936,24 @@
%D node insertions. We might even expand it to utf then as it then
%D can be used in string comparison (not that much needed anyway).
-\chardef\zwnj="200C
-\chardef\zwj ="200D
+% \chardef\zwnj="200C
+% \chardef\zwj ="200D
% TODO (but used in languages):
-\unexpanded\def\textormathglue#1#2#3% cleaned up one
+\unexpanded\def\spac_glues_text_or_math#1#2%
{\begingroup
\ifmmode
- \mskip#1#2%
+ \mskip#1%
\else
- \scratchdimen#1\hspaceamount\empty{#3}%
+ \scratchdimen#1\hspaceamount\empty{#2}%
\scratchskip\scratchdimen\!!plus.5\scratchdimen\!!minus.3\scratchdimen
\hskip\scratchskip
\fi
\endgroup}
-\def\thinglue {\textormathglue+\thinmuskip 1}
-\def\medglue {\textormathglue+\medmuskip 2}
-\def\thickglue{\textormathglue+\thickmuskip3}
+\unexpanded\def\thinglue {\spac_glues_text_or_math\thinmuskip \v!small}
+\unexpanded\def\medglue {\spac_glues_text_or_math\medmuskip \v!medium}
+\unexpanded\def\thickglue{\spac_glues_text_or_math\thickmuskip\v!big}
\protect \endinput