[原创] LaTeX 通过 XeLaTeX 处理多语言

早先 Knuth 设计的 TeX 只是支持英文, 以后慢慢发展的 LaTeX 支持多国语言的原生输入和编译. 尤其是关于西里尔字母系列 (如 俄语, 塞尔维亚语, 乌克兰语等) 和希腊字母. 这里给出的以俄语, 塞尔维亚语西里尔字母, 希腊字母为例, 编译环境为 Ubuntu 20.04 + TeX Live 2020 + XeLaTeX + UTF8, 其他环境并未测试, 但是 XeLaTeX + UTF8 是必须的, LaTeX 版本应该不能太旧. 下面先给出一个完整例子.

%!TeX encoding = utf8
%!TEX TS-program = xelatex
\documentclass{article}

\usepackage{fontspec} %%使用该宏包设置字体

\begin{document}

%%以下三行设置字母文字字体, 建议放在文档开头, 以免修改数学字体
\setmainfont{Libertinus Serif} %%设置主体字体, 简单一点说就是默认的字体, 前提就是要包括所需的语言, 以下两个同理
\setsansfont{Libertinus Sans} %%设置 Sans 模式调用的字体, 类似于汉语中的 黑体
\setmonofont{Fira Code Retina} %%设置等款字体, 类似于汉语中的 仿宋

Libertinus Serif %%默认

ё йцукенгшщзхъ фывапролджэ ячсмитьбю

Ё ЙЦУКЕНГШЩЗХЪ ФЫВАПРОЛДЖЭ ЯЧСМИТЬБЮ

љњертзуиопшђ асдфгхјклчћ жџцвбнм

ЉЊЕРТЗУИОПШЂ АСДФГХЈКЛЧЋ ЖЏЦВБНМ

;ςερτυθιοπ ασδφγηξκλ ζχψωβνμ

;ςΕΡΤΥΘΙΙΟΠ ΑΣΔΦΓΗΞΚΛ ΖΧΨΩΒΝΜ

{\sffamily \verb|\sffamily| %%修改了一种模式, 不换段时可以 \textsf{some texts}

   ё йцукенгшщзхъ фывапролджэ ячсмитьбю
   
   Ё ЙЦУКЕНГШЩЗХЪ ФЫВАПРОЛДЖЭ ЯЧСМИТЬБЮ
   
   љњертзуиопшђ асдфгхјклчћ жџцвбнм
   
   ЉЊЕРТЗУИОПШЂ АСДФГХЈКЛЧЋ ЖЏЦВБНМ
   
   ;ςερτυθιοπ ασδφγηξκλ ζχψωβνμ
   
   ;ςΕΡΤΥΘΙΙΟΠ ΑΣΔΦΓΗΞΚΛ ΖΧΨΩΒΝΜ
}

{\ttfamily \verb|\ttfamily| %%等宽样式, 同样, 不换段的时候可以 \texttt{some texts}

   ё йцукенгшщзхъ фывапролджэ ячсмитьбю
   
   Ё ЙЦУКЕНГШЩЗХЪ ФЫВАПРОЛДЖЭ ЯЧСМИТЬБЮ
   
   љњертзуиопшђ асдфгхјклчћ жџцвбнм
   
   ЉЊЕРТЗУИОПШЂ АСДФГХЈКЛЧЋ ЖЏЦВБНМ
   
   ;ςερτυθιοπ ασδφγηξκλ ζχψωβνμ
   
   ;ςΕΡΤΥΘΙΙΟΠ ΑΣΔΦΓΗΞΚΛ ΖΧΨΩΒΝΜ
}

{
   \fontspec{Fira Sans} %%中途某一部分直接修改为另一种 main font, 只在这一个范围内有效. 若只是文中某个小地方出现一点西里尔字母或者希腊字母, 建议采取这种操作方式, 不用改动其他的字体, 但是 fontspec 还是必须的 
   Fira Sans
   
   ё йцукенгшщзхъ фывапролджэ ячсмитьбю
   
   Ё ЙЦУКЕНГШЩЗХЪ ФЫВАПРОЛДЖЭ ЯЧСМИТЬБЮ
   
   љњертзуиопшђ асдфгхјклчћ жџцвбнм
   
   ЉЊЕРТЗУИОПШЂ АСДФГХЈКЛЧЋ ЖЏЦВБНМ
   
   ;ςερτυθιοπ ασδφγηξκλ ζχψωβνμ
   
   ;ςΕΡΤΥΘΙΙΟΠ ΑΣΔΦΓΗΞΚΛ ΖΧΨΩΒΝΜ
}


\end{document}

代码中每一部分主体只有六行, 是三种语言的大小字母, 顺序依次为 俄语字母, 塞尔维亚语西里尔字母和希腊字母, 按键顺序为普通的键盘依次敲击, 除了俄语字母开头那个是 ~ 键之外. 操作说明已加了注释. 效果如下

俄语字母, 塞尔维亚语西里尔字母和希腊字母

至于其他不少的欧洲语言字母, 少量的时候除了个别字母需要单独命令 (如 \ss, \ae 之类) 之外, 可以通过加重音的方式得到, 如 \v{C}, \u{C}, \"{O}, \H{o} 等, 较多时还是建议采用上述方式.

对于中日朝文字, 推荐用开源的思源字体显示, 代码如下:

%!TeX encoding = utf8
%!TEX TS-program = xelatex
\documentclass{article}

\usepackage{ctex} %%ctex 宏集已经调用了 fontspec 宏包
%\usepackage{fontspec} %%使用该宏包设置字体

%%以下三行设置中日朝文字字体, 这还只能放在导言区
\setCJKmainfont{Noto Serif CJK SC} %%思源宋体在 Ubuntu 中的名称
\setCJKsansfont{Noto Sans CJK SC} %%思源黑体在 Ubuntu 中的名称
\setCJKmonofont{FZFangSong-Z02} %%方正仿宋

\begin{document}

测试几个汉字, \textsf{这是汉字的黑体}, \texttt{这实际上就是仿宋}

にほんご, \textsf{にほんご 的黑体}

조선어, \textsf{조선어 的黑体}

\end{document}

可惜思源只有宋体和黑体, 没有楷体, 仿宋之类, 所以就只能用其他的代替. 另外 ctex 宏集还定义了几种字体命令, \sonti, \heiti, \kaishu, \fangsong 等. 利用上述代码修改字体时, 还可以加不少的参数, 比如

\setCJKmainfont[ItalicFont = TW-Kai, BoldFont = Noto Serif CJK SC Bold]{Noto Serif CJK SC}

ItalicFont 设置 斜体字体; 对于没有粗体字型的字体, BoldFont 设置粗体字体, 这条对于思源字体实际上是多余的, 这里只是为了举例.

需要说明的是, 由于个别数学命令 (如 \mathrm ) 使用的是正文字体, 故会随着通过 fontspec 修改的主字体, 这时候如果想要原来的字体, 给 fontspec 宏包加上选项 [no-math]. 对于中日朝文字字体的进一步问题, 欢迎访问
https://www.qinxu.net/latex/2020/0525160.