配置:Windows10; TeXLive10; WinEdit; XeLaTeX
自编的模板中将伪粗体作为中文加粗的解决方案。以往的方法是使用ctex
,fontspec
宏包:
\usepackage[UTF8]{ctex}
\usepackage{fontspec}
\setCJKmainfont{SimSun}[AutoFakeBold=3.0]
如今想要确保在 MacOS, Ubuntu, Web(e.g. Overleaf) 也能正常使用。但 SimSun 属于 Win 专用,其他操作系统下则使用其他fontset对应设置正文罗马族字体。
一个显然的方法是:根据 ctex 手册给出的中文配置策略,基于\setCJKmainfont
命令,编写条件语句来分别完成配置:
但该方法需要逐一指定正文罗马族字体名字,稍显啰嗦...
如何在不指定字体名字的情况下,完成伪粗体的设置?
fontspec
宏包中的 \defaultfontfeatures
命令:没任何变化\defaultfontfeatures{Ligatures=TeX, AutoFakeBold=3.0}
用内核命令作为 \setCJKmainfont
命令的主参:
\CJKrmdefault
,但失败;fontspec
, xecjk
源代码,包括source2e
,但没查到\setCJKmainfont
命令的主参被哪个内核命令所调用(一种重要原因:有些用的l3语法,但我看不懂...)xeCJK
宏包(这是不愿考虑的,因为已经用了ctex
包,怕有conflict):没任何变化\usepackage[AutoFakeBold=3.0]{xeCJK}
尽可能不涉及l3语法 >_<
\documentclass{article}
\usepackage[UTF8]{ctex}
\usepackage{fontspec}
%\defaultfontfeatures{Ligatures=TeX, AutoFakeBold=3.0} %方法1,failed
%\setCJKmainfont{\CJKrmdefault}[AutoFakeBold=3.0, AutoFakeSlant=0.3] %方法2,failed
%\usepackage[AutoFakeBold=3.0]{xeCJK} %方法3,failed
\begin{document}
我上{\bf 早八}
\end{document}
如果设置了 BoldFont
和 ItalicFont
,xeCJK
不会再使用伪粗体。而 ctex
为预定义的字体都设置了这两个键,因此后续的修改无效。只需重新定义 xeCJK
的 BoldFont
、ItalicFont
这两个键即可。
必须在加载 ctex
之前就加载 xeCJK
,或者用 \PassOptionsToPackage
,否则设置的 xeCJK
宏包选项无效。
\documentclass{article}
\PassOptionsToPackage{AutoFakeBold=3.0}{xeCJK}
\ExplSyntaxOn
\AddToHook{package/ctex/before}{
\AddToHook{package/xeCJK/after}{
\keys_define:nn { xeCJK / features }
{ BoldFont .code:n = , ItalicFont .code:n = }
}
}
\AddToHook{package/ctex/after}{
\keys_define:nn { xeCJK / features }
{
BoldFont .tl_set:N = \l__xeCJK_font_name_bf_tl ,
ItalicFont .tl_set:N = \l__xeCJK_font_name_it_tl
}
}
\ExplSyntaxOff
\usepackage[UTF8]{ctex}
\usepackage{fontspec}
\begin{document}
我上{\bfseries 早八}
\CJKfontspec[BoldFont=FandolHei, ItalicFont=FandolKai]{FandolSong}
我上{\bfseries 早八}
\end{document}
只可用 xelatex 编译。
也可把这两个键定义为使用 AutoFakeBold
、AutoFakeSlant
等。
已解决!多请教一句:上述l3的片段可以用l2来等价实现嘛?
@u64726 没有任何区别:
明白了。Thx a lot.
@u10307 Sorry突然又想到一个问题>_<:上述代码的设置会影响到英文字体、数学字体的加粗&斜体吗,还是只对CJK字体起作用
@u64726 如果包含后面的
package/ctex/after
代码,则只影响 ctex 直接加载的 CJK 字体,自己在导言区写的没影响。@u10307 没有这部分代码,也只会影响 CJK 字体。
明白了. Thx again~