[NTG-context] How to "\processcommalist"?

Taco Hoekwater taco at elvenkind.com
Fri Jul 1 19:54:02 CEST 2005


Mojca Miklavec wrote:
> I would like to define a command, which would be called in the following way:
>     \TheBossWantsTheWorkToBeDoneOn[monday,wednesday,thursday]{tidy up}
> 
> so that it would be equivalent to:
>     \WeHaveToDo[monday]{tidy up}
>     \WeHaveToDo[wednesday]{tidy up}
>     \WeHaveToDo[thursday]{tidy up}
> 
> I played a bit with different variants of \processcommalist, but I
> can't figure out how to use it in this particular case.

The trick is to store the tidy up inside the processing command,
like so:

   \def\WeHaveToDo[#1]#2{\message{(#1: #2)}}

   \def\TheBossWantsTheWorkToBeDoneOn[#1]#2%
     {\begingroup
      \def\processitem##1{\WeHaveToDo[##1]{#2}}%
      \processcommalist[#1]\processitem
      \endgroup }

   \TheBossWantsTheWorkToBeDoneOn[monday,wednesday,thursday]{tidy up}


> Is there also a possibility to define a command like
>     \IHaveToDoTheTasks[1-4,7,9-11]{until tomorrow}

There was not, but knowing Hans I trust that soon there will be :-).

For now, here is my solution.

   % a few auxiliary core macros are needed to uncompress the list.
   %
   % \uncompresslist is the twin of the already existing \compresslist
   % which works in the other direction (syst-new)
   %
   \unprotect

   % I guess this function is already available but couldnt find it...
   %
   \def\apptomac#1#2%
     {\ifx#1\empty\def#1{#2}\else \@EA\def\@EA#1\@EA{#1,#2}\fi}

   % the next macro does this:
   %
   % \itemwithdash<<9-11>>- => \dorecurse {<<1+11-9>>}
   %     {\apptomac\uncompressedlist<<9-1+\recurselevel>>}
   %
   % (the 1+ and -1 are needed to solve a counter offset.)
   \def\itemwithdash#1-#2-%
     {\@EA\dorecurse\@EA
       {\the\numexpr 1+#2-#1\relax}%
       {\@EA\apptomac\@EA\uncompressedlist\@EA
         {\the\numexpr #1-1+\recurselevel\relax}}}%

   % top level. The result will be in \uncompressedlist
   \def\uncompresslist[#1]%
     {\def\uncompressedlist{}%
      \def\processitem##1%
        {\doifinstringelse{-}{##1}
          {\itemwithdash##1-}
          {\apptomac\uncompressedlist{##1}}}%
      \processcommalist[#1]\processitem }

   \protect

   % end support macros.

With these, you can do:

   \def\IHaveToDoTheTask[#1]#2{\message{(#1: #2)}}

   \def\IHaveToDoTheTasks[#1]#2%
     {\begingroup
      \def\processitem##1{\IHaveToDoTheTask[##1]{#2}}%
      \uncompresslist[#1]% <= Yeah!
      \processcommacommand[\uncompressedlist]\processitem
      \endgroup }

I hope you understand what I've done, but otherwise, feel
free to ask, of course.

Greetings, Taco



More information about the ntg-context mailing list