# newcommand with variable number of arguments

I have seen several related questions, but none seems to address specifically this.

I would like to define a command that accepts a variable number of arguments. Something like

\newcommand{\func}(1){\if{#1}{f(#1)}{f}}


So that if there is a parameter the output will be f(#1) and if there is no parameter the output will be f, and never f().

Is this possible?

-
Yes, through the use of optional arguments. Check out the xparse package. –  Sean Allred May 2 '14 at 13:55
How about using a counter? –  1010011010 May 2 '14 at 13:59
Have a look at the pgfkeys package. It lets you define commands with a key=value API. –  Marc van Dongen May 2 '14 at 14:05
@MarcvanDongen While I don't quite know how a K/V interface would fit here, the l3keys package of the expl3 bundle is also quite nice. :) –  Sean Allred May 2 '14 at 14:10
I can't really see the advantage of writing \func{1} instead of \func(1). –  egreg May 2 '14 at 14:11

The xparse package allows for some really cool syntax stuff.

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand\funcF{d()}{%
\IfValueTF{#1}{f(#1)}{f}}

% This is a version that follows more popular LaTeX syntax conventions.
\NewDocumentCommand\NormalFuncF{o}{%
\IfValueTF{#1}{f(#1)}{f}}

\begin{document}
$\funcF(2) = 4$
$\funcF$
$\NormalFuncF[2] = 4$
$\NormalFuncF$
\end{document}


-
The parser allows () delimited arguments but in LaTeX2e () arguments should be used with picture coordinates. –  David Carlisle May 2 '14 at 14:05
@DavidCarlisle Fair—It should be noted that normal syntax rules would follow that {} and [] conventions. I'll edit-in a version that follows this. –  Sean Allred May 2 '14 at 14:06

Optional arguments should use [] so

\newcommand{\func}[1][]{f\ifx\relax#1\relax\else(#1)\fi}


Used as

\func or \func[x]

-
Is the \ifx structure how you test for a value with 'normal' TeX? (Also, shouldn't there be a \fi?) –  Sean Allred May 2 '14 at 14:05
@SeanAllred a \fi might be useful, thanks:-) –  David Carlisle May 2 '14 at 14:09
@SeanAllred if #1 is empty it is \ifx\relax\relax which is true, otherwise it is false (\relax there can be any command that you do not expect in the argument) –  David Carlisle May 2 '14 at 14:11