| |||
TeX při uspořádávání textu nepracuje tak, že by bral slovo za slovem, či řádku za řádkou. Nejmenší jednotkou, kterou TeX formátuje, jsou celé odstavce. Odstavec je načten celý do paměti a není dále zpracováván, dokud není načtena značka konce odstavce. Právě v ten okamžik se uplatní parametry odstavce. Chyby použití parametrů formátování odstavce často vznikají právě proto, že se zapomíná na to, v jaké posloupnosti se odstavec zpracovává. Předpokládejme následující větu v LaTeXu:
{\raggedright % zarovnávání textu vlevo Tento text by měl být na výstupu zarovnán pouze vlevo. Chceme, aby se tak stalo pouze v~tomto odstavci, a~ proto zde ukončíme skupinu.}
TeX otevře skupinu a nastaví parametry formátování odstavce tak,
aby byl text uvnitř této skupiny zarovnáván pouze vlevo, poté uloží
dvě věty textu, uzavře skupinu a nastaví původní parametry
odstavce.
Poté načte prázdný řádek, který je zpracován stejně jako
příkaz Aby nastavené parametry zůstaly v platnosti po celou dobu zpracovávání odstavce, je třeba ukončit odstavec uvnitř skupiny. Nahradíme-li poslední tři řádky v předchozím příkladě za: ukončíme skupinu.\par} Další text je zpracován normálně...ukončí se odstavec ve chvíli, kdy jsou parametry odstavce nastavené v uzavřené skupině stále v platnosti.
LaTeX si ukládá některá data, jež bude zpracovávat až později. Těmito daty jsou zejména argumenty některých příkazů, takzvané pohyblivé argumenty. Pohyblivé proto, že s daty se nějakým způsobem manipuluje. Jedná se argumenty těch příkazů, které zapisují do obsahu, seznamu tabulek atd., tj. data, která jsou zapisována do pomocného souboru, z něhož jsou později opět čtena. Jinými daty jsou ta, která se mohou objevit v záhlavích. Nejvýznamnějšími příkazy tohoto typu jsou popisy obrázků a tabulek (captions) a veškeré nadpisy. Úplný seznam lze najít v Lamportově manuálu (viz Knihy o TeXu a příbuzná literatura).
Co se za tím vším skutečně skrývá? Příkazy, jež se použijí
v pohyblivých argumentech, jsou v průběhu ukládání
plně expandovány.
Někdy je výsledkem takového rozvoje špatný
TeXovský kód, což se projeví až při jeho následném čtení.
Příkazem Co je to ,,křehký příkaz`` (fragile command)? To je příkaz, který je během ukládání rozvinut do chybného TeXovského kódu. Co je to ,,robustní příkaz`` (robust command)? To je příkaz, který je během ukládání rozvinut do správného TeXovského kódu. Nikdo se (samozřejmě) z takto nepřehledné situace neraduje. Skupina projektu LaTeX3 při práci na LaTeXu 2e odstranila potřebu některých ochran, avšak techniky, které jsou jim dostupné v současném LaTeXu, činí věc poměrně složitou. Dlouhodobým cílem této skupiny zůstává odstranění všech ochran.
Funkce příkazu LaTeXu pro sazbu textu v tom tvaru, v němž je uveden ve
zdrojovém souboru ( \verb+\error+bude fungovat (vysází se ,, \error ``), ale
\newcommand{\unbrace}[1]{#1} \unbrace{\verb+\error+}fungovat nebude (pokusí se spustit příkaz \error ).
Proto se také v manuálu LaTeXu tolik naléhá na to, aby se příkaz verbatim neobjevil v argumentu žádného jiného příkazu. Tyto příkazy jsou nejen křehké (fragile), ale dokonce zcela nepoužitelné jako parametr jiných příkazů, bez ohledu na ochranu pomocí Proč se v LaTeXu užívá ochran (protection).
TeX poskytuje dva primitivní příkazy umožňující konverzi
textu do malých písmen,
Oba příkazy nerozvíjejí text, který je jejich parametrem --
výsledkem příkazu \uppercase{About $y=f(x)$}dává ABOUT $Y=F(X)$což zřejmě není to, co jsme původně zamýšleli.
Stejný problém může vzniknout s názvy prostředí v LaTeXu,
když LaTeX užívá implicitně
Při psaní makra je třeba mít na paměti, že
Definujeme-li a poté použijeme makro: \def\a#1{...#1...#1...#1...} \a{b}makro po expanzi dává ,,...b...b...b...``, což jsme očekávali. Avšak dosadíme-li nyní za ,,...``: \def\a#1{---#1---\def\x #1{xxx#1}} \a{b} se rozvine na ,,---b---\def\x b{xxxb} ``.
Definuje se zde makro \x , které je ohraničené znakem
b a které nemá žádný argument. Může se to zdát divné,
ačkoli jde jen o zvláštní případ předchozího příkladu.
Chceme-li, aby v \a
bylo definováno makro \x s jedním argumentem, musíme
upravit předchozí makro takto:
\def\a#1{---#1---\def\x ##1{xxx##1}} \a{b} se nyní rozvine do tvaru
,,---b---\def\x #1{xxx#1} ``, neboť #1 bude nahrazeno
znakem `b' a ## bude nahrazeno # .
Pro definici vnořenou uvnitř definice uvnitř definice se
použije
| |||
|