Как предотвратить переключение размера шрифта при кодировке LGR?

Как предотвратить переключение размера шрифта при кодировке LGR?

Я использую шрифты размером 12pt с тем, что по сути является articleклассом. (То есть я использую пользовательский класс, который паразитирует на article.cls.)

Чтобы установить подходящий размер headheightдля fancyhdrиспользования \geometry{}, я проверяю размер шрифта в конце преамбулы, используя \AtEndPreamble{}frometoolbox . Затем высота корректируется в соответствии с тем, используется ли 10pt, 11pt или 12pt.

Все это прекрасно работает со следующим кодом:

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

\begin{document}

some text

\end{document}

Журнал содержит:

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

Однако, если мне нужно набрать текст на греческом языке, я хочу использовать:

\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}

Только теперь журнал содержит:

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

Почему загрузка кодировки LGR вообще меняет размер шрифта? И почему она меняет его даже если кодировкой по умолчанию является T1?

Как можно предотвратить или обойти эту проблему?

Обратите внимание, что я знаю, что я мог бы использовать XeTeX или LuaTeX или ConTeXt, чтобы избежать этого. Однако, к лучшему или к худшему, этот вопрос касается решения (pdf)TeX.

Если есть альтернативный способ набора небольших объемов греческого текста с помощью (pdf)TeX, это было бы вполне удовлетворительно. Я использую вышеприведенный способ с utf8и inputenc, который позволяет мне вводить странные греческие фразы в символах юникода и все красиво набирать. Все, что поддерживает это, будет работать нормально.

Этот вопросказалось бы, это связано, но я использую TeX Live и у меня уже установлены соответствующие шрифты type1 (например, /usr/local/texlive/2014/texmf-dist/fonts/type1/public/cbfonts/grmn1200.pfb).

решение1

Вы можете положиться на размер шрифта только после того, как \normalsizeбыл выпущен. Это часть \begin{document}.

Я не вижу никаких проблем в том, чтобы установить \headheightкак часть

\AtBeginDocument{...}

а не \AtEndPreamble. Однако, делая

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

отпечатки

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

в .logфайле.

решение2

Файл lgrenc.defсодержит строку

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

и это то, что вызывает изменение размера шрифта. Эта команда сбрасывает \f@sizeсреди прочего (взято из 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}

Как видите, это основано на идее, что позже произойдет еще одна перезагрузка.

Другие кодировки не изменяют резервный вариант, поэтому вы никогда не увидите, что он также сбрасывает размер.

Полагаю, что с точки зрения «как это предотвратить», вам придется отключить локально \DeclareErrorFont(не идеальный вариант!).

\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}

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