Co by uživatel L A TEXu měl vědět o (Plain)TEXu Vladimír LUKEŠ Seminář NTC/KME Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 1 / 29
Přehled TEX sázecí systém Úskalí L A TEXu Jak TEX pracuje Shrnutí Literatura V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 2 / 29
Historie TEX sázecí systém, který naprogramoval v 70. letech 20. století profesor Donald Knuth v roce 1989 vydána verze 3.0, dále se pouze opravují chyby a provádějí drobné aktualizace aktuální verze: 3.1415926 (březen 2008) za nalezení chyby v programu odměna $327,68 dokumentovaný zdrojový kód T EXu uložen v jediném souboru tex.web, cca 1 MiB METAFONT systém pro návrh písem, aktuální verze 2.718 základní systém TEX pracuje s přibližně 300 příkazy (primitivy) rozšíření PlainTEX (Knuth) dalších cca 600 příkazů mnoho dalších rozšířeních A MSTEX, AMSL A TEX American Mathematical Society L ATEX Leslie Lamport ConT EXt http://en.wikipedia.org/wiki/tex, http://www.root.cz/clanky/tex-jako-jazyk/ V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 3 / 29
Proč se někomu může L A TEX nelíbit L A TEX byl původně napsán Lesliem Lamportem, dnes více verzí, např. L A TEX2.09, L A TEX2e, L A TEX3. Původní myšlenka byla vytvořit nadstavbu TEXu, která by odstínila složitost základního formátu. Některá úskalí L A TEXu: TEX nebyl primárně vytvořen pro nadstavby, není možné odstínit nižší úroveň a ošetřit chyby - není nic jako L A TEX error, vždy pouze TEX error Příklady z hlediska uživatele L A TEXu nesmyslné chování některých příkazů, např. \vspace, plovoucí objekty,... mnoho stylů, které se stále vyvíjí a mění nestálost verzí (nová verze každý půlrok) složitost a nepřehlednost maker L A TEXu, k zajištění univerzálnosti potřeba složitý kód, značný problém zjistit, jak konkrétní sazba probíhá, nelze jednoduše upravit dle přání uživatele V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 4 / 29
Proč se někomu může L A TEX nelíbit některé věci v L A TEXu komplikované: L A TEX PlainTEX a \frac{a}{b} {a \over b} b \left(\begin{array}{c} n\\k ( \end{array}\right) {n \choose k} n k) \setlength{\textwidth}{20cm} \hsize=20cm a + b = c [Eq 1 ] [Eq 2 ] a b = d PlainTEX: \eqno [{\rm Eq} 1] a \leqno [{\rm Eq} 2] L A TEX: nevím jak (jednoduše) v rámci samotného L A TEXu V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 5 / 29
Práce TEXu Input procesor načítá vstupní soubor a převádí různá kódovaní (např. znak pro konec řádku: UNIX=LF, DOS=CR+LF, APPLE=CR \endlinechar) Token procesor vytváří posloupnost tokenů = řídící sekvence nebo jednotlivé znaky {\it pokus ABC} { 1 it p 11 o 11 k 11 u 11 s 11 10 A 11 B 11 C 11 } 2 využívána změna kategorie znaku @, v souborech stylů a formátů kategorie 11 (písmeno), jinak kategorie 12 (ostatní znaky) makra s @ v názvu pro uživatele nepřístupná Expand procesor načítá tokeny a provádí případnou expanzi Hlavní procesor provádí hlavní řídící sekvence nebo sází jednotlivé znaky V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 6 / 29
Expand procesor TEX = makrojazyk postupné procházení souboru a pracovávání definic maker a jejich expanze. makro základní programovací struktura TEXu definice maker: \def\a{abc\b} \def\b{abc} \A expanze na ABC\B expanze na ABCabc \def\b{123} \A expanze na ABC\B expanze na ABC123 V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 7 / 29
Expand procesor definice maker s parametry: \def\sekce #1,#2,{% \bigskip\noindent{\bf \romannumeral #2\hskip5mm #1}% \par\nobreak}... \sekce Toto je název sekce, 23. Tato sekce \dots xxiii Toto je název sekce Tato sekce... V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 8 / 29
Expand procesor definice \def \edef \def při definici neprobíhá expanze \def\a {\the\pageno} \A makro s tělem \the\pageno \edef při definici probíhá expanze \edef\b {\the\pageno} \B makro s tělem 1 \def\celkem{} \def\naber #1 {\edef\celkem{\celkem #1}}... \naber Kočka \naber Leze \naber Dírou \celkem KočkaLezeDírou V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 9 / 29
Hlavní procesor hlavní procesor řídí vlastní činnost TEXu pracuje vždy v jednom z následujících módů: hlavní vertikální mód (stránka) vnitřní vertikální mód (\vbox) odstavcový horizontální mód (odstavec) vnitřní horizontální mód (\hbox) vnitřní matematický mód ($... $) display matematický mód ($$... $$) V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 10 / 29
Hlavní procesor vnitřní módy Vnitřní vertikální (\vbox) a horizontální mód (\hbox) \Vbox{ \Hbox{Text} \Vbox{\Hbox{abc\lower6.3pt\Vbox{\Hbox{123}\Hbox{xyz}}} \Hbox{ijk}}} Text 123 abc xyz ijk V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 11 / 29
Hlavní procesor boxy Boxy box základní prvek sazby; skupina znaků, řádek odstavce, odstavec, tabulka, stránka boxy se vkládají do horizontálních/vertikálních seznamů každý box má šířku, výšku, hloubku boxy se vkládají do sazby s ohledem na účaří (baseline), možno ovlivnit pomocí \raise a \lower V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 12 / 29
Hlavní procesor boxy \def\mojelogotexu{% T\kern-0.2em\lower0.8ex\hbox{E}\kern-0.2emX} \mojelogotexu T E X \def\obvod #1{\vbox{\hrule \hbox{\vrule #1\vrule}\hrule}} \obvod{toto je text} Toto je text V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 13 / 29
Hlavní procesor odstavcový mód Odstavcový mód zpracování horizontálního seznamu a rozlámání do jednotlivých řádek odstavce vstup do odstavcového módu z vertikálního módu: \indent, \noindent nebo sazba znaku sazba odstavce: vložení odstavcové zarážky (\parindent) otevření horizontálního seznamu expanze \everypar... ukončení odstavcového módu (\par) V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 14 / 29
Hlavní procesor odstavcový mód algoritmus řádkového zlomu několika-průchodový nevhodná místa zlomu penalizována \penalty10000 (\nobreak) absolutně nevhodný zlom \penalty-10000 (\break) vynucený zlom hledání globálního řešení optimalizačního problému na všech řádcích přihlédnuto k pravidlům a tabulce dělení slov, možno definovat výjimky pomocí \hyphenation např.: \hyphenation{arachno-fobie a da-lší ji-ná slo-va} využity pružné mezery V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 15 / 29
Hlavní procesor odstavcový mód Pružné mezery mezera pevná část + roztažení/stažení \hbox to \hsize{a\hskip 1cm plus 1fil B \hskip 2mm plus 3fil C} Příklady: \hskip 1cm \hskip 3mm plus.5mm \hskip 10pt plus 5pt minus 3pt \hskip 50pt plus 1.2fil \hfill = \hskip 0pt plus 1fill V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 16 / 29
Hlavní procesor odstavcový mód využití \everypar: \def\zvetsiznak#1{{\huge #1}} \everypar={\zvetsiznak} \parindent=0pt Obsah čtverce sestrojeného nad přeponou (nejdelší stranou) pravoúhlého rovinného trojúhelníka je roven součtu obsahů čtverců nad jeho odvěsnami (dvěma kratšími stranami). Věta zní: Obsah čtverce sestrojeného nad přeponou (nejdelší stranou) pravoúhlého rovinného trojúhelníka je roven součtu obsahů čtverců nad jeho odvěsnami (dvěma kratšími stranami). V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 17 / 29
Hlavní procesor odstavcový mód využití \par: \parindent=2em \def\par{\ifhmode~$\spadesuit$\fi\endgraf} Pythagorova věta popisuje vztah, který platí mezi délkami stran pravoúhlých trojúhelníků v rovině. Umožňuje dopočítat délku třetí strany takového trojúhelníka, pokud jsou známy délky dvou zbývajících stran. Věta zní: Obsah čtverce sestrojeného nad přeponou (nejdelší stranou) pravoúhlého rovinného trojúhelníka je roven součtu obsahů čtverců nad jeho odvěsnami (dvěma kratšími stranami). Formálně Pythagorovu větu vyjadřuje tato rovnice: a 2 + b 2 = c 2 V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 18 / 29
Hlavní procesor hlavní vertikální mód Hlavní vertikální mód zajišťuje se stejná vzdálenost účaří a řeší se kolize boxů (\lineskip, \baselineskip, \lineskiplimit) řádková osnova vložena počáteční mezera na stránce \topskip, algoritmus zajišťuje zahájení řádkové osnovy stránek ve stejné výšce vloženy mezery mezi odstavce \parskip kompletace stránky počítá cenu zlomu ve všech možných místech zlomu strany, najde nejlepší místo zlomu po nalezení místa zlomu vyvolán algoritmus uzavření strany vloží se záhlaví, zápatí, zvětšení čísla strany,... V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 19 / 29
Hlavní procesor matematický mód Matematický mód první průchod matematickým módem řeší logické uspořádání prvků, druhý průchod konvertuje obsah do horizontálního seznamu základním prvkem matematického seznamu je atom má tři části základ exponent index $ x^3$ základ x, exponent 2, index prázdný $ x j^{a+b^2}$ základ x, index j, exponent je seznam s atomy a, +, b různé typy atomů: operátor ( ), binární operátor ( ), relace ( ), závorky ( ), odmocnina ( x), atom s čarou nad (a + b), atom s čarou pod (a + b),... V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 20 / 29
Hlavní procesor matematický mód Textstyle a displaystyle \sum 0^\infty textstyle: $ $ displaystyle: $$ $$ 0 polohu indexů a exponentů možno ovlivnit pomocí \limits a \nolimits v textstyle a displaystyle použita jiná velikost symbolů 0 0 0 0 0 V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 21 / 29
Hlavní procesor matematický mód Textstyle, displaystyle, scriptstyle, scriptscriptstyle $ xyz + {a\over b} $ xyz + a b $ \displaystyle{xyz + {a\over b}} $ xyz + a b $ \scriptstyle{xyz + {a\over b}} $ xyz+ a b $ \scriptscriptstyle{xyz} $ xyz V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 22 / 29
Hlavní procesor matematický mód Vytvoření vlastního operátoru lze definovat vlastní operátory \mathop, \mathbin \def\limita{{\rm limita}} $$ \limita {x\to0} $$ limita x 0 \def\limita{\mathop{\rm limita}} $$ \limita {x\to0} $$ limita x 0 V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 23 / 29
Hlavní procesor matematický mód Vytvoření vlastního operátoru \def\ctver #1{\mathbin{% \mkern 2mu \vbox{\hrule\hbox to#1{\vrule height#1\hfil\vrule}\hrule}} \mkern 2mu} \def\ctverecek{\mathchoice {\ctver{5pt}} {\ctver{5pt}} {\ctver{3.5pt}} {\ctver{2.5pt}}} $$ \sum {j \ctverecek k} A \ctverecek B $$ A parametry \mathchoice: D, T, S, SS j k B V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 24 / 29
Shrnutí TEX velice propracovaný systém pro sazbu, automaticky řeší mnoho typografických požadavků velmi dobré algoritmy pro stránkový a řádkový zlom možnost ovlivnit téměř všechny parametry sazby TEX = programovací (makro)jazyk dostupno mnoho stylů a nadstaveb, např. AMSTEX, L A TEX, ConTEXt, TEX-XET orientální jazyky, interpret BASICu, sazba šachových partií, sazba not,... V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 25 / 29
Literatura Michael Boob. Jemný úvod do TEXu. CSTUG, Praha, 1993. Michel Goosens, Frank Mittelbach, Alexander Samarin: The L A TEX Companion. Addison-Wesley, 1994. Helmut Kopka, Patrick W. Daly: L A TEX Kompletní průvodce. Computer Press, 2004. Petr Olšák: Typografický systém TEX. CSTUG, Praha, 1995. Petr Olšák: TEXbook naruby. Konvoj, Brno, 2001. V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 26 / 29
L A TEX příklady V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 27 / 29
Příklad 1 \documentclass{article} \begin{document} \begin{tabular}{ c c } abc & 123 \\ xyz & 567 & 0 \end{tabular} \end{document}! Extra alignment tab has been changed to \cr. <recently read> \endtemplate l.7 xyz & 567 &? 0 V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 28 / 29
Příklad 2 $$ a^2 + b^2 = c^2, \qquad \mbox{obsah čtverce sestrojeného nad přeponou (nejdelší stranou) pravoúhlého rovinného trojúhelníka je roven součtu obsahů čtverců nad jeho odvěsnami (dvěma kratšími stranami).} $$ a 2 +b 2 = c 2, Obsah čtverce sestrojeného nad přeponou (nejdelší stranou) pravoú Overfull \hbox (423.36487pt too wide) detected at line 10 Zpět V. Lukeš (NTC, KME ZČU) 3. listopad 2009, Plzeň 29 / 29