我已经定义
\newcommand{\skw}{\mathbin{\star}}
在 这样的表达式中,它可以按预期工作$a\star b$
。但是,与 不同$a^+$
,当我尝试 时$a^\skw$
,我得到了一个编译错误,如果我改写 ,这个错误就会消失$a^{\skw}$
。所以我的问题是我应该如何定义\skw
才能简单地写$a^\skw$
?
答案1
Latex 不支持不带括号的形式(对于任何上标)。有时它可以工作,但正如你所见,你不能依赖它。
但是,您可以直接使用,^\star
因为它已经有了\mathbin
其默认定义,声明为\DeclareMathSymbol{\star}{\mathbin}{letters}{"3F}
从技术上讲,如果上标扩展为单个不可扩展的标记或括号组(后者始终充当\mathord
),则可以省略括号。
因此它^\star
可以工作,因为它是一个\mathchardef
具有 mathbin 间距的标记。
\newcommand{\skw}{{\mathbin{\star}}}
也可以在上标中工作,但括号会强制\mathord
间距。
\star
如果你想要一个不同的版本\mathclass
,那么而不是定义说
\newcommand{\skw}{\mathrel{\star}}
你可以使用
\DeclareMathSymbol{\skw}{\mathrel}{letters}{"3F}
制作一个\mathrel
令牌。
但无论你如何定义它你都应该总是 在文档标记中使用括号上标,而不是依赖于低级解析,这与^
宏参数完全不同,
\newcommand\foo{abc}... $x^\foo$
没有给出错误,但给出的$x^{a} b c$
结果几乎从来不是想要的。
如果您省略括号,则会出现错误或不会出现错误,而如果您没有出现错误,则会出现合理的输出或不会出现合理的输出,这取决于所用令牌的内部实现细节。这种行为定义明确,但最好避免。
答案2
我展示了如何在 OpTeX 中解决这个问题。当指数以\mathbin
或\mathrel
或开头\mathop
(第一次扩展后)时,这个原始命令将被忽略。下标也应做类似的事情。
\catcode`\^13 \def^{\sp\ea\testnext}
\catcode`\^=12
\mathcode`\^="8000
\def\testnext{\immediateassignment\futurelet\next\testnextA}
\def\testnextA{\casesof\next
\mathbin {\ignoreit}
\mathrel {\ignoreit}
\mathop {\ignoreit}
\_finc {}%
}
\def\skw{\mathrel{\star\star}}
$
a \skw b^\skw
$
\bye