次のコマンド定義(エントリリストのエントリ)は正常に動作します。
\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}
\NewDocumentCommand
2番目の選択肢は、xparseパッケージ。 の利点は、\NewDocumentCommand
オプションの引数を、末尾を含め、任意の場所に配置できることです。
\NewDocumentCommand{\entry}{ mmmo }{%
#1&\parbox[t]{11.2cm}{%
#2%
\hfill%
#3%
\IfNoValueF{#4}{\\#4}% print #4 when it is given
}\\}
mmmo
3つあると言われていますメートル反論的な議論とoオプション引数。繰り返しますが、コードとの唯一の実際の違いは、マクロの使用方法にあります。
\entry{first}{second}{third}% without optional argument
\entry{first}{second}{third}[fourth]% with optional argument