# Variable number of arguments for \newcommand

I use the following command to write my matrix variables

\newcommand{\mymat}[3]{\ensuremath{\mathbf{#1}^{#2}_{#3}}}


Thus #1 is the matrix variable, #2 is the superscript and #3 is the subscript. For example \mymat{A}{T}{i} would yield the output $\mathbf{A}^{T}_{i}$. Most often, the case is that I don't need the subscript and superscript arguments and I end up writing \mymat{A}{}{}. Is there a way to make the last two brackets optional?

• twoopt, from the oberdiek bundle, does that. – Bernard Oct 28 '14 at 7:37
• Yes but it's almost always a bad choice of input syntax (not a technical point, of course). – Joseph Wright Oct 28 '14 at 7:45
• \newcommand{\mymat}[1]{\mathbf{#1}} and \mymat{A}^{T}_{i} is clearer and not more difficult to type. – egreg Oct 28 '14 at 8:15
• Note that ^{} and _{} affect the spacing so it is better to use a markup that does not put in null sub and superscript atoms. – David Carlisle Oct 28 '14 at 11:00

You could use the xparse package which offers great possibilities for defining user commands:

My First attempt:

\usepackage{xparse}
\DeclareDocumentCommand{\mymat}{o m o}
{%
\IfNoValueTF{#1}
{\IfNoValueTF{#3}{\mathbf{#2}}{\mathbf{#2}^{#3}}}
{\IfNoValueTF{#3}{\mathbf{#2}_{#1}}{\mathbf{#2}_{#1}^{#3}}}
}


Egregs simpler solution with IfValueT

\usepackage{xparse}
\DeclareDocumentCommand{\mymat}{o m o}
{%
\mathbf{#2}\IfValueT{#1}{_{#1}}\IfValueT{#3}{^{#3}}
}


m stands for mandatory argument, o for optional.

IfValueT{argument}{true code} checks if the argument was given and calls either true code or does nothing.

IfNoValueTF{argument}{true code}{false code} checks if the argument was not given and calls either {true code} or {false code}

Result (You should maybe add a negative math space \! if you have an A matrix.: \mymat{A}[\!\top]):

\begin{document}
$$\mymat{A} \mymat[1]{A} \mymat{A}[\top] \mymat[1]{A}[\top]$$
\end{document}


• Simpler: \mathbf{#2}\IfValueT{#1}{_{#1}}\IfValueT{#3}{^{#3}}` – egreg Oct 28 '14 at 12:44
• Of course! Will edit my answer – MaxNoe Oct 28 '14 at 12:45
• @MaxNoe I suggest to keep both versions, to show different approaches. – egreg Oct 28 '14 at 12:49
• Ok. Now we have both. – MaxNoe Oct 28 '14 at 12:59
• @egreg \mathbf{#1}\IfValueT{#2}{_{#2}}\IfValueT{#3}{^{#3}} is this correct? – dineshdileep Oct 31 '14 at 4:32