二元运算符作为指数

二元运算符作为指数

我已经定义

\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

相关内容