The TeX FAQ

Frequently Asked Question List for TeX

Programming

Optional arguments like \section

Optional arguments, in macros defined using \newcommand, don’t quite work like the optional argument to \section. The default value of \sections optional argument is the value of the mandatory argument, but \newcommand requires that you “know” the value of the default beforehand.

The requisite trick is to use a macro in the optional argument:

\documentclass{article}
\newcommand\thing[2][\DefaultOpt]{%
  \def\DefaultOpt{#2}%
  optional arg: #1,  mandatory arg: #2%
}
\begin{document}
\thing{manda}% #1=#2

\thing[opti]{manda}% #1="opti"
\end{document}

LaTeX itself has a trickier (but less readily understandable) method, using a macro \@dblarg; inside LaTeX, the example above would have been programmed:

\newcommand\thing{\@dblarg\@thing}
\newcommand\@thing[2][\@error]{%
  optional arg: #1,  mandatory arg: #2%
}

In that code, \@thing is only ever called with an optional and a mandatory argument; if the default from the \newcommand is invoked, a bug in user code has bitten…

FAQ ID: Q-oarglikesect
Tags: latexmacros