newcommand - パラメータが空の場合に条件付きで実行

newcommand - パラメータが空の場合に条件付きで実行

次のコマンド定義(エントリリストのエントリ)は正常に動作します。

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

今、4 番目のパラメータが空になる可能性があるテスト ケースがあります。その場合、その前に定義された新しい行を表示したくありません。次のアプローチを試しました。

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

しかし、エラーが発生します:

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}

助けていただけますか?

答え1

コメントでは問題は解決されているようですが、私は 2 つの異なるアプローチを提案したいと思います。

まず、\newcommand最初の引数であれば、オプションの引数を 1 つ持つコマンドを簡単に定義できます。この機能を使用すると、マクロを次のように書き換えることができます。

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

[]は、デフォルトでは空であると書かれています。#1このマクロは、パラメータ番号を並べ替えた点を除けば、基本的にあなたのマクロと同じです。主な違いは、マクロの使用方法にあります。

\entry{second}{third}{fourth}

オプションパラメータなし、またはオプションパラメータを指定する場合:

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

\NewDocumentCommand2番目の選択肢は、xparseパッケージ。 の利点は、\NewDocumentCommandオプションの引数を、末尾を含め、任意の場所に配置できることです。

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

mmmo3つあると言われていますメートル反論的な議論とoオプション引数。繰り返しますが、コードとの唯一の実際の違いは、マクロの使用方法にあります。

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

関連情報