先上效果图:
我喜欢用 serif 作为正文字体,相对应地,我一般用宋体作为中文正文字体。另一方面,单个中文字体很多时候并不存在 italic / verbatim 一类的变种,这种风格往往通过使用不同的字体实现。比如,使用楷体代替 italic,使用黑体代替 verbatim。
设置如下:
这个函数用来创建字体集(fontset):
(defun create-variable-pitch-fontset (name ascii-font han-font)
"Create fontset named NAME with given ASCII-FONT and HAN-FONT."
(let ((registry (concat "fontset-variable pitch " name)))
(create-fontset-from-fontset-spec
(font-xlfd-name
(font-spec :family ascii-font
:registry registry)))
(set-fontset-font registry 'han
(font-spec :family han-font))
(set-fontset-font registry 'cjk-misc
(font-spec :family han-font))))
下面的代码创建了几个字体集(可以换成你喜欢的字体):
(create-variable-pitch-fontset "regular"
"BlexSerif Nerd Font"
"思源宋体")
(create-variable-pitch-fontset "italic"
"BlexSerif Nerd Font"
"霞鹜文楷")
(create-variable-pitch-fontset "verbatim"
"CaskaydiaCove NFM"
"思源黑体")
接下来设置 variable-pitch 的字体:
(set-face-attribute 'variable-pitch nil
:family font
:fontset "fontset-variable pitch regular")
最后设置 org-emphasis-alist
:
(defface org-emphasis-italic
'((default :inherit italic))
"My italic emphasis for Org.")
(set-face-attribute 'org-emphasis-italic nil :fontset "fontset-variable pitch italic")
(defface org-emphasis-verbatim
'((default :inherit org-verbatim))
"My verbatim emphasis for Org.")
(set-face-attribute 'org-emphasis-verbatim nil :fontset "fontset-variable pitch verbatim")
(defface org-emphasis-code
'((default :inherit org-code))
"My code emphasis for Org.")
(set-face-attribute 'org-emphasis-code nil :fontset "fontset-variable pitch verbatim")
(setq org-emphasis-alist
'(("*" bold)
("/" org-emphasis-italic)
("_" underline)
("=" org-emphasis-verbatim org-verbatim verbatim)
("~" org-emphasis-code org-code verbatim)
("+" (:strike-through t))))
另外,如果你使用 mixed-pitch-mode,那么需要同时启用 variable-pitch-mode,因为前者只 remap 了 font family(不知道怎么翻译),而没有考虑 fontset(事实上在试验的过程中我发现 Emacs 在 remap 对于 fontset 的处理上好像有 bug)。
Emacs 关于字体集的设置有很多问题和没有写进文档的细节,关于此可以参照坛友 @casouri 的这篇文章,给了我很大帮助。