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.
Spis treści
- 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 ,,à propos''. Ponieważ w ,,polskim'' foncie nie ma znaku à, 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 |
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)
Akcje Dokumentu