编译 CCT 模板

  • 1036
  • 7 min

正如 Liam Huang 所言,「国内有不少期刊依旧在使用过时的 CCT 方式来支持中文」[1],《中国科学:信息科学》[2]也不例外。我们的目的是把它移植到现代 发行版中,使之可以正常编译。

编译前检查

期刊网站给出了模板的下载链接。打开后,可以看到其中包含三个文件:

  • SCIS2019cn.cls
  • sciscn.tex
  • sciscn.pdf

两个文本文件都是 GB 编码的;而打开 PDF,则可以看到是用 dvips + Ghostscript 的老办法生成的。模板名字都带了 2019,工具却还停留在上个世纪,叹气。

编译尝试

打开那个 SCIS2019cn.cls 文件,可以看到这样的代码:

latex
\let\CCTCJKfonts=1
\LoadClass[twoside,CJK]{cctart}

CCT 有关的东西显然不可能在 Live 上面编译,更不用说非 Windows 的环境。那么我们就伪造一个 cctart 文档类:

latex
% 保存在 cctart.cls 文件中
\ProvidesClass{cctart}
\PassOptionsToClass{\CurrentOption}{ctexart}
\LoadClass[fontset=fandol]{ctexart}

这里就是简单调一下 C 文档类,同时使用 Fandol 字体以避免兼容问题。这样碰巧还有一个好处,就是可以和原来的效果比较接近。

为避免麻烦,我们首先使用 pdf 引擎尝试:

bash
latex sciscn.tex

这里的 latex 命令大致相当于不生成 PDF 的 pdflatex[3]。不出所料果然是会报错的:

! LaTeX Error: File `picins.sty' not found.

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)

Enter file name:

提示找不到 picins.sty。简单搜索就能在 CTAN 上找到 picins 这个包。适用于 2.09,还使用了禁止分发的许可证,总而言之主流发行版都没有带。那么就要自己解决一下:

bash
curl https://mirrors.tuna.tsinghua.edu.cn/CTAN/macros/latex209/contrib/picins/picins.sty -o picins.sty

当然不用命令行也完全可以。这里我们也简单起见,就把宏包扔在工作目录。

继续编译,还是有报错:

! Undefined control sequence.
<argument> \headerps@out
                         {/burl@stx null def /BU.S { /burl@stx null def } de...
l.311 }

?

搜索之后,可以知道错误这是因为 breakurl 宏包只有在 dvips 模式下才需要,其他驱动都可以正常处理 URL 的断行问题[4]。解决办法是禁止调用这一宏包:

latex
\@namedef{ver@breakurl.sty}{9999/99/99}

意思是把版本号设「无穷远点」,使 不再调用。这时编译文档,便可以无错误地结束了。使用 latexmk 可以简化一些流程:

bash
latexmk sciscn.tex && dvipdfmx sciscn.dvi

使用其他引擎

众所周知,pdf + CJK 的方案处理中文早已是过时的了,因此接下面我们换用 和 Lua 进行编译。首先需要把编码转换为 UTF-8:

bash
iconv -f gbk -t utf8  sciscn.tex     > sciscn.tex.tmp     && mv -f sciscn.tex.tmp     sciscn.tex
iconv -f gbk -t utf8  SCIS2019cn.cls > SCIS2019cn.cls.tmp && mv -f SCIS2019cn.cls.tmp SCIS2019cn.cls

这时用 xelatexlualatex 编译,还是有报错:

! LaTeX Error: Command \C already defined.
               Or name \end... illegal, see p.192 of the manual.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.591 ...command{\C}[1]{\ensuremath{\mathcal{#1}}}
                                                  %
?

这是由于 hyperref 已经定义了 \C 命令,用于处理某些西里尔字母。一般来说没有必要用,可以直接取消定义:

latex
\csname ctex_at_end_package:nn\endcsname
  {hyperref}{\let\C\undefined}

此时编译即可顺利通过:

bash
latexmk -xelatex sciscn
# 或者 latexmk -lualatex sciscn

小结

CCT 在历史上也是发挥过重要作用的,然而现在来看基本已经成为了阻碍。某种程度上,期刊的学术水平从排版质量上也可以窥见一斑。《中国科学:信息科学》的模板写得可以说是一言难尽,不过总还是有办法绕过这些泥潭。

最后给出完整(修改版)cctart.cls 以供参考:

latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{cctart}
\PassOptionsToClass{\CurrentOption}{ctexart}
\LoadClass[fontset=fandol]{ctexart}
\@namedef{ver@breakurl.sty}{9999/99/99}
\csname ctex_at_end_package:nn\endcsname
  {hyperref}{\let\C\undefined}
\endinput

注释

  1. ^【LaTeX Tips】国内期刊 CCT 模板编译经验
  2. ^快速了解中国科学信息科学
  3. ^不使用 pdflatex 编译的原因是它不支持 OpenType 字(Fandol),所以我们先要生成 DVI 文件再转为 PDF。
  4. ^breakurl doesn’t work with xelatex