Changes

Jump to navigation Jump to search
m
no edit summary
< [[Inside ConTeXt]] | [[Commands with KeyVal arguments]] >
In LaTeX you define a new command with an optional argument with "newcommand": <texcode>\newcommand{\MyCommand}[2][World]{{#2Hello #1!}}\MyCommand{\bfseries}\MyCommand[Hans]{\scshape}</texcode> <context>{\bf Hello World!}{\sc Hello Hans!}</context> In ConTeXt, the optional argument processing is handled as a two-step process. First, we write the command for the end-user as a wrapper command, which calls <{{cmd|dosingleempty}}, {{cmd>|dodoubleempty</}}, {{cmd> |dotripleempty}}, ... (from [http://source.contextgarden.net/tex/context/base/{{src|syst-genaux.tex mkiv}} or {{src|syst-gen.tex]mkii}}) to handle the arguments properly -- including the optional ones -- and then calls a "private" command that contains the internals of the macro. Note that this function call does not explicitly refer to the arguments at all.
For a command with two optional arguments, we use:
<texcode>
\def\MyCommand{\dodoubleempty\doMyCommand}
</texcode>
We then create the "private" macro (<tt>\doMacroName</tt> is the traditional ConTeXt name for these), with all the arguments defined as nonoptional. Default values for the arguments need to be handled somewhat more explicitly than with LaTeX; macros such as <{{cmd>|ifsecondargument</cmd> }} are used to determine whether the given argument was specified, as follows:
<texcode>
</context>
If you ''don't'' want any optional arguments, but still want your arguments enclosed in <tt>[]</tt> with appropriate handling for spaces (or line breaks) between the square brackets, use <cmd>dodoublearguments</{{cmd> |dodoubleargument}} instead of <{{cmd>|dodoubleempty</cmd>}}. There are of course versions for other numbers of arguments, found by replacing <tt>double</tt> with <tt>single</tt> through <tt>seventuple</tt>; see [http://source.contextgarden.net/tex/context/base/syst-gen.tex {{src|syst-genaux.tex] mkiv}} for the exact names. === Examples ===
----To define <code>\mycommand[#1]{#2}</code> with one optional argument and one mandatory argument, do the following<context source="yes">\def\mynewcommand{\dosingleempty\doMyNewCommand}\def\doMyNewCommand[#1]#2{% \iffirstargument There is an optional parameter: {\bf #1}\par% \else No optional parameter\par% \fi This is the mandatory text: {\em #2}%}
\starttext\mynewcommand[opt]{Hello People}\blank\mynewcommand{Hello People}\stoptext</context>  To define <ttcode>\mycommand[.#1.][.#2.]{.#3.}</ttcode>, i.e., with curly braces around a non-two optional third arguments and one mandatory argument, you just definedo
<texcode>
</texcode>
=== Pitfalls === Please keep in mind that <code>\iffirstargument</code> will always return true if you put before it a command which itself has an argument. See the following example: <context source="yes" text="produces">\def\mynewcommand{\dosingleempty\doMyNewCommand}\def\doMyNewCommand[#1]#2{% \startalignment[center] \iffirstargument There is an optional parameter: {\bf #1}\par% \else No optional parameter\par% \fi This is the mandatory text: {\em #2}% \stopalignment}\starttext\mynewcommand[opt]{Hello People}\blank\mynewcommand{Hello People}\stoptext</context> Use <code>\doifsomethingelse</code> instead: <context source="yes" text="this time is correct:">\def\mynewcommand{\dosingleempty\doMyNewCommand}\def\doMyNewCommand[#1]#2{% \startalignment[center]% \doifsomethingelse{#1} {There is an optional parameter: {\bf #1}\par} {No optional parameter\par} This is the mandatory text: {\em #2} \stopalignment%}\starttext\mynewcommand[opt]{Hello People}\blank\mynewcommand{Hello People}\stoptext</context>  On a final note, for comparative purposes: in LaTeX, a new command with an optional argument is defined with <code>\newcommand</code>. <texcode>\newcommand{\MyCommand}[2][World]{{#2Hello #1!}}\MyCommand{\bfseries}\MyCommand[Hans]{\scshape}</texcode> Reference: http://archive.contextgarden.net/message/20101215.225603.cc903e62.en.html [[Category:Programming and Databases]][[Category:Inside ConTeXtTools]]

Navigation menu