10 在不指定字体名字的情况下设置伪粗体?

发布于 2024-10-25 21:09:02
配置: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命令,编写条件语句来分别完成配置:
ctex中文配置策略.PNG

但该方法需要逐一指定正文罗马族字体名字,稍显啰嗦...

需求描述

如何在不指定字体名字的情况下,完成伪粗体的设置?

尝试过的方法

  • fontspec 宏包中的 \defaultfontfeatures 命令:没任何变化
\defaultfontfeatures{Ligatures=TeX, AutoFakeBold=3.0}
  • 用内核命令作为 \setCJKmainfont 命令的主参:

    • 试过 \CJKrmdefault,但失败;
    • 查了fontspec, xecjk源代码,包括source2e,但没查到\setCJKmainfont命令的主参被哪个内核命令所调用(一种重要原因:有些用的l3语法,但我看不懂...)
  • 引入xeCJK宏包(这是不愿考虑的,因为已经用了ctex包,怕有conflict):没任何变化
\usepackage[AutoFakeBold=3.0]{xeCJK}

额外要求

尽可能不涉及l3语法 >_<

MWE

\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}

查看更多

关注者
0
被浏览
370
雾月
雾月 2024-10-26
这家伙很懒,什么也没写!

如果设置了 BoldFontItalicFontxeCJK 不会再使用伪粗体。而 ctex 为预定义的字体都设置了这两个键,因此后续的修改无效。只需重新定义 xeCJKBoldFontItalicFont 这两个键即可。

必须在加载 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 编译。

也可把这两个键定义为使用 AutoFakeBoldAutoFakeSlant 等。

1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览