Seminář o TeXu

V zimním semestru 2016/2017 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á ve čtvrtek od 10:40 v S7. Začínáme 6. října.

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
6. 10. Jak TeX interaguje s okolím. První představení algoritmu na odstavcový zlom.
13. 10. Odstavcový zlom: anatomie horizontálnich seznamů, sestavení boxu a výpočet penalt, zlom jako nejkratší cesta v grafu.
20. 10. Jak vzniká horizontální seznam: kerning, ligatury, mezislovní mezery. Převod nalámaného odstavce na vertikální seznam.
27. 10. Hledání míst k dělení slov. Jak vzniká vertikální seznam: meziřádkové mezery, topskip. Sestavení vboxu. Různé druhy registrů.
3. 11. Aritmetika s registry, použití boxových registrů, token listy. Stránkový zlom a output routiny.
10. 11. Inserty a marky. Jak funguje \raggedbottom.
24. 11. Input procesor, token procesor.
1. 12. Expand procesor: expanze maker, \noexpand a \expandafter, podmínky, idiomy pro cykly.
8. 12. Detaily hlavního procesoru: Smyčky pomocí \loop...\repeat. Výroba znaku s libovolnou kategorií pomocí \uppercase. Konstrukce \every*, \after* a \futurelet. Leaders. Sazba tabulek pomocí \halign a \valign.
15. 12. \begingroup versus \bgroup. Whatsity: \special a \write. Základy matematického módu.
22. 12. Fonty a jejich metriky. Program dvips a jeho speciality. Sazba postscriptovými fonty.
5. 1. Rozšíření TeXu: TeX-XeT, mlTeX, encTeX, ε-TeX, pdfTeX.
12. 1. Rozšíření TeXu: LuaTeX. Sazba OpenType fonty. Jak jsme sázeli letáček semináře.

Domácí úkoly

DatumKódBodůZadání
6. 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.
13. 10. dskip1Vymyslete, 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.
20. 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. (Kromě parametrů zmíněných na semináři by se vám mohly hodit registry \hfuzz, \lefthyphenmin a \righthyphenmin.)
27. 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ůže se ještě hodit vědět, že odstavcová sazba funguje i uvnitř vboxu a zalamuje na šířku \hsize.)
3. 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ří. (Podobně, jako jsou kreslené boxy v letáčku.)
10. 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).
24. 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?
1. 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.
8. 12. rozvrh1Vysázejte svůj rozvrh hodin. (Nebo třeba rozvrh své oblíbené posluchárny.)
15. 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.
12. 1. font2Vyberte si nějaký český TrueType nebo Type 1 font (spoustu jich najdete třeba na ceskefonty.cz) a naučte pdfTeX, aby tímto fontem sázel. Dejte si pozor na tabulky ToUnicode, aby z výsledného PDF šlo správně extrahovat text. Tento a následující úkol lze odevzdávat kdykoliv.
linum2Napište LuaTeXová makro, které vysází zadaný odstavec a očísluje jeho řádky.

Výsledky

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

JménoPříkladyBodů
Meggy Calábkováslpc(1) ram(1) box(1) okraj(1) token(1) gcd(1) rozvrh(1)7
Erik Hendrychtoken(1) gcd(1) bull(1) font(2)5
Václav Končickýndsp(1) dskip(1) slpc(1) box(1) gcd(1) rozvrh(1) bull(1)7
Ondřej Langrslpc(1) box(1) token(1) gcd(1) rozvrh(1) bull(1)6
Ondřej Mičkandsp(1) dskip(1) slpc(1) ram(1) box(1) token(1) gcd(1)7
Tomáš Musilndsp(1) dskip(1) slpc(1) ram(1) box(1) okraj(1) token(1)7
Filip Štědronskýram(1) box(1)2

Literatura

Stránku spravuje Martin Mareš