准大四狗最近在学习latex,用的是mac系统下的mactex。从饮水思源BBS上下载了学长贡献的毕业论文模板。在使用过程中遇到一些问题,问题和解决的过程记录如下。
首先测试 temptest.tex 文件(在TexShop中采用XeLaTeX模式编译),编译不通过,错误为部分..命令后没有加空格,这样会连同后面的内容一同作为命令。加上空格后编译通过,但不能显示中文,模板说明中表明需要:
• TeXGyreTermes 西文的:Regular、Italic、Bold、Bold Italic 四种 OTF 字体
• AdobeSongStd、AdobeKaitiStd、AdobeHeitiStd、 AdobeFangsongStd 四款中文字体
将字体文件名改为所需的字体名,仍然不行。观察到字体文件的内容中仍显示原来的字体信息,与文件名无关。
读 temptest.tex 与 sjtuthesis.cls 可知,上述要求的 AdobeSongStd 等字体没有显式的调用,涉及到调用 Adobe 字体的代码为:
\LoadClass[fancyhdr,fntef,UTF8,adobefonts]{ctexbook}
尝试将上述代码中的 adobefonts 改为 AdobeSongStd-Light ,编译通过并能显示中文字体,且显示的中文字体不仅为宋体、原来文件设置的页眉的楷体也能够显示。推测这里的 AdobeSongStd-Light可能仅起到一个入口的调用作用,而非设置字体为宋体。
后来查阅资料时无意中进入文件夹
/usr/local/texlive/2015/texmf-dist/tex/latex/ctex/fontset/
其中有若干设置文件,包括 ctex-fontset-adobe.def 、 ctex-fontset-mac.def 、 ctex-fontset-windows.def 等。打开 ctex-fontset-adobe.def 文件。发现其中涉及到的 Adobe 字体名为 AdobeSongStd-Light、AdobeKaitiStd-Regular、AdobeHeitiStd-Regular、AdobeFangsongStd-Regular, 即最近版本使用的 Adobe 字体。于是不再尝试安装旧的 Adobe 字体,而是将调用的代码中的 adobefonts 改为 adobe ,再次编译,能够正常显示各种设定字体。
接着测试 diss.tex 文件,编译报错,错误信息为
Undefined control sequence \sjtuspace ->\protect \CTEX@spaceChar\protect \CTEX@spaceChar
查找错误位置, sjtuthesis.cls 文件中
\newcommand\sjtuspace{\protect\CTEX@spaceChar\protect\CTEX@spaceChar}
一行报错。
查阅资料,在 bbs.ctex 上有人问了类似的问题,引用回答如下
===============================回答部分===============================
这是 ctex 宏包的 Bug,以前没有显现出来,fontspec 2.4 版本以后显现出来了。
暂时的解决办法,在 \documentclass 的前面写:
\expandafter\def\csname CTEX@spaceChar\endcsname{\hspace{1em}}
我们会尽快上传一个 ctex 宏包的新版本处理此问题。因为准备在今年转向完全重写的 ctex 宏包 2.0,所以以前的 1.x 的 ctex 宏包一直没有上传过更新。
进一步技术细节:
ctex 包中设置中文字体的命令要早于 \CTEX@spaceChar 的定义。而可能使用 \CTEX@spaceChar 的宏 \CTEXsetfont 则在 \CTEX@spaceChar 之前定义。
因为在线安装,用的是最新的 fontspec 2.4 版本。而 fontspec 改变了内部实现,需要在定义字体时设置字号,触发 \CTEXsetfont,造成问题。
====================================================================
故在 diss.tex 文件 \documentclass 之前加入一行代码
\expandafter\def\csname CTEX@spaceChar\endcsname{\hspace{1em}}
编译通过。
对比生成的 diss.pdf 与参考文档 readme.pdf ,发现 readme.pdf 中黑体的部分在 diss.pdf 中为粗体的 Adobe 宋体。读 ctex-fontset-adobe.def 文件,粗体的部分应由黑体替换。但在文档中 \bf
命令没有自动将粗体替换为黑体。
两种简单的处理方法:
• \renewcommand{\bf}{\heiti}
• 在要使用黑体的地方用命令 \heiti
前一种方法改变了\bf 的定义,不建议使用;后一种方法每次要设置字体,不够友好。
考虑到是 ctex-fontset-adobe.def 文件中定义粗体的部分没有起作用,在 sjtuthesis.cfg 中自行定义如下:
\setCJKmainfont
[
BoldFont = AdobeHeitiStd-Regular ,
ItalicFont = AdobeKaitiStd-Regular
] {AdobeSongStd-Light}
生成的 pdf 文件中粗体能够良好显示为 Adobe 黑体。