5. 低级接口
与旨在在文档中使用的高级字体命令相反,低级命令主要用于定义软件包或文档序言中的新命令。为了充分利用此类命令,了解Latex的字体选择方案(NFSS)中字体的内部组织很有帮助。
一方面,乳胶的字体选择方案的目标是允许以通用标记原理为指导的算法选择有理字体选择。为此,希望允许对尽可能多的字体属性进行独立更改。另一方面,现实生活中的字体家庭通常仅包含无数可想象的字体属性组合的子集。因此,允许在太多属性中进行独立更改会导致太多的组合,这些组合没有可用的真实外部字体,并且必须替换默认值。
LaTeX 内部会跟踪五种独立的字体属性:当前编码、当前字体家族、当前系列、当前形状和当前大小。编码属性是在 NFSS 第 2 版中引入的,因为很明显,如果不独立于其他字体属性维护字符编码方案,就无法支持多种语言。
这些属性的值确定当前正在使用的字体。乳胶还维护了一套用于将属性组合与外部字体相关联的表(即,.tfm
文件包含乳胶完成其工作所需的数据)。然后选择字体选择两个步骤:
使用低级命令
\ fontencoding
,\ fontfamily
,\ fontseries
,\ fontshape’和\ fontsize
更改了许多字体属性。通过调用
\ selectfont
命令选择与这些新属性设置相对应的字体。
第二步包括几个动作。首先,乳胶检查系统是否已知与所需属性设置相对应的字体(即,已加载了.tfm文件),如果是这样,则选择此字体。否则,将搜索内部表以查找与这些设置关联的外部字体名称。如果找到这样的字体名称,则将相应的
.tfm`文件读取到内存中,然后选择字体进行排版。如果找不到字体名称,乳胶会尝试找到替代字体,如本文稍后所述。
5.1. 设置单个字体属性
每个字体属性都有一个命令可以更改其当前值。所有这些命令或多或少地接受任何字符串作为参数,但只有少数值有意义。这些值不是在NFSS中刻连接的,而是内部表中设置的惯例。以下各节介绍了标准乳胶设置中使用的命名约定,但是任何人都可以通过在内部表中添加新的字体声明来更改此设置。通常,任何设置新字体供乳胶使用的字体都应尽可能尊重这些约定,因为只有一致的命名约定可以保证在一般标记的文档中选择适当的字体。
如果您想使用此界面选择特定的字体 - 例如,计算机现代Dunhill粗体凝结了斜体14pt-仅对接口约定的知识还不够,因为不存在属性值组合的外部字体。您可以尝试指定以下内容:
1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{bc}\fontshape{it}%
2\fontsize{14}{16pt}\selectfont
如下所示,根据命名约定,该代码将是正确的。但是,由于这种属性组合不与真实字体相对应,因此乳胶将不得不替代其他字体。替代机制可能会选择与所需的字体完全不同的字体,因此您应该查阅字体表以检查所需的组合是否可用。以下是 FONT替代过程的更多详细信息。
选择字体家庭
字体家族由命令“\ fontfamily
选择。作为其论点,它采用一个字符串,指的是内部表中声明的字体系列。当设置这些表格时,定义了字符串,通常是一个简短的字母序列 - 例如,计算机现代罗马家庭的cmr
。姓氏不得超过五个字母,因为它们将与可能还有三个字母组合形成一个文件名,在某些系统上,最多可以有八个字母。
选择字体系列
\ fontseries
命令更改系列属性。该系列在其论点中结合了一个重量和宽度,这意味着不可能独立于其重量更改当前字体的宽度。这是可以接受的,因为不可能单独改变重量或宽度。相反,重量的变化通常伴随着设计师规范的宽度变化。这并不令人惊讶,因为重量变化会改变字母的水平外观,因此需要调整膨胀(宽度)以产生均衡的外观。
重量和宽度的名称在系列名称中都缩写,因此每个组合都是唯一的。这些命名约定如下表所示。省略了m
的任何实例(代表中等重量或宽度),除非重量和宽度都是中等的,在这种情况下,使用单个m
。例如,大胆扩展将是bx
,而扩展的介质将是x
x x
,而大胆的介质为b
。
选择字体形状
\ fontShape
命令更改形状属性。对于标准形状,使用单字母和两个字母的缩写。这些形状在下表中列出:
选择字体尺寸
命令\ fontSize {<size>} {<skip>}
更改字体大小。它需要两个参数:<size>
要切换到基线<skip>
(此尺寸的基线之间的距离)。字体尺寸通常以点测量,因此按照惯例将省略该单元。第二个论点也是如此。但是,如果基线跳过应该是橡胶长度,则必须指定一个单元。因此,可以通过
1\fontsize{14.4}{17}\selectfont
即使这样的请求有效,此大小也可能没有相应的外部字体。在这种情况下,如果乳胶的内部表允许校正或报告错误,则乳胶将尝试找到附近的尺寸。
如果您使用任意尺寸的字体,则可以选择所需的任何大小:当然:
1\fontsize{1in}{1.2in}\selectfont A text in an arbitrary font size
选择编码
\ fontencoding
命令用于更改编码。该参数是所需编码的内部名称。该名称必须是乳胶的知道,要么是预定义的编码之一(由内核加载),要么是用\declarefontencoding
命令声明的。这是有关
声明字体编码的更多信息。标准字体编码名称在下表中列出:
NFSS基于以下假设:大多数(或更好,所有)字体只要用相同的语言来排版它们,就可以在相同的编码中使用。换句话说,只有在您从一种语言切换到另一种语言时,才需要编码更改。在这种情况下,语言支持软件包(例如,从“ babel”系统中)通常应该照顾幕后的编码。
在下面的示例中,我们通过定义环境“ Cyr”以在西里尔语中的排版来手动更改编码。在这种环境中,字体编码和输入编码都在本地更改。当然,为了适当的语言支持,需要进行其他工作,例如更改连字符规则。这些编码是通过加载fontenc
软件包来声明乳胶的。 t2a
指定了标准的西里尔编码之一。 T1
成为默认编码,因为它是最后一次加载的。
不幸的是,对于大多数PostScript字体,无法完全实现t1
。以下示例中的五个字符可能显示为墨水斑点,表明字体中缺少字形。请注意,实际上是通过加入一个或两个额外的小零来形成“千”和“每千”符号。只有后者缺少。
1\usepackage[T1]{fontenc}
2-----------------------------------------
3\fontfamily{cmr}\selectfont
4\j{} \ng{} \NG{} \textperthousand{}\textpertenthousand \par
5\fontfamily{ptm}\selectfont
6\j{} \ng{} \NG{} \textperthousand{}\textpertenthousand{}
5.2. 设置多个字体属性
在设计页面样式或面向布局的命令时,您通常需要选择一个特定的字体 - 也就是说,您需要为所有属性指定值。为此,乳胶提供了命令\usefont
,该命令需要四个参数:编码,家庭,系列和形状。该命令更新这些属性,然后调用\selectfont
。如果您还要指定大小和基线跳过,请在\usefont
之前放置`\ fontsize’命令。例如,
1\fontsize{14}{16pt}\usefont{OT1}{cmdh}{bc}{it}
将产生与以下命令相同的结果:
1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{bc}\fontshape{it}%
2\fontsize{14}{16pt}\selectfont
乳胶还提供了\ evelareFixedFont
声明,可用于定义切换到完全固定字体的新命令。这样的命令非常快,因为它们不必查找任何内部表。因此,它们在必须在字体之间来回切换的命令定义非常有用。例如,如果我们想声明一个命令以在脚本大小中排版某些文本,则可以如下这样做:
1\DeclareFixedFont\ScriptSizeFont{\encodingdefault}{\familydefault}
2 {\seriesdefault}{\shapedefault}{7pt}
3\newcommand\theScript[1]{{\ScriptSizeFont #1}}
您可以看到\declarefixedfont
有六个参数。要定义的命令的名称之后是NFSS分类中的五个字体属性。使用了描述主文档字体的内置钩子,而不是传递固定值(大小除外)。因此,在上面的示例中\ scriptsizefont
仍然取决于文档的整体布局。但是,一旦执行定义,其含义就会冷冻,因此以后更改默认值将不会更改\ scriptsizefont
字体。
5.3. 自动替换字体
当无法执行字体更改请求,因为乳胶不知道该组合时,它试图使用具有类似属性的字体恢复。这是详细发生的事情:如果未声明编码方案,家庭,系列和形状的组合,乳胶试图通过首先将形状属性更改为默认值来找到已知的组合。如果结果组合仍然未知,则尝试将系列更改为默认值。作为最后的手段,它将家庭更改为默认值。最后,它查找内部表条目以查找所需的大小。例如,如果您要求\ ttfamily \ bfseries \ ithape
-一种大胆系列和斜体形状的打字机字体(通常不存在) - 那么您将获得中等系列和直立形状的打字机字体,因为乳胶首先重置该系列的形状。在这种情况下,如果您喜欢具有斜体形状的打字机字体,则必须使用“ sub”函数宣布对乳胶的偏好,这在
如何设置新字体文章中进行了解释。
替换过程永远不会改变编码方案,因为任何更改都会在输出中产生不正确的字符。您可能还记得,编码方案定义了如何解释输入字符,而其他属性则定义了输出的外观。因此,例如,仅仅因为软件试图聪明而用合同中的美元标志代替了一个磅标牌,那将是不合适的。
因此,每个编码方案都必须具有默认的家族,系列和形状,至少由编码方案以及相应默认值组成的组合必须在乳胶内部具有定义。
5.4. 如何在文档中使用低级命令
前面部分中描述的低级命令旨在用于高级命令的定义,无论是文档类或软件包文件还是文档序言中。
如果您可以使用“ \ textsf”这样的高级命令,则应尽可能避免在文档中直接使用低级命令。原因是低级命令是切换到特定字体的非常精确的说明,而高级命令可以使用序言中的软件包或声明来自定义。假设您使用\ fontfamily {cmss} \ selectfont
在文档中选择了现代sans。如果您稍后决定使用PSNFSS捆绑包中的字体排版整个文档 - 例如,应用程序包仅更改文档的那些部分,而这些部分不包含明确的\ fontfamily
命令。