我想创建一个新的宏,它的作用就像它自己的字符一样。具体来说,我想\macro
扩展到a\kern0.5em b
,但仍然充当Rel
字符(即1\macro1
在 周围留出一个小空格,a b
类似于=
中的1=1
空格)。
我试过\def\macro{\mathrel{a\kern0.5em b}}
,但当它用作指数时会出现问题:x^\macro
扩展为x^\mathrel{ ... }
,TeX 不喜欢它并会抛出错误。我知道我可以像 一样将它括起来x^{\macro}
,但我正在寻找一种不必每次都用括号括起来的方法。我还知道Rel
当用作单独指数时它是否是原子并不重要,但我希望它在所有情况下都能工作,无论是否是指数。
有没有办法制作一个宏(带有类似{
组)而不被视为字符}
{a\kern0.5em b}
Ord
和当用作指数或下标时有效吗?
答案1
不,这是不可能的。只要你将某个东西括在括号组中,它就会变成 Ord 原子。TeXbook 第 26 章“数学模式摘要”对此有非常具体的说明:
{
<数学模式材料>}
。类别 1 的字符标记或与此类字符标记相等的控制序列会导致 TeX 开始新的分组级别,并开始处理新的数学列表。当这样的组以 ' ' 结尾时,\bgroup
TeX将使用生成的数学列表作为新 Ord 原子的核心,并将其附加到当前列表中。但是,如果生成的数学列表是单个 Acc 原子(即重音量),则将附加该原子本身。\let
}
为了使语法x^\macro
起作用,内容\macro
必须是数学字段。
<superscript><math field>。<superscript> 命令是类别 7 的显式或隐式字符标记。如果当前列表未以原子结尾,则将附加一个所有字段均为空的新 Ord 原子;因此,在所有情况下,当前列表都将以原子结尾。此原子的上标字段应为空;通过将其更改为指定 <math field> 的结果,可使其变为非空。
然而,数学字段要么是单个符号,要么是括号组
<数学字段>用于指定原子的原子核、上标或下标。当<数学字段>为<数学符号>时,F和A该符号的数字进入原子域。否则 <math field> 以 '
{
' 开头,这会导致 TeX 进入新的分组级别并开始新的数学列表;随后的 <math modematerial> 以 '}
' 结尾,此时组结束,生成的数学列表进入原子域。如果数学列表结果只是一个没有下标或上标的 Ord 原子,或者是一个核心是 Ord 的 Acc,则括号会被有效删除。
然而,你可以简单地利用脚本样式中 Rel 原子周围的间距为零这一事实,并使用以下定义
\def\macro{{{}\mathrel{a\kern0.5em b}{}}}
$x \macro y$
$z^{x \macro y}$
$z^\macro$ % Brrr...
\bye