我正在考虑转向 Xe(La)TeX,主要原因是它允许我在 LaTeX 代码中使用 unicode,从而使所述代码更易于阅读,尤其是数学代码。
但我对 XeTeX 如何根据我的输入排版符号感到困惑。我看到了三种可能性:
- Unicode 字符被激活并且 XeTeX 输出我们熟悉和信任的 TeX 符号。
- Unicode 字符通过管道(直接)传输到最终(pdf、ps、dvi)文档。
- 两者的结合。
XeTeX 的宣传点之一是可以直接访问系统 UTF-8 字体,我猜 (2) 与此有很大关系。
漂亮的排版
但 TeX 一直致力于美观的排版,并且已经付出了很多努力来使符号及其间距看起来更好。我们还能从 unicode 输出中获得相同的好处吗?(符号看起来一样吗?更好?还是更糟?)我相信有些符号不是直接来自字体,而是在 TeX 本身中精心制作的。
具体内容
有一些特定的数学结构在 TeX 中得到特殊处理,但也具有 unicode 符号。例如,对于\cap
和\bigcap
,分别有 ∩ 和 ⋂。它们都表现得如此吗?那么 √ 呢?或者有实现这种东西的软件包吗?
大多数Unicode 数学符号在数学间距方面是否解释正确?(\mathbin
,,,,,)\mathrel
\mathop
\mathopen
\mathclose
从 unicode ⦃⦄ ⦅⦆ 派生出的数学分隔符是否可以按应有的方式垂直缩放?
是组合变音符号处理得当吗?
可移植性
在不同系统上编译代码时输出会有所不同吗?我生成的 pdf/ps/dvi 在不同系统上查看时会有所不同吗?还是所有相关字体都会自动包含在内?
unicode-math
unicode-math
最后,在这个故事中扮演什么角色?
答案1
XeTeX 引入了新的原语,例如\Umathcode
(最高版本 0.9998 称为\XeTeXmathcode
,为了与 LuaTeX 兼容而重命名),它是 Unicode 的类似物\mathcode
。
在传统的 TeX 中,什么意思\mathcode
?如下声明
\mathcode`+="202B
告诉 TeX,+
数学模式下的 a 应被视为二进制运算符号(最左边的字节"2
),取自字体系列"0
并插入"2B
相应字体中。同样,也可以这样写
\Umathcode`∑="1 "1 "2211
甚至
\Umathcode`∑="1 "1 `∑
原语\Umathcode
的语法如下
\Umathcode<Unicode point> = <math type> <family> <slot>
在 (可选) 之后=
,应该给出三个数字,因为无法像 TeX 那样将信息打包成一个数字。实际上,信息仍然打包成一个数字(在本例中是十进制的 18883089,十六进制的"1202211
),但从打包数字到显式类型系列槽的转换并不简单。
这可能伴随着类似的声明
\Umathchardef\sum="1 "1 "2211
因此输入$∑$
或$\sum$
将得到相同的结果。
该unicode-math
包加载了一个巨大的符号列表,并执行与 类似的分配∑
。 对应的数字∑
会有所不同,因为它取决于许多方面,无法在简短的答案中涵盖。
实际上unicode-math
做的远不止这些,因为它设置了一些东西,以便诸如\mathbf
或之类的命令\mathrm
能够给出所需的结果。
还有其他与传统原语相对应的原语,即\Umathchar
,用于使用直接指定的字符,或\Udelimiter
用于设置具有正常和大变体的分隔符,\Umathaccent
最后\Uradical
用于定义根符号。请参阅texdoc xetex
这将打开 Will Robertson 和 Khaled Hosny 编写的“XeTeX 参考指南”。
答案2
Unicode 数学与字体中存在的 OpenType 表一起排版MATH
;该表包含相当于\fontdimen
;该表包含与传统 TeX 数学字体的 s 等效的数据;请参阅这篇TUGboat文章。因此间距与以前相同。这些字体包含各种大小的符号字形,字体会自动使用适当的字形。字体嵌入在 PDF 文件中。字形在文件中显示为 Unicode 字符。该unicode-math
包支持使用传统的 TeX 控制序列来表示数学符号和构造,并提供一个用于加载 OpenType 数学字体的简单界面。
答案3
对于 (1) 你不需要 xetex;原则上\usepackage[utf8]{inputenc}
允许 utf8 输入与经典 TeX 一起工作(但如果您希望它覆盖数学范围,可能需要比默认设置定义更多的命令)
不是(3),因为它大多不使用主动字符。
也不是真的(直接)(2)。
它的工作方式与传统 TeX 基本相同:在数学模式下,每个字符都有一个,\mathcode
用于告诉 TeX 要使用哪种字体和插槽,以及符号是否是关系等。xetex(和 luatex)在概念上是相同的,只是数学代码表被扩大了,因此任何 unicode 代码点都可以有一个数学代码,而不仅仅是十六进制 FF 的值。因此映射不是“直通的”,而是不通过活动字符实现的。
然后,该软件包需要正确处理所有细节,例如映射传统命令,比如\mathbf
通过在同一字体内切换字符范围而不是切换字体来工作,以及从 opentype 表而不是 tfm 文件中获取数学排版参数。