LaTex之中文支持
LaTex支持三种中文编辑显示方法。
要想在pdflatex中编辑、显示中文,使用ctex宏包的同时也需要设置文件编码为UTF-8,区别是ctex宏包版本>=2.5.10时不用在代码中手动指定UTF-8编码。
特性 | UTF-8+ctex(pdfLaTeX) | CJKutf8(pdfLaTeX) | ctex+XeLaTeX |
---|---|---|---|
编译器 | pdflatex | pdflatex | xelatex |
文件编码 | 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宏检测到文件编码进而自动处理,成功显示中文。如下图所示:
同理当修改了文件编码之后,代码中的CTeX宏包检测到文件非UTF-8编码,就会导致中文乱码。如下图所示:
此时即使在代码文件中手动指定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}
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和xelatex引擎均支持。
如果还想要支持更多的字体,那么就需要使用xelatex引擎了。
xelatex使用中文字体限制
- 需确保系统安装了目标字体文件(TTF/OTF格式)且可被LaTeX识别。
- 必须准确匹配系统字体名称(区分大小写)。
- 中文名或英文名均可,但含空格时需用英文引号包裹。
- 如果无法确定字体名称,可以直接使用字体文件。使用字体文件时如果该文件已被安装到系统目录,直接使用文件名即可。如果字体文件未被安装到系统目录,则需要手动指定文件位置。
示例
下面的代码给出几种使用字体的方式:
\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}
总结
对于pdflatex引擎,推荐使用CTeX宏包,采用自动检测的方式,仅需要设置文件编码为UTF-8不需要代码中设置。
对于xelatex引擎,推荐使用CTeX宏包,由于原生支持UTF-8编码,因此仅需要设置文件编码为UTF-8即可。
同时由于xelatex引擎支持更多的中文字体,因此可优先选择xelatex。
参考文档
- 原文作者:生如夏花
- 原文链接:https://blduan.top/post/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/latex/latex%E4%B9%8B%E4%B8%AD%E6%96%87%E6%94%AF%E6%8C%81/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。