我正在尝试使用以下可选参数创建命令
\newcommand{\Af}[1]{{\mathbf{A}_{(#1)}}
其中参数是一个数字。
不过,我希望如果没有给出参数,则删除括号。
问题
我如何定义一个决定是否写括号的命令?
答案1
另一种解决方案是使用xparse
。
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{ \Af }{ o }{%
A\IfValueT{#1}{_{(#1)}}%
}
\NewDocumentCommand{ \Bf }{ d() }{%
A\IfValueT{#1}{_{(#1)}}%
}
\begin{document}
no argument: $\Af$
with argument: $\Af[x]$
no argument: $\Bf$
with argument: $\Bf(x)$
\end{document}
xparse
使用不同的(在我看来更简单、更灵活的)语法来定义命令。的第二个参数\NewDocumentCommand
采用定义参数的列表,例如,o
对于可选参数和m
强制参数。使用\If(No)Value(TF)
您可以测试参数是否有值。(TF)
可以是T
或F
仅测试一种情况或TF
区分两者,后一种情况有三个参数,例如{#1}{true code}{false code}
。使用d
作为参数说明符(参见\Bf
定义),您甚至可以定义分隔符号,()
在这种情况下,因此代码更等于输出。
正如 daleif 所说,您可以\smash
在下标中添加 a 以防止它影响行距。
\NewDocumentCommand{ \Afs }{ o }{%
A\IfValueT{#1}{_{\smash{(#1)}}}%
}
没有\smash
(夸大的例子使用\sum
和\left…\right
来获得灵活的括号)。
和\smash
答案2
因为你想要一个可选参数,我认为你应该使用参数的存在(而不是空的)作为测试
\makeatletter
\newcommand\Af{\@ifnextchar[\@Af\@@Af}
\def\@@Af{\mathbf{A}}
\def\@Af[#1]{\@@Af_{(#1)}}
\makeatother
...
\Af ... \Af[x] ...
答案3
我通常使用etoolbox
类似于(请注意,您的示例没有使用可选参数)
\newcommand\Af[1][]{\mathbf{A}\ifblank{#1}{}{_{(#1))}}}
应该可以解决问题(未经测试)
用法:
$\Af$ will just give $\mathbf{A}$
和
$\Af[n]$ will give $\mathbf{A}_{(n)}$
顺便说一句:我们可以用这个xparse
包做更酷的事情,比如$\Af[n]$
我们可以使用来获得相同的结果(参见手册中的$\Af_{n}$
参数类型),也就是说,我们从下标中挑选并将其环绕起来。e
xparse
n
()