为什么(我的用户定义的)上标(反向)命令在撇号(引号)符号旁边失败?

为什么(我的用户定义的)上标(反向)命令在撇号(引号)符号旁边失败?

最小工作示例(我将参考基于首字母 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 发现'(在数学模式下)时,它基本上执行以下操作:

  1. 它发射^\bgroup\prime
  2. 它查看以下标记(不扩展它);
  3. 如果下一个标记是另一个,'则发出\prime并返回到步骤 2;
  4. 如果下一个标记是^,它会吞噬它并吸收接下来作为宏参数(单个标记或支撑组)的内容,并将其视为正在构建和发出的指数的一部分\egroup
  5. 否则它会发出\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}不受支持,也不能支持。

在此处输入图片描述

相关内容