2023年12月14日发(作者:)
A在XƎLTEX+CTeX中使用本地系统字体的方法@quasi-GhostAXƎLTEX可以很方便地通过fontspec{...}selectfont指令调用系统本地字体(包括中文字体),但如果使用CTeX宏包,这条指令就对中文字符无效;而如果不使用CTeX宏包,输入的中文又无法断句。针A对这种两难局面,本文提供了一种在XƎLTEX+CTeX中使用系统本地字体的方法,使用户可以设定中文字符的字体。1查找本地安装的字体:Windows下运行cmd,输入fc-list可以得到所有字体信息,输入fc-list:lang=en可以得到所有英文字体,输入fc-list:lang=zh可以得到所有中文字体。不过由于cmd窗口大小有限,难以找到自己所要使用的字体,因此推荐使用以下命令将字体信息输出到本地文件中保存以备查看:fc−list:lang=en>>文件路径/font_−list:lang=zh>>文件路径/font_所有的字体信息就保存到上述两个.txt文件中。如果打开这两个文件查看会发现其中有大量的乱码,这是因为Windows默认的编码方式与fc-list命令不同,你可以把所有信息拷贝到另一个文本文件中,并选择UTF-8编码保存;或者根本不去管它们,因为我们只需要知道每种字体的名称就行。2A在XƎLTEX中设置全局字体:A所谓设置全局字体就是在XƎLTEX源码的导言区使用命令对该作品中所有文字的字体做统一设定,具体命令如下:setmainfont{字体名称}setCJKmainfont{字体名称}上述两个命令大括号内填入的就是用fc-list命令查到的字体的名称(中英文皆可,英文严格区分大小写),比如SimSun(宋体)、STSong(华文宋体)、MicrosoftYaHei(微软雅黑)等等;英文字体的名字就是在Word等软件中所见到的名字,比如TimesNewRoman、Arial、Courier等等。上面两个命令的区别是setmainfont设定的是英文字体,setCJKmainfont设定的是CJK字符字体(CJK字符包括中文、日文、韩文等,CJK就是中日韩三国英文国名的首字母缩写)。两个命令可以同时存在、互不影响,也就是说可以分别设定英文和中文的字体。理论上来讲凡是使用fc-list命令查到的字体名称都可以作为这两个命令的参数,即都用这两个命令设定为全局字体,但实际中可能会有一些字体因为其名称的问题而不能采用这种方法(比如汉仪的一些字体),所幸这样的奇葩字体少之又少。1如果深入探究的话,你会发现类似于以上两个命令的还有setsansfont、setmonofont、setCJKsansfont和setCJKmonofont,它们的含义分别是设置全局西文无衬线字体、设置全局西文等宽字体、设置全局CJK无衬线字体和设置全局CJK等宽字体。对于需要看这篇文章的同学们来说,可以简单认为这四个命令没什么用,因为它们涉及到更加专业的排版技术细节,有些甚至涉及打印机的DPI参数。如果你一定要了解清楚的话,建议自行Google,因为我也不懂;)3单独设定某一部分(章节、段落、句子、词语)的字体:这一部分是本文的重点,相信大家也会注意到这一章节的字体与前后都不相同,我还可以精确地控制某一个字词的字体,使它与众不同,那么这样的字体效果是如何实现的呢?A大家知道在LTEX2ε中可以使用{字体名称正文内容}这样的格式来实现类似的效果,但这一指令本质A上是使用LTEX2ε中内置的字体,不是本地系统的字体,因此可选的也只有heiti、SimSun等五六种少得可怜AAA的中文字体。XƎLTEX在这方面要比LTEX2ε强大得多,毕竟它使用的是Unicode编码;但是在XƎLTEX中直接使用{字体名称正文内容}这样的指令,想简单地把字体名称替换成本地字体名称是不行。必须首先在导言区使用以下指令设定相关命令:设定英文字体指令:newfontinstance{自定义指令名}示例:newfontinstance{courier}{Courier}{系统字体名称}设定中文字体指令:setCJKfamilyfont{自定义的CJKfamily名称}{系统字体名称}newcommand{自定义指令名}示例:setCJKfamilyfont{hwxk}{STXingkai}newcommand{stxk}{CJKfamily{hwxk}}其中系统字体名称必须与fc-list查到的名称一致(如果有中文的话,也可以用中文名称),自定义CJKfamily名称和自定义指令名可以随意设置,但其中自定义指令名最好以开头,比如MyFavoriteFont、AnUglyFont等等。正如大家所见,设定中文字体指令比较复杂,必须首先设定CJKfamily名称,这是由于A西文字体在被XƎLTEX扫描时可以自动分组归类,而中文字体不行,需要手动设置CJKfamily。如果像设定A英文字体那样直接设定指令,虽然XƎLTEX编译不会报错,但相应指令不会其任何效果,系统将自动采用默{自定义的CJKfamily名称}认字体。A按照上面的步骤设定好之后,就可以像LTEX那样使用{字体名称正文内容}命令来设定字体,你可以用这样的大括号对把整个一个章节都括起来,也可以只括住某个词或字母,如此就可以非常灵活方便地控制字体,可以实现在全文使用某一字体的前提下,在某一特定段落使用另一字体。网上还可以找到很多教程,通过配置宏包来支持不同字体,具体宏包指令也与这种方法中的指令相似。A对于XƎLTEX的爱好者或者需要经常进行排版的专业人士而言,自己编写这样一个宏包或者使用第三方宏包无疑是最好的选择。24实例展示:%必须使用ctex宏包%全局西文用TimesNewRoman字体%全局中文用AdobeSongStd字体%使用Courier字体%使用Garamond字体%使用Umpush字体%使用Iwona字体%使用Algerian字体%使用STXingkai华文行楷字体documentclass{article}usepackage{ctex}setmainfont{TimesNewRoman}setCJKmainfont{AdobeSongStd}newfontinstance{courier}{Courier}newfontinstance{garamond}{Garamond}newfontinstance{umpush}{Umpush}newfontinstance{iwona}{Iwona}newfontinstance{algerian}{Algerian}setCJKfamilyfont{hwxk}{STXingkai}newcommand{stxk}{CJKfamily{hwxk}}setCJKfamilyfont{hwlt}{STLiti}newcommand{stlt}{CJKfamily{hwlt}}setCJKfamilyfont{fzjz}{方正剪纸简体}newcommand{fzjz}{CJKfamily{fzjz}}setCJKfamilyfont{fzse}{方正少儿简体}newcommand{fzse}{CJKfamily{fzse}}begin{document}ABCDEFGHIJpar{courierABCDEFGHIJ}par{garamondABCDEFGHIJ}par{iwonaABCDEFGHIJ}par{algerianABCDEFGHIJ}par{umpushABCDEFGHIJ}par甲乙丙丁戊己庚辛壬葵par{stxk甲乙丙丁戊己庚辛壬葵}par{stlt甲乙丙丁戊己庚辛壬葵}par{fzjz甲乙丙丁戊己庚辛壬葵}par{fzse甲乙丙丁戊己庚辛壬葵}end{document}以上是一个用来展示的例子,其中使用了6种英文字体和5种中文字体,编译得到的实际效果如图1所示:%par命令的含义是另起一段,与字体无关%使用方正少儿简体%使用方正剪纸字体%使用STLiti华文隶书字体3图14


发布评论