如何单独设置中文双引号(即 “ ”)的字体?

系统为win10;

Emacs版本为:29.0.92;

配置为:Spacemacs (0.999)最新版本;

字体配置用的是 cnfonts,并且中文字体选用 KaiTi,字体大小为15;英文字体选用 Consolas,字体大小为14,字体配置信息如下图所示:

现在的问题是中文双引号的字体仍为英文字体的设置,即Consolas,带来的问题是中文的双引号只占半个字符(类似中文的半角字符,具体见下图!),正常中文双引号的左、右双引号都应该各占一个字符,因此想到单独设置中文双引号字体的方法。查阅相关方法(如 Emacs,字体与字符集 ),均不能达到目的,因此在此求助各位大佬,如何设置才能使用中文的双引号使用中文字体的设置 或 能够设置成任意字体?

image

首先,describe-char (快捷键 C-h ‘)这个函数可以查看光标下字符的具体信息,可以看看它到底是用了什么字体。(因为有可能你的中文字体确实是KaiTi,但是这个字体的中文双引号确实只占一个字符!)

另外,如果要设置某个字符采取某个字体,可以试试这条语句:(set-fontset-font t ?“ "Sarasa Mono SC"),把其中的字体换成你想要的。

1 个赞

全角引号

英文中的单引号有两种,'(U+0027) 和(U+2019)。可能会觉得前一种出现在英文文本中,后一种出现在中文文本中,并且宽度和中文等宽。然而,英语世界中的一些人在英文文章中也是会使用后一种的。所以,字体在显示后一种引号的时候,究竟是和英文字母一样窄,还是该和中文字体等宽呢?如果在英文文章中显示成全宽字符则会显得突兀。

比如,思源黑体其实也包含了拉丁字母的字形,可以完全使用思源黑体去显示西文。此时,后一种单引号的宽度会显示成中文字形的宽度。导致即使在全英文环境中,单引号也会突兀地在文本中过宽。

同样地,(U+2018) (U+201C) (U+201D) 也有类似的情况。

https://catcat.cc/post/2021-03-07/虽然是一篇关于fontconfig的文章,但里面正好也提到了你这个问题当中涉及到的引号问题,可以参考下。

使用上述命令单独设置引号的字体,结果为 nil,大佬可否告知原因!!

(set-fontset-font t 'chinese-gb2312 (font-spec :family "楷体") nil)

使用此命令仍然无法设置字体,并尝试将 楷体 改为 KaiTi,仍然无法设置中文引号的字体!(如下图所示)

image

用 describe-char 命令查看 中文引号的信息如下:

             position: 68 of 68 (99%), column: 2
            character: ” (displayed as ”) (codepoint 8221, #o20035, #x201d)
              charset: chinese-gbk (GBK Chinese simplified.)
code point in charset: 0xA1B1
               script: symbol
               syntax: . 	which means: punctuation
             category: .:Base, >:Not at bol, c:Chinese, h:Korean, j:Japanese
             to input: type "C-x 8 RET 201d" or "C-x 8 RET RIGHT DOUBLE QUOTATION MARK"
          buffer code: #xE2 #x80 #x9D
            file code: #xE2 #x80 #x9D (encoded by coding system utf-8)
              display: by this font (glyph code):
    harfbuzz:-outline-Consolas-regular-normal-normal-mono-19-*-*-*-c-*-iso8859-1 (#x16A)

Character code properties: customize what to show
  name: RIGHT DOUBLE QUOTATION MARK
  old-name: DOUBLE COMMA QUOTATION MARK
  general-category: Pf (Punctuation, Final quote)
  decomposition: (8221) ('”')

There is an overlay here:
 From 67 to 69
  face                 hl-line
  priority             -50
  window               #<window 3 on *scratch*>


There are text properties here:
  face                 font-lock-warning-face
  fontified            nil
  help-echo            "Confusable character"

这个全角/半角的问题,李杀的网站里有这么一段可供参考,但是不是单独设置字体的方式。

http://xahlee.info/emacs/emacs/elisp_convert_full_width_half_width_chars.html

另外,我还真好奇"这个字符在哪个字体是全角的?因为kitty的字体限制的很好,我在终端里测试了几个字体,都是显示半角。

我觉得可能和 cnfonts 有关,请求 @tumashu 大佬帮助!

我猜测可能是 spacemacs 自带和字体设置和 cnfonts 字体设置出现了冲突,最好 emacs -Q 逐步加载包来测试测试

我测试了,这个函数无论成功与否,似乎都返回 nil

其次,不知道""里面的“楷体”这种写法是不是合法的输入,可以尝试 set-frame-font 这个函数,按照它弹出的列表填写就肯定能用。

比如:(set-fontset-font t ?“ "Source Code Pro")

我这边 emacs -Q 也无法修改弯引号:

image

我看了一下 set-fontset-font 的文档,如果是 emacs -Q 启动的话,应该使用:

(set-fontset-font nil ?“ “Source Code Pro”)

改变了第一个参数,可以看一下第一个参数的含义。

这个问题还是没有解决,继续请各位大佬出手帮忙,不胜感激。

我发现你的“楷”字有效,而下面的引号没有效果。

这可能是因为引号是一个符号,而 emacs 有一个变量 use-default-font-for-symbols ,通过 emacs -Q 启动的话,默认为 t,你可以把它改为 nil,可能就有效果了。

参看第8条:

这问题就解决不了,单引号双引号本身就只占半个中文字符。终端,浏览器,emacs 上都一样。

我认为,他目前的问题是无法单独为引号设置字体,我的回复也是基于“如何给引号单独设置字体”。

而引号占据的宽度,不同字体确实不一样,比如 Source Han Sans 这个字体中,中文引号就是和中文汉字一样宽。

image

我验证了下你的说法,方法可行。

(setq use-default-font-for-symbols nil)
;; 中文符号分类 symbol,单独设置为 Source Han Sans CN 支持全角
(set-fontset-font t 'symbol (font-spec :family "Source Han Sans CN"))
;; 汉字分类 han,单独设置为 Sarasa Gothic SC Nerd Font
(set-fontset-font t 'han (font-spec :family "Sarasa Gothic SC Nerd Font"))

楼主注意自己用的是windows,字体名称要去系统里看,与我提到的字体名称可能不一致。

1 个赞