Macro with variable number of arguments
Hi all, I would like to write a macro which may have sometimes two, sometimes three arguments. The first and the last one are always present, but not necessarily the middle one. The unsatisfactory solution I have now is something like the example below: \define[2]\myMacroTwo{Name: #1\crlf Email: #2\crlf\thinrule\blank[small]} \define[3]\myMacroThree{Name: #1\crlf Address: #2 \crlf Email: #3\crlf\thinrule\blank[small]} \starttext \myMacroTwo{Hans}{hans@hagen.context.nl} \myMacroThree{Wolfgang}{Paradise of TeX, 2010}{wolfgang@schuster.context.de} \stoptext I think that (or rather I am certain…) in ConTeXt it is possible to define a unique macro called \myMacro which automatically tests the number of arguments: if there are only two of them the commands in \myMacroTwo are executed, while if three arguments are present, the commands in \myMacroThree are executed. Can anyone give a hint on this matter?
Am 28.02.10 09:54, schrieb Otared Kavian:
Hi all,
I would like to write a macro which may have sometimes two, sometimes three arguments. The first and the last one are always present, but not necessarily the middle one. The unsatisfactory solution I have now is something like the example below:
\define[2]\myMacroTwo{Name: #1\crlf Email: #2\crlf\thinrule\blank[small]} \define[3]\myMacroThree{Name: #1\crlf Address: #2 \crlf Email: #3\crlf\thinrule\blank[small]}
\starttext \myMacroTwo{Hans}{hans@hagen.context.nl} \myMacroThree{Wolfgang}{Paradise of TeX, 2010}{wolfgang@schuster.context.de} \stoptext
I think that (or rather I am certain…) in ConTeXt it is possible to define a unique macro called \myMacro which automatically tests the number of arguments: if there are only two of them the commands in \myMacroTwo are executed, while if three arguments are present, the commands in \myMacroThree are executed.
Can anyone give a hint on this matter?
\def\myMacro {\dotriplegroupempty\domyMacro} \def\domyMacro#1#2#3% {\doifelsenothing{#3} {Name: #1\crlf Email: #2\crlf} {Name: #1\crlf Address: #2 \crlf Email: #3\crlf}% \thinrule\blank[small]} Wolfgang
On 28 févr. 2010, at 10:17, Wolfgang Schuster wrote:
\def\myMacro {\dotriplegroupempty\domyMacro}
\def\domyMacro#1#2#3% {\doifelsenothing{#3} {Name: #1\crlf Email: #2\crlf} {Name: #1\crlf Address: #2 \crlf Email: #3\crlf}% \thinrule\blank[small]}
Wolfgang
Many thanks Wolfgang! Your solution solves my question. Now for a complete understanding of the solution (and before putting your solution on the wiki), here is another question. After reading your solution, I searched in the source files and saw that in the file syst-gen.mkii the command \dosinglegroupempty, until \doquintuplegroupempty are defined. For instance \def\dotriplegroupempty#1% {\def\dodogetargument##1% {\def\dodogetargument####1% {\def\dodogetargument% {\dontpermitspacesbetweengroups #1{##1}{####1}}% \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}% \dogetgroupargument\secondargumenttrue\secondargumentfalse}% \dogetgroupargument\firstargumenttrue\firstargumentfalse} Can one use other constructions like these, for example can one define \dosepttuplegroupempty in order to have macros with 7 arguments, of which 5 are always present, while the sixth and seventh may be absent in some occasions? Thanks again: OK
On 28-2-2010 12:44, Otared Kavian wrote:
On 28 févr. 2010, at 10:17, Wolfgang Schuster wrote:
\def\myMacro {\dotriplegroupempty\domyMacro}
\def\domyMacro#1#2#3% {\doifelsenothing{#3} {Name: #1\crlf Email: #2\crlf} {Name: #1\crlf Address: #2 \crlf Email: #3\crlf}% \thinrule\blank[small]}
Wolfgang
Many thanks Wolfgang! Your solution solves my question.
Now for a complete understanding of the solution (and before putting your solution on the wiki), here is another question. After reading your solution, I searched in the source files and saw that in the file syst-gen.mkii the command \dosinglegroupempty, until \doquintuplegroupempty are defined. For instance \def\dotriplegroupempty#1% {\def\dodogetargument##1% {\def\dodogetargument####1% {\def\dodogetargument% {\dontpermitspacesbetweengroups #1{##1}{####1}}% \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}% \dogetgroupargument\secondargumenttrue\secondargumentfalse}% \dogetgroupargument\firstargumenttrue\firstargumentfalse}
Can one use other constructions like these, for example can one define \dosepttuplegroupempty in order to have macros with 7 arguments, of which 5 are always present, while the sixth and seventh may be absent in some occasions?
sure, you can just test .. \ifsecondargument ... \iffirstargument but in such cases using key/values might make mode sense ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
participants (3)
-
Hans Hagen
-
Otared Kavian
-
Wolfgang Schuster