可缩放字体后端 (Type 1, Speedo 和 TrueType)可以自动的把字体重新编码为在
fonts.dir 中 XLFD 里指定的编码,例如,fonts.dir
文件可以对 Type 1 Courier 字体包含如下条目
这将导致这个字体被分别的记录为 ISO 8859-1 和 ISO 8859-2。cour.pfa -adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-1 cour.pfa -adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-2
三个可缩放字体后端(Type 1、Speedo 和 FreeType TrueType 后端)为字体重新编码使用了一个公用的 fontenc 层。这允许三个后端共享它们的编码的数据,并允许简单的新地域配置无关于字体类型。
请注意:X-TrueType (X-TT) 后端不使用 fontenc 层,而是使用它自己的方法进行字体重新编码。如果你只对 X-TT 感兴趣你可以跳过使用符号字体章节,因为中介(intervening)信息不适用于 X-TT。X-TT 自身在 X-TrueType 章节中有更详细的描述。
在 fontenc 层中,用名字(比如 iso8859-1)及映射的一个有序集合来定义编码,编码可能有多个别名(可替代的名字)。一个映射定义把编码映射成
fontenc 知道的目标编码之一的方式;目前,目标编码有
Unicode、Adobe 图元名字、和任意的 TrueType 的“cmap”。
一些编码被固化(hardwire)到 fontenc 内部,所以总是可以获得;这些硬编码不能被轻易的重定义。它们包括:
iso10646-1: Unicode;iso8859-1: ISO 拉丁语-1 (西欧);iso8859-2: ISO 拉丁语-2 (东欧);iso8859-3: ISO 拉丁语-3 (南欧);iso8859-4: ISO 拉丁语-4 (北欧);iso8859-5: ISO 斯拉夫语;iso8859-6: ISO 阿拉伯语;iso8859-7: ISO 希腊语;iso8859-8: ISO 希伯莱语;iso8859-9: ISO Latin-5 (土尔其语);iso8859-10: ISO Latin-6 (日耳曼语);iso8859-15: ISO Latin-9、或 Latin-0 (修订的西欧语言);koi8-r: KOI8 俄语;koi8-u: KOI8 乌克兰语 (参见 RFC 2319);koi8-ru: KOI8 俄语/乌克兰语;koi8-uni: KOI8 “未定义” (俄语,乌克兰语,和白俄罗斯语);koi8-e: KOI8 “欧洲”,ISO-IR-111 或 ECMA-斯拉夫;microsoft-symbol 和 apple-roman: 它们只对
TrueType 符号字体有用。通过定义编码文件可以增加补充的编码。在一个字体要求一个
fontenc
层不知道的字体编码的时候,后端检查字体在其中驻留的那个目录(目录不是必须有
fonts.dir!),查找叫‘encodings.dir’的一个文件。如果找到,在这个文件中检索要求的编码,并且读入有关的编码定义文件。调用‘mkfontdir’实用工具的时候,加上‘-e’选项并跟随着包含编码文件的一个目录的名字,可被用来自动的建立‘encodings.dir’文件。详情请参见
mkfontdir(1) 手册页。
XFree86 包括了用做公用编码的许多编码文件。写新的编码文件的信息请参见后面的编码目录文件格式和编码文件格式章节。
Type 1 后端首先查找有 PostScript 目标的映射。如果找到,则使用它。否则,查找有目标 Unicode 的映射,它由把代码映射成图元名字的一个内置表格构成。注意这个表只覆盖了由 Adobe 指派了名字的那部分 Unicode 代码点。
如果未找到 PostScript 或 Unicode 映射,后端缺省为 ISO 8859-1。
指定一个编码值为 adobe-fontspecific
将停用这个编码机制。这对于符号和不正确编码的字体是有用的(参见下面段落不良编码的字体)。
目前 Type 1 后端限制所有编码为 8-bit 代码。
Speedo 查找有一个 Unicode 目标的映射,如果找到则使用它。否则,后端缺省为 ISO 8859-1。
Speedo 后端限制所有编码为 8-bit 代码。
TrueType 后端依次检索映射。忽略有 PostScript 目标的映射;针对在这个文件中的所有 cmap 来检查有一个 TrueType 或 Unicode 目标的映射。使用第一个适用的映射。
如果你写一个与 TrueType 后端一起使用的编码文件,你应该确保以性能的下降次序来提及这些映射。
要以字体后端不知道的编码来使用一个字体,你需要在与字体文件所使用的相同目录中有一个‘encodings.dir’文件。‘encodings.dir’有与‘fonts.dir’类似的格式。它的第一行指定编码的数目,而每个后续的行都有两列,编码的名字,和编码文件的名字;它可以相对与当前目录,或者是绝对路径。每个编码名字应当适合与在编码文件中定义编码名字。例如,
3 mulearabic-0 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-0.enc mulearabic-1 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-1.enc mulearabic-2 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-2.enc
必须在编码文件的‘STARTENCODING’或‘ALIAS’行中指定一个编码的名字。建立一个‘encodings.dir’条目是不够的。
如果你的平台支持它(很可能这样),编码文件可以用 compress 或 gzip 来压缩。
‘encoding.dir’文件最好由‘mkfontdir’工具来维护。更多的信息请参阅
mkfontdir(1) 手册页。
编码文件是“自由格式”的,就是说一串白空格等价与一个单一的空格。以大小写不敏感方式分析关键字
关键字,这意味着‘size’、‘SIZE’、和‘SiZE’被分析成同一个关键字;另一方面,在图元名字中大小写是敏感的。
数字可以写为十进制如‘256’,或十六进制如‘0x100’,或八进制如‘0400’。
通过使用井号‘#’来介入注释。‘#’可以出现在一行的任意位置,而忽略在‘#’后面的所有字符,直到这一行的结束。
编码文件开始于编码名字的定义,接着可能是它的换用的名字(别名):
编码名字和它的别名应当适合于用在 XLFD 字体名字中,所以绝对不能包含横杠‘STARTENCODING mulearabic-0 ALIAS arabic-0 ALIAS something-else
-’。
编码文件接着随意声明编码的大小。对于线性编码(比如 ISO 8859-1),SIZE 行指定为最大代码加一:
对于矩阵编码,它指定两个数,第一个数是最后的行编号加一,第二个数是最高的列号加一。对于‘SIZE 0x2B
jisx0208.1990-0’(JIS X 0208(1990),双字节编码,高位清零),它将是:
在矩阵编码的情况下,可以包含一个‘SIZE 0x75 0x80
FIRSTINDEX’行来指定在编码中的最小图元索引。关键字‘FIRSTINDEX’跟随着两个整数,最小行编号和最小列编号:
在线性编码的情况下,‘FIRSTINDEX 0x20 0x20
FIRSTINDEX’行不是很有用。如果你处于某种原因而包含了它,它应该跟随一个单一整数。
注意在多数字体后端中包含‘FIRSTINDEX’行有停用缺省图元生成的副作用。所以除非绝对必须否则应当避免这个关键字。
在由‘SIZE’和‘FIRSTINDEX’定义的区域之外的编码被理解为未定义的。编码缺省为大小为256(0x100)的线性编码,这意味着你必须声明所有
16 编码的大小。
随后是一个或多个映射段。映射段开始于说明映射的目标的一个‘STARTMAPPING’行。目标可以是下列之一:
STARTMAPPING unicode
STARTMAPPING cmap 3 1
STARTMAPPING postscript
作为简写,可以一行来映射连续的代码范围。这一行由整数组成0x21 0x0660 0x22 0x0661 ...
它简写了下列范围的行<start> <end> <target>
start target
start+1 target+1
...
end target+end-start
例如,行
缩写了0x2121 0x215F 0x8140
假定未列出的代码为完全一致的映射(就是映射成相同的数)。为了屏弃这个缺省的映射,你可以通过使用‘0x2121 0x8140 0x2122 0x8141 ... 0x215F 0x817E
UNDEFINE’行来指定一个范围的代码为未定义:
或一个单一代码,UNDEFINE 0x00 0x2A
UNDEFINE 0x1234
PostScript 映射就不同了。在 PostScript 映射中的每一行都把一个代码映射成一个图元名字
而没有明显列出的代码是未定义的。0x41 A 0x42 B ...
映射段结束于 ENDMAPPING 行
在定义了所有映射之后,用ENDMAPPING
ENDENCODING 行结束文件
ENDENCODING
为了将来可以进一步扩展这个格式,以未知关键字开始的行,和有未知目标的映射段被静默的忽略。
应当使用 adobe-fontspecific 编码安装 Type 1
符号字体。
在理想世界中,使用 microsoft-symbol 和 apple-roman
编码之一来安装所有 TrueType
符号字体。但是许多符号字体不是这样标记的,应当使用 microsoft-cp1252
或对于老字体使用 microsoft-win3.1 来安装它们。
为了保证一致的结果(特别是在同一个字体的 Type 1 和
TrueType 版本之间),可以为给定字体定义一个特殊编码。对 ZapfDingbats
字体已经这样做了;参见文件 encodings/adobe-dingbats.enc
。
一些文本字体被不正确的编码。不良编码有时出自设计,为了使一个异国文稿的字体表现得如同普通西方文本字体。这经常是设计者的懒惰和无能得结果;出于某种原因,多数人发现发明异质的图元名字要比遵从 Adobe 图元列表容易。
对这种字体有良种处理方式: 使用设计它所用于的编码,和建立一个特殊编码文件。
在 Type 1
字体的情况下,字体设计者可以指定缺省的编码;通过在 XLFD
名字中指定 ‘adobe-fontspecific’来要求这个编码。有时字体设计者省略了指定一个合理的缺省编码,此时你应该用‘adobe-standard’、‘iso8859-1’、‘microsoft-cp1252’、和‘microsoft-win3.1’来实验。(对于
Type 1 字体编码‘microsoft-symbol’没有意义)。
TrueType 字体没有缺省编码。但是,多数 TrueType
字体被设计用于 Microsoft 或 Apple 平台,所以‘microsoft-symbol’或‘microsoft-cp1252’、或‘microsoft-win3.1’、或‘apple-roman’应当能产生合理的结果。
总是可以定义一个编码文件来把在字体文件中图元排列为任何想要的次序。还有,参见‘encodings/adobe-dingbats.enc’文件来看这是如何做的。
通过上面的指导,你将发现自己有带有不平常的名字的一些字体
--- 带有编码如‘adobe-fontspecific’、‘microsoft-win3.1’等。要在标准应用中使用这些字体,可以把它们重新映射成适当的名字。
这通过写‘fonts.alias’文件来完成。这个文件的格式类似于‘fonts.dir’文件的格式,但它把
XLFD 名字映射成 XLFD 名字。一个‘fonts.alias’文件看起来如下:
(两个 XLFD 名字在一个单一行上)。‘1 "-ogonki-alamakota-medium-r-normal--0-0-0-0-p-0-iso8859-2" \ "-ogonki-alamakota-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific"
fonts.alias’文件的语法在
mkfontdir(1) 手册页中有精确描述。