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.
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.
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).
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ść.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.
n | normal | prosta |
it | italic | kursywa |
sl | slanted | pochyła |
sc | small caps | kapitaliki |
ui | upright italic | ,,wyprostowana'' kursywa |
\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.
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}
).
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.