0

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?

7
  • 2
    Yes, through the use of optional arguments. Check out the xparse package. Commented May 2, 2014 at 13:55
  • How about using a counter?
    – 1010011010
    Commented May 2, 2014 at 13:59
  • Have a look at the pgfkeys package. It lets you define commands with a key=value API.
    – user10274
    Commented May 2, 2014 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. :) Commented May 2, 2014 at 14:10
  • I can't really see the advantage of writing \func{1} instead of \func(1).
    – egreg
    Commented May 2, 2014 at 14:11

2 Answers 2

5

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}

output

3
  • 1
    The parser allows () delimited arguments but in LaTeX2e () arguments should be used with picture coordinates. Commented May 2, 2014 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. Commented May 2, 2014 at 14:06
  • () delimited arguments fit perfectly with the OP question because of the semantics. They do not conflict with the picture usage. Moreover, they make typing much more natural and refactoring a lot easier because of the xparse ability to properly balance delimiters: \NewDocumentCommand \FuncF { d() } { \IfValueTF { #1 } { f \mathord{ \left( #1 \right) } } { f } } \[ \FuncF( \sin^2(x) ) \] Commented Oct 5, 2021 at 6:51
6

Optional arguments should use [] so

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

Used as

\func or \func[x]

3
  • Is the \ifx structure how you test for a value with 'normal' TeX? (Also, shouldn't there be a \fi?) Commented May 2, 2014 at 14:05
  • 1
    @SeanAllred a \fi might be useful, thanks:-) Commented May 2, 2014 at 14:09
  • 1
    @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) Commented May 2, 2014 at 14:11

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .