Altezza della linea con caratteri unicode


23

Alcuni caratteri Unicode fanno sì che la linea su cui sono visualizzati sia piuttosto grande. Ad esempio, un accento grave "̀" aggiunge circa 2,5 linee di spazio sopra e sotto di esso. Altri caratteri che causano questo comportamento includono la lettera greca "ϕ" (phi) o il sottoinsieme uguale "⫅". Altri caratteri come le mappe da "⤇" aggiungono solo circa 0,5 righe su entrambi i lati.

Mi sono imbattuto in questo problema durante la lettura della fonte julia-mode.elche contiene un gran numero di tali caratteri per la sostituzione di LaTeX.

Perché questo si verifica e può essere corretto?

Modifica: sto usando Ubuntu 14.04 LTS con Emacs 24.3.1. Per impostazione predefinita, utilizzo il carattere "Ubuntu Mono 13", ma altri caratteri vengono talvolta utilizzati per visualizzare i caratteri. Non ho installato pacchetti per gestire esplicitamente unicode e questo problema è riproducibile usando il comando emacs -Q.


3
Ciò è probabilmente correlato ai caratteri che hai installato. L'uso di un font con un supporto Unicode decente integrato (ad es. DejaVu Sans Mono) potrebbe essere d'aiuto.
Chris,

Modifica la domanda e aggiungi informazioni sul tuo sistema operativo, sulla tua versione di Emacs e sui caratteri che usi per Emacs.
lunaryorn,

Indica anche se usi qualsiasi pacchetto / comando per configurare unicode. O stai semplicemente usando tutto ciò che è venuto fuori dalla scatola.
Malabarba,

Concordo sul carattere: utilizzo DejaVu Sans Mono e il rendering dei caratteri unicode senza alcuna differenza visibile nella spaziatura delle linee verticali.
Dan

In realtà ho installato DejaVu Sans Mono, ed è usato per alcuni personaggi, ad esempio "ϛ". Quindi sembra che stia selezionando un font diverso per Phi, vale a dire "xft: -sognato-latino matematica moderna-normale-normale-normale- -17- - - - * - 0-iso10646-1".
Patrick Steele,

Risposte:


7

Ciò si verifica perché Emacs utilizza caratteri diversi per parti diverse del set di caratteri Unicode. È possibile verificare quale tipo di carattere viene utilizzato posizionando il cursore su un carattere e premendo C-u C-x =. Ad esempio, con la mia configurazione su un carattere ASCII ottengo nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), ma su un ⧺ ottengo nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(in altre parole, utilizza Consolas per ASCII e Symbola per alcuni caratteri speciali). Caratteri diversi hanno altezze diverse ed Emacs darà sempre spazio sufficiente all'altezza della linea per visualizzare il carattere più alto. Per impostazione predefinita, Emacs proverà a utilizzare caratteri dipendenti dal sistema che funzionano, ma questo spesso porta a risultati brutti.

La soluzione che ho trovato per il problema dell'altezza della linea è purtroppo piuttosto fastidiosa: passo attraverso i caratteri problematici che trovo e utilizzo set-fontset-fontper impostarli su un carattere / dimensione che non influisce sull'altezza della linea. Il codice per farlo è disponibile nella mia configurazione , ma è brutto e ancora non perfetto. Se qualcuno ha una soluzione migliore sarei interessato a sentirlo.


1
Penso che un approccio più semplice potrebbe essere quello di utilizzare i caratteri Unicode , come nella mia risposta; Funziona per te?
Kirill,

@Kirill: i caratteri unicode sembrano davvero interessanti, ma non sono sicuro che risolveranno questo problema specifico senza modifiche significative (non l'ho provato, quindi potrei sbagliarmi). Il problema alla radice è che caratteri diversi con la stessa dimensione hanno altezze di linea diverse, quindi ogni carattere deve essere modificato fino a quando non ha (approssimativamente) la stessa altezza di linea. i caratteri unicode non sembrano così facili da modificare le dimensioni dei caratteri.
shosti,

Sì, penso sia vero, ma semplifica la selezione di caratteri per interi blocchi di caratteri, quindi non è necessario cercare manualmente i singoli caratteri.
Kirill,

6

Uso la modalità agda con molti simboli matematici e ho avuto lo stesso problema. Utilizzato per essere l'unica vera soluzione era come suggerisce @shosti: personalizzare i mapping dei caratteri. Nel mio caso, ho dovuto disabilitare un certo numero di caratteri perché anche se avevo caratteri installati con determinati glifi definiti, emacs sceglieva spesso quello sbagliato (mostrando caselle). Sembrava essere peggio su OSX ma l'ho visto anche su Linux. Quindi non basta avere i caratteri giusti installati.

Quello che faccio ora è usare l'eccellente pacchetto unicode-fonts di Roland Walker . (Consiglierei di installarlo tramite MELPA.) Questo ha praticamente eliminato del tutto il problema.

Ho inserito questo nel mio file init:

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

Uso PragmataPro per impostazione predefinita, ma funzionerà anche qualsiasi altro carattere con una buona copertura e, se necessario, è possibile personalizzare ulteriormente le cose con il pacchetto.


4

Ho già avuto questo problema in un'altra domanda senza risposta qui . Mi aspetto che caratteri diversi della stessa dimensione abbiano le stesse altezze, ma questo non sembra essere il caso, quindi mostrerò il mio approccio ad hoc per risolvere questo problema.

Lasciando da parte gli accenti e concentrandosi solo su caratteri semplici, sono necessari caratteri diversi per visualizzare tutti i diversi personaggi semplicemente perché alcuni caratteri omettono interi blocchi di caratteri presenti in altri caratteri. Per assicurarsi che i caratteri non comuni (come "𝚫") abbiano almeno un carattere per loro, installare un carattere come Symbola e vedere l'elenco dei caratteri nel file Leggimi del pacchetto unicode-fonts .

Se installi il pacchetto unicode-fontse un certo numero di buoni caratteri, tutti i caratteri dovrebbero essere supportati, ma alcuni avranno altezze di visualizzazione errate in emacs.

Supponiamo che Monaco abbia altezze errate, ma Symbola sembra avere altezze corrette per i simboli matematici (come SUBSET OF OR EQUAL TO ⊆; usa C-x 8 RETo insert-charper testare personaggi diversi). Nel mio caso, non usare Monaco, Noto Sans Symbols e Apple Symbols è stato sufficiente; un buon carattere per me era DejaVu Sans Mono.

La prima cosa è che puoi proibire unicode-fontsdi usare Monaco aggiungendolo a unicode-fonts-skip-fonts; qualunque sia il carattere che seleziona dopo potrebbe avere la giusta altezza. In alternativa, puoi dire unicode-fontsdi usare un font specifico per un blocco Unicode (come Operatori matematici; ecco un elenco di tutti i blocchi ) modificando una voce di unicode-fonts-block-font-mapping.

Il secondo è che puoi farlo facilmente manualmente per un set di caratteri molto preciso usando set-fontset-font. Se Symbola è un buon carattere per simboli matematici (in questo caso l'intervallo 0x2100..0x23ff), dovrebbe funzionare quanto segue:

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

Altri campi di cui avevo bisogno di modificare me erano 2000..206f, 27c0..27ff, 2900..2bff, 1d400..1d7ff.

Infine, non è necessario cercare manualmente caratteri errati. Supponendo che unicode-fontssia installato, la seguente funzione genererà un elenco di tutti i caratteri con altezze errate:

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

Per esempio:

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

e poi

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

mostrerebbe tutti i cattivi simboli matematici. È quindi possibile esaminare il tipo di carattere con cui vengono visualizzati e modificarlo.

Ho OS X 10.9.5, quindi le mie impostazioni dei caratteri sarebbero probabilmente diverse dalle tue. Non è necessario installare unicode-fonts; è possibile specificare manualmente le tue scelte di carattere preferite interamente set-fontset-fontogni volta che scopri che le scelte di default di emacs non funzionano bene.

PS Esiste un'alternativa: quando un font è costantemente troppo grande / piccolo, puoi aggiungere una voce face-font-rescale-alistper dire a emacs di moltiplicare sempre la dimensione di quel font per un fattore, diciamo, 0,95, in questo modo:

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

Quando ho provato questo, non ha funzionato bene (la mia segnalazione di bug è qui ), ma questo è anche un possibile approccio.


Il consiglio su set-fontset-fontsembra l'unico richiesto in realtà. Ho dovuto solo valutare, ad esempio, la (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")creazione di frame ( window-setup-hook; per farlo funzionare emacs --daemon), e installare il pacchetto ttf-ancient-fonts con Symbola sotto Debian .
nberth,

2

Questo è un bug; è fissato nel bagagliaio. Il problema è causato da cattive informazioni sull'altezza della linea sui caratteri TeX, che sono quelli a cui Emacs ricorre se non riesce a trovare un personaggio.

Il thread di bug su emacs-bug ha molte più informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.