Из 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 Patch level 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!

По сути, тест гарантирует, что команды размера шрифта надежны, а не хрупки.

Связанный контент