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. May 2, 2014 at 13:55
  • How about using a counter?
    – 1010011010
    May 2, 2014 at 13:59
  • Have a look at the pgfkeys package. It lets you define commands with a key=value API.
    – user10274
    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. :) May 2, 2014 at 14:10
  • I can't really see the advantage of writing \func{1} instead of \func(1).
    – egreg
    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. 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. 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) ) \] Oct 5, 2021 at 6:51
5

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?) May 2, 2014 at 14:05
  • 1
    @SeanAllred a \fi might be useful, thanks:-) 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) 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 .