Chyby v TeXu CSTUG

Poněvadž TeX je makroprocesor, je často poměrně obtížné porozumět jeho chybovým hláškám; to je bohužel vlastnost makroprocesorů. Knuth se snažil vnést jasno do tohoto problému ve svém TeXbooku tím, že uživatelům naznačil, aby získlali detektivní schopnosti moderního Sherlocka Holmese; ačkoliv má tento přístup jakýsi romantický nádech, není pro aktivní uživatele (La)TeXu příliš užitečný. Tato odpověď (z části odvozená z článku Sebastiana Rathze z TUGboatu Vol 16(4)) nabízí obecnou radu, jak reagovat na chyby pomocí chybových zpráv a jiné odpovědi v této sekci pojednávají o jiných bežných (ale matoucích) chybách, se kterými se můžete v TeXu setkat. V Sebastianově článku se objevuje obsáhlý seznam rad, v němž mimo jiné stojí:

  • Podívejte se podrobně na chybu; některé chyby se nejprve mohou zdát záhadné, ale často obsahují přímé vodítko k vyřešení problému. Pro další detaily je dobré si pročíst následující otázku.
  • Přečtěte si soubor .log; obsahuje podrobnější informace o věcech, kterým třeba nerozumíte, často nejsou předloženy jako chyby.
  • Buďte si vědomi množství souvislostí, které TeX obnáší. Chybové hlášky vám dávají kousky TeXového kódu (nebo samotného dokumentu), aby vám ukázal, kde se právě stala chyba, je možné zkontrolovat, kolik těchto chyb se ve vašem dokumentu objevuje. Nyní LaTeX dává TeXu pokyn, aby vám vypsal pouze jeden řádek z kontextu, avšak pokud chcete, můžete mu říct, aby vypsal více řádků. To provedete umístěním příkazu \setcounter{errortextlines}{999} v preambuli vašeho dokumentu.
  • Jako poslední východisko může být použítelným nástrojem trasování; čtení celého dokumentu vás může velice rychle zavést ke zdroji vašeho problému. Musíte si přečíst některé pasáže z TeXbooku (viz Otázku Knihy o TeXu a příbuzná literatura), abyste tomuto problému zcela porozuměli. Příkaz \tracingall nastavuje maximální trasování; nastavuje také výstup přicházející na interaktivní terminál. Běžně je nejjednodušší pročíst trasování použitím vašeho oblíbeného textového editoru k prohlížení .log souborů.


Struktura chybových hlášek v TeXu

TeXové chybové hlášky připomínají dobu, kdy byl TeX vymyšlen (70. léta minulého století): k uživatelům nejsou příliš přátelské, ačkoliv obsahují veškeré informace, které může TeX nabídnout, obvykle jsou vyloženy přehledně a stručně. Všechny chybové hlášky mají v TeX{}u stejnou strukturu:

  • chybová hláška
  • kontext
  • stručný návod na řešení problému
Chybová hláška uvede stav TeXu, který způsobil daný problém. Bohužel, v soustavě balíků maker jako je LaTeX však bývá odhalení konkrétního problému v makrech vyšší úrovně poměrně obtížné. Mnohé chyby, které se v LaTeXu objevují, se tváří jako generické chyby s chybným textem vloženým LaTeXem nebo jeho balíky.

Kontext chyby je stylizovaná reprezentace toho, co TeX udělal, když detekoval chybu. Jak bylo poznamenáno v Otázce Jak na chyby v TeXu?, makrobalíček může TeXu říct, jak dlouhý kontext má zobrazit. Každá řádka kontextu je rozdělena v bodě chyby; pokud chyba ve skutečnosti nastane v makru volaném z aktuální řádky, zlom nastane v bodě volání. Pokud má makro parametry, tak se řádka zlomí až za posledním z nich. Např.
\blah and so on
vyvolá chybu

! Undefined control sequence.
1.4 \blah 
          and so on
zatímco
\newcommand{\blah}[1]{\bleah #1}
\blah{to you}
má za důsledek hlášku
! Undefined control sequence.
\blah #1->\bleah
                 #1
1.5 \blah{\bleah}, folks
Pokud chyba nastane v argumentu, pak se nám mohou objevit věci jako např. po zadání
\newcommand{\blah}[1]{#1 to you}
\blah{\bleah}, folks
si můžeme přečíst
! Undefined control sequence.
 \bleah

1.5 \blah{\bleah} , folks

Příkazový řádek akceptuje jednoznakové příkazy, jejichž seznam si můžete nechat vypsat zadáním znaku ?. Jedním z bezprostředně nejdůležitějších příkazů je říkaz h, který vám dá na výstup přesnější zprávu občas doplněnou pokynem, jak chybu odstranit, případně jak se jí vyhnout. Pokud stisknete enter, nebo jinou klávesu, kterou váš systém používá k ukončení řádky, TeX se pokusí pokračovat (často s poněkud menším úspěchem.)


Pravá složená závorka navíc

Viděli jste ve vašem LaTeXovém zdroji znak „}“ navíc a přesto LaTeX, v tomto místě nehlásil chybu? Toto je způsob, jak říci TeXu, že jste vložili křehký příkaz s pohyblivým argumentem (viz Otázku Proč se v LaTeXu užívá ochran (protection)). Příkladem takovéhoto křehkého příkazu je třeba \footnote; pokud ho vložíte jako argument příkazu \section, pak vám sekvence

\section{Mumble\footnote{I couldn't think of anything better}}
dá na výstup:
! Argument of \@sect has an extra }.
Obvykle se tato situace řeší použitím robustního příkazu namísto toho, který používáte nebo přeměnit váš příkaz na robustní pomocí prefixu \protect, který ve výše zmíněném případě může vypadat takto:
\section{Mumble\protect\footnote{I couldn't think of anythimg better}}.
Na závěr ještě jedna poznámka: \protect vždy nemusí být řešením, Otázka Poznámky pod čarou v tabulkách popisuje jednotlivé případy.


Není místo pro přidání nových věcí

Technologie, která byla Knuthovi dostupná v době, kdy vytvářel TeX, příliš neumožňovala spravovat dynamické paměti; většinou jsou místa v paměti v TeXu alokována jako pole pevné délky. Mnoho těchto fixovaných polí je v moderních implementacích TeXu rozšiřitelných, avšak velikost polí těchto registrů je obecně omezena počtem 256; většinou nemůže být změněna, pokud stále budete chtít zavolat výsledky TeXu (viz Otázku Co je to LaTeX). Pokud naplníte jeden z těchto registrů, můžete dostat chybovou hlášku

! No room for a new \.
Zde se místo \ může objevit \count (objekt, který tvoří základ příkazu \newcounter), \skip (objekt, který tvoří základ příkazu \newlength), \box (objekt, který tvoří základ příkazu \newsavebox), \dimen, \muskip, \toks, \read, \write nebo \language (všechny typy balíků, které se zde používají, jsou v LaTeXu skryté; limit počtu objektů \read\write je omezen číslem 16).

Není zde žádná možnost, jak tuto chybu přímo opravit, nemůžete totiž přímo zvětšit počet dostupných registrů, aniž by to učinil přímo LaTeX. (Jistě, Omega a e-TeX – viz Otázku Projekt Omega respektive Otázku Projekt NTS – to umí, stejně jako VTeX firmy MicroPress Inc – viz Otázku Komerční implementace TeXu). Nejobecnější způsob, jak se setkat s jednou z těchto chyb, je použít nefunkční makro nebo použít dobré makro na špatném místě (případy jsou diskutovány v Otázce epsf přestává po jisté době spolupracovat). Nicméně občas potřebujete více, než vám TeX může nabídnout, pokud se tak stane, musíte použít jiný způsob vytvoření objektů. Příkladem je složitější nahrávání PiCTeXu v LaTeXu (viz Otázku Proč nemůžu nahrát PiCTeX).


epsf přestává po jisté době spolupracovat

Zdá se, že některé kopie dokumentace epsf.tex naznačují, že příkaz \input epsf je potřebný pro každý vložený symbol. Pokud vezmete toto doporučení příliš doslovně, pak se vám za chvíli objeví chyba

! No room for a new \read.
Je to protože pokaždé, když se epsf.tex nahrává, je alokován nový handle pro soubor určený pouze pro čtení, který kontroluje tento soubor a pak zde není dost místa pro další věci (viz Otázku Není místo pro přidání nových věcí). Řešení je jednoduché – toto je totiž případ nesprávného použití maker; každý totiž potřebuje číst epsf.tex pouze jednou, změňte tedy
...
\input epsf
\epsffile{...}
...
\input epsf
\epsffile{...}
atd.
na
\input epsf
kdesi na začátku dokumentu a pak doplňte váš příkaz \epsffile přizpůsobením velikosti pomocí příkazu \epsfxsize.


CSTUG
(c) 1997, 1998, 2003 Tomáš Hudec, Libor Škarvada
Poslední aktualizace: 13.11.2004 23:15