如何设置新字体| 用于 Java 的 Aspose.TeX

要设置与乳胶一起使用的新字体,您基本上需要填写内部字体选择表,其中需要将文档中的字体请求与外部.tfm文件与包含乳胶使用的字符信息关联所需的信息。因此,表负责将外部文件cmdunh10.tfm与以下请求相关联:

1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{m}\fontshape{n}%
2\fontsize{10}{12pt}\selectfont

要添加新字体,您必须扭转过程。对于每个新的外部字体,您都必须回答五个问题:

  1. 什么是字体编码 - 也就是说,哪些字符在哪个位置?
  2. 它的姓氏是什么?
  3. 它的系列(重量和宽度)是什么?
  4. 它的形状是什么?
  5. 它的大小是多少?

这些问题的答案将提供根据乳胶惯例对外部字体进行分类所需的信息。在接下来的几节中,我们将讨论如何在NFSS表中输入新字体,以便可以在主文本中使用它们。通常,如果您想使用新字体,例如创建用于访问新字体系列的短包文件,则需要此信息。在以后的部分中,我们将讨论如果您想使用的话,这些概念很重要,例如,用于数学的特殊字体而不是标准字体。

6.1. 外部字体的命名约定

Tex World中的事实上的标准字体命名方案使用八个字母数字字符对所有字体文件名进行分类,而情况并不重要。这个八个字符的限制可以保证可以在所有计算机平台上使用相同的文件名。该方案的原理在下表中描述了,如果与默认值相对应,则可以省略括号中的零件。例如,仅当字体未线性缩放时才给出设计大小。

外部字体的命名约定

以下是根据乳胶的字体接口对35个“基本”后字体的分类。对于每种字体,都给出了完整的Adobe名称和相应的简短文件名(在当前正在讨论的分类中)。对于ot1t1ts1,都需要分别附加7t8t8c,以获取完整的文件名。例如,用于t1't1编码中的utopia常规的putr8t。 这将在进一步的讨论中有用。

PostScript字体分类

命名惯例涵盖了字体的内部Tex名称(即,如下一节中所述的“ \ declarefontshape”声明中使用的命名名称),虚拟字体及其组件的名称(例如,物理字体的特定重新编码)以及物理字体的名称。在后录字体的情况下,物理字体名称通常与Tex内部使用的字体不同。 在后一种情况下,当查看或打印乳胶运行的结果时,必须将内部字体名称映射到相应的外部字体。例如,PostScript驱动程序dvips使用映射文件(默认扩展名.map),其中包含诸如

1putr8r Utopia-Regular "TeXBase1Encoding ReEncodeFont " <8r.enc <putr8a.pfb

告诉它,可以通过通过特殊编码向量(8r.enc)重新编码来从外部字体putr8a.pfb获得字体 putr8r。但是,您不会在t1put.fd文件中找到对该putr8r的任何引用,其中包含t1 t1''t1't1'utopia家族的 \ evelarefontshape声明。原因是putr8t是一种虚拟字体(借助fontinst实用程序),引用了putr8r”。后一个链接只能在虚拟字体的来源中找到。

6.2. 如何宣布新的字体家庭和字体形状组

必须借助命令\ declarefontfonmily将每个家庭/编码组合引入乳胶,该命令需要三个论点。前两个是编码方案和姓氏。第三个通常是空的,但它可能包含特殊的字体加载选项,并在本文中进一步解释。因此,如果您想声明一个新家庭 - 例如,与旧Tex编码的计算机现代Dunhill - 您会写

1\DeclareFontFamily{OT1}{cmdh}{}

通常,字体系列中有许多单独的字体。为了减少声明的数量,您必须将仅在大小上不同的字体组合并声明它们为一个组,而不是单独宣布每个家庭成员。

使用命令\declarefontshape将这样的组输入乳胶的内部表中,该命令需要六个参数。前四个参数是编码方案,姓氏,系列名称以及要访问这些字体的形状名称。第五个参数是大小和外部字体名称的列表,以特殊格式给出,下面将讨论。第六个论点通常是空的,在本文中进一步解释了其使用。

例如,在旧Tex编码方案中直立的计算机现代Dunhill Medium的NFSS表条目可以输入为

1\DeclareFontShape{OT1}{cmdh}{m}{n}{ <10> cmdunh10 }{}

假设只有一种10pt尺寸的外部字体可用。如果您还可以在12pt(从10pt缩放)可用此字体,则声明将是

1\DeclareFontShape{OT1}{cmdh}{m}{n}{ <10> <12>cmdunh10 }{}

如果外部文件以所有可能的尺寸可用,则声明变得非常简单。 1型PostScript(概述)字体或驱动程序程序能够通过调用Metafont生成字体时的情况是这种情况。

例如,在乳胶t1t1`编码方案中的times roman粗体直立

1\DeclareFontShape{T1}{ptm}{b}{n}{ <-> ptm8t }{}

此示例声明一个大小范围,带有两个开口端。结果,相同的外部ptmb8t.tfm文件用于所有尺寸,并缩放到所需的尺寸。如果您有多个字体的.tfm file-例如,文本尺寸的EMTT10和显示大小的EMTT12(欧洲现代打字机) - 声明可以是

1\DeclareFontShape{T1}{emtt}{m}{n}{<-12> emtt10 <12-> emtt12}{}

在这种情况下,将使用emtt10.tfm文件用于小于12pt的尺寸,并且所有尺寸大于或等于12pt的所有尺寸。

上面的示例表明,\ dectarefontshape命令的第五个参数由尺寸规格组成,这些规范被倾斜括号包围,这些规格与各个尺寸的加载信息(例如字体名称)相互混合。角括号内的零件称为 size info,闭合角括号之后的零件称为 font info。 字体信息进一步构建到 大小函数(通常为空)及其参数。在\ declarefontshape的参数中,忽略了空格以使条目更可读。在异常情况下,当必须输入真实空间时,您可以使用`\ space’命令。

简单尺寸和尺寸范围

尺寸Infos可以分为 简单尺寸大小范围。一个简单的大小由单个(十进制)数字给出,例如<10><10.28>,并且可以具有任何正值。但是,您可能找不到小于4或大于120的值,因为数字代表点数中的字体大小。尺寸范围由两个简单尺寸由连字符隔开,以指示具有相同字体信息的一系列字体尺寸。下边界包含在范围内,而上边界则排除在外。例如,<5-10>代表大于或等于5pt且小于10pt的尺寸。可以在大小范围内省略任一连字符的任一大小的数字:<->代表所有可能的尺寸,<-10>代表所有尺寸小于10pt的尺寸,并且<12->代表所有尺寸大于或等于12tt。 几个简单尺寸通常具有相同的字体信息。在这种情况下,一个方便的速记是省略除最后一个信息以外的所有信息:

1\DeclareFontShape{OT1}{panr}{m}{n}{ <5> <6> <7> <8> <9> <10>
2    <10.95> <12> <14.4> <17.28> <20.74> <24.88> pan10 }{}

这将宣布字体潘多拉媒介罗马人有几种尺寸,所有这些都可以从相同的设计尺寸缩放来产生。

尺寸功能

如上所述,字体信息进一步被构造为一个大小函数及其参数。如果字体信息字符串中出现 *,则其左侧的所有内容构成函数名称,右侧的所有内容构成参数。如果没有星号(如目前为止的所有示例所示),则整个字符串将被视为参数,函数名称为

尺寸功能产生了乳胶找到外部字体并以所需尺寸加载所需的规范。此过程基于用户要求的大小和\declareFontShape命令中的信息。大小功能还负责通知用户有关特殊事件的信息。例如,某些功能仅在发出警告方面有所不同。此功能使系统维护者可以以最适合特定网站的方式设置乳胶。

尺寸函数的名称由零个或多个字母组成。某些尺寸函数可以接受两个参数:一个可选参数和一个必选参数。可选参数必须用方括号括起来。例如,以下规范将针对所有可能的尺寸,选择尺寸函数“s”,其可选参数为“0.9”,必选参数为“cmfbi10”。

1<-> s * [0.9] cmfib8

\Declarefontshape中的尺寸规格按给出的顺序进行了检查。当大小信息匹配所请求的大小时,执行相应的大小功能。如果此过程得出有效的字体,则未检查进一步的条目。否则,搜索将继续下一个条目。标准尺寸功能在下面列出。

“空”函数空功能如果简单的大小,则将字体信息完全加载为请求的大小。如果用户的尺寸范围且用户要求的尺寸属于该范围,则该字体完全以用户尺寸加载。 例如,如果用户请求14.4,则规范

1<-> panr10

将在14.4pt加载panr10.tfm文件。 .tfm文件中的所有值均按1.44缩放,因为该字体均设计为10pt。

您有时可能需要以与用户要求的字体略有不同的尺寸加载字体。与同一文档中使用的其他家庭的字体相比,一个家庭的字体似乎太大时,可能需要进行调整。为此,空尺寸函数允许可选参数指定一个比例因子乘以所请求的大小以产生要加载的实际尺寸。

因此,

1<-> [0.95] phvr8t

将始终以请求大小的 95% 加载 phvr8t.tfm 文件(采用 T1 编码的 Helvetica)。如果使用可选参数,则 empty size 函数将发出警告,通知用户字体未按预期大小加载。

“ s”函数s函数与空功能相同,只是在终端上不会生成任何消息。消息仍将写入成绩单文件,因此您可以找出如果出现问题,则使用哪些字体。

“ gen”函数外部字体名称通常是通过将字体大小附加到表示字体的字符串中来构建的。例如,cmtt8cmtt9cmtt10分别是字体计算机现代打字机在8、9和10pt中的外部名称。根据该方案组织字体名称,您可以使用“ Gen”功能缩短条目。此功能结合了字体信息和请求的大小,以生成外部字体名称。因此,如果您写

1<8> <9> <10> gen * cmtt

这将是一个速记

1<8> cmtt8 <9> cmtt9 <10> cmtt10

在内部NFSS表中保存八个字符。此功能从字面上结合了这两个部分,因此您不应将其与14.4这样的十进制大小。您还必须确保外部字体名称中的数字确实代表了设计尺寸(例如,cmr17实际上是计算机现代罗马人的17.28pt)。

在所有其他方面,gen函数的行为类似于空函数。也就是说,如果指定,可选的参数代表一个比例因子,并且(如果使用)会生成信息消息。

“ sgen”函数sgen函数是gen函数的无声版本。它仅将任何消息写入成绩单文件。

“ genb”函数此大小函数与gen相似,但适用于在centipoints中以字体名称(例如EC字体)中大小编码的字体。结果,像

1<9> <10> <10.95> <12> genb * ecrm

充当速记

1<9> ecrm0900 <10> ecrm1000 <10.95> ecrm1095 <12> ecrm1200

如果存在的如果存在,则具有与空功能相同的效果。

“ sgenb”函数sgenb函数是’genb’函数的无声版本。它仅将任何消息写入成绩单文件。

“ sub”函数如果当前字体形状组不存在外部字体,则使用`sub’函数代替不同的字体形状组。在这种情况下,该论点不是外部字体名称,而是由斜线隔开的不同家庭,系列和形状组合。例如,计算机现代SAN没有斜体形状,只有倾斜的形状。因此,将倾斜的形状声明为斜体是合理的:

1\DeclareFontShape{OT1}{cmss}{m}{it}{ <-> sub * cmss/m/sl }{}

如果没有此声明,乳胶的自动替换机制将替代默认形状,即计算机现代的直立。

“子”功能还有其他好的用途。查看以下代码:

1\DeclareFontShape{OT1}{cmss}{m}{sl}{ <-8> sub * cmss/m/n
2   <8> cmssi8 <9> cmssi9 <10><10.95> cmssi10 <12><14.4> cmssi12
3   <17.28><20.74><24.88> cmssi17 }{}

该声明指出,对于小于8pt的尺寸,乳胶应以OT1/cmss/m/n为字体形状声明。这样的替代可以束缚。例如,没有计算机现代字体小于8pt,因此替换的字体形状组可能包含另一个替换条目。但是,使用此方法的优点是,当您获得额外的字体时,您只需更改一个字体形状组声明 - 使用此字体的其他声明将自动受益。

“ ssub”函数ssub函数具有与子功能相同的功能,但不会产生屏幕上的警告(第一个“ s”是指“静音”)。

“ subf”函数subf函数以与空函数相同的方式加载字体,但会发出警告,该操作是作为替代而完成的,因为所需的字体形状不可用。该函数可用于替换某些外部字体,而无需为它们声明单独的字体形状组,例如“ sub”函数。例如,

1\DeclareFontShape{OT1}{ptm}{bx}{n}{ <-> subf * ptmb7t }{}

会警告用户所请求的组合不可用,因此,将字体“ PTMB7T”改为加载。由于这不如使用sub函数提供信息,因此应优选后者。

“ ssubf”函数`subf’的静音版本,此函数仅将其消息写入成绩单文件。

“固定”函数此函数忽略了请求的大小,而是加载给出的外部字体作为参数。如果存在,则可选参数表示将加载字体的大小(以点为单位)。因此,此功能允许您指定大小范围,其中将加载一个固定大小的一个字体。

“ sfixed”函数``fixed’‘的静音版本,例如,使用此函数来加载包含大型数学符号的字体,该字体通常只能以一种尺寸可用。

字体加载选项

如上所述,需要使用\declarefontfomily命令来声明每个字体系列。该命令的论点以及\declarefontshape的第六个论点可用于指定加载字体时执行的特殊操作。这样,您可以更改与整体字体关联的参数。

除了有关每个字符的信息外,Tex还为每个外部字体维护一组全局尺寸和与字体相关的其他值。例如,每种字体都有自己的“连字符”角色,这是当Tex连字符时插入的字符。另一个例子是单词之间的正常宽度和空白空间的可拉伸性。每种字体都保持一个值,并每次Tex切换到新字体时都会更改。通过在加载字体的那一刻更改这些值,可以实现特殊效果。

通常,变化适用于整个家庭;例如,您可能需要禁止打字机家族中所有字样的字样连字符。在这种情况下,应使用\declarefontfomily的第三个论点。如果更改仅适用于特定的字体形状组,则必须使用 \ eclectfontshape的第六个参数。换句话说,当加载字体时,NFSS首先应用\declarefontfomily的参数,然后应用“\ decterarefontshape的第六个参数,以便在必要时覆盖为整个家庭指定的负载选项。

使用\ hyphenchar \ font = <数字>,Tex指定用于连字符的字符。 <数字>代表此字符在编码方案中的位置。默认值是\ defaulthyphenchar的值,即45`,代表大多数编码方案中“ - ”字符的位置。如果将此数字设置为“ -1”,则抑制了连字符。因此,通过宣布

1\DeclareFontFamily{0T1}{cmtt}{\hyphenchar\font=-1}

您可以使用编码方案``ot1’‘cmtt`家族中的所有字体抑制连字符。带有“ T1”编码的字体在位置127中具有替代连字符,因此您可以设置

1\DeclareFontFamily{T1}{cmr}{\hyphenchar\font=127}

这使连字符的角色与以“所谓”之类的单词输入的复合词仪表板不同。 TEX没有连字符单词已经包含明确连字符的字符(除了连字符之后),这可能是平均单词长度比英语大得多的语言问题。使用上述设置,可以解决此问题。

每个TEX字体都有一组关联的维度,通过\ fontdimen <数字> \ font = <dimen>的赋值而更改,其中<数字>是维度的参考号,<dimen>是要分配的值。加载字体时从.tfm文件中检索默认值。每个字体至少具有七个这样的维度:

当您更改与字体关联的内词间距时,您将无法使用绝对值,因为该值必须适用于一个形状组内的所有尺寸。因此,您必须使用其他取决于字体的参数来定义值。你可以说,例如

1\DeclareFontShape{0T1}{cmr}{m}{n}{...}
2   {\fontdimen2\font=.7\fontdimen2\font}

该声明将普通的内词空间降低到其原始价值的70%。同样,可以更改可伸缩性和收缩性。

公式中的一些字体需要七个字体尺寸。也就是说,符号字体称为“符号”和“ largeymbols”。如果这些字体的分别少于22和13\fontdimen参数,则TEX将无法排版公式。这些参数的值用于将字符定位在数学公式中。

TEX系统中有一个不幸的优化:TEX对于给定尺寸仅加载每个.tfm文件一次。因此,不可能定义一个字体形状组(使用\ ecledFontShape命令)加载一些外部字体 - 例如,cmtt1 - 并使用另一个\declareFontShape命令来加载相同的外部字体,这次是更改\ fontdimen参数或其他其他参数”或其他font font font的\ fontdimen parameter的外部字体。尝试这样做的尝试改变了两个字体形状组的值。

例如,假设您尝试通过使介入空间较小来定义具有紧密间距的字体形状:

1\DeclareFontShape{T1}{ptm}{m}{n}{ <-> ptmr8t }{}
2\DeclareFontShape{T1}{ptm}{c}{n}{ <-> ptmr8t }
3                     {\fontdimen2\font=.7\fontdimen2\font}

该声明将行不通。当将紧密的形状加载到那里指定的值时,介质间距将改变,这不是预期的。处理这种情况的最佳方法是定义包含与原始字体相同字符的虚拟字体,但在字体尺寸的设置中有所不同。另一个可能的解决方案是将字体以略有不同的大小加载,如以下声明:

1\DeclareFontShape{T1}{ptm}{c}{n}{ <-> [0.9999] ptmr8t }
2                 {\fontdimen2\font=.7\fontdimen2\font}

此方法使它们与单独的\ fontdimen参数相同的字体不同,另外,在这种情况下,您可以通过设置\ spaceSkip \ spaceSkip来控制interword空间,从而覆盖了字体值。

6.3. 如何修改字体家庭和字体形状组

如果特定文档需要非标准字体形状声明,则该私人声明应放入包装或文档序言中。它将覆盖字体形状组合的任何现有声明。但是,重要的是,使用\declarefontfomily可以防止后来的加载。同样,该新声明对已经加载的字体没有影响。

6.4. 如何声明新的字体编码方案

涉及编码方案变更的字体更改需要采取某些预防措施。例如,在“T1”编码中,大多数重音字母都有其自己的字形,而在传统的 TeX 文本编码(“OT1”)中,重音字母必须使用“\accent”原语从字母和重音符号生成。如果必须混合使用这两种方法,可能是因为某种字体仅在其中一种编码中可用,那么诸如“"”之类的命令的定义必须根据当前字体编码做出不同的行为。

这就是为什么每个字体编码都必须使用 \DeclareFontEcnoding 命令正式引入到 LaTeX 中的原因,该命令接受三个参数。第一个参数是编码的名称,稍后将通过 \fontencoding 命令使用该名称访问编码。 标准编码方案 及其内部名称的列表在 5.1 节的表格中提供。

乳胶项目保留以以下字母开头的编码使用:

字母“ o”强调了128个字符的编码是旧的,而且 过时。理想情况下,这些编码将被Tex用户组定义的标准所取代,因此,将来只有在一种语言转换为另一种语言时才需要更改编码。

声明您自己的私有编码时,应选择以“L”开头的名称(表示“本地”)或以“E”开头的名称(表示“实验性”)。以“U”开头的编码表示“未知”或“未分类”的编码,即不符合通用编码模式的字体。引入的命名约定可确保使用官方编码的文件具有可移植性。

\declarefontencoding命令存储在命令\ lastDeclaredencoding中的新声明编码的名称。当您声明其他相关的编码信息时,这有时很有用,例如在编码西里尔语言的声明文件中使用。

同样,正如我们在上一篇文章中对字体替换的讨论中提到的那样,对于不同的编码,家庭,系列和形状的默认值可能需要不同。对于这种情况,NFSS提供了命令\declarefontsubstitution,该命令将编码作为第一个参数。接下来的三个参数是用于自动替换过程的家庭,系列和形状的默认值(与此编码相关联)。重要的是,这三个参数必须形成有效的字体形状。换句话说,存在着“\ neclarefontshape声明。否则,当NFSS检查其内部表时,将发出错误消息。

6.5. 内部文件组织

当生成格式文件,在文档序言中声明或按需加载字体变化时,可以宣布字体系列,即文档中的字体改变命令请求尚未使用的组合。即使不使用字体,第一种方法会导致每个乳胶运行中的内部内存。最后两个选项在文档格式期间需要更多时间,因为必须在运行时读取字体定义。然而,对于大多数形状组,后者的解决方案都可以选择,因为它们允许您以一种乳胶格式排版各种各样的文档。

当生成格式文件时,乳胶会读取名为“ fonttext.ltx”的文件,其中包含标准的字体家庭定义集和与文本字体有关的其他一些声明。 所有其他字体家庭定义应在按需加载的外部文件中声明:软件包文件或字体定义(.fd)文件。 如果将字体家庭定义放置在软件包文件中,则必须在\documentclass命令之后显式加载此软件包。但是,有第三种可能性:每当NFSS在编码方案bar中收到字体系列foo的请求,并且对这种组合一无所知,它将尝试加载一个称为“ barfoo.fd”的文件。如果存在此文件,则应该包含“ foo” foo’foo’的字体形状组定义。

1\DeclareFontFamily{BAR}{foo}{...}
2\DeclareFontShape{BAR}{foo}{...}{...}{...}{...}
3...
4\endinput

这就是如何向乳胶宣布大量字体家庭而不使用的信息几乎从未使用过的信息。

每个.fd文件都应在一个编码方案中包含一个字体系列的所有字体定义。在文件中,必须有一个或多个\declarefontshape声明,而恰好一个\ neclarefontfonmily声明。文件中没有其他定义出现,除了\ supportfile声明或某些\ typeout语句都会通知用户字体加载。您可以使用普通的Tex命令\ wlog,而不是\ typeout命令,该命令仅将其参数写入成绩单文件。成绩单文件中的详细信息应由生产中使用的所有“ .fd”文件生成,因为查看此成绩单将通过提供有关文件及其在特定作业中使用的文件的信息来帮助发现错误。如果使用\ typeout\ wlog命令,则重要的是要记住,.fd文件中的空格和空行被忽略。因此,有必要在参数中使用命令\ spaceto\ typeout\ wlog在屏幕和成绩单文件上获得空白。

无法通过“ .fd”机制引入新的编码方案。 NFSS将拒绝任何请求切换到未以乳胶格式(即fonttext.ltx),在包装文件或文档的序言中明确声明的编码方案。

6.6. 如何声明用于数学的新字体

如何指定字体尺寸

对于每个文本大小,NFSS都维护 用于排本数学公式的三个尺寸:在排除大多数符号的大小(由\ textStyle’或\ textStyle\ displayStyle选择);一阶订阅和上标的大小(\ scriptStyle);以及高阶订阅和上标的大小(\ scriptscriptstyle)。如果您切换到尚不知道相应的数学大小的新文本大小,则NFSS试图将其计算为文本大小的分数。如果您不希望NFSS计算这些尺寸,则可以通过\declaremathsizes自己指定正确的值。该声明需要四个参数:此文本大小的外部文本大小和三个数学尺寸。例如,以下声明分别定义了14pt(标题)大小为14pt,10tt和7pt的数学大小:

1\DeclareMathSizes{14}{14}{10}{7}

下面的另一份声明(对于较高级别的标题)告诉NFSS,对于36pt文本大小不需要数学尺寸。这可能有助于避免许多字体的不必要加载。

1\DeclareMathSizes{36}{}{}{}

如何添加新符号

我们已经讨论了如何使用 数学字母命令在公式中产生特殊形状的字母。在这里,我们将展示如何添加包含特殊符号的字体,称为 *符号字体 *,以及如何在公式中访问此类符号。

添加新符号字体类似于新的数学字母标识符的声明:\declaresymbolfont定义了所有数学版本的默认值,\ setSymbolfont覆盖了特定版本的默认值。 数学符号字体​​可通过符号名称访问。例如,如果要安装AMS字体“ MSBM10”(请参见下面的字形图),则首先必须使用上一节中所述的声明来使NFSS已知的字体已知。

MSBM10字形图

这些说明看起来像

1\DeclareFontFamily{U}{msb}{}
2\DeclareFontShape{U}{msb}{m}{n}{ <5> <6> <7> <8> <9> gen * msbm
3        <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> msbm10}{}

通常放在.fd`文件中。然后,您必须按以下命令声明所有数学版本的符号字体:

1\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}

它使字体形状组u/msb/m/n作为符号字体以`amsb的名称。如果这个字体系列中有一个大胆的系列(实际上,没有),您随后可以通过说大胆的数学版本来更改大胆的数学版本的设置

1\SetSymbolFont{AMSb}{bold}{U}{msb}{b}{n}

保养字体声明后,您可以在数学模式下使用此符号字体。但是如何告诉NFSS,例如,在数学模式下\ selldDot命令都应在输出中产生相应的符号?为此,您需要通过使用\declaremathsymbol向NFSS介绍自己的符号名称:

1\DeclareMathSymbol{cmd}{type}{symbol-font}{slot}

第一个参数是您选择的命令名称。第二个参数是下表中显示的命令之一,并确定了符号的性质,进而确定乳胶在公式中发生时在符号周围放置的空间量。

数学对象类型

顺便说一句,除了`\ mathalpha’外,这些命令可以在数学公式中用作一个参数的函数,在这种情况下,它们将其(可能的复杂)参数置于相应的类型。

第三个参数标识了应从中获取符号的符号字体,即由\ dectaresymbolfont命令定义的符号名称。第四个论点给出了该符号在字体编码中的位置,无论是十进制,八分或十六进制值。您可以从上面的字形图中轻松找到该字体中所有字形的位置。例如,\ lessdot可以声明为

1\DeclareMathSymbol{\lessdot}{\mathbin}{AMSb}{"6c}

您可以将单个字符用作第一个参数,而不是命令名称。例如,eulevm包都有几个表格的声明

1\DeclareMathSymbol{0}{\mathalpha}{letters}{"30}

指定从哪里获取数字的位置。

\declaremathsymbol命令指定某些符号字体中的位置。因此,重要的是,所有与此符号字体相关联的外部字体都必须通过\ dectaresymbolfont\ setSymbolfont命令在该位置具有相同的字符。确保这仅使用具有相同编码的字体的最简单方法(除非是`u’或未知的编码,因为本编码中的两个字体不需要包含相同的字符)。

在上面的字形图中,您还可以找到“黑板粗体”字母(ABC …从位置''101开始)。如果您想将这些字母用作数学字母,则可以使用`\declaremathalphabet’定义它们。但是,如果此符号字体已经加载,则最好使用快捷方式访问单个符号:

1\DeclareSymbolFontAlphabet{\mathbb}{AMSb}

也就是说,您提供了数学字母标识符的名称和先前声明的符号字体的符号名称。

不必要地加载字体两次的重要原因是,在TEX中的任何给定时间都有16个数学字体的上限。在计算此限制时,每个符号字体计数;数学字母仅在文档中实际使用,并且它们在每个数学版本中进行本地计数。因此,如果声明八个符号字体,则可以在每个版本中使用最多八个(可能不同)数学字母标识符。

作为简短的摘要:要引入新的符号字体,您需要发布少数\decloresymbolfont\ setSymbolfont声明以及可能大量的\declaremathsymathsymbol宣言。因此,最好在包装文件中添加此类字体。

如何介绍新的数学版本

我们已经 提到,标准设置自动声明两个数学版本:正常和粗体。要介绍其他版本,您可以使用\declaMathversion声明,该声明以一个参数为“新数学版本”。此数学版本将自动提供所有先前声明的符号字体和所有数学字母。将默认字体分配给它们 - 也就是说,您已指定的字体使用\declaremathalphabet\declaresymbolfont

然后,您可以通过发布适当的“ \ setMathalphabet”和\ setSymbolfont命令来更改新版本的设置,如本节和 数学中的字体的文章中所示。同样,通常在软件包文件中进行新的数学版本的引入。

如何更改符号字体设置

我们已经看到了如何添加新符号字体以访问更多符号。可以使用相同的命令来修改现有设置。如果您决定在某些或所有数学版本中使用特殊字体,则此功能可能会很有趣。

以下是默认的乳胶设置:

1\DeclareMathVersion{normal} \DeclareMathVersion{bold}
2\DeclareSymbolFont{operators} {OT1}{cmr}{m} {n}
3\DeclareSymbolFont{letters} {OML}{cmm}{m}{it}
4\DeclareSymbolFont{symbols} {OMS}{cmsy}{m}{n}
5\DeclareSymbolFont{largesymbols} {OMX}{cmex}{m}{n}
6
7% Special bold fonts only for these:
8\SetSymbolFont {operators}{bold}{OT1}{cmr}{bx}{n}
9\SetSymbolFont {letters} {bold}{OML}{cmm}{b}{it}

在标准设置中,由``\ log\ ax等运算符产生的数字和文本取自称为operators`的符号字体。为了改变它,以使这些元素与主文本字体很好地融合 - 例如,计算机现代sans而不是计算机现代罗马 - 您可以发出以下命令:

1\SetSymbolFont{operators}{normal}{0T1}{cmss}{m} {n}
2\SetSymbolFont{operators}{bold} {0T1}{cmss}{bx}{n}

带有名称符号的符号字体和rageymbols在Tex中起着独特的作用。这就是为什么他们需要与之关联的特殊数量的\ fontdimen参数的原因。因此,只有专门准备的字体可以用作这两个符号字体。原则上,可以通过使用\declarefontfamily的第三个参数或\declarefontshape的第六个参数在加载时间将此类参数添加到任何字体。

6.7. 如何定义自己的.fd文件(示例)

如果要设置(PostScript)字体并创建所需的.fd文件,则应遵循本文前面讨论的过程。如果使用fontinst用于生成所需的字体公制文件,则也会自动生成相应的.fd文件。但是,只要您知道使用了哪个字体编码,就可以轻松地为单个字体系列编写一个.fd文件。例如,让我们研究t1bch.fd声明文件for bitstream chartert1编码中:

 1\ProvidesFile{t1bch.fd}[2001/06/04 font definitions for T1/bch.]
 2% Primary declarations
 3\DeclareFontFamily{T1}{bch}{}
 4\DeclareFontShape{T1}{bch}{m}{n}{<-> bchr8t}{}
 5\DeclareFontShape{T1}{bch}{m}{sc}{<-> bchrc8t}{}
 6\DeclareFontShape{T1}{bch}{m}{sl}{<-> bchro8t}{}
 7\DeclareFontShape{T1}{bch}{m}{it}{<-> bchri8t}{}
 8\DeclareFontShape{T1}{bch}{b}{n}{<-> bchb8t}{}
 9\DeclareFontShape{T1}{bch}{b}{sc}{<-> bchbc8t}{}
10\DeclareFontShape{T1}{bch}{b}{sl}{<-> bchbo8t}{}
11\DeclareFontShape{T1}{bch}{b}{it}{<-> bchbi8t}{}
12% Substitutions
13\DeclareFontShape{T1}{bch}{bx}{n}{<->ssub * bch/b/n}{}
14\DeclareFontShape{T1}{bch}{bx}{sc}{<->ssub * bch/b/sc}{}
15\DeclareFontShape{T1}{bch}{bx}{sl}{<->ssub * bch/b/sl}{}
16\DeclareFontShape{T1}{bch}{bx}{it}{<->ssub * bch/b/it}{}
17\endinput

第一行是 *标识行 *。然后使用\declarefontfomily遵循字体家族的声明和编码(bch‘t1’)。此命令的参数应与.fd文件的名称相对应,只是文件名中的编码是小写。接下来,将串联和形状的每个组合映射到 .tfm文件的名称。这些字体将缩放到任何所需的大小(请注意<->)。文件的第二部分设置了一些没有字体可用的组合的替换(即,用粗体系列替换了粗体的扩展系列)。

假设您有附加的 *章程 *字体(黑色和黑色),则可能需要将相应的定义添加到.fd文件中。当然,您首先需要提供适当的虚拟字体,以模拟t1字符集。幸运的是,对于许多字体,可以从互联网下载这些字体。 创建您自己的“ .fd”文件的另一个可能原因可能是由于需要将不同家庭的字体组合在一起,并将其介绍给乳胶作为一个新字体系列。例如,有一个 aldus字体家族设计为 palatino字体(最初是设计为显示字体)的伴侣。由于Aldus没有大胆的系列,因此Palatino是一种自然的选择,可以用作大胆的替代品。在下面的示例中,我们将Aldus与Palatino Bold相结合,称为Composite Font family“ Zasj”。仅显示完整.fd文件的片段,足以说明这个想法。

 1\ProvidesFile{t1zasj.fd}
 2   [2003/10/12 font definitions for T1 Aldus/Palatino mix.]
 3\DeclareFontFamily{T1}{zasj}{}
 4% Medium series
 5\DeclareFontShape{T1}{zasj}{m}{n} {<->pasr9d}{}
 6\DeclareFontShape{T1}{zasj}{m}{sc}{<->pasrc9d}{}
 7\DeclareFontShape{T1}{zasj}{m}{it}{<->pasri9d}{}
 8\DeclareFontShape{T1}{zasj}{m}{sl}{<->ssub * pasj/m/it}{}
 9% Bold series
10\DeclareFontShape{T1}{zasj}{b}{n}{<-> pplb8t}{}
11\DeclareFontShape{T1}{zasj}{b}{sc}{<->pplbc8t}{}
12\DeclareFontShape{T1}{zasj}{b}{sl}{<->pplbo8t}{}
13\DeclareFontShape{T1}{zasj}{b}{it}{<->pplbi8t}{}

要访问此“伪家庭”,我们必须在t1编码中选择zasj。我们还必须确保\ textbf切换到粗体,而不是大胆扩展,因为我们的.fd文件不提供任何替换。所有这些都可以由这样的小包装自动提供:

1\ProvidesPackage{fontmix}[2003/10/12 T1 Aldus/Palatino mix.]
2\RequirePackage[T1]{fontenc}
3\renewcommand\rmdefault{zasj} \renewcommand\bfdefault{b}

因此,通过加载fontmix软件包,我们将Aldus和Palatino Bold成为头条新闻。这样的字体混合可能不会增强您的文本,因此此示例不建议创建随机组合。

6.8. 声明顺序

NFSS要求您按特定顺序提供所有声明,以便它可以检查您是否已指定了所有必要的信息。如果您以错误的顺序声明对象,它将抱怨。这是您必须尊重的依赖性:

Have any questions about Aspose.TeX?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.