当前位置: 首页 > news >正文

LaTeX之中文支持和设置字体的几种方法

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宏检测到文件编码进而自动处理,成功显示中文。如下图所示:

在这里插入图片描述

同理当修改了文件编码之后,代码中的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使用中文字体限制

  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编译结果显示如下:在这里插入图片描述

总结

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

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

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

参考文档

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

http://www.lqws.cn/news/533161.html

相关文章:

  • Docker 入门教程(一):从概念到第一个容器
  • php的案例分析----typecho项目
  • 华为云Flexus+DeepSeek征文|华为云ModelArts搭建Dify-LLM应用开发平台(AI智能选股大模型)
  • 制药行业的精细化管理:GCOM80-2NET自动化解决方案
  • 用pthread_setschedparam设置调度策略
  • Altera PCI IP target设计分享
  • STM32F103ZET6开发板【项目工程创建】+具体实现步骤流程
  • 构建高效字符串编解码系统:Prefix-Token-Suffix三元组方法
  • python pyecharts 数据分析及可视化
  • 创客匠人解析视频号公私域互通逻辑:知识变现的破圈与沉淀之道
  • [特殊字符]推客带货小程序解决方案——0门槛裂变营销,佣金赚不停!
  • 408考研逐题详解:2010年第7题——连通图的边
  • 代码随想录|图论|06岛屿数量(广搜BFS)
  • PhoneRescue 4.3绿色版!解决iPhone数据丢失、系统崩溃等场景
  • 单片机 - STM32F103“复用功能重映射”完整解析:从JTAG释放到TIM重映射实战详解
  • CTF:PHP 多关卡绕过挑战
  • 专注推理查询(ARQs):一种提升大型语言模型指令遵循度、决策准确性和防止幻觉的结构化方法
  • 【攻防篇】解决:阿里云docker 容器中自动启动xmrig挖矿
  • ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自动白平衡
  • 数据结构大项目
  • react - ReactRouter—— 路由传参
  • 【STM32 学习笔记】PWR电源控制
  • Java 大视界 -- 基于 Java 的大数据可视化在智慧城市能源消耗动态监测与优化决策中的应用(324)
  • 【linux】全志Tina配置swupdate工具进行分区打包
  • 《PT100两线制温度测量系统设计:从电路原理到嵌入式实现》
  • 【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(二)
  • 香港政府发表《香港数字资产发展政策宣言 2.0》,提出「LEAP」框架
  • 星型模式(Star Schema)
  • lua脚本为什么能保证原子性
  • 云效代码仓库导入自建gitlab中