在一些中文 社区总会有人拿出祖传的文档模板,在 TeXLive 中进行编译,然后发现不能进行编译。这些文档有一些特点:
- 文档使用 GBK 编码;
- 使用
latex
dvips
ps2pdf
、latex
dvipdfm(x)
或pdflatex
进行编译; - 裸用
CJK
宏包进行中文支持,文档中充斥了\begin{CJK*}{GBK}{song}
这样的代码。
这种模板是一种比较古老的中文支持方式,这种代码在目前流行的 TeX 发行版如 TeXLive 或 MiKTeX (非 CTEX 套装)中通常是无法正常编译的。对于拿着这种代码的提问,社区里的回答通常是:“换现代的中文编译方式:xelatex
+ ctex
宏集 + UTF-8 文件编码”。这个回答当然是没错的。对于需要经常使用 来编写文档的人来说,更新知识,使用现代的引擎和中文支持方式来处理问题是必要的,但对于只拿 用一次完成一个任务的人,让他去从头学习一些新知识显然不太现实。而且,如果这个任务还规定了必须使用这种祖传模板,他又在使用这种模板时遇到了问题,向别人求助时给出的这种代码会让有心帮忙的人也爱莫能助。今天我在整电脑文件时突然发现了多年以前下载的 gbkfonts
,这个程序可以为 TeXLive 配置一些中文字体以供这种古老的中文支持方式使用,于是我试着配置了一下,并把配置过程记录在这里。
gbkfonts
下载
gbkfonts
是基于 energy 的源程序,由王垠改进的用来从 TTF 汉字字体生成 TeX 使用的汉字 Type1 字体的转换软件,同时还可以生成很多 TeX 系统程序需要的配置文件[1]。这个古老的程序的 Windows 版还可以从 这里 下载。
生成中文字体和配置文件
收集好需要进行转换的 TTF 字体,我们假定其都已经安装在 Windows 系统中,即 C:\Windows\Fonts\
下,将 gbkfonts.zip
在任意位置解压缩,用文本编辑器打开 go.bat
文件,可以看到文件内容如下:
1 | gbkfonts -c -gbk c:/winnt/fonts/simsun.ttf song |
这个程序编写之际 Windows 版本大概还是 Win2000,所以指向系统路径还是C:/winnt
,这里我们将其替换为 Win10 的系统路径。同时,应注意到新的中易宋体的文件采用的是 simsun.ttc
格式,因此需要一并修改为:
1 | gbkfonts -c -gbk c:/windows/fonts/simsun.ttc song |
这其中,song
、hei
、kai
、fs
即为字体族名称,也就是 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
dvips
ps2pdf
这是历史最为古老的编译链。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 | \documentclass{article} |
哎,哪个时候折腾中文真是累死人了啊!什么?CCT模板?cctart
需要用 cctlatex
进行编译,饶了我吧,这个真的折腾不起了。
参考文献
- [1] TeX & LaTeX