答案1
你写了,
我发现
\prime
插入了一个难看的大素数,而'
产生了一些正常的结果。有什么解释吗?
'
为了深入解决这个问题,检查(在数学模式下)相对于 的定义方式很有用\prime
。以下是当前版本(2020-02-02, patch level 5
)的 LaTeX2e“内核”的摘录——latex.ltx
确切地说是 中的第 5939 行到 5954 行——提供了在 LaTeX 中定义的代码'
。(Plain-TeX 的定义'
类似。)
\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
'
如果在数学模式下遇到该字符,则使字符(“撇号”或“撇号”)以 TeX 意义激活。字符设置为
\active@math@prime
,其定义为^\bgroup\prim@s
。请注意,指数项以 开头^
,后跟\bgroup
-- ,并且目前没有相应的\egroup
指令。\prim@s
反过来,定义为\prime\futurelet\@let@token\pr@m@s
。最后,我们遇到了\prime
——耶!\prime
指令——回想一下,它是在上标模式下执行的,因此生成的符号比文本样式的版本要小\prime
——后面跟着\futurelet\@let@token\pr@m@s
\futurelet\@let@token
将下一个标记分配给\@let@token
。那么,它会\pr@m@s
做什么呢?的代码
\pr@m@s
涵盖了 10 行代码;它是这组宏中迄今为止最复杂的。它基本上告诉 LaTeX 将前瞻标记(通过几个\ifx
语句)与多个可能的替代方案进行比较。事实上,代码考虑了三种替代方案。如果前瞻标记不相等要么 要么
'
,^
然后\egroup
发出——这意味着指数项组已关闭并且可以由 LaTeX 处理——我们就完成了。呼!如果下一个字符等于
^
(例如,g'^2
),则执行处理指数项所需的代码(包括指令\egroup
)。(如果您好奇:g'^2
计算结果为g^{\prime2}
。如果您希望将平方项放得更靠前一些,则需要编写{g'}^2
。)最后,如果下一个字符是平等的到
'
,然后(在进一步搅拌之后......)\prime\futurelet\@let@token\pr@m@s
执行另一轮,即\prime
执行另一个指令,然后再进行一些向前看的操作。
记住\bgroup
和分别\egroup
计算为{
和}
,我们得出以下结论:代码确保u'v
被解释为u^{\prime}v
,w''x
被解释为w^{\prime\prime}x
,f'''
被解释为f^{\prime\prime\prime}
,等等。真正重要的是要注意它w''x
没有被解释为w^{\prime}^{\prime}x
,因为这会触发可怕的“双上标”错误。
简而言之,(a) 打字f\prime\prime
不会触发错误消息,但从排版角度来看绝对是错误的;(b)f^{\prime\prime}
在排版和语法上都是正确的,但也非常繁琐;(c)f''
既正确又简单。你能猜出哪种方法是推荐的吗?不管怎么说,我的印象是 Donald Knuth 一直都希望用户f'
输入f''
。