Hlavní navigace

TeX pro každého - TeX a jeho nástupci

9. 12. 2002
Doba čtení: 6 minut

Sdílet

Poslední novinkou, která se společně s dalšími změnami v TeXu objevila, bylo osmibitové kódování. Tím v roce 1990 D. E. Knuth vývoj TeXu uzavřel. TeX však není dokonalý a dnes se dozvíme, na co nestačí. Vývoj se nezastavil a vzniklo několik alternativních projektů. Dnes se podíváme na možné budoucí směry vývoje typografie a sazby strukturovaných dokumentů.

Rozšíření TEXu

Některé projekty jsou založeny přímo na kódu TEXu. Původní TEX nepodporuje sazbu zprava doleva. Její řešení pomocí maker je nepohodlné, a tak jedním z prvních rozšíření byl TEX–XET. Na vícejazyčnou sazbu se zaměřil i MLTEX. V projektu ε-TEX (eTEX) našel TEX–XET své uplatnění jako jedno z rozšíření. Kromě zmíněné obousměrné sazby jsou však rozšíření, která ε-TEX obsahuje, subtilnější povahy a dokáže je ocenit spíš zkušený tvůrce maker: větší počet registrů, lepší podpora aritmetiky, lepší možnosti ladění, větší možnosti manipulace s metrikou písma. Nová primitiva v podstatě hladce zapadají do původního konceptu TEXu. Proto také ε-TEX projde téměř dokonale testem kompatibility s původním TEXem. ε-TEX je dnes standardní verzí TEXu v distribucích a je jen na nás, zda jej spustíme v rozšířeném, nebo kompatibilním režimu.

Dalším směrem, kterým se snahy o rozšíření TEXu ubíraly, bylo kvalitní řešení sazby jazyků se znakovým písmem. Počet znaků značně přesahuje dostupných 256 a sazba v takových jazycích byla možná pouze za pomoci neohrabaných maker neustále přepínajících písma obsahující podmnožiny znaků. Proto vznikl projekt Ω (Omega) – unikódová portace TEXu. Její registry jsou šestnáctibitové, šestnáctibitové je i kódování písma. Ω definuje vstupní a výstupní procesy, které mohou provést nejenom překódování, ale i další jednoduché úkony. I Ωuž dospěla do použitelného stadia a je standardní součástí distribucí.

Posledním směrem pro rozšíření TEXu se stala změna výstupního formátu – vznikl pdfTEX, jehož výstupem není DVI, ale PDF soubor. PdfTEX definuje množství nových primitiv, která umožňují manipulaci s objekty ve formátu PDF – obrázky, hypertextovými objekty, záložkami, barvami, ale dokonce i s vloženými JavaScriptovými objekty a multimédii. PdfTEX je jedním z nejsilnějších programů pro vytváření komplikovaných PDF souborů. I pdfTEX používá kódový základ původního TEXu. Dobře se snese s ε-TEXem a jejich sloučením vzniká pdfeTEX. Jde o další projekt, který dnes naleznete v každé distribuci TEXu.

Nedostatky TEXu

Koncepce TEXu jako makrojazyka bez jakékoliv podpory strukturování přímo v jádře systému může být sporná, ovšem třeba LaTEX ukazuje, že není nepřekonatelná a že s pomocí maker lze takovou nadstavbu vytvořit.

Zásadnější problémy však přináší koncepce oddělení preprocesoru od sázecí části – v mnoha situacích není možné zpětně zjistit (jinak než analýzou výstupu nebo protokolu), jak se TEX vlastně rozhodl. Zásah do sazby nad rámec existujících primitiv musí provést sazeč ručně.

Stejně zásadní jsou i problémy, které vyvolává striktní oddělení řádkového a stránkového zlomu nebo zacházení s objekty jako obdélníkovými boxy.

Poslední třída problémů vyplývá z monolitické koncepce – nemůžeme tedy napsat například nový modul pro dělení slov v jazycích, kde Liangův algoritmus nedává dokonalé výsledky (jazyky, kde se složená slova dělí ve švu).

Zde je malá ukázka věcí, které v TEXu nevyřešíme (bez enormního množství práce či kódu mimo TEX):

  • Makro, které by vkládalo obtečené obrázky do vnějšího horního rohu stránky. Při velké snaze se nám podaří napsat makra, která to dokáží u sazby na rejstřík (budou mít asi 30 kB), ale pro obecnou sazbu to nevyřešíme.
  • Primitivum \brokenpenalty (penalta za zlom stránky v místě, kde se dělí slovo) je nepoužitelné u sazby na rejstřík. V okamžiku zlomu stránky již nelze ovlivnit, zda v tom místě bude rozdělené slovo.
  • Povolit tři rozdělení slova nad sebou, ale čtyři zakázat. Vše, co TEX umí, je \doublehyphen­demerits, což na toto nestačí.
  • Makro, které by dokázalo odhalit a rozbít řeku (nepěkný shluk mezer mezi slovy v řádcích pod sebou) anebo opakování stejných slov pod sebou na začátku a konci řádku.
  • Napsat makro na iniciálu, které by podle tvaru písmena přisunulo následující znak (v běžné velikosti) – například u kombinace „Ty“ – zde totiž nelze použít standardní páry pro podřezávání.
  • Napsat makro, které by umělo předepsat, že poslední stránka kapitoly bude zaplněna od jedné třetiny do dvou třetin.
  • Napsat makro, které by obteklo obrys obrázku (TEX nemá žádnou informaci o obsahu obrázku).
  • Zjistit, jak dlouhý byl poslední řádek minulého odstavce lze jen za určitých podmínek, a to pouze pomocí speciálních triků v matematickém režimu.

Možný následník TEXu – NTS

Podstatně vyšší ambice si dal projekt NTS. Podobně jako ostatní projekty začal s TEXem. Na rozdíl od ostatních však nepracuje s původním kódem, ale jde v podstatě o kompletní reimplementaci TEXu. Zatímco původní TEX je programový monolit napsaný v jazyce WEB/Pascal, nový NTS je napsaný objektově v jazyce Java. Proto bylo dosažení co nejvyšší kompatibility s TEXem mimořádně náročným úkolem. Dnes, po deseti letech od zahájení projektu, je ve stadiu beta testů a odlišnosti od TEXu jsou pouze mikroskopické.

Daní za objektovou orientaci je mnohonásobné zpomalení NTS oproti TEXu.

Proč byla tato náročná práce podstoupena? Přes dobrou dokumentaci zdrojového kódu TEXu jsou vzhledem k množství vazeb mezi částmi kódu rozsáhlejší zásahy do jádra původního TEXu velmi komplikované – každý takový zásah může mít neočekávaný vliv na původní funkčnost TEXu. Již sám fakt, že za poslední čtvrtstoletí tak nikdo neučinil, hovoří sám za sebe.

Naproti tomu kód NTS by měl být mnohem průhlednější a srozumitelnější a již dnes existují první implementace, které mění jeho funkci – například modul pro nalití textu do oblasti omezené více obdélníky.

V blízké budoucnosti lze očekávat další moduly – nové algoritmy pro zlom stran a dělení slov, ale třeba i moduly pro integraci grafiky.

Alternativní přístupy

TEX a jeho logika není jediným přístupem, jak vytvořit sazbu. Dlouhá léta byl jedinou alternativou groff a jeho nadstavby (známe je například z UNIXových manuálových stránek).

Teprve vznik SGML znamenal změnu – vznikl kvalitní a obecný značkovací jazyk. SGML nyní konkuruje formátXML (což je lépe zpracovatelná podmnožina SGML s restriktivnější syntaxí). Důležité však je, že vznikly i standardy XSLT a FO, které poskytují návod na převod XML do textové podoby.

Porovnáme-li TEX s XML, vidíme značný rozdíl v přístupu. Zatímco TEX je makrojazyk s typografickými příkazy, struktura dokumentu není v TEXu nijak pevně daná. Vzniká až jako důsledek maker z nějaké nadstavby. Implementaci obsahů a křížových referencí zajišťují složitá makra.

Naproti tomu pro XML je prvotním struktura dokumentu. Teprve XSLT + FO nabízejí příkazy pro vytvoření grafické podoby dokumentu. Oddělení vzhledu od obsahu je tedy povinné. Vytvoření rejstříků, obsahů a jiných referencí je triviálním kódem na několik řádků. Pokud však náš požadavek přesáhne možnosti FO, je problematické toho dosáhnout. S podobným problémem se setkáváme i v TEXu, ale až při podstatně vyšší úrovni kontroly nad vzhledem dokumentu (viz omezení popsaná výše).

Existuje však možnost využití obou přístupů – dokument vytvoříme v XML a jeho formátování popíšeme pomocí XSLT + FO. Speciální procesor se pak společně s TEXem postará o vlastní sazbu. Takto funguje například passiveTEX. Lze tak použít i ConTEXt.

UX DAy - tip 2

Budoucnost

Vidíme, že zatím chybí koncept typografického systému, který by spojoval možnosti strukturovaného popisu dokumentů, ale zároveň by umožnil jemné ovlivňování grafické podoby, a to až do mikrotypografických detailů. Lze však předpokládat, že v budoucnu vzniknou nové moduly pro NTS, které podobné věci zvládnou, případně že již nebudou založeny na makrojazyce. Lze si představit modul NTS jako sdílenou knihovnu, která se bude starat o kvalitní zlom textu ve webovém prohlížeči, XML procesoru nebo WYSIWYG sázecím programu. To vše je zatím hudbou budoucnosti…

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