如何防止 LGR 編碼切換字體大小?

如何防止 LGR 編碼切換字體大小?

我使用 12pt 字體,本質上是article類別。 (也就是說,我正在使用一個寄生在 上的自訂類別article.cls。)

為了設定合適的headheight使用,我使用from測試fancyhdr\geometry{}序言末尾的字體大小。然後根據是否使用 10pt、11pt 或 12pt 來調整高度。\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 排版少量希臘文本,那將是完全令人滿意的。我使用上面的utf8and ,inputenc它允許我以 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}

相關內容