On 3/26/2013 7:11 PM, Wolfgang Schuster wrote:
Hi Hans,
there is a problem with the command handler and nested \setup… commands.
In the following example the setting for the “two” environment are ignored.
<example> \defineenumeration[one][text=One] \defineenumeration[two][text=Two]
\setupenumeration[one,two][alternative=serried,color=red]
\starttext
\startone First enumeration. \stopone
\starttwo Second enumeration. \stoptwo
\stoptext </example>
The reason for this behavior is the \setupcounter call in \everysetupenumeration.
When you look at the internal code for \setupenumeration (mult-aux.mkiv) you see that the first element in \setupernumeration (i.e. “one”) is processed with \mult_interfaces_with_comma_list_element, at the end of this macro \everysetupenumeration. At this point \setupcounter is used which redefines \mult_interfaces_with_comma_list_element. This redefined version is used for the next element (i.e. “two”) in \setupenumeration and the values are no passed (“alternative” and “color”) to \setupcounter.
\unexpanded\def\mult_interfaces_install_setup_handler#1#2#3#4#5#6#7#8% {\ifx#3\relax\let#3\empty\fi \unexpanded\def#2{\dodoubleempty#4}% \unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}% no every ! don't change it \newtoks#5% \newtoks#8% \unexpanded\def#4[##1][##2]% maybe helper {\let#7#3% \ifsecondargument \def\mult_interfaces_with_comma_list_element####1% we will have a simple one as well {\edef#3{####1}% \mult_interfaces_get_parameters{#1#3:}[##2]% \the#5}% \processcommalist[##1]\mult_interfaces_with_comma_list_element \else \let#3\empty \mult_interfaces_get_parameters{#1:}[##1]% \the#5% \fi \let#3#7% \the#8}}
So we need something like this (lucky us, no performance penalty): \unexpanded\def\mult_interfaces_install_setup_handler#1#2#3#4#5#6#7#8#9% {\ifx#3\relax\let#3\empty\fi \unexpanded\def#2{\dodoubleempty#4}% \unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}% no every ! don't change it \newtoks#5% \newtoks#8% \unexpanded\def#4[##1][##2]% maybe helper {\let#7#3% \ifsecondargument \def#9####1% we will have a simple one as well {\edef#3{####1}% \mult_interfaces_get_parameters{#1#3:}[##2]% \the#5}% \processcommalist[##1]#9% \else \let#3\empty \mult_interfaces_get_parameters{#1:}[##1]% \the#5% \fi \let#3#7% \the#8}} \unexpanded\def\installsetuphandler#1#2% {\normalexpanded {\mult_interfaces_install_setup_handler {\noexpand#1}% \??aa \expandafter\noexpand\csname setup#2\endcsname \expandafter\noexpand\csname current#2\endcsname \expandafter\noexpand\csname setup_#2\endcsname % semi-public \expandafter\noexpand\csname everysetup#2\endcsname \expandafter\noexpand\csname setupcurrent#2\endcsname \expandafter\noexpand\csname saved_setup_current#2\endcsname \expandafter\noexpand\csname everysetup#2root\endcsname \expandafter\noexpand\csname nested_setup_current#2\endcsname}} \unexpanded \def\mult_interfaces_install_auto_setup_handler#1#2#3#4#5#6#7#8#9% {\ifx#3\relax\let#3\empty\fi \unexpanded\def#2{\dotripleempty#4}% \unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}% \newtoks#5% \def#4[##1][##2][##3]% {\let#8#3% \ifthirdargument \def#9####1% {\edef#3{####1}% \expandafter\def\csname#1#3:\s!parent\endcsname{#1##2}% \mult_interfaces_get_parameters{#1#3:}[##3]% always sets parent \the#5}% \processcommalist[##1]#9% \else\ifsecondargument \def#9####1% {\edef#3{####1}% #7% checks parent and sets if needed \mult_interfaces_get_parameters{#1#3:}[##2]% \the#5}% \processcommalist[##1]#9% \else \let#3\empty \mult_interfaces_get_parameters{#1:}[##1]% \the#5% \fi\fi \let#3#8}} \unexpanded\def\installautosetuphandler#1#2% {\normalexpanded {\mult_interfaces_install_auto_setup_handler {\noexpand#1}% \??aa \expandafter\noexpand\csname setup#2\endcsname \expandafter\noexpand\csname current#2\endcsname \expandafter\noexpand\csname setup_#2\endcsname % semi-public \expandafter\noexpand\csname everysetup#2\endcsname \expandafter\noexpand\csname setupcurrent#2\endcsname \expandafter\noexpand\csname check#2parent\endcsname \expandafter\noexpand\csname saved_setup_current#2\endcsname \expandafter\noexpand\csname nested_setup_current#2\endcsname}} ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------