[dev-context] Nested \setupXXX commands

Hans Hagen pragma at wxs.nl
Tue Mar 26 22:51:37 CET 2013


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
-----------------------------------------------------------------


More information about the dev-context mailing list