LaTeX字体导引

其实Latex对字体的选择是比较复杂的, 为此我觉得有必要分享下学习经验.

本教程主要参考:

  1. Fonts in LaTeX, Part One: XeLaTeX
  2. Fonts in LaTeX, Part Two: pdfTeX and OpenType
  3. Fonts in LaTeX, Part Three: pdfTeX and TrueType
  4. TeX-Font


下面 让我们从最容易的XeLaTeX开始吧.

XeLaTeX下新字体的调用

我们假设你已经安装好了Ctex套装(windows系统下).

那么首先你可以运行如下命名(开始->运行->CMD)

得到的输出如果类似:

将这段代码保存为test.tex, 注意编码模式一定要是utf8(其实xelatex也是支持Unicode的, 自己参考其manual吧!), 然后从命令行定位到test.tex所在目录(用 cd 即可切换目录), 输入

如果你得到的是如下的样式就表明已经成功调用了.
xelatex
如果你发现不能正确调用, 极有可能是系统没有这个字体, 建议将\setmainfont{TeX Gyre Pagella}改为\setromanfont{SimSun}在次测试. 如果能通过, 表明是字体问题. 然后再 到 TeX Gyre 下载Pagella 字体, 并安装. 最后还需要刷新字体缓存, 请自行google下. 若有问题, 请留言到下面, 我会尽快回复.

PDFLaTeX下新字体的调用

假设有时你想要 pdfTeX/pdfLaTeX 而不是 XeTeX / XeLaTeX 那么这时应该如何调用新字体呢?(有些xe-fans可能会说, 干嘛用PdfLatex, 参考文献2中的作者给出了一个理由:xelatex不支持Microtypography特性对分段和连字的处理. ) 下面我们就来看看如何在pdftex/pdflatex下选择字体.

在pdftex/pdflatex中使用字体的第一步就是选择转码(事实上就是指字体映射).在上一段中用的例子实际上是调用T1 或者 “Cork” 转码, 但是如果现在你想还能用pdflatex, pdftex运行, 那么你需要手动配置Greek字形的转码.(参考:tex-font.pdf 4.3节, 文中给出了cjk如何配置simkai的范例), 为了叙述方便, 我下面总是假设你的ctex是安装在D:\的根目录下.

首先, 定位到EC.enc文件所在位置,  D:\CTeX\MiKTeX\fonts\enc\dvips\base\EC.enc, 复制一份到该目录并改名为custom.enc; 用你喜欢的文本编辑器打开custom.enc; 定位到最后:

将其改为

我们做的改变就是暂时地将 0xf8, 0xf9, 0xfa (16进制) 映射到 τ, ε, χ 这几个希腊字母的字形. 这里一般的格式就是/+调用该字形的名字, 如果你使用的软件无法识别该名字, 那么你需要使用以/uni开头的16进制来命名, 例如上面的例子可以改成这样:

一个完整的字形名字可以从 Adobe的官网得到. 当然, 你还可以从dvips的文档中得到更多关于转码文件的格式.

接下来, 我们需要建立一个文件, 告诉tex我们从新定义的转码. 在与EC.enc同一目录新建一个uenc.def文件, 其内容为:

注意, 这里我们用一个”U”来表示是用户自定义的. 这两行其实就是说, 定义了一种新的转码, 名称叫做U.

现在, 我们有了转码文件, 接下来是生成是pdftex可以识别的字体矩阵以及一个映射文件, 它将告诉如何通过字的名字找到对应的转码, 进而找到真正的字形. 此外, 由于pdftex不能够处理包含PostScript轮廓的opentype的字体, 所以我们还需要将Pagella(它是opentype的字体)转换为Type1格式. 这需要用到Eddie Kohler的工具—otftotfm. 将命令行CMD定位到当前目录, 然后运行如下命令生成字体映射:

如果不能执行命令, 请下载我编译好的文件到EC.enc同一目录中:下载.
这时, 你的目录中应有如下几个文件:

(pfb 文件是原来Opentype 字体对应的PS Type 1版本的字体, custom.map用来告诉pdfTex如何将字体名字对应到字体文件, 两个tfm提供了字体矩阵信息, 这些信息在tex编排文本是是必须的. vf文件是”虚拟字体”文件, 因为你可能在使用otftotfm是使用了一些参数使得需要对原始字形进行操作. a_qnnfc.enc文件是otftotfm基于我们提供的编码而生成的转码文件.)

至此, 我们已经准备好告诉tex如何调用字体. 你可以参考LATEX 2ε font selection(命令行运行 texdoc fntguide). 将下列命令增加到UPagella.fd:

这里, 第二行是告诉字体编码U, 我们所采用的字族是Pagella. 而第三行定义了该字族可用的字形: 具有中等权重(m)以及正写(n), 而且使用名字为TeXGyrePagella-Regular–custom–base中的所有大小的字体(< ->). 三个\DeclareUnicodeCharacter自然是把Unicode编码对应的字形τ, ε, 和 χ对应到其编码对应的位置. 注意16进制必须大写. 现在, 让我们开始测试吧:

测试的代码如上(假设文件名为test.tex), 第二行告诉Latex加载inpuntenc宏包, 而选项utf8表示我们的编码是utf8(所以上述文件要求是以utf8的格式保存的.) 第三行告诉Latex调用fontenc宏包, 同时告诉它默认的编码是我们自定义的U. 第四行是专门针对PdfLatex的, 告诉他增加custom.map为其内部字体映射. 最后\renewcommand 把默认的serif字体设置成Pagella.

最后, 直接pdflatex编译这个文档吧.

发表评论