ProΦ to d∞lß tohle?
   
ProΦ to d∞lß tohle? CSTUG


ProΦ jsou ignorovßny parametry odstavce

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.}

Dal╣φ text je zpracovßn normßln∞...

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 \par; vysßzφ dv∞ v∞ty textu. Jeliko╛ v╣ak skupina byla ukonΦena p°ed naΦtenφm konce odstavce, nastavenφ parametr∙ uvnit° skupiny ztratilo v²znam a odstavec bude vysßzen s b∞╛n²mi parametry.

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.


ProΦ se v LaTeXu u╛φvß ochran (protection)

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 \protect\cmd je LaTeXu °eΦeno, aby ulo╛il \cmd bez expanze, jako \cmd.

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.


ProΦ \verb nefunguje uvnit° ...

Funkce p°φkazu LaTeXu pro sazbu textu v tom tvaru, v n∞m╛ je uveden ve zdrojovΘm souboru (verbatim), je zalo╛ena na vyu╛itφ zm∞ny kategorie (category codes) jednotliv²ch znak∙. Knuth v tΘto souvislosti °φkß: ,,Je pot°eba v∞novat jistou pΘΦi tomu, aby v╣e prob∞hlo ve sprßvnΘm sledu...``. Kategorie znaku se od okam╛iku, kdy je mu p°i°azena, nem∞nφ. Proto \verb p°edpoklßdß, ╛e je prvnφm p°φkazem, kter² se dφvß na sv∙j textov² parametr. Nenφ-li tomu tak, TeX ji╛ p°i°adil kategorie jednotliv²m znak∙m a \verb ji╛ nemß ╣anci kategorii m∞nit. Nap°φklad:

    \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).


Chyby souvisejφcφ se zm∞nou velikosti pφsmen

TeX poskytuje dva primitivnφ p°φkazy umo╛≥ujφcφ konverzi textu do mal²ch pφsmen, \lowercase, a velk²ch pφsmen, \uppercase. Tyto p°φkazy se nepou╛φvajφ p°φli╣ Φasto, ale dokß╛φ nad∞lat v dokumentu zmatek.

Oba p°φkazy nerozvφjejφ text, kter² je jejich parametrem -- v²sledkem p°φkazu \uppercase{abc} je ,,ABC``, av╣ak v²sledek p°φkazu \uppercase{\abc} je \abc a╗ u╛ \abc znamenß cokoli. P°φkazy jednodu╣e interpretujφ tabulku ekvivalent∙ mezi velk²mi a mal²mi formami znak∙. Nemajφ nap°φklad smysl pro matematiku, a tak

  \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∞ \uppercase. Nap°φklad standardnφ t°φdy u╛φvajφ \uppercase k nastavenφ zßhlavφ podle argumentu p°φkaz∙ \chapter\section, tak╛e kapitola, jejφ╛ nadpis obsahuje malou tabulku vyjßd°enou pomocφ \begin{tabular} ... \end{tabular}, nastavφ obsah zßhlavφ na \begin{TABULAR}, atd., co╛ je v╣ak prost°edφ, kterΘ v∙bec neexistuje.


ProΦ je znak # v makrech uveden dvakrßt

P°i psanφ makra je t°eba mφt na pam∞ti, ╛e ## zastupuje # obdobn∞ jako #1 zastupuje cokoli, co je prvnφm argumentem makra.

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 ####1, jeliko╛ v ka╛dΘ ·rovni je ## nahrazeno #. V dal╣φ ·rovni je nutnΘ pou╛φt osm #, atd.


CSTUG
(c) 22.10.1999 13:30 Libor ⌐karvada, Tomß╣ Hudec, Ale╣ Vφtek
P°ipomφnky, opravy a zejmΘna odpov∞di na dal╣φ ΦastΘ otßzky posφlejte na adresu cstug-faq@cstug.cz
P°ipomφnky k HTML verzi posφlejte na adresu libor@fi.muni.cz nebo hudec@fi.muni.cz.