在 TeXLive 中使用 CJK 宏包编译 GBK 编码的中文文档

在一些中文 LaTeX\LaTeX 社区总会有人拿出祖传的文档模板,在 TeXLive 中进行编译,然后发现不能进行编译。这些文档有一些特点:

  • 文档使用 GBK 编码;
  • 使用 latex \to dvips \to ps2pdflatex \to dvipdfm(x)pdflatex 进行编译;
  • 裸用 CJK 宏包进行中文支持,文档中充斥了 \begin{CJK*}{GBK}{song} 这样的代码。

这种模板是一种比较古老的中文支持方式,这种代码在目前流行的 TeX 发行版如 TeXLive 或 MiKTeX (非 CTEX 套装)中通常是无法正常编译的。对于拿着这种代码的提问,社区里的回答通常是:“换现代的中文编译方式:xelatex + ctex 宏集 + UTF-8 文件编码”。这个回答当然是没错的。对于需要经常使用 LaTeX\LaTeX 来编写文档的人来说,更新知识,使用现代的引擎和中文支持方式来处理问题是必要的,但对于只拿 LaTeX\LaTeX 用一次完成一个任务的人,让他去从头学习一些新知识显然不太现实。而且,如果这个任务还规定了必须使用这种祖传模板,他又在使用这种模板时遇到了问题,向别人求助时给出的这种代码会让有心帮忙的人也爱莫能助。今天我在整电脑文件时突然发现了多年以前下载的 gbkfonts,这个程序可以为 TeXLive 配置一些中文字体以供这种古老的中文支持方式使用,于是我试着配置了一下,并把配置过程记录在这里。

gbkfonts 下载

gbkfonts 是基于 energy 的源程序,由王垠改进的用来从 TTF 汉字字体生成 TeX 使用的汉字 Type1 字体的转换软件,同时还可以生成很多 TeX 系统程序需要的配置文件[1]。这个古老的程序的 Windows 版还可以从 这里 下载。

生成中文字体和配置文件

收集好需要进行转换的 TTF 字体,我们假定其都已经安装在 Windows 系统中,即 C:\Windows\Fonts\ 下,将 gbkfonts.zip 在任意位置解压缩,用文本编辑器打开 go.bat 文件,可以看到文件内容如下:

1
2
3
4
gbkfonts -c -gbk c:/winnt/fonts/simsun.ttf  song
gbkfonts -c -gbk c:/winnt/fonts/simhei.ttf hei
gbkfonts -c -gbk c:/winnt/fonts/simkai.ttf kai
gbkfonts -c -gbk c:/winnt/fonts/simfang.ttf fs

这个程序编写之际 Windows 版本大概还是 Win2000,所以指向系统路径还是C:/winnt,这里我们将其替换为 Win10 的系统路径。同时,应注意到新的中易宋体的文件采用的是 simsun.ttc 格式,因此需要一并修改为:

1
2
3
4
gbkfonts -c -gbk c:/windows/fonts/simsun.ttc  song
gbkfonts -c -gbk c:/windows/fonts/simhei.ttf hei
gbkfonts -c -gbk c:/windows/fonts/simkai.ttf kai
gbkfonts -c -gbk c:/windows/fonts/simfang.ttf fs

这其中,songheikaifs 即为字体族名称,也就是 CJK 环境的第二个参数。当然,这个文件还可以继续补充其他字体,只要依照相似的格式继续列在后面,并且,如果在 gbkfonts.ini 中没有该字体的相关信息,也需要在 gbkfonts.ini 中依样补充。考虑我们只是为了能编译古老的模板,而这类模板一般不会出现这四类以外的字体,所以也就不考虑另外增添字体了。

文件修改完成之后,双击或命令行运行 go.bat,然后就可以去泡杯茶耐心地进行等待了,转换字体需要一段的时间。一段时间后,该文件夹下将新增五个文件夹和若干配置文件。这些文件需要我们放置到系统本地 TDS 下进行配置。

  • ./fonts 下全部内容复制到 texmf-local/fonts
  • ./tex 下全部内容复制到 texmf-local/tex
  • ./dvipdfm 下全部内容复制到 texmf-local/dvipdfm
  • ./dvips 下全部内容复制到 texmf-local/dvips
  • ./cjk.map 复制到 texmf-local/fonts/map/dvips

dvips 使用 Type1 中文字体

latex\todvips\tops2pdf 这是历史最为古老的编译链。dvips 是依靠 texmf-dist/dvips/config/config.ps 来知道字体信息的。一般不要改动系统的这个文件,而是应该将其复制到本地 TDS 相应路径,即 texmf-local/dvips/config/config.ps,用文本编辑器打开,在文件末尾添加一句:

1
p +cjk.map

保存文件后,在命令行内运行:

1
texhash

至此,dvips 即可使用中文 type1 字体。

pdflatex 使用 TTF 中文字体

将系统 TDS texmf-var/fonts/map/pdftex/updmap/pdftex.map 复制到 texmf-local/fonts/map/pdftex/pdftex.map,将生成的 ./pdftex/config/gbk*.map 的文件内容添加到 pdftex.map 文件的末尾。然后将生成的 ./dvips/chinese/下所有内容复制到 texmf-local/fonts/enc/pdftex 下(这一步我不确定是不是有必要)。最后在命令行内运行:

1
texhash

至此,pdflatex 可以使用 TTF 字体编译中文文件。

dvipdfm 使用 Type1 中文字体

这一步的配置有些问题让我至今还没有搞懂。将生成的 ./cid-x.map 复制到 texmf-local/dvipdfm/local/config/ 下,将 texmf-dist/dvipdfmx/dvipdfmx.cfg 复制到 texmf-local/dvipdfm/ 下,修改该文件,将原配置的 218 行 %f cid-x.map 取消注释,或在文件末尾添加

1
f cid-x.map

保存文件后,在命令行中运行:

1
texhash

按说,到此应该是将 dvipdfm(x) 配置成功,但在命令行运行

1
dvipdfmx filename.dvi 

会给出 Warning:

1
dvipdfmx:warning: Glyph "index0x1BB7" not available in font "simsun.ttc".

在生成的 pdf 文件中没有任何汉字字形。

可是将修改后的 texmf-local/fonts/map/pdftex/pdftex.map 重命名后,刷新文件名数据库后再次运行 dvipdfmx 时,居然好了,文件没有任何问题。Type1 中文字体嵌入文件中,但很显然,pdflatex 编译时将无法使用 TTF 字体,而是使用了 Type3 点阵字体。总之,现在我做不到在一种配置下能使这两个驱动都正常使用 Type1 或 TTF 中文字体。算了,反正我也不准备应用这种中文支持方式。这只是在帮忙解决问题的时候临时编译测试使用。

最后给个文档例子

接下来给出一个古老模板裸用 CJK 进行中文支持的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
\documentclass{article}
\usepackage{CJK}
\begin{CJK}{GBK}{song}
\title{我的一篇中文文档}
\author{拿了橘子跑啊}
\end{CJK}
\date{\today}
\begin{document}
\begin{CJK*}{GBK}{song}
\maketitle
中文折腾起来还是很费劲的。
\end{CJK*}
\end{document}

哎,哪个时候折腾中文真是累死人了啊!什么?CCT模板?cctart 需要用 cctlatex 进行编译,饶了我吧,这个真的折腾不起了。

参考文献

感谢拨冗阅读本文,若有些许收获,不妨捐赠以资鼓励。