De fonte2e.pdf

De fonte2e.pdf

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
  • \@nomathemite um aviso se você chamar esta macro enquanto estiver no modo matemático. Consulte fonte2e.
  • \let\@currentsize#1nã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 \relaxe 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 \largee em aplicativos reais onde é gravado auxou tocem arquivos, funciona conforme planejado quando lido novamente.

Se modificarmos a definição para remover o \ifx\protect\@typeset@protectteste, 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.

informação relacionada