Fontowe ABC

Co jakiś czas na liście dyskusyjnej GUST-u padają głosy świadczące z jednej strony o dużym zainteresowaniu sprawami fontowymi, a z drugiej strony -- o częstym niezrozumieniu podstawowych spraw związanych z fontami.

Te aspekty skłoniły nas do podjęcia próby spisania fontowego elementarza dla tych dzielnych adeptów fontologii, którzy nie boją się pułapek, od których niestety aż się roi w świecie fontów. (Dodatkowe informacje na temat wykorzystania fontów w LaTeX2e można znaleźć w dokumentacji Fonty w LaTex2e).



Fonty „TeX-owe” czyli pliki TFM

TeX-owi jest absolutnie obojętne, jakich fontów używamy: czy to są mapy bitowe, fonty PostScript-owe w formacie Type 1, czy też może egzotyczne fonty „własnego chowu” – nie ma to znaczenia. Jedyne, czego potrzebuje TeX, to informacja metryczna, czyli pliki TFM (TeX Font Metric). Pliki metryczne, jak sama nazwa wskazuje, zawierają w pierwszym rzędzie informację o rozmiarach znaków, ale także informację o wielkości kernów (podcięć) dla par znaków, informację o wielkości korekty kursywy (italic correction dla poszczególnych znaków oraz – choć trudno to zakwalifikować jako informację metryczną – informację o ligaturach, tzn. informację, które pary znaków mają być zastępowane automatycznie innym znakiem, np. dwa umieszczone obok siebie znaki -- zamienione zostaną przez TeX-a przez pojedynczy znak „–” zwany pauzą półfiretową (endash).

Krótko mówiąc żeby w ogóle „prze-TeX-ować” dokument potrzebne są pliki TFM.

Spis treści

Fonty „właściwe”

Dopiero sterowniki zamieniając złożone dokumenty, czyli pliki DVI, na postać widoczną już to na papierze, już to na ekranie, już to na jakimś innym nośniku potrzebują tych „właściwych fontów”.

Spis treści

Fonty rodziny Computer Modern

Zgodnie z konwencją przyjętą przez Donalda E. Knutha nazwy fontów rodziny Computer Modern zawierają formalny rozmiar fontu w punktach, np. cmr10 (font 10-punktowy), cmbx7 (font 7-punktowy), itp. Należy tu podkreślić, że font cmr12 nie jest równoważny fontowi zdefiniowanemu jako cmr10 at 12pt – chociaż oba fonty mają wielkość 12 punktów, to jednak proporcje znaków w obu fontach są inne. Tę samą cechę dziedziczą oczywiście fonty wywodzące się z rodziny Computer Modern (Computer Concrete, EC, PL), a także fonty rodziny Euler, fonty cyryliczne, i inne fonty tworzone w duchu konwencji rodziny Computer Modern.

Zmiany proporcji wraz ze zmianą stopnia pisma są jak najbardziej uzasadnione, małe fonty powinny dla lepszej czytelności mieć nieco większe i szersze oczka minuskuł w stosunku do majuskuł. Niemniej jednak wydaje się, że Donald E. Knuth nieco przesadził z liczbą odmian fontów zmieniając co jeden punkt proporcje znaków.

W praktyce wystarczyłyby nie więcej niż cztery zakresy: pierwszy dla fontów mniejszych niż 8-punktowe, drugi dla fontów od 8 do 12 punktów, trzeci dla fontów od 12 do – powiedzmy – 24 punktów i wreszcie czwarty dla fontów tzw. nagłówkowych. Ostatni z wymienionych zakresów nie pojawia się w fontach Computer Modern. Font calowy cminch, przeznaczony do nagłówków, jest w istocie przeskalowanym proporcjonalnie fontem cmssbx10. Innymi słowy dokładnie ten sam efekt uzyskałoby się za pomocą instrukcji \font \f cminch \f i za pomocą instrukcji \font \f cmssbx10 at 1.44in  \f. Jedyna różnica polega na tym, że font cminch jest nieco „oszczędniejszy” – zawiera tylko duże litery i cyfry.

Sporo zamieszania wywołały także plain-owe instrukcje \magstephalf\magstep sugerujące, że jedyne „legalne” powiększenia fontów to 109,5%, 120%, 144%, 172,8%, 207,4% lub co najwyżej 248,8% (p.  The TeX book, str. 17). Mimo iż nie jest to nigdzie expressis verbis powiedziane, to jednak sporo nieporozumień narosło na tym tle. Trudno się temu dziwić, skoro prawie wszystkie pakiety zawierające fonty TeX-owe w postaci map bitowych (p. niżej) stosowały się do tej reguły, tzn. mapy bitowe generowane były tylko dla wymienionych wyżej powiększeń. Chcąc w dokumentach TeX-owych w sposób jednolity korzystać z fontów tradycyjnych, czyli bitmapowych, i z fontów PostScript-owych, nie należy przejmować się zanadto rozpowszechnionym obyczajem mającym swe korzenie w czasach, gdy komputery były wolniejsze i wygenerowanie fontu „od ręki” było zbyt kosztowne. Rzadko używana instrukcja postaci

   \font... at ...

jest w tym kontekście godna polecenia.

Spis treści

Fonty bitmapowe

W tradycyjnej konfiguracji systemu TeX podstawowymi fontami są mapy bitowe (pliki GFgeneric font) generowane przez program METAFONT. Najczęściej używanym formatem jest jednak nie format GF, a nieco oszczędniejszy format PK (packed). Do zamiany służy program GFTOPK, z reguły wywoływany automatycznie w procesie generowania fontów.

Fonty bitmapowe generowane są dla konkretnej wielkości pisma i konkretnego urządzenia, tzn. zawierają pewne informacje pozwalające na danym urządzeniu – ekranie czy drukarce – uzyskać optymalny wygląd znaków. Stąd np. odrębne fonty dla drukarek laserowych i drukarek atramentowych o tej samej rozdzielczości 300dpi.

TeX – jak już wspomnieliśmy – pozwala skalować całość dokumentu lub poszczególne fonty:

\magnification2000
\font\A plr10 scaled \magstep3
\font\B plr10 at 28.5pt

gdzie plr10 oznacza nazwę fizycznie posiadanego na dysku pliku plr10.tfm. TeX przeskaluje font plr10 tak, jak sobie tego życzymy, a ściślej – przeskaluje informację metryczną związaną z fontem. Żeby móc zobaczyć, jak wyglądają znaki przeskalowanego fontu, należy skorzystać z METAFONT-a, który oczywiście potrafi generować fonty dowolnie przeskalowane.

Fonty PK zwykle przechowywane są w katalogach o nazwach zawierających liczbę wynikającą z przemnożonenia rozdzielczości przez przeskalowanie, np. fonty o rozdzielczości 300dpi ( dots per inch) powiększone o 20% (\magstep1) znajdą się w katalogu o nazwie 360dpi, dpi360 lub jakimś innym, podobnie nazwanym. Jeśli system operacyjny zezwala na nadawanie plikom długich nazw, to przeskalowanie może być wpisane w nazwę pliku, np. .../fonts/pk/laserjet/pl/plr10.360pk.

Standardowe sterowniki przetwarzające pliki DVI czy to na postać wyświetlaną na ekranie, czy też drukowaną, używają fontów PK i posiadają mechanizm przeszukiwania odpowiedniej struktury katalogów lub interpretacji nazw fontów przeskalowanych. Sterowniki te pozwalają zwykle na bardzo szybkie wyświetlenie składanego tekstu. Współczesne sterowniki posiadają także możliwość współpracy z METAFONT-em – potrafią przekazać informację o brakujących fontach i uruchomić METAFONT-a, wstrzymując pracę do czasu zakończenia procesu generowania brakujących fontów. Dzięki temu nie ma obecnie potrzeby trzymania na dysku olbrzymich bibliotek fontów w formacie PK, wystarczą pliki źródłowe fontów i odpowiednio skonfigurowane łącze sterownik-METAFONT (program lub skrypt) by zautomatyzować proces generowania fontów. Dla bardzo rozpowszechnionych sterowników z pakietu emTeX będzie to program MFjob (MS-DOS, OS/2), zaś dla systemów opartych na web2c – skrypt mktexpk (różne wersje Unix, WindowsAmiga).

Spis treści

Fonty PostScript-owe czyli pliki AFM oraz PFB (lub PFA)

Jeżeli chodzi o PostScript, to ten „właściwy font” – mowa tu o fontach zapisanych w formacie Adobe Type 1 – zawarty jest w pliku z rozszerzeniem .pfb (PostScript Font Binary) lub .pfa ( PostScript Font ASCII). Natomiast o plikach TFM w świecie PostScript-owym mało kto słyszał. Na szczęście dobrzy ludzie z firmy Adobe wymyślili coś podobnego do tego, co wymyślił Donald E. Knuth, mianowicie pliki metryczne AFM (Adobe Font Metric). Różnią się one trochę od plików TFM (np. pliki AFM są plikami tekstowymi), ale mimo różnic jest możliwe by na podstawie pliku AFM utworzyć plik TFM.

Spis treści

Reprezentacja znaków

Zanim pójdziemy dalej trzeba wyjaśnić jedną rzecz, mianowicie w jaki sposób są reprezentowane znaki. Jeżeli chodzi o plik DVI to odpowiedź jest trywialna: jako liczby z zakresu 0--255. Przy tworzeniu pliku PostScript-owego za pomocą sterownika sytuacja nie ulega zmianie, to znaczy w pliku PostScript-owym znaki też są reprezentowane w zasadzie jako liczby z zakresu 0--255, czasem w reprezentacji ASCII, a czasem w reprezentacji ósemkowej. Natomiast we „właściwym foncie” PostScript-owym, podobnie zresztą jak w foncie METAFONT-owym, jest inaczej: znaki są zasadniczo reprezentowane za pomocą nazw w rodzaju „period”, „periodcentered”, „lslash”, „aogonek”, itp.

Formalnie rzecz biorąc font PostScript-owy jest programem, a nazwy znaków są nazwami podprogramów opisujących kształt znaków za pomocą – znów podobnie jak w programach METAFONT-owych – krzywych trzeciego stopnia, zwanych krzywymi Béziera. Dodatkowo podprogramy te opisują niektóre szczegóły procesu zamiany obwiedni na mapy bitowe (tzw.  hinty czyli podpowiedzi), bo przecież ostatecznie znak zostanie wyświetlony na ekranie, wydrukowany na drukarce lub naświetlony na diapozytywie, czyli musi zostać zamieniony na postać dyskretną.

Spis treści

Nazwy i kody znaków

Skąd zatem PostScript trafiając na jakąś liczbę „wie”, że ma użyć procedury o nazwie, powiedzmy, „aogonek”?

Aaa, właśnie! Tu jest pies pogrzebany. We „właściwym foncie” PostScript-owym jest zawarta dodatkowa informacja, mianowicie tabela par (liczba, nazwa) przyporządkowująca liczbom z zakresu 0--255 nazwy podprogramów opisujących znaki. Tablica ta (czasem zwana wektorem) nosi nazwę „Encoding”, co jest może mało istotne, natomiast istotne jest to, że tablicę tę można „w locie” zmienić. Z tej możliwości korzysta m.in. sterownik DVIPS (p. niżej).

Konwersja AFM -> TFM

W pliku AFM znajduje się również informacja o przyporządkowaniu liczba-nazwa, (w zasadzie można zakładać, że jest to to samo przyporządkowanie, co w pliku PFB/PFA). Na ogół nie jest to przyporządkowanie, o które by nam chodziło. Ale nie ma biedy – DVIPS-owi można podać dowolne przyporządkowanie, które zostanie użyte w tworzonym przezeń pliku PostScript-owym.

Konwertery AFM->TFM na podstawie nazw generują stosowne przyporządkowanie, lub nawet wiele przyporządkowań, a dla każdego z takich przyporządkowań tworzony jest odpowiadający mu plik TFM.

Najpowszechniej używanym konwerterem jest program AFM2TFM, należący do standardowej dystrybucji sterownika DVIPS. Konwerter o nazwie TOIL, bazuje na programach AWK oraz METAFONT Warto też wspomnieć o pakiecie VFINST, oferującym liczne możliwości, bazującym na fontach wirtualnych.

Spis treści

Konwersja AFM -> TFM – poprawność nazw znaków

Aby konwertery AFM->TFM mogły działać jak należy, nazwy podprogramów muszą być zgodne z ich treścią. Tak niestety nie zawsze jest, np. pod nazwą „Sterling” zamiast opisu znaku funta można znaleźć opis polskiego „Ł” czyli „Lslash”. Pomysłów na cudaczne nazewnictwo jest mniej więcej tyle, ile tzw. standardów kodowania znaków, czyli infinity.

Z niepoprawnymi nazwami można sobie poradzić. Co nam zależy, przecież „onesuperior” brzmi równie ładnie jak „aogonek”, nieprawdaż? Problem jedynie w tym, że z góry nie wiadomo, że producent uznał „onesuperior” za odpowiednią nazwę dla polskiej litery „ą”. Jakiś szaleniec może się pogodzić z propozycją Adobe i użyć dla podprogramu opisującego „ą” nazwy „aogonek”…

Jakby nie dość było problemów, oprócz nazewnictwa ewidentnie niepoprawnego możemy się zetknąć z obocznością! Otóż niektórzy producenci dla określenia znaków „ż” i „Ż” używają nazw „zdot” i „Zdot”, a niektórzy „zdotaccent” i „Zdotaccent”. Nie znalazłem jednoznacznego stanowiska firmy Adobe w tej sprawie, ale na ogół obowiązuje zasada „sklejania” nazw: „a” + „grave” = „agrave”; skoro więc istnieje znak „dotaccent” (nazwa używana przez Adobe), to „ż” należy rozumieć jako „z” + „dotaccent” czyli „zdotaccent”. Innymi słowy zalecać by należało używanie nazw „zdotaccent” i „Zdotaccent”, ale być może konwertery AFM->TFM powinny być uwrażliwione na tę oboczność.

Spis treści

Konwersja AFM -> TFM – kerny i ligatury

Plik TFM zawiera jeszcze informację o parach kernowych i ligaturach. Pary kernowe, uwzględniane „jak leci” przez większość konwerterów AFM->TFM, na ogół są umieszczane jak należy w plikach AFM, chociaż czasami można trafić na felerne pliki AFM bez par kernowych. Obecność par kernowych poznajemy to po występowaniu wierszy zaczynających się od słowa kluczowego „KPX”. Warto mieć na uwadze, że bywają pliki AFM posiadające tylko część par kernowych – np. znaki diakrytyczne czasami nie są uwzględniane – dobrze jest sprawdzić plik AFM pod tym kątem.

Z ligaturami jest znacznie gorzej – można je bardzo rzadko uświadczyć, mimo iż teoretycznie format AFM pozwala na definiowanie ligatur, np. poniższy przykładowy wiersz pliku AFM:

   C 45; WX 329; N hyphen; B 17 188 313 303; L hyphen endash;

zgodnie ze specyfikacją Adobe ustala, że znak o kodzie 45 ma szerokość 329 jednostek (jednostka = 1/1000em), nosi nazwę „hyphen”, że naroża prostokąta ograniczającego obrys znaku mają współrzędne wynoszące w tych samych jednostkach (17, 188) oraz (313, 303), i wreszcie że dwa znaki „hyphen” mają być zamieniane na znak o nazwie „endash”, czyli innymi słowy znak o nazwie „endash” jest ligaturą dwóch znaków o nazwie „hyphen”.

W związku z powszechnym brakiem informacji o ligaturach w plikach AFM, konwertery AFM->TFM muszą albo się domyślić, jakie by tu ligatury można wstawić, albo – co chyba jest lepszym rozwiązaniem – zostać poinformowane o prawidłowych dla danego fontu (grupy fontów) ligaturach.

Spis treści

Pliki konfiguracyjne sterownika DVIPS

Popularny sterownik DVIPS, autorstwa Tomasa Rokickiego, zamieniający pliki DVI na pliki PostScript-owe musi wiedzieć – podobnie jak każdy sterownik – gdzie znajdują się fonty TeX-owe i PostScript-owe. Informację tę zawierają pliki config.pspsfonts.map, poszukiwane w kartotekach wskazywanych przez zmienną systemową TEXCONFIG (we współczesnych instalacjach zmienna ta jest już zwykle zadeklarowana w pliku konfiguracyjnym texmf.cnf).

Plik config.ps zawiera informacje o parametrach pracy programu. Natomiast plik psfonts.map zawiera informacje związane wyłącznie z dostępnymi w danej instalacji fontami PostScript-owymi. W pliku psfonts.map informacje o poszczególnych fontach umieszczane są w jednym wierszu (co czasem może być kłopotliwe). Typowy wiersz wygląda następująco:

ec-qplr TeXGyrePagella-Regular "encqec ReEncodeFont" <q-ec.enc <qplr.pfb   

Pierwsza pozycja określa nazwę TeX-ową fontu, druga – wewnętrzną nazwę PostScript-ową fontu (robi z niej użytek interpreter PostScript-u), następnie pojawia się informacja o dodatkowych zabiegach, jakim ma być poddany font (może to być poziome przeskalowanie fontu, pochylenie lub zmiana kodowania – w podanym przykładzie chodzi o zmianę kodowania), a na końcu pojawiają się nazwy plików, które mają zostać dołączone do pliku wynikowego – w tym wypadku jest to plik kodowania q-ec.enc oraz font qplr.pfb.

Podanie nazwy pliku fontowego nie jest konieczne – w takim wypadku DVIPS założy, że chodzi o font wbudowany w urządzenie. Gorąco odradzamy korzystanie z tej możliwości – opłakane skutki korzystania z fontów wbudowanych można co jakiś czas oglądać w materiałach nawet renomowanych firm: a to zamiast polskich znaków występują „krzaczki”, a to litery zachodzą na siebie, a to skład się zupełnie rozjeżdża…

Plik kodowania zawiera tablicę 256 nazw znaków, określającą omawiane wyżej przyporządkowanie kod-nazwa. Jest to w istocie fragment kodu PostScript-owego postaci:

  /encqec[
  /grave
  /acute
  /circumflex
  ...
  /thorn
  /germandbls
  ] def

O tym, jaki kod otrzymuje dany znak, decyduje kolejność wystąpienia: w tym przypadku na pozycji zerowej (w języku PostScript liczenie zawsze odbywa się od zera) występuje znak o nazwie grave (znak „ciach” / w notacji PostScript-owej oznacza mniej więcej to samo co znak „w-tył-ciach” \ w notacji TeX-owej),znak acute otrzymuje kod 1, znak circumflex – kod 2, …, znak thorn – kod 254, i wreszcie znak germandbls – kod 255. Wystąpienie .notdef oznacza, że w foncie nie ma znaku na pozycji o danym kodzie.

Warto mieć świadomość, że DVIPS włącza wszelkie pliki prawie ich nie analizując, jedyny zabieg przezeń wykonywany to zamiana postaci binarnej fontu Type 1 (PFB) na postać ASCII (PFA). Jeżeli font jest już w postaci ASCII, to włączany jest do dokumentu „jak leci”, bez żadnej ingerencji ze strony sterownika. Oznacza to, że używając DVIPS-a możemy korzystać ze wszystkich możliwych fontów PostScript-owych, nie tylko najbardziej popularnych fontów Type 1, ale w szczególności także fontów TrueType, które dla interpretera PostScript-u są po prostu fontami Type 42 – wystarczy mieć plik TFM i font Type 42 w postaci ASCII.

Spis treści

Łatanie fontów – niepoprawny font

Używając różnych wymyślnych narzędzi (np. T1UTIL Lee Hetheringtona) można się zorientować, jakim znakom zostały przypisane jakie nazwy i w razie czego je poprawić, można też uzupełniać kerny, itp., ale to jest żmudne i przykre, bo niepotrzebne zajęcie.

Spis treści

Łatanie fontów – brak plików AFM

Czasem fonty PostScript-owe są dystrubuowane z plikami PFM (Printer Font Metric) zamiast z plikami AFM.

Brak plików AFM praktycznie przekreśla możliwość użycia fontu PostScript-owego w TeX-u, bowiem pliki PFM zawierają znacznie uboższą informację niż pliki AFM, w szczególności nie zawierają nazw znaków, czyli nie określają żadnej tablicy kodowania ( encoding vector, p. wyżej). Można zakładać, że chodzi o takie samo przyporządkowanie, jakie jest wpisane w pliku PFB/PFA, chociaż w ogólności tak być nie musi. Ponadto w pliku PFM znajdują się dane na temat par kernowych jedynie dla co najwyżej 256 znaków, a font PostScript-owy może ich zawierać nacznie więcej.

Jeśli jednak szczęście nam dopisze, to z plików PFM oraz PFB (bądź PFA) możemy odtworzyć informację niezbędną do utworzenia pliku AFM – można spróbować użyć pakietu pf2afm, który dostępny jest w archiwum GUST-u.

Spis treści

Podsumowanie

Warto pamiętać, że font nie tylko musi ładnie w druku wyglądać, ale i jego dość skomplikowana „wewnętrzna” struktura musi być zrobiona porządnie.

Jednym z najbardziej dających się we znaki problemów jest problem układu znaków w foncie. Staranne przemyślenie tego problemu musi prowadzić do wniosku, że firma Adobe już dawno temu znalazła wystarczające w większości przypadków rozwiązanie problemu konfigurowalności układu znaków w foncie. To bardzo mocny argument na rzecz korzystania z fontów PostScript-owych w formacie Type 1.

Wprawdzie detale związane z instalowaniem fontów mogą się wydawać skomplikowane, ale taka jest natura rzeczy. A do czego prowadzi próba ukrycia tej natury przed użytkownikiem, wielu z nas boleśnie odczuło w przypadku korzystania fontów TrueType w systemie Windows. Wprawdzie instaluje się je bardzo prosto (albo i – nie wiedzieć czemu – nie instaluje), ale praktycznie nie ma żadnej możliwości rekonfiguracji. Ktoś, kto przenosił fonty TrueType z jednej wersji systemu Windows do innej, wie o czym mowa – a to font się w ogóle nie daje zainstalować, a to inne znaki się pojawiają, niż byśmy chcieli, a to nasza ulubiona aplikacja albo tego fontu nie widzi, albo się na nim wywraca…

Mając to na względzie uważamy, że warto poświęcić nieco czasu i wysiłku na zrozumienie podstaw konfigurowania fontów, zwłaszcza fontów PostScript-owych w formacie Adobe Type 1 – to naprawdę w pewnym momencie staje się proste, a tym samym oczywiście niezwykle użyteczne.

Spis treści

Bogusław Jackowski i Staszek Wawrykiewicz

Powyższy tekst jest zmodyfikowaną wersją artykułu z Biuletynu GUST, nr 8/1997, s. 7–12.
Ostatnie zmiany 5.05.2014