nuevo comando: ejecución condicional cuando el parámetro está vacío

nuevo comando: ejecución condicional cuando el parámetro está vacío

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, \newcommandfacilita 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 #1está 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 \NewDocumentCommanddesde elxparsepaquete. La ventaja de \NewDocumentCommandes 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 mmmoque 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

información relacionada