我使用的是 12pt 字体,其本质上是article
类。(也就是说,我使用的是寄生于 的自定义类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 排版少量希腊文本,那就再好不过了。我使用上面的方法和utf8
,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}