newcommand - bedingte Ausführung, wenn Parameter leer ist

newcommand - bedingte Ausführung, wenn Parameter leer ist

Ich habe die folgende Befehlsdefinition (es ist ein Eintrag einer Eintragsliste), die gut funktioniert:

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

Jetzt habe ich einen Testfall, bei dem der 4. Parameter leer sein kann. In diesem Fall möchte ich die davor definierte neue Zeile nicht anzeigen. Ich habe den folgenden Ansatz ausprobiert:

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

aber es gibt mir einen Fehler:

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}

Kannst du bitte helfen?

Antwort1

Das Problem scheint in den Kommentaren gelöst worden zu sein, aber ich möchte zwei verschiedene Ansätze vorschlagen.

Erstens \newcommanderleichtert es die Definition von Befehlen mit einem optionalen Argument, vorausgesetzt, es ist das erste Argument. Mit dieser Funktion können Sie Ihr Makro wie folgt umschreiben:

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

Das []besagt, dass es standardmäßig #1leer ist. Dieses Makro ist im Wesentlichen dasselbe wie Ihres, außer dass ich die Parameternummern permutiert habe. Der Hauptunterschied besteht in der Art und Weise, wie Sie das Makro verwenden:

\entry{second}{third}{fourth}

ohne den optionalen Parameter oder, wenn Sie den optionalen Parameter angeben möchten:

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

Die zweite Alternative besteht in der Verwendung \NewDocumentCommandvonxparsePaket. Der Vorteil von \NewDocumentCommandist, dass Sie das optionale Argument überall einfügen können, wo Sie es möchten, auch am Ende:

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

Das mmmosagt, dass es dreiMzusätzliche Argumente und eineÖoptionales Argument. Auch hier liegt der einzige wirkliche Unterschied zu Ihrem Code in der Art und Weise, wie das Makro verwendet wird:

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

verwandte Informationen