![为什么(我的用户定义的)上标(反向)命令在撇号(引号)符号旁边失败?](https://linux22.com/image/450711/%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%88%E6%88%91%E7%9A%84%E7%94%A8%E6%88%B7%E5%AE%9A%E4%B9%89%E7%9A%84%EF%BC%89%E4%B8%8A%E6%A0%87%EF%BC%88%E5%8F%8D%E5%90%91%EF%BC%89%E5%91%BD%E4%BB%A4%E5%9C%A8%E6%92%87%E5%8F%B7%EF%BC%88%E5%BC%95%E5%8F%B7%EF%BC%89%E7%AC%A6%E5%8F%B7%E6%97%81%E8%BE%B9%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
最小工作示例(我将参考基于首字母 AE 的行):
\documentclass{article}
\newcommand{\inv}{^{-1}}
\begin{document}
$A^{-1}$
$B\inv$
$C'^{-1}$
% $D'_1^{-1}$ % fails
% $E'\inv$ % fails
\end{document}
我收到错误Double superscript: You have written a double superscript incorrectly as a^b^c, or else you have written a prime with a superscript. Remember to include {and} when using multiple superscripts. Try a^{b ^ c} instead.
我意识到这类似于这个问题,但这会问为什么 D 线会失败。
我的问题:为什么C线能行,E线却不行呢?
答案1
原因在于plain.tex
文件中'
735-739 行的定义。其他格式(例如 LaTeX)复制了相同的想法。
是'
数学活动字符,它运行^\bgroup\prime
后跟一个宏,该宏通过\futurelet
原始字符测试下一个标记。如果下一个标记是'
或^
,则下一个上标与当前上标组合,并且组(由 打开\bgroup
)未关闭。但如果下一个标记是另一个标记,则将\egroup
放在此处并处理下一个标记。这是您的示例的情况D
(下一个标记是_
)或E
(下一个标记是\inv
)。
一个原子核不能有多个上标,因此您会看到“双上标”的错误。
如果您想使用类似$E'\inv$
或 的构造$E''\inv$
,那么您可以重新定义所用格式的内部宏。例如对于 Plain TeX 或 LaTeX:
{\catcode`\'=\active \catcode`\@=11
\gdef'{^\bgroup\expandafter\prim@s}\gdef\pr@@@s#1{\expandafter\prim@s}}
对于 OpTeX:
{\_catcode`\'=\active \_gdef'{^\_bgroup\_ea\_primes}}
\def\_primesA #1{\_ea\_primes}
\expandafter
这个想法是在处理之前添加\futurelet
。请注意,宏\prim@s
(或\_primes
)运行\futurelet
原语。
答案2
当 TeX 发现'
(在数学模式下)时,它基本上执行以下操作:
- 它发射
^\bgroup\prime
; - 它查看以下标记(不扩展它);
- 如果下一个标记是另一个,
'
则发出\prime
并返回到步骤 2; - 如果下一个标记是
^
,它会吞噬它并吸收接下来作为宏参数(单个标记或支撑组)的内容,并将其视为正在构建和发出的指数的一部分\egroup
; - 否则它会发出
\egroup
。
在你的情况下,下一个标记是,\inv
所以这属于情况 5。因此
C'\inv
变成
C^\bgroup\prime\egroup\inv
进而
C^\bgroup\prime\egroup^{-1}
双上标。
如果您想支持这种语法您还必须添加到查找中\inv
。
综合考虑之后,我会使用语法^\inv
。
无论如何,这里有一个expl3
支持的实现\inv
。
\documentclass{article}
\ExplSyntaxOn
\cs_new_protected:Nn \wang_prime:
{
% start a superscript
\c_math_superscript_token
\c_group_begin_token
% we want a prime
\prime
\__wang_prime_next:
}
\cs_new_protected:Nn \__wang_prime_next:
{
\peek_charcode_remove_ignore_spaces:NTF '
{ % another ' follows; add it and restart the recursion
\prime
\__wang_prime_next:
}
{ % look for ^ or \inv
\token_if_eq_meaning:NNTF \l_peek_token \c_math_superscript_token
{ % remove ^ and add the superscript
\__wang_prime_remove_superscript:Nn
}
{
\token_if_eq_meaning:NNTF \l_peek_token \inv
{
\__wang_prime_remove_inv:N
}
{ % finish the business
\c_group_end_token
}
}
}
}
\cs_new_protected:Nn \__wang_prime_remove_superscript:Nn { #2 \c_group_end_token }
\cs_new_protected:Nn \__wang_prime_remove_inv:N { -1 \c_group_end_token }
\char_set_active_eq:NN ' \wang_prime:
\ExplSyntaxOff
\newcommand{\inv}{^{-1}}
\begin{document}
$A^{-1}$
$B\inv$
$C'^{-1}$
$D''^{-1}$
$E'\inv$
\end{document}
请注意,a'_{1}^{2}
不受支持,也不能支持。