Todas as opções acima mostram que pode ser difícil criar uma função agradável e flexível (ou proibir uma sobrecarga) no LaTeX !!! (esse código TeX parece grego para mim)
bem, apenas para adicionar meu desenvolvimento recente (embora não tão flexível), eis o que eu usei recentemente no meu documento de tese, com
\usepackage{ifthen} % provides conditonals...
Inicie o comando, com o comando "opcional" definido em branco por padrão:
\newcommand {\figHoriz} [4] [] {
Em seguida, a macro define uma variável temporária, \ temp {}, de maneira diferente, dependendo se o argumento opcional está em branco ou não. Isso pode ser estendido a qualquer argumento passado.
\ifthenelse { \equal {#1} {} } %if short caption not specified, use long caption (no slant)
{ \def\temp {\caption[#4]{\textsl{#4}}} } % if #1 == blank
{ \def\temp {\caption[#1]{\textsl{#4}}} } % else (not blank)
Então eu executo a macro usando a variável \ temp {} para os dois casos. (Aqui, apenas define a legenda curta para igualar a legenda longa, se não tiver sido especificada pelo usuário).
\begin{figure}[!]
\begin{center}
\includegraphics[width=350 pt]{#3}
\temp %see above for caption etc.
\label{#2}
\end{center}
\end{figure}
}
Nesse caso, só verifico o argumento único "opcional" fornecido por \ newcommand {}. Se você configurá-lo para, digamos, 3 args "opcionais", ainda precisará enviar os 3 args em branco ... por exemplo.
\MyCommand {first arg} {} {} {}
o que é bem bobo, eu sei, mas é o mais longe que eu vou usar o LaTeX - não é tão sensato assim que começo a olhar para o código TeX ... Eu gosto do método xparse do Sr. Robertson, talvez eu vou tentar ...