Ketinggian garis dengan karakter unicode

23

Beberapa karakter Unicode menyebabkan garis yang ditampilkan cukup besar. Misalnya, aksen kubur "̀" menambahkan sekitar 2,5 baris ruang di atas dan di bawahnya. Karakter lain yang menyebabkan perilaku ini termasuk huruf Yunani "ϕ" (phi) atau subset-equal "⫅". Karakter lain seperti map-to "⤇" hanya menambahkan sekitar 0,5 baris di kedua sisi.

Saya mengalami masalah ini ketika membaca sumber julia-mode.elyang berisi sejumlah besar karakter untuk substitusi LaTeX.

Mengapa ini terjadi, dan bisakah diperbaiki?

Sunting: Saya menggunakan Ubuntu 14.04 LTS dengan Emacs 24.3.1. Secara default saya menggunakan font "Ubuntu Mono 13" tetapi font lain kadang-kadang digunakan untuk menampilkan karakter. Saya telah menginstal tidak ada paket untuk secara eksplisit mengelola unicode, dan masalah ini dapat direproduksi menggunakan perintah emacs -Q.

Patrick Steele
sumber
3
Ini mungkin terkait dengan font yang telah Anda instal. Menggunakan font dengan dukungan Unicode yang layak (misalnya DejaVu Sans Mono) mungkin membantu.
Chris
Harap edit pertanyaan Anda dan tambahkan informasi tentang OS Anda, versi Emacs Anda dan font yang Anda gunakan untuk Emacs.
lunaryorn
Sebutkan juga apakah Anda menggunakan paket / perintah apa pun untuk mengatur unicode. Atau Anda hanya menggunakan apa pun yang keluar dari kotak.
Malabarba
Setuju pada font: Saya menggunakan DejaVu Sans Mono dan karakter unicode me-render tanpa ada perbedaan yang terlihat dalam spasi garis vertikal.
Dan
Saya sebenarnya sudah menginstal DejaVu Sans Mono, dan ini digunakan untuk beberapa karakter, misalnya "ϛ". Jadi sepertinya akan memilih font yang berbeda untuk Phi, yaitu "xft: -unknown-Latin Modern Math-normal-normal-normal- -17- - - - * * 0-iso10646-1".
Patrick Steele

Jawaban:

7

Ini terjadi karena Emacs menggunakan font yang berbeda untuk bagian karakter Unicode yang berbeda. Anda dapat memverifikasi font apa yang digunakan dengan memposisikan kursor di atas karakter dan menekan C-u C-x =. Misalnya, dengan konfigurasi saya di atas karakter ASCII yang saya dapatkan nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), tetapi lebih dari ⧺ yang saya dapatkan nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(dengan kata lain, itu menggunakan Consolas untuk ASCII dan Symbola untuk beberapa karakter khusus). Font yang berbeda memiliki ketinggian yang berbeda, dan Emacs akan selalu memberikan ruang yang cukup di ketinggian garis untuk menampilkan font tertinggi. Secara default, Emacs akan mencoba menggunakan font yang bergantung pada sistem yang berfungsi, tetapi ini sering menyebabkan hasil yang buruk.

Solusi yang saya temukan untuk masalah ketinggian garis sayangnya agak menjengkelkan: Saya menggunakan karakter bermasalah yang saya temukan dan gunakan set-fontset-fontuntuk mengaturnya ke font / ukuran yang tidak mempengaruhi ketinggian garis. Kode untuk melakukan ini tersedia dalam konfigurasi saya , tetapi itu jelek dan masih belum sempurna. Jika ada yang punya solusi yang lebih baik saya akan tertarik mendengarnya.

shosti
sumber
1
Saya pikir pendekatan yang lebih sederhana mungkin menggunakan font-unicode , seperti dalam jawaban saya; apakah itu bekerja untukmu?
Kirill
@ Kirill: unicode-fonts terlihat sangat menarik, tapi saya tidak yakin itu akan menyelesaikan masalah khusus ini tanpa tweaking yang signifikan (saya belum mencobanya, jadi saya bisa salah). Masalah dasarnya adalah font yang berbeda dengan ukuran yang sama memiliki ketinggian baris yang berbeda, sehingga setiap font harus di-tweak sampai memiliki (kurang-lebih) tinggi baris yang sama. unicode-fonts sepertinya tidak mudah untuk mengubah ukuran font.
shosti
Ya, saya pikir itu benar, tetapi itu membuatnya mudah untuk memilih font untuk seluruh blok karakter, jadi Anda tidak perlu mencari sendiri masing-masing karakter secara manual.
Kirill
6

Saya menggunakan agda-mode dengan banyak simbol matematika dan memiliki masalah yang sama. Dulu menjadi satu-satunya solusi nyata adalah seperti yang disarankan @shosti: mengkustomisasi pemetaan font. Dalam kasus saya, saya harus menonaktifkan sejumlah font karena walaupun saya telah menginstal font dengan mesin terbang tertentu, emacs akan sering memilih yang salah (menampilkan kotak). Tampaknya lebih buruk di OSX tapi saya sudah melihatnya di Linux juga. Jadi menginstal font yang tepat saja tidak cukup.

Apa yang saya lakukan sekarang adalah menggunakan paket unicode-font Roland Walker yang sangat baik . (Saya akan merekomendasikan menginstalnya melalui MELPA.) Ini cukup banyak menghilangkan masalah ini sepenuhnya.

Saya memasukkan ini ke file init saya:

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

Saya menggunakan PragmataPro secara default tetapi font lain dengan cakupan yang baik akan berfungsi juga dan Anda dapat menyesuaikan lebih lanjut dengan paket jika diperlukan.

darinmorrison
sumber
4

Saya sudah memiliki masalah ini dalam pertanyaan yang belum terjawab berbeda di sini . Saya akan mengharapkan font yang berbeda pada ukuran yang sama memiliki ketinggian yang sama, tetapi sepertinya tidak demikian, jadi saya akan menunjukkan pendekatan ad-hoc saya untuk memperbaikinya.

Mengesampingkan aksen, dan hanya berfokus pada karakter biasa, font yang berbeda diperlukan untuk menampilkan semua karakter yang berbeda hanya karena beberapa font menghilangkan seluruh blok karakter yang ada pada font lain. Untuk memastikan bahwa karakter yang tidak umum (seperti "𝚫") memiliki setidaknya satu font untuk mereka, instal font seperti Symbola, dan lihat daftar font di readme dari paket unicode-fonts .

Jika Anda menginstal paket unicode-fontsdan sejumlah font yang bagus, semua karakter harus didukung, tetapi beberapa akan menampilkan ketinggian yang salah di emacs.

Misalkan Monaco memiliki ketinggian yang tidak tepat, tetapi Symbola tampaknya memiliki ketinggian yang tepat untuk simbol matematika (seperti SUBSET OF ATAU SAMA DENGAN UAL; gunakan C-x 8 RETatau insert-charuntuk menguji karakter yang berbeda.). Dalam kasus saya, tidak menggunakan Monako, Simbol Noto Sans dan Simbol Apple sudah cukup; satu font yang bagus untuk saya adalah DejaVu Sans Mono.

Hal pertama adalah Anda bisa melarang unicode-fontsmenggunakan Monako dengan menambahkannya ke unicode-fonts-skip-fonts; font apa pun yang dipilih selanjutnya mungkin memiliki ketinggian yang tepat. Atau, Anda dapat meminta unicode-fontsuntuk menggunakan font tertentu untuk blok Unicode (seperti Operator Matematika; di sini adalah daftar semua blok ) dengan memodifikasi entri unicode-fonts-block-font-mapping.

Yang kedua adalah Anda dapat dengan mudah melakukan ini secara manual untuk serangkaian karakter yang sangat tepat dengan menggunakan set-fontset-font. Jika Symbola adalah font yang bagus untuk simbol matematika (dalam hal ini jangkauan 0x2100..0x23ff), yang berikut ini akan berfungsi:

(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"))))

Rentang lainnya yang saya butuhkan untuk memodifikasi sendiri adalah 2000..206f, 27c0..27ff, 2900..2bff, 1d400..1d7ff.

Akhirnya, tidak perlu mencari karakter yang salah konfigurasi dengan tangan. Dengan asumsi unicode-fontsdiinstal, fungsi berikut akan menghasilkan daftar semua karakter dengan ketinggian yang salah:

(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))))

Sebagai contoh:

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

lalu

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

akan menunjukkan semua simbol matematika yang buruk. Anda kemudian dapat memeriksa dengan font mana mereka ditampilkan, dan mengubahnya.

Saya memiliki OS X 10.9.5, jadi pengaturan font saya kemungkinan akan berbeda dari milik Anda. Tidak perlu menginstal unicode-fonts; adalah mungkin untuk secara manual menentukan pilihan font pilihan Anda sepenuhnya melalui set-fontset-fontsetiap kali Anda menemukan bahwa pilihan default emacs tidak berfungsi dengan baik.

PS Ada alternatif: ketika font secara konsisten terlalu besar / kecil, Anda dapat menambahkan entri face-font-rescale-alistuntuk memberitahu emacs untuk selalu mengalikan ukuran font itu dengan faktor, katakanlah, 0,95, seperti:

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

Ketika saya mencoba ini, itu tidak berfungsi dengan baik (laporan bug saya ada di sini ), tetapi ini juga merupakan pendekatan yang mungkin.

Kirill
sumber
Saran tentang set-fontset-fonttampaknya satu-satunya yang diperlukan sebenarnya. Saya hanya perlu mengevaluasi, misalnya, (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")pada pembuatan bingkai ( window-setup-hook; untuk membuatnya bekerja dengan emacs --daemon), dan menginstal paket yang ttf-ancient-fonts menampilkan Symbola di bawah Debian .
kesembilan
2

Ini adalah bug; itu diperbaiki di bagasi. Masalah ini disebabkan oleh informasi ketinggian garis yang buruk pada font TeX, yang kebetulan menjadi penyebab Emacs kembali jika tidak dapat menemukan karakter.

Utas bug pada emacs-bug memiliki lebih banyak info.

Sejuk
sumber