# PB029: Různé podoby TeXu

Ve světě TeXu velmi rychle narazíte na spoustu *TeX pojmů, např. TeX, e-TeX, pdfTeX, XeTeX, LuaTeX, plain TeX, LaTeX, ConTeXt a další. Zde se v nich pokusíme udělat pořádek a ukázat si rozdíly mezi nimi na příkladech.

## TeX: Jazyk, program, sazební systém a ekosystém

TeX je makrojazyk pro sazbu dokumentů navržený v 70. a 80. letech minulého století americkým profesorem Donaldem Ervinem Knuthem. Na rozdíl od většiny ostatních systémů na přípravu dokumentů klade TeX nezvyklý důraz na sazbu matematiky. Základním prostředkem abstrakce v TeXu jsou uživatelská makra, jejichž výskyty ve vstupním dokumentu jsou při zpracování nahrazovány definicemi. TeXem rovněž rozumíme interpret jazyka TeXu (TeXový kompilátor).

V širší rovině označujeme TeXem sazební systém sestávající z Knuthova TeXového kompilátoru, programu Metafont (který probereme v budoucím cvičení) a rodiny písem Computer Modern. V této podobě Knuth systém během 80. let minulého století uveřejnil. Od roku 1990 již tento systém není v aktivním vývoji a dochází pouze k odstraňování chyb. Čísla verzí programů TeXu a Metafontu postupně konvergují k iracionálním číslům π a e; po smrti Donalda Knutha se verze programů změní na zmíněné konstanty a veškeré neopravené implementační chyby budou již pouze dokumentovány.

Díky svobodnému a otevřenému zdrojovému kódu se kolem TeXu (sazebního systému) utvořila aktivní komunita uživatelů a došlo ke vzniku bohatého ekosystému odvozených kompilátorů, formátů, makrobalíků, fontů a rozšiřujících programů. Ty jsou od roku 1992 shromažďovány na internetovém archivu CTANu a distribuovány ve formě TeXových distribucí (ty jsme stručně probrali v úvodním cvičení). Často se proto setkáme s tím, že libovolné softwarové řešení postavené na součástech TeXových distribucí je volně označováno jako TeX (v akademickém světě jde typicky o spojení kompilátoru pdfTeXu s formátem LaTeXu).

## TeXové kompilátory (TeX engines)

Část *TeX termínů odkazuje na různé implementace kompilátorů TeXového zdrojového textu, tzn. binární programy, které načtou zdrojový text a převedou jej na vysázený výstupní dokument.

Samotný kompilátor rozumí jen naprosto základním příkazům, tzv. primitivům jazyka. Právě rozsah podporovaných primitiv tvoří nejzásadnější rozdíly mezi různými kompilátory TeXu.

### Původní TeX Donalda Knutha

- Kompilátor odpovídající původnímu popisu TeXu, jak jej definoval Donald Knuth v knize The TeXbook, respektive některé jeho modernější revizi rozšířené o další primitiva:
  - TeX82 – TeX verze 2 z roku 1982 podporující stále jen 7bitový vstup.
  - TeX90 – TeX verze 3 z roku 1990 podporující již 8bitový vstup.
- V moderních TeXových distribucích se používá pouze při použití formátu plain.
- Původní implementace TeXu zavedla v roce 1979 pro popis výsledné vysázené podoby dokumentu na zařízení nezávislý binární formát DVI (Device Independent File Format). Tento formát je TeXem stále běžně podporován, většina uživatelů však dává přednost přímému generování dokumentů ve formátu PDF, které umožňují některé novější implementace TeXových kompilátorů.

### e-TeX

- e-TeX je původní TeX rozšířený o řadu nových primitiv, např. pro obousměrnou sazbu (rozšíření TeX–XeT).
- e-TeX rozšíření jsou vestavěna do všech novějších kompilátorů, takže e-TeX samotný se používá zřídka.

### pdfTeX

- pdfTeX implementuje e-TeX a přidává řadu vlastních primitiv, zejména pro podporu výstupu do formátu PDF a využití jeho různých speciálních vlastností, nebo pro ovládání mikrotypografických rozšíření (která probereme v budoucím cvičení).
- pdfTeX umí produkovat nejen PDF, ale také formát DVI z Knuthova TeXu. Z toho důvodu je dnes pdfTeX typicky používán při kompilaci TeXových dokumentů do DVI i PDF.
- pdfTeX je v současnosti de-facto standardním kompilátorem pro přípravu TeXových dokumentů.

### XeTeX

- Kompilátor XeTeX implementuje rozšíření e-TeX a některá primitiva zavedená pdfTeXem.
- Velkým rozdílem XeTeXu oproti výše zmíněným TeXovým kompilátorům je, že nativně pracuje s UTF-8 kódovaným zdrojovým textem na vstupu.
- Oproti výše zmíněným TeXovým kompilátorům umožňuje využívat fonty dostupné v operačním systému (využívá knihovny daného systému), nikoliv jen fonty z TeXové distribuce připravené pro použití TeXem.
- Prezentace schopností XeTeXu byla předmětem přednášky „XeTeX: TeX plus Unicode plus OpenType minus complexity“, kterou Jonathan Kew přednesl v roce 2007 na FI MU. Ke stažení jsou k dispozici slajdy a videozáznam.

### LuaTeX

- LuaTeX implementuje rozšíření e-TeX a některá primitiva zavedená pdfTeXem (konkrétně i ta, která umožňují ovládání mikrotypografických rozšíření).
- LuaTeX stejně jako XeTeX nativně pracuje s UTF-8 kódovaným zdrojovým textem na vstupu a umožňuje využívat fonty dostupné v operačním systému. Většinu ukázek pro XeTeX, se kterými se ve zbytku kurzu setkáme, je možné beze změn zpracovat i strojem LuaTeX.
- Zásadním rozdílem LuaTeXu oproti všem ostatním uvedeným kompilátorům je, že obsahuje podporu pro skriptování v programovacím jazyce Lua v rámci zdrojového textu dokumentu. Lua skript může zasahovat do procesu kompilace a ovlivnit tak výslednou podobu vysázeného dokumentu. Toto má následující výhody:
  - Uživatel může části dokumentu generovat pomocí dobře přístupného skriptovacího imperativního jazyka namísto makrojazyka TeXu. Používat skriptovací jazyky uvnitř dokumentů je sice možné pomocí rozšiřujících balíčků již nyní (viz např. PerlTeX), ale jazyk Lua má tu výhodu, že jeho interpret je zahrnut přímo do kompilátoru LuaTeXu, díky čemuž netrpí přenositelnost výsledných dokumentů.
  - Kvůli chybějící nízkoúrovňové funkcionalitě není nutné vytvářet nové TeXové kompilátory, stačí rozšířit chování stávajícího kompilátoru pomocí jazyka Lua. Takto je v LuaTeXu implementována podpora lokálně instalovaných OpenType a TrueType fontů, zatímco v XeTeXu je tato podpora řešena „natvrdo“ pomocí rozšiřujících TeXových primitiv.
- LuaTeX byl posledních několik let ve stádiu aktivního vývoje. Vydání první stabilní verze proběhlo při příležitosti desátého setkání uživatelů ConTeXtu, které se konalo na podzim roku 2016 v Nizozemsku. Očekává se, že v dohledné budoucnosti LuaTeX nahradí pdfTeX v roli de-facto standardního kompilátoru TeXových dokumentů; zatím ale většina uživatelů nemá důvod přejít.

## TeXové formáty

Jelikož samotný kompilátor rozumí jen naprosto základním příkazům, tzv. primitivům jazyka, bylo by mimořádně nepohodlné používat tyto nízkoúrovňové příkazy pro tvorbu dokumentu. S pomocí těchto základních primitiv jsou proto vybudovány makrojazyky – formáty – určené pro použití koncovým uživatelem při formátování textu.

V rámci formátu jsou definovány nové makropříkazy, které mohou používat jak primitiva jazyka, tak dříve definovaná makra. Samotný uživatel samozřejmě může ve svém zdrojovém textu používat jak přímo primitiva jazyka, tak makra definovaná v používaném formátu, a nebo obojí využít k definici vlastních maker.

TeXových formátů je mnoho (a uživatelé si mohou definovat i vlastní). Zde se proto v krátkosti zmíníme jen o těch nejdůležitějších:

### plain TeX

- plain TeX je minimální základní sada maker určená pro použití koncovým uživatelem. Většina maker pro sazbu běžných, ovšem ne elementárních, prvků dokumentů (například makro pro vysazení titulní stránky dokumentu s nadpisem a jménem autora), zde nejsou definována a je na koncovém uživateli, aby si je nadefinoval sám dle potřeb vytvářeného dokumentu pomocí jednodušších maker a primitivů jazyka.
- Vzhledem k rozumnému množství maker plain TeXu a jejich uživatelské oblibě je množina maker nabízených ostatními TeXovými formáty typicky nadmnožinou plain TeXu (v rozmezí drobných odchylek).

### csplain

- csplain je:

  > […] konzervativní rozšíření plain TeXu Donalda Knutha. Rozdíl mezi formátem plain a formátem csplain spočívá v tom, že místo CM fontů se pracuje implicitně s CS-fonty, což umožňuje:
  > - přímé zpracování znaků české a slovenské abecedy,
  > - zavedení vzorů dělení pro český a slovenský jazyk.

### LaTeX

- LaTeX je pravděpodobně nejrozšířenější a nejznámější TeXový formát. Obsahuje rozsáhlý ucelený balík maker připravený pro snadnou a rychlou sazbu technických dokumentů koncovým uživatelem – obsahuje například předpřipravené šablony pro sazbu odborných článků s předpřipravenými makry pro formátování všech prvků dokumentu včetně titulní stránky s názvem a autorem dokumentu, abstraktu, záhlaví a zápatí stránek s číslováním a záhlavími kapitol, seznamem použité literatury atd.
- LaTeX je postaven na systému rozšiřujících balíčků – samostatné menší sady maker rozšiřující schopnosti samotného LaTeXu o nějakou ucelenou funkcionalitu.
  - Například balíček `cropmark` přidává k základnímu LaTeXu makra pro sazbu tiskových ořezových značek.
  - Balíčky, které mají být při kompilaci dokumentu použity, se zavádí v hlavičce LaTeXového dokumentu příkazem: `\usepackage{jméno_balíčku}`
  - Pokud používáte některou z rozsáhlejších TeXových distribucí, jako je TeX Live či MikTeX, pravděpodobně je součástí vaší instalace i rozsáhlá databáze dodatečných balíčků. Nebudete je tedy muset získávat ručně. Pokud potřebujete novější verzi balíčků, nebo balíček, který není součástí vaší TeXové distribuce, tak jako startovací bod pro hledání můžete využít tematický online TeX katalog nebo tematický katalog CTAN.

Tip: Dokumentaci (nejen) k LaTeXovým balíčkům nemusíte hledat na webu, stačí si zobrazit dokumentaci z vaší TeXové instalace: `texdoc <objekt>
texdoc cropmark
` Použitím lokální instalace navíc zajistíte, že popisuje vámi použivanou verzi dokumentovaného objektu.

### ConTeXt

- ConTeXt je velmi rozsáhlý systém pro sazbu dokumentů. Svou syntaxí je značně vzdálený od plainu i LaTeXu.
- V porovnáním s LaTeXem nabízí ConTeXt podstatně bohatší funkcionalitu, která je na rozdíl od LaTeXu integrována přímo do formátu – prakticky zde tedy neexistují balíčky třetích stran.
- ConTeXt je od základu navržen tak, aby byl schopný zpracovávat strukturované XML dokumenty a aby bylo možné převést ConTeXtové dokumenty do strukturovaných XML dokumentů. To je výhodné při databázovém publikování, nebo při generování výstupu pro elektronické knihy. Jednodušší formáty typu LaTeX si takové cíle nekladou a výše zmíněnou funkcionalitu je třeba nahradit externími programy.
- ConTeXt je rozdělen na dva formáty:
  - MarkII je starší formát, který pracuje s kompilátory pdfTeXu, XeTeXu a LuaTeXu. V současnosti již není aktivně vyvíjen, pouze udržován.
  - MarkIV je aktivně vyvíjený formát, který pracuje výhradně s kompilátorem LuaTeXu. Formát MarkIV je s formátem MarkII zpětně kompatibilní a je tedy možné dokumenty ve formátu MarkII relativně bezbolestně vysázet s využitím nového formátu (ačkoliv výstup nemusí být zcela totožný). Opačně toto neplatí a mnoho pokročilých funkcí formátu MarkIV je ve formátu MarkII nedostupných.
- ConTeXt je pravděpodobně nejmodernějším a nejmocnějším TeXovým formátem. Na druhou stranu je jeho vývoj poměrně živelný, často motivovaný primárně potřebami jeho autora Hanse Hagena a společnosti PRAGMA Advanced Document Engineering.
- Dokumentace ConTeXtu je dostupná online v rámci ConTeXt Garden wiki a tematických manuálů. Základy ConTeXtu pak shrnuje např. článek Michala Kvasničky ve Zpravodaji CSTUG z roku 2001.

## Praktické použití

Jelikož základní sada TeXových primitiv je společná, založená na původním TeXu Donalda Knutha, tak v zásadě můžete každý formát použít s libovolným TeXovým kompilátorem (za předpokladu, že vy ani formát nevyužíváte rozšiřující primitiva některého z kompilátorů).

### plain TeX

Nejjednodušším formátem je plain TeX, kde není třeba dokument začínat žádnou komplikovanou hlavičkou. Do textového souboru (pojmenovaného např. `muj-plaintex-zdrojak.tex`) si uložte následující kód:

`Hello World! -- This is my {\it first} \TeX{} document.
\end`

Tip: Při používání PuTTY pro připojení k unixovém serveru můžete text přenášet přes schránku:

- `Ctrl + Insert`: kopírovat
- `Shift + Insert`: vložit

Tento dokument ve formátu plain TeX můžete následně přeložit libovolným TeXovým kompilátorem:

- Pomocí původního TeX kompilátoru do DVI příkazem: `tex muj-plaintex-zdrojak.tex`
- Pomocí kompilátoru pdfTeX do PDF příkazem: `pdftex muj-plaintex-zdrojak.tex`
- Pomocí kompilátoru XeTeX do PDF příkazem: `xetex muj-plaintex-zdrojak.tex`
- Pomocí kompilátoru LuaTeX do PDF příkazem: `luatex muj-plaintex-zdrojak.tex`

Ukázkový dokument pro plain TeX si můžete přeložit a prohlédnout i na službě Overleaf. Vizte také článek Can I run plain TeX on Overleaf? v dokumentaci služby Overleaf.

### LaTeX

Formát LaTeX je složitější a ve zdrojovém textu již vyžaduje jistou minimální hlavičku. Pro rychlé vyzkoušení tedy můžeme využít například standardní ukázkový dokument `sample2e.tex`, který je součástí TeXové distribuce.

- Pomocí příkazu `kpsewhich` najděte v TeXové instalaci soubor `sample2e.tex` a zkopírujte si jej do pracovního adresáře. Viz předchozí cvičení.

Dokument `sample2e.tex` ve formátu LaTeX můžete následně přeložit libovolným TeXovým kompilátorem:

- Pomocí kompilátoru pdfTeX do DVI příkazem: `pdftex -fmt=latex -output-format=dvi sample2e.tex`
  - Povšimněte si parametru `-fmt`, který říká, že kompilátor nemá použít výchozí formát plain TeX, ale formát LaTeX.
  - Aby bylo použití různých TeXových formátů a kompilátorů pohodlné, typicky je v TeXové distribuci připravena zkratka (alias) pro použití dané kombinace kompilátoru a formátu. Obvykle tedy používáme kratší zápis příkazu: `latex sample2e.tex`
- Pomocí kompilátoru pdfTeX do PDF příkazem: `pdftex -fmt=latex -output-format=pdf sample2e.tex`
  - Opět obvykle používáme kratší zápis: `pdflatex sample2e.tex`
- Pomocí kompilátoru XeTeX do PDF zkratkou: `xelatex sample2e.tex`
- Pomocí kompilátoru LuaTeX do PDF zkratkou: `lualatex sample2e.tex`

Ukázkový dokument pro LaTeX si můžete přeložit a prohlédnout i na službě Overleaf.

### ConTeXt

Formát ConTeXt uživatelům dopřává výhody složitějších formátů jako LaTeX při zachování jednoduchosti zdrojového kódu v plain TeXu, kde není třeba dokument začínat žádnou komplikovanou hlavičkou. Do textového souboru (pojmenovaného např. `muj-context-zdrojak.tex`) si uložte následující kód:

`\starttext
\startsection[title={Testing \CONTEXT}]
This is my {\em first} \CONTEXT{} document.
\stopsection
\stoptext`

Tento dokument ve formátu ConTeXt můžete následně přeložit kompilátorem LuaTeX do PDF následně: `context muj-context-zdrojak.tex`

Ukázkový dokument pro ConTeXt si můžete přeložit a prohlédnout i na službě Overleaf. Vizte také příspěvek o přípravě dokumentů pomocí formátu ConTeXt na službě Overleaf.

## Praktické úkoly k procvičení

- Pomocí výše uvedených postupů si vysázejte ukázkové dokumenty pro plain TeX, LaTeX a ConTeXt do formátu PDF.
- Pokud máte čas, najděte/vytvořte si příklady pro formáty csplain a ConTeXt a zkuste si je přeložit patřičným příkazem. Stejně tak si zkuste použít rozšiřující primitiva některého TeXového stroje, jako např. LuaTeX.