来自source2e.pdf

来自source2e.pdf

的定义\@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在实际应用程序中写入auxtoc文件时,它在读回时按预期工作。

如果我们修改定义以删除\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!

基本上,该测试确保字体大小命令是强健的而不是脆弱的。

相关内容