\newcommand 的默认值与文档不符

\newcommand 的默认值与文档不符

的文档声称\newcommandlatex2e.pdf如果可选参数指定为 ,[]并且未在调用中给出,则值将为字符串def。相反,命令获取的是空字符串。这是文档错误还是错误?

\documentclass{article}

\usepackage{ifthen}

%Font for sequence
\newcommand \seqname [1] {\bm{\mathit{#1}}}

% Set former {x|P(x)} and {x,y,z}
% Trusting documentation
\newcommand {\setof} [2] []
   { \ifthenelse {\equal{#1}{def}}
       {\{ #2 \}}
       {\{ #2 | #1 \} p1=#1}
   }

%Explicit default
\newcommand {\setxx} [2] [noP]
   { \ifthenelse {\equal{#1}{noP}}
       {\{ #2 \}}
       {\{ #2 | #1 \} p1=#1}
   }

\begin{document}
Test setof x,y,z = $\setof{x,y,z}$

Test setof x P(x) = $\setof[P(x)] {x}$

Test setxx x,y,z = $\setxx{x,y,z}$

Test setxx x P(x) = $\setxx[P(x)] {x}$

\end{document}

答案1

我从未见过def在未指定参数时使用默认值的说法。相反,第二个可选\newcommand当定义的宏的可选参数不存在时,将替换该参数。

所以如果你

\newcommand{\foo}[2][def]{#1-#2}

该调用\foo{x}将导致

定义-x

而调用\foo[y]{x}将导致

yx

您可以轻松检查

\newcommand {\setof} [2] []
   { \ifthenelse {\equal{#1}{def}}
       {\{ #2 \}}
       {\{ #2 | #1 \} p1=#1}
   }

将打印

{x|}p1 =

如果调用$\setof{x}$\setof[def]{x}只会打印

{X}

这当然不是你想要的。

正确的定义是

\newcommand{\setof}[2][]{%
  \if\relax\detokenize{#1}\relax
    \{#2\}% no optional argument (or empty)
  \else
    \{#2\mid#1\}p1=#1%
  \fi
}

使用起来更加简单xparse

\usepackage{xparse}

\NewDocumentCommand{\setof}{om}{%
  \IfNoValueTF{#1}
    {\{#2\}}% no optional argument
    {\{#2\mid#1\}p1=#1}%
}

其中o表示可选参数(无默认值)和m强制参数。使用 来检查可选参数是否存在\IfNoValueTF

相关内容