LGR エンコーディングでフォント サイズが切り替わらないようにするにはどうすればよいですか?

LGR エンコーディングでフォント サイズが切り替わらないようにするにはどうすればよいですか?

私は基本的にarticleクラスで 12pt フォントを使用しています。 (つまり、 に寄生するカスタム クラスを使用していますarticle.cls。)

を使用するheadheightのに適切な を設定するために、から を使用してプリアンブルの末尾のフォント サイズをテストします。次に、10pt、11pt、または 12pt のいずれが使用されているかに応じて高さが調整されます。fancyhdr\geometry{}\AtEndPreamble{}etoolbox

これはすべて次のコードで正常に動作します。

\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 を使用して少量のギリシャ語テキストをタイプセットする別の方法があれば、それで十分でしょう。私は上記の方法を と で使用しておりutf8inputencこれによりギリシャ語の奇妙なフレーズを Unicode 文字で入力して、すべてを適切にタイプセットできます。これをサポートするものであれば、何でも問題なく動作します。

この質問関連しているように見えますが、私は 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}

関連情報