Dlaczego wysokość czcionki zmienia się po pogrubieniu?

9

To takie denerwujące ...

Kiedy dowolny tekst w linii ma zmienioną powierzchnię, tak że tekst jest pogrubiony, wysokość linii zwiększa się (zakładam) o jeden piksel. Najlepiej pokazuje to obraz:

wprowadź opis zdjęcia tutaj

Dlaczego to? Jak temu zapobiec?


Zgodnie z życzeniem informacje na platformie:

  • Debian GNU / Linux sid (niestabilny) na amd64
  • Emacs używa libgtk-3.so.0 (gtk 3.14.5) na XFCE 4.12

Próbowałem następujących czcionek na 8pt, 9pt, 10pt i 11pt:

  • DejaVu Sans Mono
  • DejaVu Sans
  • DejaVu Serif
  • Droid Sans Mono
  • Liberation Mono

Problem występuje tylko w przypadku DejaVu Sans Mono i DejaVu Sans i tylko w 9pt i 10pt. (Zdjęcie powyżej pokazuje DejaVu Sans Mono-9.)

ser edamski
źródło
2
Powinieneś spojrzeć na atrybuty twarzy defunexample przed umieszczeniem spacji, a następnie ponownie na każdym słowie po umieszczeniu spacji między defun i przykładem . Odbywa się to poprzez umieszczenie kursora w żądanym punkcie, a następnie pisanie C-u C-x =. Prawdopodobnie przekonasz się, że albo twarz wpływająca na odrzucenie, albo twarz wpływająca na przykład mają różne atrybuty odpowiedzialne za zachowanie, które widzisz - np. Inne niż tylko podstawowy kolor pierwszego planu. Użytkownik może dostosować atrybuty twarzy.
prawnik
Czy możesz dodać do swojego systemu operacyjnego i menedżera okien oraz informacje o interfejsie GUI używanym przez Emacsa (np. Gtk2, Gtk3 itp.)?
lunaryorn,
@lawlist: dzięki stary. Spacja ma zastosowaną funkcję font-lock-function-name-face, która ma nieokreśloną wysokość (więc zakładam, że jest domyślna?). Bez spacji nie zostanie zastosowana twarz (więc znów zakładam domyślną?) Domyślną wartością w moim motywie jest :height 90(9pkt).
edam
@lawlist: trochę więcej badań .... w temacie, jeśli usunę / dodam / usunę / dodam :weight boldz font-lock-function-name-face(i ponownie uruchomię polecenie motywu custom-theme-set-faces), mogę zobaczyć zmianę wysokości defunlinii o 1px! Myślę, że to zdecydowanie śmiały atrybut, który go powoduje.
edam
Domyślam się na podstawie twoich komentarzy, że wybrana przez ciebie rodzina czcionek ma inną wysokość pogrubionych atrybutów, więc nie można jej zmienić, chyba że ręcznie ją zmniejszysz - próbuj i popełniaj błędy, powoli zmniejszając rozmiar czcionki. Alternatywnie wybierz rodzinę, która nie zmienia wysokości po zastosowaniu pogrubienia. Osobiście nie używam pogrubienia ani podkreślenia w żadnym z moich niestandardowych motywów z różnych powodów związanych z efektami wizualnymi w buforze - kiedy tworzę podkreślenie dla bieżącej linii, robi się to z nakładką. Dla odważnych używam po prostu mocnych kolorów - np. Magenta, żółty, ...
prawnik

Odpowiedzi:

2

Wysokość czcionki zmienia się w DejaVu w tym rozmiarze, ponieważ informacje o wysokości czcionki między dwiema czcionkami normalnymi i pogrubionymi są różne, gdy powinny być takie same.

Używana przeze mnie czcionka DejaVu Sans Mono 10 nie zmienia wysokości czcionki między normalną a pogrubioną czcionką. Ustawiłem to w moich .emacs z(set-frame-font "DejaVu Sans Mono-10")

Więc masz coś do porównania, informacje o czcionce „DejaVu Sans 10” przez (font-info na 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 ...) )))]

EDYCJA na podstawie kolejnych informacji:

W powyższych informacjach o czcionce pokazuję wysokość czcionki 17, a raportujesz wysokość 15 (normalna) lub 16 (pogrubiona). W emacsie 25 po tych 3 0 znajdują się dodatkowe informacje o czcionce, w szczególności pochylenie czcionki to 4.

Chociaż nie mam problemu z Emacsem 24 lub 25 z DejaVu Sans Mono i wariantem Bold, najprostszą rzeczą jest użycie czcionki i rozmiaru, który nie zmienia szerokości (jak pokazuje informacja o czcionce) między normalnym a pogrubionym lub coś innego niż DejaVu.

Jeśli chodzi o to, co może to powodować, może to być jedna z twoich bibliotek (moim gtk jest libgtk-x11-2.0.so.0), ale wątpię, żeby była to ta konkretna biblioteka. Wątpię również, czy jest to plik lub pakiet ttf. Bardziej prawdopodobne jest renderowanie Freetype (mam libfreetype.so.6). Ponieważ DejaVu jest skalowane, podobnie jak inne czcionki, które działają dla Ciebie, błąd obliczeniowy łaskotany sposobem, w jaki napisano DejaVu, wyjaśnia, dlaczego działają one w niektórych rozmiarach, ale nie w innych.

Aby sprawdzić, czy problem dotyczy Emacsa, możesz wyświetlić dwa okna terminali, jedno z pogrubionym monitem, a drugie bez niego i porównać odstępy między nimi. Jeśli jest inny niż Emacs, ma to związek z renderowaniem i / lub czcionką.

Jeśli skompilowałeś emacsa, może się tam coś dziać.

skalisty
źródło
To nie działało ... (użyłem DejaVu Sans Mono-9BTW). Zaktualizuję powyższy opis ...
edam
Tryb linii czcionki jest taki sam. Mono 10 wykazuje takie samo zachowanie, ale 8 i 11pr nie! Ma to coś wspólnego z renderowaniem czcionek i zwracaniem innej wysokości linii dla normalnej i pogrubionej. Czy Emacs używa fontconfig?
edam
1
Emacs nie korzysta z fontconfig i ogólnie jest raczej unikalny, jeśli chodzi o wybór glifów.
wasamasa
(font-info "DejaVu Sans Mono-10")daje mi ["-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]. Mam również fonts-dejavu-corezainstalowane, a także ttf-dejavu-core. Oba zapewniają DejaVuSansMono.ttf(w różnych katalogach, ale są to identyczne pliki, więc nie widzę, żeby to miało znaczenie). Dostaję także Height: 98z twarzy (podczas używania DajaVu Sans Mono-10, który wykazuje powyższy problem). Jestem otwarty na wszelkie sugestie! :)
edam
Zauważ, że niektóre parametry informacji o czcionce są różne. Mam „13 17…”, a ty „13 15…”. A jeśli otrzymasz pomoc dotyczącą funkcji font-info, zobaczysz, że pierwsza różnica 17 (ja) vs 15 (ty) to wysokość. Spróbuj więc zmienić wysokość na 17.
skalisty