的定义\@setfontsize
看起来像这样(的输出\makeatletter\meaning\@setfontsize
)
\@nomath#1\ifx\protect\@typeset@protect\let\@currentsize#1\fi\fontsize{#2}{#3}\selectfont
\@nomath
如果在数学模式下调用此宏,则会发出警告。请参阅 source2e。\let\@currentsize#1
不在我的 source2e 中。我的 (v. 2017/01/01 补丁级别 1) 有\@currsize#1
\fontsize{fontsize}{baselineskip}
揭示\@typeset@protect
(的输出\makeatletter\meaning\@typeset@protect
)可得到\relax
。
来自source2e.pdf
为了确保 \@setfontsize 保持稳健,我们在 \protect 与 \@typeset@protect 不同时省略此分配。
- 那些时间是什么时候?
- 什么时候将其设置为其他目的
\relax
以及用于什么目的? - 顺便说一句,“保持强劲”是一句很有趣的措辞
答案1
\documentclass{article}
\begin{document}
\typeout{\large abc}
\end{document}
生成日志
\relax \fontsize {12}{14}\selectfont abc
这并不是特别有趣,但它的代码等同于\large
在实际应用程序中写入aux
或toc
文件时,它在读回时按预期工作。
如果我们修改定义以删除\ifx\protect\@typeset@protect
测试,那么效果将非常显著:
\documentclass{article}
\begin{document}
\makeatletter
\def\@setfontsize#1#2#3{\@nomath#1%
% \ifx\protect\@typeset@protect
\let\@currsize#1%
% \fi
\fontsize{#2}{#3}\selectfont}
\typeout{\large abc}
\end{document}
生产
! TeX capacity exceeded, sorry [input stack size=5000].
\@nomath ...e \@font@warning {Command \noexpand #1
invalid in math mode}\fi
l.13 \typeout{\large abc}
! ==> Fatal error occurred, no output PDF file produced!
基本上,该测试确保字体大小命令是强健的而不是脆弱的。