行高与Unicode字符


23

一些Unicode字符会导致它们显示的行很大。例如,重音符号“ ̀”在其上方和下方添加了约2.5行的空间。导致此行为的其他字符包括希腊字母“ ϕ”(phi)或子集等于“⫅”。诸如maps-to“⤇”之类的其他字符在两边仅添加约0.5行。

在读取源中julia-mode.el包含大量此类字符以替换LaTeX 时,我遇到了这个问题。

为什么会发生这种情况,并且可以解决此问题?

编辑:我正在将Ubuntu 14.04 LTS与Emacs 24.3.1一起使用。默认情况下,我使用“ Ubuntu Mono 13”字体,但有时会使用其他字体来显示字符。我没有安装任何软件包来显式管理unicode,并且可以使用command来重现此问题emacs -Q


3
这可能与您安装的字体有关。使用内置了不错的Unicode支持的字体(例如DejaVu Sans Mono)可能会有所帮助。
克里斯

请编辑您的问题,并添加有关您的操作系统,Emacs版本和用于Emacs的字体的信息。
lunaryorn

还请提及是否使用任何程序包/命令来设置unicode。或者,您只使用开箱即用的东西。
马拉巴巴

同意字体:我使用DejaVu Sans Mono,并且Unicode字符呈现在垂直行间距上没有任何可见差异。

我实际上已经安装了DejaVu Sans Mono,它用于某些字符,例如“ ϛ”。因此,它似乎是选择了披不同的字体,即“支持Xft:侠名拉丁现代数学正常正常,正- -17- - - - * - 0 ISO10646-1”。
Patrick Steele 2014年

Answers:


7

发生这种情况是因为Emacs对Unicode字符集的不同部分使用了不同的字体。您可以通过将光标定位在字符上并按来验证正在使用的字体C-u C-x =。例如,通过对ASCII字符的配置,我得到了nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88),但是对⧺的了nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(换句话说,它使用Consolas表示ASCII,使用Symbola表示某些特殊字符)。不同的字体具有不同的高度,Emacs将始终在行高中留出足够的空间以显示最高的字体。默认情况下,Emacs将尝试使用与系统有关的字体,但这种字体通常会导致难看的结果。

不幸的是,我找到的解决行高问题的方法很烦人:我遍历了发现的有问题的字符,并使用set-fontset-font它们将它们设置为不影响行高的字体/大小。我的配置中提供了执行此操作的代码,但是它很丑陋,但仍然不够完美。如果有人有更好的解决方案,我将有兴趣听。


1
我认为更简单的方法可能是使用unicode-fonts,就像我的回答一样。那对你有用吗?
Kirill 2014年

@Kirill:unicode字体看起来真的很有趣,但是我不确定它是否可以在不进行重大调整的情况下解决这个特定问题(我没有尝试过,所以我可能是错的)。根本问题是具有相同大小的不同字体具有不同的行高,因此必须对每种字体进行调整,直到(大约)具有相同的行高。unicode字体看起来并不像它,可以很容易地调整字体大小。
shosti 2014年

是的,我认为这是对的,但是它确实使为整个字符块选择字体变得容易,因此您不需要自己完全手动搜索单个字符。
Kirill 2014年

6

我使用带有大量数学符号的agda模式,并且遇到了同样的问题。过去唯一真正的解决方案是@shosti建议:自定义字体映射。就我而言,我必须禁用许多字体,因为即使我安装了定义了特定字形的字体,emacs仍会经常选择错误的字体(显示框)。在OSX上似乎更糟,但在Linux上也见过。因此,仅安装正确的字体是不够的。

我现在要做的是使用Roland Walker出色的unicode字体包。(我建议通过MELPA安装它。)这几乎完全消除了该问题。

我把它放在我的初始化文件中:

(unicode-fonts-setup)
(set-frame-font "PragmataPro 12")

我默认使用PragmataPro,但是任何其他覆盖率很好的字体也都可以使用,如果需要,您可以使用该程序包进一步自定义内容。


4

我已经在不同的悬而未决的问题有这个问题在这里。我希望相同大小的不同字体具有相同的高度,但是事实并非如此,因此,我将展示我的临时方法来解决此问题。

撇开重音,仅关注普通字符,仅显示某些字体会忽略其他字体中存在的整个字符块,就需要使用不同的字体来显示所有不同的字符。要确保不常见的字符(例如“ 𝚫”)至少具有一种字体,请安装诸如Symbola之类的字体,并在unicode-fonts程序包的自述文件中查看字体列表。

如果安装软件包unicode-fonts和许多好的字体,则应该支持所有字符,但是某些字符在emacs中显示的高度错误。

假设摩纳哥的高度不正确,但是Symbola似乎具有正确的数学符号高度(例如SUBSET OF或EQUAL TO⊆;请使用C-x 8 RETinsert-char测试不同的字符。)。就我而言,不使用摩纳哥,Noto Sans Symbols和Apple Symbols就足够了。对我来说,一种不错的字体是DejaVu Sans Mono。

第一件事是您可以unicode-fonts通过将Monaco添加到其中来禁止使用它unicode-fonts-skip-fonts;接下来选择的任何字体都可能具有正确的高度。另外,您可以通过修改的条目来告诉unicode-fonts将特定字体用于Unicode块(例如Mathematical Operators;这是所有块的列表unicode-fonts-block-font-mapping

第二个问题是,您可以使用手动轻松地对一组非常精确的字符进行此操作set-fontset-font。如果Symbola是数学符号的好字体(在这种情况下,范围是0x2100..0x23ff),则应使用以下命令:

(set-fontset-font t '(#x2100 . #x23ff)
  ;; this should throw an error if there is no such font
  (font-xlfd-name (find-font (font-spec :family "Symbola"))))

我需要改变自己的其他范围分别为2000..206f27c0..27ff2900..2bff1d400..1d7ff

最后,无需手动搜索配置错误的字符。假设unicode-fonts已安装,以下函数将生成一个所有高度不正确的字符的列表:

(defun debug-unicode-heights (&optional block-name)
  "Find all characters in a given block that have incorrect heights.

BLOCK-NAME can be anything that
`unicode-fonts-debug-insert-block' accepts, such as `'all-math',
or a string naming a Unicode block."
  (interactive "sBlock name:")
  (unless block-name (setq block-name 'all-math))
  (let ((buffer (generate-new-buffer (format "debug-unicode-heights:%s" block-name)))
        expected-height
        bad-characters)
    (pop-to-buffer buffer)
    (with-current-buffer buffer
      (unicode-fonts-debug-insert-block block-name)
      (goto-char (point-min))
      (setq expected-height (line-pixel-height))
      ;; (message "Expected height %d" expected-height)
      (while (< (point) (point-max))
        (if (or (= (line-pixel-height) expected-height)
                ;; Some characters are invalid, they have no name
                ;; (their name is just their hex code), and their
                ;; heights do not matter to us.
                (looking-at-p "^.[^\"]*\"#"))
            (delete-region (line-beginning-position)
                           (1+ (line-end-position)))
          (push (char-after (line-beginning-position)) bad-characters)
          (forward-line))))
    ;; (display-message-or-buffer buffer)
    (apply #'string (reverse bad-characters))))

例如:

M-: (debug-unicode-heights 'all-math)

然后

M-: (debug-unicode-heights 'all-greek)

将显示所有错误的数学符号。然后,您可以检查与它们一起显示的字体并进行更改。

我有OS X 10.9.5,所以我的字体设置可能与您的不同。无需安装unicode-fontsset-fontset-font只要发现emacs的默认选项效果不佳,就可以完全手动指定首选字体。

PS:还有一种选择:当字体始终太大/太小时,您可以添加一个条目face-font-rescale-alist来告诉emacs始终将该字体的大小乘以0.95的系数,例如:

(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)

当我尝试此操作时,它并不是很正常(我的错误报告在这里),但这也是一种可行的方法。


该建议set-fontset-font似乎实际上是唯一需要的。我只需要评估,例如,(set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")在创建框架时(window-setup-hook;使其可以使用emacs --daemon),然后ttf-ancient-fonts 在Debian下安装包含Symbola的软件包
2015年

2

这是一个错误;它固定在行李箱中。该问题是由TeX字体上的行高信息错误引起的,如果Emacs找不到字符,这恰好是Emacs退回的信息。

emacs-bug上的错误线程有更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.