有条件地删除括号

有条件地删除括号

我正在尝试使用以下可选参数创建命令

\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)可以是TF仅测试一种情况或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}$参数类型),也就是说,我们从下标中挑选并将其环绕起来。exparsen()

相关内容