\input ctustyle3
\slides

\verbchar`
\everyintt={\Red}
\ttindent=0pt

\worktype[O/CZ]
\faculty{F8}
\department{Katedra matematiky, katedra teoretické informatiky}

\def\tthook{\typosize[12/14]}
%\slideshow

\tit Typografie a \TeX/ (04)

\subtit\bf Makrojazyk v \TeX/u, matematická sazba\nl\nl petr@olsak.net

\subtit\rm \url{http://petr.olsak.net/typotex.html}

\pg; %---------------------------------------------------

\sec Speciální znaky v \TeX/u

Tyto znaky mají plain\TeX/em nastaveny speciální kategorie příkazem
`\catcode`. V ostatních formátech je to nastaveno stejně.

{\typosize[13/16]

* 0: `\` -- zahajuje řídicí sekvenci,
* 1: `{`, 2: `}` -- v různých syntaktických pravidlech, vždy v páru,
* 3: `$` -- přechod do/z matematického módu,   
* 4: `&` -- separátor položek v tabulkách,
* 5: konec řádku -- promění se v mezeru,
* 6: `#` -- označení parametrů v definicích,
* 7: `^` -- zahajuje exponent v matematickém módu,
* 8: `_` -- zahajuje index v matematickém módu,
* 9: (kód 0) -- ignorovaý znak,
* 10: mezera -- více mezer za sebou se tokenizují do jediné,
* 11: `A` až `Z`, `a` až `z` -- znaky povolené v řídicích sekvencích,
* 12: `.`, `,`, `+`, `/`, `0`, `1`, atd. -- všechny ostatní znaky,
* 13: `~` -- aktivní znaky (v roli makra),
* 14: `%` -- uvození komentáře na řádku,
* 15: (kód 127) -- nedovolený znak.
\par}

\pg;

\sec Definování maker

* Rozdíl mezi `\def`. `\edef`.
* Globální alternativy `\gdef`, `\xdef`.
* `\def` s parametry uvnitř makra: zdvojení křížů.
* `\let` není `\def`.

\sec `\expandafter`

* `\expandafter XY` expanduje `Y` a vrátí se k provedení 
  `X expandovanéY`.
* Není-li `Y` exandovatelné, nevadí to.
* Je možné zřetězení `\expandafter`.
* Příklad: sken parametrů oddělených čárkou a uložeých do makra.

\sec `\noexpand`

* `\noexpand X` zablokuje expandování `X` například v kontextu provedení `\edef`
  nebo `\write`.


\pg;

\sec `\csname` ... `\endcsname`

* Dvojice `\csname` ...`\endcsname` umožní definovat a použít řídicí sekvence
  s libovolným názvem (znaky nemusejí mít jen kategorii 11).
* Definici musíme provést s použitím `\expandafter`:

\begtt
\expandafter\def \csname Tady je cokoli #$123$\endcsname {tělo makra}

Použití: \csname Tady je cokoli #$123$\endcsname
\endtt

* Příklad na zakládání slovníků klíč/hodnota.

\sec `\the`

* `\the registr` expanduje na hodnotu registru. Numerická hodnota je 
   v~desítkové soustavě, rozměrový údaj je prezentován v bodech s~připojeným
  `pt`.
* Nenásleduje-li (po expanzi) za `\the` registr, \TeX/ ohlásí chybu.
* `\number registr` expanduje rozměrový registr na číslo v~jednotkách `sp`
  (bez připojení této jednotky).

\pg;

\sec `\hbox`, `\vbox`, `\vtop`, `\vcenter`

* `\hbox{horizontální seznam}` nebo `\vbox{vertikální seznam}`
  nebo `\vtop{vertikální seznam}`, nebo `\vcenter{vert. seznam}` vytvoří
  box, tj. nedělitelný objekt, který má výšku, hloubku, šířku. 
* Možné varianty: `\hbox to d{...}`, `\hbox spread d{...}`, ...

\sec `\hskip`, `\vskip`

* Vytvoří mezeru (glue) v horizontálním, vertikálním seznamu.
* Jsou-li použity v nekompatibilním módu, je tento ukončen/přerušen.
* Klíčová slova `plus`, `minus` mohou zadat roztažitelnost/stažitelnost.
* Roz/s/tažitenost může mít jenotku `fil`, `fill`, `filll`. 
* Viz též primitivní příkazy `\hfil`, `\hfill`, `\hss`, `\vfil`, `\vfill`, `\vss`.  
* Tyto mezery jsou odstranitelné elementy.

\sec `\kern`

* Pevná nedělitelná mezera horizontální nebo vertikální podle toho, v~kterém
  se nachází seznamu. 

\pg;

\sec `\vrule`, `\hrule`, `\leaders`

* `\vrule` lze použít v horizontální seznamu, `\hrule` ve vertikálním.
* Syntax (např.):
\begtt
\vrule height 2mm depth 1mm width 7mm 
\hrule height 2mm depth 1mm width 7mm 
\endtt
* Parametry jsou nepovinné, jejich defaultní hodnoty jsou:
\begtt
\vrule height ? depth ? width 0.4pt 
\hrule height 0.4pt depth 0pt width ? 
\endtt
Otazník: rozměr dopočítá podle velikosti vnějšího boxu.

* Výsledný obdélník se v horizotnálním seznamu chová jako box, ve
  vertikálním seznamu nevkládá kolem sebe mezery z `\baselineskip`,
  `\lineskip`.

* `\leaders box skip` resp. `\leaders rule skip` vyplní skip opakovaným boxem
  resp. roztáhne podle skip  `\vrule`, `\hrule`.
* Například: 
\begtt
\leaders \hbox to1cm{\hfil.\hfil}\hskip 2cm plus1fil
\endtt



\pg;

\sec Matematická sazba, základy

* Pomocí `$...$` vstoupíme do a vystoupíme z 
  {\em vnitřního matematického módu} -- uvnitř odstavce
* Pomocí `$$...$$` vtoupíme do a vystoupíme z
  {\em display matematického módu} -- jeden řádek s formulí mezi odstavci.
* Veškerá sazba v matematickém módu probíhá uvnitř skupiny.
* V matematickém módu \TeX/ používá speciání fonty a je schopen umisťovat
  exponenty/indexy pomocí `^{...}`, `_{...}`, používat natahovací závorky,
  odmocniny atd.
* Fonty jsou v matematickém módu ve třech velikostech: základní, indexová a
  index-indexová. Menší velikosti se v typografii nikdy nepoužívají.
* Matematická sazba jsou {\em\Red atomy} kladené vedle sebe. Každý atom má
  {\em\Red základ} (nucleus), {\em\Red exponent} a {\em\Red index}, každá tato část 
  může být prázdná, jednoznaková nebo obsahovat matematickou sazbu.
* S výjimkou abecedních znaků a číslic jsou znaky vertikálně centrovány 
  na {\Red\it matematickou osu}. Ta prochází středy znaků + a $-$.

\pg;

\sec Styly v matematické sazbě

* Existují čtyři styly: `\displaystyle`, `\textsyle`, `\scriptstyle` a
  `\scriptsciptstye`, do nichž lze přepínat uvedenými sekvencemi.
  Implicitně: display matematický mód začíná s `\displaystyle`,
  vnitřní matematický mód s `\textstyle`, indexy a exponenty jsou 
  v~`\scriptstyle` a indexy či exponenty vyšší úrovně v~`\scripsriptstyle`.
* `\displaystyle` i `\textstyle` mají stejnou velikost fontů až na velké
  operátory. Dále se liší ve strategii umisťování exponentů, indexů a ve
  způsobu sazby zlomků:

\begtt 
textstyle: $a \over b$, displaystyle: $\displaystyle{a\over b}$,
textstyle: $\sum_{i=1}^n a_i$, displaystyle: $\displaystyle \sum_{i=1}^n a_i$
\endtt
%
textstyle: $a \over b$, displaystyle: $\displaystyle{a\over b}$,
textstyle: $\sum_{i=1}^n a_i$, displaystyle: $\displaystyle \sum_{i=1}^n a_i$

* `\scriptstyle` a `\scriptscriptstyle` mají odpovídající menší velikost fontů.
  Typicky 70\,\% a 50\,\% základní velikosti.

\pg;

\sec Mezerování v matematické sazbě

* Mezery vložené uživatelem jsou v matematickém módu ignorovány, \TeX/ vymyslí mezery sám.
* Kolem binárních operátorů vkládá `\medmuskip` (střední mezeru), kolem
  relací vkládá `\thickmuskp` (větší mezeru) a za čárky dává `\thinmusip`
  (menší mezeru). Mezi obyčejné znaky nevkládá mezery.
* \TeX/ musí vědět, jaké třídy (binání operace, relace, atd.) je každý znak
  matematické sazby. To je deklarováno ve formátu. 
* Třídy jsou: 0: `\mathord` (obyčejný), 1: `\mathop` (velký oprerátor)
  2:~`\mathbin` (binární), 3: `\mathrel` (relace), 4: `\mathopen` (otvírací
  závorka), 5: `\mathclose` (zavírací závorka), 6: `\mathpunct` (čárka).
* Je dokumentován přesný algoritmus mezerování podle těchto tříd.
* Velmi výjimečně je třeba do automatického mezerování zasáhnout manuálně
  (ale je třeba k tomu opravdu mít důvod, jen laický pocit nestačí). 
  Jsou k tomu připravena makra `\,`, `\>`, `\;`, `\!`.

\pg;

\sec Matematické fonty

* Matematická sazba může obsahovat 
  \begitems
  *latinskou abecedu ($ABCxyz$), tučnou ($\bi ABCxyz$), vzpřímenou ($\bf ABCxyz$) 
  *řeckou abecedu ($\Gamma,\Omega,\alpha,\beta$), tučnou ($\bi\Gamma,\Omega,\alpha,\beta$)
  *abecedu kaligrafických znaků `{\cal ABC}` ($\cal ABC$),
  *frakturu `{\frak ABC}` ($\frak ABC$),
  *zdvojené tahy `{\bbchar ABC}` ($\bbchar ABC$)
  *a stovky dalších znaků ($+/=\sim\leq\to\supset\cdots$),
  *některé z nich se speciálními vlastnostmi (natahovací závorky, zvětšující
  se velké operátory, matematické akcenty).
  \enditems
* Latinská abeceda je v kurzívě, číslice jsou ve vzpřímené a tabelační variantě,
  řecká abeceda má verzálky vzpřímené, mínusky v kurzívě.
* Dříve při omezení 127 znaků na font bylo třeba rozdělit výše uvedenou sadu   
  znaků do více fontů, každý obsahoval tři velikosti a tvořil tzv. rodinu
  fontů.
* V Unicode math stačí pro všechny uvedené znaky jediný font podporující tři
  velikosti (typicky optické velikosti, ne geometricky zmenšené).

\pg;

\sec Jak vytisknout znaky v mat. módu
 
* Přímo: `$ABCabc123+-=$` $\to$ $ABCabc123+-=$.\nl
  Všimněte si, že znak \uv{minus} se matematickém módu chová jako mínus,
  mimo matematický mód je to spojovník.
* Pomocí řídicí sekvence:
  `$\alpha\Gamma\int\subseteq$` $\to$ $\alpha\Gamma\int\subseteq$.
* V Unicode math variantně také přímo:
  `$`$\Red\alpha\Gamma{\int}{\subseteq}$`$` $\to$ $αΓ∫⊆$
* Detexify \url{http://detexify.kirelabs.org/classify.html} 
  je online nástroj, kam nakreslíte znak (myší, kreslítkem) a on
  Vám ukáže odpovídající \TeX/ovou řídicí sekvenci.
* Tyto názvy sekvencí jsou shodné ve všech formátech (když tedy Detexify
  zmiňuje jen \LaTeX, dává tím jen najevo, že jiné \TeX/ové formáty asi
  nezná).
* Listing všech dostupných znaků a jim odpovídajících názvů 
  v~Unicode math fontu je dostupný například na
  \url{http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf}.   

\sec Speciální znaky v matematickém módu

* Vertikálně natahovací objekty (závorky, svislé \uv{přepážky}):\nl
  `$\left<závorka> <formule> \right<závorka>$`.\nl
  Primitivní příkazy `\left`...`\right` musejí být v páru a vymezují mimo
  jiné skupinu. Mezi nimi může být jeden nebo více `\middle<závorka>`.
* `<závorka>` může být `.` (značí prázdný znak) nebo
  `(`, `)`, `[`, `]`, `\{`,  `\}`, `<`, `>`, `|`, `\|`, 
  `\backslash`, `/`, `\lfloor`, `\rfloor`, `\lceil`,  `\rceil`, 
  `\uparrow`, `\Uparrow`, `\downarrow`, `\Downarrow`,
  `\updownarrow`, `\Updownarrow`, Unicode Math fonty podporují ještě další.
* Horizontálně natahovací objekty jsou matematické akcenty:\nl
  `\overrightarrow{<formule>}`, dále `\overbrace`, `\underbrace`, 
  `\underline`, `\widehat`, `\widetilde`, `\overparen`, `\underparen`,
  `\overbracket`, `\underbracket` a některé další.
* Kromě toho jsou k dispozici statické matematické akcenty:\nl
  `$\dot x$` $\to$ $\dot x$, podobně `\ddot`, `\acute`, `\bar`,
  `\breve`, `\check`, `\grave`, `\hat`, `\vec`, `\tilde` a mnohé další.
* Derivaci píšeme přirozeně `$f'$` $\to\ f'$, je implementována pomocí `^`.
\pg;

\sec Zlomky

* `$1\over2$` $\to$ $1\over2$,\quad
  `$a+{b\over c}$` $\to$ $a+{b\over c}$. 
* V `\displaystyle` se čitatel a jmenovatel nezmenšují.
* V \LaTeX/u preferují místo primitivnímo `\over` makro
  `\frac{<čitatel>}{<jmenovatel>}`, je (zhruba) definováno takto:

\begtt \typosize[16/12]
\def\frac#1#2{{#1\over#2}}
\endtt

* V plain \TeX/u toto makro není podporované.
* Existují další primitivní příkazy podobné `\over`, které nemají zlomkovou
  čáru, nastavují tloušťku zlomkové čáry anebo přidávají kolem zlomku
  závorky.

\sec Odmocniny

* `\sqrt{x^2+y^2}` $\to$  $\sqrt{x^2+y^2}$, \quad 
  `\root3\of{42}` $\root3\ \of{42}$.
* Někdy je vhodné použít `\mathstrut` nebo `\phantom`:\nl  
  `\sqrt{\mathstrut x+y}\,\sqrt{\mathstrut k}` $\to$  
  $\sqrt{\mathstrut x+y}\,\sqrt{\mathstrut k}$.

\pg;

\sec Rozdíly mexi plain\TeX/em a \LaTeX/em

Sazba matematiky je v zásadě ve všech formátech stejná. Rozdíly nicméně
existují.

* Výběr matematických abeced. Plain\TeX/ používá přepínače
  `\rm`, `\cal`, `\script`, `\frak`, `\bbchar`, `\bf`, \LaTeX/ preferuje makra
  `\mathrm{text}`, `\mathcal{text}`, `\mathscr{text}` `\mathfrak{text}`, 
  `\mathbb{text}`, `\mathbf{text}`.
* Plain\TeX/ preferuje pro sazbu zlomků primitivní `\over`, \LaTeX/
  preferuje makro `\frac{čitatel}{jmenovatel}`.
* Pro konstrukci matic, soustav, zarovnaných rovnic atd. používá plain\TeX/
  makra `\matrix`, `\pmatrix`, `\cases`, `\displaylines`, `\eqalign`,
  `\eqalignno`, zatímco \LaTeX/ nabízí desítky různých prostředí používaných
  jako `\begin{něco}`...`\end{něco}`.
* Plain\TeX/ si vystačí s primitivními přechody do matematického módu, tj.
  `$...$` a `$$...$$`, zatmco \LaTeX/ míst toho nabízí `\(...\)`, `\[...\]`
  (to druhé navíc explicitně preferuje)
  a mnohá \LaTeX/ová prostředí přímo vstupují do display módu.
* Přechod do textového módu v matematice: Plain\TeX/ používá primitivní
  `\hbox`, \LaTeX/ má makro `\text`.

\pg;

\sec Nejčastější chyby začátečníků

* Tři tečky `\dots` nebo `\cdots` a interpunkce kolem.
* `$sin x$` $\to$ $sin x$, což je $s$ krát $i$ krát $n$ krát $x$,\nl 
  zatímco my chceme `$\sin x$` $\to$ $\sin x$.
* Nezvětšené závorky jsou chyba:
  `f({a\over b})` $\to$ $f({a\over b})$, \nl
  má být: `f\left(a\over b\right)` $\to$ $f\left(a\over b\right)$. 
* Nadužívání `\left`, `\right`, když to není potřebné, je rovněž chyba.
* Interval `<0,2\pi)` $\to$ $<0,2\pi)$ je velmi trapná chyba.\nl 
  Nechceme použít znak \uv{je menší}, 
  ale `\langle 0,2\pi)` $\to$ $\langle 0,2\pi)$.
* V češtině máme desetinnou čárku, místo tečky.\nl Ale
  `$3,1415$` $\to$ $3,1415$ (s mezerou za čárkou), protože to \TeX/ chápe jako 
  interpunkci. Má být `$3{,}1415$` $\to$ $3{,}1415$.
* Dlouhé rovnice se v display módu automaticky nezalamují.\nl
  Je třeba použít \uv{zalamovací makra} s případným zarovnáním.
  `\displaylines`, `\eqalign`, `\eqalignno`.
* V \LaTeX/u jsou na to k dispozici desítky \uv{prostředí} z různých
  balíčků.
* V \LaTeX/u potřebujete aspoň `\usepackage{amsmath,amsfonts}`.

\pg.


