Seminář o TeXu

V zimním semestru 2018/2019 vedeme s Vladanem Majerechem Seminář o TeXu. Spíš než uživatelskému pohledu na TeX se věnujeme tomu, jak TeX funguje uvnitř, jaké algoritmy používá a jak ho přiohnout pro různé méně obvyklé účely. Také se chceme zabývat různými rozšířeními TeXu, jako je pdfTeX a LuaTeX. Viz též reklamní letáček.

Seminář se koná v úterý od 12:20 na chodbě S321 (nebo v pracovně S322).

Zápočet si vysloužíte za vyřešení alespoň 7 domacích úkolů. Zadání najdete níže, řešení prosím posílejte e-mailem na tex@ucw.cz.

datum co jsme dělali
9. 10. Jak TeX interaguje s okolím. První představení algoritmu na odstavcový zlom. Výpočet demerits a odstavcový zlom jako nejkratší cesta v grafu.
16. 10. Anatomie horizontálnich seznamů. Algoritmus pro sestavení boxu a výpočet badness. Tvar odstavce, leftskip, rightskip a looseness.
23. 10. Jak vzniká horizontální seznam: mezislovní mezery, kerning, ligatury, automatické dělení slov. Šest módů a přechody mezi nimi.
30. 10. Jak vzniká vertikální seznam: penalty, meziřádkové mezery, topskip, parskip. Různé druhy registrů a aritmetika s nimi.
6. 11. Seminář se nekoná: děkanský sportovní den.
13. 11. Boxové registry. Základní algoritmus plnění a zlomu stránek, \vsplit. Motivace pro inserty.
20. 11. Zlom stránek s inserty. Output routiny a jejich úskalí. Jak funguje \raggedbottom. Práce s marky.
27. 11. Input procesor, token procesor, expand procesor.
4. 12. Expand procesor: \noexpand a \expandafter, podmínky, idiomy pro cykly, \loop...\repeat, \begingroup versus \bgroup.
11. 12. Paběrky: token-listové registry, výroba znaku s libovolnou kategorií pomocí \uppercase, konstrukce \every*, \after* a \futurelet. Whatsity: \special a \write. Leaders. Sazba tabulek pomocí \halign a \valign.
18. 12. Pokračování tabulek: \omit, \span, \multispan. Základy matematického módu.
9. 1. Rozšíření TeXu: TeX-XeT, mlTeX, encTeX, ε-TeX, krátká zmínka o pdfTeX-u.

Domácí úkoly

DatumKódBodůZadání
9. 10. ndsp1Popište, jaké položky vložit do horizontálního seznamu, aby vznikla neodstranitelná mezera. Tedy (potenciálně pružná) mezera, na níž je možné provést zlom, ale místo aby pak zmizela, objeví se na začátku následujícího řádku.
16. 10. disp1Vymyslete, jak vytvořit horizontální discretionary mezeru: pokud v ní nedojde ke zlomu, má šírku A; dojde-li, na konci řádku zbude mezera šírky B a na začátku dalšího mezera šířky C. Všem třem rozměrům má jít specifikovat i roztažnost a smrštitelnost (stačí konečná).
23. 10. slpc1Vysázejte tento text základním TeXovým písmem (csr10) do sloupce šířky 4cm (do bloku, nikoliv na praporek). Snažte se najít nastavení parametrů lámacího algoritmu, s nímž žádný řádek nevyjde výrazně špatný. Pošlete nám jak zdrojový text, tak výsledné PDF.
30. 10. ram1Vysázejte odstavec obklopený rámečkem. Odstavec budiž široký 10cm, rámeček 1pt. Mezi levým/pravým okrajem ostavce a rámečkem vynechejte 2pt. Ve svislém směru by rámeček měl ležet 10.5pt nad účařím prvního řádku a 5.5pt pod účařím posledního řádku. Můžete předpokladat, že první řádek je dost nízký a poslední dost mělký, aby se s nimi rámeček nepřekrýval.
13. 11. box1Vysázejte box zadaný v registru \box0 tak, aby okolo něj byl rámeček odpovídající rozměrům boxu a uvnitř linka na účaří. Rámeček má k boxu přiléhat svým vnitřním okrajem, na účaří má ležet střed linky. Tedy podobně, jako jsou kreslené boxy v letáčku.
20. 11. okraj1Navrhněte sazbu poznámek v okraji stránky. Měly by se chovat podobně jako poznámky pod čarou (s odkazem z kokrétního místa v textu), ale místo pod text je sázejte do pravého okraje stránky shora dolů. Zrcadlo vhodným způsobem zužte, aby na poznámky zbylo dost místa. Nemusíte se starat o kompatibilitu se stávajícími plainovými inserty (můžete předefinovat celou output-routinu).
27. 11. token1Předpokládejme, že bylo provedeno \catcode`\*=10 a \def\a#1#2{}. Co a proč je výsledkem expanze při vstupu \a*a*b*c?
4. 12. gcd1Definujte makro \gcd{číslo}{číslo}, které dostane dvě přirozená čísla (v běžném TeXovském zápisu) a vysází jejich největšího společného dělitele.
11. 12. rozvrh1Vysázejte svůj rozvrh hodin. (Nebo třeba rozvrh své oblíbené posluchárny.)
17. 12. bull1Napište makro na sazbu matematického binárního operátoru „býčí oko“. Ten vznikne soutiskem \circ přes \odot. Operátor by měl fungovat ve všech stylech.
8. 1. uniop1Nastavte encTeX, aby uměl sázet unicodové matematické symboly ∀ ∃ → ← ⇒ ⇐ ∧ ∨ ¬.

Výsledky

Pokud chcete být uvedeni pod přezdívkou, nebo dokonce vůbec, dejte mi vědět.

JménoPříkladyBodů
David Čepelíkndsp(1) slpc(1)2
Jan Hadravandsp(1) disp(1) ram(1) box(1) okraj(1) gcd(1) token(1)7
Jan Horákndsp(1) disp(1) slpc(1) ram(1) box(1) okraj(1) token(1)7
Richard Hladíkslpc(1) ram(1) box(1) okraj(1) gcd(1) token(1) uniop(1)7
Viktor Němečekndsp(1) disp(1) slpc(1) ram(1) box(1) okraj(1) gcd(1)7
Pavel Turinskýram(1) box(1) gcd(1) bull(1)4

Literatura

Stránku spravuje Martin Mareš