我有以下命令定义(它是条目列表的条目),它工作正常:
\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