\section\newcommand, don’t
quite work like the optional argument to \section. The default
value of \section’s 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…
This question on the Web: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=oarglikesect