的文档声称\newcommand
,latex2e.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
。