Altura de línea con caracteres unicode

23

Algunos caracteres Unicode hacen que la línea en la que se muestran sea bastante grande. Por ejemplo, un acento grave "̀" agrega alrededor de 2.5 líneas de espacio arriba y abajo. Otros caracteres que causan este comportamiento incluyen la letra griega "ϕ" (phi) o el subconjunto igual a "⫅". Otros caracteres como mapas a "⤇" agregan solo alrededor de 0.5 líneas a cada lado.

Me encontré con este problema al leer la fuente de la julia-mode.elcual contiene una gran cantidad de tales caracteres para la sustitución de LaTeX.

¿Por qué ocurre esto y se puede solucionar?

Editar: estoy usando Ubuntu 14.04 LTS con Emacs 24.3.1. De manera predeterminada, uso la fuente "Ubuntu Mono 13", pero a veces se usan otras fuentes para mostrar caracteres. No he instalado ningún paquete para administrar explícitamente Unicode, y este problema es reproducible usando el comando emacs -Q.

Patrick Steele
fuente
3
Esto probablemente esté relacionado con las fuentes que ha instalado. El uso de una fuente con un buen soporte Unicode integrado (por ejemplo, DejaVu Sans Mono) podría ayudar.
Chris
Edite su pregunta y agregue información sobre su sistema operativo, su versión de Emacs y las fuentes que utiliza para Emacs.
lunaryorn
Mencione también si usa algún paquete / comando para configurar Unicode. O simplemente estás usando lo que salió de la caja.
Malabarba
De acuerdo con la fuente: uso DejaVu Sans Mono y los caracteres unicode se renderizan sin ninguna diferencia visible en el espaciado de línea vertical.
Dan
De hecho, tengo instalado DejaVu Sans Mono, y se usa para algunos caracteres, por ejemplo, "ϛ". Por lo tanto, parece estar seleccionando una fuente diferente para Phi, a saber, "xft: -unknown-Latin Modern Math-normal-normal-normal- -17- - - - * - 0-iso10646-1".
Patrick Steele

Respuestas:

7

Esto ocurre porque Emacs usa diferentes fuentes para diferentes partes del juego de caracteres Unicode. Puede verificar qué fuente se está utilizando colocando el cursor sobre un carácter y presionando C-u C-x =. Por ejemplo, con mi configuración sobre un carácter ASCII obtengo nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), pero sobre un ⧺ obtengo nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(en otras palabras, está usando Consolas para ASCII y Symbola para algunos caracteres especiales). Las diferentes fuentes tienen diferentes alturas, y Emacs siempre dará suficiente espacio en la altura de la línea para mostrar la fuente más alta. Por defecto, Emacs intentará usar fuentes dependientes del sistema que funcionen, pero esto a menudo conduce a resultados feos.

La solución que he encontrado al problema de la altura de la línea es desafortunadamente bastante molesta: reviso los caracteres problemáticos que encuentro y uso set-fontset-fontpara establecerlos en una fuente / tamaño que no afecte la altura de la línea. El código para hacer esto está disponible en mi configuración , pero es feo y todavía no es perfecto. Si alguien tiene una mejor solución, me interesaría escucharla.

shosti
fuente
1
Creo que un enfoque más simple podría ser usar fuentes unicode , como en mi respuesta; ¿Eso funciona para ti?
Kirill
@Kirill: las fuentes unicode se ven realmente interesantes, pero no estoy seguro de que resuelva este problema específico sin ajustes significativos (no lo he probado, así que podría estar equivocado). El problema raíz es que las diferentes fuentes con el mismo tamaño tienen diferentes alturas de línea, por lo que cada fuente debe ajustarse hasta que tenga (aproximadamente) la misma altura de línea. Unicode-fonts no parece que facilite ajustar los tamaños de fuente.
shosti
Sí, creo que eso es cierto, pero facilita la selección de fuentes para bloques enteros de caracteres, por lo que no necesita buscar los caracteres individuales usted mismo de forma completamente manual.
Kirill
6

Uso el modo agda con muchos símbolos matemáticos y he tenido el mismo problema. Solía ​​ser la única solución real, como sugiere @shosti: personalizar las asignaciones de fuentes. En mi caso, tuve que deshabilitar varias fuentes porque, aunque tenía las fuentes instaladas con glifos particulares definidos, emacs a menudo elegía la incorrecta (mostrando cuadros). Parecía ser peor en OSX pero también lo he visto en Linux. Así que tener las fuentes correctas instaladas no fue suficiente.

Lo que hago ahora es usar el excelente paquete de fuentes unicode de Roland Walker . (Recomendaría instalarlo a través de MELPA). Esto prácticamente ha eliminado el problema por completo.

Puse esto en mi archivo de inicio:

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

Uso PragmataPro de manera predeterminada, pero cualquier otra fuente con buena cobertura también funcionará y puede personalizar aún más las cosas con el paquete si es necesario.

Darinmorrison
fuente
4

Ya tuve este problema en una pregunta diferente sin respuesta aquí . Esperaría que las diferentes fuentes del mismo tamaño tengan las mismas alturas, pero este no parece ser el caso, por lo que mostraré mi enfoque ad-hoc para solucionar esto.

Dejando a un lado los acentos y enfocándose solo en caracteres simples, se necesitan diferentes fuentes para mostrar todos los diferentes caracteres simplemente porque algunas fuentes omiten bloques enteros de caracteres que están presentes en otras fuentes. Para asegurarse de que los caracteres poco comunes (como "𝚫") tengan al menos una fuente para ellos, instale una fuente como Symbola y vea la lista de fuentes en el archivo Léame del paquete de fuentes Unicode .

Si instala el paquete unicode-fontsy varias fuentes buenas, todos los caracteres deberían ser compatibles, pero algunos tendrán alturas mostradas incorrectamente en emacs.

Suponga que Mónaco tiene alturas incorrectas, pero Symbola parece tener alturas correctas para símbolos matemáticos (como SUBSET OF OR IGUAL TO ⊆; use C-x 8 RETo insert-charpara probar diferentes caracteres). En mi caso, no usar Monaco, Noto Sans Symbols y Apple Symbols fue suficiente; Una buena fuente para mí fue DejaVu Sans Mono.

Lo primero es que puede prohibir el unicode-fontsuso de Mónaco agregándolo a unicode-fonts-skip-fonts; cualquier fuente que seleccione a continuación podría tener la altura correcta. Alternativamente, puede indicar unicode-fontsque use una fuente específica para un bloque Unicode (como operadores matemáticos; aquí hay una lista de todos los bloques ) modificando una entrada de unicode-fonts-block-font-mapping.

El segundo es que puede hacerlo fácilmente manualmente para un conjunto de caracteres muy preciso mediante el uso set-fontset-font. Si Symbola es una buena fuente para símbolos matemáticos (en este caso, el rango 0x2100..0x23ff), lo siguiente debería funcionar:

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

Otros rangos que necesitaba para modificar mí eran 2000..206f, 27c0..27ff, 2900..2bff, 1d400..1d7ff.

Finalmente, no es necesario buscar a mano caracteres mal configurados. Suponiendo que unicode-fontsesté instalado, la siguiente función generará una lista de todos los caracteres con alturas incorrectas:

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

Por ejemplo:

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

y entonces

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

mostraría todos los malos símbolos matemáticos. Luego puede examinar con qué fuente se muestran y cambiarla.

Tengo OS X 10.9.5, por lo que la configuración de mi fuente probablemente sea diferente a la tuya. No es necesario instalarlo unicode-fonts; es posible especificar manualmente sus opciones de fuente preferidas completamente set-fontset-fontcuando encuentre que las opciones predeterminadas de emacs no funcionan bien.

PD Hay una alternativa: cuando una fuente es demasiado grande / pequeña, puede agregar una entrada face-font-rescale-alistpara decirle a emacs que siempre multiplique el tamaño de esa fuente por un factor de, digamos, 0.95, así:

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

Cuando intenté esto, no funcionó bien (mi informe de error está aquí ), pero este también es un enfoque posible.

Kirill
fuente
El consejo sobre set-fontset-fontparece ser el único requerido en realidad. Solo tuve que evaluar, por ejemplo, (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")en la creación de marcos ( window-setup-hook; para que funcione emacs --daemon), e instalar el paquete ttf-ancient-fonts con Symbola en Debian .
nberth
2

Esto es un error Se fija en el maletero. El problema es causado por información incorrecta de altura de línea en las fuentes TeX, que resultan ser las que Emacs recurre si no puede encontrar un carácter.

El hilo de errores en emacs-bug tiene mucha más información.

Clemente
fuente