我正在尝试创建一个test
接受 3 个参数的命令。第一个参数是可选的,而第二个和第三个参数是必需的。
我正在尝试使用xifthen
包,特别是其中的\xifthen
和\isempty
命令,来测试是否给出了可选参数。
- 如果没有给出可选参数,
test
则应该返回“A”。 - 如果给出了可选参数,
test
则应该返回“B”。
这是我的 MWE:
\documentclass{article}
\usepackage{xifthen}
\newcommand{\test}[3]{%
\ifthenelse{\isempty{#1}}{A}{B}
}
\begin{document}
\test{u}{v}
\\
\test[something]{u}{v}
\end{document}
但我得到了以下输出。我的错误是什么?
答案1
您正在定义一个带有三个强制(即括号)参数的宏。您需要使用略有不同的语法来使第一个参数成为可选参数。
另一方面,您可以使用当前属于内核的软件包\NewDocumentCommand
所提供的。xparse
\documentclass{article}
%\usepackage{xparse}% not needed with LaTeX 2020-10-01 or later
\NewDocumentCommand{\test}{omm}{%
\IfNoValueTF{#1}{A}{B}%
}
\begin{document}
\test{u}{v}
\test[something]{u}{v}
\end{document}
这将打印“A”和“B”。
这个想法基本上和
\newcommand{\test}[3][SoMeTHiNGweIrd]{%
\ifthenelse{\equal{#1}{SoMeTHiNGweIrd}}{A}{B}%
}
但实现更好;例如,\IfNoValueTF
测试是可扩展的,而实际\ifthenelse
并非如此。需要注意的是,这里表示的字符串SoMeTHiNGweIrd
确实需要额外的努力才能生成。
我们omm
声明参数类型:
o
是一个可选参数,没有默认值;如果不存在默认值,则\IfNoValueTF
测试返回 true;m
是一个强制性论点。
你为什么会得到这样的输出?正如我所说,你的宏需要三个强制的参数。在第一次调用中,找到的参数是
u
v
\\
由于u
不为空,因此得到B
。
在第二次调用中,参数是
[
s
o
因此你得到了B
一个空格(因为行末有结束线\ifthenelse
,然后mething]uv
'之间有两个空格B
:一个是由定义中的结束行生成的(如前所述),一个是 之后的结束行\\
。此标记不会被执行,因为它已被吸收为未使用的参数,因此结束行算作空格。