Работа в системе LaTeX
de301fb4

Обработка ошибок


В исходных текстах для TeX'а, которые вы будете готовить, неизбежно будут присутствовать ошибки. В настоящем разделе мы обсудим, как TeX на них реагирует и как вам, в свою очередь, следует реагировать на эти реакции TeX'а.

Все сообщения, которые TeX выдает на экран в процессе трансляции исходного текста, все ваши ответы на эти сообщения, вообще все, что в процессе трансляции появляется на экране, записывается в специальный файл — протокол трансляции. Обычно файл-протокол имеет то же имя, что обрабатываемый TeX'ом файл, и расширение .log, поэтому он называется .log-файлом. Когда трансляция будет завершена, вы можете в спокойной обстановке просмотреть . log - файл и проанализировать, что произошло.

Часть информации, выдаваемой при трансляции на экран и в .log-файл, представляет собой предупреждения (например, о нештатных ситуациях при верстке абзаца), при выдаче которых трансляция не прерывается . Если, однако, TeX натыкается на синтаксическую ошибку в исходном тексте, трансляция приостанавливается, а на экран выдается сообщение об ошибке.

Чтобы понять, что делать с этими сообщениями, проведем эксперимент. Наберите следующий файл test.tex из 14 строк, в котором умышленно допущено несколько ошибок (только не сделайте лишних ошибок при наборе):

\documentclass{article} \begin{document} По-английски специалист по \TeX'у называется \TeXpert. Следующая строка будет центрирована: \begin{center} Строка в центре. \end{centrr} А теперь попробуем формулы, например, такие, как $(2x+1)^3=5x$. И еще выключную формулу: $$\frac{25}{36}=\lrft(\frac{1} {1+\frac{1}{5}}\right)^2. $$ И последняя формула: $\sqrt{4 = 2$. \end{document}

Теперь обработайте наш файл test.tex с помощью LaTeX'а. Вскоре вы увидите на экране вот что:

! Undefined control sequence. l.3 ...алист по TeX'у называется TeXpert . ?

Первая строка TeX'овского сообщения об ошибке всегда начинается с восклицательного знака, после которого идет краткое указание на характер ошибки (в нашем случае речь идет о том, что обнаружена несуществующая команда).
Второй обязательный элемент сообщения об ошибке - строка, начинающаяся с l., после которой идет номер строки исходного текста с ошибкой (в нашем случае 3). После номера на экран выдается сама эта строка или та ее часть, которую TeX успел прочесть к моменту обнаружения ошибки. В нашем случае текст был прочитан до несуществующей команды "TeXpert" включительно (эта "команда" получилась потому, что мы забыли оставить пробел, ограничивающий имя команды \TeX, на которой TeX и прервал чтение файла. Наконец, третий основной элемент сообщения об ошибке — строка, состоящая из одного вопросительного знака. Этот вопросительный знак представляет собой "приглашение" пользователю: вам теперь предстоит на сообщение об ошибке отреагировать. Рассмотрим возможные реакции.

Во-первых, всегда можно нажать клавишу x или X (латинскую) и после этого "ввод" ("Enter"): тогда трансляция немедленно завершится. Может быть, именно так стоит поступать начинающему TeXнику, чтобы разбираться с ошибками по очереди. Но можно и просто нажать клавишу "ввод": при этом TeX исправит обнаруженную ошибку "по своему разумению" и продолжит трансляцию. Догадаться о том, что ошибка произошла именно из-за забытого пробела, программа, естественно, не может: исправление будет заключаться попросту в том, что будет проигнорирована несуществующая команда "TeXpert" (так что из печатного текста будет неясно, как по-английски называют специалиста по TeX'у). Нажимать "ввод" в ответ на сообщения об ошибках — довольно распространенная на практике реакция. Если вы твердо намерены нажимать на "ввод" в ответ на все сообщения об ошибках, то можно в ответ на первое же из этих сообщений нажать на "S" или "s", а затем на " ввод"; при обнаружении дальнейших ошибок трансляция прерываться не будет (TeX будет обрабатывать ошибки так, как если бы вы все время нажимали на "ввод"), по экрану пронесутся сообщения об ошибках, а затем вы сможете их изучить, просмотрев log-файл.



Итак, трансляция продолжается. Следующая остановка будет с таким сообщением:

! LaTeX Error: \begin{center} on input line 5 ended by \end{centrr}. See the LaTeX manual or LaTeX Companion for explanation. Type H for immediate help. ... l.7 \end{centrr} ? Это сообщение об ошибке начинается со слов LaTeX Error. Такого рода сообщения не встроены в TeX , а создаются LaTeX'ом. В них также присутствуют строка, начинающаяся с !, строка, начинающаяся с l., и приглашение - вопросительный знак. Есть на экране и объяснение ошибки: из-за опечатки ( centrr вместо center) получилось, что команда \begin, открывающая окружение, не соответствует команде \end , закрывающей его : имена окружений при открывающем \begin и закрывающем \end должны совпадать). Так или иначе, давайте снова нажмем на "ввод"; тут же мы увидим вот что:

! Missing inserted. ^ l.9 как (2x+1)^ 3=5x . И еще выключную формулу: На сей раз мы забыли знак доллара, открывающий формулу; TeX , однако, понял это не сразу, а лишь наткнувшись на символ "^", который вне формул таким образом использовать нельзя. Нажмем "ввод": TeX исправит положение, вставив знак доллара непосредственно перед знаком "^", и пойдет дальше (все такие исправления не вносятся в ваш файл, а происходят только в оперативной памяти компьютера). На печати формула будет иметь странный вид, поскольку "(2x+1)" будет набрано прямым шрифтом, а "5x" - курсивным, но TeX сможет продолжить трансляцию (и искать дальнейшие ошибки).

Следующая ошибка будет уже знакомого нам типа, только на сей раз несуществующая команда получается не из-за забытого пробела, а из-за опечатки ( "\lrft" вместо \left ):

! Undefined control sequence. l.10 $$\frac{25}{36}=\lrft (\frac{1} ? Нажав очередной раз на "ввод", мы немедленно увидим сообщение еще об одной ошибке:

! Extra \right. l.11 {1+\frac{1}{5}}\right) ^2 ? Откуда это, ведь в строке 11 у нас все правильно?! Оказывается, эта ошибка была наведена предыдущей.





В самом деле, перед этим TeX проигнорировал " команду" "\lrft", набранную вместо \left (именно так TeX и делает, если в ответ на ошибку "несуществующая команда" нажать на клавишу " ввод"), так что команду \left TeX вообще не видел; теперь выходит так, что в тексте, который видит TeX , присутствует \right без \left , что запрещено . Ввиду возможности появления таких " наведенных" ошибок, исправлять ошибки надо, начиная с самой первой; не исключено, что при ее исправлении часть последующих пропадет сама собой.

Нажмем на "ввод" и на этот раз; TeX опять по-свойски исправит ошибку, и вскоре вы увидите такое сообщение:

! Missing } inserted. l.13 И последняя формула:$\sqrt{4 = 2$. ? На сей раз ошибка в том, что мы забыли закрывающую фигурную скобку. Нажмем на "ввод"; TeX вставит недостающую скобку (в результате чего на печати получится забавная формула
, соответствующая тексту "\sqrt{4=2}": пропажа закрывающей скобки обнаружилась не там, где мы ее забыли, а там, где ее отсутствие вошло в противоречие с синтаксическими правилами TeX'а), после чего трансляция наконец завершится. Кстати, цифра 1 в квадратных скобках, появляющаяся при этом на экране, означает, что TeX сверстал страницу номер 1 и записал ее содержимое в dvi-файл. Теперь можно и просмотреть, как будет выглядеть наш текст на печати.

Количество различных сообщений об ошибках, которые может выдавать TeX , составляет несколько сотен, и нормальная реакция на них обычно такая же, как в нашем эксперименте; сейчас мы рассмотрим еще две типичные ошибки, реакция на которые должна быть иной.

Во-первых, может случиться, что в качестве аргумента команды \input задано имя несуществующего файла. В этом случае вы получите сообщение наподобие следующего:

! LaTeX Error: File `ttst.tex' not found. Type X to quit or <RETURN> to proceed, or enter new name. (Default extension: tex) Enter file name: В ответ на это следует набрать правильное имя файла и нажать на " ввод" , и трансляция благополучно продолжится.


Если вообще никакого файла нет (например, TeX запущен по ошибке), наберите null — это всегда существующий пустой файл. (В некоторых версиях — nul с одним l.)

Можно отреагировать на эту ошибку и так же, как на любую другую: нажать x и "ввод" (трансляция прервется) или s и "ввод" (неправильная команда \input будет проигнорирована, на дальнейшие ошибки TeX будет реагировать так, как если бы вы все время нажимали " ввод"). А если вы работаете с LaTeX'ом под операционной системой UNIX или каким-то ее аналогом (Linux, например), то в ответ на сообщение о такой ошибке можно и попросту нажать "ввод", и она будет проигнорирована.

Если команда \input с именем несуществующего файла попадется TeX'у после того, как вы в ответ на какую-то из прежних ошибок сказали s, то трансляция на этом месте тем не менее остановится и TeX поинтересуется верным именем файла.

Вторая ошибка, о которой мы хотели сказать, строго говоря, ошибкой не является; скорее, это нештатная ситуация. Чтобы смоделировать ее, проведем такой эксперимент: удалим из нашего файла test.tex последнюю строчку, гласящую "\end{document}", и снова запустим LaTeX для обработки этого файла. Нажав сколько-то раз "ввод", мы обнаружим, что работа TeX'а не закончилась, а на экран выдана звездочка: *. Эта звездочка — приглашение TeX'а ввести еще текст или команды; она появляется, когда в исходном тексте отсутствует команда для TeX'а "завершить работу" (в LaTeX'е эта команда входит в качестве составной части в комплекс действий, выполняемых командой \end{document}). Теперь можно вводить с клавиатуры любой текст и команды - TeX отреагирует на них так же, как если бы этот текст и команды присутствовали в вашем файле. Не будем баловаться, а просто наберем \end{document} и нажмем на "ввод", после чего трансляция благополучно завершится. Вряд ли вы будете очень часто забывать последнюю строчку в исходном тексте, но иногда, в результате какой-либо сложной ошибки, может случиться так, что TeX "не заметит" строки \end{document}, и вот тогда-то вы и окажетесь лицом к лицу с TeX'овским приглашением-звездочкой.



Бывают и такие хитрые ошибки, что \end{document} в ответ на приглашение-звездочку LaTeX не удовлетворяет и на экране снова появляется звездочка. На этот случай в LaTeX'е предусмотрено последнее средство: команда \stop. Если вы введете ее в ответ на TeX'овское приглашение, то, скорее всего, трансляция все-таки прервется. Если и \stop не помогает, остается только перезагрузить компьютер или "убить процесс" более цивилизованным способом.

Скажем еще об одном нередко встречающемся TeX'овском сообщении. Если вы открыли группу с помощью фигурной скобки, но забыли ее закрыть, то, даже если трансляция не будет прерываться, в конце вы заведомо получите такое TeX'овское предупреждение:

(\end occurred inside a group at level 1) (вместо 1 может стоять и другая цифра, в зависимости от того, сколько вложенных групп вы забыли закрыть). В частности, такое сообщение будет, если вы забыли закрыть или неправильно закрыли какое-то LaTeX'овское окружение (но в этом случае LaTeX выдаст вам и свое сообщение об ошибке, как в нашем примере с \begin{center} и \end{centrr}).

Наряду с пассивной реакцией на ошибки — все время нажимать на " ввод" или сказать s — есть и другая возможность: прямо с клавиатуры вносить исправления в тот текст, который " видит" TeX . На содержимое файла это не повлияет, но изменения в файл можно будет внести и позднее, руководствуясь тем, что записано в log-файле. При этом может сэкономиться время за счет того, что будет меньше "наведенных" ошибок и, как следствие, потребуется меньше прогонов TeX'а для отладки.

Чтобы внести исправления с клавиатуры, надо нажать i или I и затем "ввод". На экране появится такое приглашение:

insert> В ответ на это приглашение следует ввести тот текст и/или команды, которые вы хотите вставить в текст, читаемый TeX'ом. Чтобы продемонстрировать это на практике, давайте приведем файл test.tex в исходное состояние, вернув в него строку \end{document}, и еще раз запустим LaTeX для его обработки.


В ответ на первое же сообщение (по поводу несуществующей команды "TeXpert") нажмем i , а затем, в ответ на приглашение insert>, наберем правильный текст.

TeX pert и нажмем на "ввод". В ответ на вторую ошибку (когда мы в команде \end допустили опечатку в имени окружения center) скажем сначала i, а затем (в ответ на приглашение) "\end{center}" (кстати, можно делать такие вещи и в один шаг: сразу набрать "i\end{center}" и нажать " ввод"). В ответ на следующую ошибку ничего не остается, как по-прежнему нажать на "ввод": те символы в исходном тексте, между которыми должен был стоять пропущенный знак доллара, уже поглощены TeX'ом, и вставить его куда надо в данный момент невозможно; зато в ответ на следующую ошибку ( "\lrft" вместо \left ) наберем "i\left" и нажмем на "ввод". Следующей (" наведенной") ошибки вообще не будет (ведь на сей раз в тексте, который видит TeX , команда \left присутствует, а поэтому и на команду \right он отреагирует правильно); наконец, в ответ на последнюю ошибку опять ничего не остается, кроме как нажать на "ввод": вставить закрывающую фигурную скобку между 4 и знаком равенства прямо с клавиатуры невозможно. Теперь можно просмотреть, как на сей раз будет выглядеть на печати наш текст; некоторые несуразности наподобие
в нем останутся, но их будет меньше, чем если бы мы нажимали на "ввод" : не будет потеряно слово "TeXpert", центрированная строка будет действительно центрирована, формула


будет выглядеть так, как надо. Теперь остается внести исправления в исходный файл (справляясь с тем, что записано в log-файле) и запустить LaTeX вторично, чтобы получить безошибочный текст.

Как мы уже отмечали, в ответ на сообщение об ошибке всегда можно прервать трансляцию, нажав X или x и "ввод"; кроме того, бывают случаи, когда TeX прерывает трансляцию "по своей инициативе". На практике важны два случая:

  • TeX обнаружил 100 ошибок в пределах одного абзаца — тогда выдается сообщение (That makes 100 errors; please try again.)
  • TeX'у не хватило памяти — тогда выдается сообщение типа ! TeX capacity exceeded, sorry [main memory size=263001].
Нехватка памяти может возникнуть в результате таких ошибок, из-за которых TeX "зацикливается"; тогда достаточно исправить ошибку.


Иногда памяти может действительно не хватить. Так бывает, если в тексте встречаются чудовищно длинные абзацы7) или сверхсложные таблицы с очень большим количеством строк и столбцов (см. лекцию 4 по поводу таблиц). Если вы встретились с такой проблемой, то можно проконсультироваться со специалистом (или самому изучить по книге [2]), как использовать TeX более эффективно (в частности, TeX можно научить переваривать сколь угодно длинные абзацы). Можно также попробовать найти транслятор TeX'а, дающий возможность работать с увеличенным объемом памяти.

Скажем пару слов про более редкие способы реакции на ошибки. Во-первых, в ответ на приглашение ? можно набрать h или H и нажать "ввод". В этом случае TeX выдаст на экран дополнительную информацию по поводу вашей ошибки (вряд ли вы много из нее почерпнете, если вы не TeX ник), а затем еще раз приглашение ?. Во-вторых, можно набрать r или R (и " ввод", естественно); результат будет такой же, как если бы вы сказали s , с той разницей, что в случае, когда аргументом команды \input служит несуществующий файл, никаких вопросов задаваться не будет, а трансляция просто прервется. Наконец, можно набрать Q или q (и "ввод"): результат будет такой же, как от R , с той разницей, что на экран не будет выдаваться вообще ничего (в log -файл все будет записано).

Наконец, режимы реакции на ошибки, задаваемые с клавиатуры с помощью клавиш s , r или q , можно задать прямо в файле, написав в преамбуле одну из перечисленных ниже команд:

  • \scrollmode - равносильна нажатию s
  • \nonstopmode - равносильна нажатию r
  • \batchmode - равносильна нажатию q


Содержание раздела