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

该问题似乎已在评论中得到解决,但我想建议两种不同的方法。

首先,\newcommand可以轻松定义具有一个可选参数的命令,前提是它是第一个参数。使用此功能,您可以将宏重写为:

\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使用解析包。 的优点\NewDocumentCommand是它允许您将可选参数放在您想要的任何地方,包括末尾:

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

mmmo三个并列论据和一个o可选参数。同样,您的代码的唯一真正区别在于宏的使用方式:

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

相关内容