Tengo la siguiente definición de comando (es la entrada de una lista de entrada) que funciona bien:
\newcommand{\entry}[4]{%
#1&\parbox[t]{11.2cm}{%
#2%
\hfill%
#3%
\\#4%
}\\}
Ahora tengo un caso de prueba en el que el cuarto parámetro puede estar vacío. En ese caso, no quiero mostrar la nueva línea definida antes. Probé el siguiente enfoque:
\newcommand{\entry}[4]{%
#1&\parbox[t]{11.2cm}{%
#2%
\hfill%
#3%
\ifthenelse{\isempty{#4}}{}{\\#4}%
}\\}
pero me da un error:
Undefined control sequence. ^^I{test test2}
Missing number, treated as zero. ^^I{test test2}
Missing = inserted for \ifnum. ^^I{test test2}
Missing number, treated as zero. ^^I{test test2}
¿Podrias ayudarme por favor?
Respuesta1
El problema parece haberse resuelto en los comentarios pero quiero sugerir dos enfoques diferentes.
Primero, \newcommand
facilita la definición de comandos que tienen un argumento opcional, siempre que sea el primer argumento. Usando esta función puedes reescribir tu macro como:
\newcommand{\entry}[4][]{%
#2&\parbox[t]{11.2cm}{%
#3%
\hfill%
#4%
\if\relax\detokenize{#1}\relax\else\\#1\fi
}\\}
Dice []
que por defecto #1
está vacío. Esta macro es esencialmente la misma que la suya excepto que he permutado los números de los parámetros. La principal diferencia está en cómo usas la macro:
\entry{second}{third}{fourth}
sin el parámetro opcional o, si desea dar el parámetro opcional:
\entry[first]{second}{third}{fourth}
La segunda alternativa es utilizar \NewDocumentCommand
desde elxparsepaquete. La ventaja de \NewDocumentCommand
es que te permite poner el argumento opcional donde quieras, incluso al final:
\NewDocumentCommand{\entry}{ mmmo }{%
#1&\parbox[t]{11.2cm}{%
#2%
\hfill%
#3%
\IfNoValueF{#4}{\\#4}% print #4 when it is given
}\\}
Dice mmmo
que hay tres.metroargumentos anadtorios y unoohargumento opcional. Nuevamente, la única diferencia real con su código está en cómo se usa la macro:
\entry{first}{second}{third}% without optional argument
\entry{first}{second}{third}[fourth]% with optional argument