Changes

Jump to navigation Jump to search
2,346 bytes added ,  20:46, 4 July 2005
>
== Processing lists of values ===== Processing a comma-separated list of values ===
Suppose you defined a command like this one somewhere in your document:
\def\MyMumOrderedMeTo[#1]#2%
{\begingroup
\def\processitem##1{\IHaveToDoIHaveTo[##1]{#2}}%
\processcommalist[#1]\processitem
\endgroup}
</texcode>
 
=== Processing a dash-separated list of values ===
 
Sometimes you have more work to do than just that borring stuff at home. And as it is quite important as well, you don't want to loose your time enumerating all of the tasks. Being able to do something like
<texcode>
\IHaveToDoTheTasks[1-4,7,9-11]{until tomorrow}
</texcode>
may sound like a good idea.
 
Suppose you already defined:
<texcode>
\def\IHaveToDoTheTask[#1]#2{The task #1 has to be done #2.\par}
</texcode>
 
You have to define some macros first (thanks to Taco!):
<texcode>
% 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
</texcode>
 
And then you're ready to define
<texcode>
\def\IHaveToDoTheTasks[#1]#2%
{\begingroup
\uncompresslist[#1]% <= Yeah!
\def\processitem##1{\IHaveToDoTheTask[##1]{#2}}%
\processcommacommand[\uncompressedlist]\processitem
\endgroup}
</texcode>
 
Guess what! Your <tt>\IHaveToDoTheTasks[1-4,7,9-11]{until tomorrow}</tt> resulted in:
The task 1 has to be done until tomorrow.
The task 2 has to be done until tomorrow.
The task 3 has to be done until tomorrow.
The task 4 has to be done until tomorrow.
The task 7 has to be done until tomorrow.
The task 9 has to be done until tomorrow.
The task 10 has to be done until tomorrow.
The task 11 has to be done until tomorrow.
 
So - what are you still waiting for? Go back to work and do them right away!

Navigation menu