Почему высота шрифта изменяется при выделении жирным шрифтом?

9

Это так раздражает...

Когда любой текст в строке изменяет свою грань так, что текст выделяется жирным шрифтом, высота строки увеличивается (я полагаю) на один пиксель. Лучше всего показать с изображением:

введите описание изображения здесь

Почему это? Как мне это предотвратить?


По запросу информация о платформе:

  • Sid (нестабильный) Debian GNU / Linux на amd64
  • Emacs использует libgtk-3.so.0 (gtk 3.14.5) на XFCE 4.12

Я пробовал следующие шрифты в 8pt, 9pt, 10pt и 11pt:

  • DejaVu Sans Mono
  • DejaVu Sans
  • DejaVu Serif
  • Droid Sans Mono
  • Освобождение Моно

Проблема возникает только с DejaVu Sans Mono и DejaVu Sans, и только в 9pt и 10pt. (Изображение выше показывает DejaVu Sans Mono-9.)

эдам
источник
2
Вы должны посмотреть на атрибуты лица defunexample, прежде чем ставить пробел, а затем снова на каждое слово после того, как ставите пробел между defun и example . Это делается путем помещения курсора в нужную точку и последующего ввода C-u C-x =. Вы, вероятно, обнаружите, что либо лицо, влияющее на defun, либо пример, влияющий на лицо, имеют различные атрибуты, которые отвечают за поведение, которое вы видите, например, кроме основного цвета переднего плана. Атрибуты лица могут быть настроены пользователем.
юрист
Не могли бы вы добавить свою операционную систему и оконный менеджер к вашему вопросу и некоторую информацию о том, какой графический интерфейс использует ваш Emacs (например, Gtk2, Gtk3 и т. Д.)?
lunaryorn
@lawlist: спасибо, парень. С пробелом к ​​нему применен font-lock-function-name-face, который имеет неопределенную высоту (поэтому я предполагаю, что по умолчанию?). Без пробела лицо не применяется (поэтому, опять же, я предполагаю, что по умолчанию?) В моей теме по умолчанию установлено значение :height 90(9pt).
Эдам
@lawlist: еще несколько расследований .... в теме, если я удаляю / добавляю / удаляю / добавляю :weight boldиз font-lock-function-name-face(и повторно выполняю команду темы custom-theme-set-faces), я могу видеть изменение высоты defunстроки на 1px! Это определенно смелый атрибут, который вызывает это, я думаю.
Эдам
Я думаю, основываясь на ваших комментариях, будет то, что выбранное вами семейство шрифтов имеет разную высоту для жирных атрибутов, поэтому его нельзя изменить, если вы не уменьшите его вручную - методом проб и ошибок путем медленного уменьшения размера точки. В качестве альтернативы выберите семью, которая не меняет рост при использовании жирного шрифта. Лично я больше не использую жирный шрифт или подчеркивание в любой из моих пользовательских тем по ряду причин, связанных с визуальными эффектами в буфере - когда я создаю подчеркивание для текущей строки, это делается с наложением. Для жирного, я просто использую яркие цвета - например, пурпурный, желтый, ...
lawlist

Ответы:

2

Высота шрифта изменяется в DejaVu при этом размере точки, потому что информация о высоте шрифта между двумя обычным шрифтом и полужирным шрифтом отличается, когда она должна быть одинаковой.

Используемый мной шрифт DejaVu Sans Mono 10 не изменяет высоту шрифта между нормальным и жирным шрифтом. Я установил это в моем .emacs с(set-frame-font "DejaVu Sans Mono-10")

Так что у вас есть с чем сравнить информацию о шрифте "DejaVu Sans 10" через (font-info на Emacs 25):

(font-info "DejaVu Sans Mono-10")
["-unknown-DejaVu Sans Mono-normal-normal-normal-*-13-*-*-*-m-0-iso10646-1" 
"DejaVu Sans Mono:pixelsize=13:foundry=unknown:weight=normal:slant=normal:
width=normal:spacing=100:scalable=true" 13 17 0 0 0 8 13 4 8 8 
"/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf" (opentype ((DFLT ...) )))]

РЕДАКТИРОВАТЬ на основе последующей информации:

В приведенной выше информации о шрифте я показываю высоту шрифта 17, а вы сообщаете о высоте 15 (обычный) или 16 (жирный). В emacs 25 после этих 3 0 есть дополнительная информация о шрифте, в частности, спуск шрифта равен 4.

Хотя у меня нет проблем в Emacs 24 или 25 с DejaVu Sans Mono и вариантом Bold, самое простое - использовать шрифт и размер, которые не меняют ширину (как показано в font-info) между normal и bold или что-то другое, чем DejaVu.

Что касается того, что вызывает это, это может быть одна из ваших библиотек (мой gtk - libgtk-x11-2.0.so.0), но я сомневаюсь, что это будет именно эта библиотека. Также сомневаюсь, что это файл или пакет ttf. Скорее всего, это рендеринг freetype (у меня есть libfreetype.so.6). Поскольку DejaVu масштабируется так же, как и другие шрифты, которые работают на вас, ошибка вычисления, возникшая в результате написания DejaVu, объяснит, почему они работают в некоторых размерах, но не в других.

Чтобы проверить, является ли проблема специфичной для Emacs или нет, вы можете вызвать два окна терминала, одно с жирным приглашением, а другое без, и сравнить межстрочный интервал на них. Если он отличается от Emacs, то это связано с рендерингом и / или шрифтом.

Если вы скомпилировали emacs, там может что-то происходить.

скалистый
источник
Это не сработало ... (я использовал DejaVu Sans Mono-9BTW). Я
обновлю
Режим строки шрифта такой же. Mono 10 демонстрирует то же поведение, но 8 и 11pr - нет! Это должно быть как-то связано с рендерингом шрифта и возвращением другой высоты строки для обычного и жирного шрифта. Использует ли Emacs fontconfig?
Эдам
1
Emacs не использует fontconfig и обычно довольно уникален, когда дело доходит до выбора глифа.
Васамаса
(font-info "DejaVu Sans Mono-10")дает мне ["-unknown-DejaVu Sans Mono-normal-normal-normal-*-13-*-*-*-m-0-iso10646-1" "DejaVu Sans Mono:pixelsize=13:foundry=unknown:weight=normal:slant=normal:width=normal:spacing=100:scalable=true" 13 15 0 0 0]. Я также fonts-dejavu-coreустановил, а также ttf-dejavu-core. Они оба предоставляют DejaVuSansMono.ttf(в разных каталогах, но это идентичные файлы, поэтому я не вижу, что это имеет значение). Я также получаю Height: 98от лица (при использовании DajaVu Sans Mono-10, который демонстрирует вышеуказанную проблему). Я открыт для любых дополнительных предложений! :)
edam
Обратите внимание, что некоторые параметры вашего шрифта отличаются. У меня есть «13 17 ...», а у вас «13 15 ..». И если вы получите информацию о шрифте справки для функции, вы увидите, что первое отличие 17 (я) против 15 (вы) - это высота. Так что попробуйте изменить высоту до 17.
Скалистые