> 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/dalsi-temata/18-how-overleaf-created-the-tex-primitive-reference-data.md).

# Jak Overleaf vytvořil referenční data primitiv TeXu

Tento článek popisuje metody a techniky použité k vytvoření dvou tabulek křížových odkazů na primitivní příkazy TeXu:

* [Primitiva TeXu uvedená podle enginu TeXu](/latex/cs/dalsi-temata/46-tex-primitives-listed-by-tex-engine.md) a;
* [Primitiva TeXu uvedená podle enginu CJK TeX](/latex/cs/dalsi-temata/45-tex-primitives-listed-by-cjk-tex-engine.md).

Tyto informace jsou poskytovány čtenářům, které zajímají jemnější detaily, ale nejsou nezbytné pro samotné používání tabulky křížových odkazů. Abychom vyhověli potřebám různých čtenářů, poskytujeme velmi krátké souhrnné shrnutí spolu s delším vysvětlením pro ty, kdo chtějí zkoumat problematiku do větší hloubky.

## Krátké shrnutí/přehledová verze

Aby Overleaf sestavil tabulku křížových odkazů, zpracoval zdrojový kód 9 enginů TeXu, aby z každého získal seznam primitiv, která podporuje: tento proces vytvořil 9 textových souborů (1 soubor na každý engine TeXu). Těchto 9 sad primitiv bylo sloučeno do vytvoření „hlavního seznamu“, který byl v podstatě sjednocením jednotlivých sad primitiv: výsledkem bylo celkem asi 1000 jedinečných primitiv rozprostřených napříč různými enginy. Pro každý engine byl jeho vlastní seznam primitiv porovnán s hlavním souborem (sadou všech příkazů), aby se určilo, které z těchto přibližně 1000 příkazů podporuje: tato porovnání jsou shrnuta v následujících dvou tabulkách:

* [Křížově referenční data primitiv TeXu](/latex/cs/dalsi-temata/46-tex-primitives-listed-by-tex-engine.md)
* [Křížově referenční data primitiv TeXu (pro CJK enginy)](/latex/cs/dalsi-temata/45-tex-primitives-listed-by-cjk-tex-engine.md)

## „Budování softwaru“ 101: Co to znamená?

V průběhu zbytku tohoto článku budeme odkazovat na pojem „budování enginů TeXu“, což může být neznámý koncept, pokud nejste programátor, nebo neprogramujete v kompilovaných jazycích, jako je C nebo C++. Pro naše účely je budování softwaru — tj. enginů TeXu — proces vytváření spustitelného programu TeX z jeho složek — zdrojových kódových souborů napsaných v programovacím jazyce použitém k vývoji programu.

## Úplná verze: Chcete detaily? Čtěte dál...

Každý sázecí engine založený na TeXu podporuje „dialekt“ jazyka TeX: konkrétní sadu primitivních příkazů, které řídí sázecí funkce každého enginu a poskytují stavební kameny pro vytváření/definování maker: uživatelsky definovaných sekvencí příkazů. Každé makro, ať už je napsáno pro LaTeX, plain TeX nebo jakýkoli jiný balík maker, je nakonec sestaveno z primitivních příkazů — ačkoli možná budete muset proniknout poměrně hluboko skrz vrstvy dalších maker, než se dostanete k „základní vrstvě“ primitiv TeXu. Sada 9 enginů TeXu analyzovaných za účelem vytvoření referenčních dat o primitivních příkazech má samozřejmě mnoho příkazů společných, ale každý engine TeXu má také své vlastní primitivní příkazy, přidané jeho vývojáři, aby poskytoval podporu funkcím specifickým pro tuto „verzi“ TeXu.

Primitivní příkazy enginu TeXu jsou zabudovány do spustitelného softwaru TeX: primitiva nejsou makra vytvořená uživateli, jsou to základní, nedělitelné/atomické instrukce používané k řízení sázecího chování každého enginu. Proto je nejspolehlivějším způsobem, jak vytvořit definitivní seznam primitivních příkazů podporovaných libovolným enginem TeXu, prozkoumat skutečný zdrojový kód, ze kterého jsou spustitelné programy TeX sestavovány (kompilovány), a z něj extrahovat seznam primitiv definovaných ve zdrojovém kódu. Zní to, že by to mělo být snadné, že? Nicméně vzhledem ke 40leté historii vývoje TeXu není zkoumání/prohlížení zdrojových kódových souborů enginů TeXu (s výjimkou LuaTeXu) zrovna přímočaré. Důvodem těchto složitostí jsou nástroje, programovací jazyk (Pascal) a metodika (literate programming), které Knuth použil k napsání původního zdrojového kódu TeXu — z něhož jsou nakonec odvozeny všechny ostatní enginy.

Poznamenáváme výjimku pro LuaTeX, protože jeho jádrový kód enginu byl přepsán v C, aby se odstranilo použití Pascalu a dalších starších složitostí podrobně popsaných níže (Web2C); proto je sice zdrojový kód LuaTeXu rozsáhlý, ale způsob, jakým je „zabalen“ a distribuován, je ve srovnání s ostatními enginy TeXu mnohem srozumitelnější. V důsledku toho a na základě pracovního postupu/procesů použitých k jejich sestavení ze zdrojového kódu je vhodné rozdělit enginy TeXu do dvou kategorií:

1. LuaTeX: vlastní (modernější) proces sestavení
2. Všechny ostatní enginy: starší proces sestavení (Web2C)

## Kontext staršího kódu: Proč je budování (většiny) enginů TeXu složité

Jak uvidíme níže, Knuth vydal svůj původní zdrojový kód TeXu jako jediný monolitický soubor s názvem `tex.web` který Knuth i po 7 letech nadále aktualizuje, aby opravil zbývající chyby — nikdy nejsou přidávány žádné nové funkce, jde čistě o opravy chyb.

Přípona zdrojového kódu TeXu (`.web`) vám pravděpodobně nebude známá a možná se budete divit, v jakém jazyce Knuth TeX napsal? Odpověď je Pascal, ale tato `.web` přípona potřebuje trochu víc vysvětlení. Knuth vyvinul programovací metodiku, kterou nazval [literate programming](https://en.wikipedia.org/wiki/Literate_programming) v níž jsou zdrojový kód programu a dokumentace spojeny dohromady a vydány jako jeden kompozitní soubor (kód plus dokumentace) s příponou `.web`: tomuto typu souboru se říká WEB soubor. Souborům WEB se níže věnujeme o něco podrobněji.

### Vytváření nových enginů TeXu: Knuthova omezení

Ačkoli Knuth už dlouho zpřístupňuje svůj zdrojový kód TeXu (`tex.web`) všem zdarma, stanovil — a je to jeho naprosté právo — zásadní podmínku, že jeho (`tex.web`) zdrojový kód nesmí být přímo upravován/měněn a znovu distribuován pod názvem programu „TeX“. Ve zdrojovém kódu píše:

```
% Tento program je autorsky chráněn (C) 1982 D. E. Knuthem; všechna práva vyhrazena.
% Kopírování tohoto souboru je povoleno pouze tehdy, pokud (1) jste D. E. Knuth, nebo pokud
% (2) ve své kopii neprovedete absolutně žádné změny. (Systém WEB poskytuje
% pro úpravy prostřednictvím pomocného souboru; hlavní soubor by měl zůstat nedotčen.)
```

a také:

```
Pokud je tento program změněn, výsledný systém by se neměl nazývat
`\TeX'; oficiální název `\TeX' sám o sobě je vyhrazen
pro softwarové systémy, které jsou navzájem plně kompatibilní.
Speciální testovací sada nazvaná ``\.{TRIP} test'' je k dispozici pro
pomoc při určování, zda si konkrétní implementace zaslouží být
považována za `\TeX' [srov. zpráva Stanford Computer Science CS1027,
listopad 1984].
```

V podstatě: neprovádějte změny tím, že budete upravovat a distribuovat modifikované verze hlavního zdrojového kódu TeXu a dál jej nazývat `tex.web`. Pokud chcete provést změny, např. přidat nová primitiva atd., musíte tyto změny aplikovat „prostřednictvím pomocného souboru“ a svému „derivátu TeXu“ dát název, který jej odlišuje od „TeXu“, jenž je v typografické podobě ($$\mathrm\TeX$$) ochrannou známkou Americké matematické společnosti.

### Dědictví staršího kódu

Ačkoli existovaly pokusy úplně přepsat TeX pomocí moderních programovacích jazyků a metodik — například dvě iniciativy založené na Javě [New Typesetting System](https://en.wikipedia.org/wiki/New_Typesetting_System) a [εχTEX](http://www.extex.org/) a další, například [jedna v Clojure](https://www.infoq.com/news/2015/01/implementing-tex-in-clojure), žádná nebyla zcela úspěšná. Historie projektů a iniciativ navržených k dalšímu rozvoji TeXu je zajímavé téma a čtenáři mohou chtít [navštívit UK TeX FAQ](https://texfaq.org/FAQ-enginedev) pro další informace.

Ty ne-LuaTeXové iniciativy, které byly také úspěšné, jako e-TeX, pdfTeX, XeTeX a další enginy, byly vybudovány *přímo nahoře* nad původním Knuthovým kódem: vezmou jeho zdrojový kód a „aplikují změny“, aby odvodily nový engine s dalšími schopnostmi — například přidáním nových primitiv, generováním výstupu PDF, podporou vstupu textu UTF-8 a podobně. Ačkoli tato cesta vedla k výrazným úspěchům, znamená to také, že tyto odvozené enginy dědí starší kód a vývojové techniky, které Knuth vytvořil před 40 lety.

Klíčové ponaučení zde je, že kromě LuaTeXu je většina enginů TeXu odvozených z původního Knuthova zdrojového kódu vytvářena tak, že se vezme jediný monolitický soubor (obvykle `tex.web`) a provedou se na něm změny, které vygenerují opět další jediný monolitický soubor obsahující zdrojový kód jádra nového enginu. Pokročilí čtenáři mohou chtít přeskočit vpřed k objasňujícím [poznámkám k pdfTeXu a XeTeXu](#aside-xetex-and-pdftex).

### Několik dalších historických/pozadových informací o TeXu

Moment zrodu TeXu byl [v Knuthově deníku zaznamenán jako 30. březen 1977](/latex/cs/clanky-do-hloubky/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md#the-genesis-of-tex-a-brief-history), nyní před více než 40 lety. Interně je TeX mimořádně složitý program, jehož zdrojový kód Knuth věnoval mimořádnou péči, aby jej [dokumentoval v mimořádných detailech](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373). K tomu Knuth vyvinul styl programování, který nazval [literate programming](https://en.wikipedia.org/wiki/Literate_programming) v němž jsou zdrojový kód programu a dokumentace spojeny dohromady a vydány jako kompozitní soubor s příponou `.web` (označovaný jako WEB soubor). Knuth zvolil Pascal jako programovací jazyk pro psaní svého softwaru TeX a, nepřekvapivě, použil sázecí jazyk TeXu k napsání finální dokumentace. V důsledku toho je hlavní zdrojový kód Knuthova TeXu publikován jako jediný, monolitický soubor s názvem `tex.web`: směs zdrojového kódu v Pascalu a sazebního kódu TeXu pro dokumentaci.

Pokud je program napsán pomocí Knuthova stylu/metodiky literárního programování (jako TeX, MetaFont, BibTeX a další), je třeba soubor WEB předzpracovat, aby se extrahovala dokumentace nebo zdrojový kód. Chcete-li získat dokumentaci programu, zpracujete soubor WEB (např. `tex.web`) pomocí nástroje nazvaného [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) který vytvoří dokumentaci jako `.tex` soubor, který můžete vysázet. Ke stažení zdrojového kódu v Pascalu použijete další nástroj nazvaný [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) který vyprodukuje soubor s příponou `.p` obsahující zdrojový kód v Pascalu.

V době psaní tohoto textu (začátek roku 2019) je nejnovější verze Knuthova TeXu 3.14159265, datovaná leden 2014. Opět si povšimněte, že zdrojový kód Knuthova TeXu je obsažen pouze v jediném souboru obsahujícím přibližně 25 000 řádků kódu TeX/Pascal!

### Z Pascalu do C

Během více než 40 let, které uplynuly od zrodu TeXu, Pascal vyšel z módy a dnes už jen málokdo, pokud vůbec někdo, zvažuje sestavovat TeX z jeho původního zdrojového kódu v Pascalu. Aby se obešlo Knuthovo použití Pascalu, byl navržen pracovní postup nazvaný [Web2C](http://tug.org/texinfohtml/web2c.html) v němž je zdrojový kód TeXu v Pascalu mechanicky (tj. prostřednictvím softwaru) převeden na svou obdobu v kódu C, který se pak použije ke kompilaci TeXu a sestavení spustitelného programu. Funguje to dobře, ale jedinou nevýhodou je, že mechanicky generovaný zdrojový kód C není určen pro běžnou lidskou kontrolu: je *mimořádně* upovídaný a téměř neproniknutelný, protože je určen pro překladače, ne pro lidi — zde je snímek obrazovky ukazující malý úryvek kódu C vygenerovaného z Pascalového zdroje TeXu:

![](/files/cc97ac0ff4362077cac210ec23ad9b0bdb4569f6)

### Další Knuthismus: WEB change files

Jak je uvedeno výše, pro stavbu na původním zdrojovém kódu Knutha „provedete změny“ nebo, Knuthovými slovy, „úpravy prostřednictvím pomocného souboru“: ale co to vlastně znamená? Přichází na řadu *mechanismus změnových souborů*.

### Změnové soubory: mechanismus pro vytváření nových enginů TeXu

Vývojáři, kteří chtějí nějakým způsobem rozšířit Knuthův TeX, tj. navázat na Knuthovu původní práci, obvykle chtějí vytvořit zcela novou „verzi“ TeXu nebo poskytnout *rozšíření* které lze přidat do libovolného enginu TeXu. Příklady rozšíření zahrnují [SyncTeX](https://github.com/jlaurens/synctex) a [EncTeX](https://ctan.org/pkg/enctex?lang=en)—SyncTeX je například velmi užitečné rozšíření, které je nyní součástí všech enginů TeXu. Potřeba EncTeXu byla do značné míry překonána vývojem enginů TeXu uvědomujících si Unicode — ale všimněte si, že EncTeX je zabudován do pdfTeXu.

Ať už je záměrem vytvořit novou „verzi“ TeXu (tj. derivát původního Knuthova TeXu), nebo vytvořit rozšíření, jeho vývojáři začínají původním zdrojovým kódem Knutha a aplikují úpravy nutné k vytvoření nového enginu TeXu (nebo přídavného rozšíření). Jak však bylo uvedeno výše, každý, kdo chce měnit chování TeXu, to musí dělat pomocí „úprav prostřednictvím pomocného souboru“, protože tyto změny/úpravy nesmějí být provedeny *přímo* úpravou Knuthova původního zdrojového kódu: vývojáři jsou povinni používat tzv. WEB *mechanismus změnových souborů*. Kód pro úpravu Knuthova TeXu je napsán v jazyce WEB a uložen do jednoho nebo více kódových souborů (nazývaných *change files*), které jsou následně *sloučeny* s Knuthovým původním, nedotčeným hlavním zdrojovým kódem. Tento proces sloučení vytvoří nový kompozitní soubor WEB, který nyní obsahuje *jádrový* zdrojový kód nového/měněného softwaru založeného na TeXu. *Change files* často mají příponu `.ch` ale v praxi mohou mít libovolnou příponu, jakou si vývojáři přejí.

#### Jak používáte/aplikujete change files?

V současnosti je nejjednodušší způsob, jak aplikovat change files a upravit „hlavní“ soubor WEB, pomocí utilitního programu nazvaného [TIE](https://ctan.org/pkg/tie). Například si představte, že chcete upravit Knuthův TeX tím, že přidáte například pár nových primitiv nebo chcete změnit chování existujícího (standardního) primitiva TeXu. Svůj kód byste napsali (v Pascalu!) pomocí systému literárního programování WEB a uložili jej do souboru nazvaného například `myprim.ch`. Dalším krokem je sloučit váš kód (v `myprim.ch`) s Knuthovým hlavním zdrojovým souborem `tex.web` a vytvořit nový, kompozitní, soubor WEB představující to, co budeme nazývat `mytex.web`. To provedete jednoduše spuštěním programu TIE takto:

```
tie -m mytex.web tex.web myprim.ch
```

Za předpokladu, že se sloučení zdaří, vznikne tím nový soubor WEB, `mytex.web`a Knuthův hlavní zdrojový soubor `tex.web` zůstane zcela nezměněn, jak je požadováno.

Předpokládejme nyní, že se někomu líbí změny, které jste provedli, a chce upravit vaši práci tak, aby přidal své změny nad vaše, nebo k nim. Namísto distribuce vaší upravené verze TeXu (`mytex.web`) se rozhodnete publikovat/sdílet pouze změnový soubor, `myprim.ch`. Každý, kdo chce na vaší práci stavět, nyní může vytvořit a sdílet svůj změnový soubor nazvaný například `moreprim.ch` který nějakým způsobem rozšiřuje váš kód. Kdokoli další, kdo chce využít oba change files, může nyní vygenerovat nový kompozitní soubor WEB sloučením *obou* change files do Knuthova původního souboru a vytvořit tak další program TeX nazvaný například `newmytex.web`:

```
tie -m newmytex.web tex.web myprim.ch moreprim.ch
```

### Skutečné systémy TeXu: více change files

Výše uvedený popis TIE je ve skutečnosti velmi blízký způsobu, jakým je v praxi sestavována řada enginů TeXu: začínají Knuthovým `tex.web` a přidávají postupně řadu change files, aby vygenerovaly zdrojový soubor WEB pro daný engine. Každý engine TeXu vyžaduje vlastní konkrétní sadu change files, které je třeba aplikovat/zpracovat (sloučit) v přísném pořadí: když pořadí prohodíte, proces sloučení selže, protože každý change file v posloupnosti spoléhá na změny zavedené change files, které v řetězci stojí dříve.

Zde je ukázkové spuštění TIE, které aplikuje více change files na Knuthův `tex.web` aby se vygeneroval `ktex.web`—kompozitní soubor WEB s úpravami Knuthova TeXu, který jej činí připraveným (vhodným) pro převod do C prostřednictvím procesu Web2C. Povšimněte si také následujícího:

* `tex.ch` je velmi velký change file, který mimo jiné upravuje TeX tak, aby používal Kpathsea;
* rozšíření SyncTeX je přidáváno prostřednictvím více change files.

```
tie -m ktex.web tex.web tex.ch enctex.ch synctex-def.ch0 synctex-mem.ch0 synctex-mem.ch2 synctex-rec.ch0 synctex-rec.ch1 synctex-rec.ch2 tex-binpool.ch
Toto je TIE, CWEB verze 2.4.
Copyright (c) 1989,1992 THD/ITI. Všechna práva vyhrazena.
(tex.web)
(tex.ch)
(enctex.ch)
(synctex-def.ch0)
(synctex-mem.ch0)
(synctex-mem.ch2)
(synctex-rec.ch0)
(synctex-rec.ch1)
(synctex-rec.ch2)
(tex-binpool.ch)
....500....1000....1500....2000....2500....3000....3500....4000....4500
....5000....5500....6000....6500....7000....7500....8000....8500....9000
....9500....10000....10500....11000....11500....12000....12500....13000
....13500....14000....14500....15000....15500....16000....16500....17000
....17500....18000....18500....19000....19500....20000....20500....21000
....21500....22000....22500....23000....23500....24000....24500....
(Nebyly nalezeny žádné chyby.)
```

#### Doplňující poznámka: XeTeX a pdfTeX

Pro úplnost je třeba poznamenat, že proces sestavení pro pdfTeX a XeTeX ve skutečnosti nezačíná Knuthovým `tex.web`; místo toho začíná soubory nazvanými `pdftex.web` a `xetex.web` v uvedeném pořadí: zřejmě proto, že změny jsou tak rozsáhlé, že dává větší smysl sdílet/publikovat soubory WEB, které již obsahují velmi podstatné úpravy provedené v Knuthově původním kódu.

### Příklad: e-upTeX

Japonská komunita TeXu vyvinula řadu enginů TeXu navržených tak, aby zvládly složitosti sazby japonského textu:

* **pTeX**: Knuthův engine TeXu rozšířený o podporu sazby japonštiny;
* **e-pTeX**: Kombinace e-TeXu a pTeXu (plus několik primitiv zavedených pdfTeXem);
* **upTeX**: Verze pTeXu uvědomující si Unicode plus rozšíření pro lepší zpracování CJK (čínštiny, japonštiny a korejštiny);
* **e-upTeX**: Kombinace (sloučení) e-TeXu a upTeXu.

#### Generování kompozitního zdrojového souboru pro e-upTeX

Pro vytvoření kompozitního zdrojového souboru WEB pro e-upTeX (s SyncTeXem) začnete Knuthovým `tex.web` ale musíte aplikovat **26** jednotlivé change files v následujícím pořadí, abyste získali jediný kompozitní soubor, z něhož lze extrahovat seznam primitivních příkazů:

```
etex.ch, tex.ch0, tex.ch, tex.ech, etex.ch0,
ptex-base.ch, uptex-m.ch, euptex.ch0, eptex.ech,
etex.ch1, euptex.ch1, synctex-def.ch0, synctex-ep-mem.ch0,
synctex-mem.ch0, synctex-e-mem.ch0, synctex-ep-mem.ch1,
synctex-p-rec.ch0, synctex-rec.ch0, synctex-rec.ch1,
synctex-e-rec.ch0, synctex-p-rec.ch1, fam256.ch,
pdfstrcmp-eup-pre.ch, pdfutils.ch, pdfstrcmp-eup-post.ch,
tex-binpool.ch
```

#### Aplikace change files: které soubory a v jakém pořadí?

Jak již bylo řečeno, je zásadně důležité aplikovat/zpracovávat change files v přesném pořadí — ale jak zjistíte, které soubory jsou potřeba a v jakém pořadí je zpracovat? Naštěstí jsou tyto zásadní informace zaznamenány v souborech obsažených v distribuci TeX Live a prozkoumání zdrojového kódu TeX Live odhalilo pravidla, která řídí požadavky na sestavení každého enginu TeXu. Podle těchto pravidel byl Overleaf schopen rekonstruovat kompozitní soubor zdrojového kódu WEB pro každý engine TeXu a extrahovat seznam primitiv pro další zpracování dat.

## A nakonec: Jak extrahovat seznam primitiv?

Jakmile je kompozitní soubor WEB sestaven, je úkol extrahovat seznam primitiv pomocí regulárních výrazů přímočarý, protože všechny primitivní příkazy jsou definovány („registrovány“) pomocí jediné Pascalové funkce nazvané `primitive(...)`. Zde jsou některé skutečné příklady převzaté z Knuthova `tex.web` zdrojového kódu:

```
primitive("lineskip",assign_glue,glue_base+line_skip_code)
primitive("baselineskip",assign_glue,glue_base+baseline_skip_code)
primitive("parskip",assign_glue,glue_base+par_skip_code)
primitive("abovedisplayskip",assign_glue,glue_base+above_display_skip_code)
primitive("belowdisplayskip",assign_glue,glue_base+below_display_skip_code)
primitive("abovedisplayshortskip",assign_glue,glue_base+above_display_short_skip_code)
...
...
```

Jak vidíte, funkce `primitive(...)` je velmi vhodná pro textové zpracování pomocí regulárních výrazů: název registrovaného primitiva je v uvozovkách (`"..."`) spolu s dalšími daty, která klasifikují chování každého primitiva (tomu se zde nebudeme nijak podrobně věnovat). Po extrakci seznamu primitiv pro každý engine byla tato data zpracována některými skripty v Lua, aby se vygenerovalo HTML obsahující tabulkované výsledky.

### Návrat k LuaTeXu

Zaznamenali jsme, že LuaTeX nepoužívá přesně stejné postupy sestavení jako ostatních 8 enginů TeXu. Poté, co jsme krátce prozkoumali proces Web2C, převod Pascalu do C a mechanismus change files, můžeme nyní vysvětlit, čím se LuaTeX liší: vývojáři LuaTeXu se rozhodli vzdát se těžkopádného procesu převodu Pascalu do C — jak je uvedeno v [Referenční příručce LuaTeXu](http://www.pragma-ade.com/general/manuals/luatex):

> ...kompilační rámec je web2c a ten používáme dál, ale bez kroku Pascal do C.

Jádrový engine LuaTeXu byl přepsán v C, což znamená, že jeho proces sestavení je poněkud standardnější a rozhodně mnohem pohodlnější. Jedním užitečným důsledkem je, že primitiva podporovaná LuaTeXem jsou pěkně vyčleněna do samostatného zdrojového souboru v C, což výrazně usnadnilo úkol jejich přístupu/výpisu.

Přesně vzato bychom také měli poznamenat, že některé zdrojové soubory LuaTeXu používají variantu Knuthovy metodiky literárního programování, nazvanou [CWEB](https://en.wikipedia.org/wiki/CWEB), která je založena na C a nikoli na Pascalu.

### Nejen soubory WEB: je vyžadován i jiný zdrojový kód

Po vygenerování kompozitního zdrojového souboru WEB pro jakýkoli engine TeXu (kromě LuaTeXu) je třeba Pascalový zdrojový kód extrahovat a převést do kódu C, ale to není celé řešení. Kromě kódu C vygenerovaného ze zdroje WEB (Pascal⮕C) se většina enginů TeXu také spoléhá (vyžaduje) na řadu dalších pomocných zdrojových souborů (knihoven), které jsou obvykle psány v C — například [Kpathsea](https://www.tug.org/kpathsea/). Pomocné zdrojové soubory (knihovny) implementují funkcionalitu, kterou není nutné, nebo nelze, psát ve WEBu (Pascalu). Cokoli napsaného v jazyce WEB pro TeX musí používat jazyk Pascal, který je následně extrahován a převeden na strojově generovaný C: pokud to dělat nepotřebujete, proč to jednoduše nenapsat rovnou v C nebo C++.


---

# 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/dalsi-temata/18-how-overleaf-created-the-tex-primitive-reference-data.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.
