diff options
35 files changed, 2066 insertions, 755 deletions
| diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index 04af96a54..4dd19224c 100644 --- a/tex/context/base/mkii/cont-new.mkii +++ b/tex/context/base/mkii/cont-new.mkii @@ -11,7 +11,7 @@  %C therefore copyrighted by \PRAGMA. See mreadme.pdf for  %C details. -\newcontextversion{2020.11.05 15:20} +\newcontextversion{2020.11.05 22:57}  %D This file is loaded at runtime, thereby providing an  %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii index 369951155..1a3cd5512 100644 --- a/tex/context/base/mkii/context.mkii +++ b/tex/context/base/mkii/context.mkii @@ -20,7 +20,7 @@  %D your styles an modules.  \edef\contextformat {\jobname} -\edef\contextversion{2020.11.05 15:20} +\edef\contextversion{2020.11.05 22:57}  %D For those who want to use this: diff --git a/tex/context/base/mkiv/attr-ini.mkxl b/tex/context/base/mkiv/attr-ini.mkxl index 14d77ec89..47e680c25 100644 --- a/tex/context/base/mkiv/attr-ini.mkxl +++ b/tex/context/base/mkiv/attr-ini.mkxl @@ -60,8 +60,8 @@    {\ifcsname\??attributeprefix#2\endcsname\else       \scratchcounter\clf_defineattribute{#2}{#1}\relax      %\writestatus\m!system{defining #1 attribute #2 with number \number\scratchcounter}% -     \global\expandafter\attributedef\csname\??attributeprefix#2\endcsname\scratchcounter %           \foo = 123 -     \global\expandafter\integerdef  \csname\??attributeid    #2\endcsname\scratchcounter % \attribute\foo = 123 +     \global\permanent\expandafter\attributedef\csname\??attributeprefix#2\endcsname\scratchcounter %           \foo = 123 +     \global\permanent\expandafter\integerdef  \csname\??attributeid    #2\endcsname\scratchcounter % \attribute\foo = 123       % some attributes are always global       \doifelseinset\s!global{#3}%         {\xtoksapp\t_attr_list_global{\csname\??attributeprefix#2\endcsname\attributeunsetvalue}}% \c_attr_foo diff --git a/tex/context/base/mkiv/bibl-tra.mkiv b/tex/context/base/mkiv/bibl-tra.mkiv index eebd92d68..a80a22933 100644 --- a/tex/context/base/mkiv/bibl-tra.mkiv +++ b/tex/context/base/mkiv/bibl-tra.mkiv @@ -1152,9 +1152,13 @@  %D edef, and the \type{\robustdoifinsetelse} doesn't listen to  %D \type{\doglobal } -\unexpanded\def\robustaddtocommalist#1#2% {item} \cs -  {\robustdoifelseinset{#1}#2\resetglobal -     {\dodoglobal\xdef#2{\ifx#2\empty\else#2,\fi#1}}} +\pushoverloadmode + +    \unexpanded\def\robustaddtocommalist#1#2% {item} \cs +      {\robustdoifelseinset{#1}#2\resetglobal +         {\dodoglobal\xdef#2{\ifx#2\empty\else#2,\fi#1}}} + +\popoverloadmode  %D \macros{donormalbibauthoryear}  %D diff --git a/tex/context/base/mkiv/buff-ver.mkxl b/tex/context/base/mkiv/buff-ver.mkxl index db8b62b64..48a496fce 100644 --- a/tex/context/base/mkiv/buff-ver.mkxl +++ b/tex/context/base/mkiv/buff-ver.mkxl @@ -148,7 +148,7 @@  \installcommandhandler \??type {type} \??type  \appendtoks -    \setuevalue{\currenttype}{\buff_verbatim_type{\currenttype}}% +    \frozen\instance\setuevalue{\currenttype}{\buff_verbatim_type{\currenttype}}%  \to \everydefinetype  \appendtoks @@ -176,8 +176,8 @@  \installcommandhandler \??typing {typing} \??typing  \appendtoks -    \setuevalue{\e!start\currenttyping}{\buff_verbatim_typing_start{\currenttyping}}% -    \setuevalue{\e!stop \currenttyping}{\buff_verbatim_typing_stop {\currenttyping}}% +    \frozen\instance\setuevalue{\e!start\currenttyping}{\buff_verbatim_typing_start{\currenttyping}}% +    \frozen\instance\setuevalue{\e!stop \currenttyping}{\buff_verbatim_typing_stop {\currenttyping}}%      \ifempty\currenttypingparent        \normalexpanded{\definelinenumbering[\currenttyping]}%      \else @@ -578,7 +578,7 @@  % [category] [settings] {name} % for historic reasons, all filenames are {}  \appendtoks -    \setuevalue{\e!type\currenttyping\v!file}{\typefile[\currenttyping]}% +    \frozen\instance\setuevalue{\e!type\currenttyping\v!file}{\typefile[\currenttyping]}%  \to \everydefinetyping  \permanent\tolerant\protected\def\typefile[#1]#*[#2]#:#3% @@ -767,11 +767,11 @@    {\buff_verbatim_type_defined_buffer[\v!buffer][\thedefinedbuffer{#1}]}%  \appendtoks -    \setuevalue{\e!type\currentbuffer}{\buff_verbatim_type_defined_buffer[\v!buffer][\currentdefinedbuffer]}% +    \frozen\instance\setuevalue{\e!type\currentbuffer}{\buff_verbatim_type_defined_buffer[\v!buffer][\currentdefinedbuffer]}%  \to \everydefinebuffer  \appendtoks % \e!buffer -    \setuevalue{\e!type\currenttyping\v!buffer}{\buff_verbatim_type_buffer_class{\currenttyping}}% +    \frozen\instance\setuevalue{\e!type\currenttyping\v!buffer}{\buff_verbatim_type_buffer_class{\currenttyping}}%  \to \everydefinetyping  \tolerant\protected\def\buff_verbatim_type_buffer[#1]#*[#2]% @@ -975,7 +975,7 @@  % \installcommandhandler \??visualizer {visualizer} \??visualizer  %  % \appendtoks -%     \setuevalue{\currentvisualizer}{\buff_verbatim_visualize{\currentvisualizer}}% +%     \frozen\instance\setuevalue{\currentvisualizer}{\buff_verbatim_visualize{\currentvisualizer}}%  % \to \everydefinevisualizer  %  % \protected\def\buff_verbatim_visualize#1% diff --git a/tex/context/base/mkiv/chem-str.mkxl b/tex/context/base/mkiv/chem-str.mkxl index 036b1f5da..29b112c0e 100644 --- a/tex/context/base/mkiv/chem-str.mkxl +++ b/tex/context/base/mkiv/chem-str.mkxl @@ -59,8 +59,8 @@  % \installsimplecommandhandler \??chemical {chemical} \??chemical % no \define...  \installcommandhandler \??chemical {chemical} \??chemical % no \define... -\let\setupchemicals \setupchemical -\let\definechemicals\definechemical +\aliased\let\setupchemicals \setupchemical +\aliased\let\definechemicals\definechemical  %D We use a dedicated framed macro instead of inheriting one. This is both  %D a historical and practical reason (like shared keys with different meaning @@ -82,35 +82,29 @@    [\c!align=\v!normal,     \c!strut=\v!no] -\unexpanded\def\setupchemicalframed +\permanent\protected\def\setupchemicalframed    {\setupframed[\??chemicalframed]} -\unexpanded\overloaded\def\definechemical % is global (so we don't use the commandhandler) +\permanent\protected\overloaded\def\definechemical % is global (so we don't use the commandhandler)    {\dosingleargument\chem_define}  \def\chem_define[#1]#2%    {\startnointerference     \edef\currentdefinedchemical{#1}% -   \let\chemical\chem_chemical_nested +   \enforced\let\chemical\chem_chemical_nested     \clf_undefinechemical{#1}%     #2% flush     \stopnointerference} -\unexpanded\def\chem_chemical_nested -  {\dodoubleempty\chem_chemical_nested_indeed} - -\def\chem_chemical_nested_indeed[#1][#2]% +\permanent\tolerant\protected\def\chem_chemical_nested[#1]#*[#2]%    {\clf_definechemical{\currentdefinedchemical}{#1}{\detokenize{#2}}}  % chemical symbols -\unexpanded\def\definechemicalsymbol -  {\dodoubleempty\chem_symbol_define} - -\def\chem_symbol_define[#1][#2]% -  {\setvalue{\??chemicalsymbol#1}{#2}} +\permanent\tolerant\protected\def\definechemicalsymbol[#1]#*[#2]% +  {\ifarguments\else\setvalue{\??chemicalsymbol#1}{#2}\fi} -\unexpanded\def\chemicalsymbol[#1]% +\permanent\protected\def\chemicalsymbol[#1]%    {\csname\??chemicalsymbol\ifcsname\??chemicalsymbol#1\endcsname#1\else\s!unknown\fi\endcsname}  \definechemicalsymbol[\s!unknown][] % \char"FFFD empty @@ -120,7 +114,7 @@  \edef\chemicaltoplocation{t}  \edef\chemicalbotlocation{b} -\unexpanded\def\chemicaltext#1% +\permanent\protected\def\chemicaltext#1%    {\mathematics       {\usechemicalstyleandcolor\c!style\c!color        \strut @@ -133,7 +127,7 @@  \newtoks       \everychemical  \newtoks       \everystructurechemical -\newconditional\indisplaychemical +%newconditional\indisplaychemical  \newtoks       \t_chem_every_box  \newbox        \b_chem_result @@ -142,25 +136,26 @@  \newdimen      \d_chem_height  \newdimen      \d_chem_depth -\unexpanded\def\startchemical -  {\dodoubleempty\chem_start} - -\def\chem_start[#1][#2]% +\permanent\tolerant\protected\def\startchemical[#1]#*[#2]%    {\ifmmode\vcenter\else\vbox\fi % vpack ?     \bgroup     \synchronizestrut{\chemicalparameter\c!strut}%     \dontcomplain -   \settrue\indisplaychemical +  %\settrue\indisplaychemical     \forgetall -   \ifsecondargument -     \doifelseassignment{#1} -       {\setupcurrentchemical[#1]}% same as \currentchemical -       {\edef\currentchemical{#1}% -        \setupcurrentchemical[#2]}% -   \orelse\iffirstargument -     \doifelseassignment{#1} -       {\setupcurrentchemical[#1]}% same as \currentchemical -       {\edef\currentchemical{#1}}% +   \ifparameter#2\or +     \ifhastok={#1}% +       \setupcurrentchemical[#1]% same as \currentchemical +     \else +       \edef\currentchemical{#1}% +       \setupcurrentchemical[#2]% +     \fi +   \orelse\ifparameter#1\or +     \ifhastok={#1}% +       \setupcurrentchemical[#1]% same as \currentchemical +     \else +       \edef\currentchemical{#1}% +     \fi     \fi     \the\everystructurechemical     \setbox\b_chem_result\hpack\bgroup @@ -183,7 +178,7 @@     \relax     \startnointerference} -\unexpanded\def\stopchemical +\permanent\protected\def\stopchemical    {\stopnointerference     \clf_stopchemical     \egroup @@ -194,7 +189,7 @@     \doifelsenothing{\chemicalparameter\c!frame}\chem_framed_nop\chem_framed_yes     \egroup} -\unexpanded\def\chem_framed_yes +\protected\def\chem_framed_yes    {\localframedwithsettings       [\??chemicalframed]%       [\c!frame=\chemicalparameter\c!frame, @@ -202,21 +197,21 @@        \c!framecolor=\chemicalparameter\c!framecolor]%       {\vpack{\box\b_chem_result\vss}}} % remove depth -\unexpanded\def\chem_framed_nop +\protected\def\chem_framed_nop    {\directlocalframed       [\??chemicalframed]%       {\vpack{\box\b_chem_result\vss}}} % remove depth -\let\startstructurechemical\startchemical -\let\stopstructurechemical \stopchemical - -\unexpanded\def\structurechemical -  {\dotripleempty\strc_chem_indeed} +\aliased\let\startstructurechemical\startchemical +\aliased\let\stopstructurechemical \stopchemical  \appendtoks -    \let\chemical\structurechemical +    \enforced\let\chemical\structurechemical  \to\everystructurechemical +\protected\def\structurechemical +  {\dotripleempty\strc_chem_indeed} +  \def\strc_chem_indeed    {\ifthirdargument       \expandafter\strc_chem_indeed_three @@ -234,7 +229,7 @@     \relax     \ignorespaces} -\def\strc_chem_indeed_two[#1][#2]% +\def\strc_chem_indeed_two[#1][#2]% why no [#3] here    {\clf_chemicalcomponent        {#1}%        {\detokenize{#2}}% @@ -261,14 +256,14 @@  % \to \everystructurechemical  \to \everychemical -\def\chemicaltoptext#1{\global\settrue\c_chem_some_text\gdef\m_chem_top_text{#1}\ignorespaces} -\def\chemicalbottext#1{\global\settrue\c_chem_some_text\gdef\m_chem_bot_text{#1}\ignorespaces} -\def\chemicalmidtext#1{\global\settrue\c_chem_some_text\gdef\m_chem_mid_text{#1}\ignorespaces} +\permanent\protected\def\chemicaltoptext#1{\global\settrue\c_chem_some_text\gdef\m_chem_top_text{#1}\ignorespaces} +\permanent\protected\def\chemicalbottext#1{\global\settrue\c_chem_some_text\gdef\m_chem_bot_text{#1}\ignorespaces} +\permanent\protected\def\chemicalmidtext#1{\global\settrue\c_chem_some_text\gdef\m_chem_mid_text{#1}\ignorespaces}  \appendtoks -    \let\toptext\chemicaltoptext \glet\m_chem_top_text\empty -    \let\bottext\chemicalbottext \glet\m_chem_bot_text\empty -    \let\midtext\chemicalmidtext \glet\m_chem_mid_text\empty +    \enforced\let\toptext\chemicaltoptext \glet\m_chem_top_text\empty +    \enforced\let\bottext\chemicalbottext \glet\m_chem_bot_text\empty +    \enforced\let\midtext\chemicalmidtext \glet\m_chem_mid_text\empty      \global\setfalse\c_chem_some_text  \to \everystructurechemical @@ -356,48 +351,48 @@     \box\scratchboxtwo     \egroup} -\unexpanded\def\chemicalleft#1#2% redundant boxes thanks to visual +\protected\def\chemicalleft#1#2% redundant boxes thanks to visual    {\hbox\bgroup % hpack ?     \setstrut     \llap{\chem_box_visual_nop{\strut#1}}%     \chem_box_visual_nop{\strut#2}%     \egroup} -\unexpanded\def\chemicalright#1#2% redundant boxes thanks to visual +\protected\def\chemicalright#1#2% redundant boxes thanks to visual    {\hbox\bgroup % hpack ?     \setstrut     \chem_box_visual_yes{\strut#2}%     \rlap{\chem_box_visual_nop{\strut#1}}%     \egroup} -\unexpanded\def\chemicaltop            {\chem_top_construct    \hss   \hss  } -\unexpanded\def\chemicallefttop        {\chem_top_construct    \relax \hss  } -\unexpanded\def\chemicalrighttop       {\chem_top_construct    \hss   \relax} -\unexpanded\def\chemicalbottom         {\chem_bottom_construct \hss   \hss  } -\unexpanded\def\chemicalleftbottom     {\chem_bottom_construct \relax \hss  } -\unexpanded\def\chemicalrightbottom    {\chem_bottom_construct \hss   \relax} +\permanent\protected\def\chemicaltop        {\chem_top_construct   \hss  \hss  } +\permanent\protected\def\chemicallefttop    {\chem_top_construct   \relax\hss  } +\permanent\protected\def\chemicalrighttop   {\chem_top_construct   \hss  \relax} +\permanent\protected\def\chemicalbottom     {\chem_bottom_construct\hss  \hss  } +\permanent\protected\def\chemicalleftbottom {\chem_bottom_construct\relax\hss  } +\permanent\protected\def\chemicalrightbottom{\chem_bottom_construct\hss  \relax} -\unexpanded\def\chemicaltopleft      #1{\chemicalleft {\chemicalrighttop   {#1}{}}} -\unexpanded\def\chemicalbottomleft   #1{\chemicalleft {\chemicalrightbottom{#1}{}}} -\unexpanded\def\chemicaltopright     #1{\chemicalright{\chemicallefttop    {#1}{}}} -\unexpanded\def\chemicalbottomright  #1{\chemicalright{\chemicalleftbottom {#1}{}}} +\permanent\protected\def\chemicaltopleft    #1{\chemicalleft {\chemicalrighttop   {#1}{}}} +\permanent\protected\def\chemicalbottomleft #1{\chemicalleft {\chemicalrightbottom{#1}{}}} +\permanent\protected\def\chemicaltopright   #1{\chemicalright{\chemicallefttop    {#1}{}}} +\permanent\protected\def\chemicalbottomright#1{\chemicalright{\chemicalleftbottom {#1}{}}} -% \unexpanded\def\chemicalcentered     #1{\hbox to \fontcharwd\font`C{\setstrut\strut\hss#1\hss}} -% \unexpanded\def\chemicalleftcentered #1{\hbox to \fontcharwd\font`C{\setstrut\strut    #1\hss}} -% \unexpanded\def\chemicalrightcentered#1{\hbox to \fontcharwd\font`C{\setstrut\strut\hss#1}} +% \protected\def\chemicalcentered     #1{\hbox to \fontcharwd\font`C{\setstrut\strut\hss#1\hss}} +% \protected\def\chemicalleftcentered #1{\hbox to \fontcharwd\font`C{\setstrut\strut    #1\hss}} +% \protected\def\chemicalrightcentered#1{\hbox to \fontcharwd\font`C{\setstrut\strut\hss#1}}  % \let\chemicalsmashedmiddle\chemicalcentered  % \let\chemicalsmashedleft  \chemicalleftcentered  % \let\chemicalsmashedright \chemicalrightcentered -\unexpanded\def\chemicalalignedtext +\permanent\protected\def\chemicalalignedtext    {\ifmmode       \expandafter\chem_aligned_text_math     \else       \expandafter\chem_aligned_text_text     \fi} -\let\chemicaltighttext\relax % maybe smaller strut +\aliased\let\chemicaltighttext\relax % maybe smaller strut  \def\chem_aligned_text_text#1#2#3%    {\dontleavehmode @@ -420,30 +415,30 @@     \egroup     \endgroup} -\unexpanded\def\chemicalcentered     {\chemicalalignedtext\hss  \hss  } -\unexpanded\def\chemicalleftcentered {\chemicalalignedtext\relax\hss  } -\unexpanded\def\chemicalrightcentered{\chemicalalignedtext\hss  \relax} +\permanent\protected\def\chemicalcentered     {\chemicalalignedtext\hss  \hss  } +\permanent\protected\def\chemicalleftcentered {\chemicalalignedtext\relax\hss  } +\permanent\protected\def\chemicalrightcentered{\chemicalalignedtext\hss  \relax} -\let\chemicalsmashedmiddle\chemicalcentered -\let\chemicalsmashedleft  \chemicalleftcentered -\let\chemicalsmashedright \chemicalrightcentered +\aliased\let\chemicalsmashedmiddle\chemicalcentered +\aliased\let\chemicalsmashedleft  \chemicalleftcentered +\aliased\let\chemicalsmashedright \chemicalrightcentered -\unexpanded\def\chemicaloxidation#1#2#3% +\permanent\protected\def\chemicaloxidation#1#2#3%    {\chemicaltop{\txx\ifcase#2\relax0\else#1\convertnumber{I}{#2}\fi}{#3}} -\unexpanded\def\chemicaloxidationplus {\dotriplegroupempty\chemicaloxidation{\textplus }} % {} needed! -\unexpanded\def\chemicaloxidationminus{\dotriplegroupempty\chemicaloxidation{\textminus}} % {} needed! -\unexpanded\def\chemicalforeveropen   {\dotriplegroupempty\chemicalleft     {$\big[$}}    % {} needed! -\unexpanded\def\chemicalforeverclose  {\dotriplegroupempty\chemicalright    {$\big]$}}    % {} needed! -\unexpanded\def\chemicaloxidationone  {\chemicaloxidation\relax1} -\unexpanded\def\chemicaloxidationtwo  {\chemicaloxidation\relax2} -\unexpanded\def\chemicaloxidationthree{\chemicaloxidation\relax3} -\unexpanded\def\chemicaloxidationfour {\chemicaloxidation\relax4} -\unexpanded\def\chemicaloxidationfive {\chemicaloxidation\relax5} -\unexpanded\def\chemicaloxidationsix  {\chemicaloxidation\relax6} -\unexpanded\def\chemicaloxidationseven{\chemicaloxidation\relax7} - -\unexpanded\def\chemicalbar +\permanent\protected\def\chemicaloxidationplus {\dotriplegroupempty\chemicaloxidation{\textplus }} % {} needed! +\permanent\protected\def\chemicaloxidationminus{\dotriplegroupempty\chemicaloxidation{\textminus}} % {} needed! +\permanent\protected\def\chemicalforeveropen   {\dotriplegroupempty\chemicalleft     {$\big[$}}    % {} needed! +\permanent\protected\def\chemicalforeverclose  {\dotriplegroupempty\chemicalright    {$\big]$}}    % {} needed! +\permanent\protected\def\chemicaloxidationone  {\chemicaloxidation\relax1} +\permanent\protected\def\chemicaloxidationtwo  {\chemicaloxidation\relax2} +\permanent\protected\def\chemicaloxidationthree{\chemicaloxidation\relax3} +\permanent\protected\def\chemicaloxidationfour {\chemicaloxidation\relax4} +\permanent\protected\def\chemicaloxidationfive {\chemicaloxidation\relax5} +\permanent\protected\def\chemicaloxidationsix  {\chemicaloxidation\relax6} +\permanent\protected\def\chemicaloxidationseven{\chemicaloxidation\relax7} + +\permanent\protected\def\chemicalbar    {\hpack \s!spread .5\emwidth \bgroup       \hss       \vrule \s!height .9\strutht \s!depth .65\strutdp \s!width .1\exheight @@ -491,32 +486,25 @@  % inline -% \unexpanded\def\chemical -%   {\ifinformula -%      \expandafter\displaychemical -%    \else -%      \expandafter\inlinechemical -%    \fi} - -\unexpanded\def\chemical +\permanent\protected\def\chemical    {\ifinformula       \expandafter\indisplaychemical     \else       \expandafter\inlinechemical     \fi} -\unexpanded\def\indisplaychemical +\permanent\protected\def\indisplaychemical    {\mathstylecommand\displaychemical\inlinechemical\inlinechemical} -\unexpanded\def\inlinechemical#1% -  {\dontleavehmode -   \begingroup -   \scratchcounter\normalmathstyle -   \usechemicalstyleandcolor\c!style\c!color -   \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\clf_inlinechemical{#1}}}% -   \endgroup} +% \permanent\protected\def\inlinechemical#1% +%   {\dontleavehmode +%    \begingroup +%    \scratchcounter\normalmathstyle +%    \usechemicalstyleandcolor\c!style\c!color +%    \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\clf_inlinechemical{#1}}}% +%    \endgroup} -\unexpanded\def\displaychemical +\permanent\protected\def\displaychemical    {\dotriplegroupempty\chem_display}  \def\chem_display#1#2#3% @@ -537,11 +525,11 @@     \egroup     \quad} -\unexpanded\def\inlinechemical#1% +\permanent\protected\def\inlinechemical#1%    {\dontleavehmode     \hbox{\usechemicalstyleandcolor\c!style\c!color\clf_inlinechemical{#1}}} -\unexpanded\def\chemicalbondrule +\permanent\protected\def\chemicalbondrule    {\hpack{\vrule\s!height.75\exheight\s!depth-\dimexpr.75\exheight-\linewidth\relax\s!width\emwidth\relax}}  \definechemicalsymbol[i:space]       [\enspace\quad\enspace] @@ -555,17 +543,17 @@  \definechemicalsymbol[i:double]      [\hpack{\lower.5ex\chemicalbondrule\hskip-1em\raise.5ex\chemicalbondrule}]  \definechemicalsymbol[i:triple]      [\hpack{\chemicalbondrule\hskip-1em\lower.5ex\chemicalbondrule\hskip-1em\raise.5ex\chemicalbondrule}] -\unexpanded\def\chemicalsinglebond {\chemicalsymbol[i:single]} -\unexpanded\def\chemicaldoublebond {\chemicalsymbol[i:double]} -\unexpanded\def\chemicaltriplebond {\chemicalsymbol[i:triple]} -\unexpanded\def\chemicalgives      {\chemicalsymbol[i:gives]} -\unexpanded\def\chemicalmesomeric  {\chemicalsymbol[i:mesomeric]} -\unexpanded\def\chemicalequilibrium{\chemicalsymbol[i:equilibrium]} -\unexpanded\def\chemicalplus       {\chemicalsymbol[i:plus]} -\unexpanded\def\chemicalminus      {\chemicalsymbol[i:minus]} -\unexpanded\def\chemicalequals     {\chemicalsymbol[i:equals]} -\unexpanded\def\chemicalspace      {\chemicalsymbol[i:space]} -\unexpanded\def\chemicalinline   #1{#1} +\permanent\protected\def\chemicalsinglebond {\chemicalsymbol[i:single]} +\permanent\protected\def\chemicaldoublebond {\chemicalsymbol[i:double]} +\permanent\protected\def\chemicaltriplebond {\chemicalsymbol[i:triple]} +\permanent\protected\def\chemicalgives      {\chemicalsymbol[i:gives]} +\permanent\protected\def\chemicalmesomeric  {\chemicalsymbol[i:mesomeric]} +\permanent\protected\def\chemicalequilibrium{\chemicalsymbol[i:equilibrium]} +\permanent\protected\def\chemicalplus       {\chemicalsymbol[i:plus]} +\permanent\protected\def\chemicalminus      {\chemicalsymbol[i:minus]} +\permanent\protected\def\chemicalequals     {\chemicalsymbol[i:equals]} +\permanent\protected\def\chemicalspace      {\chemicalsymbol[i:space]} +\permanent\protected\def\chemicalinline   #1{#1}  % display @@ -578,7 +566,7 @@  \newif\ifinchemicalformula -\unexpanded\def\startchemicalformula +\permanent\protected\def\startchemicalformula    {\mathortext\vcenter\vbox\bgroup     \forgetall     \inchemicalformulatrue @@ -587,11 +575,11 @@     \t_chem_top\emptytoks % not needed     \t_chem_mid\emptytoks % not needed     \t_chem_bot\emptytoks % not needed -   \let\chemical\formulachemical +   \enforced\let\chemical\formulachemical     \setfalse\c_chem_has_top     \setfalse\c_chem_has_bot} -\unexpanded\def\stopchemicalformula +\permanent\protected\def\stopchemicalformula    {\tabskip\emwidth\relax     \nointerlineskip     \ifconditional\c_chem_has_top @@ -637,7 +625,7 @@  \definechemicalsymbol[d:OPENCOMPLEX] [{\chemicalsymbol[d:opencomplex]}]  \definechemicalsymbol[d:CLOSECOMPLEX][{\chemicalsymbol[d:closecomplex]}] -\unexpanded\def\formulachemical +\permanent\protected\def\formulachemical    {\relax\dotriplegroupempty\chem_formula}  \def\chem_formula#1#2#3% we could do hboxes and measure diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index dd018e49b..b7ba71594 100644 --- a/tex/context/base/mkiv/cont-new.mkiv +++ b/tex/context/base/mkiv/cont-new.mkiv @@ -13,7 +13,7 @@  % \normalend % uncomment this to get the real base runtime -\newcontextversion{2020.11.05 15:20} +\newcontextversion{2020.11.05 22:57}  %D This file is loaded at runtime, thereby providing an excellent place for hacks,  %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index a6e6f217e..18940ee57 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -45,7 +45,7 @@  %D {YYYY.MM.DD HH:MM} format.  \edef\contextformat {\jobname} -\edef\contextversion{2020.11.05 15:20} +\edef\contextversion{2020.11.05 22:57}  %D Kind of special: diff --git a/tex/context/base/mkiv/context.mkxl b/tex/context/base/mkiv/context.mkxl index 88959faa9..f2f29738d 100644 --- a/tex/context/base/mkiv/context.mkxl +++ b/tex/context/base/mkiv/context.mkxl @@ -29,7 +29,7 @@  %D {YYYY.MM.DD HH:MM} format.  \edef\contextformat {\jobname} -\edef\contextversion{2020.11.05 15:20} +\edef\contextversion{2020.11.05 22:57}  %overloadmode 1 % check frozen / warning  %overloadmode 2 % check frozen / error @@ -132,7 +132,7 @@  %D \doifelsefileexists{l-macro-imp-codes-luametatex.lua}{\registerctxluafile{l-macro-imp-codes-luametatex}{}}{}  %D \stoptyping -\loadmarkfile{supp-dir} +\loadmkxlfile{supp-dir}  \loadmkxlfile{char-utf}  \loadmkxlfile{char-ini} @@ -229,7 +229,7 @@  \loadmarkfile{pack-cut}  \loadmkxlfile{lang-mis} -\loadmarkfile{lang-url} +\loadmkxlfile{lang-url}  \loadmarkfile{lang-def}  % \loadmkvifile{file-job} % why so late? @@ -253,7 +253,7 @@  \loadmklxfile{strc-ini}  \loadmarkfile{strc-tag} -\loadmarkfile{strc-doc} +\loadmkxlfile{strc-doc}  \loadmkxlfile{strc-num}  \loadmkxlfile{strc-mar}  \loadmkxlfile{strc-sbe} @@ -516,7 +516,7 @@  \loadmkxlfile{pack-com}  \loadmarkfile{typo-del} -\loadmarkfile{grph-trf} +\loadmkxlfile{grph-trf}  \loadmkxlfile{grph-inc}  \loadmarkfile{grph-fig}  \loadmarkfile{grph-raw} diff --git a/tex/context/base/mkiv/font-sty.mklx b/tex/context/base/mkiv/font-sty.mklx index 457217f8d..7dc3116f6 100644 --- a/tex/context/base/mkiv/font-sty.mklx +++ b/tex/context/base/mkiv/font-sty.mklx @@ -235,9 +235,9 @@      \letvalue{\??stylecheck\currentstyle}\relax      \edef\p_method{\styleparameter\c!method}%      \ifx\p_method\v!command -        \setuevalue{\e!start\currentstyle}{\font_styles_apply_start{\currentstyle}}% -        \setuevalue{\e!stop \currentstyle}{\font_styles_apply_stop}% -        \setuevalue        {\currentstyle}{\font_styles_apply_grouped{\currentstyle}}% no longer groupedcommand here +        \frozen\instance\setuevalue{\e!start\currentstyle}{\font_styles_apply_start{\currentstyle}}% +        \frozen\instance\setuevalue{\e!stop \currentstyle}{\font_styles_apply_stop}% +        \frozen\instance\setuevalue        {\currentstyle}{\font_styles_apply_grouped{\currentstyle}}% no longer groupedcommand here      \fi  \to \everydefinestyle diff --git a/tex/context/base/mkiv/grph-trf.mkiv b/tex/context/base/mkiv/grph-trf.mkiv index d1be7e1d7..d6a6acd78 100644 --- a/tex/context/base/mkiv/grph-trf.mkiv +++ b/tex/context/base/mkiv/grph-trf.mkiv @@ -234,20 +234,11 @@    {\ifdim\p_sx\onepoint=\onepoint\else\edef\p_width {\the\dimexpr\p_sx\d_grph_scale_wd}\fi     \ifdim\p_sy\onepoint=\onepoint\else\edef\p_height{\the\dimexpr\p_sy\d_grph_scale_ht}\fi} -\ifcase\contextlmtxmode +\def\grph_scale_rounded#1% +  {\expandafter\expandafter\expandafter\grph_scale_rounded_indeed +     \expandafter\WITHOUTPT\the\dimexpr#1\points*100+32768\scaledpoint\relax.\relax} -    \def\grph_scale_rounded#1% -      {\expandafter\expandafter\expandafter\grph_scale_rounded_indeed -         \expandafter\WITHOUTPT\the\dimexpr#1\points*100+32768\scaledpoint\relax.\relax} - -    \def\grph_scale_rounded_indeed#1.#2\relax{#1} - -\else - -    \def\grph_scale_rounded#1% -      {\thewithoutunit\dimexpr#1\points*100+32768\scaledpoint\relax} - -\fi +\def\grph_scale_rounded_indeed#1.#2\relax{#1}  \def\grph_scale_calculations_nop    {\settrue\c_grph_scale_done diff --git a/tex/context/base/mkiv/grph-trf.mkxl b/tex/context/base/mkiv/grph-trf.mkxl new file mode 100644 index 000000000..0a423bd6b --- /dev/null +++ b/tex/context/base/mkiv/grph-trf.mkxl @@ -0,0 +1,1011 @@ +%D \module +%D   [       file=grph-trf, +%D        version=2006.08.26, % overhaul/split of 1997.03.31 core-fig +%D          title=\CONTEXT\ Graphic Macros, +%D       subtitle=Transformations, +%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 Graphic Macros / Transformations} + +\unprotect + +%D We probably use too many dimens as the width calculations can go away. Some of +%D this is an inheritance of limited backends (some supported fractions, some +%D 1000's, some dimentions) so we calculate all of them. Nowadays scaling is always +%D available so we could simplify the code. On the other hand, we now get some extra +%D values for free. +%D +%D We could move the calculations to \LUA\ and clean up this lot anyway. On the +%D other hand, there is some danger of messing up so it has a real low priority. + +\registerctxluafile{grph-trf}{} + +% local: + +\newdimen\d_grph_scale_x_size +\newdimen\d_grph_scale_y_size +\newdimen\d_grph_scale_x_offset +\newdimen\d_grph_scale_y_offset + +\newdimen\d_grph_scale_h_size +\newdimen\d_grph_scale_v_size + +\newconditional\c_grph_scale_done +\newconditional\c_grph_scale_scaling_done +\newconditional\c_grph_scale_limit_factors \settrue\c_grph_scale_limit_factors + +\newconditional\c_grph_scale_swap_factor + +\newdimen\d_grph_scale_wd +\newdimen\d_grph_scale_ht +\newdimen\d_grph_scale_dp + +% global + +\newdimen\d_grph_scale_used_x_size +\newdimen\d_grph_scale_used_y_size + +\newcount\c_grph_scale_used_x_scale +\newcount\c_grph_scale_used_y_scale + +\let     \m_grph_scale_used_x_scale\!!plusone +\let     \m_grph_scale_used_y_scale\!!plusone + +\newdimen\d_grph_scale_outer_v_size % we cannot manipulate any global vsize ! + +% scratch: + +\let\m_grph_scale_temp  \empty +\let\m_grph_scale_temp_x\empty +\let\m_grph_scale_temp_y\empty + +% public: + +\let\finalscaleboxxscale \!!plusone +\let\finalscaleboxyscale \!!plusone +\let\finalscaleboxwidth  \!!zeropoint +\let\finalscaleboxheight \!!zeropoint + +% we can let sx/sy win (first check) + +\installcorenamespace{scale} +\installcorenamespace{scalegrid} +\installcorenamespace{scalenorm} +\installcorenamespace{scalefact} + +\installcommandhandler \??scale {scale} \??scale % we can have instances + +\setupscale +  [\c!sx=\scaleparameter\c!s, +   \c!sy=\scaleparameter\c!s, +   \c!s=1, +  %\c!scale=, +  %\c!xscale=, +  %\c!yscale=, +  %\c!width=, +  %\c!height=, +  %\c!lines=, +  %\c!factor=, +  %\c!hfactor=, +  %\c!wfactor=, +  %\c!grid=, +  %\c!equalwidth=, +  %\c!equalheight=, +   \c!maxwidth=\scaleparameter\c!width, +   \c!maxheight=\scaleparameter\c!height] + +\permanent\tolerant\protected\def\scale[#1]#*[#2]% +  {\bgroup +   % this is quite common so we might make this a helper +   \ifarguments +     \let\currentscale\empty +   \or +     \ifhastok={#1}% +       \let\currentscale\empty +       \setupcurrentscale[#1]% +     \else +       \edef\currentscale{#1}% +     \fi +   \or +     \edef\currentscale{#1}% +     \setupcurrentscale[#2]% +   \fi +   % +   \dowithnextboxcs\grph_scale_finish\hbox} + +\def\grph_scale_finish +  {% todo: p_scale_ +   \edef\p_scale      {\scaleparameter\c!scale      }% +   \edef\p_xscale     {\scaleparameter\c!xscale     }% +   \edef\p_yscale     {\scaleparameter\c!yscale     }% +   \edef\p_width      {\scaleparameter\c!width      }% +   \edef\p_height     {\scaleparameter\c!height     }% +   \edef\p_depth      {\scaleparameter\c!depth      }% +   \edef\p_lines      {\scaleparameter\c!lines      }% +   \edef\p_factor     {\scaleparameter\c!factor     }% +   \edef\p_hfactor    {\scaleparameter\c!hfactor    }% +   \edef\p_wfactor    {\scaleparameter\c!wfactor    }% + % \edef\p_grid       {\scaleparameter\c!grid       }% used once +   \edef\p_maxwidth   {\scaleparameter\c!maxwidth   }% +   \edef\p_maxheight  {\scaleparameter\c!maxheight  }% +   \edef\p_sx         {\scaleparameter\c!sx         }% +   \edef\p_sy         {\scaleparameter\c!sy         }% +   \edef\p_equalwidth {\scaleparameter\c!equalwidth }% +   \edef\p_equalheight{\scaleparameter\c!equalheight}% +   % +   \d_grph_scale_dp\dp\nextbox +   \ifx\p_depth\v!no \ifzeropt\d_grph_scale_dp \else +     \setbox\nextbox\naturalhpack{\raise\d_grph_scale_dp\box\nextbox}% new +     \d_grph_scale_dp\dp\nextbox +   \fi \fi +   \d_grph_scale_wd\wd\nextbox +   \d_grph_scale_ht\ht\nextbox +   \d_grph_scale_dp\dp\nextbox +   % +   \glet\finalscaleboxxscale \!!plusone +   \glet\finalscaleboxyscale \!!plusone +   \xdef\finalscaleboxwidth {\the\d_grph_scale_wd}% +   \xdef\finalscaleboxheight{\the\d_grph_scale_ht}% +   % +   \forgetall +   \dontcomplain +   % +   \setfalse\c_grph_scale_done +   \grph_scale_calculate +   \ifconditional\c_grph_scale_done +     \grph_scale_apply +   \fi +   \grph_scale_position +   % +   \box\nextbox +   \egroup} + +\def\grph_scale_apply +  {\d_grph_scale_wd\finalscaleboxxscale\d_grph_scale_wd +   \d_grph_scale_ht\finalscaleboxyscale\d_grph_scale_ht +   \d_grph_scale_dp\finalscaleboxyscale\d_grph_scale_dp +   \ifdim\d_grph_scale_wd=\wd\nextbox +     \ifdim\d_grph_scale_ht=\ht\nextbox +       \ifdim\d_grph_scale_dp=\dp\nextbox +        % \grph_scale_apply_nop +       \else +          \grph_scale_apply_yes +       \fi +     \else +       \grph_scale_apply_yes +     \fi +   \else +     \grph_scale_apply_yes +   \fi} + +\def\grph_scale_apply_yes +  {\setbox\nextbox\naturalhpack +     {\dostartscaling \finalscaleboxxscale \finalscaleboxyscale +      \smashedbox\nextbox +      \dostopscaling}% +   \wd\nextbox\d_grph_scale_wd +   \ht\nextbox\d_grph_scale_ht +   \dp\nextbox\d_grph_scale_dp} + +\def\m_grph_scale_stamp_c{11} + +\def\grph_scale_calculate +  {\ifdim\d_grph_scale_ht>\zeropoint \ifdim\d_grph_scale_wd>\zeropoint +     \edef\m_grph_scale_stamp_a{\p_scale\p_xscale\p_yscale\p_factor\p_wfactor\p_hfactor\p_lines\p_width\p_height}% +     \edef\m_grph_scale_stamp_b{\p_sx\p_sy}% +     \ifempty\m_grph_scale_stamp_a +       \ifx\m_grph_scale_stamp_b\m_grph_scale_stamp_c +         % no scaling, don't change this (previous attempts failed anyway) +         \insidefloattrue % trick +         \grph_scale_calculations_yes +       \else +         \grph_scale_check_sx_sy +         \grph_scale_calculations_nop +       \fi +     \else +       \ifempty\m_grph_scale_stamp_b +         % no need to check further +       \else +         \grph_scale_check_sx_sy +       \fi +       \grph_scale_calculations_yes +     \fi +   \fi \fi} + +\def\grph_scale_check_sx_sy +  {\ifdim\p_sx\onepoint=\onepoint\else\edef\p_width {\the\dimexpr\p_sx\d_grph_scale_wd}\fi +   \ifdim\p_sy\onepoint=\onepoint\else\edef\p_height{\the\dimexpr\p_sy\d_grph_scale_ht}\fi} + +\def\grph_scale_rounded#1% +  {\thewithoutunit\dimexpr#1\points*100+32768\scaledpoint\relax} + +\def\grph_scale_calculations_nop +  {\settrue\c_grph_scale_done +   \xdef\finalscaleboxwidth {\the\dimexpr\p_sx\d_grph_scale_wd\relax}% +   \xdef\finalscaleboxheight{\the\dimexpr\p_sy\d_grph_scale_ht\relax}% +   \glet\finalscaleboxxscale\p_sx +   \glet\finalscaleboxyscale\p_sy +   \ifempty\finalscaleboxxscale\let\finalscaleboxxscale\!!plusone\fi +   \ifempty\finalscaleboxyscale\let\finalscaleboxyscale\!!plusone\fi} + +\let\grph_scale_calculations_report\relax + +\def\grph_scale_calculations_yes +  {\settrue\c_grph_scale_done +   % initial values +   \d_grph_scale_x_offset\zeropoint +   \d_grph_scale_y_offset\zeropoint +   \d_grph_scale_x_size  \d_grph_scale_wd +   \d_grph_scale_y_size  \d_grph_scale_ht % alleen ht wordt geschaald! +   % final values +   \global\d_grph_scale_used_x_size \zeropoint % see note * (core-fig) +   \global\d_grph_scale_used_y_size \zeropoint % see note * (core-fig) +   \c_grph_scale_used_x_scale       \plusone   % see note * (core-fig) +   \c_grph_scale_used_y_scale       \plusone   % see note * (core-fig) +   \let\m_grph_scale_used_x_scale   \!!plusone +   \let\m_grph_scale_used_y_scale   \!!plusone +   % preparations +   \setfalse\c_grph_scale_scaling_done +   \grph_scale_check_parameters +   % calculators +   % beware, they operate in sequence, and calculate missing dimensions / messy +   % grph_scale_by_nature % when? needed? +   \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_factor   \fi +   \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_scale    \fi +   \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_dimension\fi +   % used in actual scaling +   \xdef\finalscaleboxwidth  {\the\d_grph_scale_used_x_size}% +   \xdef\finalscaleboxheight {\the\d_grph_scale_used_y_size}% +   \glet\finalscaleboxxscale \m_grph_scale_used_x_scale +   \glet\finalscaleboxyscale \m_grph_scale_used_y_scale +   \grph_scale_calculations_report} + +\setvalue{\??scalegrid\v!yes     }{\getnoflines   \d_grph_scale_used_y_size\edef\p_height{\the\noflines\lineheight}} +\setvalue{\??scalegrid\v!height  }{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight+\strutdepth}} +\setvalue{\??scalegrid\v!depth   }{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight-\strutdepth}} +\setvalue{\??scalegrid\v!halfline}{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight+.5\lineheight}} +\setvalue{\??scalegrid\v!fit     }{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\noflines\lineheight}} +\letvalue{\??scalegrid\empty     }\donothing + +\def\grph_scale_check_parameters % resolve self referencing loops +  {\ifempty\p_maxwidth \else \edef\p_maxwidth {\the\dimexpr\p_maxwidth        }\fi +   \ifempty\p_maxheight\else \edef\p_maxheight{\the\dimexpr\p_maxheight       }\fi +   \ifempty\p_lines    \else \edef\p_height   {\the\dimexpr\p_lines\lineheight}\fi +   \csname\??scalegrid\scaleparameter\c!grid\endcsname} + +\def\grph_scale_by_nature % where ! ! ! ! ! +  {\ifempty\p_width \else \global\d_grph_scale_used_x_size\p_width \fi +   \ifempty\p_height\else \global\d_grph_scale_used_y_size\p_height\fi +   \ifempty\p_scale \else        \c_grph_scale_used_x_scale\p_scale +                                 \c_grph_scale_used_y_scale\p_scale \fi +   \ifempty\p_xscale\else        \c_grph_scale_used_x_scale\p_xscale\fi +   \ifempty\p_yscale\else        \c_grph_scale_used_y_scale\p_yscale\fi} + +% \defineexternalfigure[width-6][factor=auto,maxwidth=\textheight,maxheight=\textwidth] +% \defineexternalfigure[width-7][factor=auto,maxwidth=\textwidth,maxheight=\textheight] +% \placefigure{none}{\rotate[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-6]}} \page +% \placefigure{none}{\framed[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-7]}} + +%D The \typpe {min} option makes sure that the smallest available space determines +%D the max size (so we can get a bleed on the other axis): +%D +%D \startlinecorrection +%D \startcombination[nx=2,ny=2,distance=4cm] +%D     {\externalfigure[hacker][factor=max,maxwidth=6cm,maxheight=6cm]} {} +%D     {\externalfigure[mill]  [factor=max,maxwidth=6cm,maxheight=6cm]} {} +%D     {\externalfigure[hacker][factor=min,maxwidth=6cm,maxheight=6cm]} {} +%D     {\externalfigure[mill]  [factor=min,maxwidth=6cm,maxheight=6cm]} {} +%D \stopcombination +%D \stoplinecorrection + +\def\m_grph_scale_factor_set{\v!min,\v!max,\v!fit,\v!broad,\v!auto} % can be an \edef + +\def\grph_scale_by_factor +  {\doifelseinset\p_factor\m_grph_scale_factor_set +     \grph_scale_by_factor_a +     {\doifelseinset\p_hfactor\m_grph_scale_factor_set +        \grph_scale_by_factor_b +        {\doifelseinset\p_wfactor\m_grph_scale_factor_set +           \grph_scale_by_factor_c +           \grph_scale_by_factor_d}}} + +\def\grph_scale_by_factor_a +  {\grph_scale_apply_size +   \ifdim\d_grph_scale_x_size >\d_grph_scale_y_size +     \grph_scale_calculate_norm  \d_grph_scale_used_x_size\p_factor\p_maxwidth\hsize\d_grph_scale_h_size +     \grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size +     \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size +   \else +     \grph_scale_calculate_norm  \d_grph_scale_used_y_size\p_factor\p_maxheight\d_grph_scale_outer_v_size\d_grph_scale_v_size +     \grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size +     \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size +   \fi +   \grph_scale_by_factor_indeed} + +\def\grph_scale_by_factor_b +  {\grph_scale_apply_size +   \grph_scale_calculate_norm  \d_grph_scale_used_y_size\p_hfactor\p_maxheight\d_grph_scale_outer_v_size\d_grph_scale_v_size +   \grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size +   \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size +   \grph_scale_by_factor_indeed} + +\def\grph_scale_by_factor_c +  {\grph_scale_apply_size +   \grph_scale_calculate_norm  \d_grph_scale_used_x_size\p_wfactor\p_maxwidth\hsize\d_grph_scale_h_size +   \grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size +   \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size +   \grph_scale_by_factor_indeed} + +\def\grph_scale_by_factor_d +  {\grph_scale_calculate_norm\d_grph_scale_used_y_size\p_factor \p_height \textheight\d_grph_scale_v_size +   \grph_scale_calculate_norm\d_grph_scale_used_y_size\p_hfactor\p_height \textheight\d_grph_scale_v_size +   \grph_scale_calculate_norm\d_grph_scale_used_x_size\p_wfactor\p_width  \hsize     \hsize} + +\def\grph_scale_by_factor_indeed +  {\grph_scale_calculate_fact\p_factor +   \settrue\c_grph_scale_scaling_done +   \ifconditional\c_grph_scale_limit_factors +     \ifdim\d_grph_scale_used_x_size\ifconditional\c_grph_scale_swap_factor<\else>\fi\d_grph_scale_h_size +       \global\d_grph_scale_used_y_size\zeropoint +       \global\d_grph_scale_used_x_size\d_grph_scale_h_size +     \orelse\ifdim\d_grph_scale_used_y_size\ifconditional\c_grph_scale_swap_factor<\else>\fi\d_grph_scale_v_size +       \global\d_grph_scale_used_x_size\zeropoint +       \global\d_grph_scale_used_y_size\d_grph_scale_v_size +     \fi +   \fi +   \grph_scale_by_dimension} + +\def\grph_scale_by_scale +  {\edef\m_grph_scale_temp{\p_scale\p_xscale\p_yscale}% +   \ifempty\m_grph_scale_temp \else +     \grph_scale_apply_scale\m_grph_scale_used_x_scale\p_xscale +     \grph_scale_apply_scale\m_grph_scale_used_y_scale\p_yscale +   % \global\d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size\relax % no global needed here +   % \global\d_grph_scale_used_y_size\m_grph_scale_used_y_scale\d_grph_scale_y_size\relax % no global needed here +     % wrong: we need to recalculate the scale +     \global\d_grph_scale_used_x_size\zeropoint +     \global\d_grph_scale_used_y_size\zeropoint +     % +     \ifempty\p_maxwidth +       \ifempty\p_maxheight +       \else +         \ifdim\d_grph_scale_y_size>\p_maxheight\relax +           \global\d_grph_scale_used_y_size\p_maxheight +         \fi +       \fi +     \else +       \ifdim\d_grph_scale_x_size>\p_maxwidth\relax +          \global\d_grph_scale_used_x_size\p_maxwidth +       \fi +     \fi +   \fi} + +\def\grph_scale_by_dimension +  {\ifdim\d_grph_scale_used_x_size>\zeropoint +     \ifdim\d_grph_scale_used_y_size>\zeropoint +       \grph_scale_by_dimension_a +     \else +       \grph_scale_by_dimension_b +     \fi +   \else +     \ifdim\d_grph_scale_used_y_size>\zeropoint +       \grph_scale_by_dimension_c +     \else +       \grph_scale_by_dimension_d +     \fi +   \fi} + +\def\grph_scale_by_dimension_a +  {\grph_scale_by_dimension_indeed +     {\grph_scale_calculate_scale\m_grph_scale_used_y_scale\d_grph_scale_used_y_size\d_grph_scale_y_size +      \grph_scale_calculate_scale\m_grph_scale_used_x_scale\d_grph_scale_used_x_size\d_grph_scale_x_size}% +     {\grph_scale_calculate_scale\m_grph_scale_used_y_scale\d_grph_scale_used_y_size\d_grph_scale_y_size +      \grph_scale_calculate_scale\m_grph_scale_used_x_scale\d_grph_scale_used_x_size\d_grph_scale_x_size}% +     {\grph_scale_calculate_scale\m_grph_scale_used_y_scale\d_grph_scale_used_y_size\d_grph_scale_y_size +      \grph_scale_calculate_scale\m_grph_scale_used_x_scale\d_grph_scale_used_x_size\d_grph_scale_x_size}} + +\def\grph_scale_by_dimension_b +  {\grph_scale_by_dimension_indeed +     {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size +      \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}% +     {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size +      \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}% +     {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size +      \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}} + +\def\grph_scale_by_dimension_c +  {\grph_scale_by_dimension_indeed % weird .. three same cases +     {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size +      \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}% +     {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size +      \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}% +     {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size +      \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}} + +\def\grph_scale_by_dimension_d +  {\grph_scale_by_dimension_indeed +     {\grph_scale_apply_scale\m_grph_scale_used_x_scale\p_xscale +      \grph_scale_apply_scale\m_grph_scale_used_y_scale\p_yscale +      \global\d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size +      \global\d_grph_scale_used_y_size\m_grph_scale_used_y_scale\d_grph_scale_y_size}% +     {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size +      \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}% +     {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size +      \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}} + +\def\grph_scale_by_dimension_indeed#1#2#3% +  {#1\relax +   \ifempty\p_maxwidth \else +     \ifdim\d_grph_scale_used_x_size>\p_maxwidth\relax +       \global\d_grph_scale_used_x_size\p_maxwidth +       #2\relax +     \fi +   \fi +   \ifempty\p_maxheight \else +     \ifdim\d_grph_scale_used_y_size>\p_maxheight\relax +       \global\d_grph_scale_used_y_size\p_maxheight +        #3\relax +     \fi +   \fi} + +\def\grph_scale_calculate_norm#1#2% todo: swap 1 and 2 and pass one less +  {\csname\??scalenorm\ifcsname\??scalenorm#2\endcsname#2\else\s!unknown\fi\endcsname#1#2} + +\def\grph_scale_calculate_fact#1% +  {\csname\??scalefact\ifcsname\??scalefact#1\endcsname#1\else\s!unknown\fi\endcsname} + +%setvalue{\??scalenorm\v!min    }#1#2#3#4#5{\global#1#4} +\setvalue{\??scalenorm\v!max    }#1#2#3#4#5{\global#1#4} +\setvalue{\??scalenorm\v!fit    }#1#2#3#4#5{\global#1#5} +\setvalue{\??scalenorm\v!broad  }#1#2#3#4#5{\global#1\dimexpr#5-4\externalfigureparameter\c!bodyfont\relax} +\setvalue{\??scalenorm\s!unknown}#1#2#3#4#5{\global#1\dimexpr#2\dimexpr\externalfigureparameter\c!bodyfont/10\relax\relax} % brr ex +\setvalue{\??scalenorm\v!auto   }#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} +\setvalue{\??scalenorm\empty    }#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} +\setvalue{\??scalenorm\s!default}#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} + +\setvalue{\??scalefact\v!min    }{\global\settrue \c_grph_scale_swap_factor} +\setvalue{\??scalefact\s!unknown}{\global\setfalse\c_grph_scale_swap_factor} + +% \setvalue{\??scalenorm\v!min    }#1#2#3#4#5% an ugly hack +%   {\ifdim\d_grph_scale_used_x_size>\d_grph_scale_h_size +%      \d_grph_scale_used_y_size\vsize +%    \else +%      \d_grph_scale_used_x_size\hsize +%    \fi} + +\setvalue{\??scalenorm\v!min}#1#2#3#4#5% an ugly hack +  {\d_grph_scale_used_x_size\hsize +   \d_grph_scale_used_y_size\vsize} + +\def\grph_scale_calculate_scales#1#2% +  {\edef\m_grph_scale_used_x_scale{\luaexpr{\number#1/\number#2}}% +   \let\m_grph_scale_used_y_scale\m_grph_scale_used_x_scale} + +\def\grph_scale_calculate_scale#1#2#3% +  {\edef#1{\luaexpr{\number#2/\number#3}}} + +\def\grph_scale_apply_scale#1#2% #1 = parameter / scale can be empty +  {% no overflow +   \edef#1{\luaexpr +     {\number +      \ifx#2\empty +        \ifempty\p_scale            \plusthousand \else +        \ifnum  \p_scale=\zerocount \plusthousand \else +                                    \p_scale      \fi\fi +      \orelse\ifnum#2=\zerocount +        \ifempty\p_scale            \plusthousand \else +        \ifnum  \p_scale=\zerocount \plusthousand \else +                                    \p_scale      \fi\fi +      \else +                                    #2% +      \fi +      /1000}}} + +\def\grph_scale_apply_size +  {\ifempty\p_maxheight +     \d_grph_scale_outer_v_size\textheight +     \ifinner +       \d_grph_scale_outer_v_size \vsize % \textheight =\vsize +       \scratchdimen\vsize % \scratchdimen=\textheight +     \orelse\ifinsidefloat +       \d_grph_scale_outer_v_size \vsize % \textheight =\vsize +       \scratchdimen\vsize % \scratchdimen=\textheight +     \orelse\ifinpagebody +       \d_grph_scale_outer_v_size \vsize % \textheight =\vsize +       \scratchdimen\vsize % \scratchdimen=\textheight +     \orelse\ifdim\pagegoal<\maxdimen +       \ifdim\pagetotal<\pagegoal +         \scratchdimen\dimexpr\pagegoal-\pagetotal\relax +       \else +         \scratchdimen\d_grph_scale_outer_v_size % \textheight +       \fi +     \else +       \scratchdimen\d_grph_scale_outer_v_size % \textheight +     \fi +   \else +     \scratchdimen\p_maxheight +     \d_grph_scale_outer_v_size\scratchdimen +   \fi +   \ifempty\p_height +     \d_grph_scale_v_size\scratchdimen +   \else +     \d_grph_scale_v_size\p_height +   \fi +   \ifempty\p_width +     \d_grph_scale_h_size\hsize +   \else +     \d_grph_scale_h_size\p_width +   \fi} + +% \startcombination +%     {\externalfigure[cow.pdf] [frame=on,height=3cm,equalwidth=6cm]} {a cow} +%     {\externalfigure[mill.png][frame=on,height=3cm,equalwidth=6cm]} {a mill} +% \stopcombination + +\def\grph_scale_position +  {\ifempty\p_equalwidth \else +    \scratchdimen\p_equalwidth\relax +    \ifdim\d_grph_scale_wd<\scratchdimen +      \setbox\nextbox\naturalhpack to \scratchdimen{\hss\box\nextbox\hss}% +    \fi +   \fi +   \ifempty\p_equalheight \else +     \scratchdimen\p_equalheight\relax +     \ifdim\d_grph_scale_ht<\scratchdimen +       \setbox\nextbox\naturalvpack to \scratchdimen{\vss\box\nextbox\vss}% +     \fi +   \fi} + +\permanent\protected\def\fastscale#1% +  {\ifnum#1=1000\relax +     \expandafter\grph_scale_fast_nop +   \else +     \expandafter\grph_scale_fast_yes +   \fi{#1}} + +\def\grph_scale_fast_nop#1% +  {\hbox} + +\def\grph_scale_fast_yes#1% +  {\edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1\onepoint/1000\relax}% brrr +   \let\finalscaleboxyscale\finalscaleboxxscale +   \dowithnextboxcs\grph_scale_fast_finish\hbox} + +\def\grph_scale_fast_finish +  {\grph_scale_apply +   \box\nextbox +   \endgroup} + +\permanent\protected\def\fastsxsy#1#2% +  {\bgroup +   \edef\p_sx{#1}% +   \edef\p_sy{#2}% +   \dowithnextboxcs\grph_scale_fast_sx_xy_finish\hbox} + +\def\grph_scale_fast_sx_xy_finish +  {\grph_scale_check_sx_sy +   \d_grph_scale_wd\wd\nextbox +   \d_grph_scale_ht\ht\nextbox +   \d_grph_scale_dp\dp\nextbox +   \grph_scale_calculations_nop +   \grph_scale_apply +   \box\nextbox +   \egroup} + +%D \macros +%D   {clip, setupclipping} +%D +%D Although related to figures, clipping can be applied to arbitrary content. We can +%D use \METAPOST\ to provide a non rectangular clipping path. +%D +%D \starttyping +%D \startMPclip{fun} +%D   clip currentpicture to fullcircle +%D     shifted (.5,.5) xscaled \width yscaled \height ; +%D \stopMPclip +%D \stoptyping +%D +%D We get a rectangular piece of the figure when we say: +%D +%D \starttyping +%D \clip[x=2,y=1]{\externalfigure[photo]} +%D \stoptyping +%D +%D When we want to clip to the oval we defined a few lines ago, we say: +%D +%D \starttyping +%D \clip[nx=1,ny=1,x=1,y=1,mp=fun]{\externalfigure[photo]} +%D \stoptyping +%D +%D The general characteristics of clipping can be set up with +%D +%D \showsetup{setupclipping} + +\installcorenamespace{clipping} + +\installdirectcommandhandler \??clipping {clipping} + +\permanent\tolerant\protected\def\clip[#1]% nb top->bottom left->right +  {\bgroup +   \ifparameter#1\or +     \setupcurrentclipping[#1]% +   \fi +   \dowithnextboxcs\grph_clip_finish\hbox} + +\def\grph_clip_finish +  {\doifelse{\clippingparameter\c!state}\v!start +     \grph_clip_yes_finish +     \grph_clip_nop_finish} + +\def\grph_clip_yes_finish +  {\ifdim\clippingparameter\c!width>\zeropoint +     \scratchwidth  \clippingparameter\c!width +     \scratchxoffset\clippingparameter\c!hoffset +   \else +     \scratchwidth\dimexpr\wd\nextbox/\clippingparameter\c!nx\relax +     \scratchxoffset\dimexpr\clippingparameter\c!x\scratchwidth-\scratchwidth\relax +     \scratchwidth\clippingparameter\c!sx\scratchwidth +   \fi +   \relax % sure +   \ifdim\clippingparameter\c!height>\zeropoint +     \scratchheight\clippingparameter\c!height +     \scratchyoffset\dimexpr\ht\nextbox-\clippingparameter\c!voffset-\scratchheight\relax +   \else +     \scratchheight\dimexpr\ht\nextbox/\clippingparameter\c!ny\relax +     \scratchyoffset\dimexpr-\clippingparameter\c!y\scratchheight-\clippingparameter\c!sy\scratchheight+\scratchheight\relax +     \scratchheight\clippingparameter\c!sy\scratchheight +     \advance\scratchyoffset \ht\nextbox +   \fi +   \setbox\nextbox\naturalhpack +     {\advance\scratchxoffset -\clippingparameter\c!leftoffset  \relax +      \advance\scratchyoffset -\clippingparameter\c!bottomoffset\relax +      \hskip-\scratchxoffset +      \lower\scratchyoffset +      \box\nextbox}% +   \wd\nextbox\zeropoint +   \ht\nextbox\zeropoint +   \dp\nextbox\zeropoint +   \setbox\nextbox\naturalhpack +     {\advance\scratchwidth \dimexpr\clippingparameter\c!leftoffset  +\clippingparameter\c!rightoffset\relax +      \advance\scratchheight\dimexpr\clippingparameter\c!bottomoffset+\clippingparameter\c!topoffset  \relax +      \dostartclipping{\clippingparameter\c!mp}\scratchwidth\scratchheight +        \box\nextbox +      \dostopclipping}% +   \setbox\nextbox\naturalhpack +     {\hskip-\clippingparameter\c!leftoffset +      \lower \clippingparameter\c!bottomoffset +      \box\nextbox}% +   \wd\nextbox\scratchwidth +   \ht\nextbox\scratchheight +   \dp\nextbox\zeropoint +   \box\nextbox +   \egroup} + +\def\grph_clip_nop_finish +  {\box\nextbox +   \egroup} + +\setupclipping +  [\c!state=\v!start, +   \c!n=\plusone, % was \plustwo +   \c!nx=\clippingparameter\c!n,\c!x=\plusone,\c!sx=\plusone, +   \c!ny=\clippingparameter\c!n,\c!y=\plusone,\c!sy=\plusone, +   \c!width=\zeropoint, +   \c!height=\zeropoint, +   \c!hoffset=\zeropoint, +   \c!voffset=\zeropoint, +   \c!offset=\zeropoint, +   \c!leftoffset=\clippingparameter\c!offset, +   \c!rightoffset=\clippingparameter\c!offset, +   \c!topoffset=\clippingparameter\c!offset, +   \c!bottomoffset=\clippingparameter\c!offset, +   \c!mp=] + +%D \startbuffer +%D \startuseMPgraphic{test} +%D   path p ; p := fullcircle scaled 4cm ; +%D   draw p withpen pencircle scaled 1cm ; +%D   setbounds currentpicture to boundingbox p ; +%D \stopuseMPgraphic +%D +%D \hbox to \hsize \bgroup +%D   \hss +%D   \ruledhbox{\useMPgraphic{test}}% +%D   \hss +%D   \ruledhbox{\clip{\useMPgraphic{test}}}% +%D   \hss +%D \egroup +%D \stopbuffer +%D +%D \typebuffer \getbuffer + +%D Mirroring. + +\permanent\protected\def\mirror +  {\bgroup +   \dowithnextboxcs\grph_mirror_finish\hbox} + +\def\grph_mirror_finish +  {\scratchdimen\wd\nextbox +   % better use an hbox (if no \forgetall, leftskip etc may creep in) +   %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\wd\nextbox\box\nextbox\dostopmirroring}% +   \setbox\nextbox\naturalhpack +     {\dostartmirroring +      \hskip-\wd\nextbox +      \box\nextbox +      \dostopmirroring}% +   \wd\nextbox\scratchdimen +   \box\nextbox +   \egroup} + +%D A couple of examples, demonstrating how the depth is taken care of: +%D +%D \startbuffer +%D test\rotate[frame=on, rotation=0]  {gans}% +%D test\rotate[frame=on, rotation=90] {gans}% +%D test\rotate[frame=on, rotation=180]{gans}% +%D test\rotate[frame=on, rotation=270]{gans}% +%D test +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D When we rotate over arbitrary angles, we need to relocate the resulting box +%D because rotation brings that box onto the negative axis. The calculations (mostly +%D sin and cosine) need to be tuned for the way a box is packages (i.e. the refence +%D point). A typical example of drawing, scribbling, and going back to the days of +%D school math. +%D +%D We do a bit more calculations than needed, simply because that way it's easier to +%D debug the code. + +\installcorenamespace {rotate} +\installcorenamespace {rotatelocation} +\installcorenamespace {rotatepreset} + +% todo: scratchcounters + +\newdimen\d_grph_rotate_x_size +\newdimen\d_grph_rotate_y_size +\newdimen\d_grph_rotate_x_offset +\newdimen\d_grph_rotate_y_offset +\newdimen\d_grph_rotate_x_position +\newdimen\d_grph_rotate_y_position + +\newdimen\d_grph_rotate_used_height + +\newdimen\d_grph_rotate_width +\newdimen\d_grph_rotate_height +\newdimen\d_grph_rotate_depth + +\newdimen\d_grph_rotate_saved_width +\newdimen\d_grph_rotate_saved_height +\newdimen\d_grph_rotate_saved_depth + +\newdimen\d_grph_rotate_new_width +\newdimen\d_grph_rotate_new_height +\newdimen\d_grph_rotate_new_depth + +\newconditional\c_grph_rotate_obey_depth +\newconditional\c_grph_rotate_not_fit +\newconditional\c_grph_rotate_center + +\installframedcommandhandler \??rotate {rotate} \??rotate + +\setuprotate +  [\c!rotation=90, +   \c!location=\v!normal, +   \c!width=\v!fit, +   \c!height=\v!fit, +   \c!offset=\v!overlay, +   \c!frame=\v!off] + +\let\p_rotation_location\empty +\let\p_rotation_rotation\empty + +\permanent\tolerant\protected\def\rotate[#1]% \bgroup: \rotate kan argument zijn +  {\bgroup +   \ifparameter#1\or +     \setupcurrentrotate[#1]% +   \fi +   \edef\p_rotation_location{\rotateparameter\c!location}% +   \edef\p_rotation_rotation{\rotateparameter\c!rotation}% +   \csname\??rotatelocation +     \ifcsname\??rotatelocation\p_rotation_location\endcsname\p_rotation_location\else\v!default\fi +   \endcsname} + +\def\grph_rotate_framed +  {\resetrotateparameter\c!location +   \dowithnextboxcs\grph_rotate_finish\vbox +   \inheritedrotateframed} + +\def\grph_rotate_normal +  {\dowithnextboxcs\grph_rotate_finish\vbox} + +\def\grph_rotate_finish +  {\grph_rotate_finish_indeed +   \egroup} + +\setvalue{\??rotatelocation\v!depth}% +  {\setfalse\c_grph_rotate_not_fit +   \setfalse\c_grph_rotate_center +   \settrue \c_grph_rotate_obey_depth +   \grph_rotate_normal} + +\setvalue{\??rotatelocation\v!fit}% +  {\settrue \c_grph_rotate_not_fit +   \setfalse\c_grph_rotate_center +   \settrue \c_grph_rotate_obey_depth +   \grph_rotate_normal} + +\setvalue{\??rotatelocation\v!broad}% +  {\setfalse\c_grph_rotate_not_fit +   \setfalse\c_grph_rotate_center +   \setfalse\c_grph_rotate_obey_depth +   \grph_rotate_normal} + +\setvalue{\??rotatelocation\v!high}% +  {\setfalse\c_grph_rotate_not_fit +   \setfalse\c_grph_rotate_center +   \setfalse\c_grph_rotate_obey_depth +   \grph_rotate_framed} + +\setvalue{\??rotatelocation\v!middle}% +  {\setfalse\c_grph_rotate_not_fit +   \settrue \c_grph_rotate_center +   \setfalse\c_grph_rotate_obey_depth  % hm, depth ? +   \grph_rotate_normal} + +\setvalue{\??rotatelocation\v!default}% +  {\setfalse\c_grph_rotate_not_fit +   \setfalse\c_grph_rotate_center +   \settrue \c_grph_rotate_obey_depth +   \grph_rotate_framed} + +\protected\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop % a fast low level one +  {\ifcase#1\relax +     \expandafter\gobbleoneargument +   \else +     \expandafter\grph_rotate_box +   \fi{#1}} + +\def\grph_rotate_box#1% {angle} \hbox/\vbox/\vtop +  {\bgroup +   \hbox\bgroup % compatibility hack +     \edef\p_rotation_rotation{#1}% +     \dowithnextboxcs\grph_rotate_finish_box} + +\def\grph_rotate_finish_box +  {\setfalse\c_grph_rotate_not_fit      % this is the same as broad but +   \setfalse\c_grph_rotate_center       % without the following grab as +   \setfalse\c_grph_rotate_obey_depth   % we call finish directly +   \grph_rotate_finish_indeed +   \egroup +   \egroup} + +\def\grph_rotate_finish_indeed +  {\naturalhpack\bgroup +     \ifempty\p_rotation_rotation +       \grph_rotate_finish_nop +     \else +       \grph_rotate_finish_yes +     \fi +   \egroup} + +\def\grph_rotate_finish_nop +  {\boxcursor\box\nextbox} + +\setvalue{\??rotatepreset\v!left}% +  {\edef\p_rotation_rotation{90}} + +\setvalue{\??rotatepreset\v!right}% +  {\edef\p_rotation_rotation{270}} + +\setvalue{\??rotatepreset\v!inner}% +  {\signalrightpage +   \doifelserightpage{\def\p_rotation_rotation{270}}{\def\p_rotation_rotation{90}}} + +\setvalue{\??rotatepreset\v!outer}% +  {\signalrightpage +   \doifelserightpage{\def\p_rotation_rotation{90}}{\def\p_rotation_rotation{270}}} + +\setvalue{\??rotatepreset\v!default}% +  {} + +\def\grph_rotate_finish_yes +  {\begincsname\??rotatepreset\p_rotation_rotation\endcsname +   \setbox\nextbox\naturalvpack{\box\nextbox}% not really needed +   \dontcomplain +   \ifconditional\c_grph_rotate_center +     \d_grph_rotate_saved_width \wd\nextbox +     \d_grph_rotate_saved_height\ht\nextbox +     \d_grph_rotate_saved_depth \dp\nextbox +     \setbox\nextbox\naturalhpack{\hskip-.5\wd\nextbox\lower.5\ht\nextbox\box\nextbox}% +     \smashbox\nextbox +   \fi +   % +   \d_grph_rotate_width \wd\nextbox +   \d_grph_rotate_height\ht\nextbox +   \d_grph_rotate_depth \dp\nextbox +   % +   \setbox\nextbox\naturalvpack{\naturalhpack{\raise\dp\nextbox\box\nextbox}}% can we do without +   % +   \d_grph_rotate_used_height\ht\nextbox +   % +   \clf_analyzerotate % rather accurate +     \p_rotation_rotation\space +     \d_grph_rotate_width +     \d_grph_rotate_height +     \d_grph_rotate_depth +     \d_grph_rotate_used_height +     \c_grph_rotate_not_fit +     \c_grph_rotate_obey_depth +   \relax +   % +   \setbox\nextbox\naturalvpack to \d_grph_rotate_y_size +     {\vfilll +      \naturalhpack to \d_grph_rotate_x_size +        {\dostartrotation\p_rotation_rotation +           \wd\nextbox\zeropoint +           \ht\nextbox\zeropoint +           \box\nextbox +         \dostoprotation +         \hfill}% +      \kern\d_grph_rotate_y_position}% +   % +   \setbox\nextbox\naturalhpack +     {\kern\dimexpr\d_grph_rotate_x_position+\d_grph_rotate_x_offset\relax +      \lower\d_grph_rotate_y_offset +      \box\nextbox}% +   % +   \ifconditional\c_grph_rotate_center +     \setbox\nextbox\naturalhpack{\hskip.5\d_grph_rotate_saved_width\lower-.5\d_grph_rotate_saved_height\box\nextbox}% +     \wd\nextbox\d_grph_rotate_saved_width +     \ht\nextbox\d_grph_rotate_saved_height +     \dp\nextbox\d_grph_rotate_saved_depth +   \else +     \wd\nextbox\d_grph_rotate_new_width +     \ht\nextbox\d_grph_rotate_new_height +     \dp\nextbox\d_grph_rotate_new_depth +   \fi +   % +   \boxcursor\box\nextbox} + +% \dostepwiserecurse{0}{360}{10} +%   {\startlinecorrection[blank] +%    \hbox +%      {\expanded{\setuprotate[rotation=\recurselevel]}% +%       \traceboxplacementtrue +%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=depth] {\ruledhbox{\bfb  (depth)}}}}% +%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=fit]   {\ruledhbox{\bfb    (fit)}}}}% +%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=broad] {\ruledhbox{\bfb  (broad)}}}}% +%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=normal]{\ruledhbox{\bfb (normal)}}}}% +%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=high]  {\ruledhbox{\bfb   (high)}}}}} +%    \stoplinecorrection} + +% \def\Test{\ruledhbox{% +%     \def\DemoX{\vl\kern.5\emwidth\vl}% +%     \kern\emwidth\ruledhpack{\green\rotate[rotation=20]  {\ruledhpack{\DemoX}}}% +%     \kern\emwidth\ruledhpack{\blue \rotate[rotation=0]   {\ruledhpack{\DemoX}}}% +%     \kern\emwidth\ruledhpack{\red  \rotate[rotation=-20] {\ruledhpack{\DemoX}}}% +%     \kern\emwidth\ruledhpack{\green\rotate[rotation=200] {\ruledhpack{\DemoX}}}% +%     \kern\emwidth\ruledhpack{\blue \rotate[rotation=180] {\ruledhpack{\DemoX}}}% +%     \kern\emwidth\ruledhpack{\red  \rotate[rotation=-200]{\ruledhpack{\DemoX}}}% +%     \kern\emwidth}} + +% \startTEXpage[offset=10pt,align=middle] +%     \setuprotate[location=fit]     \Test \par {\infofont\setstrut\strut fit}     \par +%     \setuprotate[location=depth]   \Test \par {\infofont\setstrut\strut depth}   \par +%     \setuprotate[location=broad]   \Test \par {\infofont\setstrut\strut broad}   \par +%     \setuprotate[location=high]    \Test \par {\infofont\setstrut\strut high}    \par +%     \setuprotate[location=middle]  \Test \par {\infofont\setstrut\strut middle}  \par +%     \setuprotate[location=default] \Test \par {\infofont\setstrut\strut default} \par +% \stopTEXpage + +\protect \endinput diff --git a/tex/context/base/mkiv/lang-url.mkiv b/tex/context/base/mkiv/lang-url.mkiv index c3ec02da4..8f1a979dc 100644 --- a/tex/context/base/mkiv/lang-url.mkiv +++ b/tex/context/base/mkiv/lang-url.mkiv @@ -47,19 +47,19 @@      \resetfontfeature      \resetcharacterspacing      % -    \enforced\let\&\letterampersand -    \enforced\let\#\letterhash -    \enforced\let\~\lettertilde -    \enforced\let\\\letterbackslash -    \enforced\let\$\letterdollar -    \enforced\let\^\letterhat -    \enforced\let\_\letterunderscore -    \enforced\let\{\letterleftbrace -    \enforced\let\}\letterrightbrace -    \enforced\let\|\letterbar -    \enforced\let~=\lettertilde -    \enforced\let|=\letterbar -    \enforced\let\Ux\eUx +    \let\&\letterampersand +    \let\#\letterhash +    \let\~\lettertilde +    \let\\\letterbackslash +    \let\$\letterdollar +    \let\^\letterhat +    \let\_\letterunderscore +    \let\{\letterleftbrace +    \let\}\letterrightbrace +    \let\|\letterbar +    \let~=\lettertilde +    \let|=\letterbar +    \let\Ux\eUx  \to \everyhyphenatedurl  \let\hyphenatedurlseparator    \empty % \periodcentered diff --git a/tex/context/base/mkiv/lang-url.mkxl b/tex/context/base/mkiv/lang-url.mkxl new file mode 100644 index 000000000..bb51f838a --- /dev/null +++ b/tex/context/base/mkiv/lang-url.mkxl @@ -0,0 +1,167 @@ +%D \module +%D   [       file=lang-url, +%D        version=2008.01.22, % used to be lang-mis +%D          title=\CONTEXT\ Language Macros, +%D       subtitle=Language Options, +%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. + +\registerctxluafile{lang-url}{} + +\unprotect + +%D Traditionally this code is in the language namespace as +%D hyphenation relates to languages. + +%D \macros +%D   {hyphenatedurl} +%D +%D For those who want to put full \URL's in a text, we offer +%D +%D \startbuffer +%D \hyphenatedurl{http://optimist.optimist/optimist/optimist.optimist#optimist} +%D \stopbuffer +%D +%D \typebuffer +%D +%D which breaks at the appropriate places. Watch the \type{#} +%D hack. +%D +%D When passed as argument, like in \type {\goto}, one needs +%D to substitute a \type {\\} for each \type{#}. +%D +%D \startbuffer +%D \hyphenatedurl{http://this.is.a.rather/strange/reference#indeed} +%D \stopbuffer +%D +%D \typebuffer + +\newtoks\everyhyphenatedurl + +\appendtoks +    \resetfontfeature +    \resetcharacterspacing +    % +    \enforced\let\&\letterampersand +    \enforced\let\#\letterhash +    \enforced\let\~\lettertilde +    \enforced\let\\\letterbackslash +    \enforced\let\$\letterdollar +    \enforced\let\^\letterhat +    \enforced\let\_\letterunderscore +    \enforced\let\{\letterleftbrace +    \enforced\let\}\letterrightbrace +    \enforced\let\|\letterbar +    \enforced\let~=\lettertilde +    \enforced\let|=\letterbar +    \enforced\let\Ux\eUx +\to \everyhyphenatedurl + +\let\hyphenatedurlseparator    \empty % \periodcentered +\let\hyphenatedurldiscretionary\empty + +\setnewconstant\hyphenatedurllefthyphenmin \plusthree +\setnewconstant\hyphenatedurlrighthyphenmin\plusthree + +\def\lang_url_more{\penalty\plustenthousand\hskip\scratchskipone\penalty\plustenthousand} +\def\lang_url_less{\penalty\plustenthousand\hskip\scratchskiptwo\penalty\plustenthousand} +\def\lang_url_trac{\penalty\plustenthousand\hsmash{\darkred\vl}\penalty\plustenthousand} + +\def\lang_url_a#1{\lang_url_more\char#1\lang_url_show\discretionary{}{\hyphenatedurlseparator}{}} +\def\lang_url_b#1{\lang_url_more\discretionary{\hyphenatedurlseparator}{}{}\lang_url_show\char#1\relax} +\def\lang_url_d  {\lang_url_more\discretionary{\lang_url_show}{\lang_url_show}{\lang_url_show}} +\def\lang_url_l#1{\lang_url_less\char#1\relax} +\def\lang_url_c#1{\lang_url_more\char#1\relax} +\def\lang_url_L#1{\lang_url_less\char#1\relax} +\def\lang_url_C#1{\lang_url_more\char#1\relax} + +\permanent\protected\def\showhyphenatedurlbreaks % for old times sake +  {\let\lang_url_show\lang_url_trac} + +\installtextracker +  {languages.url} +  {\let\lang_url_show\lang_url_trac} +  {\let\lang_url_show\relax} + +\let\lang_url_show\relax + +\permanent\protected\def\sethyphenatedurlnormal#1{\clf_sethyphenatedurlcharacters{#1}{\v!normal}} +\permanent\protected\def\sethyphenatedurlbefore#1{\clf_sethyphenatedurlcharacters{#1}{\v!before}} +\permanent\protected\def\sethyphenatedurlafter #1{\clf_sethyphenatedurlcharacters{#1}{\v!after }} + +% \sethyphenatedurlafter{ABCDEF} + +\permanent\protected\def\hyphenatedurl#1% +  {\dontleavehmode +   \begingroup +   \the\everyhyphenatedurl +   \normallanguage\zerocount % \nohyphens in mkiv +   \scratchskipone\zeropoint\s!plus\dimexpr\emwidth/12\s!minus\dimexpr\emwidth/24\relax % 1.00pt @ 12pt +   \scratchskiptwo\zeropoint\s!plus\dimexpr\emwidth/48\s!minus\dimexpr\emwidth/96\relax % 0.25pt @ 12pt +   \unprotect +   \normalexpanded{\noexpand\clf_hyphenatedurl +     {\noexpand\detokenize{#1}}% +     \hyphenatedurllefthyphenmin +     \hyphenatedurlrighthyphenmin +     {\hyphenatedurldiscretionary}% +   }% +   \protect +   \endgroup} + +%D \macros +%D   {hyphenatedfilename} +%D +%D For the moment we treat filenames in a similar way, +%D +%D \starttyping +%D \hyphenatedfilename{here/there/filename.suffix} +%D \stoptyping + +\ifx\hyphenatedfilename\undefined \aliased\let\hyphenatedfilename\hyphenatedurl \fi + +% \def\test#1% +%   {\dontleavehmode +%    \begingroup +%    \tttf +%    \hyphenatedurl {% +%      \letterampersand #1\letterampersand #1\letterampersand #1\letterampersand #1\letterampersand +%      \letterhash      #1\letterhash      #1\letterpercent   #1\letterslash     #1\letterampersand +%    }% +%    \endgroup} + +% \dorecurse{100}{\test{a} \test{ab} \test{abc} \test{abcd} \test{abcde} \test{abcdef}} + +\protect \endinput + +% \setuppapersize[A7] +% +% \protected\def\WhateverA#1% +%   {\dontleavehmode +%    \begingroup +%    \prehyphenchar"B7\relax +%    \setbox\scratchbox\hbox{\tttf#1}% +%    \prehyphenchar`-\relax +%    \unhbox\scratchbox +%    \endgroup} +% +% \protected\def\WhateverB#1% +%   {\dontleavehmode +%    \begingroup +%    \tttf +%    \prehyphenchar\minusone +%  % \localrightbox{\llap{_}}% +%    \localrightbox{\llap{\smash{\lower1.5ex\hbox{\char"2192}}}}% +%    \setbox\scratchbox\hbox{#1}% +%    \prehyphenchar`-\relax +%    \unhbox\scratchbox +%    \endgroup} +% +% \begingroup \hsize1cm +%   \WhateverA{thisisaboringandverylongcommand}\par +%   \WhateverB{thisisaboringandverylongcommand}\par +% \endgroup diff --git a/tex/context/base/mkiv/math-frc.mkxl b/tex/context/base/mkiv/math-frc.mkxl index 983704f74..485053fa5 100644 --- a/tex/context/base/mkiv/math-frc.mkxl +++ b/tex/context/base/mkiv/math-frc.mkxl @@ -18,11 +18,11 @@  %D I need to check it all again as there was a bug in luatex with dimensions that could  %D resulted in side effects that made me mess with spacing. -\unexpanded\def\topstrut{\vrule\s!width\zeropoint\s!height\strutht\s!depth\zeropoint\relax} -\unexpanded\def\botstrut{\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\strutdp\relax} +\permanent\protected\def\topstrut{\vrule\s!width\zeropoint\s!height\strutht\s!depth\zeropoint\relax} +\permanent\protected\def\botstrut{\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\strutdp\relax} -\unexpanded\def\mathtopstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\ht\scratchbox\s!depth\zeropoint\relax} -\unexpanded\def\mathbotstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\dp\scratchbox\relax} +\permanent\protected\def\mathtopstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\ht\scratchbox\s!depth\zeropoint\relax} +\permanent\protected\def\mathbotstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\dp\scratchbox\relax}  %D This module is reimplemented in \MKIV\ style. @@ -102,7 +102,7 @@  \installcommandhandler \??mathfractions {mathfraction} \??mathfractions -\let\setupmathfractions\setupmathfraction +\aliased\let\setupmathfractions\setupmathfraction  % color only applies to rule, use regular color for rest @@ -119,7 +119,7 @@     \c!rule=\v!auto]  \appendtoks -    \setuevalue{\currentmathfraction}{\math_frac{\currentmathfraction}}% +    \instance\setuevalue{\currentmathfraction}{\math_frac{\currentmathfraction}}%  \to \everydefinemathfraction  % Sometimes users want control over the distances: @@ -132,15 +132,15 @@  % why only displaystyle .. a bit weak -\unexpanded\def\math_fraction_set_distance_top +\protected\def\math_fraction_set_distance_top    {\Umathfractionnumup    \displaystyle\m_math_fraction_distance_top     \relax} -\unexpanded\def\math_fraction_set_distance_bot +\protected\def\math_fraction_set_distance_bot    {\Umathfractiondenomdown\displaystyle\m_math_fraction_distance_bot     \relax} -\unexpanded\def\math_fraction_set_distance_all +\protected\def\math_fraction_set_distance_all    {\Umathfractionnumup    \displaystyle\m_math_fraction_distance_top     \Umathfractiondenomdown\displaystyle\m_math_fraction_distance_bot     \relax} @@ -191,7 +191,7 @@  \newdimen\d_math_fraction_margin -\unexpanded\def\math_frac#1% +\protected\def\math_frac#1%    {\begingroup     \edef\currentmathfraction{#1}%     % @@ -217,18 +217,18 @@       \expandafter\math_frac_colored     \fi} -\unexpanded\def\math_frac_wrapup +\protected\def\math_frac_wrapup    {\ifempty\p_math_fraction_fences \else       \math_fenced_fenced_stop\p_math_fraction_fences     \fi     \endgroup} -\unexpanded\def\math_frac_colored#1#2% +\protected\def\math_frac_colored#1#2%    {\savecolor     \colo_helpers_activate\p_math_fractions_color     \math_frac_normal{\restorecolor#1}{\restorecolor#2}} -\unexpanded\def\math_frac_normal +\protected\def\math_frac_normal    {\expandnamespaceparameter\??mathfractionalternative\mathfractionparameter\c!alternative\v!inner}  % we use utfchar anyway so we can as well do all at the lua end @@ -359,20 +359,20 @@  \let\normalxfrac\xfrac -\unexpanded\def\xfrac#1#2{\normalxfrac{\let\xfrac\xxfrac#1}{\let\xfrac\xxfrac#2}} +\protected\def\xfrac#1#2{\normalxfrac{\let\xfrac\xxfrac#1}{\let\xfrac\xxfrac#2}}  %D Spacing (sensitive for definition of \triggermathstyle:  % \ifcase\contextlmtxmode -\unexpanded\def\nomathfractiongaps     {\normalexpanded{\math_no_fraction_gaps     \mathstyletrigger\mathstyle}} % maybe collect settings -\unexpanded\def\overlaymathfractiongaps{\normalexpanded{\math_overlay_fraction_gaps\mathstyletrigger\mathstyle}} % maybe collect settings +\permanent\protected\def\nomathfractiongaps     {\normalexpanded{\math_no_fraction_gaps     \mathstyletrigger\mathstyle}} % maybe collect settings +\permanent\protected\def\overlaymathfractiongaps{\normalexpanded{\math_overlay_fraction_gaps\mathstyletrigger\mathstyle}} % maybe collect settings -\unexpanded\def\math_no_fraction_gaps#1% +\protected\def\math_no_fraction_gaps#1%    {\Umathfractionnumup    #1\zeropoint     \Umathfractiondenomdown#1\zeropoint} -\unexpanded\def\math_overlay_fraction_gaps#1% +\protected\def\math_overlay_fraction_gaps#1%    {\Umathfractionnumup    #1\zeropoint     \Umathfractionnumvgap  #1\zeropoint     %Umathfractionrule     #1\zeropoint @@ -381,11 +381,11 @@  % \else -% \unexpanded\def\math_no_fraction_gaps +% \protected\def\math_no_fraction_gaps  %   {\Umathfractionnumup    \mathstyle\zeropoint  %    \Umathfractiondenomdown\mathstyle\zeropoint}  % -% \unexpanded\def\math_overlay_fraction_gaps +% \protected\def\math_overlay_fraction_gaps  %   {\Umathfractionnumup    \mathstyle\zeropoint  %    \Umathfractionnumvgap  \mathstyle\zeropoint  %    %Umathfractionrule     \mathstyle\zeropoint @@ -486,7 +486,7 @@  \definemathfraction[d:sfrac][\c!alternative=\v!both ,\c!mathstyle={\s!cramped,\s!scriptscript}]  \definemathfraction[d:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display] -%D \unexpanded\def\ShowMathFractions#1#2% +%D \protected\def\ShowMathFractions#1#2%  %D   {\dontleavehmode  %D    \begingroup  %D    \showmathstruts @@ -502,17 +502,17 @@  %D \ShowMathFractions{1}{b}\par  %D \blank -\unexpanded\def\frac {\csname\inlineordisplaymath id:frac\endcsname} -\unexpanded\def\tfrac{\csname\inlineordisplaymath id:tfrac\endcsname} -\unexpanded\def\sfrac{\csname\inlineordisplaymath id:sfrac\endcsname} -\unexpanded\def\dfrac{\csname\inlineordisplaymath id:dfrac\endcsname} +\permanent\protected\def\frac {\csname\inlineordisplaymath id:frac\endcsname} +\permanent\protected\def\tfrac{\csname\inlineordisplaymath id:tfrac\endcsname} +\permanent\protected\def\sfrac{\csname\inlineordisplaymath id:sfrac\endcsname} +\permanent\protected\def\dfrac{\csname\inlineordisplaymath id:dfrac\endcsname}  \definemathfraction[ams]            [\c!strut=\v!no,\c!alternative=\v!outer]  \definemathfraction[i:ams:frac][ams][\c!mathstyle={\s!cramped,\s!text}]  \definemathfraction[d:ams:frac][ams][\c!mathstyle={\s!cramped,\s!display}] -\unexpanded\def\ctxfrac{\csname\inlineordisplaymath id:frac\endcsname} -\unexpanded\def\amsfrac{\csname\inlineordisplaymath id:ams:frac\endcsname} +\permanent\protected\def\ctxfrac{\csname\inlineordisplaymath id:frac\endcsname} +\permanent\protected\def\amsfrac{\csname\inlineordisplaymath id:ams:frac\endcsname}  % \appendtoks  %     \doifelse{\mathfractionparameter\c!option}{ams}% @@ -522,17 +522,17 @@  \appendtoks      \doifelse{\mathematicsparameter\c!fractions}{ams}% -      {\let\frac\amsfrac}% -      {\let\frac\ctxfrac}% +      {\enforced\let\frac\amsfrac}% +      {\enforced\let\frac\ctxfrac}%  \to \everysetupmathematics  % \definemathfraction[ddfrac][\c!mathstyle=\s!display]  % \definemathfraction[ttfrac][\c!mathstyle=\s!text]  % \definemathfraction[ssfrac][\c!mathstyle=\s!script] -% \unexpanded\def\binom #1#2{{\Ustack      {{#1}\normalabovewithdelims()\zeropoint{#2}}}} -% \unexpanded\def\dbinom#1#2{{\displaystyle{{#1}\normalabovewithdelims()\zeropoint{#2}}}} -% \unexpanded\def\tbinom#1#2{{\textstyle   {{#1}\normalabovewithdelims()\zeropoint{#2}}}} +% \protected\def\binom #1#2{{\Ustack      {{#1}\normalabovewithdelims()\zeropoint{#2}}}} +% \protected\def\dbinom#1#2{{\displaystyle{{#1}\normalabovewithdelims()\zeropoint{#2}}}} +% \protected\def\tbinom#1#2{{\textstyle   {{#1}\normalabovewithdelims()\zeropoint{#2}}}}  \definemathfraction    [binom] @@ -577,7 +577,7 @@  %D  %D \getbuffer -\unexpanded\def\cfrac +\permanent\protected\def\cfrac    {\doifelsenextoptionalcs\math_cfrac_yes\math_cfrac_nop}  \def\math_cfrac_nop    {\math_cfrac_indeed[cc]} @@ -617,28 +617,25 @@  %D These macros are based on Michael J.~Downes posting on  %D comp.text.tex on 2001/12/06 but adapted a bit. -\unexpanded\def\splitfrac #1#2% -  {{\textstyle   {{\textstyle#1\quad\hfill}\normalabove\zeropoint{\textstyle\hfill\quad\mathstrut#2}}}} - -\unexpanded\def\splitdfrac#1#2% -  {{\displaystyle{{          #1\quad\hfill}\normalabove\zeropoint{          \hfill\quad\mathstrut#2}}}} +\protected\def\splitfrac #1#2{{\textstyle   {{\textstyle#1\quad\hfill}\normalabove\zeropoint{\textstyle\hfill\quad\mathstrut#2}}}} +\protected\def\splitdfrac#1#2{{\displaystyle{{          #1\quad\hfill}\normalabove\zeropoint{          \hfill\quad\mathstrut#2}}}}  %D For testing: -% \unexpanded\def\ShowMathFractions#1#2% +% \protected\def\ShowMathFractions#1#2%  %  {\mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}}  %D More fracking (for Alan): -\unexpanded\def\math_frac_colored_vulgar#1#2% +\protected\def\math_frac_colored_vulgar#1#2%    {\savecolor     \colo_helpers_activate\p_math_fractions_color     {\restorecolor#1}\Uskewed/{\restorecolor#2}} -\unexpanded\def\math_frac_normal_vulgar#1#2% +\protected\def\math_frac_normal_vulgar#1#2%    {{#1}\Uskewed/{#2}} -\unexpanded\def\vfrac#1#2% +\permanent\protected\def\vfrac#1#2%    {\bgroup     \edef\p_math_fractions_color{\namedmathfractionparameter\s!vfrac\c!color}%     \ifempty\p_math_fractions_color @@ -712,12 +709,12 @@  %   {\math_stylebuilders_sqrt\scriptstyle      \textface{#1}{#2}{#3}}%  %   {\math_stylebuilders_sqrt\scriptscriptstyle\textface{#1}{#2}{#3}}} -% \unexpanded\def\mthfrac#1#2#3{[mthfrac: #1 #2 #3]} -% \unexpanded\def\mthsqrt#1#2#3{[mthsqrt: #1 #2 #3]} +% \protected\def\mthfrac#1#2#3{[mthfrac: #1 #2 #3]} +% \protected\def\mthsqrt#1#2#3{[mthsqrt: #1 #2 #3]}  % used for prototyping \Uskewed  % -% \unexpanded\def\skewedfractiona#1#2{% +% \protected\def\skewedfractiona#1#2{%  %     \raise  %         \Umathskewedfractionvgap\textstyle  %         \hbox\bgroup @@ -733,7 +730,7 @@  %         \egroup  % }  % -% \unexpanded\def\skewedfractionb#1#2{% +% \protected\def\skewedfractionb#1#2{%  %     \raise  %         \Umathskewedfractionvgap\textstyle  %         \hbox\bgroup diff --git a/tex/context/base/mkiv/mult-aux.mkxl b/tex/context/base/mkiv/mult-aux.mkxl index 49f473874..da86888c5 100644 --- a/tex/context/base/mkiv/mult-aux.mkxl +++ b/tex/context/base/mkiv/mult-aux.mkxl @@ -274,7 +274,7 @@  \def\mult_interfaces_detokenize{\expandafter\expandafter\expandafter\detokenize\expandafter\expandafter\expandafter}  \protected\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only) -  {\ifx#2\relax\let#2\empty\fi                                            % it is hardly faster but produces less expansion tracing +  {\ifx#2\relax\mutable\let#2\empty\fi                                            % it is hardly faster but produces less expansion tracing     \frozen\def#3##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}%     \frozen\def#4##1##2{\ifcsname##1:##2\endcsname##1:##2\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}%     \frozen\edef#5##1##2{\noexpand\ifx##1\relax\??empty\noexpand\else\noexpand#4##1{##2}\noexpand\fi}% is {} needed around ##1 ? @@ -309,7 +309,7 @@          \expandafter\noexpand\csname root#2parameter\endcsname}}  \protected\def\mult_interfaces_install_parameter_hash_handler#1#2#3#4#5#6#7#8#9% -  {\ifx#2\relax\let#2\empty\fi +  {\ifx#2\relax\mutable\let#2\empty\fi     \frozen\def#3##1{#1#4{#1#2}{##1}:}% leading #1 was missing .. is this one used?     \frozen\def#4##1##2{\ifcsname##1:##2\endcsname##1\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}%     \frozen\def#5##1##2{\ifx##1\relax\else#4##1{##2}\fi}% @@ -338,7 +338,7 @@  % \startinterface english      \protected\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6% -      {\ifx#2\relax\let#2\empty\fi +      {\ifx#2\relax\mutable\let#2\empty\fi         \frozen\protected\def#3##1{\defcsname#1#2:##1\endcsname}%        ##1 {##2} (braces are mandate)         \frozen\protected\def#4##1{\edefcsname#1#2:##1\endcsname}%        ##1 {##2} (braces are mandate)         \frozen\protected\def#5##1{\letcsname#1#2:##1\endcsname}%        ##1 ##2 @@ -395,7 +395,7 @@  \def\getcurrentparentchain#1#2{\begincsname#1#2:\s!chain\endcsname}  \protected\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8% why is \expanded still needed in clones -  {\ifx#4\relax\let#4\empty\fi                                       % see \defineregister +  {\ifx#4\relax\mutable\let#4\empty\fi                                       % see \defineregister     \newtoks#5%     \newtoks#6%     \frozen\tolerant\protected\def#2[##1]##*[##2]##*[##3]% [child][parent][settings] | [child][settings] | [child][parent] | [child] @@ -458,7 +458,7 @@          \expandafter\noexpand\csname saved_defined_#2\endcsname}}  \protected\def\mult_interfaces_install_setup_handler#1#2#3#4#5#6#7#8% -  {\ifx#3\relax\let#3\empty\fi +  {\ifx#3\relax\mutable\let#3\empty\fi     \protected\def#5{\mult_interfaces_get_parameters{#1#3:}}% no every ! don't change it     \newtoks#4%     \newtoks#7% @@ -496,7 +496,7 @@  \let\doingrootsetroot   \plusfour   % \setuplayout  \protected\def\mult_interfaces_install_switch_setup_handler_a#1#2#3% -  {\ifx#2\relax\let#2\empty\fi +  {\ifx#2\relax\mutable\let#2\empty\fi     \frozen\protected\def#3{\mult_interfaces_get_parameters{#1#2:}}}  \protected\def\mult_interfaces_install_switch_setup_handler_b#1#2#3#4#5#6#7#8#9% @@ -572,7 +572,7 @@          \expandafter\noexpand\csname everysetup#2root\endcsname}}  \protected\def\mult_interfaces_install_auto_setup_handler#1#2#3#4#5#6#7#8% -  {\ifx#3\relax\let#3\empty\fi +  {\ifx#3\relax\mutable\let#3\empty\fi     \frozen\protected\def#5{\mult_interfaces_get_parameters{#1#3:}}%     \newtoks#4%     \frozen\tolerant\protected\def#2[##1]##*[##2]##*[##3]% @@ -1070,12 +1070,12 @@  % this one that often. It's more about less tracing than speed here.  \permanent\protected\def\installmacrostack#1% -  {\ifdefined#1\else\let#1\empty\fi +  {\ifdefined#1\else\mutable\let#1\empty\fi     \global\protected\defcsname push_macro_\csstring#1\endcsname{\localpushmacro#1}%     \global\protected\defcsname  pop_macro_\csstring#1\endcsname{\localpopmacro #1}}  \permanent\protected\def\installglobalmacrostack#1% -  {\ifdefined#1\else\glet#1\empty\fi +  {\ifdefined#1\else\mutable\glet#1\empty\fi     \global\protected\defcsname push_macro_\csstring#1\endcsname{\globalpushmacro#1}%     \global\protected\defcsname  pop_macro_\csstring#1\endcsname{\globalpopmacro #1}} diff --git a/tex/context/base/mkiv/pack-rul.mkxl b/tex/context/base/mkiv/pack-rul.mkxl index 07aae0c92..126e5c5d3 100644 --- a/tex/context/base/mkiv/pack-rul.mkxl +++ b/tex/context/base/mkiv/pack-rul.mkxl @@ -84,7 +84,7 @@  \protected\def\doinstallinheritedframed#1#2#3#4#5#6#7#8#9%    {\enforced\def#5##1##2{\ifx##1\relax#6{##2}\else#4{##1}{##2}\fi}%     \enforced\def#6##1{\ifcsname\??framed:##1\endcsname\??framed:##1\else\??empty\fi}% root -   \protected\def#8% +   \frozen\instance\protected\def#8%       {\bgroup        \bgroup        \inframedtrue @@ -93,7 +93,7 @@        \enforced\let\framedparameterhash#3%        \enforced\let\setupcurrentframed #7%        \pack_framed_process_indeed}% -   \protected\def#9% +   \frozen\instance\protected\def#9%       {\bgroup        \inframedtrue        \enforced\let\currentframed      #1% @@ -190,7 +190,7 @@  \permanent\protected\def\definesimplifiedframed[#1]% no settings    {\defineframed[#1][\??simplifiedframed]% -   \letcsname#1\endcsname\undefined} +   \enforced\letcsname#1\endcsname\undefined}  \letcsname\??simplifiedframed\endcsname\undefined @@ -1877,7 +1877,7 @@  \newtoks \t_pack_framed_mathframed  \appendtoks -    \setuevalue{\currentmathframed}{\pack_framed_mathframed{\currentmathframed}}% +    \frozen\instance\setuevalue{\currentmathframed}{\pack_framed_mathframed{\currentmathframed}}%  \to \everydefinemathframed  \protected\def\pack_framed_mathframed#1% @@ -2631,9 +2631,9 @@     \c!margin=\v!standard]  \appendtoks -    \setuevalue{\e!start\currentframedtext}{\pack_framed_text_start {\currentframedtext}}% -    \setuevalue{\e!stop \currentframedtext}{\pack_framed_text_stop                      }% -    \setuevalue        {\currentframedtext}{\pack_framed_text_direct{\currentframedtext}}% +    \frozen\instance\setuevalue{\e!start\currentframedtext}{\pack_framed_text_start {\currentframedtext}}% +    \frozen\instance\setuevalue{\e!stop \currentframedtext}{\pack_framed_text_stop                      }% +    \frozen\instance\setuevalue        {\currentframedtext}{\pack_framed_text_direct{\currentframedtext}}%  \to \everydefineframedtext  \setvalue{\??framedtextlocation\v!left  }{\letframedtextparameter\c!left \relax @@ -2841,7 +2841,7 @@  \to \everypresetframed  \appendtoks -   \setuevalue\currentframed{\pack_framed_defined_process[\currentframed]}% +    \frozen\instance\setuevalue{\currentframed}{\pack_framed_defined_process[\currentframed]}%  \to \everydefineframed  \newcount\c_temp_framed_crap @@ -2862,7 +2862,7 @@     \setupcurrentframed[#2]% here !     \pack_framed_process_indeed} -\let\placeframed\pack_framed_defined_process % new per 2012/04/23 +\aliased\let\placeframed\pack_framed_defined_process % new per 2012/04/23  %D We can do:  %D diff --git a/tex/context/base/mkiv/spac-hor.mkxl b/tex/context/base/mkiv/spac-hor.mkxl index 3d9729916..54f360d83 100644 --- a/tex/context/base/mkiv/spac-hor.mkxl +++ b/tex/context/base/mkiv/spac-hor.mkxl @@ -654,8 +654,8 @@     \c!default=\v!middle]  \appendtoks -   \setuevalue{\e!start\currentnarrower}{\spac_narrower_start[\currentnarrower]}% -   \setuevalue{\e!stop \currentnarrower}{\spac_narrower_stop}% +   \frozen\instance\setuevalue{\e!start\currentnarrower}{\spac_narrower_start[\currentnarrower]}% +   \frozen\instance\setuevalue{\e!stop \currentnarrower}{\spac_narrower_stop}%  \to \everydefinenarrower  \permanent\protected\def\installnarrowermethod#1#2% diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdfBinary files differ index 5c22acd41..46fb57d00 100644 --- a/tex/context/base/mkiv/status-files.pdf +++ b/tex/context/base/mkiv/status-files.pdf diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdfBinary files differ index 0b64f35bb..0b613e4d1 100644 --- a/tex/context/base/mkiv/status-lua.pdf +++ b/tex/context/base/mkiv/status-lua.pdf diff --git a/tex/context/base/mkiv/strc-con.mklx b/tex/context/base/mkiv/strc-con.mklx index 5d5eba056..bdc18de81 100644 --- a/tex/context/base/mkiv/strc-con.mklx +++ b/tex/context/base/mkiv/strc-con.mklx @@ -121,9 +121,11 @@      \instance\setevalue{\??constructionclass\currentconstruction}{\constructionparameter\s!handler}%  \to \everydefineconstruction +% todo: inhibit this when we have a different handle .. current we cannot do \frozen +  \appendtoks      \ifconditional\c_strc_constructions_define_commands -     %% \setuevalue{\e!start\currentconstruction}{\strc_constructions_start{\currentconstruction}}% +     %% \instance\setuevalue{\e!start\currentconstruction}{\strc_constructions_start{\currentconstruction}}%          \instance\setuevalue{\e!start\currentconstruction}{\strc_constructions_start[\currentconstruction]}%          \instance\setuevalue{\e!stop \currentconstruction}{\strc_constructions_stop}%      \fi diff --git a/tex/context/base/mkiv/strc-des.mklx b/tex/context/base/mkiv/strc-des.mklx index 11fca5869..e63512c7f 100644 --- a/tex/context/base/mkiv/strc-des.mklx +++ b/tex/context/base/mkiv/strc-des.mklx @@ -67,9 +67,9 @@          \defineconstruction[\currentdescription][\s!handler=\v!description,\c!level=1]%      \fi      % We can combine these but in tracing (or errors) using a different caller is nicer. -    \instance\setuevalue        {\currentdescription}{\strc_descriptions_command[\currentdescription]}% -    \instance\setuevalue{\e!start\currentdescription}{\strc_descriptions_start  [\currentdescription]}% -    \instance\setuevalue{\e!stop \currentdescription}{\strc_descriptions_stop}% +    \frozen\instance\setuevalue        {\currentdescription}{\strc_descriptions_command[\currentdescription]}% +    \frozen\instance\setuevalue{\e!start\currentdescription}{\strc_descriptions_start  [\currentdescription]}% +    \frozen\instance\setuevalue{\e!stop \currentdescription}{\strc_descriptions_stop}%  \to \everydefinedescription  \let\p_strc_constructions_title \empty diff --git a/tex/context/base/mkiv/strc-doc.mkxl b/tex/context/base/mkiv/strc-doc.mkxl new file mode 100644 index 000000000..046f0b086 --- /dev/null +++ b/tex/context/base/mkiv/strc-doc.mkxl @@ -0,0 +1,45 @@ +%D \module +%D   [       file=strc-doc, +%D        version=2008.10.20, +%D          title=\CONTEXT\ Structure Macros, +%D       subtitle=Document Structure, +%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 Structure Macros / Document Structure} + +\registerctxluafile{strc-doc}{} + +\unprotect + +%D This will move: + +\permanent\protected\def\setstructuresynchronization#1% todo: use ctxcontext +  {\clf_setinternalreference +     prefix    {\currentstructurereferenceprefix}% +     reference {\currentstructurereference} +     internal  \locationcount +     view      {\interactionparameter\c!focus}% +   \relax +   \enforced\xdef\currentstructureattribute +     {\the\lastdestinationattribute}% +   \enforced\xdef\currentstructuresynchronize +     {\currentstructuresynchronize +      \strc_lists_inject_enhance{#1}}} + +\permanent\protected\def\setstructurecomponentsynchronization#1% todo: use ctxcontext +  {\clf_setinternalreference +     prefix    {\currentstructurecomponentreferenceprefix}% +     reference {\currentstructurecomponentreference} +     internal  \locationcount +     view      {\interactionparameter\c!focus}% +   \relax +   \enforced\xdef\currentstructurecomponentattribute  {\the\lastdestinationattribute}% +   \enforced\xdef\currentstructurecomponentsynchronize{\strc_lists_inject_enhance{#1}}} + +\protect \endinput diff --git a/tex/context/base/mkiv/strc-enu.mklx b/tex/context/base/mkiv/strc-enu.mklx index 011bbedf9..0561ad340 100644 --- a/tex/context/base/mkiv/strc-enu.mklx +++ b/tex/context/base/mkiv/strc-enu.mklx @@ -134,12 +134,12 @@        \setevalue{\??enumeration#tag:\s!parent}{\??enumeration}}%       {\normalexpanded{\defineconstruction[#tag][#parent][\s!handler=\v!enumeration,\c!level=#level]}%        \setevalue{\??enumeration#tag:\s!parent}{\??enumeration#parent}}% -   \instance\setuevalue{\e!next #tag}{\strc_enumerations_next   {#tag}{\number#level}}% obsolete -   \instance\setuevalue{\c!reset#tag}{\strc_enumerations_reset  {#tag}{\number#level}}% obsolete -   %instance\setuevalue{\c!set  #tag}{\strc_enumerations_set    {#tag}{\number#level}}% obsolete -   \instance\setuevalue        {#tag}{\strc_enumerations_command[#tag]}% we could pass level here as well (faster) -   \instance\setuevalue{\e!start#tag}{\strc_enumerations_start  [#tag]}% we could pass level here as well (faster) -   \instance\setuevalue{\e!stop #tag}{\strc_enumerations_stop   }} +   \frozen\instance\setuevalue{\e!next #tag}{\strc_enumerations_next   {#tag}{\number#level}}% obsolete +   \frozen\instance\setuevalue{\c!reset#tag}{\strc_enumerations_reset  {#tag}{\number#level}}% obsolete +   %frozen\instance\setuevalue{\c!set  #tag}{\strc_enumerations_set    {#tag}{\number#level}}% obsolete +   \frozen\instance\setuevalue        {#tag}{\strc_enumerations_command[#tag]}% we could pass level here as well (faster) +   \frozen\instance\setuevalue{\e!start#tag}{\strc_enumerations_start  [#tag]}% we could pass level here as well (faster) +   \frozen\instance\setuevalue{\e!stop #tag}{\strc_enumerations_stop   }}  \appendtoks      \ifempty\currentenumerationparent diff --git a/tex/context/base/mkiv/strc-itm.mklx b/tex/context/base/mkiv/strc-itm.mklx index 0b9ae347f..c167e24a4 100644 --- a/tex/context/base/mkiv/strc-itm.mklx +++ b/tex/context/base/mkiv/strc-itm.mklx @@ -331,9 +331,9 @@  \aliased\let\setupitemgroups\setupitemgroup  \appendtoks -    \setuevalue{\e!start\currentitemgroup}{\startitemgroup[\currentitemgroup]}% -    \setuevalue{\e!stop \currentitemgroup}{\stopitemgroup}% -    \setuevalue{\e!setup\currentitemgroup\e!endsetup}{\setupitemgroup[\currentitemgroup]}% obsolete +    \frozen\instance\setuevalue{\e!start\currentitemgroup}{\startitemgroup[\currentitemgroup]}% +    \frozen\instance\setuevalue{\e!stop \currentitemgroup}{\stopitemgroup}% +    \frozen\instance\setuevalue{\e!setup\currentitemgroup\e!endsetup}{\setupitemgroup[\currentitemgroup]}% obsolete      \let\currentparentitemgroup\currentitemgroup      \definecounter[\v_strc_itemgroups_counter]%  \to \everydefineitemgroup diff --git a/tex/context/base/mkiv/strc-lab.mkxl b/tex/context/base/mkiv/strc-lab.mkxl index a480f782e..95bfa82df 100644 --- a/tex/context/base/mkiv/strc-lab.mkxl +++ b/tex/context/base/mkiv/strc-lab.mkxl @@ -58,15 +58,15 @@       {\normalexpanded{\defineconstruction[#1][#3][\s!handler=\v!label,\c!level=#2]}%        \setevalue{\??label#1:\s!parent}{\??label#3}}%     \ifconditional\c_strc_constructions_define_commands -     \setuevalue{\e!next   #1}{\strc_labels_next   {#1}{\number#2}}% obsolete -     \setuevalue{\v!reset  #1}{\strc_labels_reset  {#1}{\number#2}}% obsolete % should be \e!reset anyway -     %setuevalue{\c!set    #1}{\strc_labels_set    {#1}{\number#2}}% obsolete +     \frozen\instance\setuevalue{\e!next #1}{\strc_labels_next {#1}{\number#2}}% obsolete +     \frozen\instance\setuevalue{\v!reset#1}{\strc_labels_reset{#1}{\number#2}}% obsolete % should be \e!reset anyway +     %frozen\instance\setuevalue{\c!set  #1}{\strc_labels_set  {#1}{\number#2}}% obsolete       \ifcsname\v!current#1\endcsname         % we play safe       \else         \setuevalue{\v!current#1}{\strc_labels_current{#1}}%          % obsolete % should be \e!current anyway       \fi -     \setuevalue{#1}{\strc_labels_command[#1]}% +     \frozen\instance\setuevalue{#1}{\strc_labels_command[#1]}%     \fi}  % todo: \strc_labels_command for user diff --git a/tex/context/base/mkiv/strc-sec.mkxl b/tex/context/base/mkiv/strc-sec.mkxl index a6e9b553c..445e042b2 100644 --- a/tex/context/base/mkiv/strc-sec.mkxl +++ b/tex/context/base/mkiv/strc-sec.mkxl @@ -474,8 +474,8 @@  \to \everyredefinehead  \appendtoks -   \instance\setuevalue{\e!start\currenthead}{\strc_sectioning_start[\currenthead]}% -   \instance\setuevalue{\e!stop \currenthead}{\strc_sectioning_stop [\currenthead]}% +   \frozen\instance\setuevalue{\e!start\currenthead}{\strc_sectioning_start[\currenthead]}% +   \frozen\instance\setuevalue{\e!stop \currenthead}{\strc_sectioning_stop [\currenthead]}%  \to \everydefinehead  % so \subject as well as \section will need two commands when ownnumber diff --git a/tex/context/base/mkiv/supp-dir.mkiv b/tex/context/base/mkiv/supp-dir.mkiv index e6c2a5869..0b6437099 100644 --- a/tex/context/base/mkiv/supp-dir.mkiv +++ b/tex/context/base/mkiv/supp-dir.mkiv @@ -13,41 +13,34 @@  \unprotect -\chardef\directionlefttoright\zerocount -\chardef\directionrighttoleft\plusone - -\edef\??bdir{\ifdefined\bodydir bdir\else direction\fi} - -\protected\edef\naturalhbox  {\hbox  \??bdir\directionlefttoright} -\protected\edef\naturalvbox  {\vbox  \??bdir\directionlefttoright} -\protected\edef\naturalvtop  {\vtop  \??bdir\directionlefttoright} -\protected\edef\naturalhpack {\hpack \??bdir\directionlefttoright} -\protected\edef\naturalvpack {\vpack \??bdir\directionlefttoright} -\protected\edef\naturaltpack {\tpack \??bdir\directionlefttoright} - -\protected\edef\reversehbox  {\hbox  \??bdir\directionrighttoleft} -\protected\edef\reversevbox  {\vbox  \??bdir\directionrighttoleft} -\protected\edef\reversevtop  {\vtop  \??bdir\directionrighttoleft} -\protected\edef\reversehpack {\hpack \??bdir\directionrighttoleft} -\protected\edef\reversevpack {\vpack \??bdir\directionrighttoleft} -\protected\edef\reversetpack {\tpack \??bdir\directionrighttoleft} - -\ifdefined\bodydir -    \let\bodydir      \undefined \let\normalbodydir      \undefined -    \let\bodydirection\undefined \let\normalbodydirection\undefined -\fi - -\ifdefined\pagedir -    \let\pagedir      \undefined \let\normalpagedir      \undefined -    \let\pagedirection\undefined \let\normalpagedirection\undefined -\fi +% \immutable\chardef\directionlefttoright\zerocount +% \immutable\chardef\directionrighttoleft\plusone + +\setnewconstant\directionlefttoright\zerocount +\setnewconstant\directionrighttoleft\plusone + +\immutable\edef\??bdir{\ifdefined\bodydir bdir\else direction\fi} + +\permanent\protected\edef\naturalhbox  {\hbox  \??bdir\directionlefttoright} +\permanent\protected\edef\naturalvbox  {\vbox  \??bdir\directionlefttoright} +\permanent\protected\edef\naturalvtop  {\vtop  \??bdir\directionlefttoright} +\permanent\protected\edef\naturalhpack {\hpack \??bdir\directionlefttoright} +\permanent\protected\edef\naturalvpack {\vpack \??bdir\directionlefttoright} +\permanent\protected\edef\naturaltpack {\tpack \??bdir\directionlefttoright} + +\permanent\protected\edef\reversehbox  {\hbox  \??bdir\directionrighttoleft} +\permanent\protected\edef\reversevbox  {\vbox  \??bdir\directionrighttoleft} +\permanent\protected\edef\reversevtop  {\vtop  \??bdir\directionrighttoleft} +\permanent\protected\edef\reversehpack {\hpack \??bdir\directionrighttoleft} +\permanent\protected\edef\reversevpack {\vpack \??bdir\directionrighttoleft} +\permanent\protected\edef\reversetpack {\tpack \??bdir\directionrighttoleft}  % \expanded{\defineactivecharacter \number"2000E} {\textdirection\directionrighttoleft\relax}  % \expanded{\defineactivecharacter \number"2000F} {\textdirection\directionlefttoright\relax}  \def\syst_direction_string#1{\ifcase#1=\plusone r2l\else l2r\fi} -\protected\def\showdirsinmargin +\permanent\protected\def\showdirsinmargin    {\normalexpanded{\inleft{\naturalhbox       {\ttxx[\syst_direction_string\pardirection,\syst_direction_string\textdirection]}}}} diff --git a/tex/context/base/mkiv/supp-dir.mkxl b/tex/context/base/mkiv/supp-dir.mkxl new file mode 100644 index 000000000..e6c2a5869 --- /dev/null +++ b/tex/context/base/mkiv/supp-dir.mkxl @@ -0,0 +1,54 @@ +%D \module +%D   [       file=supp-dir, +%D        version=2004.11.11, +%D          title=\CONTEXT\ Support Macros, +%D       subtitle=Directional Things, +%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. + +\unprotect + +\chardef\directionlefttoright\zerocount +\chardef\directionrighttoleft\plusone + +\edef\??bdir{\ifdefined\bodydir bdir\else direction\fi} + +\protected\edef\naturalhbox  {\hbox  \??bdir\directionlefttoright} +\protected\edef\naturalvbox  {\vbox  \??bdir\directionlefttoright} +\protected\edef\naturalvtop  {\vtop  \??bdir\directionlefttoright} +\protected\edef\naturalhpack {\hpack \??bdir\directionlefttoright} +\protected\edef\naturalvpack {\vpack \??bdir\directionlefttoright} +\protected\edef\naturaltpack {\tpack \??bdir\directionlefttoright} + +\protected\edef\reversehbox  {\hbox  \??bdir\directionrighttoleft} +\protected\edef\reversevbox  {\vbox  \??bdir\directionrighttoleft} +\protected\edef\reversevtop  {\vtop  \??bdir\directionrighttoleft} +\protected\edef\reversehpack {\hpack \??bdir\directionrighttoleft} +\protected\edef\reversevpack {\vpack \??bdir\directionrighttoleft} +\protected\edef\reversetpack {\tpack \??bdir\directionrighttoleft} + +\ifdefined\bodydir +    \let\bodydir      \undefined \let\normalbodydir      \undefined +    \let\bodydirection\undefined \let\normalbodydirection\undefined +\fi + +\ifdefined\pagedir +    \let\pagedir      \undefined \let\normalpagedir      \undefined +    \let\pagedirection\undefined \let\normalpagedirection\undefined +\fi + +% \expanded{\defineactivecharacter \number"2000E} {\textdirection\directionrighttoleft\relax} +% \expanded{\defineactivecharacter \number"2000F} {\textdirection\directionlefttoright\relax} + +\def\syst_direction_string#1{\ifcase#1=\plusone r2l\else l2r\fi} + +\protected\def\showdirsinmargin +  {\normalexpanded{\inleft{\naturalhbox +     {\ttxx[\syst_direction_string\pardirection,\syst_direction_string\textdirection]}}}} + +\protect \endinput diff --git a/tex/context/base/mkiv/syst-aux.mkxl b/tex/context/base/mkiv/syst-aux.mkxl index 9ae18ab71..0638600c2 100644 --- a/tex/context/base/mkiv/syst-aux.mkxl +++ b/tex/context/base/mkiv/syst-aux.mkxl @@ -60,7 +60,7 @@  \aliased  \let\startlmtxmode\relax  \aliased  \let\stoplmtxmode \relax  \permanent\def\startmkivmode#-\stopmkivmode{} -\aliased  \let\stopmkivmode \relax +\permanent\let\stopmkivmode \relax  %D As we don't have namespace definers yet, we use a special one. Later we will  %D do a better job. @@ -237,7 +237,7 @@  %D Reserved macros for tests: -\let\donothing\empty +\aliased\let\donothing\empty  \let\m_syst_string_one  \empty  \let\m_syst_string_two  \empty @@ -262,16 +262,16 @@  \let\m_syst_action_yes\relax  \let\m_syst_action_nop\relax -\protected\def\doifelsenextchar#1#2#3% #1 should not be {} ! +\permanent\protected\def\doifelsenextchar#1#2#3% #1 should not be {} !    {\def\m_syst_action_yes{#2}%     \def\m_syst_action_nop{#3}%     \futureexpandis#1\m_syst_action_yes\m_syst_action_nop} -\protected\def\doifelsenextcharcs % #1#2#3% #1 should not be {} ! +\permanent\protected\def\doifelsenextcharcs % #1#2#3% #1 should not be {} !    {\futureexpandis} -\let\doifnextcharelse  \doifelsenextchar -\let\doifnextcharcselse\doifelsenextcharcs +\aliased\let\doifnextcharelse  \doifelsenextchar +\aliased\let\doifnextcharcselse\doifelsenextcharcs  %D Because we will mostly use this macro for testing if the next character is \type  %D {[}, we also make a slightly faster variant as it is not uncommon to have tens of @@ -282,34 +282,34 @@  %D reputations depends on understanding obscure macro definitions will love the more  %D low level variants. -\protected\def\doifelsenextoptional#1#2% +\permanent\protected\def\doifelsenextoptional#1#2%    {\def\m_syst_action_yes{#1}%     \def\m_syst_action_nop{#2}%     \futureexpandis[\m_syst_action_yes\m_syst_action_nop} -\protected\def\doifelsenextoptionalcs +\permanent\protected\def\doifelsenextoptionalcs    {\futureexpandis[} -\let\doifnextoptionalelse  \doifelsenextoptional -\let\doifnextoptionalcselse\doifelsenextoptionalcs +\aliased\let\doifnextoptionalelse  \doifelsenextoptional +\aliased\let\doifnextoptionalcselse\doifelsenextoptionalcs -\protected\def\doifelsenextbgroup#1#2% +\permanent\protected\def\doifelsenextbgroup#1#2%    {\def\m_syst_action_yes{#1}%     \def\m_syst_action_nop{#2}%     \futureexpandis\bgroup\m_syst_action_yes\m_syst_action_nop} -\protected\def\doifelsenextbgroupcs % #1#2 +\permanent\protected\def\doifelsenextbgroupcs % #1#2    {\futureexpandis\bgroup} -\let\doifnextbgroupelse  \doifelsenextbgroup -\let\doifnextbgroupcselse\doifelsenextbgroupcs +\aliased\let\doifnextbgroupelse  \doifelsenextbgroup +\aliased\let\doifnextbgroupcselse\doifelsenextbgroupcs -\protected\def\doifelsenextparenthesis#1#2% +\permanent\protected\def\doifelsenextparenthesis#1#2%    {\def\m_syst_action_yes{#1}%     \def\m_syst_action_nop{#2}%     \futureexpandis(\m_syst_action_yes\m_syst_action_nop} -\let\doifnextparenthesiselse\doifelsenextparenthesis +\aliased\let\doifnextparenthesiselse\doifelsenextparenthesis  %D The next one is handy in predictable situations: @@ -320,16 +320,16 @@       \expandafter\m_syst_action_nop     \fi} -\protected\def\doifelsefastoptionalcheck#1#2% +\permanent\protected\def\doifelsefastoptionalcheck#1#2%    {\def\m_syst_action_yes{#1}%     \def\m_syst_action_nop{#2}%     \futureexpandis[\m_syst_action_yes\m_syst_action_nop} -\protected\def\doifelsefastoptionalcheckcs +\permanent\protected\def\doifelsefastoptionalcheckcs    {\futureexpandis[} -\let\doiffastoptionalcheckelse  \doifelsefastoptionalcheck -\let\doiffastoptionalcheckcselse\doifelsefastoptionalcheckcs +\aliased\let\doiffastoptionalcheckelse  \doifelsefastoptionalcheck +\aliased\let\doiffastoptionalcheckcselse\doifelsefastoptionalcheckcs  %D Here's one for skipping spaces and pars, handy for:  %D @@ -354,7 +354,7 @@  %D The original kind of clumsy but working version is now replaced by a simple  %D macro. And it can be even less code in \LUAMETATEX: -\let\assumelongusagecs\expandafterpars +\aliased\let\assumelongusagecs\expandafterpars % so we can replace it  %D It's used to skip over empty lines in some constructs that we like to set up  %D spacy. We already permit par tokens (and equivalents) in math and some other @@ -370,7 +370,7 @@  %D next space, which is why we need an extra one to achieve our goal. Such a \type  %D {\blankspace} has the meaning \typ {blank space}. A typical \TEX ie definition: -\normalexpanded{\let\noexpand\blankspace=\space\space} +\normalexpanded{\permanent\let\noexpand\blankspace=\space\space}  %D \macros  %D   {setvalue,setgvalue,setevalue,setxvalue, @@ -395,23 +395,23 @@  %D As we will see, \CONTEXT\ uses these commands many times, which is mainly due to  %D its object oriented and parameter driven character. -\def\setvalue     #1{\expandafter\defcsname#1\endcsname} -\def\setgvalue    #1{\global\defcsname#1\endcsname} -\def\setevalue    #1{\edefcsname#1\endcsname} -\def\setxvalue    #1{\global\edefcsname#1\endcsname} -\def\getvalue     #1{\csname#1\endcsname} % maybe: \begincsname#1\endcsname -\def\letvalue     #1{\letcsname#1\endcsname} -\def\letgvalue    #1{\global\letcsname#1\endcsname} -\def\resetvalue   #1{\letcsname#1\endcsname\empty} -\def\undefinevalue#1{\letcsname#1\endcsname\undefined} -\def\ignorevalue#1#2{\letcsname#1\endcsname\empty} +\permanent\def\setvalue     #1{\expandafter\defcsname#1\endcsname} +\permanent\def\setgvalue    #1{\global\defcsname#1\endcsname} +\permanent\def\setevalue    #1{\edefcsname#1\endcsname} +\permanent\def\setxvalue    #1{\global\edefcsname#1\endcsname} +\permanent\def\getvalue     #1{\csname#1\endcsname} % maybe: \begincsname#1\endcsname +\permanent\def\letvalue     #1{\letcsname#1\endcsname} +\permanent\def\letgvalue    #1{\global\letcsname#1\endcsname} +\permanent\def\resetvalue   #1{\letcsname#1\endcsname\empty} +\permanent\def\undefinevalue#1{\letcsname#1\endcsname\undefined} +\permanent\def\ignorevalue#1#2{\letcsname#1\endcsname\empty} -\def\setuvalue    #1{\protected\defcsname#1\endcsname} -\def\setuevalue   #1{\protected\edefcsname#1\endcsname} -\def\setugvalue   #1{\protected\global\defcsname#1\endcsname} -\def\setuxvalue   #1{\protected\global\edefcsname#1\endcsname} +\permanent\def\setuvalue    #1{\protected\defcsname#1\endcsname} +\permanent\def\setuevalue   #1{\protected\edefcsname#1\endcsname} +\permanent\def\setugvalue   #1{\protected\global\defcsname#1\endcsname} +\permanent\def\setuxvalue   #1{\protected\global\edefcsname#1\endcsname} -\protected\def\getuvalue#1{\csname#1\endcsname} +\permanent\protected\def\getuvalue#1{\csname#1\endcsname}  %D \macros  %D   {globallet,glet} @@ -420,7 +420,7 @@  %D save us some $300\times4=1200$ bytes of format file on a 32~bit system. Not that  %D it matters much today. But nowadays we can just alias to a primitive: -\let\globallet\glet +\aliased\let\globallet\glet  %D \macros  %D   {doifundefined,doifdefined, @@ -460,28 +460,28 @@  %D needs it. That kind of configuration happens elsewhere. These macros are (mostly  %D for historic reasons) fully expandable. -\def\doifelseundefined#1% +\permanent\def\doifelseundefined#1%    {\ifcsname#1\endcsname       \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments     \fi} -\def\doifelsedefined#1% +\permanent\def\doifelsedefined#1%    {\ifcsname#1\endcsname       \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments     \fi} -\def\doifundefined#1% +\permanent\def\doifundefined#1%    {\ifcsname#1\endcsname       \expandafter\gobbleoneargument\else\expandafter\firstofoneargument     \fi} -\def\doifdefined#1% +\permanent\def\doifdefined#1%    {\ifcsname#1\endcsname       \expandafter\firstofoneargument\else\expandafter\gobbleoneargument     \fi} -\let\doifundefinedelse\doifelseundefined -\let\doifdefinedelse  \doifelsedefined +\aliased\let\doifundefinedelse\doifelseundefined +\aliased\let\doifdefinedelse  \doifelsedefined  %D \macros  %D   {letbeundefined} @@ -491,13 +491,13 @@  %D {\undefined}! In \ETEX\ we have \type {\ifcsname} and that way of testing on  %D existance is not the same as the one described here. Therefore we introduce: -\protected\def\letbeundefined#1% +\permanent\protected\def\letbeundefined#1%    {\letcsname#1\endcsname\undefined} % or use \undefinevalue to match \setvalue -\protected\def\localundefine#1% conditional +\permanent\protected\def\localundefine#1% conditional    {\ifcsname#1\endcsname\letcsname#1\endcsname\undefined\fi} -\protected\def\globalundefine#1% conditional +\permanent\protected\def\globalundefine#1% conditional    {\ifcsname#1\endcsname\global\letcsname#1\endcsname\undefined\fi}  %D Beware, being \type {\undefined} in \ETEX\ means that the macro {\em is} defined! @@ -506,7 +506,7 @@  %D behavior in text and math mode, which was due to this grouping subtilities. We  %D therefore decided to use \type {\begingroup} instead of \type {\bgroup}. -\protected\def\doifelsealldefined#1% +\permanent\protected\def\doifelsealldefined#1%    {\begingroup     \donetrue % we could use a reserved one and avoid the group     \processcommalist[#1]\syst_helpers_do_if_all_defined_else @@ -516,7 +516,7 @@       \endgroup\expandafter\secondoftwoarguments     \fi} -\let\doifalldefinedelse\doifelsealldefined +\aliased\let\doifalldefinedelse\doifelsealldefined  \def\syst_helpers_do_if_all_defined_else#1%    {\ifcsname#1\endcsname\else @@ -545,21 +545,21 @@  %D \type {\edef}'s and \type {\ifx} comparison works as well, but this saves tokens  %D and, more important, tracing clutter. -\protected\def\doifelse#1#2% +\permanent\protected\def\doifelse#1#2%    {\iftok{#1}{#2}%       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\protected\def\doif#1#2% +\permanent\protected\def\doif#1#2%    {\iftok{#1}{#2}%       \expandafter\firstofoneargument     \else       \expandafter\gobbleoneargument     \fi} -\protected\def\doifnot#1#2% +\permanent\protected\def\doifnot#1#2%    {\iftok{#1}{#2}%       \expandafter\gobbleoneargument     \else @@ -580,7 +580,7 @@  %D This time, the string is not expanded, but we use the dedicated empty checker  %D here. -\protected\def\doifelseempty#1% +\permanent\protected\def\doifelseempty#1%    {\def\m_syst_string_one{#1}%     \ifempty\m_syst_string_one       \expandafter\firstoftwoarguments @@ -588,9 +588,9 @@       \expandafter\secondoftwoarguments     \fi} -\let\doifemptyelse\doifelseempty +\aliased\let\doifemptyelse\doifelseempty -\protected\def\doifempty#1% +\permanent\protected\def\doifempty#1%    {\def\m_syst_string_one{#1}%     \ifempty\m_syst_string_one       \expandafter\firstofoneargument @@ -598,7 +598,7 @@       \expandafter\gobbleoneargument     \fi} -\protected\def\doifnotempty#1% +\permanent\protected\def\doifnotempty#1%    {\def\m_syst_string_one{#1}%     \ifempty\m_syst_string_one       \expandafter\gobbleoneargument @@ -678,26 +678,26 @@  % But these do: -\edef\a!comma{\expandtoken \ignorecatcode \commaasciicode} -\edef\a!space{\expandtoken \ignorecatcode \spaceasciicode} +\immutable\edef\a!comma{\expandtoken \ignorecatcode \commaasciicode} +\immutable\edef\a!space{\expandtoken \ignorecatcode \spaceasciicode}  \normalexpanded { -    \protected \def \noexpand \doifelseinset#1#2% +    \permanent \protected \def \noexpand \doifelseinset#1#2%        {\noexpand\ifhasxtoks{,\a!space#1,}{,#2,}%           \noexpand\expandafter\noexpand\firstoftwoarguments         \noexpand\else           \noexpand\expandafter\noexpand\secondoftwoarguments         \noexpand\fi} -    \protected \def \noexpand \doifinset#1#2% +    \permanent \protected \def \noexpand \doifinset#1#2%        {\noexpand\ifhasxtoks{,\a!space#1,}{,#2,}%           \noexpand\expandafter\noexpand\firstofoneargument         \noexpand\else           \noexpand\expandafter\noexpand\gobbleoneargument         \noexpand\fi} -    \protected \def \noexpand \doifnotinset#1#2% +    \permanent \protected \def \noexpand \doifnotinset#1#2%        {\noexpand\ifhasxtoks{,\a!space#1,}{,#2,}%           \noexpand\expandafter\noexpand\gobbleoneargument         \noexpand\else @@ -708,7 +708,7 @@  %D Done. -\let\doifinsetelse\doifelseinset +\aliased\let\doifinsetelse\doifelseinset  %D \macros  %D   {doifcommon,doifnotcommon,doifcommonelse} @@ -738,11 +738,11 @@  % !9yes=\doifcommonelse{,a,}{,,,a,}{yes}{nop}  % !9yes=\doifcommonelse{,,a,}{,,,a,}{yes}{nop} -\protected\def\doifelsecommon#1#2{\clf_doifelsecommon{#1}{#2}} -\protected\def\doifcommon    #1#2{\clf_doifcommon    {#1}{#2}} -\protected\def\doifnotcommon #1#2{\clf_doifnotcommon {#1}{#2}} +\permanent\protected\def\doifelsecommon#1#2{\clf_doifelsecommon{#1}{#2}} % todo: define in lua +\permanent\protected\def\doifcommon    #1#2{\clf_doifcommon    {#1}{#2}} % todo: define in lua +\permanent\protected\def\doifnotcommon #1#2{\clf_doifnotcommon {#1}{#2}} % todo: define in lua -\let\doifcommonelse\doifelsecommon +\aliased\let\doifcommonelse\doifelsecommon  %D \macros  %D   {processcommalist,processcommacommand,quitcommalist, @@ -837,13 +837,13 @@  %    \normalexpanded{\noexpand\expandafterspaces\syst_helpers_process_comma_item#1,}\ignorearguments\ignorearguments\ignorearguments  %    \popmacro\commalistcommand} -\protected\def\processcommalist[#*#+]#2% +\permanent\protected\def\processcommalist[#*#+]#2%    {\pushmacro\commalistcommand     \def\commalistcommand{#2}%     \expandafterspaces\syst_helpers_process_comma_item#1,\ignorearguments\ignorearguments\ignorearguments     \popmacro\commalistcommand} -\protected\def\processcommacommand[#*#+]#2% +\permanent\protected\def\processcommacommand[#*#+]#2%    {\pushmacro\commalistcommand     \def\commalistcommand{#2}%     \normalexpanded{\noexpand\expandafterspaces\syst_helpers_process_comma_item#1,}\ignorearguments\ignorearguments\ignorearguments @@ -859,8 +859,8 @@  \def\syst_helpers_process_comma_item_next_c#-\ignorearguments{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_b}  \def\syst_helpers_process_comma_item_gobble#-\ignorearguments{} -\protected\def\quitcommalist    {\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_b} -\protected\def\quitprevcommalist{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_c} +\permanent\protected\def\quitcommalist    {\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_b} +\permanent\protected\def\quitprevcommalist{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_c}  %D \startbuffer  %D \def\foo#1{(#1)} @@ -901,7 +901,7 @@  %D \def\command[#1]{... #1 ...}  %D \stoptyping -\protected\def\processcommalistwithparameters[#1]#2% +\permanent\protected\def\processcommalistwithparameters[#1]#2%    {\def\syst_helpers_do_process_comma_list_with_parameters##1{#2[##1]}%     \processcommalist[#1]\syst_helpers_do_process_comma_list_with_parameters} @@ -912,16 +912,16 @@  \let\syst_helpers_comma_list_step\relax -\protected\def\startprocesscommalist[#1]#2\stopprocesscommalist +\permanent\protected\def\startprocesscommalist[#1]#2\stopprocesscommalist    {\def\syst_helpers_comma_list_step##1{\def\currentcommalistitem{##1}#2}%     \processcommalist[#1]\syst_helpers_comma_list_step} -\protected\def\startprocesscommacommand[#1]#2\stopprocesscommacommand +\permanent\protected\def\startprocesscommacommand[#1]#2\stopprocesscommacommand    {\def\syst_helpers_comma_list_step##1{\def\currentcommalistitem{##1}#2}%     \normalexpanded{\processcommalist[#1]}\syst_helpers_comma_list_step} -\let\stopprocesscommalist   \relax -\let\stopprocesscommacommand\relax +\aliased\let\stopprocesscommalist   \relax +\aliased\let\stopprocesscommacommand\relax  %D \macros  %D   {processaction, @@ -984,7 +984,7 @@       #2%     \fi} -\protected\def\processaction[#1]#2[% +\permanent\protected\def\processaction[#1]#2[%    {\edef\m_syst_string_one{#1}%     \ifempty\m_syst_string_one       \let\syst_helpers_do_compare_process_action\syst_helpers_do_compare_process_action_a @@ -1009,7 +1009,7 @@       \fi     \fi} -\protected\def\processfirstactioninset[#1]% +\permanent\protected\def\processfirstactioninset[#1]%    {\edef\m_syst_string_one{#1}%     \ifempty\m_syst_string_one       \expandafter\processaction @@ -1047,7 +1047,7 @@        \processcommacommand[#1]\syst_process_action_in_set     \globalpopmacro\syst_process_action_in_set_all} -\protected\def\processallactionsinset[#1]% +\permanent\protected\def\processallactionsinset[#1]%    {\edef\m_syst_string_one{#1}%     \ifempty\m_syst_string_one       \expandafter\processaction @@ -1063,7 +1063,7 @@  %    \expandafterspaces\syst_helpers_process_comma_item#2#3\ignorearguments\ignorearguments\ignorearguments  %    \popmacro\commalistcommand} -\protected\def\processnextcommalist#1[#2#3]% +\permanent\protected\def\processnextcommalist#1[#2#3]%    {\pushmacro\commalistcommand     \def\commalistcommand{#1}%     \expandafterspaces\syst_helpers_process_comma_item#2#3\ignorearguments\ignorearguments\ignorearguments @@ -1085,12 +1085,12 @@  \let\firstcharacter     \empty  \let\remainingcharacters\empty -\protected\def\getfirstcharacter     #1{\clf_getfirstcharacter{#1}} -\protected\def\doifelsefirstchar   #1#2{\clf_doifelsefirstchar{#1}{#2}} -\protected\def\thefirstcharacter     #1{\clf_thefirstcharacter{#1}} -\protected\def\theremainingcharacters#1{\clf_theremainingcharacters{#1}} +\permanent\protected\def\getfirstcharacter     #1{\clf_getfirstcharacter{#1}} +\permanent\protected\def\doifelsefirstchar   #1#2{\clf_doifelsefirstchar{#1}{#2}} +\permanent\protected\def\thefirstcharacter     #1{\clf_thefirstcharacter{#1}} +\permanent\protected\def\theremainingcharacters#1{\clf_theremainingcharacters{#1}} -\let\doiffirstcharelse\doifelsefirstchar +\aliased\let\doiffirstcharelse\doifelsefirstchar  %D \macros  %D   {doifinstringelse, doifincsnameelse} @@ -1202,34 +1202,34 @@  % \def\syst_helpers_do_if_not_in_string_yes #0\ignorearguments\ignorearguments#0{}  % \def\syst_helpers_do_if_not_in_string_nop #0\ignorearguments#2{#2} -\protected\def\doifelseinstring#1#2% +\permanent\protected\def\doifelseinstring#1#2%    {\ifhasxtoks{#1}{#2}%       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\protected\def\doifinstring#1#2% +\permanent\protected\def\doifinstring#1#2%    {\ifhasxtoks{#1}{#2}%       \expandafter\firstofoneargument     \else       \expandafter\gobbleoneargument     \fi} -\protected\def\doifnotinstring#1#2% +\permanent\protected\def\doifnotinstring#1#2%    {\ifhasxtoks{#1}{#2}%       \expandafter\gobbleoneargument     \else       \expandafter\firstofoneargument     \fi} -\let\doifinstringelse\doifelseinstring +\aliased\let\doifinstringelse\doifelseinstring  %D The next one one of those variants that we used when speed was more of an issue  %D that today. Now we just expand the lot. We just use an alias now: -\let\doifelseincsname\doifelseinstring -\let\doifincsnameelse\doifinstringelse +\aliased\let\doifelseincsname\doifelseinstring +\aliased\let\doifincsnameelse\doifinstringelse  %D \macros  %D   {doifnumberelse,doifnumber,doifnotnumber} @@ -1241,21 +1241,21 @@  %D features that no one ever asked for (but they are pretty generic in nature  %D anyway). -\def\doifelsenumber#1% +\permanent\def\doifelsenumber#1%    {\ifchknum#1\or       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\def\doifnumber#1% +\permanent\def\doifnumber#1%    {\ifchknum#1\or       \expandafter\firstoftwoarguments     \else       \expandafter\gobbleoneargument     \fi} -\def\doifnotnumber#1% +\permanent\def\doifnotnumber#1%    {\ifchknum#1\or       \expandafter\gobbleoneargument     \else @@ -1275,10 +1275,10 @@  % todo: use the push back dimen trickery -\def\percentdimen#1#2% dimen percentage (with %) +\permanent\def\percentdimen#1#2% dimen percentage (with %)    {\dimexpr\clf_percentageof{#2}\dimexpr#1\relax} -\protected\def\setpercentdimen#1#2% dimen percentage (with %) +\permanent\protected\def\setpercentdimen#1#2% dimen percentage (with %)    {#1=\clf_percentageof{#2}\dimexpr#1\relax}  %D \macros @@ -1306,7 +1306,7 @@  %D The gain in speed depends on the length of the argument (the longer the argument,  %D the less we gain). The question is: do we still need these raw variants? -\protected\def\makerawcommalist[#1]#2% use \processnext ... here +\permanent\protected\def\makerawcommalist[#1]#2% use \processnext ... here    {\scratchtoks\emptytoks     \def\syst_helpers_do_make_raw_comma_list##1{\iftok\scratchtoks\emptytoks\scratchtoks{##1}\else\toksapp\scratchtoks{,##1}\fi}%     \processcommalist[#1]\syst_helpers_do_make_raw_comma_list @@ -1314,8 +1314,8 @@  % beware: in mkiv { } were lost so it was not compatible with the non raw -\let\rawprocesscommalist   \processcommalist    % can go -\let\rawprocesscommacommand\processcommacommand % can go +\aliased\let\rawprocesscommalist   \processcommalist    % can go +\aliased\let\rawprocesscommacommand\processcommacommand % can go  %D Here is one without nesting .. still needed? @@ -1330,11 +1330,11 @@  \protected\def\syst_helpers_process_fast_comma_item_next    {\expandafterspaces\syst_helpers_process_fast_comma_item} -\protected\def\fastprocesscommalist[#1]#2% +\permanent\protected\def\fastprocesscommalist[#1]#2%    {\let\fastcommalistcommand#2%     \expandafterspaces\syst_helpers_process_fast_comma_item#1\ignorearguments\ignorearguments\ignorearguments} -\protected\def\fastprocesscommacommand[#1]#2% +\permanent\protected\def\fastprocesscommacommand[#1]#2%    {\let\fastcommalistcommand#2%     \normalexpanded{\noexpand\expandafterspaces\syst_helpers_process_fast_comma_item#1}\ignorearguments\ignorearguments\ignorearguments} @@ -1356,7 +1356,7 @@       \expandafter\syst_helpers_do_if_else_in_set     \fi} -\let\rawdoifinsetelse\rawdoifelseinset +\aliased\let\rawdoifinsetelse\rawdoifelseinset  \def\syst_helpers_do_if_in_set#1%    {\ifhasxtoks{,\m_syst_sub_string,}{,#1,}% @@ -1365,7 +1365,7 @@       \expandafter\gobbleoneargument     \fi} -\protected\def\rawdoifinset#1% or just alias this one +\permanent\protected\def\rawdoifinset#1% or just alias this one    {\edef\m_syst_sub_string{#1}% expand #1 here     \ifx\m_syst_sub_string\m_syst_two_commas       \expandafter\gobbletwoarguments @@ -1548,13 +1548,13 @@  \let\currentvalue\empty -\protected\def\getparameters   {\dogetparameters\dosetvalue} -\protected\def\geteparameters  {\dogetparameters\dosetevalue} -\protected\def\getgparameters  {\dogetparameters\dosetgvalue} -\protected\def\getxparameters  {\dogetparameters\dosetxvalue} -\protected\def\forgetparameters{\dogetparameters\doignorevalue} +\permanent\protected\def\getparameters   {\dogetparameters\dosetvalue} +\permanent\protected\def\geteparameters  {\dogetparameters\dosetevalue} +\permanent\protected\def\getgparameters  {\dogetparameters\dosetgvalue} +\permanent\protected\def\getxparameters  {\dogetparameters\dosetxvalue} +\permanent\protected\def\forgetparameters{\dogetparameters\doignorevalue} -\let\getexpandedparameters\geteparameters +\aliased\let\getexpandedparameters\geteparameters  \def\syst_helpers_grab_parameter_error#1%    {\showassignerror{#1}{\the\inputlineno\space(\m_syst_parameter_n)}} @@ -1578,7 +1578,7 @@  \def\syst_helpers_grab_parameter_next    {\expandafterspaces\syst_helpers_grab_parameter} -\protected\def\dogetparameters#1[#2]#*[#3]% +\permanent\protected\def\dogetparameters#1[#2]#*[#3]%    {\def\m_syst_parameter_n{#2}%     \let\m_syst_parameter_s#1%     \expandafterspaces\syst_helpers_grab_parameter#3\ignorearguments\ignorearguments} @@ -1593,7 +1593,7 @@  %D \getemptyparameters [label] [...=...,...=...]  %D \stoptyping -\protected\def\getemptyparameters[#1]#*[#2]% +\permanent\protected\def\getemptyparameters[#1]#*[#2]%    {\def\syst_helpers_get_empty_parameters##1{\doassignempty[#1][##1]}%     \processcommalist[#2]\syst_helpers_get_empty_parameters} @@ -1618,18 +1618,18 @@  %D We can optimize this one if needed but it's not a core macro so hardly worth the  %D trouble and tokens. -\protected\def\processassignmentlist[#1]#2% #2 == \command{key}{value] +\permanent\protected\def\processassignmentlist[#1]#2% #2 == \command{key}{value]    {\def\syst_helpers_process_assignment_entry##1{#2}% {##2}{##3} % namespace is ignored     \dogetparameters\syst_helpers_process_assignment_entry[][#1]} -\protected\def\processassignmentcommand[#1]% +\permanent\protected\def\processassignmentcommand[#1]%    {\normalexpanded{\processassignmentlist[#1]}} -\protected\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist +\permanent\protected\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist    {\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%     \processassignmentlist[#1]\currentassignmentlistcommand} -\protected\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand +\permanent\protected\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand    {\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%     \normalexpanded{\processassignmentlist[#1]}\currentassignmentlistcommand} @@ -1676,7 +1676,7 @@  %D By using \type {\docopyvalue} we've prepared this command for use in a  %D multi||lingual environment. -\protected\def\copyparameters[#1]#*[#2]#*[#3]% +\permanent\protected\def\copyparameters[#1]#*[#2]#*[#3]%    {\doifnot{#1}{#2}       {\def\syst_helpers_copy_parameter{\docopyvalue{#1}{#2}}% ##1        \processcommalist[#3]\syst_helpers_copy_parameter}} @@ -1748,7 +1748,7 @@    {\commalistcounter\zerocount     \let\commalistsize\!!zerocount} -\protected\def\getcommacommandsize[#1]% +\permanent\protected\def\getcommacommandsize[#1]%    {\normalexpanded{\getcommalistsize[#1]}}  %D Filters: @@ -1771,12 +1771,12 @@  \def\syst_helpers_get_from_comma_list_next    {\expandafterspaces\syst_helpers_get_from_comma_list} -\protected\def\getfromcommalist[#1]#*[#2]% +\permanent\protected\def\getfromcommalist[#1]#*[#2]%    {\let\commalistelement\empty     \commalistcounter#2\relax     \expandafterspaces\syst_helpers_get_from_comma_list#1\ignorearguments\ignorearguments} -\protected\def\getfromcommacommand[#1]% +\permanent\protected\def\getfromcommacommand[#1]%    {\normalexpanded{\getfromcommalist[#1]}}  %D Watertight (and efficient) solutions are hard to find, due to the handling of @@ -1815,7 +1815,7 @@    {\ifcase\scratchcounter\or#1\or#2\or#3\or#4\or#5\or#6\or#7\or#8\or#9\fi     \syst_helpers_gobble_comma_list} -\protected\def\dogetcommacommandelement#1\from#2\to#3% +\permanent\protected\def\dogetcommacommandelement#1\from#2\to#3%    {\scratchcounter#1\relax     \edef#3{\normalexpanded{\syst_helpers_get_comma_list_element#2\ignorearguments\ignorearguments}}} @@ -2339,13 +2339,13 @@  %D Aliases: -\let\dosingleargument    \dosingleempty -\let\dodoubleargument    \dodoubleempty -\let\dotripleargument    \dotripleempty -\let\doquadrupleargument \doquadrupleempty -\let\doquintupleargument \doquintupleempty -\let\dosixtupleargument  \dosixtupleempty -\let\doseventupleargument\doseventupleempty +\aliased\let\dosingleargument    \dosingleempty +\aliased\let\dodoubleargument    \dodoubleempty +\aliased\let\dotripleargument    \dotripleempty +\aliased\let\doquadrupleargument \doquadrupleempty +\aliased\let\doquintupleargument \doquintupleempty +\aliased\let\dosixtupleargument  \dosixtupleempty +\aliased\let\doseventupleargument\doseventupleempty  %D \macros  %D   {strippedcsname} @@ -2358,7 +2358,7 @@  %D  %D This expands to \type{\ifsomething}. -\let\strippedcsname\csstring +\aliased\let\strippedcsname\csstring  %D \macros  %D   {complexorsimple,complexorsimpleempty} @@ -2399,12 +2399,12 @@  %D Many \CONTEXT\ commands started as complex or simple ones, but changed into more  %D versatile (more object oriented) ones using the \type {\get..argument} commands. -\protected\def\complexorsimple#1% +\permanent\protected\def\complexorsimple#1%    {\doifelsenextoptional       {\firstargumenttrue \csname\s!complex\csstring#1\endcsname}       {\firstargumentfalse\csname\s!simple \csstring#1\endcsname}} -\protected\def\complexorsimpleempty#1% +\permanent\protected\def\complexorsimpleempty#1%    {\doifelsenextoptional       {\firstargumenttrue \csname\s!complex\csstring#1\endcsname}       {\firstargumentfalse\csname\s!complex\csstring#1\endcsname[]}} @@ -2421,12 +2421,12 @@  \protected\def\syst_helpers_complex_or_simple_empty#1%    {\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#1[]}} -\protected\def\definecomplexorsimple#1% +\permanent\protected\def\definecomplexorsimple#1%    {\protected\edef#1{\syst_helpers_complex_or_simple       \expandafter\noexpand\csname\s!complex\csstring#1\endcsname       \expandafter\noexpand\csname\s!simple \csstring#1\endcsname}} -\protected\def\definecomplexorsimpleempty#1% +\permanent\protected\def\definecomplexorsimpleempty#1%    {\protected\edef#1{\syst_helpers_complex_or_simple_empty       \expandafter\noexpand\csname\s!complex\csstring#1\endcsname}} @@ -2465,8 +2465,8 @@  \newconditional\c_syst_helpers_permit_spaces_between_groups -\protected\def    \permitspacesbetweengroups{\settrue \c_syst_helpers_permit_spaces_between_groups} -\protected\def\dontpermitspacesbetweengroups{\setfalse\c_syst_helpers_permit_spaces_between_groups} +\permanent\protected\def    \permitspacesbetweengroups{\settrue \c_syst_helpers_permit_spaces_between_groups} +\permanent\protected\def\dontpermitspacesbetweengroups{\setfalse\c_syst_helpers_permit_spaces_between_groups}  \dontpermitspacesbetweengroups @@ -2753,15 +2753,15 @@  %D  %D Trivial: -\protected\def\letempty      #1{\let #1\empty} -\protected\def\globalletempty#1{\glet#1\empty} +\permanent\protected\def\letempty      #1{\let #1\empty} +\permanent\protected\def\globalletempty#1{\glet#1\empty} -\protected\def\letvalueempty #1{\letcsname       #1\endcsname\empty} -\protected\def\letgvalueempty#1{\global\letcsname#1\endcsname\empty} -\protected\def\letvaluerelax #1{\letcsname       #1\endcsname\relax} -\protected\def\letgvalurelax #1{\global\letcsname#1\endcsname\relax} +\permanent\protected\def\letvalueempty #1{\letcsname       #1\endcsname\empty} +\permanent\protected\def\letgvalueempty#1{\global\letcsname#1\endcsname\empty} +\permanent\protected\def\letvaluerelax #1{\letcsname       #1\endcsname\relax} +\permanent\protected\def\letgvalurelax #1{\global\letcsname#1\endcsname\relax} -\protected\def\relaxvalueifundefined#1% +\permanent\protected\def\relaxvalueifundefined#1%    {\ifcsname#1\endcsname \else       \letcsname#1\endcsname\relax     \fi} @@ -2823,7 +2823,7 @@  %D  %D A fully expandable message: -\let\immediatemessage\clf_immediatemessage % {} mandate +\let\immediatemessage\clf_immediatemessage % {} mandate / todo permanent at lua end  %D \macros  %D   {rawgetparameters} @@ -2839,7 +2839,7 @@  \def\syst_helpers_grab_raw_parameter_next    {\expandafterspaces\syst_helpers_grab_raw_parameter} -\protected\def\rawgetparameters#1[#2]#*[#3]% +\permanent\protected\def\rawgetparameters#1[#2]#*[#3]%    {\def\m_syst_parameter_n{#2}%    %\expandafterspaces\syst_helpers_grab_raw_parameter#3\ignorearguments\ignorearguments}     \expandafter\expandafterspaces\expandafter\syst_helpers_grab_raw_parameter#3\ignorearguments\ignorearguments} @@ -2854,13 +2854,13 @@  %D all preceding ones with \type {\redoglobal}. When using only alternatives, one  %D can reset this mechanism with \type {\resetglobal}. -\protected\def\resetglobal +\permanent\protected\def\resetglobal    {\enforced\let\redoglobal\relax     \enforced\let\dodoglobal\relax}  \resetglobal -\protected\def\doglobal +\permanent\protected\def\doglobal    {\ifx\redoglobal\relax       \enforced\let\redoglobal\global       \enforced\let\dodoglobal\syst_helpers_dodo_global @@ -2877,7 +2877,7 @@    {\enforced\let\redoglobal\syst_helpers_redo_global     \enforced\let\dodoglobal\syst_helpers_dodo_global} -%D Whatever: +%D Whatever (will be overtoaded):  \protected\def\define#1%    {\ifdefined#1% @@ -2887,13 +2887,13 @@       \protected\expandafter\def     \fi#1} -\protected\def\redefine#1% +\permanent\protected\def\redefine#1%    {\ifdefined#1%       \message{[\noexpand#1is redefined]}%     \fi     \protected\def#1} -\protected\def\definemacro#1% +\permanent\protected\def\definemacro#1%    {\ifdefined#1%       \message{[\noexpand#1is already defined]}%       \protected\expandafter\def\expandafter\gobbleddefinition @@ -2999,7 +2999,7 @@  \def\zerocountervalue{0} -\protected\def\newcounter#1% +\permanent\protected\def\newcounter#1%    {\dodoglobal\let#1\zerocountervalue}  %D Nowadays we don't mind a few more tokens if we can gain a bit of speed. @@ -3020,14 +3020,14 @@     \def\m_syst_action_nop{\syst_helpers_do_do_do_decrement#1,\plusone}%     \doifelsenextcharcs,\m_syst_action_yes\m_syst_action_nop} -\protected\def\increment{\doifelsenextcharcs(\syst_helpers_do_do_increment\syst_helpers_do_increment} -\protected\def\decrement{\doifelsenextcharcs(\syst_helpers_do_do_decrement\syst_helpers_do_decrement} +\permanent\protected\def\increment{\doifelsenextcharcs(\syst_helpers_do_do_increment\syst_helpers_do_increment} +\permanent\protected\def\decrement{\doifelsenextcharcs(\syst_helpers_do_do_decrement\syst_helpers_do_decrement} -\protected\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}} -\protected\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}} +\permanent\protected\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}} +\permanent\protected\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}} -\protected\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname} -\protected\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname} +\permanent\protected\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname} +\permanent\protected\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname}  %D \macros  %D  {newsignal} @@ -3046,7 +3046,7 @@  \newdimen\maximumsignal % step is about 0.00025pt -\protected\def\newsignal#1% +\permanent\protected\def\newsignal#1%    {\ifdefined#1\else       \advance\maximumsignal 2\scaledpoint % to be save in rounding       \edef#1{\the\maximumsignal}% @@ -3061,14 +3061,14 @@  %D \csname if\strippedcsname\something\endcsname  %D \stoptyping -\let\checkedstrippedcsname\csstring +\aliased\let\checkedstrippedcsname\csstring  %D \macros  %D   {savenormalmeaning}  %D  %D We will use this one in: -\protected\def\savenormalmeaning#1% +\permanent\protected\def\savenormalmeaning#1%    {\ifcsname normal\csstring#1\endcsname \else       \letcsname normal\csstring#1\endcsname#1%     \fi} @@ -3168,7 +3168,7 @@  % \protected\def\syst_helpers_stepwise_exit  %   {\syst_helpers_stepwise_recurse_nop\relax} -\def\doexpandedrecurse#1#2% user macro (also was \doxprecurse) +\permanent\def\doexpandedrecurse#1#2% user macro (also was \doxprecurse)    {\ifnum#1>\zerocount       #2\expandafter\doexpandedrecurse\expandafter{\the\numexpr#1-\plusone\relax}{#2}%     \fi} @@ -3190,7 +3190,7 @@  %D  %D Because the simple case (n=1) is used often, we implement it more efficiently: -\protected\def\dorecurse#1% +\permanent\protected\def\dorecurse#1%    {\ifcase#1\relax       \expandafter\gobbletwoarguments     \or @@ -3225,7 +3225,7 @@  %D \dowith{a,b,c}{[#1]}  %D \stoptyping -\protected\def\dowith#1#2% +\permanent\protected\def\dowith#1#2%    {\def\syst_helpers_with##1{#2}%     \normalexpanded{\processcommalist[#1]}\syst_helpers_with} @@ -3245,14 +3245,14 @@  %D  %D When needed, one can call for \type {\looplevel} and \type {\loopdepth}. -\let\endofloop\donothing % maybe \syst_helpers_loop_end +\aliased\let\endofloop\donothing % maybe \syst_helpers_loop_end -\protected\def\doloop#1% +\permanent\protected\def\doloop#1%    {\global\advance\outerrecurse \plusone     \globalpushmacro\recurseaction     \globalpushmacro\recurselevel     \protected\gdef\recurseaction##1##2{#1}% -   \let\endofloop\syst_helpers_loop +   \enforced\let\endofloop\syst_helpers_loop     \syst_helpers_loop1}% no \plusone else \recurselevel wrong  \protected\def\syst_helpers_loop#1% @@ -3264,15 +3264,15 @@     \endofloop}  \protected\def\syst_helpers_loop_nop#0% -  {\let\endofloop\syst_helpers_loop +  {\enforced\let\endofloop\syst_helpers_loop     \globalpopmacro\recurselevel     \globalpopmacro\recurseaction     \global\advance\outerrecurse\minusone} -\protected\def\exitloop                % \exitloop quits at end -  {\let\endofloop\syst_helpers_loop_nop} +\permanent\protected\def\exitloop                % \exitloop quits at end +  {\enforced\let\endofloop\syst_helpers_loop_nop} -\protected\def\exitloopnow#0\endofloop % \exitloopnow quits directly +\permanent\protected\def\exitloopnow#0\endofloop % \exitloopnow quits directly    {\syst_helpers_loop_nop}  %D The loop is executed at least once, so beware of situations like: @@ -3358,7 +3358,7 @@  %    \globalpopmacro\recurseaction  %    \global\advance\outerrecurse\minusone} -\protected\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 ... todo: remove unused helpers +\permanent\protected\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 ... todo: remove unused helpers    {\global\advance\outerrecurse \plusone     \globalpushmacro\recurseaction     \globalpushmacro\recurselevel @@ -3388,7 +3388,7 @@  \let\m_syst_helpers_fast_loop_cs\relax -\protected\def\dofastloopcs#1% +\permanent\protected\def\dofastloopcs#1%    {\fastloopfinal#1\relax     \ifcase\fastloopfinal       \expandafter\gobbleoneargument @@ -3412,7 +3412,7 @@  % Helper: -\protected\def\resetrecurselevel{\let\recurselevel\!!zerocount} +\permanent\protected\def\resetrecurselevel{\let\recurselevel\!!zerocount}  \let\recurselevel\!!zerocount @@ -3441,7 +3441,7 @@  %D  }  %D \stoptyping -\protected\def\doloopoverlist#1#2% +\permanent\protected\def\doloopoverlist#1#2%    {\global\advance\outerrecurse\plusone     \globalpushmacro\recurseaction     \globalpushmacro\recursestring @@ -3471,13 +3471,13 @@  %D \def\MyMacro#1{(#1)} \ctxluamatch \MyMacro {(.)} {abcd}  %D \stoptyping -\protected\def\doloopovermatch#1#2#3% +\permanent\protected\def\doloopovermatch#1#2#3%    {\pushmacro\matchloopcommand     \def\matchloopcommand##1##2##3##4##5##6##7##8##9{#3}%     \ctxluamatch\matchloopcommand{#1}{#2}%     \popmacro\matchloopcommand} -\def\doloopovermatched#1#2#3% +\permanent\def\doloopovermatched#1#2#3%    {\beginlocalcontrol       \pushmacro\matchloopcommand       \def\matchloopcommand##1##2##3##4##5##6##7##8##9{#3}% @@ -3511,11 +3511,11 @@  \installsystemnamespace{extraevery} -\protected\def\newevery#1#2% +\permanent\protected\def\newevery#1#2%    {\ifx#1\everypar\else\newtoks#1\fi% we test for redefinition elsewhere     \ifx#2\relax\orelse\ifdefined#2\else       \expandafter\newtoks\csname\??extraevery\csstring#1\endcsname -     \edef#2{\syst_helpers_every#1\csname\??extraevery\csstring#1\endcsname}% +     \frozen\protected\edef#2{\syst_helpers_every#1\csname\??extraevery\csstring#1\endcsname}%     \fi}  \protected\def\syst_helpers_every#1#2% @@ -3532,7 +3532,7 @@  \newtoks \neverypar -\protected\def\forgeteverypar +\permanent\protected\def\forgeteverypar    {\everypar{\the\neverypar}}  %D Which we're going to use indeed! When the second argument equals \type {\relax}, @@ -3598,10 +3598,10 @@  %D  %D Both commands accept the prefix \type{\doglobal} for global assignments. -\protected\def\convertvalue#1\to +\permanent\protected\def\convertvalue#1\to    {\expandafter\convertcommand\csname#1\endcsname\to} -\protected\def\defconvertedvalue#1#2% less sensitive for \to +\permanent\protected\def\defconvertedvalue#1#2% less sensitive for \to    {\expandafter\defconvertedcommand\expandafter#1\csname#2\endcsname}  %D \macros @@ -3634,51 +3634,51 @@  %D  %D \typebuffer gives: \blank \getbuffer \blank -\protected\def\doifelseassignment#1% +\permanent\protected\def\doifelseassignment#1%    {\ifhastok={#1}%       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\protected\def\doifelseassignmentcs#1#2#3% +\permanent\protected\def\doifelseassignmentcs#1#2#3%    {\ifhastok={#1}%       \expandafter#2%     \else       \expandafter#3%     \fi} -\let\doifassignmentelse  \doifelseassignment -\let\doifassignmentelsecs\doifelseassignmentcs +\aliased\let\doifassignmentelse  \doifelseassignment +\aliased\let\doifassignmentelsecs\doifelseassignmentcs  \newif\ifassignment -\protected\def\docheckassignment#1% +\permanent\protected\def\docheckassignment#1%    {\ifhastok={#1}%       \assignmenttrue     \else       \assignmentfalse     \fi} -\protected\def\validassignment  #1{\ifhastok={#1}} % can become: {\ifhastok=} as we enforce {} -\protected\def\novalidassignment#1{\ifnum\ifhastok={#1}\zerocount\else\plusone\fi=\plusone} % or use unless +\permanent\protected\def\validassignment  #1{\ifhastok={#1}} % can become: {\ifhastok=} as we enforce {} +\permanent\protected\def\novalidassignment#1{\ifnum\ifhastok={#1}\zerocount\else\plusone\fi=\plusone} % or use unless  %D In \ETEX\ we can use \type {\detokenize} and gain some speed, but in general far  %D less that 1\% for \type {\convertargument} and nil for \type {\convertcommand}.  %D This macro is more robust than the pure \TEX\ one, something I found out when  %D primitives like \type {\jobname} were fed (or something undefined). -\protected\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}} -\protected\def\convertcommand #1\to#2{\dodoglobal\edef#2{\expandafter\detokenize\expandafter{#1}}} % hm, only second is also ok +\permanent\protected\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}} +\permanent\protected\def\convertcommand #1\to#2{\dodoglobal\edef#2{\expandafter\detokenize\expandafter{#1}}} % hm, only second is also ok -\protected\def\defconvertedargument #1#2{\edef#1{\detokenize{#2}}} -\protected\def\defconvertedcommand  #1#2{\edef#1{\detokenize\expandafter{#2}}} -\protected\def\edefconvertedargument#1#2{\edef#1{#2}% -                                          \edef#1{\detokenize\expandafter{#1}}} -\protected\def\gdefconvertedargument#1#2{\xdef#1{\detokenize{#2}}} -\protected\def\gdefconvertedcommand #1#2{\xdef#1{\detokenize\expandafter{#2}}} -\protected\def\xdefconvertedargument#1#2{\xdef#1{#2}% -                                          \xdef#1{\detokenize\expandafter{#1}}} +\permanent\protected\def\defconvertedargument #1#2{\edef#1{\detokenize{#2}}} +\permanent\protected\def\defconvertedcommand  #1#2{\edef#1{\detokenize\expandafter{#2}}} +\permanent\protected\def\edefconvertedargument#1#2{\edef#1{#2}% +                                                   \edef#1{\detokenize\expandafter{#1}}} +\permanent\protected\def\gdefconvertedargument#1#2{\xdef#1{\detokenize{#2}}} +\permanent\protected\def\gdefconvertedcommand #1#2{\xdef#1{\detokenize\expandafter{#2}}} +\permanent\protected\def\xdefconvertedargument#1#2{\xdef#1{#2}% +                                                   \xdef#1{\detokenize\expandafter{#1}}}  %D When you try to convert a primitive command, you'll find out that the \ETEX\  %D method fails on for instance \type {\jobname} in the sense that it returns the @@ -3701,7 +3701,7 @@  %D  %D Ahandy macro, for testing purposes only: -\protected\def\showvalue#1% +\permanent\protected\def\showvalue#1%    {\ifcsname#1\endcsname       \expandafter\show\csname#1\endcsname     \else @@ -3721,7 +3721,7 @@  %D  %D Watch the one level expansion of the second argument. -\protected\def\doifelsemeaning#1#2% +\permanent\protected\def\doifelsemeaning#1#2%    {\edef\m_syst_string_one{\normalmeaning#1}%     \def \m_syst_string_two{#2}%     \edef\m_syst_string_two{\normalmeaning\m_syst_string_two}% @@ -3731,7 +3731,7 @@       \expandafter\secondoftwoarguments     \fi} -\let\doifmeaningelse\doifelsemeaning +\aliased\let\doifmeaningelse\doifelsemeaning  %D \macros  %D   {doifsamestringselse,doifsamestring,doifnotsamestring} @@ -3750,11 +3750,11 @@     \edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#4}}}%     \ifx\m_syst_string_one\m_syst_string_two\expandafter#1\else\expandafter#2\fi} -\protected\def\doifelsesamestring{\syst_helpers_if_samestring_else\firstoftwoarguments\secondoftwoarguments} -\protected\def\doifsamestring    {\syst_helpers_if_samestring_else\firstofoneargument \gobbleoneargument   } -\protected\def\doifnotsamestring {\syst_helpers_if_samestring_else\gobbleoneargument  \firstofoneargument  } +\permanent\protected\def\doifelsesamestring{\syst_helpers_if_samestring_else\firstoftwoarguments\secondoftwoarguments} +\permanent\protected\def\doifsamestring    {\syst_helpers_if_samestring_else\firstofoneargument \gobbleoneargument   } +\permanent\protected\def\doifnotsamestring {\syst_helpers_if_samestring_else\gobbleoneargument  \firstofoneargument  } -\let\doifsamestringelse\doifelsesamestring +\aliased\let\doifsamestringelse\doifelsesamestring  % BEGIN OF OBSOLETE % @@ -3782,7 +3782,7 @@  %D  %D In examples~2 and~3 both arguments equal, in~1 and~4 they differ. -\protected\def\ConvertToConstant#1#2#3% +\permanent\protected\def\ConvertToConstant#1#2#3% will go    {\edef\m_syst_string_one{\expandafter\detokenize\expandafter{#2}}%     \edef\m_syst_string_two{\expandafter\detokenize\expandafter{#3}}%     #1{\m_syst_string_one}{\m_syst_string_two}} @@ -3812,14 +3812,14 @@  %D  %D where \type {...} can be anything legally \TEX. -\protected\def\CheckConstantAfter#1#2% +\permanent\protected\def\CheckConstantAfter#1#2% will go    {\expandafter\convertargument\v!prefix!\to\ascii     \convertargument#1\to#2\relax     \doifelseinstring\ascii{#2}       {\expandafter\convertargument#1\to#2}       {}} -\protected\def\ConvertConstantAfter#1#2#3% +\permanent\protected\def\ConvertConstantAfter#1#2#3% will go    {\CheckConstantAfter{#2}\asciia     \CheckConstantAfter{#3}\asciib     #1{\asciia}{\asciib}} @@ -3837,7 +3837,7 @@  %D  %D We don't explicitly test if the macro is defined. -\protected\def\assignifempty#1#2% +\permanent\protected\def\assignifempty#1#2%    {\iftok{#1}\emptytoks \def#1{#2}\fi}  %D \macros @@ -3881,7 +3881,7 @@  \protected\def\syst_helpers_grab#1#2%    {\def\syst_helpers_grab_indeed##1#1{#2{##1}}\syst_helpers_grab_indeed} -\protected\def\grabuntil#1% +\permanent\protected\def\grabuntil#1%    {\expandafter\syst_helpers_grab\expandafter{\csname#1\endcsname}}  %D The next command build on this mechanism: @@ -3908,7 +3908,7 @@  \let\syst_helpers_gobble_indeed\relax -\protected\def\processbetween#1#2% +\permanent\protected\def\processbetween#1#2%    {\setvalue{\s!start#1}{\grabuntil{\s!stop#1}{#2}}}  % \protected\def\gobbleuntil#1% @@ -3917,10 +3917,10 @@  % \protected\def\gobbleuntilrelax#1\relax  %   {} -\protected\def\gobbleuntil#1% +\permanent\protected\def\gobbleuntil#1%    {\def\syst_helpers_gobble_indeed##-#1{}\syst_helpers_gobble_indeed} -\protected\def\gobbleuntilrelax#-\relax +\permanent\protected\def\gobbleuntilrelax#-\relax    {}  %D The next one simply expands the pickup up tokens. @@ -3931,7 +3931,7 @@  \let\syst_helpers_until_indeed\relax -\protected\def\processuntil#1% +\permanent\protected\def\processuntil#1%    {\def\syst_helpers_until_indeed##1#1{##1}\syst_helpers_until_indeed}  %D \macros @@ -4091,32 +4091,32 @@  %D {\futurelet} obeys blank spaces, and a line||ending token is treated as a blank  %D space. So the final implementation became: -\protected\def\groupedcommand#1#2% +\permanent\protected\def\groupedcommand#1#2%    {\def\m_syst_helpers_handle_group_b{#1}%     \def\m_syst_helpers_handle_group_a{#2}%     \futureexpandis\bgroup\syst_helpers_handle_group_normal\syst_helpers_handle_group_nop} -\protected\def\groupedcommandcs#1#2% +\permanent\protected\def\groupedcommandcs#1#2%    {\let\m_syst_helpers_handle_group_b#1%     \let\m_syst_helpers_handle_group_a#2%     \futureexpandis\bgroup\syst_helpers_handle_group_normal\syst_helpers_handle_group_nop} -\protected\def\simplegroupedcommand#1#2% +\permanent\protected\def\simplegroupedcommand#1#2%    {\def\m_syst_helpers_handle_group_b{#1}%     \def\m_syst_helpers_handle_group_a{#2}%     \futureexpandis\bgroup\syst_helpers_handle_group_simple\syst_helpers_handle_group_nop} -\protected\def\pickupgroupedcommand#1#2#3% +\permanent\protected\def\pickupgroupedcommand#1#2#3%    {\def\m_syst_helpers_handle_group_b{#1}%     \def\m_syst_helpers_handle_group_a{#2}%     \def\m_syst_helpers_handle_group_p{#3}%     \futureexpandis\bgroup\syst_helpers_handle_group_pickup\syst_helpers_handle_group_nop} -\protected\def\triggergroupedcommand#1% +\permanent\protected\def\triggergroupedcommand#1%    {\def\m_syst_helpers_handle_group_b{#1}%     \futureexpandis\bgroup\syst_helpers_handle_group_normal_x\syst_helpers_handle_group_nop_x} -\protected\def\triggergroupedcommandcs#1% +\permanent\protected\def\triggergroupedcommandcs#1%    {\let\m_syst_helpers_handle_group_b#1%     \futureexpandis\bgroup\syst_helpers_handle_group_normal_x\syst_helpers_handle_group_nop_x} @@ -4203,19 +4203,19 @@  \let\syst_helpers_par_before\relax  \let\syst_helpers_par_around\relax -\protected\def\dowithpar#1#2% +\permanent\protected\def\dowithpar#1#2%    {\globalpushmacro\syst_helpers_par_around     \def\syst_helpers_par_around##1\par{#1##1#2\globalpopmacro\syst_helpers_par_around}%     \expandafter\syst_helpers_par_around\ignorepars} -\protected\def\dogotopar#1% +\permanent\protected\def\dogotopar#1%    {\globalpushmacro\syst_helpers_par_before     \def\syst_helpers_par_before{#1\globalpopmacro\syst_helpers_par_before}%     \expandafter\syst_helpers_par_before\ignorepars} -\let\dogotoparcs\dogotopar +\aliased\let\dogotoparcs\dogotopar -\protected\def\dogotoparstart +\permanent\protected\def\dogotoparstart    {\ignorepars}  %D This is old and kind of obsolete: @@ -4223,7 +4223,7 @@  \newtoks\BeforePar  \newtoks\AfterPar -\protected\def\GetPar +\permanent\protected\def\GetPar    {\expanded       {\dowithpar          {\the\BeforePar @@ -4232,7 +4232,7 @@           \BeforePar\emptytoks           \AfterPar\emptytoks}}} -\protected\def\GotoPar +\permanent\protected\def\GotoPar    {\expanded       {\dogotopar          {\the\BeforePar @@ -4271,7 +4271,7 @@  \let\syst_helpers_next_par\relax  \let\syst_helpers_next_arg\relax -\protected\def\dowithpargument#1% +\permanent\protected\def\dowithpargument#1%    {\def\syst_helpers_next_par##1 \par{#1{##1}}%     \def\syst_helpers_next_arg##1{#1{##1}}%     \doifelsenextbgroup\syst_helpers_next_arg{\doifelsenextchar\par{#1{}}\syst_helpers_next_par}} @@ -4299,7 +4299,7 @@  \let\syst_helpers_next_war\relax  \let\syst_helpers_next_arg\relax -\protected\def\dowithwargument#1% +\permanent\protected\def\dowithwargument#1%    {\def\syst_helpers_next_war##1 {#1{##1}}%     \def\syst_helpers_next_arg##1{#1{##1}}%     \doifelsenextbgroup\syst_helpers_next_arg\syst_helpers_next_war} @@ -4333,7 +4333,7 @@  %D commands, the \type {n*} is optional. When this specification is missing, the  %D command executes once. -\protected\def\dorepeatwithcommand[#1]% +\permanent\protected\def\dorepeatwithcommand[#1]%    {\syst_helpers_repeat_with_command#1*\empty*\relax}  \def\syst_helpers_repeat_with_command#1*#2#3*#4\relax#5% @@ -4378,8 +4378,8 @@  %D The next macro is meant for situations where both strings are macros. This save  %D some unneeded expansion. But now we just alias. -\let\doifelsestringinstring\doifelseinstring -\let\doifstringinstringelse\doifelseinstring +\aliased\let\doifelsestringinstring\doifelseinstring +\aliased\let\doifstringinstringelse\doifelseinstring  %D \macros  %D   {appendtoks,prependtoks,appendtoksonce,prependtoksonce, @@ -4400,7 +4400,7 @@  \newtoks\t_syst_helpers_scratch  \let    \m_syst_helpers_scratch\empty -\protected\def\appendtoks#1\to#2% +\permanent\protected\def\appendtoks#1\to#2%    {\ifx\dodoglobal\relax       \expandafter\toksapp     \else @@ -4408,7 +4408,7 @@       \expandafter\gtoksapp     \fi#2{#1}} -\protected\def\prependtoks#1\to#2% +\permanent\protected\def\prependtoks#1\to#2%    {\ifx\dodoglobal\relax       \expandafter\tokspre     \else @@ -4446,26 +4446,26 @@  %      \syst_helpers_prepend_toks_indeed  %    \fi} -\protected\def\appendtoksonce#1\to#2% +\permanent\protected\def\appendtoksonce#1\to#2%    {\ifhasxtoks{#1}#2\else       \appendtoks#1\to#2%     \fi} -\protected\def\prependtoksonce#1\to#2% +\permanent\protected\def\prependtoksonce#1\to#2%    {\ifhasxtoks{#1}{#2}\m_syst_helpers_scratch\else       \prependtoks#1\to#2%     \fi}  %D The test macro: -\protected\def\doifelseintoks#1#2% #1 en #2 zijn toks +\permanent\protected\def\doifelseintoks#1#2% #1 en #2 zijn toks    {\ifhasxtoks#1#2%       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\let\doifintokselse\doifelseintoks +\aliased\let\doifintokselse\doifelseintoks  %D Moved from \type {lxml-ini.tex} to here. This one is for generators that collect  %D stuff piecewise, which is sometimes hard on mechanisms that grab content using @@ -4488,14 +4488,14 @@  \newtoks \collectingtoks -\protected\def\startcollect        #1\stopcollect        {\toksapp \collectingtoks{#1}} -\protected\def\startexpandedcollect#1\stopexpandedcollect{\etoksapp\collectingtoks{#1}} +\permanent\protected\def\startcollect        #1\stopcollect        {\toksapp \collectingtoks{#1}} +\permanent\protected\def\startexpandedcollect#1\stopexpandedcollect{\etoksapp\collectingtoks{#1}} -\protected\def\startcollecting{\collectingtoks\emptytoks} -\protected\def\stopcollecting {\the\collectingtoks} +\permanent\protected\def\startcollecting{\collectingtoks\emptytoks} +\permanent\protected\def\stopcollecting {\the\collectingtoks} -\protected\def\collect        {\toksapp \collectingtoks} -\protected\def\collectexpanded{\etoksapp\collectingtoks} +\permanent\protected\def\collect        {\toksapp \collectingtoks} +\permanent\protected\def\collectexpanded{\etoksapp\collectingtoks}  %D A nice one too: @@ -4505,7 +4505,7 @@  % {\scratchtoks{xaa} \removetoks x\from\scratchtoks [\the\scratchtoks]}  % {\scratchtoks{a\relax b} \removetoks \relax\from\scratchtoks [\showthe\scratchtoks]} -\protected\def\removetoks#1\from#2% +\permanent\protected\def\removetoks#1\from#2%    {\def\syst_helpers_remove_toks##1#1##2\empty\empty\empty##3^^^^0004%       {\def\m_syst_string_one{##3}%        \ifempty\m_syst_string_one#2{##1}\else#2{##1##2}\fi}% @@ -4513,7 +4513,7 @@  %D Also: -\protected\def\appendetoks#1\to#2% +\permanent\protected\def\appendetoks#1\to#2%    {\ifx\dodoglobal\relax       \expandafter\etoksapp     \else @@ -4521,7 +4521,7 @@       \expandafter\xtoksapp     \fi#2{#1}} -\protected\def\prependetoks#1\to#2% +\permanent\protected\def\prependetoks#1\to#2%    {\ifx\dodoglobal\relax       \expandafter\etokspre     \else @@ -4531,12 +4531,12 @@  %D Hm. -\protected\def\flushtoks#1% nb: can reassign to #1 again, hence the indirectness +\permanent\protected\def\flushtoks#1% nb: can reassign to #1 again, hence the indirectness    {\t_syst_helpers_scratch#1\relax     \dodoglobal#1\emptytoks     \the\t_syst_helpers_scratch\relax} -\let\dotoks\the +\aliased\let\dotoks\the  %D \macros  %D   {beforesplitstring,aftersplitstring} @@ -4556,7 +4556,7 @@  \let\syst_helpers_split_string\relax -\protected\def\beforesplitstring#1\at#2\to#3% +\permanent\protected\def\beforesplitstring#1\at#2\to#3%    {\def\syst_helpers_split_string##1#2##0^^^^0004% no #- as we need to count       {\ifarguments          \let#3\empty @@ -4567,7 +4567,7 @@       \fi}%     \expandafter\syst_helpers_split_string#1^^^^0004\ignorearguments\ignorearguments} -\protected\def\aftersplitstring#1\at#2\to#3% +\permanent\protected\def\aftersplitstring#1\at#2\to#3%    {\def\syst_helpers_split_string##0#2##2^^^^0004% no #- as we need to count       {\ifarguments          \let#3\empty @@ -4583,7 +4583,7 @@  %D  %D A bonus macro. -\protected\def\splitstring#1\at#2\to#3\and#4% +\permanent\protected\def\splitstring#1\at#2\to#3\and#4%    {\def\syst_helpers_split_string##1#2##2^^^^0004%       {\ifarguments          \let#3\empty @@ -4597,7 +4597,7 @@       \fi}%     \expandafter\syst_helpers_split_string#1^^^^0004\ignorearguments\ignorearguments} -\protected\def\greedysplitstring#1\at#2\to#3\and#4% +\permanent\protected\def\greedysplitstring#1\at#2\to#3\and#4%    {\def\syst_helpers_split_string##1#2##2^^^^0004%       {\ifarguments          \let#3\empty @@ -4625,9 +4625,9 @@  %D    aftertestandsplitstring,  %D    testandsplitstring} -\let\beforetestandsplitstring\beforesplitstring +\aliased\let\beforetestandsplitstring\beforesplitstring -\protected\def\aftertestandsplitstring#1\at#2\to#3% +\permanent\protected\def\aftertestandsplitstring#1\at#2\to#3%    {\def\syst_helpers_split_string##0#2##2^^^^0004% no #- as we need to count       {\ifarguments          \let#3\empty @@ -4638,7 +4638,7 @@       \fi}%     \expandafter\syst_helpers_split_string#1^^^^0004\ignorearguments\ignorearguments} -\protected\def\testandsplitstring#1\at#2\to#3\and#4% +\permanent\protected\def\testandsplitstring#1\at#2\to#3\and#4%    {\def\syst_helpers_split_string##1#2##2^^^^0004%       {\ifarguments          \let#3\empty @@ -4653,17 +4653,7 @@     \expandafter\syst_helpers_split_string#1^^^^0004\ignorearguments\ignorearguments}  %D \macros -%D   {splitatperiod, -%D   {splitatcomma, -%D    splitatasterisk, -%D    splitatcolon, -%D    splitatcolons} - -% \protected\def\syst_helpers_splitatperiod    #1.#2.#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -% \protected\def\syst_helpers_splitatcomma     #1,#2,#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -% \protected\def\syst_helpers_splitatasterisk  #1*#2*#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -% \protected\def\syst_helpers_splitatcolon     #1:#2:#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -% \protected\def\syst_helpers_splitatcolons  #1::#2::#0^^^^0004#4#5{\edef#4{#1}\edef#5{#2}} +%D   {splitatperiod, splitatcomma, splitatasterisk, splitatcolon, splitatcolons}  \protected\def\syst_helpers_splitatperiod    #1.#2.#-^^^^0004#3#4{\def #3{#1}\def #4{#2}}  \protected\def\syst_helpers_splitatcomma     #1,#2,#-^^^^0004#3#4{\def #3{#1}\def #4{#2}} @@ -4671,11 +4661,11 @@  \protected\def\syst_helpers_splitatcolon     #1:#2:#-^^^^0004#3#4{\def #3{#1}\def #4{#2}}  \protected\def\syst_helpers_splitatcolons  #1::#2::#-^^^^0004#3#4{\edef#3{#1}\edef#4{#2}} -\protected\def\splitatperiod  #1{\normalexpanded{\syst_helpers_splitatperiod  #1}..^^^^0004} -\protected\def\splitatcomma   #1{\normalexpanded{\syst_helpers_splitatcomma   #1},,^^^^0004}    % not at ", " -\protected\def\splitatasterisk#1{\normalexpanded{\syst_helpers_splitatasterisk#1}**^^^^0004} -\protected\def\splitatcolon   #1{\normalexpanded{\syst_helpers_splitatcolon   #1}::^^^^0004} -\protected\def\splitatcolons  #1{\normalexpanded{\syst_helpers_splitatcolons  #1}::::^^^^0004} +\permanent\protected\def\splitatperiod  #1{\normalexpanded{\syst_helpers_splitatperiod  #1}..^^^^0004} +\permanent\protected\def\splitatcomma   #1{\normalexpanded{\syst_helpers_splitatcomma   #1},,^^^^0004}    % not at ", " +\permanent\protected\def\splitatasterisk#1{\normalexpanded{\syst_helpers_splitatasterisk#1}**^^^^0004} +\permanent\protected\def\splitatcolon   #1{\normalexpanded{\syst_helpers_splitatcolon   #1}::^^^^0004} +\permanent\protected\def\splitatcolons  #1{\normalexpanded{\syst_helpers_splitatcolons  #1}::::^^^^0004}  %D \macros  %D   {removesubstring} @@ -4688,7 +4678,7 @@  %D  %D Which in terms of \TEX\ looks like: -\protected\def\removesubstring#1\from#2\to#3% +\permanent\protected\def\removesubstring#1\from#2\to#3%    {\splitstring#2\to\m_syst_string_one\and\m_syst_string_two     \dodoglobal#3{\m_syst_string_one\m_syst_string_two}} @@ -4745,36 +4735,36 @@  %D  %D The faster alternatives are: -\protected\def\appendtocommalist#1#2% +\permanent\protected\def\appendtocommalist#1#2%    {\dodoglobal\edef#2{\ifempty#2\else#2,\fi#1}} -\protected\def\prependtocommalist#1#2% +\permanent\protected\def\prependtocommalist#1#2%    {\dodoglobal\edef#2{#1\ifempty#2\else,#2\fi}} -\protected\def\addtocommalist#1#2% {item} \cs +\permanent\protected\def\addtocommalist#1#2% {item} \cs    {\rawdoifelseinset{#1}#2\resetglobal       {\dodoglobal\edef#2{\ifempty#2\else#2,\fi#1}}} -\protected\def\pretocommalist#1#2% {item} \cs +\permanent\protected\def\pretocommalist#1#2% {item} \cs    {\rawdoifelseinset{#1}#2\resetglobal       {\dodoglobal\edef#2{#1\ifempty#2\else,#2\fi}}} -\protected\def\robustdoifelseinset#1#2% +\permanent\protected\def\robustdoifelseinset#1#2%    {\edef\m_syst_string_one{\detokenize\expandafter{\normalexpanded{#1}}}%     \edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#2}}}%     \rawdoifelseinset\m_syst_string_one\m_syst_string_two} -\let\robustdoifinsetelse\robustdoifelseinset +\aliased\let\robustdoifinsetelse\robustdoifelseinset -\protected\def\robustaddtocommalist#1#2% {item} \cs +\permanent\protected\def\robustaddtocommalist#1#2% {item} \cs    {\robustdoifelseinset{#1}#2\resetglobal       {\dodoglobal\edef#2{\ifempty#2\else#2,\fi#1}}} -\protected\def\robustpretocommalist#1#2% {item} \cs +\permanent\protected\def\robustpretocommalist#1#2% {item} \cs    {\robustdoifelseinset{#1}#2\resetglobal       {\dodoglobal\edef#2{#1\ifempty#2\else,#2\fi}}} -\protected\def\xsplitstring#1#2% \cs {str} +\permanent\protected\def\xsplitstring#1#2% \cs {str}   %{\def\syst_helpers_split_string##1,#2,##2,#2,##3\\%    {\def\syst_helpers_split_string##1,#2,##2,#2,##-\\%       {\edef\m_syst_string_one{\bcleanedupcommalist##1\empty\empty\relax}% @@ -4786,7 +4776,7 @@  %def\acleanedupcommalist#1,,#2\relax{#1}  \def\acleanedupcommalist#1,,#-\relax{#1} -\protected\def\removefromcommalist#1#2% to be sped up +\permanent\protected\def\removefromcommalist#1#2% to be sped up    {\rawdoifelseinset{#1}#2%       {\normalexpanded{\xsplitstring\noexpand#2{#1}}%        \dodoglobal\edef#2% @@ -4816,7 +4806,7 @@       \edef\m_syst_string_four{\ifempty\m_syst_string_four\else\m_syst_string_four,\fi#1}%     \fi} -\protected\def\substituteincommalist#1#2#3% old, new, list (slooow) +\permanent\protected\def\substituteincommalist#1#2#3% old, new, list (slooow)    {\edef\m_syst_string_one{#1}%     \edef\m_syst_string_two{#2}%     \let\m_syst_string_four\empty @@ -4879,7 +4869,7 @@     \fi     \advance\commalistcounter\plusone} -\protected\def\replaceincommalist#1#2% #1 = commalistelement #2 = position starts at 1 +\permanent\protected\def\replaceincommalist#1#2% #1 = commalistelement #2 = position starts at 1    {\c_syst_helpers_comma_list_index#2\relax     \let\m_syst_helpers_comma_list_target\empty     \let\commalistelement\empty @@ -4903,7 +4893,7 @@       \expandafter\syst_helpers_comma_list_command_global_step     \fi} -\protected\def\globalprocesscommalist[#1]#2% +\permanent\protected\def\globalprocesscommalist[#1]#2%    {\glet\m_syst_helpers_comma_list_command_global#2%     \expandafter\syst_helpers_comma_list_command_global_step#1,],} @@ -4932,7 +4922,7 @@  % that \TEX\ was written, it made no sense to add a lot of that. After decades we know  % what extras we need. -\def\withoutpt#1{\thewithoutunit\dimexpr#1} % best use the primitive directly +\permanent\def\withoutpt#1{\thewithoutunit\dimexpr#1} % best use the primitive directly  %D The capitals are needed because \type {p} and \type {t} have catcode~12, while  %D macronames only permit tokens with the catcode~11. As a result we cannot use the @@ -4943,7 +4933,7 @@  % \def\PtToCm#1%  %   {\withoutpt\the\dimexpr0.0351459804\dimexpr#1\relax\relax cm} -\def\PtToCm#1{\thewithoutunit\dimexpr0.0351459804\dimexpr#1\relax\relax cm} +\permanent\def\PtToCm#1{\thewithoutunit\dimexpr0.0351459804\dimexpr#1\relax\relax cm}  %D We also support:  %D @@ -4957,8 +4947,8 @@  % \dimensiontocount{10.49pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.49pt}  % \dimensiontocount{10.51pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.51pt} -\def\dimensiontocount#1#2{#2\numexpr\dimexpr#1\relax/\maxcard\relax} -\def\numberofpoints    #1{\the\numexpr\dimexpr#1\relax/\maxcard\relax} +\permanent\def\dimensiontocount#1#2{#2\numexpr\dimexpr#1\relax/\maxcard\relax} +\permanent\def\numberofpoints    #1{\the\numexpr\dimexpr#1\relax/\maxcard\relax}  %D \macros  %D   {swapdimens,swapskips,swapcounts,swapmacros, @@ -4982,15 +4972,15 @@  \aliased\let\swapcounts\swapcsvalues  \aliased\let\swapmacros\swapcsvalues -\protected\def\globalswapdimens#1#2{\d_syst_helpers_swapped#1\global#1#2\global#2\d_syst_helpers_swapped} -\protected\def\globalswapskips #1#2{\s_syst_helpers_swapped#1\global#1#2\global#2\s_syst_helpers_swapped} -\protected\def\globalswapcounts#1#2{\c_syst_helpers_swapped#1\global#1#2\global#2\c_syst_helpers_swapped} -\protected\def\globalswapmacros#1#2{\let\m_syst_helpers_swapped#1\glet#1#2\glet#2\m_syst_helpers_swapped} +% \protected\def\globalswapdimens#1#2{\d_syst_helpers_swapped#1\global#1#2\global#2\d_syst_helpers_swapped} +% \protected\def\globalswapskips #1#2{\s_syst_helpers_swapped#1\global#1#2\global#2\s_syst_helpers_swapped} +% \protected\def\globalswapcounts#1#2{\c_syst_helpers_swapped#1\global#1#2\global#2\c_syst_helpers_swapped} +% \protected\def\globalswapmacros#1#2{\let\m_syst_helpers_swapped#1\glet#1#2\glet#2\m_syst_helpers_swapped} -\protected\def\globalswapdimens{\global\swapcsvalues} -\protected\def\globalswapskips {\global\swapcsvalues} -\protected\def\globalswapcounts{\global\swapcsvalues} -\protected\def\globalswapmacros{\global\swapcsvalues} +\permanent\protected\def\globalswapdimens{\global\swapcsvalues} +\permanent\protected\def\globalswapskips {\global\swapcsvalues} +\permanent\protected\def\globalswapcounts{\global\swapcsvalues} +\permanent\protected\def\globalswapmacros{\global\swapcsvalues}  %D \macros  %D   {pushmacro,popmacro} @@ -5002,8 +4992,8 @@  %D \popmacro\macro  %D \stoptyping -\let\pushmacro\localpushmacro -\let\popmacro \localpopmacro +\permanent\let\pushmacro\localpushmacro +\permanent\let\popmacro \localpopmacro  %D \macros  %D   {setlocalhsize,distributedhsize} @@ -5035,7 +5025,7 @@    {\syst_helpers_set_local_hsize_nop     \advance\localhsize#1\relax} -\def\availablehsize +\permanent\def\availablehsize    {\dimexpr       \hsize-\leftskip-\rightskip       \ifnum\hangafter<\zerocount @@ -5043,10 +5033,10 @@       \fi     \relax} -\def\distributedhsize#1#2#3% +\permanent\def\distributedhsize#1#2#3%    {\dimexpr(#1-\numexpr#3-1\relax\dimexpr#2\relax)/#3\relax} -\def\hsizefraction#1#2% +\permanent\def\hsizefraction#1#2%    {\dimexpr#1/#2\relax}  %D \macros @@ -5059,103 +5049,103 @@  %D three tokens per call. Anyone familiar with the not||values ones, can derive  %D their meaning from the definitions. -\protected\def\doifvalue#1#2% +\permanent\protected\def\doifvalue#1#2%    {\iftok{\csname#1\endcsname}{#2}%       \expandafter\firstofoneargument     \else       \expandafter\gobbleoneargument     \fi} -\protected\def\doifnotvalue#1#2% +\permanent\protected\def\doifnotvalue#1#2%    {\iftok{\csname#1\endcsname}{#2}%       \expandafter\gobbleoneargument     \else       \expandafter\firstofoneargument     \fi} -\protected\def\doifelsevalue#1#2% +\permanent\protected\def\doifelsevalue#1#2%    {\iftok{\csname#1\endcsname}{#2}%       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\protected\def\doifnothing#1% +\permanent\protected\def\doifnothing#1%    {\iftok{#1}\emptytoks       \expandafter\firstofoneargument     \else       \expandafter\gobbleoneargument     \fi} -\protected\def\doifsomething#1% +\permanent\protected\def\doifsomething#1%    {\iftok{#1}\emptytoks       \expandafter\gobbleoneargument     \else       \expandafter\firstofoneargument     \fi} -\protected\def\doifelsenothing#1% +\permanent\protected\def\doifelsenothing#1%    {\iftok{#1}\emptytoks       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\protected\def\doifelsesomething#1% +\permanent\protected\def\doifelsesomething#1%    {\iftok{#1}\emptytoks       \expandafter\secondoftwoarguments     \else       \expandafter\firstoftwoarguments     \fi} -\protected\def\doifvaluenothing#1% +\permanent\protected\def\doifvaluenothing#1%    {\iftok{\csname#1\endcsname}\emptytoks       \expandafter\firstofoneargument     \else       \expandafter\gobbleoneargument     \fi} -\protected\def\doifvaluesomething#1% +\permanent\protected\def\doifvaluesomething#1%    {\iftok{\csname#1\endcsname}\emptytoks       \expandafter\gobbleoneargument     \else       \expandafter\firstofoneargument     \fi} -\protected\def\doifelsevaluenothing#1% +\permanent\protected\def\doifelsevaluenothing#1%    {\iftok{\csname#1\endcsname}\emptytoks       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\let\doifvalueelse       \doifelsevalue -\let\doifnothingelse     \doifelsenothing -\let\doifsomethingelse   \doifelsesomething -\let\doifvaluenothingelse\doifelsevaluenothing +\aliased\let\doifvalueelse       \doifelsevalue +\aliased\let\doifnothingelse     \doifelsenothing +\aliased\let\doifsomethingelse   \doifelsesomething +\aliased\let\doifvaluenothingelse\doifelsevaluenothing  %D \macros  %D   {doifemptyelsevalue, doifemptyvalue, doifnotemptyvalue}  %D  %D Also handy: -\def\doifelseemptyvalue#1% +\permanent\def\doifelseemptyvalue#1%    {\expandafter\ifempty\csname#1\endcsname       \expandafter\firstoftwoarguments     \else       \expandafter\secondoftwoarguments     \fi} -\let\doifemptyvalueelse\doifelseemptyvalue +\aliased\let\doifemptyvalueelse\doifelseemptyvalue -\def\doifemptyvalue#1% +\permanent\def\doifemptyvalue#1%    {\expandafter\ifempty\csname#1\endcsname       \expandafter\firstofoneargument     \else       \expandafter\gobbleoneargument     \fi} -\def\doifnotemptyvalue#1% +\permanent\def\doifnotemptyvalue#1%    {\expandafter\ifempty\csname#1\endcsname       \expandafter\gobbleoneargument     \else @@ -5176,11 +5166,11 @@     \processcommalist[#3]\syst_helpers_do_common_check_all     \ifdone\expandafter#1\else\expandafter#2\fi} -\protected\def\doifelseallcommon{\syst_helpers_do_if_all_common_else\firstoftwoarguments\secondoftwoarguments} -\protected\def\doifallcommon    {\syst_helpers_do_if_all_common_else\firstofonearguments\gobbleoneargument   } -\protected\def\doifnotallcommon {\syst_helpers_do_if_all_common_else\gobbleoneargument  \firstofonearguments } +\permanent\protected\def\doifelseallcommon{\syst_helpers_do_if_all_common_else\firstoftwoarguments\secondoftwoarguments} +\permanent\protected\def\doifallcommon    {\syst_helpers_do_if_all_common_else\firstofonearguments\gobbleoneargument   } +\permanent\protected\def\doifnotallcommon {\syst_helpers_do_if_all_common_else\gobbleoneargument  \firstofonearguments } -\let\doifallcommonelse\doifelseallcommon +\aliased\let\doifallcommonelse\doifelseallcommon  %D \macros  %D   {DOIF,DOIFELSE,DOIFNOT} @@ -5225,10 +5215,10 @@  \protected\def\syst_helpers_do_IF_INSTRING_ELSE#1#2%    {\uppercase{\doifelseinstring{#1}{#2}}} -\protected\def\DOIF             #1#2{\normalexpanded{\syst_helpers_do_IF              {#1}{#2}}}% will become obsolete -\protected\def\DOIFNOT          #1#2{\normalexpanded{\syst_helpers_do_IF_NOT          {#1}{#2}}}% will become obsolete -\protected\def\DOIFELSE         #1#2{\normalexpanded{\syst_helpers_do_IF_ELSE         {#1}{#2}}}% will become obsolete -\protected\def\DOIFINSTRINGELSE #1#2{\normalexpanded{\syst_helpers_do_IF_INSTRING_ELSE{#1}{#2}}}% will become obsolete +\permanent\protected\def\DOIF             #1#2{\normalexpanded{\syst_helpers_do_IF              {#1}{#2}}}% will become obsolete +\permanent\protected\def\DOIFNOT          #1#2{\normalexpanded{\syst_helpers_do_IF_NOT          {#1}{#2}}}% will become obsolete +\permanent\protected\def\DOIFELSE         #1#2{\normalexpanded{\syst_helpers_do_IF_ELSE         {#1}{#2}}}% will become obsolete +\permanent\protected\def\DOIFINSTRINGELSE #1#2{\normalexpanded{\syst_helpers_do_IF_INSTRING_ELSE{#1}{#2}}}% will become obsolete  %D \macros  %D   {dosingleargumentwithset, @@ -5294,8 +5284,8 @@       {\def\syst_helpers_with_set_step##1{#1[##1][#3][#4]}%        \processcommalist[#1]\syst_helpers_with_set_step}} -\let\dodoubleargumentwithset\dodoubleemptywithset -\let\dotripleargumentwithset\dotripleemptywithset +\aliased\let\dodoubleargumentwithset\dodoubleemptywithset +\aliased\let\dotripleargumentwithset\dotripleemptywithset  %D \macros  %D   {stripcharacters,stripspaces} @@ -5322,7 +5312,7 @@  \let\m_syst_helpers_strip_character\empty -\protected\def\stripcharacter#1\from#2\to#3% +\permanent\protected\def\stripcharacter#1\from#2\to#3%    {\def\syst_helpers_strip_character##1#1##2\end       {\edef\m_syst_helpers_strip_character{\m_syst_helpers_strip_character##1}%        \doifnotempty{##2}{\syst_helpers_strip_character##2\end}}% @@ -5331,7 +5321,7 @@     \expandafter\syst_helpers_strip_character\m_syst_string_one#1\end     \dodoglobal\let#3\m_syst_helpers_strip_character} -\protected\def\stripspaces\from#1\to#2% will become \unspacestring#1\from#2 +\permanent\protected\def\stripspaces\from#1\to#2% will become \unspacestring#1\from#2    {\stripcharacter{ }\from#1\to#2}  %D \macros @@ -5340,7 +5330,7 @@  %D The next macro does the same but is more compatible with other macros, like \type  %D {\convert...}. -\protected\def\unspacestring#1\to#2% +\permanent\protected\def\unspacestring#1\to#2%    {\stripcharacter{ }\from#1\to#2}  %D \macros @@ -5360,7 +5350,7 @@  %D  %D We can of course gobble more arguments using the appropriate gobbling command. -\def\executeifdefined#1% #2 / never change this one again +\permanent\def\executeifdefined#1% #2 / never change this one again    {\ifcsname#1\endcsname       \expandafter\expandafter\expandafter\lastnamedcs\expandafter\gobbleoneargument     \else @@ -5394,14 +5384,14 @@  %      \expandafter\firstoftwoarguments  %    \fi} -\edef\doifelsesomespace#1% +\permanent\edef\doifelsesomespace#1%    {\noexpand\ifhastok\space{#1}%       \noexpand\expandafter\noexpand\firstoftwoarguments     \noexpand\else       \noexpand\expandafter\noexpand\secondoftwoarguments     \noexpand\fi} -\let\doifsomespaceelse\doifelsesomespace +\aliased\let\doifsomespaceelse\doifelsesomespace  %D \macros  %D   {processseparatedlist} @@ -5466,7 +5456,7 @@         }%      \expandafter\syst_helpers_process_separated_list_step\gobbleoneargument#1#2]#2} -\protected\def\processseparatedlist[% +\permanent\protected\def\processseparatedlist[%    {\syst_helpers_process_separated_list\relax}  %D \macros @@ -5489,7 +5479,7 @@  \let\syst_helpers_process_any_list_indeed\relax  \let\syst_helpers_process_any_list_step  \relax -\protected\def\processlist#1#2#3#4% no blank skipping ! +\permanent\protected\def\processlist#1#2#3#4% no blank skipping !    {\def\syst_helpers_process_any_list_indeed##1#2%       {\def\syst_helpers_process_any_list_step####1####2#3%          {\ifx#2####1% @@ -5525,7 +5515,7 @@  %      {\syst_helpers_process_assign_list_assign[##1==\relax]}%  %    \processcommalist[#2]\syst_helpers_process_assign_list_step} -\protected\def\processassignlist#1[#2]#3% +\permanent\protected\def\processassignlist#1[#2]#3%    {\def\syst_helpers_process_assign_list_assign[##1=##-=##2]%       {\doif{##2}\relax{#3{##1}}}%     \def\syst_helpers_process_assign_list_step##1% @@ -5548,7 +5538,7 @@  \let\m_syst_helpers_untexed\empty -\protected\def\untexsomething +\permanent\protected\def\untexsomething    {\begingroup     \catcode\leftbraceasciicode \ignorecatcode     \catcode\rightbraceasciicode\ignorecatcode @@ -5560,8 +5550,8 @@     \endgroup     \let#3\m_syst_helpers_untexed} -\protected\def\untexargument{\untexsomething\convertargument} -\protected\def\untexcommand {\untexsomething\convertcommand} +\permanent\protected\def\untexargument{\untexsomething\convertargument} +\permanent\protected\def\untexcommand {\untexsomething\convertcommand}  %D \macros  %D   {ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints} @@ -5575,13 +5565,13 @@  %D \ScaledPointsToWholeBigPoints {number} \target  %D \stoptyping -\let\tobigpoints     \clf_tobigpoints -\let\towholebigpoints\clf_towholebigpoints +\aliased\let\tobigpoints     \clf_tobigpoints      % todo: permanent at lua end +\aliased\let\towholebigpoints\clf_towholebigpoints % todo: permanent at lua end -\protected\def\PointsToBigPoints           #1#2{\edef#2{\tobigpoints     #1}}             % can be avoided -\protected\def\PointsToWholeBigPoints      #1#2{\edef#2{\towholebigpoints#1}}             % can be avoided -\protected\def\ScaledPointsToBigPoints     #1#2{\edef#2{\tobigpoints     #1\scaledpoint}} % obsolete -\protected\def\ScaledPointsToWholeBigPoints#1#2{\edef#2{\towholebigpoints#1\scaledpoint}} % obsolete +\permanent\protected\def\PointsToBigPoints           #1#2{\edef#2{\tobigpoints     #1}}             % can be avoided +\permanent\protected\def\PointsToWholeBigPoints      #1#2{\edef#2{\towholebigpoints#1}}             % can be avoided +\permanent\protected\def\ScaledPointsToBigPoints     #1#2{\edef#2{\tobigpoints     #1\scaledpoint}} % obsolete +\permanent\protected\def\ScaledPointsToWholeBigPoints#1#2{\edef#2{\towholebigpoints#1\scaledpoint}} % obsolete  %D \macros  %D   {PointsToReal} @@ -5596,7 +5586,7 @@  % \protected\def\PointsToReal#1#2%  %   {\edef#2{\withoutpt\the\dimexpr#1}} -\protected\def\PointsToReal#1#2% +\permanent\protected\def\PointsToReal#1#2%    {\edef#2{\thewithoutunit\dimexpr#1}}  %D \macros @@ -5656,11 +5646,11 @@  %D These macros are sort of obsolete as we never use uppercase this way. But  %D nevertheless we provide them: -\def\utfupper#1{\clf_upper{#1}} % expandable -\def\utflower#1{\clf_lower{#1}} % expandable +\permanent\def\utfupper#1{\clf_upper{#1}} % expandable +\permanent\def\utflower#1{\clf_lower{#1}} % expandable -\protected\def\uppercasestring#1\to#2{\dodoglobal\edef#2{\clf_upper{#1}}} -\protected\def\lowercasestring#1\to#2{\dodoglobal\edef#2{\clf_lower{#1}}} +\permanent\protected\def\uppercasestring#1\to#2{\dodoglobal\edef#2{\clf_upper{#1}}} +\permanent\protected\def\lowercasestring#1\to#2{\dodoglobal\edef#2{\clf_lower{#1}}}  %D \macros  %D   {handletokens} @@ -5705,14 +5695,14 @@       \expandafter\syst_helpers_count_token     \fi} -\protected\def\counttoken#1\in#2\to#3% +\permanent\protected\def\counttoken#1\in#2\to#3%    {\privatescratchcounter\zerocount     \def\m_syst_string_one{#1}%     \def\m_syst_string_two{\end}%     \syst_helpers_count_token#2\end     \dodoglobal#3\privatescratchcounter} -\protected\def\counttokens#1\to#2% +\permanent\protected\def\counttokens#1\to#2%    {\privatescratchcounter\zerocount     \def\syst_helpers_count_token##1{\advance\privatescratchcounter\plusone}%     \handletokens#1\with\syst_helpers_count_token @@ -5724,7 +5714,7 @@  %D Running this one not always gives the expected results. Consider for instance the  %D macro for which I originally wrote this token handler. -\protected\def\splitofftokens#1\from#2\to#3% slow but hardly used +\permanent\protected\def\splitofftokens#1\from#2\to#3% slow but hardly used    {\ifnum#1>\zerocount       \privatescratchcounter#1\relax       \def\syst_helpers_split_off_tokens##1% @@ -5771,7 +5761,7 @@  \protected\def\syst_helpers_handle_tokens % \nexthandledtoken is part of interface    {\futurelet\nexthandledtoken\syst_helpers_handle_tokens_indeed} -\protected\def\handletokens#1\with#2% +\permanent\protected\def\handletokens#1\with#2%    {\gdef\syst_helpers_handle_tokens_command{#2}% permits more complex #2's     \syst_helpers_handle_tokens#1\end} @@ -5820,8 +5810,8 @@  \newtoks\everysettrialtypesetting  \newtoks\everyresettrialtypesetting -\protected\def\settrialtypesetting  {\the\everysettrialtypesetting  } % obeys grouping so -\protected\def\resettrialtypesetting{\the\everyresettrialtypesetting} % this one is seldom needed +\permanent\protected\def\settrialtypesetting  {\the\everysettrialtypesetting  } % obeys grouping so +\permanent\protected\def\resettrialtypesetting{\the\everyresettrialtypesetting} % this one is seldom needed  \let\iftrialtypesetting\iffalse % so we have no \trialtypesettingtrue|false in mkiv ! @@ -5835,10 +5825,10 @@  %D limit the precission. The next macro rounds a real number to two digits. It takes  %D one argument and only works in \ETEX. -\def\integerrounding   #1{\clf_rounded\zerocount\numexpr#1\relax} -\def\onedigitrounding  #1{\clf_rounded\plusone  \numexpr#1\relax} -\def\twodigitrounding  #1{\clf_rounded\plustwo  \numexpr#1\relax} -\def\threedigitrounding#1{\clf_rounded\plusthree\numexpr#1\relax} +\permanent\def\integerrounding   #1{\clf_rounded\zerocount\numexpr#1\relax} +\permanent\def\onedigitrounding  #1{\clf_rounded\plusone  \numexpr#1\relax} +\permanent\def\twodigitrounding  #1{\clf_rounded\plustwo  \numexpr#1\relax} +\permanent\def\threedigitrounding#1{\clf_rounded\plusthree\numexpr#1\relax}  %D \macros  %D   {processcontent} @@ -5850,7 +5840,7 @@  %D   {\processcontent{stophans}\test{\message{\test}\wait}}  %D \stoptyping -\protected\def\processcontent#1% +\permanent\protected\def\processcontent#1%    {\begingroup\expandafter\syst_helpers_process_content\csname#1\endcsname}  \protected\def\syst_helpers_process_content#1#2#3% @@ -5863,11 +5853,11 @@  %D  %D These two macros savely grab and dispose two arguments. -\tolerant\protected\def\dogobblesingleempty      [#-]{} -\tolerant\protected\def\dogobbledoubleempty[#-]#*[#-]{} +\permanent\tolerant\protected\def\dogobblesingleempty      [#-]{} +\permanent\tolerant\protected\def\dogobbledoubleempty[#-]#*[#-]{} -\let\gobblesingleempty\dogobblesingleempty % also used -\let\gobbledoubleempty\dogobbledoubleempty % also used +\aliased\let\gobblesingleempty\dogobblesingleempty % also used +\aliased\let\gobbledoubleempty\dogobbledoubleempty % also used  %D \macros  %D   {setdimensionwithunit, freezedimensionwithunit} @@ -5885,10 +5875,10 @@  %D As an alternative for the next macro we can use a global assignment inside a box.  %D The \type {\empty}'s permits gobbling while preventing spurious \type {\relax}'s. -\protected\def\setdimensionwithunit#1#2#3% number unit dimension / nice trick +\permanent\protected\def\setdimensionwithunit#1#2#3% number unit dimension / nice trick    {\afterassignment\gobblefourarguments#1=#2#3pt\relax\empty\empty\empty\empty} -\protected\def\freezedimensionwithunit#1#2% +\permanent\protected\def\freezedimensionwithunit#1#2%    {\setdimensionwithunit\privatescratchdimen#1{#2}\edef#1{\the\privatescratchdimen}}  %D \macros @@ -5896,28 +5886,28 @@  %D  %D Not that fast I guess, but here's a way to test for token registers being empty. -\protected\def\doifelsesometoks#1% +\permanent\protected\def\doifelsesometoks#1%    {\iftok#1\emptytoks       \expandafter\secondoftwoarguments     \else       \expandafter\firstoftwoarguments     \fi} -\protected\def\doifsometoks#1% +\permanent\protected\def\doifsometoks#1%    {\iftok#1\emptytoks       \expandafter\gobbleoneargument     \else       \expandafter\firstofoneargument     \fi} -\protected\def\doifemptytoks#1% +\permanent\protected\def\doifemptytoks#1%    {\iftok#1\emptytoks       \expandafter\firstofoneargument     \else       \expandafter\gobbleoneargument     \fi} -\let\doifsometokselse\doifelsesometoks +\aliased\let\doifsometokselse\doifelsesometoks  %D \macros  %D   {startstrictinspectnextcharacter} @@ -5933,12 +5923,12 @@       \expandafter\m_syst_action_nop     \fi} -\protected\def\strictdoifelsenextoptional#1#2% +\permanent\protected\def\strictdoifelsenextoptional#1#2%    {\def\m_syst_action_yes{#1}%     \def\m_syst_action_nop{#2}%     \futurelet\nexttoken\syst_helpers_strict_inspect_next_character} -\let\strictdoifnextoptionalelse\strictdoifelsenextoptional +\aliased\let\strictdoifnextoptionalelse\strictdoifelsenextoptional  %D \macros  %D   {gobblespacetokens} @@ -5948,7 +5938,7 @@  %\def\gobblespacetokens  %  {\doifnextcharelse\empty\donothing\donothing} % no {}\do\do ! -\def\gobblespacetokens +\permanent\def\gobblespacetokens    {\afterassignment\nexttoken\let\nexttoken=}  %D \macros @@ -5956,20 +5946,20 @@  %D  %D As the name says, this macro converts its argument to a (rather safe) string. -\let\verbatimstring\detokenize +\aliased\let\verbatimstring\detokenize  %D These are needed in ordinal number conversions: -\def\lastdigit#1% +\permanent\def\lastdigit#1%    {\expandafter\thelastdigit\number#1\relax} -\def\thelastdigit#1#2% +\permanent\def\thelastdigit#1#2%    {\ifx#2\relax#1\else\expandafter\thelastdigit\expandafter#2\fi} -\def\lasttwodigits#1% +\permanent\def\lasttwodigits#1%    {\expandafter\thelasttwodigits\expandafter0\number#1\relax} -\def\thelasttwodigits#1#2#3% 0 dig ... \relax +\permanent\def\thelasttwodigits#1#2#3% 0 dig ... \relax    {\ifx#3\relax#1#2\else\expandafter\thelasttwodigits\expandafter#2\expandafter#3\fi}  %D \macros @@ -5982,7 +5972,7 @@  \def\syst_helpers_serialize_comma_list_step#1%    {\edef\serializedcommalist{\serializedcommalist#1}} -\protected\def\serializecommalist[#1]% +\permanent\protected\def\serializecommalist[#1]%    {\let\serializedcommalist\empty     \processcommacommand[#1]\syst_helpers_serialize_comma_list_step} @@ -6000,7 +5990,7 @@  %D relax-less \type {\purenumber}. This macro works ok with \type {\the}, \type  %D {\number} as well as \ETEX's \type {\numexpr}. -\def\purenumber#1{\expandafter\firstofoneargument\expandafter{\number#1}} +\permanent\def\purenumber#1{\expandafter\firstofoneargument\expandafter{\number#1}}  %D \macros  %D   {filterfromvalue} @@ -6025,7 +6015,7 @@  %D  %D I'll implement this when I'm in \quotation {writing dirty macros mood}. -\def\dofilterfromstr#1#2% max n % no need to be fast +\permanent\def\dofilterfromstr#1#2% max n % no need to be fast    {\expandafter \expandafter \expandafter \csstring     \ifcase#1\or \ifcase#2\or       \firstofoneargument     \else @@ -6054,7 +6044,7 @@       \gobblefivearguments    \fi     \fi} -\def\filterfromvalue#1#2#3% value max n +\permanent\def\filterfromvalue#1#2#3% value max n    {\expandafter\doubleexpandafter\csname         % we use the fact that an       \expandafter\ifx\csname#1\endcsname\relax   % undefined cs has become \relax         \csstring\gobbleoneargument               % which we then gobble here @@ -6063,7 +6053,7 @@       \fi       \endcsname\csname#1\endcsname} -\def\filterfromnext#1#2% max n {..}{..}{..}{..} +\permanent\def\filterfromnext#1#2% max n {..}{..}{..}{..}    {\csname\dofilterfromstr{#1}{#2}\endcsname}  %D \macros @@ -6252,9 +6242,9 @@  \protected\def\setflag  #1{\dodoglobal\letcsname\??flag#1\endcsname\zerocount}  \protected\def\resetflag#1{\dodoglobal\letcsname\??flag#1\endcsname\plusone} -\def\flag#1{\csname\??flag#1\endcsname} +\permanent\def\flag#1{\csname\??flag#1\endcsname} -\def\doifelseflagged#1% +\permanent\def\doifelseflagged#1%    {\expandafter\ifx\csname\??flag#1\endcsname\relax       \expandafter\secondoftwoarguments     \orelse\ifcase\csname\??flag#1\endcsname @@ -6263,9 +6253,9 @@       \expandafter\secondoftwoarguments     \fi} -\let\doifflaggedelse\doifelseflagged +\aliased\let\doifflaggedelse\doifelseflagged -\def\doifnotflagged#1% +\permanent\def\doifnotflagged#1%    {\expandafter\ifx\csname\??flag#1\endcsname\relax       \expandafter\firstofoneargument     \orelse\ifcase\csname\??flag#1\endcsname @@ -6274,7 +6264,7 @@       \expandafter\firstofoneargument     \fi} -\protected\def\inheritparameter[#1]#2[#3]#4[#5]% tag tokey fromkey +\permanent\protected\def\inheritparameter[#1]#2[#3]#4[#5]% tag tokey fromkey    {\defcsname#1#3\expandafter\endcsname\expandafter{\csname#1#5\endcsname}}  \def\syst_helpers_if_non_zero_positive_else#1#2\end % #3#4% @@ -6293,10 +6283,10 @@  % used ? -\def\doifelsenonzeropositive#1% +\permanent\def\doifelsenonzeropositive#1%    {\begingroup\afterassignment\syst_helpers_if_non_zero_positive_else\privatescratchcounter=0#1\relax\empty\end} -\let\doifnonzeropositiveelse\doifelsenonzeropositive +\aliased\let\doifnonzeropositiveelse\doifelsenonzeropositive  % here ? @@ -6305,26 +6295,26 @@  \protected\def\dosetrawgvalue#1#2#3{\global\defcsname #1#2\endcsname{#3}}  \protected\def\dosetrawxvalue#1#2#3{\global\edefcsname#1#2\endcsname{#3}} -\protected\def\getrawparameters      {\dogetparameters\dosetrawvalue } -\protected\def\getraweparameters     {\dogetparameters\dosetrawevalue} -\protected\def\getrawgparameters     {\dogetparameters\dosetrawgvalue} -\protected\def\getrawxparameters     {\dogetparameters\dosetrawxvalue} +\permanent\protected\def\getrawparameters      {\dogetparameters\dosetrawvalue } +\permanent\protected\def\getraweparameters     {\dogetparameters\dosetrawevalue} +\permanent\protected\def\getrawgparameters     {\dogetparameters\dosetrawgvalue} +\permanent\protected\def\getrawxparameters     {\dogetparameters\dosetrawxvalue} -\protected\def\globalgetrawparameters{\dogetparameters\dosetrawgvalue} % obsolete +\permanent\protected\def\globalgetrawparameters{\dogetparameters\dosetrawgvalue} % obsolete  %D Sort of obsolete:  \newcount\c_syst_helpers_mod -\protected\def\dosetmodulo#1#2#3% +\permanent\protected\def\dosetmodulo#1#2#3%    {\c_syst_helpers_mod#1\divide\c_syst_helpers_mod#2\multiply\c_syst_helpers_mod#2%     #3#1\advance#3-\c_syst_helpers_mod} -\protected\def\dosetdivision#1#2#3% +\permanent\protected\def\dosetdivision#1#2#3%    {#3#1\divide#3 #2\relax} -\protected\def\DoMod#1by#2to#3{\dosetmodulo  {#1}{#2}{#3}} -\protected\def\DoDiv#1by#2to#3{\dosetdivision{#1}{#2}{#3}} +\permanent\protected\def\DoMod#1by#2to#3{\dosetmodulo  {#1}{#2}{#3}} +\permanent\protected\def\DoDiv#1by#2to#3{\dosetdivision{#1}{#2}{#3}}  \def\syst_helpers_unprotected#1\par    {#1\protect} @@ -6333,13 +6323,13 @@    {\unprotect     \syst_helpers_unprotected} -\let\resettimer    \clf_resettimer -\let\elapsedtime   \clf_elapsedtime -\let\elapsedseconds\elapsedtime +\aliased\let\resettimer    \clf_resettimer  % todo: at lua end +\aliased\let\elapsedtime   \clf_elapsedtime % todo: at lua end +\aliased\let\elapsedseconds\elapsedtime  \let\elapsedsteps\!!zerocount -\protected\def\elapsedsteptime % unexpanded ! a bit useless but who knows ... +\permanent\protected\def\elapsedsteptime % unexpanded ! a bit useless but who knows ...    {\clf_elapsedsteptime\elapsedsteps\relax}  \newcount\c_syst_helpers_test_feature_n @@ -6347,7 +6337,7 @@  \def\currentfeaturetest{\number\c_syst_helpers_test_feature_n} -\protected\def\testfeature#1#2% +\permanent\protected\def\testfeature#1#2%    {\c_syst_helpers_test_feature_m#1\relax     \xdef\elapsedsteps{\number\c_syst_helpers_test_feature_m}%     \def\syst_helpers_test_feature_yes @@ -6362,7 +6352,7 @@        \fi}%     \retestfeature} -\protected\def\retestfeature % timer support is new per 10/5/2005 +\permanent\protected\def\retestfeature % timer support is new per 10/5/2005    {\bgroup     \ifcase\interactionmode\let\wait\relax\fi     \clf_resettimer @@ -6381,10 +6371,10 @@        \clf_elapsedsteptime\elapsedsteps\space\space per step}%     \egroup} -\protected\def\showtimer#1% +\permanent\protected\def\showtimer#1%    {\writestatus{runtime}{\elapsedseconds\space s / #1}} -\protected\def\testfeatureonce#1#2% +\permanent\protected\def\testfeatureonce#1#2%    {\begingroup     \let\wait\relax     \testfeature{#1}{#2}% @@ -6399,7 +6389,7 @@  %D \freezedimenmacro\leftmargindistance  %D \stoptyping -\protected\def\freezedimenmacro#1% +\permanent\protected\def\freezedimenmacro#1%    {\edef#1{\the\dimexpr#1}}  %D The next macro negates a macro (dimension or number, or actually, whatever. It's @@ -6410,24 +6400,24 @@  %D \if--\whatever\else-\whatever\fi => then =>  whatever  %D \stoptyping -\def\negated#1{\if-#1\else-#1\fi} % does only work in macros or text +\permanent\def\negated#1{\if-#1\else-#1\fi} % does only work in macros or text  \def\gobbleassigndimen#1\\{} -\def\assigndimen#1#2% +\permanent\def\assigndimen#1#2%    {\afterassignment\gobbleassigndimen#1=#2\zeropoint\\} -\protected\def\appended#1#2#3{\expandafter#1\expandafter#2\expandafter{#2#3}} -\protected\def\appendvalue #1{\expandafter\appended\expandafter \def\csname#1\endcsname} -\protected\def\appendgvalue#1{\expandafter\appended\expandafter\gdef\csname#1\endcsname} +\permanent\protected\def\appended#1#2#3{\expandafter#1\expandafter#2\expandafter{#2#3}} +\permanent\protected\def\appendvalue #1{\expandafter\appended\expandafter \def\csname#1\endcsname} +\permanent\protected\def\appendgvalue#1{\expandafter\appended\expandafter\gdef\csname#1\endcsname}  \protected\def\prepended#1#2#3%    {\t_syst_helpers_scratch{#3}%     \expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter#2\expandafter\expandafter\expandafter       {\expandafter\the\expandafter\t_syst_helpers_scratch#2}} -\protected\def\prependvalue #1{\expandafter\prepended\expandafter \def\csname#1\endcsname} -\protected\def\prependgvalue#1{\expandafter\prepended\expandafter\gdef\csname#1\endcsname} +\permanent\protected\def\prependvalue #1{\expandafter\prepended\expandafter \def\csname#1\endcsname} +\permanent\protected\def\prependgvalue#1{\expandafter\prepended\expandafter\gdef\csname#1\endcsname}  %D \macros  %D   {dowithrange} @@ -6449,11 +6439,11 @@     \ifempty\m_syst_helpers_range_to\let\m_syst_helpers_range_to\m_syst_helpers_range_from\fi     \dostepwiserecurse\m_syst_helpers_range_from\m_syst_helpers_range_to\plusone{\m_helpers_range_action{##1}}}% -\protected\def\processranges[#1]#2% #1= n:m,p,q:r +\permanent\protected\def\processranges[#1]#2% #1= n:m,p,q:r    {\def\m_helpers_range_action{#2}%     \processcommacommand[#1]\syst_helpers_with_range} -\protected\def\dowithrange#1#2% +\permanent\protected\def\dowithrange#1#2%    {\def\m_helpers_range_action{#2}%     \processcommacommand[#1]\syst_helpers_with_range} @@ -6472,7 +6462,7 @@  %D  %D \typebuffer \getbuffer -\protected\def\ignoreimplicitspaces +\permanent\protected\def\ignoreimplicitspaces    {\doifelsenextchar\relax\relax\relax}  %D \macros @@ -6480,6 +6470,8 @@  %D  %D Not that sophisticated but sometimes users (like in metafun). +%D This will be overloaded. +  \def\syst_helpers_process_word#1 #2\_e_o_w_    {\doifsomething{#1}{\processword{#1} \syst_helpers_process_word#2 \_e_o_w_}} @@ -6499,17 +6491,17 @@  \newbox\b_syst_helpers_no_interference -\protected\def\startnointerference % not even grouped ! +\permanent\protected\def\startnointerference % not even grouped !    {\setbox\b_syst_helpers_no_interference\vbox     \bgroup} -\protected\def\stopnointerference +\permanent\protected\def\stopnointerference    {\egroup     \setbox\b_syst_helpers_no_interference\emptybox}  %D A variant for \type {\executeifdefined}: -\def\expandcheckedcsname#1#2% #2 is often a \xxxparameter  so let's expand it once +\permanent\def\expandcheckedcsname#1#2% #2 is often a \xxxparameter  so let's expand it once    {\normalexpanded{\noexpand\syst_helpers_expand_checked_csname{#1}{#2}}}  \def\syst_helpers_expand_checked_csname#1#2#3% @@ -6523,7 +6515,7 @@  %D A few secial variants of commands defined here. Some more will be moved here (e.g.  %D from table modules. -\def\dodirectdoubleempty#1#2% used in math (lookahead issues) +\permanent\def\dodirectdoubleempty#1#2% used in math (lookahead issues)    {\ifx#2[%       \expandafter\syst_helpers_direct_double_empty_one_yes     \else @@ -6547,7 +6539,7 @@  %D  %D \typebuffer \startlines \getbuffer \stoplines -\def\docheckedpair#1% +\permanent\def\docheckedpair#1%    {\syst_helpers_checked_pair#1,,\_o_e_p_}  % \def\syst_helpers_checked_pair#1,#2,#0\_o_e_p_ @@ -6559,7 +6551,7 @@  %D Here are some nasty helpers. They can be used to fill often expanded token  %D lists efficiently (see tabulate for an example). -\def\constantnumber#1% +\permanent\def\constantnumber#1%    {\ifcase#1\zerocount     \or      \plusone     \or      \plustwo @@ -6573,7 +6565,7 @@     \or      \plusten     \else    \number#1\relax\fi} -\def\constantnumberargument#1% +\permanent\def\constantnumberargument#1%    {\ifcase#1\zerocount     \or      \plusone     \or      \plustwo @@ -6587,21 +6579,21 @@     \or      \plusten     \else    {\number#1}\fi} -\def\constantdimen#1% +\permanent\def\constantdimen#1%    {\ifdim#1=\zeropoint       \zeropoint     \else       \the#1\relax     \fi} -\def\constantdimenargument#1% +\permanent\def\constantdimenargument#1%    {\ifdim#1=\zeropoint       \zeropoint     \else       {\the#1}%     \fi} -\def\constantemptyargument#1% +\permanent\def\constantemptyargument#1%    {\ifempty#1%       \noexpand\empty     \else @@ -6626,11 +6618,11 @@  % expandable: -\def\getsubstring#1#2#3{\clf_getsubstring{#3}{#1}{#2}} +\permanent\def\getsubstring#1#2#3{\clf_getsubstring{#3}{#1}{#2}}  %D Other dimensions than pt (used in mb-mp) -\def\converteddimen#1#2{\clf_converteddimen\dimexpr#1\relax{#2}} +\permanent\def\converteddimen#1#2{\clf_converteddimen\dimexpr#1\relax{#2}}  %D Maybe (looks ugly):  %D @@ -6699,16 +6691,16 @@  %D This is not real fast but quite okay:  %def\ntimes#1#2{\ifnum#2>\zerocount#1\ntimes{#1}{\numexpr#2-\plusone\relax}\fi} % 1.72 -\def\ntimes#1#2{\clf_ntimes{#1}\numexpr#2\relax}                                % 0.33 +\permanent\def\ntimes#1#2{\clf_ntimes{#1}\numexpr#2\relax}                                % 0.33  %D Experiment (sometimes looks nicer in code): -\protected\def\sameargumentscondition#1#2% +\permanent\protected\def\sameargumentscondition#1#2%    {\edef\m_syst_string_one{#1}%     \edef\m_syst_string_two{#2}%     \ifx\m_syst_string_one\m_syst_string_two} -\protected\def\emptyargumentcondition#1% +\permanent\protected\def\emptyargumentcondition#1%    {\edef\m_syst_string_one{#1}%     \ifempty\m_syst_string_one} diff --git a/tex/context/base/mkiv/tabl-xtb.mklx b/tex/context/base/mkiv/tabl-xtb.mklx index 9265ff782..a0fe41428 100644 --- a/tex/context/base/mkiv/tabl-xtb.mklx +++ b/tex/context/base/mkiv/tabl-xtb.mklx @@ -179,11 +179,11 @@  \aliased\permanent\let\stopxtable\relax  % These direct buffers can be somewhat faster but it's probably neglectable. -% Anyway, no nesting is supported as we then need to catch (e.g.) rows and -% keep track of nesting and have a more complex redefinition of nested -% instanced \unknown\ it's not worth the trouble. Only use them when you -% really need them and use the embeddedxtable command when nesting them. -% Implementing nesting would be slower than not using direct buffers. +% Anyway, no nesting is supported as we then need to catch (e.g.) rows and keep +% track of nesting and have a more complex redefinition of nested instanced +% \unknown\ it's not worth the trouble. Only use them when you really need them and +% use the embeddedxtable command when nesting them. Implementing nesting would be +% slower than not using direct buffers.  \permanent\tolerant\protected\def\processxtablebuffer[#name]%    {\bgroup @@ -203,7 +203,7 @@  %D A bonus: you have to use the following construct inside a macro or  %D direct buffer. -\permanent\tolerant\protected\def\startembeddedxtable[#settings]#;#content\stopembeddedxtable +\permanent\tolerant\protected\def\startembeddedxtable[#settings]#:#content\stopembeddedxtable    {\tabl_x_prepare{#settings}%     \clf_assignbuffer{embedded_x_table}{\detokenize{#content}}\catcodetable\relax     \bgroup @@ -482,7 +482,7 @@  \permanent\protected\def\dummyxcell    {\begingroup -   \let\inheritedxtableframed\relax +   \enforced\let\inheritedxtableframed\relax     \tabl_x_start_cell_nop     \tabl_x_stop_cell     \endgroup} diff --git a/tex/context/base/mkiv/trac-vis.mkxl b/tex/context/base/mkiv/trac-vis.mkxl index 77df80848..dd69e0bb8 100644 --- a/tex/context/base/mkiv/trac-vis.mkxl +++ b/tex/context/base/mkiv/trac-vis.mkxl @@ -193,27 +193,27 @@  %D We keep these for a while: -\let\ruledhss       \hss -\let\ruledhfil      \hfil -\let\ruledhfill     \hfill -\let\ruledhfilll    \hfilll -\let\ruledhfilneg   \hfilneg -\let\ruledhfillneg  \hfillneg -\let\ruledhfilllneg \hfilllneg -\let\ruledvss       \vss -\let\ruledvfil      \vfil -\let\ruledvfill     \vfill -\let\ruledvfilll    \vfilll -\let\ruledvfilneg   \vfilneg -\let\ruledvfillneg  \vfillneg -\let\ruledvfilllneg \vfilllneg -\let\ruledhskip     \hskip -\let\ruledvskip     \vskip -\let\ruledkern      \kern -\let\ruledhglue     \hglue -\let\ruledvglue     \vglue -\let\ruledmkern     \mkern -\let\ruledmskip     \mskip -\let\ruledpenalty   \penalty +% \aliased\let\ruledhss       \hss +% \aliased\let\ruledhfil      \hfil +% \aliased\let\ruledhfill     \hfill +% \aliased\let\ruledhfilll    \hfilll +% \aliased\let\ruledhfilneg   \hfilneg +% \aliased\let\ruledhfillneg  \hfillneg +% \aliased\let\ruledhfilllneg \hfilllneg +% \aliased\let\ruledvss       \vss +% \aliased\let\ruledvfil      \vfil +% \aliased\let\ruledvfill     \vfill +% \aliased\let\ruledvfilll    \vfilll +% \aliased\let\ruledvfilneg   \vfilneg +% \aliased\let\ruledvfillneg  \vfillneg +% \aliased\let\ruledvfilllneg \vfilllneg +% \aliased\let\ruledhskip     \hskip +% \aliased\let\ruledvskip     \vskip +% \aliased\let\ruledkern      \kern +% \aliased\let\ruledhglue     \hglue +% \aliased\let\ruledvglue     \vglue +% \aliased\let\ruledmkern     \mkern +% \aliased\let\ruledmskip     \mskip +% \aliased\let\ruledpenalty   \penalty  \protect \endinput diff --git a/tex/context/modules/mkiv/m-scite.mkiv b/tex/context/modules/mkiv/m-scite.mkiv index 39ca00ced..7116a5b32 100644 --- a/tex/context/modules/mkiv/m-scite.mkiv +++ b/tex/context/modules/mkiv/m-scite.mkiv @@ -311,11 +311,14 @@ moduledata.scite = scite  \stopluacode -\definetyping[TEX] [option=cld] -\definetyping[LUA] [option=lua] +%definetyping[TEX] [option=cld] +\setuptyping [TEX] [option=cld] +%definetyping[LUA] [option=lua] +\setuptyping [LUA] [option=lua]  \definetyping[BTX] [option=bibtex]  \definetyping[MPS] [option=mps] -\definetyping[MP]  [option=mp] +%definetyping[MP]  [option=mp] +\setuptyping [MP]  [option=mp]  \definetyping[PDF] [option=pdf]  \definetyping[CPP] [option=cpp]    % Which is kind of like the web one.  \definetyping[WEB] [option=web] diff --git a/tex/context/modules/mkiv/s-system-macros.mkxl b/tex/context/modules/mkiv/s-system-macros.mkxl index 57417b2e1..48b0f5ed3 100644 --- a/tex/context/modules/mkiv/s-system-macros.mkxl +++ b/tex/context/modules/mkiv/s-system-macros.mkxl @@ -16,12 +16,18 @@  % todo:  \permanent\protected\let\select\directselect : same value (add ref) +% todo: when mutable, remove immutable +  \startmodule[system-macros]  \continueifinputfile{s-system-macros.mkxl}  \usemodule[article-basic] \setuplayout[tight] \setupbodyfont[7pt,tt] +\setuppapersize +  [A4,landscape] +  [A4,landscape] +  \starttext  \startluacode @@ -36,13 +42,51 @@      local crap     = "[$>%|%&%#" .. string.char(0xEF) .. "]" +    local basefile  = resolvers.findfile("context.mkxl") +    local swapnames = { } + +    local pattern   = file.join(file.pathpart(basefile),"/*.mk*") +        local filenames = dir.glob(pattern) +    for i=1,#filenames do +        swapnames[file.basename(filenames[i])] = true +    end + +    local pattern   = file.join(file.pathpart(basefile),"/*.l**") +    local filenames = dir.glob(pattern) +    for i=1,#filenames do +        swapnames[file.basename(filenames[i])] = true +    end + +    local hashnames = table.setmetatableindex(function(t,k) +        local s = file.suffix(k) +        local v = k +        if s == "mkiv" then +            local n = file.replacesuffix(k,"mkxl") +            if swapnames[n] then +                v = n +            end +        elseif s == "mkvi" then +            local n = file.replacesuffix(k,"mklx") +            if swapnames[n] then +                v = n +            end +        elseif s == "lua" then +            local n = file.replacesuffix(k,"lmt") +            if swapnames[n] then +                v = n +            end +        end +        t[k] = v +        return v +    end) +      require("mtx-interface")      local data =  scripts.interface.editor("data")      local files = data and data.common and data.common.filenames or { }      local t = tex.hashtokens()      table.sort(t)      local function show(check) -        context.starttabulate { "|l|l|l|l|l|l|l|l|l|" } +        context.starttabulate { "|l|l|l|lj2|l|l|l|l|l|l|l|l|" }          for i=1,#t do              local k = t[i]              if check(k) then @@ -51,12 +95,12 @@                  local permanent  = v.permanent  and "permanent"                  local immutable  = v.immutable  and "immutable"                  local primitive  = v.primitive  and "primitive" -                local mutable    = v.immutable  and "mutable" +                local mutable    = v.mutable    and "mutable"                  local tolerant   = v.tolerant   and "tolerant"                  local noaligned  = v.noaligned  and "noaligned"                  local instance   = v.instance   and "instance"                  local parameters = v.parameters or 0 -                local dealtwith = frozen or permanent or immutable or primitive or mutable -- beware: we can have combinations +                local dealtwith = mutable or immutable or frozen or permanent or primitive -- beware: we can have combinations                  local cscommand = gsub(v.cmdname or "","_"," ")                  local whatever  = find(k,"^[a-z][a-z][a-z]+_")                  local filename  = files[k] @@ -65,11 +109,14 @@                  ctx_NC() if primitive then ctx_bold(csname) else context(csname) end                  ctx_NC() if parameters > 0 then context(parameters) end                  ctx_NC() context(cscommand) -                ctx_NC() if dealtwith      then context(dealtwith)  end                  ctx_NC() if tolerant       then context(tolerant)   end -                ctx_NC() if instance       then context(instance)   end +                ctx_NC() if primitive      then context(primitive)  end +                ctx_NC() if permanent      then context(permanent)  end +                ctx_NC() if frozen         then context(frozen)     end +                ctx_NC() if immutable      then context(immutable)  end +                ctx_NC() if mutable        then context(mutable)    end                  ctx_NC() if noaligned      then context(noaligned)  end -                ctx_NC() if filename       then context(filename)   end +                ctx_NC() if filename       then context(hashnames[filename]) end                  ctx_NC() ctx_NR()              end          end @@ -83,6 +130,23 @@      show(function(k) return not find(k,"^[a-zA-Z]+$") and not find(k,crap) end)  \stopluacode +\page + +\starttabulate[|c|l|] +\HL +\NC \type {+}   \NC mutable, immutable, frozen, permanent, primitive \NC \NR +\NC \type {-}   \NC protected by obscurity (underscores) \NC \NR +\NC \type {!}   \NC instance (can be frozen) \NC \NR +\NC \type {0-9} \NC the number of arguments (argument grabbing can be delegated) \NC \NR +\HL +\stoptabulate + +Often frozen commands are redefined on demand and they can be overloaded. Mutable +doesn't mean that a user can change it without consequences, for instance the +\type {\current...} ones. Primitives come with the engine, permanent macros are +the core of \CONTEXT. Noaligned macros are special and dealt deep down when +scanning for alignment specific primitives. +  \stoptext  \stopmodule diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index ea779dc80..0ade30aed 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@  -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua  -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date  : 2020-11-05 15:20 +-- merge date  : 2020-11-05 22:57  do -- begin closure to overcome local limits and interference | 
