Hlavní navigace

TeX pro každého - základní konstrukce TeXu

29. 10. 2002
Doba čtení: 5 minut

Sdílet

Minule jsme se seznámili s TeXem jako makrojazykem. Ale TeX je především typografický program. Základní prvky, které k sazbě používá, jsou překvapivě jednoduché. Dnes se seznámíme s boxy, čárami a výplňky a základními režimy TeXu.

Dozvíme-li se, že TEX je typografický program, mohli bychom si myslet, že musí mít v sobě definováno mnoho funkcí pro grafiku, tvary písmen a další objekty. Není to pravda!

Jádro TEXu se naprosto nezajímá o grafiku – neřeší vzhled písmen ani vkládání obrázků. Sazbu lze připravit prakticky bez těchto informací, a tak TEX ponechává doplnění znaků a grafiky pomocným programům. Písmo je abstrahováno na jakési krabičky, u nichž známe šířku, výšku a způsob navázání na okolní písmena (podřezávání, spojování do ligatur apod.) – tedy jeho metriku.

Boxy

TEX však myšlenku skládání abstraktních krabiček dovedl prakticky k dokonalosti a boxy se staly jeho hlavními objekty.

Pro TEX je box abstraktní obdélníkový objekt, se kterým lze nakládat vcelku, aniž se v ten okamžik zajímáme, co je uvnitř. Boxem tedy může být několik písmen, celý řádek, poznámka pod čarou, obrázek, či celá stránka. Jedinými jeho parametry jsou šířka, výška (výška nad účařím – pomyslnou čárou, na kterou se boxy skládají) a hloubka (hloubka pod účařím).

Boxy lze skládat vodorovně vedle sebe – pak se skládají těsně vedle sebe tak, aby jejich účaří (základní rovina řádku – baseline) bylo v jedné rovině, a vzniká horizontální box – nebo svisle – pak se skládají pod sebe, přičemž se dodržuje několik hodnot, kterými lze řídit rozestup mezi jednotlivými boxy a jejich účařími, a jedná o vertikální box. Zde jsme narazili na první primitiva pro řízení sazby – \baselineskip (vzdálenost mezi účařími), \lineskip (vzdálenost mezi boxy) a\lineskiplimit (pokud by byla vzdálenost mezi boxy podle hodnoty \baselineskip menší než tato hodnota, použije se hodnota \lineskip; při vyšších hodnotách tedy bude častěji upřednostněn \lineskip, při nižších \baselineskip).

skládání boxů

S jistými výhradami lze pokládat za box i písmeno. Písmeno má také šířku, hloubku a výšku, ale pokud vedle něj stojí další písmeno, použije TEX při sazbě ještě dodatečné údaje z metriky, aby si odvodil jejich vzájemný vztah –v prvním případě jej ovlivňuje podřezávání, ve druhém vznik ligatury. Zároveň vidíme, že skutečný tvar písmena není nikterak omezen jeho metrickými údaji.

písmena jako boxy

% box lze použít v sazbě přímo
\hbox{Ty}

% boxy lze vnořovat, skládat vertikálně
% i horizontálně
\hbox{%
% \vtop použije účaří nejvýše položeného boxu
  \vtop{\hbox{my}\hbox{vy}}
% \vbox použije účaří nejníže položeného boxu
  \vbox{\hbox{my}\hbox{vy}}
  \hbox{pes}}

% boxy lze přiřadit do registru
\setbox0\hbox{my}
% a poté je použít vícekrát a vyprázdnit
\hbox{\copy0\copy0\copy0\copy0\box0}

\bye

Mezery a výplňky

Boxy nemusí sedět těsně vedle sebe. Můžeme mezi ně vkládat výplňky (glue). Mohou být horizontální (\hskip) a

vertikální (\vskip). Mnohem zajímavější však je, že kromě pevných mezer existují i pružné výplňky. U nich lze nadefinovat natáhnutelnost a stáhnutelnost, a to nejen v absolutních (tedy délkových) hodnotách, ale dokonce v několika stupních (tedy poměrových hodotách, značených jako fil, fill a

filll). Výplňky si lze představit jako péra s různými parametry.

Několik z těchto výplňků je natolik důležitých, že tvoří samostatné primitivum:

\hfil = \hskip 0pt plus 1fil
\vfil = \vskip 0pt plus 1fil
\hss = \hskip 0pt plus 1fil minus 1fil
\vss = \vskip 0pt plus 1fil minus 1fil
\hfill = \hskip 0pt plus 1fill
\vfill = \vskip 0pt plus 1fill
\hfilneg = \hskip 0pt plus -1fil
\vfilneg = \vskip 0pt plus -1fil

Pokud se vedle sebe sejdou výplňky stejného stupně, natáhnou se (nebo stáhnou) podle svých poměrů. Pokud se však vedle nich vyskytne výplněk vyššího stupně, nižší výplňky zcela srazí. Mají-li výplňky povolenou stáhnutelnost větší, nežli je jejich základní délka, mohou nabýt i záporných hodnot (ostatně i základní hodnota může být záporná). Toho se často používá, chceme-li skrýt šířku znaku nebo dosáhnout přetisku.

výplňky

Po sestavení boxu jsou horizontální a vertikální boxy prakticky rovnocenné, až na jednu výjimku – lze je opět „rozvinout“ do jiného boxu stejného typu. Při tomto rozvinutí se přepočítají výplňky, aby odpovídaly situaci v boxu, který je sestavován.

% výplňky zajistí rovnoměrné rozložení
\hbox to10mm{a\hfil b\hfil c}

% nebo nerovnoměrné
\hbox to10mm{a\hskip0ptplus2fil b\hfil c}

% stažitelné výplňky lze použít i pro přetisk
\hbox{\hbox to 0mm{a\hss}b}
% prohlížíte-li pomocí xdvi,
% potřebujete volbu -thorough

\bye

Čáry

Čáry jsou kromě písmen druhým důležitým objektem. Mohou být opět horizontální (\hrule) a vertikální (\vrule) a podobně jako boxy mají i šířku,výšku (pokud nejsou definované, implicitní hodnota je 0,4 pt) a hloubku. Jsou však plné. Horizontální čáry se mohou nacházet pouze ve vertikálních boxech a vertikální v horizontálních boxech.

Zvláštním typem jsou čáry, které jsou zároveň výplňkem.

Dimenze

Jak jste si možná všimli, TEX zná většinu délkových jednotek, takže je můžeme zadávat přímo jako mm, cm,in (palce), pt (americké typografické body {points}), dd (evropské typografické body {Didotovy}), bp (počítačové typografické body {big points}, počítané jako 1/72 palce), cc (cicera), pc (piky). Navíc je definována ještě sp, základní délková jednotka TEXu – 1/65536 amerického typografického bo­du.

V údajích dimenze můžeme používat jak desetinnou tečku, tak i čárku.

Režimy TEXu

Poté, co text projde makroprocesorem, přechází do sázecí části proud znaků a primitiv. To, jak s nimi naloží, záleží na tom, v jakém je režimu. Existuje celkem šest těchto režimů:

Ve vertikálním režimu sestavuje TEX hlavní vertikální box stránky. Je to základní režim, ve kterém je TEX na počátku sazby. Je-li v tomto režimu přidán box, objeví se pod předchozím boxem. Pokud se box naplní, vyvolá se algoritmus pro zlom stránky. V tomto režimu jsou zakázány výplňky s poměrovou stáhnutelností (je to pochopitelné, protože by se stále stahovaly a nikdy by nemohlo dojít ke zlomu stránky).

Vnitřní vertikální režim se vyvolává, pokud TEX sestavuje běžný vertikální box. Podobá se vertikálnímu režimu, ale povoluje všechny typy výplňku a nevyvolává zlom stránky.

Horizontální režim je vyvolán, objeví-li se na vstupu písmeno nebo je-li rozvinut horizontální box. Pokud je v tomto režimu přidán box nebo písmeno, objeví se vedle předchozího boxu (pakliže mezi nimi nedojde ke zlomu). Primitivem \par (typicky dvojí odřádkování) se tento režim ukončí a vyvolá se zlom odstavce. V tomto režimu jsou (opět pochopitelně) zakázány výplňky s poměrovou stáhnutelností.

Omezený horizontální režim se vyvolává, pokud TEX sestavuje běžný horizontální box. Podobá se horizontálnímu režimu, povoluje všechny typy výplňku a nepovoluje zlom odstavce.

Matematický režim slouží k sazbě matematiky v rámci řádku. Střídá horizontální a vertikální skládání podle povahy matematické formule.

Řádkový matematický režim slouží k sazbě matematiky na samostatném řádku. Podobá se matematickému režimu, ale má některá specifika, vyplývající z odlišných pravidel sazby matematiky na samostatném řádku.

CS24_early

V příštím dílu se podíváme, jak TEX provádí zlom řádků a stránek.

Všechny ukázky z dnešního dílu jsou dostupné i ve zdrojovém formátu.

Byl pro vás článek přínosný?