透明的可选参数宏

透明的可选参数宏

有没有办法定义一个采用一个可选参数并且行为透明的宏?传统的 Latex 方式 ( \newcommand{\foo}[1][]{foo}) 有以下缺点:写入$T_\foo$会导致错误(缺失{插入),但使用零参数宏可以执行相同操作。

我认为,当未提供参数时,带有可选参数的宏的行为应与零参数宏相同。可以实现这一点吗?

答案1

与宏参数不同,_如果没有括号,则 a 不会拾取下一个标记,它扩展 查找下一个不可扩展的标记或括号组

所以之后

\newcommand\foo{abc}

然后

    \fbox\foo

\fbox{\foo}

和盒子 abc 但是

$T_\foo$

$T_abc$

$T_{a}bc

因此,省略括号在任何情况下都是不好的风格,并会导致意外的行为,从而暴露内部实现\foo

使用可选参数版本,行为揭示了实现(并且失败了)

如果您确实想要这个,您可以在定义中添加一个组:

enter image description here

 \documentclass{article}

\def\foo{\bgroup\xfoo}
\newcommand\xfoo[1][]{abc#1\egroup}
\begin{document}



$T_\foo$ $T_\foo[d]$


\end{document}

但它鼓励糟糕的文档标记。

相关内容