Unicode文字を使用した行の高さ


23

一部のUnicode文字は、表示される行を非常に大きくします。たとえば、重大なアクセント「̀」は、上下に約2.5行のスペースを追加します。この動作を引き起こす他の文字には、ギリシャ文字の「ϕ」(phi)またはサブセットが等しい「⫅」が含まれます。maps-to "⤇"などの他の文字は、両側に約0.5行しか追加しません。

julia-mode.elLaTeX置換用のそのような文字を多数含むソースを読み込むときに、この問題に遭遇しました。

なぜこれが発生し、修正できますか?

編集:Ubuntu 14.04 LTSとEmacs 24.3.1を使用しています。デフォルトでは、「Ubuntu Mono 13」フォントを使用しますが、他のフォントを使用して文字を表示することもあります。unicodeを明示的に管理するパッケージをインストールしていませんemacs -Q。この問題は、コマンドを使用して再現できます。


3
これはおそらくインストールしたフォントに関連しています。適切なUnicodeサポートが組み込まれたフォント(DejaVu Sans Monoなど)を使用すると役立つ場合があります。
クリス14

質問を編集して、OS、Emacsバージョン、およびEmacsに使用するフォントに関する情報を追加してください。
lunaryorn 14

また、ユニコードをセットアップするためにパッケージ/コマンドを使用するかどうかについても言及してください。または、すぐに使用できるものを使用しています。
マラバルバ14

フォントに同意します。DejaVuSans Monoを使用し、Unicode文字は垂直方向の行間隔に目に見える違いなしでレンダリングします。
ダン

実際にDejaVu Sans Monoがインストールされており、「it」などの一部のキャラクターに使用されています。それはすなわち、ファイごとに異なるフォント、選択しているように見えるので、「XFT:-unknown-ラテン現代数学-ノーマルノーマルノルマルを-17- - - - * - 0-iso10646-1そうすると」。
パトリックスティール

回答:


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)(つまり、ASCIIにはConsolasを、一部の特殊文字にはSymbolaを使用しています)。異なるフォントは異なる高さを持ち、Emacsは常に最も高いフォントを表示するために行の高さに十分なスペースを与えます。デフォルトでは、Emacsは機能するシステム依存のフォントを使用しようとしますが、これはしばしば見苦しい結果につながります。

行の高さの問題の解決策は、残念ながらかなり面倒です。見つけた問題のある文字を調べてset-fontset-font、行の高さに影響しないフォント/サイズに設定します。これを行うためのコードは私の構成で利用可能ですがそれはく、まだ完璧ではありません。誰かがより良い解決策を持っているなら、私はそれを聞くことに興味があるでしょう。


1
私の答えのように、より簡単なアプローチはunicode-fontsを使用することだと思います。それはあなたのために働きますか?
キリル14

@Kirill:unicode-fontsは本当に面白いように見えますが、大幅な調整なしでこの特定の問題を解決できるかどうかはわかりません(試したことがないので、間違っている可能性があります)。根本的な問題は、同じサイズの異なるフォントの行の高さが異なるため、各フォントを(ほぼ)同じ行の高さになるまで微調整する必要があることです。unicode-fontsは、フォントサイズを簡単に調整できるようには見えません。
shosti 14

はい、そうだと思いますが、文字のブロック全体のフォントを簡単に選択できるため、個々の文字を完全に手動で検索する必要はありません。
キリル14

6

私は多くの数学記号でagdaモードを使用しましたが、同じ問題がありました。以前は、@ shostiが示唆するように、フォントマッピングをカスタマイズする唯一の実際のソリューションでした。私の場合、特定のグリフが定義されたフォントがインストールされていても、emacsが間違ったフォント(ボックスを表示する)を選択することが多いため、いくつかのフォントを無効にする必要がありました。OSXではより悪いように見えましたが、Linuxでも見ました。したがって、適切なフォントをインストールするだけでは不十分です。

私が今やっていることは、Roland Walkerの優れたunicode-fontsパッケージを使用することです。(MELPAを介してインストールすることをお勧めします。)これにより、問題はほぼ完全に解消されました。

これをinitファイルに入れます:

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

デフォルトではPragmataProを使用していますが、カバレッジの良い他のフォントも使用でき、必要に応じてパッケージを使用してさらにカスタマイズできます。


4

ここで別の未回答の質問この問題が既に発生しました。同じサイズの異なるフォントが同じ高さを持っていることを期待しますが、そうではないようですので、これを修正するためのアドホックなアプローチを示します。

一部のフォントは他のフォントに存在する文字のブロック全体を省略しているため、異なる文字をすべて表示するには、アクセントを別にして、普通の文字のみに焦点を当てた異なるフォントが必要です。一般的でない文字(「𝚫」など)に少なくとも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..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-fontemacsのデフォルトの選択がうまく機能しないことがわかったときはいつでも、好みのフォント選択を完全に手動で指定することができます。

PS別の方法があります:フォントが常に大きすぎる/小さすぎる場合、face-font-rescale-alistそのフォントのサイズを常に0.95倍にするようにemacsに指示するエントリを追加できます:

(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をフィーチャーしたパッケージインストールするだけでした
nberth

2

これはバグです。トランクに固定されています。この問題は、TeXフォントの行の高さ情報が正しくないために発生します。これは、文字が見つからない場合にEmacsがフォールバックするものです。

emacs-bugのバグスレッドには、さらに多くの情報があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.