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
Datum | Kód | Bodů | Zadání |
---|---|---|---|
9. 10. | ndsp | 1 | Popiš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. | disp | 1 | Vymyslete, 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. | slpc | 1 | Vysá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. | ram | 1 | Vysá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. | box | 1 | Vysá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. | okraj | 1 | Navrhně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. | token | 1 | Př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. | gcd | 1 | Definujte 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. | rozvrh | 1 | Vysázejte svůj rozvrh hodin. (Nebo třeba rozvrh své oblíbené posluchárny.) |
17. 12. | bull | 1 | Napiš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. | uniop | 1 | Nastavte 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éno | Příklady | Bodů |
---|---|---|
David Čepelík | ndsp(1) slpc(1) | 2 |
Jan Hadrava | ndsp(1) disp(1) ram(1) box(1) okraj(1) gcd(1) token(1) | 7 |
Jan Horák | ndsp(1) disp(1) slpc(1) ram(1) box(1) okraj(1) token(1) | 7 |
Richard Hladík | slpc(1) ram(1) box(1) okraj(1) gcd(1) token(1) uniop(1) | 7 |
Viktor Němeček | ndsp(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
- Minulý ročník semináře
- Donald Knuth: The TeXbook. (Addison-Wesley Professional, 1984, ISBN 0201134489)
- Donald Knuth: TeX: The Program. (Addison-Wesley Professional, 1986, ISBN 0201134373)
- Petr Olšák: TeXbook naruby. (2. vydání, Konvoj, 2001, ISBN 8073020076)