Keywords: Polish TeX Users Group, fonts and LaTeX2e, NFSS

# 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.

- Opis fontu w nowym sposobie wyboru fontów

- Układ fontu
- Krój pisma (rodzina)
- Grubość i szerokość
- Odmiana
- Stopień pisma i interlinia

- Obsługa typowych sytuacji
- Konfigurowanie NFSS

## 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`, `cmss` i `cmtt` -- 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` i `\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 `plr12` i `plr17`. 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 `OT1` i `T1` 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.cfg` i `preload.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)