前言
Overleaf 是在线 LaTeX\LaTeXLATEX 编译平台,上面有很多可以用的 CJK 字体。
但由于 CTeX 宏集的「开箱即用」太舒服了,很多人不知道如何设置字体,很多人从开始用到弃坑都是由 CTeX 宏集根据系统去自动指定字库,因此他们在使用 Overleaf 时会遇到一些缺字、出现 warning 的问题。
这些问题有几个原因:
Overleaf 基于 Ubuntu 系统,CTeX 宏集自动指定 Fandol 字库;
Fandol 字库缺字严重;
李阿玲在设计 Fandol 的时候没加GSUB表,所以会有Package fontspec Warning: Font "FandolSong-Regular" does not contain requested(fontspec) Script "CJK".
这样的 warning,抑制的方法见《[LaTeX 中文使用] 抑制 xeCJK/fontspec 警告 no-script “CJK”》。
因此如果要舒服的在 Overleaf 中使用中文,可以写一个 ctex-fontset-⟨name⟩.def 来方便的调用 CJK 字体。
正文
在查阅了 Overleaf 中存在的 CJK 字体后,我写了一份 def 文件方便自己使用。
字体设置
\rmfamily:思源宋体 Regular(Noto Serif CJK SC Regular)
\bfseries:思源宋体 Bold(Noto Serif CJK SC Bold)
\itshape:文鼎 PL 简中楷(AR PL KaitiM GB)
\sffamily:思源黑体 Regular(Noto Sans CJK SC Regular)
\bfseries:思源黑体 Bold(Noto Sans CJK SC Bold)
\ttfamily:思源等宽 Regular(Noto Sans Mono CJK SC Regular)
\bfseries:思源等宽 Bold(Noto Sans Mono CJK SC Bold)
\songti:思源宋体 Regular(Noto Serif CJK SC Regular)
\heiti:思源黑体 Regular(Noto Sans CJK SC Regular)
\kaishu:文鼎 PL 简中楷(AR PL KaitiM GB)
\fangsong:Fandol 仿宋(FandolFang R)
def 文件代码
文件名为 ctex-fontset-overleaf.def
\GetIdInfo$Id: ctex.dtx 81d4c90 2020-10-19 20:24:58 +0800 Qing Lee $ {Overleaf fonts definition (CTEX)}\ProvidesExplFile{ctex-fontset-overleaf.def} {\ExplFileDate}{2.5.5}{\ExplFileDescription}\ctex_fontset_case:nnnn { \ctex_fontset_error:n { ubuntu } } { \ctex_zhmap_case:nnn { \setCJKmainfont { :2:NotoSerifCJK-Regular.ttc } [ BoldFont = :2:NotoSerifCJK-Bold.ttc, ItalicFont = gkai00mp.ttf ] \setCJKsansfont { :2:NotoSansCJK-Regular.ttc } [ BoldFont = :2:NotoSansCJK-Bold.ttc ] \setCJKmonofont { :2:NotoSerifCJK-Regular.ttc } [ BoldFont = :2:NotoSerifCJK-Bold.ttc ] \setCJKfamilyfont { zhsong } { :2:NotoSerifCJK-Regular.ttc } [ BoldFont = :2:NotoSerifCJK-Bold.ttc ] \setCJKfamilyfont { zhhei } { :2:NotoSansCJK-Regular.ttc } [ BoldFont = :2:NotoSansCJK-Bold.ttc ] \setCJKfamilyfont { zhkai } { gkai00mp.ttf } \ctex_punct_set:n { ubuntu } \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong } \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei } \ctex_punct_map_family:nn { \CJKttdefault } { zhsong } \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai } \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei } { zhheib } \ctex_punct_map_bfseries:nn { \CJKrmdefault, \CJKttdefault, zhsong } { zhsongb } } { \ctex_load_zhmap:nnnn { rm } { zhhei } { zhsong } { ubuntu } \ctex_punct_set:n { ubuntu } \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong } \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei } \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai } } { \ctex_fontset_error:n { ubuntu } } } { \ctex_set_upmap_unicode:nnn { upserif } { :2:NotoSerifCJK-Regular.ttc } { :2:NotoSerifCJK-Bold.ttc } \ctex_set_upmap_unicode:nnn { upsans } { :2:NotoSansCJK-Regular.ttc } { :2:NotoSansCJK-Bold.ttc } \ctex_set_upmap_unicode:nnn { upmono } { :2:NotoSansMonoCJK-Regular.ttc } { :2:NotoSansMonoCJK-Bold.ttc } \ctex_set_upmap:nnn { upserifit } { gkai00mp.ttf } { } \ctex_set_upfamily:nnn { zhsong } { upzhserif } { upzhserifb } \ctex_set_upfamily:nnn { zhhei } { upzhsans } { upzhsansb } \ctex_set_upfamily:nnn { zhfs } { upzhmono } { } \ctex_set_upfamily:nnn { zhkai } { upzhserifit } { } } { \setCJKmainfont { Noto~Serif~CJK~SC } [ ItalicFont = AR~PL~KaitiM~GB ] \setCJKsansfont { Noto~Sans~CJK~SC } \setCJKmonofont { Noto~Sans~Mono~CJK~SC } \setCJKfamilyfont { zhsong } { Noto~Serif~CJK~SC } \setCJKfamilyfont { zhhei } { Noto~Sans~CJK~SC } \setCJKfamilyfont { zhkai } { AR~PL~KaitiM~GB } \setCJKfamilyfont { zhfang } { FandolFang } }\NewDocumentCommand \songti { } { \CJKfamily { zhsong } }\NewDocumentCommand \heiti { } { \CJKfamily { zhhei } }\NewDocumentCommand \kaishu { } { \CJKfamily { zhkai } }\NewDocumentCommand \fangsong { } { \CJKfamily { zhfang } }%% %%%% End of file `ctex-fontset-overleaf.def'.
使用
将 ctex-fontset-overleaf.def 放在工作目录下,然后通过文档类选项 fontset=overleaf 调用,用 xelatex/lualatex(用 lualatex 编译,Overleaf 会显示「超时」,因为思源字体太大了) 编译即可。
测试代码如下:
\documentclass[fontset=overleaf]{ctexart}\begin{document} 宋体\textbf{加粗}\textit{楷体} \textsf{黑体\textbf{加粗}} \texttt{等宽\textbf{加粗}} {\fangsong 仿宋}\end{document}