梅威瑟:
\documentclass{scrbook}
\begin{document}
\makeatletter
\show\@textsuperscript
\show\sf@size
\makeatother
A\textsuperscript {B}C
A{\selectfont{${^{\mbox{\fontsize\sf@size\z@ B}}}$}}C
\end{document}
日志显示:
#1->{\m@th \ensuremath {^{\mbox {\fontsize \sf@size \z@ #1}}}}.
l.6 \show\@textsuperscript
> \sf@size=undefined.
l.7 \show\sf@size
如何\textsuperscript
在不调用宏的情况下执行原始宏?尝试学习一些 TeX!
更新:感谢克鲁格的回答,一切都按预期进行。
现在,问题是为什么原始调用显示的上标字体大小比 更大\textsuperscript
?
更新:感谢Kruger的回答,一切完成!
这是一个令人着迷的兔子洞!
最终答案:\ensuremath
设置sf@size
。详细信息请参阅接受的答案。
A\textsuperscript {B}C
\makeatletter
A$\ensuremath{^{\mbox{\fontsize\sf@size\z@ {\selectfont B}}}}$C
\makeatother
答案1
\sf@size
是脚本数学字体的字体大小。它取决于当前的常规文本字体大小,因此必须为每个数学块重新计算。这是通过 完成的\everymath
:如果您添加\show\frozen@everymath
到文档中,您会看到\frozen@everymath
设置为\check@mathfonts \the \everymath
。这意味着每次输入内联数学时,TeX 都会\check@mathfonts
先执行。此宏设置\sf@size
并执行一些其他操作。进入数学模式时也会发生这种情况\ensuremath
,这就是您的示例的情况\textsuperscript
。
因此\show
\sf@size
,要进行设置,必须先在$ $
之前的某处写入进入(和离开)数学模式\show\sf@size
。
顺便说一句,如果你想了解 LaTeX 命令是如何实现的,请查看source2e
。除了不必单独处理 \show
所有宏之外,您还可以看到许多描述其功能的评论。
要在不调用宏的情况下执行此操作,您需要进行两项更改:首先\makeatletter
需要允许在文档中使用\sf@size
(和)。然后您仍然会得到错误的字体大小。这是因为仅设置下一个字体大小,但实际上并没有更改字体。因此必须在之后调用以选择正确大小的字体。在宏中,对的调用在内部(没有)。在的文档中甚至包含一条注释,指出参数应始终以字体选择命令开头,\z@
\fontsize
\selectfont
\fontsize\sf@size\z@
\selectfont
\textsuperscript
@
source2e
\@textsuperscript