有没有办法定义一个采用一个可选参数并且行为透明的宏?传统的 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
使用可选参数版本,行为揭示了实现(并且失败了)
如果您确实想要这个,您可以在定义中添加一个组:
\documentclass{article}
\def\foo{\bgroup\xfoo}
\newcommand\xfoo[1][]{abc#1\egroup}
\begin{document}
$T_\foo$ $T_\foo[d]$
\end{document}
但它鼓励糟糕的文档标记。