LaTex支持三种中文编辑显示方法。

要想在pdflatex中编辑、显示中文,使用ctex宏包的同时也需要设置文件编码为UTF-8,区别是ctex宏包版本>=2.5.10时不用在代码中手动指定UTF-8编码。

特性UTF-8+ctex(pdfLaTeX)CJKutf8(pdfLaTeX)ctex+XeLaTeX
编译器pdflatexpdflatexxelatex
文件编码UTF-8(自动检测)UTF-8(强制)UTF-8(原生支持)
字体管理自动映射基础字体需手工指定字体直接调用系统字体
配置复杂度中等(需版本适配)最低

UTF-8+ctex(pdfLaTeX)

现代CTeX宏包(v2.5.10+)会默认检测文件编码,当检测到UTF-8编码时会自动启用对应处理模块。

下面代码验证这一点:

\documentclass{article}
\usepackage{ctex}
\begin{document}
这是一个CTEX的utf-8编码例子,{\kaishu 这里是楷体显示}{\songti 这里是宋体显示}{\heiti 这里是黑体显示}{\fangsong 这里是仿宋显示}\end{document}

在上面的代码中未声明UTF-8编码,但是设置文件编码为UTF-8,ctex宏检测到文件编码进而自动处理,成功显示中文。如下图所示:

pdfLateX之ctex自动检测文件编码之UTF8

同理当修改了文件编码之后,代码中的CTeX宏包检测到文件非UTF-8编码,就会导致中文乱码。如下图所示:

pdfLaTeX之ctex文件编码检测之非UTF8

此时即使在代码文件中手动指定UTF-8编码也无法正确显示中文。

因此要想在pdflatex中编辑显示中文,使用ctex宏包的同时也需要设置文件编码为UTF-8,区别是ctex宏包版本>=2.5.10时不用在代码中手动指定UTF-8编码

CJKutf8(pdfLaTeX)

这种方式的局限性比较大,中文必须要包含在\begin{CJK}{UTF8} \end{CJK}中间,否则编译会出错,同时文件编码也要指定为UTF-8,局限性非常大。

\documentclass{article}
\usepackage{CJKutf8}
\begin{document}
	\begin{CJK}{UTF8}{gbsn}
		中文需包裹在CJK环境中,宋体
	\end{CJK}
	
	
	\begin{CJK}{UTF8}{gkai}
		中文需包裹在CJK环境中,楷体
	\end{CJK}
\end{document}

pdfLaTeX之CJKutf8中文支持

CTeX+XeLaTeX

由于XeLaTex原生支持UTF-8,因此无需CTeX宏包进行处理,只需要将文件编码设置为UTF-8然后直接采用xelatex编译就可以。

这种方式事实上和CTeX宏包支持自动检测文件编码和pdflatex引擎的方式并无区别。

% xelatex_test.tex
% 中文显示解决方法之xelatex编译
\documentclass{article}
\usepackage{ctex}
\begin{document}
这是一个CTEX的utf-8编码例子,{\kaishu 这里是楷体显示}{\songti 这里是宋体显示}{\heiti 这里是黑体显示}{\fangsong 这里是仿宋显示}\end{document}

字体设置

上面可以看到pdflatex引擎仅支持CTeX宏的基础字体,那基础字体都有哪些呢?下面的示例给出答案:

\documentclass[12pt,a4paper,utf8]{ctexart}
\begin{document}
	
中文字体(默认宋体)

\fangsong 中文字体(仿宋)

\songti 中文字体(宋体)

\lishu 中文字体(隶书)

\heiti 中文字体(黑体)

\youyuan 中文字体 (幼圆)

\CJKfamily{zhkai} 中文字体(楷书)

\CJKfamily{zhyou} 中文字体(幼圆)

\CJKfamily{zhyahei} 中文字体(微软雅黑)
\end{document}

显示结果如下: pdflatex支持的基础中文字体

上面这几种字体pdflatex和xelatex引擎均支持。

如果还想要支持更多的字体,那么就需要使用xelatex引擎了。

xelatex使用中文字体限制

  1. 需确保系统安装了目标字体文件(TTF/OTF格式)且可被LaTeX识别。
  2. 必须准确匹配系统字体名称(区分大小写)。
  3. 中文名或英文名均可,但含空格时需用英文引号包裹。
  4. 如果无法确定字体名称,可以直接使用字体文件。使用字体文件时如果该文件已被安装到系统目录,直接使用文件名即可。如果字体文件未被安装到系统目录,则需要手动指定文件位置。

示例

下面的代码给出几种使用字体的方式:

\documentclass{ctexart}
% 找不到字体名称,可以直接引入字体文件,字体文件需要在系统目录
% Windows系统字体目录为C:\Windows\Fonts
\newCJKfontfamily\hysf{HYShuFang_55W.ttf}
\newfontfamily\jbnf{JetBrainsMonoNerdFont-Regular.ttf}
\newfontfamily\fmnf{FiraMonoNerdFont-Regular.otf}
\newfontfamily\tnr{times.ttf}

% 明确字体名称,可以直接使用字体名称来指定
\newCJKfontfamily\msyh{"微软雅黑"}

% 设置中文正文字体
\setCJKmainfont{HYShuFang_55W.ttf}
\setmainfont{times.ttf}

\begin{document}
	{\hysf 汉仪书仿}
	
	{\jbnf Hello, world!}
	
	{\fmnf Hello, world!}
	
	{\msyh 微软雅黑}
	
	{\tnr Times New Roman}
	
	正文
	
	Main
\end{document}

xelatex编译结果显示如下: xelatex使用中英文字体

总结

对于pdflatex引擎,推荐使用CTeX宏包,采用自动检测的方式,仅需要设置文件编码为UTF-8不需要代码中设置。

对于xelatex引擎,推荐使用CTeX宏包,由于原生支持UTF-8编码,因此仅需要设置文件编码为UTF-8即可。

同时由于xelatex引擎支持更多的中文字体,因此可优先选择xelatex。

参考文档

LaTex支持中文的三种方式_latex可以写中文吗-CSDN博客