# Different macro behavior when supplied an argument

I want to define a macro, call it \func, so that \func will output\phi, and \func[i] will output \phi(i).

what is the easiest way to achieve this?

I know there are other questions that address this issue - I guess one of them is exactly my question and I just don't get it :)

-
Classic LaTeX way uses \func and \func[i] (note [...] instead of {...}). –  Paul Gaborit Nov 3 '12 at 15:33
@PaulGaborit - Thanks, I am quite new to latex :) Will change my question –  noam Nov 3 '12 at 15:34
@PaulGaborit - BTW, can you refer me to an explanation as to when should one use curly braces and when to use square braces? in this example they use curly braces: math.tamu.edu/~boas/courses/math696/math-macros.html –  noam Nov 3 '12 at 15:48
–  Peter Grill Nov 3 '12 at 15:51
@noam LaTeX uses [] to delimit the optional argument (always the first) of a command. All other arguments use curly braces. –  Paul Gaborit Nov 3 '12 at 15:53

You can define \func to take an optional argument:

\documentclass{article}

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

\begin{document}

$\func\quad\func[i]$

\end{document}


-
Thanks! But this just exploits the fact that \phi_{} looks the same as \phi, right? I need a slightly more general solution. I will edit my question to prevent this "loop hole" :) –  noam Nov 3 '12 at 15:37
@Qrrbrbirlbel right; will do so. –  Gonzalo Medina Nov 3 '12 at 15:38
@noam please see my updated answer. Is this what you want? –  Gonzalo Medina Nov 3 '12 at 15:45
yes! thank you very much! :) –  noam Nov 3 '12 at 15:47
@GonzaloMedina A subscript (even if it's empty) adds a small space after the symbol; its size is in the parameter \scriptspace, default value 0.5pt. I've also put a better test in the conditional. –  egreg Nov 3 '12 at 15:48
show 1 more comment

xparse-based solution

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\func}{o}{%
\phi
\IfNoValueF{#1}{(#1)}%
}

\begin{document}

$\func\quad\func[i]$

\end{document}


where you want a single optional ('o-type') argument.

-