LaTeX2e i fonty

Poniższy dokument jest częścią artykułu Marcina Wolińskiego LaTeX2e a sprawa polska, który ukazał się w Biuletynie GUST nr 10/1998. Cały artykuł dostępny jest na serwerze GUST w (spakowanej) wersji PostScript.



NFSS

W niniejszym wprowadzeniu zostanie przedstawiony wyłącznie sposób zarządzania fontami tekstowymi. Do prezentacji zagadnień związanych ze składem formuł matematycznych autor nie czuje się jeszcze odpowiednio przygotowany.

TeX ma wbudowany jedynie bardzo prosty sposób dostępu do fontów. Poleceniem \font można związać nazwę symboliczną z operacją wybrania fontu załadowanego z konkretnego pliku metrycznego i o ustalonej wielkości. (W całym niniejszym tekście słowo font będzie używane na określenie takiej właśnie istności. W sensie TeXa -- coś załadowanego z konkretnego pliku metrycznego. W sensie typograficznym -- pismo o ustalonym kroju, odmianie i stopniu.) Posługiwanie się tak zdefiniowanymi poleceniami na dłuższą metę jest uciążliwe, ponieważ wywołują one bezpośrednio określoną odmianę i stopień określonego kroju pisma. Wyobraźmy sobie, że wykonano

\font\it=plti10

Jeśli teraz fragment tekstu zawierający użycie tego polecenia zostanie przeniesiony z głównego tekstu dokumentu do przypisu, wydarzy się katastrofa: przypisy są tradycyjnie składane pismem mniejszego stopnia, ale fragment kursywą będzie większy!

Dlatego każdy TeXowy format ma swoją metodę zdefiniowania polecenia \it tak, aby znaczyło coś w rodzaju ,,przełącz font na kursywę w bieżącym stopniu''. LaTeX 2.09 zapewniał dostęp do ustalonego zbioru fontów -- mianowicie krojów Computer Modern -- tak aby dawało się manipulować niezależnie stopniem i odmianą pisma. Dodanie nowych fontów do zestawu dostępnego w LaTeXu w praktyce wymagało ingerencji w plik lfonts.tex, co było zadaniem wyjątkowo niewdzięcznym, a ponadto prowadziło do powstawania niezgodnych ze sobą lokalnych wersji LaTeXa.

W LaTeXa 2e wbudowano skomplikowany, ale za to bardzo elastyczny, mechanizm nazywający się NFSS (New Font Selection Scheme -- nowy sposób wyboru fontów). System ten jest stosunkowo łatwy w użyciu, zarejestrowanie fontów w systemie jest elementarne (jeżeli dostępne są pliki opisu fontów -- font descripton files) i nie wymaga ingerencji w format LaTeXa, natomiast siłą rzeczy stworzenie plików opisu wymaga odrobiny wiedzy o systemie.

Opis fontu w nowym sposobie wyboru fontów

W LaTeXu 2e bieżący font jest charakteryzowany przez pięć elementów: układ (zestaw znaków), krój (rodzinę), grubość i szerokość, odmianę, stopień i interlinię. Każdy z tych elementów można wybrać oddzielnym poleceniem.

układ fontu \fontencoding{OT1}
rodzina (krój) \fontfamily{cmr}
grubość i szerokość \fontseries{m}
odmiana \fontshape{n}
stopień i interlinia \fontsize{10}{12pt}
\selectfont

Argumenty poleceń wymienione w tabelce odpowiadają domyślnym wartościom dla dokumentu składanego przy pomocy standardowych klas w stopniu 10pt. Użycie poleceń \font... nie powoduje od razu włączenia fontu, ponieważ użytkownik może chcieć zmienić kilka elementów charakterystyki bieżącego fontu jednocześnie. Dlatego ostateczny wybór fontu zatwierdza się poleceniem \selectfont.

Wszystkie elementy charakterystyki fontu, za wyjątkiem stopnia pisma, można zmienić jednocześnie poleceniem \usefont. Nie wymaga ono również zatwierdzenia przez \selectfont.

\usefont{OT1}{cmr}{m}{n}

Poszczególne elementy opisu fontu są od siebie niezależne, co daje LaTeXowi przewagę nad procesorami tekstu. Wyobraźmy sobie, że w ,,zwykłym procesorze tekstu'' w tekście po polsku używamy wyrażenia ,,\`a propos''. Ponieważ w ,,polskim'' foncie nie ma znaku \`a, musimy pobrać symbol z fontu ,,zachodniego''. Jeżeli w późniejszym etapie opracowania redakcyjnego postanowimy zmienić krój pisma np. z Timesa na Helveticę, obca litera pozostanie w starym kroju, bo uzyskując ją nie mogliśmy powiedzieć ,,chcę bieżący krój i odmianę, ale w układzie zachodnioeuropejskim'', zamiast tego w dokumencie stoi ,,tu ma być zachodnioeuropejski Times jasny prosty stopnia 10pt''.

Gdy NFSS stwierdzi, że dana kombinacja parametrów nie odpowiada żadnemu istniejącemu fontowi, wypisuje odpowiednią informację do pliku .log i stara się użyć fontu o możliwie bliskiej charakterystyce. Niektórzy bardzo nie lubią tej własności NFSS, uważając że jest to jedno z miejsc, w których LaTeX usiłuje coś (źle) zrobić za użytkownika. To zachowanie można zmienić. Użycie w preambule deklaracji

\usepackage[pausing]{tracefnt}

powoduje zamianę wszystkich komunikatów o brakujących fontach w komunikaty o błędach, wymagające interwencji użytkownika.

Omówię teraz kolejne parametry opisujące font w NFSS.

Układ fontu jest najciekawszym elementem, ponieważ wydaje się, że LaTeX jest jedynym systemem, w którym pojęcie to występuje jawnie. Układ fontu opisuje, jakie znaki są dostępne w foncie i w jakich pozycjach. Polecenia akcentowe w LaTeXu korzystają z informacji o układzie bieżącego fontu, aby użyć najlepszej dostępnej metody uzyskania danego znaku.

Ponieważ mechanizm sterowania tłumaczeniem znaków na pozycje w foncie nie występuje w samym TeXu, LaTeXowy mechanizm układów działa na poziomie makr. W związku z tym dotyczy on tylko znaków dostępnych poprzez makra. Tabele konwersji kodu wejściowego na poziomie implementacji dokonują tłumaczenia od razu w pozycje znaków w foncie, ignorując ten mechanizm. Z drugiej strony pakiet inputenc posługuje się znakami aktywnymi, które zachowują się jak makra, wykorzystując mechanizm układów fontów.

Nazwy układów są tradycyjnie pisane wielkimi literami i cyframi. Poniższa tabela zestawia układy fontów należące do standardu LaTeXa.

Układy fontów w LaTeXu
OT1 Old Text 1 układ fontów zastosowany przez Knutha
OT2 Old Text 2 układ cyrylicy z Washington University
OT3 Old Text 3 układ fontów wsuipa (?)
OT4 Old Text 4 układ fontów PL
T1 Text 1 ,,europejski'' układ fontów (Cork)
T3 Text 3 IPA -- znaki fonetyczne
T4 Text 4 układ dla języków afrykańskich
TS1 Text Symbol 1 dodatkowe symbole tekstowe
OML Old Math Letters układ fontu matematycznego wg. Knutha
OMS Old Math Symbols układ symboli wg. Knutha
OMX Old Math Extensible układ fontu ze znakami ,,rozciągliwymi''

Układy o nazwach, zaczynających się literą O, zawierają po 128 pozycji. Pozostałe są ,,nowymi'' układami 256-znakowymi. OT4 wyłamuje się z tego schematu, będąc rozszerzeniem OT1, ale nie wypełniającym wszystkich 256 pozycji.

Układ T1 jest ,,nowym'' układem opracowanym na konferencji w Cork. Zawiera on znaki umożliwiające skład w większości języków europejskich. TS1 jest odpowiadającym mu układem uzupełniającym zawierającym latające akcenty dla majuskuł (które nie zmieściły się w T1), znaki ,,copyright'', ,,registered'' i ,,trade mark'', liczne symbole walut oraz znaki pauzy o długościach pośrednich między ,,endash'' i ,,emdash'', które powinny uszczęśliwić polskich redaktorów technicznych.

Jak widać, brak ,,nowych'' układów matematycznych. Wydaje się, że nikt nie czuje się kompetentny, by takie opracować, lub też układ zaproponowany przez Knutha funkcjonuje wystarczająco dobrze, a wielojęzyczność nie ma wielkiego zastosowania do formuł matematycznych.

Układy fontów muszą być jawnie deklarowane w dokumencie. Wszystkie układy, które będą używane w dokumencie powinny zostać wymienione jako opcje wywołania pakietu fontenc. Na przykład żeby załadować definicje układu OT2 (cyrylica) i OT4 (polski) wykonujemy:

\usepackage[OT2,OT4]{fontenc}

Ostatni układ wymieniony w tej klauzuli będzie domyślnym układem dokumentu.

Krój pisma (rodzina).
Krój pisma jest wyróżniony przez jednolitość projektu graficznego. Jest to wszakże dość nieprecyzyjne określenie, jako że np. antykwa i kursywa tego samego kroju różnią się dość znacznie kształtem znaków. Kryterium praktyczne jest więc takie, że krój stanowi taki zbiór fontów, któremu jego projektant nadał wspólną nazwę, np. Quasi Palladio.

W NFSS stosuje się kilkuznakowe skróty nazw krojów. Dla Computer Modern są to np. cmr, cmss, cmtt. Dla krojów postscriptowych stosuje się zwykle trzy pierwsze znaki nazwy plikowej fontu wg. konwencji Karla Berry. Na przykład ptm to Adobe Times, phv to Adobe Helvetica, a bch to Bitstream Charter. Tych nazw używa się jako argumentu \fonfamily.

Dla osób po raz pierwszy stykających się z NFSS trudność stanowi zwykle zrozumienie zależności między rodziną a układem fontu. I tak na przykład krój Computer Modern Roman (cmr) występuje co najmniej w trzech układach. Krój cmr w starym układzie tekstowym OT1 jest dostępny w oryginalnych fontach Knutha o nazwach plikowych np. cmr10, cmbx12, cmti9, itd. Krój cmr w układzie polskim OT4 jest realizowany przez adaptację fontów Knutha, dokonaną przez B. Jackowskiego i M. Ryćko. Nazwy plikowe tych fontów to np. plr10, plbx12, plti9. Trzecim układem, w którym dostępny jest krój cmr, jest nowy ,,europejski'' układ tekstowy T1. Ta kombinacja parametrów oznacza użycie fontów EC (Extended Computer Modern), czyli plików metrycznych np. ecr1000, ecbx1200, ecti0900.

Fonty Knutha oprócz rodziny Computer Modern Roman obejmują jeszcze rodzinę Computer Modern Sans Serif (cmss), Computer Modern Typewriter (cmtt) i kilka drobnych eksperymentalno-dekoracyjno-zabawowych, jak Computer Modern Funny Roman (cmff), Computer Modern Dunhill Roman (cmdh), Computer Modern Fibonacci Roman (cmfib).

Zatem wybór spośród fontów CM, PL czy EC, odbywa się poprzez zmianę używanego układu, a nie rodziny, bo wszystkie one zawierają rodziny cmr, cmsscmtt -- znaki występujące w każdym z tych fontów mają w zasadzie ten sam projekt graficzny, jedynie zestaw dostępnych znaków jest różny.

Przełączenie standardowego LaTeXa na fonty zawierające polskie znaki diakrytyczne, polega na zmianie używanego układu fontów na OT4 lub T1. Od tego momentu odwołania do standardowych rodzin fontów będą dotyczyły fontów zawierających polskie znaki.

Krojów pisma nie trzeba deklarować. LaTeX załaduje odpowiednie informacje przy pierwszym odwołaniu do danego kroju.

Grubość i szerokość.
Oto najczęściej spotykane wartości tego parametru:
m medium zwykły
b bold gruby
bx bold extended gruby szeroki
sb semi-bold półgruby
c condensed wąski

W ogólności grubość i szerokość mogą przebiegać kilkustopniową skalę, dając kilkanaście kombinacji opisanych dwuliterowymi kodami. Większość krojów występuje jednak tylko w dwóch lub trzech wersjach grubości/szerokości.

Odmiana.
Najczęściej dostępne odmiany to:

n normal prosta
it italic kursywa
sl slanted pochyła
sc small caps kapitaliki
ui upright italic ,,wyprostowana'' kursywa
Stopień pisma i interlinia.
Argumentami polecenia \fontsize są stopień pisma i interlinia. Domyślną jednostką są punkty (amerykańskie), ale w każdym z argumentów można też użyć dowolnej jednostki akceptowanej przez TeXa.

W TeXu interlinia jest stała dla całego akapitu. Mówiąc ściślej, w całym akapicie zostanie użyta jej wartość bieżąca na jego końcu.

Obsługa typowych sytuacji

Opisany powyżej sposób manipulowania fontami pozwala na dostęp do wszystkich zainstalowanych fontów rodziny, ale jest uciążliwy. Dlatego LaTeX ma serię poleceń (definiowanych po części przez klasy) obsługujących typowe sytuacje.

Po pierwsze, mamy serię poleceń wybierających stopień pisma i interlinię, które występowały również w LaTeXu 2.09. Poniższa tabela wymienia stopnie odpowiadające poszczególnym poleceniom, w zależności od stopnia pisma tekstu podstawowego wybranego w \documentclass.

stopień pisma
tekstu głównego 10pt 11pt 12pt
\tiny 5pt 6pt 6pt
\scriptsize 7pt 8pt 8pt
\footnotesize 8pt 9pt 10pt
\small 9pt 10pt 11pt
\normalsize 10pt 11pt 12pt
\large 12pt 12pt 14pt
\Large 14pt 14pt 17pt
\LARGE 17pt 17pt 20pt
\huge 20pt 20pt 25pt
\Huge 25pt 25pt 25pt

Zostały również zachowane polecenia LaTeXa 2.09 \rm, \bf, \it, \sl, \sc, \ss\tt. Ale uwaga: zachowują się one dokładnie tak jak w LaTeXu 2.09 -- nie da się na przykład przy ich pomocy uzyskać grubej kursywy.

Nowy zestaw poleceń posługuje się następującym modelem użycia fontów w dokumencie. Ponieważ mieszanie różnych krojów szeryfowych w jednym dokumencie w zasadzie jest błędem (a przynajmniej powinno być wynikiem przemyślanej decyzji), w schemacie przyjętym przez standardowe klasy dokumentów dostępny jest jeden krój szeryfowy, jeden bezszeryfowy i jeden grotesk. Oczywiście domyślnie są to Computer Modern Roman, Computer Modern Sansserif i Computer Modern Typewriter.

Oto podstawowe polecenia wyboru krojów i odmian w tym schemacie:

Krój pisma (rodzina)
\textrm{...} lub \rmfamily krój szeryfowy
\textsf{...} lub \sffamily krój bezszeryfowy
\texttt{...} lub \ttfamily grotesk
Grubość i szerokość pisma
\textmd{...} lub \mdseries pismo jasne
\textbf{...} lub \bfseries pismo grube
Odmiana pisma
\textup{...} lub \upshape odmiana prosta
\textit{...} lub \itshape kursywa
\textsl{...} lub \slshape odmiana pochyła
\textsc{...} lub \scshape kapitaliki

Jak widać, tworzą one pary poleceń o podobnej funkcjonalności. Wersje z argumentem składają ten argument pismem wybranym przez swój odpowiednik bez argumentu. Ponadto polecenia te na granicy między pismem pochyłym a prostym dodają kompensatę wychylenia ostatniego znaku (italic correction), chyba że następnym znakiem jest kropka lub przecinek i kompensata nie jest potrzebna.

Polecenia bez argumentów można sobie wyobrażać jako zdefiniowane wg schematu:


\newcommand\rmfamily{
  \fontfamily{\rmdefault}\selectfont}

One również nie mają zaszytej w sobie nazwy rodziny, odmiany, grubości, ale odwołują się do makr przechowujących wartości domyślne. Oczywiście domyślną wartością makra \rmdefault jest cmr, czyli polecenie \rmfamily domyślnie włącza krój Computer Modern Roman.

Stąd płynie wniosek, że aby w LaTeXu złożyć dokument, używając jako kroju szeryfowego Timesa, wystarczy:

\renewcommand\rmdefault{ptm}

(Polecenia zapożyczone z LaTeXa 2.09 działają w podobny, pośredni sposób, więc również konsekwentnie poddają się takiemu przedefiniowaniu.)

Wartości domyślne wkraczają jeszcze w kilku innych miejscach.

Zasadnicza treść dokumentu jest składana fontem uaktywnianym poleceniem \normalfont. Jest ono mniej więcej równoważne


\usefont{\encodingdefault}
  {\familydefault}
  {\seriesdefault}{\shapedefault}
Płyną z tego ciekawe wnioski:

1) Zmieniając wartość \encodingdefault na OT4 możemy sprawić, że dokument będzie składany polskimi fontami. Pakiet polski tak właśnie postępuje, przełączając układ na OT4 lub T1 w zależności od opcji.

2) Standardową wartością \familydefault jest \rmdefault. Skład całego dokumentu czcionką bezszeryfową można uzyskać zmieniając tę wartość na \sfdefault:

\renewcommand\familydefault{\sfdefault}

Tego rodzaju zmian należy dokonywać w preambule dokumentu (to jest przed \begin{document}).

Konfigurowanie NFSS

Pozostaje jeszcze odpowiedzieć na pytanie, skąd NFSS ,,wie'', jakie kroje, odmiany i stopnie pisma są dostępne i w jakich układach.

Deklaracja układów fontów powoduje, że LaTeX ładuje pliki opisujące dane układy. Np. dla układu OT4 będzie to plik ot4enc.def (Uwaga: od grudnia 1996 nazwy wszystkich plików w dystrybucji LaTeXa są pisane tylko małymi literami. Fakt ten wywołał niejakie zamieszanie, ale wydaje się, że na dłuższą metę jest to decyzja rozsądna.) W tym pliku zawarte są informacje, jakie akcenty są dostępne w danym układzie, w jakich pozycjach się one znajdują i jakie są dostępne znaki akcentowane (kombinacje akcent-litera).

Pakiet polski.sty wewnętrznie ładuje odpowiednią definicję układu.

Opisy krojów są ładowane automatycznie z plików .fd przy pierwszej próbie użycia fontu z danej rodziny w danym układzie. Na przykład po zadeklarowaniu jako domyślnego układu OT4, pierwsza próba włączenia fontu z rodziny cmr spowoduje, że LaTeX załaduje plik ot4cmr.fd. Oto fragment tego pliku:


\DeclareFontFamily{OT4}{cmr}{}
\DeclareFontShape{OT4}{cmr}{m}{n}
   {  <5> <6> <7> <8>
          <9> <10> <12> gen * plr
      <10.95> plr10
      <14.4>  plr12
      <17.28><20.74><24.88>plr17}{}
...
\DeclareFontShape{OT4}{cmr}{bx}{it}
   { <-10>sub * cmr/bx/n
     <10> <10.95> <12> <14.4> <17.28>
          <20.74> <24.88> plbxti10
     }{}
...

Pierwsza deklaracja powiadamia, że jest to opis rodziny cmr w układzie OT4. Dalej następuje ciąg deklaracji \DeclareFontShape opisujących poszczególne kombinacje rodzina/grubość/odmiana. Pierwsza opisuje odmianę jasną (m medium), prostą (n normal) -- dla stopni 5, 6, 7, 8, 9, 10 i 12 należy użyć fontu o nazwie plikowej powstającej z ciągu plr po dołączeniu doń liczby stopnia pisma. Dla stopnia 10.95pt należy użyć fontu plr10 at 10.95pt, podobnie dla stopni 14.4, 17.28, 20.74, 24.88 użyty zostanie odpowiednio zeskalowany font plr12plr17. Druga klauzula \DeclareFontShape opisuje grubą (bx bold extended) kursywę (it italic) -- dla stopni mniejszych od 10pt należy użyć w zastępstwie grubej prostej odmiany rodziny cmr. Dla wymienionych dalej stopni użyty zostanie odpowiednio zeskalowany font plbxti10.

Deklaracje układów OT1T1 oraz opis rodziny cmr w tych układach są wbudowywane w format razem z plikami metrycznymi podstawowych fontów. Służy to przyspieszeniu ładowania LaTeXa na początku przetwarzania dokumentu. Zestaw wbudowanych układów, rodzin i plików metrycznych można zmienić przy pomocy plików konfiguracyjnych fonttext.cfgpreload.cfg -- szczegóły opisano w dokumencie cfgguide.tex.

Aby można było powiedzieć, że font jest zainstalowany w LaTeXu musi istnieć dla niego definicja układu i definicja kroju (rodziny) w tym układzie. Układów w zasadzie jest skończona niewielka liczba i definicje większości z nich są zawarte w dystrybucji LaTeXa (w tym OT4). Natomiast dla każdego kroju potrzebny jest jego opis w pliku o nazwie zbudowanej z nazwy układu i nazwy rodziny z rozszerzeniem .fd (wszystko małymi literami). Pliki te muszą znajdować się w katalogu widocznym dla LaTeXa.

Pliki opisu dla fontów PL i PC są zawarte w pakiecie PLaTeX. Pliki opisu dla kroju Quasi Palladio (qpl), Quasi Times (qtm) i antykwy toruńskiej (antt) są częścią pakietu pl-qx Piotra Kłosowskiego.


Opracował: StaW (ostatnia modyfikacja 28.11.2000)