Sazba XML

Jiří Kosek


Přímá sazba XML
Konverze XML do TeXu
Využití standardních stylových jazyků
Další vývoj

V posledních měsících proběhlo v texové diskusní skupině i jinde několik diskusí o tom, zda je lepší při přípravě dokumentů používat TeX nebo XML. Pokusím se příliš nezneužít možnosti zaplnit stránky Zpravodaje názory, které jsem v diskuzích zastával já. Konec konců celá diskuse neměla moc smysl, protože TeX a XML spolu mohou žít bok po boku bez nějakých velkých problémů.

Asi se všichni shodneme, že TeX je výtečný nástroj pro sazbu dokumentů. Po dlouhá léta se dokumenty pro sazbu připravovaly přímo v TeXu. TeX tak sloužil jako jazyk pro zápis dokumentu a také jako systém pro jeho sazbu a zlom. Pokud je naším cílem jen dokument připravit, pěkně vysázet a vytisknout, je potom TeX vhodným a postačujícím nástrojem.

Pokud však chceme s připraveným dokumentem naložit i jinak, než jej jen vytisknout, třeba převést do HTML nebo z něj dotazem vybrat nějaká data, není už TeX jako formát pro primární pořízení dokumentu nejvhodnějším kandidátem. Vhodnější pro tyto účely jsou značkovací jazyky, v dnešní době především XML. S tím by možná někteří diskutéři nesouhlasili, ale zkusme to brát jako fakt. XML se zkrátka hodí pro ukládání informací, protože je lze dále poměrně snadno zpracovávat. TeX se hodí pro sazbu dokumentů, protože je rychlý a má implementovány kvalitní typografické algoritmy. Nic nám tedy nebrání ve využití výhod obou technologií – dokumenty ukládat do XML, a pro potřeby tisku je zpracovávat TeXem. Získáme tak výhody obou světů.

Možností, jak sazbu dokumentu XML provést pomocí TeXu, je několik, a my si je pokusíme přiblížit. V navazujících článcích jsou pak ty nejpoužívanější metody rozebrány více do hloubky, včetně příkladů použití.

Přímá sazba XML

Asi nejjednodušší variantou je přímá sazba XML pomocí TeXu. Nepotřebujeme žádné přídavné programy, XML se zpracovává čistě prostředky TeXu. Tento přístup má však dva poměrně nepříjemné nedostatky.

Napsat parser XML přímo v TeXu je velmi obtížný úkol. Existující parsery jsou schopné načítat jen podmnožinu XML, obvykle nepodporují entity, které umožňují jeden dokument XML rozložit do více fyzických souborů.

Druhým nedostatkem je samotný princip, kdy musíme mapovat výskyty značek v XML na texové sekvence. V mnoha případech toto mapování můžeme poměrně jednoduše vytvořit, ale jsou případy, kdybychom v místě výskytu značky potřebovali znát informace z jiné části dokumentu XML. Lze to samozřejmě obejít pomocí ukládání stavových informací nebo víceprůchodovým zpracováním dokumentu apod. Ale v porovnání se speciálními nástroji, které během zpracování umožňují přístup k celému dokumentu, je to velmi nepohodlné.

Pro přímou sazbu XML pomocí TeXu se dnes používají dva systémy. Prvním z nich je xmltex. Jedná se o jednoduchý parser implementovaný v TeXu, kterému můžeme v konfiguračním souboru určit, na jaké TeXové sekvence se mají převádět jednotlivé značky v dokumentu XML. Podrobnější popis xmltexu naleznete v samostatném článku Použití parseru XML v TeXu v tomto čísle Zpravodaje.

Druhým produktem, který si s XML poradí přímo, je ConTeXt. Tato uživatelsky příjemná makronadstavba nad TeXem obsahuje i nástroje na zpracování XML.

Konverze XML do TeXu

Přímou sazbu XML TeXem lze použít jen v jednoduchých situacích. I při složitějších požadavcích však nemusíme na použití TeXu rezignovat. Pro převod XML do podoby TeXového kódu můžeme použít sofistikovanější nástroje, které nám umožní pohodlné načtení XML a jeho převedení.

Asi nejvhodnějším nástrojem pro tuto úlohu je jazyk XSLT. Tento jazyk primárně slouží k popsání transformaci dokumentu XML do podoby HTML stránky, případně XML dokumentu s jinou strukturou. XSLT však s jistými omezeními umí generovat i obyčejné textové soubory, a tedy i TeXové dokumenty. XSLT pomocí dotazovacího jazyka XPath nabízí přístup k libovolné části dokumentu XML kdykoliv během zpracování a nabízí tak pohodlné vyřešení problémů jako je generování obsahu, křížových odkazů apod.

Napsání stylu XSLT pro převod XML do TeXu je poměrně jednoduché. Musíme si dát pozor jen na správné ošetření a převod znaků, které mají v TeXu speciální význam (např. #, $, &).

Pěknou ukázku použití XSLT při sazbě knihy z podkladů v XML od Zdeňka Wagnera jste mohli nalézt v minulém čísle Zpravodaje v článku Využití XML a LaTeXu při sazbě odborných knih.

Využití standardních stylových jazyků

Výše popsané metody nám umožňují z dokumentů XML získat kvalitní tištěný výstup pomocí TeXu. Skalní příznivce značkovacích technologií by však tomuto přístupu přece jen jedno vytkl: formátovací předpis je úzce svázán se systémem TeX – nelze jej využít s jiným sázecím systémem a nemůžeme tak dostat jiný výstup než formáty podporované (pdf)TeXem – DVI, PostScript a PDF. Co kdybychom však chtěli výstup v jiném formátu, jako je třeba RTF nebo HTML? Vytvořená konverze do TeXu by nám byla k ničemu.

Tento problém ve světě XML řeší stylové jazyky. Ty umožňují popsat vzhled dokumentu poměrně abstraktně a nezávisle na výstupním formátu a médiu. Takovýmto obecným předpisem – stylem – se může řídit převod do mnoha formátů v různých aplikacích. Stačí, když se standardizuje jazyk, kterým se styl popisuje. Je to jen přirozené pokračování snahy vytvořit nezávislý formát dat – tím je XML. Vzhled dokumentu by měl být také definován nezávisle, a to jak na dokumentu, tak na programu, který se použije pro výsledné formátování.

Stylových jazyků, které se hodí pro formátování XML dokumentů, existuje mnoho, ale mezi dva nejpoužívanější a „nejmocnější“ patří DSSSL a XSL. Shodou okolností pro oba dva jazyky existují i jejich implementace, které pro samotné formátování používají TeX. V případě DSSSL se jedná o JadeTeX a v případě XSL pak o PassiveTeX. I jejich základním principům a použití se věnujeme v samostatných článcích.

Použití stylových jazyků přináší kromě nezávislosti na použitém formátovacím nástroji i další výhody. Většinu parametrů sazby lze nastavit jednoduše jako hodnoty vlastností a není potřeba pronikat do makrojazyka TeXu. DSSSL i XSL obsahují dotazovací jazyk, který umožňuje kdykoliv pracovat s libovolnou částí vstupního dokumentu XML – nejsme tak omezeni jako u TeXu, který vstupní soubor čte sekvenčně. Své výhody má i TeX – lze jej plně programovat, a jeho možnosti záleží jen na schopnostech uživatele, ne na jednou pevně daných vyjadřovacích možnostech standardizovaného stylového jazyka.

Další vývoj

Sazba XML pomocí TeXu je možná a v mnoha případech můžeme získat výborné výsledky. Nicméně jsou dvě oblasti, které by potřebovaly výrazně zlepšit. TeX je sám o sobě 8bitový a zpracování dokumentů používajících jako znakovou sadu Unicode mu činí potíže. Jde je sice obejít, ale postup je krkolomný a výsledek není vždy zcela robustní. Řešením může být přechod na systém Omega, který do TeXu přidává právě podporu Unicode.

Druhým omezením je samotný vstupní procesor TeXu. Jde s ním sice dělat kouzla, ale napsat v něm plnohodnotný parser XML nebo jiného formátu není příliš jednoduché. Vhodnější by byl modulární sázecí systém, kde by šlo použít uživatelské vstupní moduly speciálně připravené na čtení XML. Něco podobného by mělo umožňovat NTS.

Vše záleží na tom, jak rychle se budou „nové verze TeXu“ jako NTS a Omega vyvíjet, a jak rychle se rozšíří mezi uživateli. Bez jejich rozšíření se asi nikdo nebude obtěžovat s přepisováním stávajících maker pro tyto nové nadějné projekty.