newcommand - execução condicional quando o parâmetro está vazio

newcommand - execução condicional quando o parâmetro está vazio

Eu tenho a seguinte definição de comando (é a entrada de uma lista de entradas) que funciona bem:

\newcommand{\entry}[4]{%
  #1&\parbox[t]{11.2cm}{%
    #2%
    \hfill%
    #3%
    \\#4%
  }\\}

Agora tenho um caso de teste em que o quarto parâmetro pode estar vazio. Nesse caso, não quero exibir a nova linha definida antes dela. Eu tentei a seguinte abordagem:

\newcommand{\entry}[4]{%
  #1&\parbox[t]{11.2cm}{%
    #2%
    \hfill%
    #3%
    \ifthenelse{\isempty{#4}}{}{\\#4}%
  }\\}

mas me dá um erro:

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}

Poderia ajudar por favor?

Responder1

O problema parece ter sido resolvido nos comentários, mas quero sugerir duas abordagens diferentes.

Primeiro, \newcommandfacilita a definição de comandos que possuem um argumento opcional, desde que seja o primeiro argumento. Usando este recurso você pode reescrever sua macro como:

\newcommand{\entry}[4][]{%
  #2&\parbox[t]{11.2cm}{%
    #3%
    \hfill%
    #4%
    \if\relax\detokenize{#1}\relax\else\\#1\fi
  }\\}

O []diz que por padrão #1está vazio. Esta macro é essencialmente igual à sua, exceto que permutei os números dos parâmetros. A principal diferença está em como você usa a macro:

\entry{second}{third}{fourth}

sem o parâmetro opcional ou, se quiser fornecer o parâmetro opcional:

\entry[first]{second}{third}{fourth}

A segunda alternativa é usar \NewDocumentCommanda partir doxparsepacote. A vantagem \NewDocumentCommandé que permite colocar o argumento opcional onde quiser, inclusive no final:

\NewDocumentCommand{\entry}{ mmmo }{%
  #1&\parbox[t]{11.2cm}{%
    #2%
    \hfill%
    #3%
    \IfNoValueF{#4}{\\#4}% print #4 when it is given
  }\\}

O mmmodiz que há trêseuargumentos anadtórios e umóargumento opcional. Novamente, a única diferença real no seu código está na forma como a macro é usada:

\entry{first}{second}{third}% without optional argument
\entry{first}{second}{third}[fourth]% with optional argument

informação relacionada