A definição de \@setfontsize
é semelhante a esta (saída de \makeatletter\meaning\@setfontsize
)
\@nomath#1\ifx\protect\@typeset@protect\let\@currentsize#1\fi\fontsize{#2}{#3}\selectfont
\@nomath
emite um aviso se você chamar esta macro enquanto estiver no modo matemático. Consulte fonte2e.\let\@currentsize#1
não está na minha fonte2e. O meu (v. 01/01/2017 Patch nível 1) tem\@currsize#1
\fontsize{fontsize}{baselineskip}
Revelando \@typeset@protect
(saída de \makeatletter\meaning\@typeset@protect
) rendimentos \relax
.
De fonte2e.pdf
Para garantir que \@setfontsize continue robusto, omitimos esta atribuição durante os momentos em que \protect difere de \@typeset@protect.
- Quando são esses momentos?
- Quando isso é definido como algo diferente
\relax
e com que finalidade? - A propósito, "continua sendo robusto" é uma frase interessante
Responder1
\documentclass{article}
\begin{document}
\typeout{\large abc}
\end{document}
Produz um registro de
\relax \fontsize {12}{14}\selectfont abc
o que não é particularmente interessante, mas é um código equivalente \large
e em aplicativos reais onde é gravado aux
ou toc
em arquivos, funciona conforme planejado quando lido novamente.
Se modificarmos a definição para remover o \ifx\protect\@typeset@protect
teste, o efeito será bastante dramático:
\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}
produz
! 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!
basicamente, o teste garante que os comandos de tamanho de fonte sejam robustos e não frágeis.