On 13 Mar 2023, at 21:39, Hans Hagen via ntg-context
wrote: On 3/12/2023 2:24 PM, Bruce Horrocks via ntg-context wrote:
I have an existing macro that I'd like to extend. The current definition is \define[3]\mycommand{...} which I'd like to extend to take an optional 4th parameter plus an optional setup parameter. Thus I currently invoke it as: \mycommand{aa}{bb}{cc} and I'd like to be able to extend it so that any of the following can be used: \mycommand{aa}{bb}{cc} \mycommand{aa}{bb}{cc}{dd} \mycommand{aa}{bb}{cc}{dd}[ee] or \mycommand[ee]{aa}{bb}{cc}{dd} % if this is more the ConTeXt way where {dd} is the optional extra parameter and, if it is present, then [ee] can also be optionally added (because it controls how {dd} is printed). If it helps, the actual body of the macro can easily be a call to Lua so it's fine if the function takes 5 params where 4 and 5 can be nil or empty strings. I've trawled through syst-aux.mkiv but it only covers optional numbers of [ ] or { } but not combinations of both (which given the vast numbers of combinations is perhaps not surprising!). Have I missed something obvious that would help me? So, four optional with mandate {} plus a fallback to an optional []
\starttext
\tolerant\def\mycommand#=#=#=#=#:[#5]% {\ifparameter#1\or(1:#1)\fi \ifparameter#2\or(2:#2)\fi \ifparameter#3\or(3:#3)\fi \ifparameter#4\or(4:#4)\fi \ifparameter#5\or[5:#5]\fi}
\startbuffer \mycommand{aa}{bb}{cc} \mycommand{aa}{bb}{cc}{dd} \mycommand{aa}{bb}{cc}{dd}[ee] \mycommand{aa}{bb}{cc} \mycommand{aa}{bb}{cc}{dd} \mycommand{aa}{bb}{cc}{dd}[ee] \stopbuffer
\typebuffer
\startlines \getbuffer \stoplines
\stoptext
I'm not saying that it's the best solution, you can add \protected in front of the \def if needed.
Hans
Thanks Hans, This works well. I'll try and add something to the Wiki but I don't understand how #: does what it does. Regards, — Bruce Horrocks Hampshire, UK