| |||
|
Vyhledávání podle slov v CS-FAQ
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 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 můžou 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.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.
| |||
|