我尝试使用重新定义某些数学关系,\mathchoice
以便它们在用作下标和上标时不需要像原来那样分组。但是,下面的 MWE 会导致错误。
\documentclass{article}
\renewcommand{\sim}{\mathchoice{\mathrel{a}}{\mathrel{b}}{\mathrel{c}}{\mathrel{d}}}
\begin{document}
$X_\sim$
\end{document}
我意识到出现此错误是因为\mathchoice{...}
命令用作下标时需要分组。但是,在所有数学样式中,只需用和括住定义即可\bgroup
取消\egroup
。\mathrel
有没有一种方法可以定义\sim
,使其\sim
在用作下标或上标时不需要分组,同时保持其数学关系?
答案1
简短的回答:不。
障碍在哪里?当 Knuth 开发 TeX 时,他希望能够输入
f'(x) f''(x) f'''(x)
而不是笨拙的
f^{\prime}(x) f^{\prime\prime}(x) f^{\prime\prime\prime}(x)
数学活跃字符由此诞生,也是其独特特征^
(也是_
对称性的特征):
当 TeX 扫描
^
或_
处于数学模式(分别为 catcode 7 和 8)时,它会执行宏扩展,并在第一个不可扩展的标记处停止(并忽略\relax
沿途的空格和标记);如果此标记是{
(即,具有 catcode 1 的显式或隐式字符标记),则整个组将用作上标或下标;否则当前数学原子的上标或下标字段将用下一个标记填充。
该^^
功能在数学模式下也有效,但在这里无关紧要。
你的尝试结果如何?是的,找到的第一个不可扩展的标记是\mathchoice
,但是
X_\mathchoice
除了显示之外不会做任何有用的事情
! Missing { inserted.
<to be read again>
\mathchoice
l.6 $X_\sim
$
如果你试图通过以下方式规避这个问题
\renewcommand{\sim}{{\mathchoice{...}{...}{...}{...}}}
你没有得到相对原子,因为参数中声明的任何内容都会\mathchoice
被外面的括号取消。
可能的策略:_
使用 catcode 12,但数学活跃,定义如下
- 检查接下来的内容
- 如果是
{
,则\sb
这样做,支撑组将用作下标 - 否则,设为
<token>
下一个标记,删除它并调用\sb{<token>}
如果你够大胆,你可以尝试并实现它,但要小心:它可能会破坏现有的构造。