使用 xifthen 包确定是否提供了可选参数

使用 xifthen 包确定是否提供了可选参数

我正在尝试创建一个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是一个强制性论点。


你为什么会得到这样的输出?正如我所说,你的宏需要三个强制的参数。在第一次调用中,找到的参数是

  1. u
  2. v
  3. \\

由于u不为空,因此得到B

在第二次调用中,参数是

  1. [
  2. s
  3. o

因此你得到了B一个空格(因为行末有结束线\ifthenelse,然后mething]uv

'之间有两个空格B:一个是由定义中的结束行生成的(如前所述),一个是 之后的结束行\\。此标记不会被执行,因为它已被吸收为未使用的参数,因此结束行算作空格。

答案2

在此处输入图片描述

您需要使用第二个可选参数,\newcommand因此它#1是可选的。

\documentclass{article}

\usepackage{ifthen}

\newcommand{\test}[3][--zzz--]{%
\ifthenelse{\equal{#1}{--zzz--}}{A}{B with #1} [#2][#3]%
}

\begin{document}

\test{u}{v}

\test[something]{u}{v}

\end{document}

相关内容