如何设置 Emacs 字体使用不同的字重(weight)?

最近在设置 IBM Plex Mono 这个字体时,发现 Emacs 在 Windows 和 macOS 上设置字体使用不同的字重时有些差异,不知道这个是字体的问题,还是 Emacs 的Bug?

在 macOS 和 Windows 上安装的都是这个字体中的 IBM Plex Mono: https://github.com/IBM/plex/releases/download/v6.3.0/TrueType.zip

在Windows 平台,下面这个设置是可以使用 regular 和 bold 这两个字重的。

(set-face-attribute 'default nil :font (format "%s:pixelsize=%d" "IBM Plex Mono" 20))
(set-face-attribute 'default nil :font (format "%s:pixelsize=%d:weight=bold" "IBM Plex Mono" 20))

但是没法这样设置使用 medium 这个字重:

(set-face-attribute 'default nil :font (format "%s:pixelsize=%d:weight=medium" "IBM Plex Mono" 20))

但是在 macOS,上面的这行配置确实可以生效的。

在 Windows 下要这样设置才可以使用 medium 这个字重:

(set-face-attribute 'default nil :font (format "%s:pixelsize=%d" "IBM Plex Mono Medm" 20))

希望大佬们指点下迷津,怎么才能设置才是正确的姿势?

我好像也有遇到过这个问题的印象。

我在Linux下,以前某个版本(至少是emacs29之前)的时候,设置medium字重是没有用的,得单独设置字体。
似乎是emacs更新过字重的设置?

有这样一个变量 font-weight-table
emacs29上关于medium的应该是这样了

[80 regular normal unspecified book]
[100 medium]

我记得以前medium和regular是在同一行的。

我看到 @tumashu 大佬以前提过一个类似的问题。可能是那时候改了,为了 medium 和 regular 都能使用。

https://mail.gnu.org/archive/html/bug-gnu-emacs/2021-11/msg00735.html

也许可以考虑用(font-spec xxx)来配置

我确认了下,在 Windows 和 macOS 上 font-weight-table 的值是一样的:

[[0 thin] [40 ultra-light ultralight extra-light extralight]
 [50 light] [55 semi-light semilight demilight]
 [80 regular normal unspecified book] [100 medium]
 [180 semi-bold semibold demibold demi-bold demi] [200 bold]
 [205 extra-bold extrabold ultra-bold ultrabold] [210 black heavy]
 [250 ultra-heavy ultraheavy]]

(set-face-attribute 'default nil :font (format "%s:pixelsize=%d:weight=medium" "IBM Plex Mono" 20)) 在 macOS 生效,但在 Windows 上不生效。

原因是,在 Windows 上,medium 不在这个 IBM Plex Mono 字体名称下,而是在 IBM Plex Mono Medm 这个名称下。所以下面这个设置在 Windows 上是生效的:

(set-face-attribute 'default nil :font (format "%s:pixelsize=%d:weight=medium" "IBM Plex Mono Medm" 20))

试了下用 font-spec 来指定 weight,还是没法生效:

(set-face-attribute 'default nil
                    :font (font-spec :family "IBM Plex Mono"
                                     :weight 'medium
                                     :size   22))

M-x describe-char 的结果还是 regular的:

harfbuzz:-outline-IBM Plex Mono-regular-normal-normal-mono-22-*-*-*-c-*-iso8859-1 (#x0F)

原来这是 Emacs 在 Windows上固有的问题,是因为在Windows 平台使用的 API有限制。目前在Windows 上只对 regular, italic, bold, bold-italic 这几种字重支持的比较好。

详细解释见我提的这个 issue:

bug#64780: 30.0.50; set-face-attribute can not set the medium weight of IBM Plex Mono on Windows 10

原来是没有这个字重