Como posso evitar que a codificação LGR altere o tamanho da fonte?

Como posso evitar que a codificação LGR altere o tamanho da fonte?

Estou usando fontes de 12pt com o que é essencialmente a articleclasse. (Ou seja, estou usando uma classe personalizada que é parasita de article.cls.)

Para definir um uso apropriado headheight, testo o tamanho da fonte no final do preâmbulo fancyhdrusando from . A altura é então ajustada de acordo com o uso de 10pt, 11pt ou 12pt.\geometry{}\AtEndPreamble{}etoolbox

Tudo isso funciona bem com o seguinte código:

\documentclass[12pt]{article}
\usepackage{etoolbox}
\usepackage[T1]{fontenc}
\makeatletter
\AtEndPreamble{%
  \PackageWarning{mine}{font size is \f@size}
}
\makeatother

\begin{document}

some text

\end{document}

O registro contém:

Package mine Warning: font size is 12 on input line 13.

No entanto, se eu precisar compor o grego, quero usar:

\documentclass[12pt]{article}
\usepackage{etoolbox}
\usepackage[LGR,T1]{fontenc}
\makeatletter
\AtEndPreamble{%
  \PackageWarning{mine}{font size is \f@size}
}
\makeatother

\begin{document}

some text

\end{document}

Só agora o log contém:

Package mine Warning: font size is 10 on input line 13.

Por que carregar a codificação LGR altera o tamanho da fonte? E por que isso muda mesmo quando T1 é a codificação padrão?

Como posso prevenir ou contornar esse problema?

Observe que estou ciente de que poderia usar XeTeX ou LuaTeX ou ConTeXt para evitar isso. No entanto, para o bem ou para o mal, esta questão é sobre uma solução (pdf)TeX.

Se houver uma forma alternativa de compor pequenas quantidades de texto grego usando (pdf)TeX, isso seria perfeitamente satisfatório. Eu uso o acima com utf8e inputencque me permite inserir frases gregas estranhas em caracteres Unicode e ter tudo bem composto. Qualquer coisa que suporte isso funcionaria bem.

Essa questãoparecia relacionado, mas estou usando o TeX Live e já tenho as fontes type1 relevantes instaladas (por exemplo /usr/local/texlive/2014/texmf-dist/fonts/type1/public/cbfonts/grmn1200.pfb, ).

Responder1

Você pode confiar no tamanho da fonte somente depois de \normalsizeemitida. Isso faz parte \begin{document}.

Não vejo problema em definir \headheightcomo parte de

\AtBeginDocument{...}

em vez de \AtEndPreamble. No entanto, fazendo

\AtEndPreamble{%
  \normalsize
  \PackageWarning{mine}{font size is \f@size}
}

estampas

Package mine Warning: font size is 12 on input line 11.

no .logarquivo.

Responder2

O arquivo lgrenc.definclui a linha

\DeclareErrorFont{LGR}{cmr}{m}{n}{10}

e é isso que causa a mudança no tamanho da fonte. Este comando redefine \f@sizeentre outras coisas (retirado de ltfssbas.dtx):

%  \begin{macro}{\DeclareErrorFont}
%    Declare the last resort shape! We assume that in this fontshape
%    there is a 10pt font but it doesn't really matter. We only loose
%    one macro name if the assumption is false. But at least the font
%    should be there!
%    \begin{macrocode}
\def\DeclareErrorFont#1#2#3#4#5{%
      \xdef\error@fontshape{%
          \noexpand\expandafter\noexpand\split@name\noexpand\string
          \expandafter\noexpand\csname#1/#2/#3/#4/#5\endcsname
          \noexpand\@nil}%
%    \end{macrocode}
%    Initialize all those internal variables which may or may not have
%    values in the first seconds of NFSS' bootstraping process. Later
%    on such values will be updated when an encoding is selected, etc.
%
%    We definitely don't want to set |\f@encoding|; we can set all the
%    others since if they are left ``blank'' any selection would grap
%    ``error default values'' as well. However, this probably should
%    go also.
% \changes{v2.1n}{1994/05/14}{Don't set \cs{f@encoding}}
%    \begin{macrocode}
%      \gdef\f@encoding{#1}%
      \gdef\default@family{#2}%
      \gdef\default@series{#3}%
      \gdef\default@shape{#4}%
      \global\let\f@family\default@family
      \global\let\f@series\default@series
      \global\let\f@shape\default@shape
      \gdef\f@size{#5}%
      \gdef\f@baselineskip{#5pt}%
}
\@onlypreamble\DeclareErrorFont
%    \end{macrocode}
%  \end{macro}

Como você pode ver, isso se baseia na ideia de que alguma outra redefinição ocorrerá mais tarde.

Outras codificações não alteram o substituto, então você nunca vê o fato de que isso também redefine o tamanho.

Eu acho que em termos de 'como posso evitar isso', você teria que desabilitar localmente \DeclareErrorFont(não é o ideal!).

\documentclass[12pt]{article}
\usepackage{etoolbox}
\let\savedDeclareErrorFont\DeclareErrorFont
\def\DeclareErrorFont#1#2#3#4#5{}
\usepackage[LGR,T1]{fontenc}
\let\DeclareErrorFont\savedDeclareErrorFont
\makeatletter
\AtEndPreamble{%
  \PackageWarning{mine}{font size is \f@size}
}
\makeatother

\begin{document}

some text

\end{document}

informação relacionada