'
定义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}