| |||
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í:
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:
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ř.
! Undefined control sequence. 1.4 \blah and so onzatí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}, folksPokud 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}, folkssi můžeme přečíst ! Undefined control sequence.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.)
Viděli jste ve vašem LaTeXovém zdroji znak
„ \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.
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 a \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
Zdá se, že některé kopie dokumentace ! 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 epsfkdesi na začátku dokumentu a pak doplňte váš příkaz \epsffile
přizpůsobením velikosti pomocí příkazu \epsfxsize .
| |||
|