On Thu, 24 May 2018 14:50:36 +0200, Hans Hagen <[email protected]> wrote: > On 5/24/2018 11:21 AM, Christoph Reller wrote: >> On Wed, 23 May 2018 16:01:05 +0200, Hans Hagen <[email protected]> wrote: >>> On 5/23/2018 3:39 PM, Christoph Reller wrote: >>>> >>>> What is the right way to define a command with both mandatory and >>>> optional arguments, e.g: >>>> >>>> \MyCommand[optional][mandatory] >>>> >>>> Consider the following MWE: >>>> >>>> \unexpanded\def\MyCommand[#1]{ >>>> \dosingleempty{\doMyCommand[#1]}} >>>> \def\doMyCommand[#1][#2]{ >>>> \doifsomething{#1}{number 1: #1\par} >>>> \doifsomething{#2}{number 2: #2}\blank[big]} >>>> \starttext >>>> \MyCommand[A][B] >>>> \MyCommand[A] >>>> \stoptext >>>> >>>> In last year's versions of ConTeXt the output was >>>> >>>> number 1: A >>>> number 2: B >>>> number 1: A >>>> >>>> In the latest version of ConTeXt the output is >>>> >>>> number 1: A >>>> number 2: B >>>> number 2: A >>>> >>>> Is this behavior intended? How can I make a definition whose behavior >>>> does not change in new versions of ConTeXt? >>> i'm not sure wht happens at your end but this is the best way: >>> >>> \unexpanded\def\MyCommand >>> {\dodoubleempty\doMyCommand} >>> >>> \def\doMyCommand[#1][#2]% >>> {\iffirstargument >>> number 1: #1% >>> \par >>> \fi >>> \ifsecondargument >>> number 2: #2% >>> \fi >>> \blank[big]} >>> >>> \starttext >>> \MyCommand[A][B] >>> \MyCommand[A] >>> \stoptext >> >> Thank you Hans for this information. My question is rather about error >> handling. I want: >> >> \MyCommand[A][B] % <- succeeds with #1->A, #2->B >> \MyCommand[A] % <- succeeds with #1->A >> \MyCommand % <- fails with "! Use of \MyCommand doesn't match its definition" >> >> I just wanted to ask whether there is a standard way to achieve this >> with \do<whatever>empty. If not, then this is also okay. > just use \dodoubleempty instead
Thank you for your hint, Hans. \dodoubleempty renders both arguments optional and hence the command can be used without any argument, which is not what I intended. Of course I can still test in the command's definition whether at least one argument is given and generate an error myself. In i-context.pdf, many arguments are documented as being optional and I assume that all the others are mandatory. A quick test has, however, shown that when omitting mandatory arguments, either no error is generated (e.g., nothing is setup or defined) or an obscure error emerges other than "! Use of \<command> doesn't match its definition". So I take it as a design decision that reporting missing mandatory arguments as errors is not part of the interface implementation, and that is a perfectly acceptable decision for me. It is just good to know. Thank you all for your highly valued feedback! Cheers, Christoph ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : [email protected] / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
