ここで別の未回答の質問でこの問題が既に発生しました。同じサイズの異なるフォントが同じ高さを持っていることを期待しますが、そうではないようですので、これを修正するためのアドホックなアプローチを示します。
一部のフォントは他のフォントに存在する文字のブロック全体を省略しているため、異なる文字をすべて表示するには、アクセントを別にして、普通の文字のみに焦点を当てた異なるフォントが必要です。一般的でない文字(「𝚫」など)に少なくとも1つのフォントがあることを確認するには、Symbolaなどのフォントをインストールし、unicode-fontsパッケージのreadmeにあるフォントのリストを参照してください。
パッケージunicode-fonts
といくつかの適切なフォントをインストールすると、すべての文字がサポートされるはずですが、一部の文字はemacsで高さが正しく表示されません。
Monacoの高さが間違っているが、Symbolaは数学記号の正しい高さを持っているように見えると仮定します((のサブセットC-x 8 RETまたは等insert-char
、異なる文字を使用またはテストするために使用します)。私の場合、モナコを使用しなくても、Noto Sans SymbolsとApple Symbolsで十分でした。私にとって良いフォントの1つは、DejaVu Sans Monoです。
まず、unicode-fonts
モナコを追加することでモナコの使用を禁止できunicode-fonts-skip-fonts
ます。次に選択するフォントが適切な高さになる場合があります。または、のエントリを変更unicode-fonts
して、Unicodeブロックに特定のフォント(数学演算子など、すべてのブロックのリストがあります)を使用するように指示できますunicode-fonts-block-font-mapping
。
2つ目は、を使用して非常に正確な文字セットを手動で簡単に作成できることです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..206f
、27c0..27ff
、2900..2bff
、1d400..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-fonts
。set-fontset-font
emacsのデフォルトの選択がうまく機能しないことがわかったときはいつでも、好みのフォント選択を完全に手動で指定することができます。
PS別の方法があります:フォントが常に大きすぎる/小さすぎる場合、face-font-rescale-alist
そのフォントのサイズを常に0.95倍にするようにemacsに指示するエントリを追加できます:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
これを試してみたところ、うまくいきませんでした(バグレポートはこちら)が、これも可能なアプローチです。