Proč to dělá tohle?
   
Proč to dělá tohle? CSTUG

Vyhledávání podle slov v CS-FAQ

Hledaný řetězec:


Co se děje při použití příkazu \include?

Původní verze LaTeXu poskytovala příkaz \include, který pouze řešil problém dlouhých dokumentů: na relativně pomalých počítačích se používal příkaz \includeonly. S obrovským nárůstem rychlosti počítačů příkaz \includeonly ztratil na ceně (i když stále má svůj význam ve velmi rozsáhlých projektech). Proto je tento zjednodušený příkaz zahrnut i v současných verzích LaTeXu a plete lidi, kteří toto nepochopili.

V případě, že použijete \includeonly, tak \include vytváří zvláštní .aux soubory pro každý vložený soubor a vytváří checkpointy na důležité parametry (jako číslo stránky, obrázku, tabulky nebo poznámky pod čarou). Jako přímý důsledek musí vymazat stránku před i po příkazu \include. Tento mechanismus nepracuje, pokud se příkaz \include objeví v souboru, který byl sám vložen do jiného. Toto LaTeX ohlásí jako chybu. Nyní tedy můžeme odpovědět na dvě nejzákladnější otázky:

  • Proč LaTeX vsouvá na začátek a konec stránky příkaz \include?
    Odpověď: Protože musí. Pokud se vám to nelíbí, nahraďte příkaz \include příkazem \input - nebudete moct víckrát použít příkaz \includeonly, ale pravděpodobně to stejně nebudete potřebovat, takže žádné obavy.
  • Proč nemůžu vložit soubor? Vždy jsem používal verzi LaTeXu nižší než 2.09, abych je mohl vkládat.
    Odpověď: Ve skutečnosti jste nemohl, chyba však nebyla diagnostikována. Pokud jste byl v té době spokojený s chováním LaTeXu verze nižší než 2.09, nahraďte příkaz \include příkazem \input (s přidaným příkazem \clearpage).


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.

Další alternativa spočívá v tom, že si můžete definovat nové prostředí, které udělá příslušnou práci za vás. Pro příklad, který byl zmiňován výše, je již v LaTeXu definováno takovéto prostředí:


\begin{flushleft}

  Tento text by měl být...

\end{flushleft}


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 o 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). Další chyby, se kterými se můžete setkat jsou ,,\verb ended by end of line`` nebo ,,\verb illegal in command argument``.

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

Jsou zde dvě částečná řešení tohoto problému:

  • Balík fancyvrb (CTANfancyvrb) definuje příkaz \VerbatimFootnotes, který předefinovává příkaz \footnotetext (a odtud i \footnote) tak, že můžete vkládat příkaz \verb jako jeho argument. Tento přístup by mohl být v podstatě rozšířen i na argumenty ostatních příkazů, ale, bohužel, může kolidovat s jinými balíky: například \VerbatimFotenotes ovlivňuje volbu para z balíku footmisc.
  • Balík fancyvrb definuje příkaz \SaveVerb s odpovídajícím příkazem \UseVerb, který vám umožňuje uložit a pak znovu použít obsah jeho argumentů. Detaily tohoto týkající se použití tohoto extrémně silného násroje hledejte v dokumentaci k tomuto balíku.

    Poněkud jednodušší je balík verbdef (CTANverbdef.sty), který definuje robustní příkaz, který expanduje do zadaného argumentu.


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.


Proč LaTeX dělí poznámky pod čarou na

více stránek?}

LaTeX dělí poznámky pod čarou na více stránek, pokud si myslí, že to je to nejlepší, co může udělat. Typicky se tak stane, pokud poznámka pod čarou vyjde na samotný konec stránky, a tím ji může přeplnit. Jako vždy je nejlepším řešením problému změnit váš text tak, aby se v něm tento problém nevyskytl. Uvažujte, zda by se poznámka ve vašem textu mohla objevit na předchozí či další stránce. Pokud to není možné, můžete docílit toho, že LaTeX začne jinak ,,pohlížet`` na tyto priority: ty jsou ovládané příkazem \interfootnotelinepenalty -- čím má větší parametr, tím méně LaTeX rozděluje poznámky. Nastavením \interfootnotelinepenalty=10000 (základní hodnota je 100) zcela zabráníte. To ale vyvolá hlášku ,,Underfull \vbox`` pokud nezadáte \raggedbottom.

Alternativní technika spočívá v malém podvodu na LaTeX, kdy pomocí parametrů příkazu \enlargethispage změníte velikost aktuální stránky (např. mu můžete dát na vstup \enlargethispage{baselineskip} pro přidání jednoho řádku na tuto stránku, můžete však použít jakoukoliv běžnou TeXovou jednotku délky, třeba 15mm nebo -20pt). Zmenšení velikosti běžné stránky si může vynutit useknutí textu a jeho přesunutí na další stránku; zvětšení stránky může způsobit, že se poznámky spojí do jednoho celku. To může být nevyhnutelné, pokud chcete změnit velikost více než jedné stránky.


Jak dostat \marginpar na správnou stranu?

V oboustranném dokumentu LaTeX se pokouší vložit \marginpar na správný okraj (vnější nebo vnitřní okraj -- podle zadání autora). Nicméně úskalí je v tom, že TeX vytváří stránky asynchronně, díky čemuž se může \marginpar objevit na špatném okraji stránky. Řešením tohoto problému by mohlo být zapamatování si, na kterou stranu stránky má být použit \marginpar. Toto umí balík CTANmparhack, který využívá značky uložené v .aux souboru.


Proč nemůžu nahrát PiCTeX

PiCTeX je poměrně náročný na systémové zdroje. Naštěstí většina moderních TeXových distribucí nabízí poměrně dost prostoru a moderní počítače již jsou oproti svým předchůdcům o mnoho rychlejší, takže uživatele tato skutečnost nemusí znervózňovat. Nicméně PiCTeX má jednu nešťastnou tendenci - rád zaplňuje pole s pevnou délkou alokovaná TeXem - zvláště 256 ,,rozměrových`` registrů. To je problém zvláště, pokud v LaTeXu používáte pictex a další balíky, které potřebují stejné systémové zdroje. Pokud k tomu dojde, pak vám LaTeX vypíše chybovou hlášku
 ! No room for new \dimen.
S touto chybou nelze nic udělat: nemůžete totiž zvýšit počet dostupných rozměrových registrů, aniž by to udělal sám TeX (toto umí automaticky e-TeX a Omega - viz Otázku Projekt Omega a Otázku Projekt NTS a VTeX od firmy MicroPress Inc. - viz Otázku Komerční implementace TeXu). Poněvadž nemůžete rozšířit TeX, musíte vyměnit PiCTeX; bohužel jeho autor není již delší dobu v TeXovém světě aktivní, proto se musíte uchýlit k ,,patchování``. Dostupná jsou dvě řešení:

  • CONTeXtové moduly m-pictex.tex (pro Plain-TeX a jeho varianty) a m-pictex.sty (pro LaTeX; oba soubory jsou dostupné v souboru CTANcont-tmf.zip). Soubor m-pictex.tex nabízí důmyslné řešení založené na úpravě kódu příkazu \newdimen.
  • Alternativně pictexwd Andrease Schella (CTANaddon) nahrazuje PiCTeX verzí, které používá o 33 ,,rozměrových`` registrů méně. Takže místo souborů pictex používejte pictexwd.
A jak může někdo použít PiCTeX, když je těžké sehnat manuál (viz Otázku Manuál k programu PiCTeX)? Naštěstí pro uživatele MSDOSu a Windows, může být MathsPic (CTANmathspic) použit pro přeložení z jiného jazyka do instrukcí PiCTeXu a manuál k MathsPicu je přímo součástí distribuce. MathsPic je napsán v Basicu; Perlová verze by měla být dostupná během roku 2001.


CSTUG
(c) 29.04.2002 16:18 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.