我正在尝试在纯 XeTeX 文档中使用 AMS Euler 字体,并从网上的各种来源获取灵感(包括 Knuth 的宏具体数学),我认为下面的方法可行
\font\teneurm=eurm10
\textfont0=\teneurm
$a$
\bye
(当然还有更多尺寸和系列需要定义,但这是一个 MNWE)
我做错了什么?
答案1
为了在数学模式下更改的外观a
,必须更改字体系列 1(\textfont1
、\scriptfont1
和\scriptscriptfont1
)。要理解为什么会这样,必须了解 TeX 如何知道如何在数学模式下正确排版字符。与文本模式相比,数学模式中使用的字体要多得多。因此,虽然在文本模式下,通常只需查看特定位置的当前字体中的字符就足够了,但数学模式并非如此。
相反,TeX 利用字符的数学代码,您可以使用 来访问它,例如,\the\mathcode`\a
它会打印29025
。将其转换为十六进制,您将获得7161
。要解压数学代码:
第一个数字(十六进制表示)称为班级。字符的类别决定了它的间距规则。
下一个数字是家庭,这是存储字符的字体系列。
接下来的两个数字是字符在字体中的位置。
在这种情况下,family=1 和 location=61,我们可以看到,当查看cmmi10
( \textfont1
) 的字体表时:
此处0x61
为斜体a
字符。因此,要更改该a
字符使用的字体,必须更改字体系列 1。
这回答了关于在数学中更改字符字体的问题,但我并没有真正解释字符类别的含义。这对于您的问题来说并不重要,但总体上很有用。
一个角色可以分为 8 个等级:
- 普通:这些是像这样的字符
/
。 - 大运算符:这些是类似于
\sum
和的字符\int
,它们的特殊之处在于它们垂直居中并且有限制(它们上方和下方的材料)。 - 二元运算:这些是类似的字符
+
。 - 关系:这些是类似的字符
=
。 - 开场白:这些都是像这样的人物
(
。 - 结束语:这些都是像这样的人物
)
。 - 标点符号:这些是类似于的字符
,
。 - 变量:主要由字母和数字组成。
(还有一种类型的类,但它不能位于 a 的值中\mathcode
:内部公式类。这些通常由\left...\right
构造生成。)
虽然这些类的主要用途是用于间隔,但有些类也具有特殊属性,特别是 Big Operator (1) 和 Variable (7) 类。Big Operator 垂直居中,并且具有限制(在它们上方和下方的材料),这就是为什么你可以做到\sum_{n=1}^\infty
并且得到n=1
在下方和\infty
上方的材料\sum
。
但是a
是 Variable 类的。Variable 类没有特殊的间距规则,使用 Ordinary 类的规则;除了一个重要方面之外,它几乎与 Ordinary 类相同。Variable 字符使用的系列由寄存器 决定\fam
,当\fam
是有效系列(0 到 15 之间)时,使用的系列是 ,而不是字符\fam
中指定的任何系列。这就是允许在数学模式下更改字体而不更改和 朋友的值的原因。例如,由于系列 0 是罗马字体系列,因此纯 TeX 定义如下\mathcode
\textfont
\rm
\def\rm{\fam\z@\tenrm}
即,它既设置\fam
为 0(\z@
是一个始终为零的寄存器),又将当前字体更改为cmr10
。\fam
在文本模式下更改不会改变任何内容(\fam
进入数学模式时 TeX 也会自动设置为 -1,因此这实际上没有效果),并且\tenrm
在数学模式下没有效果。因此,这两者都是必需的,以便\rm
在文本模式和数学模式下工作。
可以在 TeXbook 中找到更多信息(例如使用的精确间距规则,以及 TeX 如何在数学模式下排版其他特殊字符,如分隔符和重音符)。