How to extend an existing macro to take optional parameters?
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? Regards, — Bruce Horrocks Hampshire, UK
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 ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
Designating "optional" parameters within [...] is a LaTeX notion. ConTeXt handles parameters differently. Alan
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).
On 14 Mar 2023, at 02:08, Alan Braslau via ntg-context
wrote: Designating "optional" parameters within [...] is a LaTeX notion. ConTeXt handles parameters differently.
Alan
Thanks Alan but I've never used LaTeX so I've no idea what the philosophical differences are. I wanted three mandatory and two optional params. One of those optional params is not typeset so I assumed it should be [ ] delimited and not { }.
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).
— Bruce Horrocks Hampshire, UK
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
participants (3)
-
Alan Braslau
-
Bruce Horrocks
-
Hans Hagen