为什么 ' 的 catcode 是 12 而 ' 却被设为宏?

为什么 ' 的 catcode 是 12 而 ' 却被设为宏?

'定义latex.ltx如下

\def\active@math@prime{^\bgroup\prim@s}
{\catcode`\'=\active \global\let'\active@math@prime}
\def\prim@s{%
  \prime\futurelet\@let@token\pr@m@s}
\def\pr@m@s{%
  \ifx'\@let@token
    \expandafter\pr@@@s
  \else
    \ifx^\@let@token
      \expandafter\expandafter\expandafter\pr@@@t
    \else
      \egroup
    \fi
  \fi}
\def\pr@@@s#1{\prim@s}
\def\pr@@@t#1#2{#2\egroup}

我可以看到,在一个组中, 的 catcode'更改为\active。当组结束时, 的 catcode'会回落到 12(其他)。那么,这怎么可能$f'$意味着$f\active@math@prime$

我也测试过

\catcode`!=12
{\catcode`!=\active \global\let!=\active@math@prime}
$f!!!$

它给出的结果与 $f'''$ 不同。会发生什么情况'

答案1

密钥\mathcode设置为十六进制 8000(十进制 32768),这将设置为!活动状态,但仅限于数学模式。此外,\pr@m@s需要重新定义以指向!而不是'

参考:我怎样才能让每个出现的“+”和“-”都被宏替换,但仅限于数学模式?

\documentclass{article}

\begin{document}
\makeatletter
\catcode`!=12
\mathcode\number`\!="8000 %
\def\pr@m@s{%
  \ifx!\@let@token
    \expandafter\pr@@@s
  \else
    \ifx^\@let@token
      \expandafter\expandafter\expandafter\pr@@@t
    \else
      \egroup
    \fi
  \fi}

{\catcode`!=\active \global\let!=\active@math@prime}
$f!!!$
\end{document}

在此处输入图片描述

如果你需要两个都 !'发挥主要作用,你可以真的编辑\pr@m@s

\documentclass{article}

\begin{document}
\makeatletter
\catcode`!=12
\mathcode\number`\!="8000 %
\def\pr@m@s{%
  \ifx'\@let@token
    \expandafter\expandafter\expandafter\pr@@@s
  \else
  \ifx!\@let@token
    \expandafter\expandafter\expandafter\pr@@@s
  \else
    \ifx^\@let@token
      \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pr@@@t
    \else
      \egroup
    \fi
  \fi\fi}

{\catcode`!=\active \global\let!=\active@math@prime}
$f!'!^3$
\end{document}

相关内容