> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/cs/clanky-do-hloubky/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# Úvod do LuaTeXu (část 1): Co to je — a čím je tak odlišný?

LuaTeX je *sada nástrojů*—obsahuje sofistikované softwarové nástroje a komponenty, s jejichž pomocí můžete vytvářet (sazet) širokou škálu dokumentů. Podtitulek tohoto článku také klade dvě otázky o LuaTeXu: Co to je — a čím je tak odlišný? Odpověď na „Co to je?“ se může zdát zřejmá: „Je to sázecí jádro TeXu!“ Opravdu je, ale širší pohled, k němuž se tento autor přiklání, je takový, že LuaTeX je mimořádně všestranný na TeXu založený *systém pro konstrukci a inženýrství dokumentů*.

### Vysvětlení LuaTeXu: Kde začít?

Cílem tohoto prvního článku o LuaTeXu je nabídnout kontext pro pochopení toho, co toto TeXové jádro poskytuje a proč/jak jeho návrh umožňuje uživatelům budovat/navrhovat/vytvářet širokou škálu řešení složitých sazebních a designových problémů — a možná také nabídnout určitý stupeň „budoucí odolnosti“, protože uživatelé stále více potřebují na TeXu založený software, který je schopen přizpůsobovat se neustále se měnícímu technickému ekosystému. Podle názoru autora není uvádění a popis jeho funkcí/možností nutně nejlepším místem, odkud při rozvíjení porozumění schopnostem a potenciálu LuaTeXu začít. Takový přístup nebude zvlášť užitečný pro čtenáře, kteří nejsou obeznámeni s jinými TeXovými jádry a pro něž jsou srovnání založená na funkcích nepravděpodobně zvlášť významná.

Na riziko, že vyčerpám čtenářovu trpělivost („Už přejděte k věci!“), zvolím spíše „holističtější“ přístup, v naději, že poskytnu užitečné pozadí, ale za cenu trochu delšího čtení — a ponoru do několika programátorských témat, která pomohou s porozuměním. V [Část 2](/latex/cs/clanky-do-hloubky/09-an-introduction-to-luatex-part-2-understanding-directlua.md) zde zkoumáme použití `\directlua` ale nyní se pokoušíme položit základní základy pro porozumění LuaTeXu.

Tento článek silně odráží autorovu osobní „cestu“ k rozvíjení porozumění a ocenění LuaTeXu: že tím, že se nejprve dozvíte něco o filozofii stojící za vývojem LuaTeXu a uvidíte jej jako kontejner softwarových nástrojů, lépe oceníte rozsáhlé oblasti řešení, které otevírá tento úžasný software.

## LuaTeX: Nejen pro akademii nebo matematiku!

Bohatství funkcí a možností zabudovaných do LuaTeXu nejen poskytuje mimořádně kvalitní sazbu prostřednictvím tradičního LaTeXu, ale také nabízí obrovský prostor pro vývoj řešení na míru, nezaložených na LaTeXu, pro složité problémy tvorby a inženýrství dokumentů. LuaTeX má v sobě zabudovaný výkonný skriptovací jazyk Lua, což například znamená, že můžete použít Lua k načítání „pluginů“ (externích softwarových knihoven) do LuaTeXu; to dále umožňuje vysokou míru automatizace, integraci do existujících softwarových systémů nebo pracovních postupů a využití specializovaného softwaru pro zpracování dat, textu či grafiky.

Historicky byl TeX spojován s odborným psaním/vydáváním, zejména v matematice, ale LuaTeX má zvláště významný potenciál pro použití i v mnoha dalších oblastech — včetně komerční výroby PDF dokumentů. Jedním takovým příkladem je [speedata publisher](https://speedata.github.io/publisher/) který používá LuaTeX čistě jako jádro pro generování PDF v rámci svého pracovního postupu založeného na XML — LaTeX vůbec nepoužívá. Ve skutečnosti speedata publisher neobsahuje prakticky žádný TeXový kód — zeptal jsem se [Patricku Gundlachovi](https://twitter.com/patrickgundlach), vývojáře speedata publisheru, který potvrdil, že celkem používá asi tři řádky TeXového kódu. Jeho výkonné sazební schopnosti jsou navrženy a implementovány v kódu Lua za použití Lua API LuaTeXu (téma, o němž pojednáme později v tomto článku).

## Krátký osobní příběh: Jak jsem poprvé objevil LuaTeX

O LuaTeXu jsem se poprvé dozvěděl koncem roku 2009/začátkem roku 2010, když byl stále v polovině beta fáze vývoje (verze 0.50). V té době jsem hledal TeXový software pro sazbu ručně psaných poznámek vzniklých při mém úsilí naučit se trochu arabštiny. Vyhledávání na Googlu odhalilo sbírku videí z konference TUG 2009 ([nyní na YouTube](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)) které obsahovaly ukázky velmi kvalitní arabské sazby (prostřednictvím Hans Hagena [balíku ConTeXt](http://wiki.contextgarden.net/Main_Page)). Tato videa také obsahují přednášku s názvem [Projekt LuaTeX: v polovině cesty k verzi 1](https://youtu.be/AKv4po9PGW0).

TeXové jádro používané k vytvoření té nádherné arabské sazby se jmenovalo „LuaTeX“. V té době jsem pracoval ve vědeckém (fyzikálním) vydavatelství, ale ačkoli jsem TeX/LaTeX dobře znal, o LuaTeXu jsem neslyšel: zaujal mě a chtěl jsem se o tomto novém TeXovém jádru dozvědět víc. Protože LuaTeX byl stále ve fázi beta vývoje a procházel rychlým vývojem, chtěl jsem být v obraze s nejnovějšími aktualizacemi, takže nejlepší možností (pro mě) byla cesta svépomocné stavby (kompilace) spustitelného programu LuaTeX ze zdrojového kódu. Kromě spustitelného programu LuaTeX potřebujete také „instalaci TeXu“, která poskytuje prostředí, ve kterém se LuaTeX spouští (např. texmf.cnf, makrobalíčky, fonty atd.). Místo stahování a instalace obrovské [TeX Live](https://www.tug.org/texlive/) distribuce jsem se rozhodl vytvořit naprosto minimální vlastní instalaci TeXu, s níž bych mohl zkoumat LuaTeX (což bylo „zajímavé“ cvičení, které jsem [zdokumentoval na svém osobním blogu](http://www.readytext.co.uk/?cat=30)). Každé nové vydání LuaTeXu je doprovázeno jeho Referenční příručkou (např. pro[verzi 1.0.4](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co)), která dokumentuje nejnovější funkce a možnosti softwaru. Je to však *referenční* příručka a (nutně) spíše skoupá na vysvětlení vhodná pro začátečníka, který chce začít s tímto neuvěřitelným TeXovým jádrem — předpokládá se určitá znalost nízkoúrovňových konceptů TeXu. Vzhledem k tomu, že jsem LuaTeX objevil v poměrně rané fázi jeho vývoje, bylo v té době dobré úvodní materiály poměrně těžké najít, takže bylo třeba trochu zkoumání, experimentování (a také jisté frustrace…) než do sebe věci začaly zapadat. Netřeba dodávat, že mé studium arabštiny se náhle zastavilo, protože jsem se tímto úžasným softwarem fascinoval a nakonec jsem se pustil do psaní LuaTeX [pluginů pro sazbu arabštiny](http://www.readytext.co.uk/?p=3143) místo toho!

Moje vlastní „cesta LuaTeXem“ byla jistě velmi nelineární, ale cestou poskytla příležitost dozvědět se o (Lua)TeXu (a instalacích TeXu) „od úplných základů“: můj blog hostí eklektickou sbírku [články](http://www.readytext.co.uk/?cat=3) příspěvků založených na různých tématech, která jsem v té době zkoumal a na kterých jsem pracoval. Doufejme, že tento článek tohoto času a zkušeností vhodně využívá a pomáhá ostatním vzbudit zájem začít zkoumat možnosti LuaTeXu. LuaTeX je nadále vyvíjen a v době psaní tohoto textu dosáhl verze 1.0.4, která byla vydána s TeX Live 2017. Vývojáři jsou velmi aktivní a případné chyby jsou obvykle opraveny brzy po nahlášení — např. prostřednictvím [mailing listu dev-luatex](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) nebo prostřednictvím [online sledovače chyb LuaTeXu](http://tracker.luatex.org/my_view_page.php). Dávno předtím, než dosáhl verze 1.0, byl LuaTeX použitelný v produkci — ačkoli jste samozřejmě museli akceptovat, že se funkce neustále vyvíjejí a že změny mohly občas rozbít váš stávající TeXový kód. Dnes je LuaTeX samozřejmě podporován platformami Overleaf a ShareLaTeX (jako LuaLaTeX).

## TeX v měnícím se světě: Nové technologie a pracovní postupy

Je zřejmé, že TeXová jádra nepůsobí v technologicky statickém světě a občas se objeví inovace, které jsou okamžitými a zřejmými kandidáty k začlenění do TeXových jader — jednou takovou inovací jsou proměnlivé fonty OpenType, o nichž krátce pojednáme níže. Ačkoli není pochyb o tom, že na TeXu založený sazební software je mimořádně všestranný, TeXová jádra nyní fungují v rychle se měnícím a velmi rozmanitém softwarovém ekosystému — nové pracovní postupy zdůrazňují potřebu integrace a flexibility při implementaci široké škály řešení pro dokumenty a sazbu, z nichž TeX může být jen jednou součástí.

TeX musí zůstat relevantní nejen pro své současné uživatele, ale také přitahovat nové tím, že umožní řešení pro tvorbu obsahu, která zůstanou užitečná pro přicházející generace — lidem, kteří možná nebudou chtít používat TeX jako samostatný nástroj, ale třeba jako součást celého pracovního postupu prostřednictvím online spolupracujících platforem, jako je Overleaf.

I pouhý stručný pohled na [tex.stackexchange](https://tex.stackexchange.com/) ukazuje obrovskou rozmanitost dokumentů a řešení vytvářených a implementovaných pomocí TeXového softwaru — často s neuvěřitelnou vynalézavostí, jak lidé nacházejí stále více případů použití a typů obsahu, které chtějí generovat. Navíc nikdy nebyla větší potřeba pracovních postupů, které dokážou zpracovat na TeXu založený značkovací jazyk/obsah a vytvořit výstupy jiné než PDF (a jiné než DVI) — například MathML/XML a HTML. Například „převádění“ TeXu do [JATS XML](https://jats.nlm.nih.gov/) formátu (dlouho používaného v akademickém časopiseckém vydávání), ale také v poslední době vzestup epub používaného ve vydávání elektronických knih.

### Technologie proměnlivých fontů — Časy se mění

Dne 14. září 2016 Microsoft, [Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [Adobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) a Apple oznámily novou technologii fontů: [proměnlivé fonty OpenType](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). Této technologii se nebudeme věnovat do detailu, ale stačí říci, že vysoce respektovaní odborníci na fonty, jako jsou [Thomas Phinney](https://twitter.com/ThomasPhinney) a [John Hudson](https://twitter.com/TiroTypeworks) si všimli ([na Twitteru](https://twitter.com/ThomasPhinney/status/917087509342851072)), že technologie proměnlivých fontů je přijímána mnohem rychleji než mnoho dřívějších fontových inovací — pravděpodobně je to poháněno potřebami webdesignérů vyžadujících responzivní návrhy, které se přizpůsobují nesčetným různým velikostem/rozlišením obrazovek na mobilních zařízeních.

Je zřejmé, že proměnlivé fonty OpenType jsou zajímavým a vzrušujícím vývojem v oblasti fontových technologií, z něhož by uživatelé TeXu nepochybně mohli těžit — tato otázka byla ostatně nevyhnutelně [vznesena na tex.stackexchange](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) přičemž podpora LuaTeXu byla diskutována na LuaTeX [mailing listu](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

Mimochodem stojí za zmínku, že technologie fontů založená na „parametrické“ tvorbě fontů není zcela nová myšlenka: Knuthův METAFONT a technologie Adobe Multiple Master jsou v jistém smyslu ranými předchůdci, i když detaily implementace jsou poněkud odlišné.

### Proměnlivé fonty: Kdy je chceme — teď?

Každý nový a užitečný technologický standard/specifikace potřebuje čas, aby se „zabydlel“ ve svém cílovém ekosystému vývojářů a implementátorů — včetně času na vyjasnění případných nejednoznačností nebo výkladů formulací přímo ve specifikaci. Vývojáři si musí dokumentaci přečíst a pochopit ji a převést ji do skutečně fungujícího softwaru — což zde zahrnuje vytváření fontů a technologií pro jejich použití: kompatibilních prohlížečů a sazebních jader. Vývojáři TeXu budou zjevně potřebovat přístup ke kvalitním proměnlivým fontům, které lze použít jako spolehlivá „měřítka“ pro implementaci (programování) podpory technologií proměnlivých fontů.

Zavedení jakékoli nové technologie v TeXu, například proměnlivých fontů, vyvolává *potenciální* potřebu upravit interní části TeXových jader — samozřejmě, potřeba to udělat závisí na povaze dané technologie a zásadně na tom, která část chování TeXu je měněna. Není vždy nutné upravovat přímo samotná TeXová jádra, někdy stačí změny v podpůrném/doplňkovém softwaru, včetně jakýchkoli „komponent“ (knihoven kódu třetích stran) používaných v těchto programech. Vnitřně jsou TeXová jádra *ďábelsky* složitá — vyvinout porozumění zdrojovému kódu TeXu natolik, aby bylo možné provádět spolehlivé úpravy, vyžaduje značné a vysoce specializované odborné znalosti (kterých je velmi omezené množství). Je také zásadní, aby žádné úpravy nepříznivě neovlivnily dlouhodobou stabilitu/kompatibilitu TeXových jader — což je životně důležité pro komunitu TeXu i pro ty, kdo následně zpracovávají autorovy (La)TeXové soubory: zejména akademická nakladatelství a cloudové služby, jako jsou Overleaf a ShareLaTeX.

Mnoho uživatelů TeXu bude pravděpodobně mít zájem využívat proměnlivé fonty; například při zavádění nových designových možností nebo hledání řešení záludných sazebních problémů. V jistém smyslu zde tedy vzniká dilema: uživatelé TeXu chtějí přístup k nové technologii, ale její implementace závisí na velmi omezeném zdroji: počtu vývojářů, kteří jsou kvalifikovaní a schopní to uskutečnit. Úprava interních částí TeXu je obtížná a obecně je nejlepší se jí, pokud možno, vyhnout, takže existuje jiný způsob, jak přistupovat k přidávání (některých tříd) nových funkcí/možností do TeXu? Ano! A LuaTeX se vydal právě touto cestou.

#### Rané experimenty: proměnlivé fonty OpenType a LuaTeX

Konstrukce LuaTeXu umožnila rychlé experimentování s technologií proměnlivých fontů. Již v dubnu 2017 měl TeXový formát ConTeXt, který používá LuaTeX,  [beta verzi](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) která implementovala proměnlivé fonty OpenType. To bylo možné, protože podpora fontů v ConTeXtu je zabudována v kódu Lua (a ConTeXt má svůj vlastní načítač fontů napsaný v Lua).

## LuaTeX: Pozadí a historie

LuaTeX je z hlediska TeXu „nováček na scéně“, přestože je aktivně vyvíjen už více než 10 let. Web LuaTeXu [uvádí](http://www.luatex.org/roadmap.html) že LuaTeX vznikl v roce 2005 a (domnívám se) aktivní a soustavný vývoj začal v roce 2006. Kvůli své vlastní složitosti a pečlivosti těch, kteří jej vytvořili, skutečně trvalo LuaTeXu 10 let vývoje, než dospěl k verzi 1.0, která byla [oznámena jeho vývojáři](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso) dne 27. září 2016.

V rámci tohoto oznámení o vydání je důležité prohlášení zásad:

> „Naším hlavním cílem je poskytnout variantu TeXu, která umožňuje uživatelská rozšíření bez nutnosti upravovat vnitřní mechanismy.“

Toto znění dokonale vystihuje filozofii stojící za vývojem LuaTeXu a ukazuje cestu, kterou může na TeXu založený software řešit již zmíněné výzvy: přebírání nových technologií a zachování relevance pro nové generace uživatelů.

Nyní je čas zabývat se druhou otázkou obsaženou v podtitulu tohoto článku: „čím je tak odlišný“. Prozkoumáním významu „...umožňuje uživatelská rozšíření bez nutnosti upravovat vnitřní mechanismy“ můžeme lépe pochopit podstatu toho, co LuaTeX „přináší na stůl“.

## LuaTeX: Otevíráme TeXovu „černou skříňku“

Původní TeXový program Donalda Knutha je společným předkem všech moderních TeXových jader používaných dnes a LuaTeX je ve skutečnosti nejnovějším evolučním krokem: vychází z programu pdfTeX, ale s přidáním několika výkonných softwarových komponent, které přinášejí značnou dodatečnou funkcionalitu. Když Knuth psal původní verzi softwaru TeX, poskytl také jazyk TeX jako způsob ovládání a programování jeho sazebního chování: uživatelům a vývojářům TeXových makrobalíčků zpřístupnil přibližně 320 nízkoúrovňových příkazů (primitiv). Tyto příkazy nabízely různou míru kontroly nebo vlivu nad určitými aspekty sazebního chování TeXu, ale velká část vnitřní funkcionality, algoritmů, rozhodovacích procesů, dat a datových struktur TeXu byla skryta před uživatelem. Lze říci, že Knuthův TeXový program nebyl úplně „černou skříňkou“, ale rozhodně měl velmi tmavý odstín šedi — sice byl zdrojový kód zpřístupněn, ale pro naprostou většinu lidí je i ten černou skříňkou nesrozumitelnosti.

Vnitřní procesy v TeXu označujeme jako jakousi „černou skříňku“; LuaTeX však otevírá své na TeXu založené vnitřnosti a poskytuje uživatelům/vývojářům mnohem větší přístup k mnoha dříve skrytým procesům probíhajícím hluboko uvnitř TeXového jádra a také nad nimi větší kontrolu. LuaTeX také přidává mnoho nových primitivních příkazů, které umožňují ovládání nových funkcí.

### LuaTeX: Odvozený od pdfTeXu, ale nepoužívá kód pdfTeXu

Pro přesnost je důležité poznamenat, že ačkoli jsme LuaTeX popsali jako odvozený od pdfTeXu, LuaTeX přímo nepoužívá původní programový kód pdfTeXu. Jeden z vývojářů LuaTeXu (Taco Hoekwater) se ujal skutečně *herkulesovského* úkolu přepsat jádro TeXového enginu LuaTeXu do čistého, moderního kódu C (CWEB).

#### Historická poznámka

Částečně kvůli stáří původního zdrojového kódu TeXu od Knutha — z něhož jsou odvozeni jeho moderní potomci — je jeho úprava za účelem přizpůsobení nebo vytvoření nových sazebních jader založených na TeXu složitým a zamotaným procesem. Součástí tohoto procesu je převod kódu Pascal do kódu C — což se neobejde bez určitého [určitého stupně složitosti](http://www.readytext.co.uk/?p=2529). Výsledný strojově generovaný kód C je mimořádně ukecaný a velmi těžko se čte či chápe. Je zřejmé, že úplný přepis kódu LuaTeXu obchází celý proces převodu z Pascalu do C.

## Stavební bloky LuaTeXu

V úvodu jsme se odvolali na to, že LuaTeX je „sada nástrojů“, a popsali jsme jej jako „systém pro konstrukci a inženýrství dokumentů“. Viděli jsme, že v oznámení LuaTeX 1.0 jeho vývojáři uvedli:

> „Naším hlavním cílem je poskytnout variantu TeXu, která umožňuje uživatelská rozšíření bez nutnosti upravovat vnitřní mechanismy.“

Nyní je čas tyto nitky a myšlenky spojit a zaměřit se na detaily toho, co to vše *ve skutečnosti znamená* v praxi.

### Skládačka LuaTeXu

Kdybyste se podívali „pod kapotu“, viděli byste, že software LuaTeX, tedy skutečný spustitelný program, je složen ze sbírky softwarových komponent, které jsou spojeny dohromady, aby poskytly celkovou funkcionalitu LuaTeXu. Samozřejmě, na tom není nic nového a většina softwaru je konstruována právě takto. To, čím se však LuaTeX liší od ostatních TeXových jader, je to, že tyto komponenty jsou propojeny tak, že uživatelé získávají mnohem větší přístup k mnoha aspektům vnitřní funkcionality TeXu: k sazebním algoritmům, rozhodovacím procesům, datům a datovým strukturám TeXu. Toto otevření vnitřku TeXu umožňuje uživatelům vytvářet nová sazební řešení bez nutnosti upravovat samotné TeXové jádro.

### Lua v LuaTeXu: Klíč k „černé skříňce“

Lua je velmi výkonný, a přitom snadno naučitelný skriptovací jazyk, který [pochází z Brazílie](https://www.lua.org/about.html)—byl vytvořen v roce 1993 a je dodnes aktivně vyvíjen. Jednou ze silných stránek Lua je jeho použití jako programovacího jazyka, jímž lze „slepit“ nesourodé softwarové komponenty, což umožňuje jejich používání prostřednictvím jednoduchého, ale všestranného skriptovacího jazyka. Lua hraje ústřední roli při otevírání vnitřního fungování TeXového jádra LuaTeXu, ale pro lepší pochopení, jak toho je dosaženo, stojí za to na chvíli odbočit a velmi stručně probrat dva programátorské pojmy:

* aplikační programové rozhraní (API);
* vazba programovacího jazyka.

Klidně tuto sekci přeskočte, pokud vám tyto pojmy vyhovují. Ani jedno z témat nebude podrobně rozebráno — neusilujeme o striktní technickou přesnost, ale spíše o poskytnutí právě takového množství pozadí, aby bylo možné si těchto pojmů všimnout: jejich významu a relevance pro LuaTeX.

### Aplikační programové rozhraní (API)

Představte si, že jste programátor, který napsal nějaký kód, který by ostatní uživatelé (jiní programátoři) mohli považovat za užitečný, ale váš kód je složitý a nechcete, aby se uživatelé vašeho kódu museli zabývat těmito nízkoúrovňovými detaily. Všimněte si, že tito programátoři/vývojáři pracují se stejným programovacím jazykem, který jste použili při psaní svého kódu. Dále předpokládejme, že plánujete přepsat některé části svého kódu — např. aby byl rychlejší, vyžadoval méně paměti a podobně. Stávající uživatelé vašeho kódu by se tím neměli muset zabývat: jakékoli změny, které plánujete provést, by neměly rozbít jejich programy. Jaké je tedy řešení?

Odpověď spočívá v něčem, čemu se říká API: tedy *aplikační programové rozhraní*. Místo toho, abyste po uživatelích (jiných programátorech) chtěli přístup k nízkoúrovňovým detailům vašeho kódu — které by se mohly změnit — poskytujete konkrétní sadu *funkcí* které mohou ostatní programátoři používat. Tyto funkce jsou *rozhraní* k vašemu kódu, přes které mohou ostatní vývojáři vytvářet *aplikace* bez nutnosti důvěrně znát vnitřní fungování vašeho programu. V jistém smyslu si to můžete představit jako další vrstvu, která obklopuje váš kód a „izoluje“ uživatele od neuspořádaných nízkoúrovňových detailů.

Pokud tyto funkce (rozhraní) nezměníte, můžete svobodně upravovat a aktualizovat nízkoúrovňové detaily svého softwaru, aniž by to ovlivnilo (rozbilo) práci těch, kteří se na váš kód spoléhají při vytváření svých aplikací: odtud název Aplikační programové rozhraní.

#### API: analogie s balíčkem LaTeXu

Když používáte příkazy poskytované balíčkem LaTeXu, můžete na příkazy balíčku nahlížet jako na formu API. Jako uživatele vás nemusí nutně zajímat TeXové a LaTeXové kouzlení za těmito příkazy (tj. v kódu balíčku): vše, co chcete, je využít funkcionalitu, kterou poskytují.

### Vazba programovacího jazyka

Viděli jsme, že programátoři, kteří napíší/vydají soubor užitečného kódu (nazývaný *knihovna*), mohou poskytnout takzvané aplikační programové rozhraní (sadu funkcí), jehož prostřednictvím mohou ostatní programátoři používající *stejný* programovací jazyk, mohou tuto knihovnu (soubor kódu) používat. To je v pořádku, když obě strany (vývojář knihovny a její uživatelé) používají *stejný* programovací jazyk, ale co se stane, když programátoři používající *jiný* programovací jazyk chtějí také používat tuto knihovnu? Můžete například psát skripty v jazyce Lua, ale chtít využít knihovnu napsanou například v programovacích jazycích, jako jsou C/C++. Nějakým způsobem potřebují tyto dva různé programovací jazyky (Lua a C/C++) schopnost spolu „komunikovat“. Jedním řešením tohoto problému je takzvaná [vazba jazyka](https://en.wikipedia.org/wiki/Language_binding).

Prozkoumání technických detailů vazby jazyka je mimo rozsah tohoto článku, takže poskytneme stručné shrnutí obecných zásad. V podstatě se přidáním vhodné dodatečné „vrstvy“ k původní knihovně může „dorozumívat“ s jiným programovacím jazykem (například s Luou): tato vrstva kódu se nazývá *vazba*. Umožňuje oběma jazykům spolupracovat prostřednictvím API, přes které mohou programátoři v druhém jazyce (například v Luě) přistupovat k funkcím/službám poskytovaným knihovnou.

![Schematický diagram znázorňující koncept vazby jazyka.](/files/e5c5b5da1ed5a777cc92352dcf37b53648a9d925)

**Obrázek 1**: Schematický diagram znázorňující koncept vazby jazyka: umožňuje programu napsanému v Lua používat externí knihovnu napsanou v jiném programovacím jazyce. Právě prostřednictvím vazeb Lua je uživatelům zpřístupněna vnitřní část LuaTeXu, a tedy i velká část jeho vnitřní sazební funkčnosti, aby mohli vyvíjet řešení složitých sazebních problémů.

## LuaTeX: Dvě možnosti programování — TeX a Lua

V podstatě je LuaTeX TeXové jádro, které podporuje dva programovací jazyky: tradiční na TeXu založený jazyk a skriptovací jazyk Lua. Samozřejmě můžete používat oba jazyky ve stejném TeXovém dokumentu nebo, pokud chcete, pokračovat v sazbě pouze cestou TeXu: například prostřednictvím makrobalíčku LaTeX (LuaLaTeX). TeX (nebo LaTeX) není snadný programovací jazyk k používání ani ke učení a poměrně málo lidí skutečně zvládlo četné zvláštnosti TeXu — TeXovy pojmy [tokeny](https://www.overleaf.com/blog/522-what-is-a-tex-token) a expanze jsou většině očekávání a zkušeností lidí s programovacím jazykem zcela cizí.

Přidání jazyka Lua otevírá možnost používat TeXem založenou sazbu prostřednictvím mnohem přístupnějšího a konvenčnějšího programovacího jazyka — jak bylo poznamenáno na začátku tohoto článku, pomocí Lua API můžete provádět [sofistikovanou sazbu s prakticky žádným TeXovým kódem](http://wiki.luatex.org/index.php/TeX_without_TeX).

### LuaTeX přidává mnoho nových primitiv

Každé TeXové jádro poskytuje stovky tzv. primitivních příkazů: základní stavební kameny na TeXu založeného jazyka podporovaného každým jednotlivým sazebním jádrem. Původní verze TeXu vydaná Donaldem Knuthem poskytovala přibližně 320 příkazů, ale novější TeXová jádra (pdfTeX, XeTeX a LuaTeX) přidala každé mnoho nových primitiv, aby uživatelům poskytla přístup k dodatečným funkcím a možnostem každého jádra. Značný počet nových primitiv LuaTeXu je dokumentován v jeho [Referenční příručce](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

Mezi mnoha novými primitivy zavedenými LuaTeXem je jedno nazývané `\directlua{...}` které je branou k používání kódu Lua: zpřístupňuje vnitřní mechanismy jádra LuaTeXu, aby bylo možné vytvářet sofistikované sazební nástroje a řešení.

### \directlua{...}: Brána k programování v Lua

Jak již bylo řečeno, skriptovací jazyk Lua lze chápat jako poskytování „vrstvy“, jejímž prostřednictvím je možné získat přístup k TeXovému sazebnímu jádru LuaTeXu a k funkcionalitě poskytované mnoha komponentami, z nichž je LuaTeX sestaven. Jazyk Lua je také mechanismem, který umožňuje rozšiřitelnost LuaTeXu — díky schopnosti jazyka Lua načítat specializované externí knihovny softwaru/kódu.

Souhrnně se rozhraní Lua (soubor funkcí založených na Luě) poskytované LuaTeXem označuje jako jeho *Lua API*: je to „komunikační spojení“ mezi vnitřním jádrem/komponentami LuaTeXu a uživatelským dokumentem.

### Jednoduchý příklad \directlua{...}

Následující *nesmírně jednoduchý* příklad se ani nezačíná dotýkat špičky ledovce možností. Slouží však k demonstraci základní myšlenky souhry mezi „TeXovým způsobem“ a „Lua způsobem“ přístupu k parametrům TeXu.

Všimněte si, že:

* `\hsize` je TeXové primitivum (příkaz), které nastavuje hodnotu interního parametru určujícího šířku sázených řádků — například ho obvykle nastavíte na vhodnou hodnotu v `\vbox{...}`. `\hsize` je jen jeden z *mnoha* TeXových parametrů, ke kterým můžete přistupovat a/nebo je upravovat pomocí kódu Lua.
* Přístup k TeXovým parametrům je jen jeden *drobný* aspekt Lua API LuaTeXu: je toho mnohem víc!

```latex

\documentclass{article}
\begin{document}
\let\\\relax %předefinujte význam \\ aby se předešlo problémům s expanzí
Zde je aktuální hodnota {\ttfamily\string\hsize} (prostřednictvím \LaTeX):
\the\hsize\par
\directlua{
%Získejte aktuální hodnotu \hsize pomocí Lua API
local hs=tex.hsize
% Použijte funkci Lua API k vypsání několika
% LaTeXového kódu a hodnoty \hsize
tex.print("Zde je hodnota {\ttfamily\string\hsize}
nahlášená z kódu Lua (ve škálovaných bodech): ")
tex.print(hs.."\par")
%Nastavte novou hodnotu \hsize pomocí Lua API
tex.hsize="400pt" % nebo použijte tex.hsize=400*65536 (ve škálovaných bodech)
}%
%Poté, co \directlua skončí, požádejte LaTeX
% aby nám sdělil novou hodnotu \hsize
Zde je hodnota {\ttfamily\string\hsize} uvedená
\LaTeX{} po dokončení {\tt\string\directlua}:
\the\hsize\par
\end{document}
```

Zde je obrázek, který ukazuje výsledek sazby LaTeXového kódu LuaTeXem (výše):

![Výsledky spuštění LuaTeXu](/files/0f47252346315708894c729952e3c973f7e4f74d)

Všimněte si, že TeXové „kouzlení“ pomocí `\let\\\relax` je, aby se předešlo problémům způsobeným LuaTeXovou „expanzí“ kódu Lua: tomuto tématu se krátce věnujeme níže.

### Používání kódu Lua

Existují dvě hlavní možnosti použití kódu Lua ve vašich TeX/LaTeXových dokumentech:

1. **Vloženě**: Psaní kódu Lua přímo ve vašem `.tex` dokumentu (jako v příkladu výše);
2. **Externě**: Ukládání kódu Lua do externích `.lua` souborů s kódem a používání možností Luay k jejich načtení a spuštění.

Možnost (1) je nejvhodnější pro kratší úseky kódu Lua. Možnost (2) se používá pro větší programy nebo knihovny kódu Lua. Má výraznou výhodu v tom, že se můžete vyhnout záludným problémům týkajícím se takzvaných TeXových `\catcode` hodnot (což může být „dosti frustrující“). Důvodem těchto `\catcode` problémů je „expanze“ kódu Lua před jeho předáním vestavěnému interpretovi Lua v LuaTeXu. Tuto expanzi může být obtížné pochopit, takže ji prozkoumáme podrobněji v některém z následujících článků.

Samozřejmě existují LaTeXové balíčky, které pomáhají při používání kódu Lua ve vašich .tex souborech — například můžete použít [balíček luacode](https://ctan.org/pkg/luacode?lang=en).

## Shrnutí a uvedení 2. části tohoto článku

Softwarové komponenty, z nichž je LuaTeX sestaven, spolu s vloženým skriptovacím jazykem Lua poskytují silnou kombinaci pro vytváření řešení schopných řešit širokou škálu složitých problémů sazbového zpracování — a pro navrhování pracovních postupů při produkci dokumentů, které mohou těžit z úzké integrace se sazečským enginem založeným na TeXu. V [2. část tohoto článku](/latex/cs/clanky-do-hloubky/09-an-introduction-to-luatex-part-2-understanding-directlua.md) se podrobně podíváme na nejmocnější příkaz, který LuaTeX poskytuje: `\directlua`.

Do té doby, příjemné LuaTeXování!

## Poděkování

Autor je velmi vděčný [Luigimu Scarsoovi](https://twitter.com/luigi_scarso), jednomu z vývojářů LuaTeXu, za to, že si našel čas přečíst návrh tohoto článku a poskytl řadu velmi užitečných komentářů a návrhů. Veškeré zbývající věcné chyby či opomenutí jsou samozřejmě autorovy. Kromě toho bych chtěl poděkovat [Patricku Gundlachovi](https://twitter.com/patrickgundlach), vývojáři [speedata publisher](https://speedata.github.io/publisher/), za to, že si udělal čas a odpověděl na mé otázky.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/cs/clanky-do-hloubky/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
