Unicode karakterlerle satır yüksekliği


23

Bazı Unicode karakterler, görüntülendikleri çizginin oldukça büyük olmasına neden olur. Örneğin, "̀" mezar aksanı bunun üstünde ve altında yaklaşık 2,5 satırlık boşluk ekler. Bu davranışa neden olan diğer karakterler, Yunanca "ϕ" (phi) harfini veya alt-küme eşit "letter" harflerini içerir. Haritalar'dan "maps" gibi diğer karakterler her iki tarafa da sadece 0,5 satır ekler.

julia-mode.elLaTeX değiştirme için bu kadar çok sayıda karakter içeren kaynağını okurken bu problemle karşılaştım .

Bu neden oluyor ve düzeltilebilir mi?

Düzenleme: Emacs 24.3.1 ile Ubuntu 14.04 LTS kullanıyorum. Varsayılan olarak "Ubuntu Mono 13" yazı tipini kullanıyorum, ancak bazen diğer yazı tipleri karakterleri görüntülemek için kullanılıyor. Unicode'u açıkça yönetmek için hiçbir paket yüklemedim ve bu sorun komut kullanılarak yeniden üretilebiliyor emacs -Q.


3
Bu muhtemelen yüklediğiniz yazı tipleriyle ilgilidir. İyi bir Unicode desteğine sahip yerleşik bir font kullanmak (örneğin, DejaVu Sans Mono) yardımcı olabilir.
Chris

Lütfen sorunuzu düzenleyin ve işletim sisteminiz, Emacs sürümünüz ve Emacs için kullandığınız fontlar hakkında bilgi ekleyin.
lunaryorn

Ayrıca, unicode'u ayarlamak için herhangi bir paket / komut kullanıp kullanmadığınızı da belirtin. Ya da sadece kutudan çıkanları kullanıyorsun.
Malabarba

Yazı tipini kabul ediyorum: DejaVu Sans Mono kullanıyorum ve unicode karakterler dikey çizgi aralıklarında herhangi bir fark gözetmeden oluşturuyorlar.
Dan

Aslında DejaVu Sans Mono'yu kurdum ve bazı karakterler için kullanılıyor, örneğin "ϛ". Öyleyse, Phi için farklı bir yazı tipi seçiyor gibi görünüyor, "xft: -unknown-Latin Modern Matematik-normal-normal -normal- -17- - - - - * - 0-iso10646-1".
Patrick Steele

Yanıtlar:


7

Bunun nedeni, Emacs'in Unicode karakter kümesinin farklı bölümleri için farklı fontlar kullanmasıdır. İmleci bir karakterin üzerine getirip tuşuna basarak hangi fontun kullanıldığını doğrulayabilirsiniz C-u C-x =. Örneğin, bir ASCII karakteri üzerindeki yapılandırmamla alıyorum nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), ancak over üzerinden alıyorum nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(başka bir deyişle, bazı özel karakterler için ASCII için Consolas ve Symbola kullanıyor). Farklı fontların farklı yükseklikleri vardır ve Emacs her zaman en yüksek fontu görüntülemek için satır yüksekliğinde yeterli alan sağlar. Varsayılan olarak, Emacs çalışan sistem bağımlı yazı tiplerini kullanmaya çalışır, ancak bu genellikle çirkin sonuçlara yol açar.

Satır yüksekliği sorununa bulduğum çözüm ne yazık ki can sıkıcı bir durum: Bunları set-fontset-fontsatır yüksekliğini etkilemeyen bir yazı tipine / boyutuna ayarlamak için bulduğum ve kullandığım sorunlu karakterleri inceliyorum. Bunu yapacak kod konfigürasyonumda mevcut , ancak çirkin ve hala mükemmel değil. Herhangi birinin daha iyi bir çözümü varsa, duymak isterim.


1
Sanırım daha basit bir yaklaşım, cevabımdaki gibi unicode-fontları kullanmak olabilir ; Bu senin için uygun mu?
Kirill

@Killill: unicode-fontları gerçekten ilginç görünüyor, ancak bu belirli sorunu önemli bir titreme olmadan çözeceğinden emin değilim (denemedim, bu yüzden yanlış olabilirim). Kök problemi, aynı boyuta sahip farklı fontların farklı satır yüksekliklerine sahip olmalarıdır, bu yüzden her fontun (yaklaşık olarak) aynı satır yüksekliğine kadar ince ayarlanması gerekir. unicode-fontları font boyutlarını ayarlamayı kolaylaştırıyor gibi görünmüyor.
shosti

Evet, bence bu doğru, ancak tüm karakter blokları için font seçmeyi kolaylaştırıyor, böylece bireysel karakterleri kendiniz tamamen manuel olarak aramanıza gerek kalmıyor.
Kirill

6

Agda-mode'u çok fazla matematiksel sembolle kullanıyorum ve aynı problemi yaşadım. Kullanılan tek gerçek çözüm, shosti'nin önerdiği gibi oldu: font eşlemelerini kişiselleştirme. Benim durumumda, belirli yazı karakterlerini tanımlanmış gliflerle yüklü yazı tipleri olsa bile, emacs genellikle yanlış olanı seçerdi (kutuları görüntüleyerek). OSX'te daha kötü görünüyordu ama ben de Linux'ta gördüm. Yani doğru yazı tiplerini yüklemeniz yeterli değildi.

Şimdi yaptığım, Roland Walker'ın mükemmel unicode-font paketini kullanmak. (MELPA aracılığıyla yüklemenizi tavsiye ederim.) Bu, sorunu tamamen ortadan kaldırdı.

Bunu init dosyama koydum:

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

Varsayılan olarak PragmataPro'yu kullanıyorum, ancak kapsamı iyi olan başka bir font da işe yarayacak ve gerekirse paketleri daha da özelleştirebilirsiniz.


4

Bu problemi daha önce cevaplanmamış bir soruda burada yaşadım . Aynı büyüklükte farklı yazı tiplerinin aynı yükseklikte olmasını beklerdim, ancak durum böyle görünmüyor, bu yüzden geçici olarak bu yaklaşımı düzeltmeye yönelik yaklaşımımı göstereceğim.

Vurguları bir kenara bırakmak ve sadece düz karakterlere odaklanmak için, farklı yazı tiplerini görüntülemek için farklı yazı tipleri gerekir çünkü bazı yazı tipleri diğer yazı tiplerinde bulunan tüm karakter bloklarını çıkarır. Yaygın olmayan karakterlerin ("𝚫" gibi) onlar için en az bir yazı tipine sahip olduğundan emin olmak için, Symbola gibi bir yazı tipi yükleyin ve yazı tipi listesini unicode-yazı tipi paketinin benioku bölümüne bakın .

Paketi unicode-fontsve çok sayıda iyi yazı tipini yüklerseniz , tüm karakterlerin desteklenmesi gerekir, ancak bazılarında emacs'de yanlış görüntülenen yükseklikler olacaktır.

Monako'nun yanlış yüksekliklere sahip olduğunu varsayalım, ancak Symbola matematiksel semboller için doğru yüksekliklere sahip görünüyor (örneğin, farklı karakterleri test etmek C-x 8 RETveya kullanmak insert-chariçin SUBSET OF OR EŞİT; ). Benim durumumda Monaco kullanmamak, Noto Sans Sembolleri ve Elma Sembolleri yeterliydi; Benim için iyi bir yazı tipi DejaVu Sans Mono oldu.

İlk olarak, unicode-fontsMonaco'yu ekleyerek kullanmayı yasaklayabilirsiniz unicode-fonts-skip-fonts; Bir sonraki seçtiği yazı tipinden hangisi doğru yüksekliğe sahip olabilir. Alternatif olarak, bir girişini değiştirerek bir unicode-fontsUnicode bloğu (örneğin, Matematiksel Operatörler; burada tüm blokların bir listesidir ) için belirli bir font kullanmayı söyleyebilirsiniz unicode-fonts-block-font-mapping.

İkincisi, bunu kullanarak çok hassas bir karakter kümesi için bunu el ile kolayca yapabilmenizdir set-fontset-font. Symbola matematiksel semboller için iyi bir font ise (bu durumda aralık 0x2100..0x23ff), aşağıdakiler çalışmalıdır:

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

Kendimi değiştirmek için gerekli diğer aralıkları vardı 2000..206f, 27c0..27ff, 2900..2bff, 1d400..1d7ff.

Son olarak, yanlış yapılandırılmış karakterleri elle aramak gerekli değildir. unicode-fontsYüklü farz edersek , aşağıdaki fonksiyon yanlış yüksekliğe sahip tüm karakterlerin bir listesini oluşturur:

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

Örneğin:

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

ve sonra

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

tüm kötü matematiksel sembolleri gösterirdi. Daha sonra hangi yazı tipiyle görüntülendiklerini inceleyebilir ve değiştirebilirsiniz.

Ben OS X 10.9.5 var, bu yüzden yazı tipi ayarları benimkinden farklı olurdu. Yüklemek gerekli değildir unicode-fonts; set-fontset-fontEmacs'in varsayılan seçeneklerinin işe yaramadığını tespit ettiğinizde tercih ettiğiniz yazı tipi seçeneklerini tamamen belirtmek mümkündür .

PS Bir alternatif var: bir font sürekli olarak çok büyük / küçük olduğunda, face-font-rescale-alistemacs'a, o fontun boyutunu daima 0.95 gibi bir faktörle çarpmasını söylemek için bir giriş ekleyebilirsiniz :

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

Bunu denediğimde pek işe yaramadı (hata raporum burada ), ama bu da olası bir yaklaşım.


Hakkında tavsiye set-fontset-fontaslında gerekli olan tek görünüyor. Sadece örneğin (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")çerçeve oluşturma üzerine ( window-setup-hook; çalışmasını sağlamak için emacs --daemon) değerlendirmek ve ttf-ancient-fonts Symbola'yı içeren paketi Debian'ın altına koymak zorunda kaldım .
nberth

2

Bu bir hatadır; bagajda sabitlenir. Bu sorun, Emacs'in bir karakter bulamaması durumunda geri düşecekleri olan TeX yazı tipleri hakkındaki hatalı satır yüksekliği bilgilerinden kaynaklanıyor.

Emacs-bug'daki bug thread'de çok daha fazla bilgi var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.