问题出现
今天用 LyX 编辑以前的中文文档(通过 pdflatex),突然发现编译出错!提示什么未定义的命令序列以及如下和 fontset 有关的内容:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Critical ctex error: "fontset-unavailable"
! CTeX fontset `fandol' is unavailable in current mode.
! See the ctex documentation for further information.
! For immediate help type H <return>.
!...............................................
不知道这个问题是因为我把 LyX 从 2.2 升到 2.3 引起的还是因为我把 texlive 从 2014 升到 2018 引起的。升完之后前些天编译英文文档时没法发现问题,今天用中文时竟编译不通过。
初步解决
于是尝试把文件导出为 tex,直接用 pdflatex 进行编译,显示如上错误。于是 texdoc ctex 查看更新后的 ctex 文档,发现 ctex 的处理字体的方式发生些变化。我之前调用 ctex 的命令为
\usepackage[UTF8,space]{ctex}
没有指定字体相关内容也能编译(注:我是在 linux 下运行 lyx,把 windows 下的 simsun 等字体放到了 ~/.fonts 目录下并设有环境变量 OSFONTDIT=$HOME/.font)。但是新版的 ctex 在处理字体方式上做了改变,在 linux 下会默认使用 fandol 字体,然而 fandol 字体是 OpenType 的,但 pdflatex 还不支持 OpenType,所以无法使用 fandol 字体,于是就找不到字体了,出现了上面的错误。解决办法很简单,手动指定使用 windows 的字体即可,可使用 winfonts 选项,这是以前的指定方式,等价于 fontset=windows 这种新的指定方式,于是改成如下代码
\usepackage[UTF8,space,winfonts]{ctex}
然后直接在命令行下对 tex 文件进行 pdflatex 编译,一切正常。
莫名其妙
本以为问题已解决,于是在 LyX 中的文档首选项的导言区里将 winfonts 这个选项加上。然后编译,结果仍然出错!还是一样的错误,好像什么都没变似的。开始想会不会是因为调用了 /usr/bin/pdflatex 而非 /usr/local/bin/pdflatex 原因?明明我的路径里 /usr/local/bin 是优先的,命令行直接调用使用的是后者,可以正常编译,但如果使用 /usr/bin/pdflatex 编译 tex 文件则出错。后来通过终端的输出发现不是这个问题,两个 pdflatex 的版本是不一样的,前者是 2015 后者是 2018 的,LyX 调用的确实是正确的 2018 的,没问题。那会不会是因为没有识别 OSFONTDIR 这个环境变量呢?按说也不应该,即使明确使用如下命令运行 lyx 也一样的问题
OSFONTDIR=$HOME/.fonts lyx
这真是莫名其妙!导出的 tex 能用 pdflatex 正常编译,但是在 LyX 里编译就出错,很是诡异!
最终解决
后来通过最小例子一点点排查哪部分代码引起的问题,最后锁定了 ctex 的 space 选项!发现把这个 space 选取去掉,只保留 \usepackage[UTF8,winfonts]{ctex}就能正常编译出 pdf 了!于是又尝试着把这个 space 加回去,发现他奶奶的竟然也不出错了!关闭 LyX 再重新打开,保留有 space 选项,再编译时竟然也正常通过了!真是诡异!
总结
- 由于 ctex 宏包升级到了 2018 版,linux 下结合 pdflatex 使用它时不能不指定字体了,必须明确指定字体设置,这里用 winfonts。
- 若 LyX 里编译不通过,可通过把 ctex 宏包的 space 选项去掉解决。