字体在 LaTeX 中如何工作?当我输入以下命令时:
\usepackage[utf8]{inputenc}
我正在指定计算机如何读取我的键盘输入,对吗?现在,命令:
\usepackage[T1]{fontenc}
是应该负责为读者打印字形的那个,对吗?如果这个负责字体,那么它与字体包(如tgpagella
或mathpazo
)有什么关系?我也可以调用 ,但没有 就无法工作fontenc
?
另外,命令行中指定的字体在哪里
\usefont{<encoding>}{<family>}{<series>}{<shape>}
来自哪里?如果我将编码指定为T1
,我仍然可以在几个不同的系列pbk
(bookman)、phv
(helvetica)等之间进行选择。我想,T1
应该修复要使用的字体。
您能解释一下吗?非常感谢。
答案1
输出编码T1
例如伯纳德说,确定哪些字符放在哪些位置。但编码也可以指定连字符,就像 T1 一样。例如,它告诉 TeX,如果 后面f
跟着i
,它应该用包含连字符的第三个位置的字符替换两个字符的序列fi
。
此外,当你载入一种特定的编码时,LaTeX 会在你请求各种字符时使用一组特定的定义。例如,根据你配置的细节,它可能会设置从特定字符序列到特定 unicode 字符的映射。例如,因为 T1 包含许多重音字符,所以这些字符可以映射到 unicode 中的单个点。这使得在许多情况下,搜索用 T1 创建的文件比搜索用 OT1 创建的外观相似的文件更容易。根据字体的不同,外观通常也会更出色。这是因为 TeX 必须在 OT1 中动态创建重音字符,而不是使用专门设计来表示它们的字符。例如,可以从非重音字符和重音字符â
创建,而不是使用。a
^
â
当您调用诸如 之类的包时tgpagella
,它会为您设置字体。您可以直接自己执行此操作 - 该包只是为了方便。
如下一行
\usefont{<encoding>}{<family>}{<series>}{<shape>}
是指定特定字体的低级命令。大多数字体包所做的是设置默认文档字体或创建方便的宏来访问专用字体。
LaTeX 定义\usefont{}{}{}{}
如下:
\def\usefont#1#2#3#4{\fontencoding{#1}\fontfamily{#2}%
\fontseries{#3}\fontshape{#4}\selectfont
\ignorespaces}
现在考虑一种特殊用途的字体,例如 支持的字体GoudyIn.sty
。它定义了两个宏,如下所示
\DeclareRobustCommand{\GoudyInfamily}{%
\fontencoding{U}%
\fontseries{xl}%
\fontshape{n}%
\fontfamily{GoudyIn}%
\selectfont}
\DeclareTextFontCommand{\goudyin}{\GoudyInfamily}
您可以直接在文档中使用这些命令,也可以使用
\usefont{U}{GoudyIn}{xl}{n}
每次你想使用字体时,你都要输入一个新字符。但那会很繁琐,你必须记住编码、系列、形状和家族名称,而不仅仅是记住
\usepackage{GoudyIn}
和
\goudyin{<text>}
这更加方便。
诸如此类的包tgpagella
有点复杂,但就当前目的而言最有趣的是。
\renewcommand{\rmdefault}{qpl}
这将默认衬线字体设置为qpl
。这意味着 LaTeX 将尝试使用默认文本编码中的字体(默认为 OT1 或其他)。为此,它会查找字体定义文件<encoding><family>.fd
。例如,t1qpl.fd
或ot1qpl.fd
或其他。如果找到该文件,它将读取设置字体的文件。
例如,以下是其中的一部分t1qpl.fd
:
\DeclareFontFamily{T1}{qpl}{\qpl@set@spacing}
这会qpl
在T1
编码中创建一个字体系列。一旦定义了字体系列,代码就会指定当此字体系列处于活动状态时,LaTeX 应该为哪些系列和形状使用哪些字体。
该系列确定了相对宽度和相对重量,例如粗体扩展、细体压缩或中等标准。
\DeclareFontShape{T1}{qpl}{b}{sc}{<-> \qpl@scale ec-qplb-sc}{}
ec-qplb-sc
这告诉 LaTeX在需要粗体小型大写字母时使用该字体。
\DeclareFontShape{T1}{qpl}{b}{n}{<-> \qpl@scale ec-qplb}{}
正直剛剛。
\DeclareFontShape{T1}{qpl}{b}{scit}{<-> \qpl@scale ec-qplbi-sc}{}
斜体小写字母粗体。这不是标准形状,因此某些字体包对相同形状使用不同的名称。例如,我的字体包使用si
斜体小写字母 而不是scit
。
\DeclareFontShape{T1}{qpl}{b}{it}{<-> \qpl@scale ec-qplbi}{}
加粗斜体。
现在的正常体重是- \mdseries
。
\DeclareFontShape{T1}{qpl}{m}{sc}{<-> \qpl@scale ec-qplr-sc}{}
\DeclareFontShape{T1}{qpl}{m}{n}{<-> \qpl@scale ec-qplr}{}
\DeclareFontShape{T1}{qpl}{m}{scit}{<-> \qpl@scale ec-qplri-sc}{}
\DeclareFontShape{T1}{qpl}{m}{it}{<-> \qpl@scale ec-qplri}{}
这就是提供的所有字体。但是,\bfseries
LaTeX 中的默认字体不是b
,而是bx
。此字体不提供bx
,因此 LaTeX 必须替换一些东西。默认情况下,它将替换 medium 并发出警告。这不太好。我们可能更希望它替换 boldb
而不是 medium m
,而且我们可能也不希望每次使用 bold 时都发出警告。
幸运的是,字体定义指定了合适的替代。
\DeclareFontShape{T1}{qpl}{bx}{sc}{<->ssub * qpl/b/sc}{}
如果请求扩展小型大写粗体,则“悄悄”地用粗体小型大写替代。也就是说,使用粗体而不是中等粗体,并且不发出警告。
\DeclareFontShape{T1}{qpl}{bx}{n}{<->ssub * qpl/b/n}{}
\DeclareFontShape{T1}{qpl}{bx}{scit}{<->ssub * qpl/b/scit}{}
\DeclareFontShape{T1}{qpl}{bx}{it}{<->ssub * qpl/b/it}{}
此字体有斜体,但没有倾斜。默认情况下,如果要求倾斜,LaTeX 将替换为直立。但是,在这种情况下
\DeclareFontShape{T1}{qpl}{b}{sl}{<->sub * qpl/b/it}{}
告诉 LaTeX 用斜体粗体代替粗体斜体。这种替换不是无声的 - 用户更可能想知道这一点,因此 LaTeX 将发出警告。
\DeclareFontShape{T1}{qpl}{m}{sl}{<->sub * qpl/m/it}{}
\DeclareFontShape{T1}{qpl}{b}{scsl}{<->sub * qpl/b/scit}{}
\DeclareFontShape{T1}{qpl}{m}{scsl}{<->sub * qpl/m/scit}{}
以下内容略有简化,以便提供接下来过程的总体情况。否则,可能出现的复杂情况和可能性的数量以及每个细节都会导致解释得一团糟。(您可能认为它已经很像沼泽了,但请相信我,情况可能会变得更糟。)
买者自负 ...
一旦 LaTeX 知道它需要查找的字体,它就会尝试查找该名称的 TeX 字体。
假设它需要,ec-qplr-sc
因为你要么加载tgpagella
然后说
\scshape
或者
\textsc{}
或者因为你说
\fontencoding{T1}\fontfamily{qpl}\fontseries{m}\fontshape{sc}\selectfont
或者
\usefont{T1}{qpl}{m}{sc}
然后 LaTeX 会查找 TeX Font Metric 文件ec-qplr-sc.tfm
。此文件为 LaTeX 提供了各种信息。具体来说,它告诉 TeX 每个字符所需的框的大小,以及如何根据哪个框紧接在前或紧接在后将框向左或向右移动。它还可能告诉 TeX 用第三个框替换两个框的序列。它还提供了有关字体自然大小等的一些一般信息。
如果您使用 LaTeX 进行编译,那么就完成了。DVI 仅包含有关框的信息。查看器或后处理器将决定在每个框中放入什么。如果您使用 pdfLaTeX 进行编译,则需要将其作为编译的一部分来完成。
为了找出每个框中要放什么,pdfTeX 或 DVI 查看器或后处理器必须找出绘制字符字形的信息在哪里。
为此,它会在文件中查找一行.map
。具体.map
文件取决于当前引擎或后处理器。假设您使用的是 pdfTeX,那么它会查询pdftex.map
并查找相关行。
ec-qplr-sc TeXGyrePagella-Regular " encqecsc ReEncodeFont " <q-ec-sc.enc <qplr.pfb
qplr.pfb
这告诉 pdfTeX使用编码重新编码字体q-ec-sc.enc
。这意味着它知道如何绘制字形的信息,qplr.pfb
但信息不是按要求的顺序排列的。q-ec-sc.enc
告诉 pdfTeX 如何在 PFB 中查找字符的信息,即使 PFB 中的字符与当前输出编码的顺序不同。
这是简单的例子。如果涉及虚拟字体,那么事情就会变得有点复杂。但是,情况并非如此qpl
,所以到目前为止的故事已经足够了。
答案2
对于 LaTeX,更准确地说对于 NFSS(新字体选择方案)来说,字体由 4 个参数表征:its encoding
、its name
、itsweight
和 its shape
。
字体编码仅修复了 LaTeX 编码字体的方式,即描述哪个字形与每个插槽号相关联:
OT1
(默认编码)适用于没有变音符号的字母(大致为 ASCII),每个字符使用 7 位。
其他编码使用 8 位:
T1
是拉丁字母;它具有西欧语言中使用的大多数变音符号。
T2A, T2B, T2C
是西里尔字母。
LGR
代表希腊语(单调和多调)。
另一方面,字体系列只是一组字形。例如,phv
是该系列的 LaTeX 的简称Adobe Helvetica
,并对其进行了重新编码以供 LaTeX 使用(该编码与 Adobe 编码不同)。