La definición de \@setfontsize
se ve así (salida de \makeatletter\meaning\@setfontsize
)
\@nomath#1\ifx\protect\@typeset@protect\let\@currentsize#1\fi\fontsize{#2}{#3}\selectfont
\@nomath
emite una advertencia si llama a esta macro mientras está en modo matemático. Ver fuente2e.\let\@currentsize#1
no está en mi fuente2e. El mío (v. 01/01/2017 Nivel de parche 1) tiene\@currsize#1
\fontsize{fontsize}{baselineskip}
Revelador \@typeset@protect
(salida de \makeatletter\meaning\@typeset@protect
) rendimientos \relax
.
De fuente2e.pdf
Para garantizar que \@setfontsize siga siendo sólido, omitimos esta asignación en momentos en los que \protect difiere de \@typeset@protect.
- ¿Cuándo son esos tiempos?
- ¿Cuándo se establece esto en algo distinto
\relax
y con qué propósito? - "sigue siendo robusto" es una frase interesante por cierto
Respuesta1
\documentclass{article}
\begin{document}
\typeout{\large abc}
\end{document}
Produce un registro de
\relax \fontsize {12}{14}\selectfont abc
lo cual no es particularmente interesante, pero es un código equivalente \large
y en aplicaciones reales donde se escribe aux
o toc
se archiva, funciona según lo previsto cuando se vuelve a leer.
Si modificamos la definición para eliminar la \ifx\protect\@typeset@protect
prueba, el efecto es 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}
produce
! 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!
Básicamente, la prueba garantiza que los comandos de tamaño de fuente sean robustos en lugar de frágiles.