发布网友 发布时间:2024-09-30 14:00
共1个回答
热心网友 时间:2024-10-08 04:03
记得有一本书中提到过鸟笼效应,买了漂亮的鸟笼之后,自然想买只漂亮的鸟。安装了 LaTeX 和 Vim 这些工具后,我总想用它们来写些 LaTeX 语句,以此来对得起自己辛苦搭建的环境。尽管我对 LaTeX 一窍不通,但我在网络上找到了一个模板,然后用 Vim 一行行敲代码,编译出漂亮的 PDF,这种完美感很快就消失了。当我尝试写下 "hello world" 这样的代码时,却遇到了编译错误。很快我就意识到问题出在字体上。早些时候,我对 LaTeX 使用中文字体就感到不安,总是担心编译器会告诉我 "这个用不了",就像一个严格的老师面对一个没底的学生。我知道可以尝试使用 xelatex 或者 ctex,以避免这些尴尬时刻,但我并不了解为什么我不能随意使用中文字体,我渴望了解更多。
这篇文章旨在为和我一样的初学者提供指南,主要关注于如何安装和使用 ttc 或 ttf 格式的CJK子字体。虽然我可能在某些环节中犯了错误,希望高手能指正并补充。我们首先需要理解 LaTeX 工作的原理,这将帮助我们建立整体概念。让我从博客上找到的一篇解释开始:
很多人对 LaTeX 的各种文件和字体感到困惑,但实际上 LaTeX 处理汉字的过程相当简单。当你编辑了一个包含如下内容的文件 example.tex:
用户在命令行中输入 "latex example.tex",一个名为 "latex" 的程序启动,实际上它就是 TeX、LaTeX 和 TeX 的结合体。如果在某些系统下,"latex" 是一个脚本,其中仅包含几行代码。例如在 Linux 系统下:
TeX 发现自己是通过 "latex" 启动的,或者脚本中明显指明需要 "latex" 格式,它会读取名为 "latex.fmt" 的文件,该文件通常位于 "$TEXMF/web2c" 目录。从这时起,我们进入了 LaTeX 的世界。LaTeX 是 TeX 的一种特殊情况,理解这一点后,我们可以无视 TeX 给我们的诸多规定。当 LaTeX 发现用户使用了 CJK 宏包,在 "\begin{CJK}{GBK}{song}" 时,CJK 宏包会将从现在开始到 "\end{CJK}" 之间的中文内容转换为一些奇怪的 TeX 命令。这些命令会根据不同的汉字转换不同的字体。例如,对于汉字“您”,它会将字体设置为 "gbksong51",然后获取第 115 个字符。为了实现这一目的,它将汉字“您”转换为 "\C19/song/m/n/10/51 s" 的命令,其中 "\C19/song/m/n/10/51" 表示使用 GBK 编码(C19)的 song 体,粗细为 medium(m),形状为 upright(n),大小为 10pt,子集号码为 51。这个描述会被 C19song.fd 这个字体描述文件映射为 "gbksong51"。因为 C19song.fd 中有这样一行代码:"\DeclareFontShape{C19}{song}{m}{n}{<-> CJK * gbksong}{}",所以 "\C19/song/m/n/10/51" 命令会将字体设置为 "gbksong51 at 10pt"(TeX 术语)。最后,我们继续处理文档的其他部分,就像处理其他任何英语文件一样,直到生成 dvi 文件。用户使用 dvips 生成 PostScript 文件,dvips 找到配置文件并读取字体映射列表,列表中有一个文件叫做 "cjk.map",它会读取该文件。在 "cjk.map" 中,我们找到 gbksong51 这个字体的图像(glyph)应该从 Type1 字体文件 "gbksong51.pfb" 里获取。dvips 将这些信息存储到一个表中以备后续使用。dvips 开始读取 dvi 文件,发现需要使用 "gbksong51" 字体,并输出一个 "s" 字符。它将 "gbksong51.pfb" 下载到生成的 PostScript 文件 "example.ps" 中,并在合适的位置放置索引号:s。现在,我们使用文本编辑器,如 VIM,打开 "example.ps" 文件,可以看到其中包含如下内容:
通过这个分析,我们可以看出 TeX 在本质上处理汉字没有问题,因为经过 CJK 的转化,汉字被转换成了类似于英文字符的“盒子”。只要按照 TeX 的规则处理这些“盒子”,我们就可以实现与英文完全相同的功能。
这篇文章揭示了 LaTeX 处理汉字的过程,涉及到了一些概念,如 $TEXMF$ 目录、字体描述文件(.fd)、映射文件(.map)等。为了解决一些疑惑,我提出了以下几个问题:
这些问题的回答帮助我们理解了字体的安装和使用过程。例如,$TEXMF$ 是一个路径,它包含了 LaTeX 的各种配置文件和字体,通过命令 `kpsewhich -expand-var '$TEXMF'` 可以找到它。不同字体编码和子集号码的存在,使得同一个汉字在不同字体中可能对应不同的编号。C19 是基于 GB 编码的规定,不同的编码(如 C70 对应 UTF-8)用于不同的应用场景。字体描述文件(.fd)和映射文件(.map)是 LaTeX 系统中关键的组成部分,用于字体的映射和管理。
通过理解这些概念,我们可以更深入地了解 LaTeX 处理中文字体的过程。从编码到映射,再到最终的 PostScript 输出,每一步都遵循特定的规则和流程。了解这些细节有助于我们更好地解决在实际应用中遇到的问题。