summaryrefslogtreecommitdiff
path: root/info/impatient/errors.tex
diff options
context:
space:
mode:
Diffstat (limited to 'info/impatient/errors.tex')
-rw-r--r--info/impatient/errors.tex325
1 files changed, 325 insertions, 0 deletions
diff --git a/info/impatient/errors.tex b/info/impatient/errors.tex
new file mode 100644
index 0000000000..f2e5977336
--- /dev/null
+++ b/info/impatient/errors.tex
@@ -0,0 +1,325 @@
+% This is part of the book TeX for the Impatient.
+% Copyright (C) 2003 Paul W. Abrahams, Kathryn A. Hargreaves, Karl Berry.
+% See file fdl.tex for copying conditions.
+
+\input macros
+\chapter{Making sense \linebreak of error messages}
+
+\chapterdef{errors}
+
+\codefuzz = 4pc % for this chapter only (in scope of \chapter)
+\bix^^{error messages}
+Interpreting \TeX's error messages can sometimes
+be like going to your physician
+with a complaint that you're feeling fatigued and being handed,
+in response,
+a breakdown of your blood chemistry. The explanation of your distress
+is probably there, but it's not easy to figure out what it is.
+A few simple rules will go a long way in helping you to understand \TeX's
+error messages and get the most benefit from them.
+
+Your first goal should be
+to understand what you did that caused \TeX\ to complain.
+Your second goal (if you're working interactively)
+should be to catch as many errors as you can in a single run.
+
+Let's look at an example. Suppose that your input
+contains the line:
+\csdisplay
+We skip \quid a little bit.
+|
+You meant to type `|\quad|', but you typed `|\quid|' instead.
+Here's what you'll get from \TeX\ in response:
+\csdisplay
+!! Undefined control sequence.
+l.291 We skip \quid
+ a little bit.
+?
+|
+This message will appear both at your terminal and in your log file.
+^^{log file//error messages}
+The first line, which always starts with an exclamation point (|!!|),
+tells you what the problem is. The last two lines before the `|?|' prompt
+(which in this case are also
+the next two lines) tell you how far \TeX\ has gotten
+when it found the error.
+It found the error on line $291$ of the current input file,
+and the break between the two message lines indicates
+\TeX's precise position within line $291$, namely, just after |\quid|.
+The current input file is the one just after the most recent unclosed
+left parenthesis in the terminal output of your run (see \xref{infiles}).
+
+This particular error, an undefined control
+sequence, is one of the most common ones you can get.
+If you respond to the prompt with another~`|?|',
+\TeX\ will display the following message:
+{\hfuzz = 2in
+\csdisplay
+Type <return> to proceed, S to scroll future error messages,
+R to run without stopping, Q to run quietly,
+I to insert something, E to edit your file,
+1 or ... or 9 to ignore the next 1 to 9 tokens of input,
+H for help, X to quit.
+|
+}%
+Here's what these alternatives mean:
+\ulist
+\li If you type \asciichar{return},
+\TeX\ will continue processing your document.
+In this case it will just ignore the |\quid|.
+\li If you type `|S|' (or `|s|'---uppercase and lowercase are equivalent
+here), \TeX\ will process your document without stopping \emph{except}
+if it encounters a missing file. Error messages will still appear at your
+terminal and in the log file.
+\li If you type `|R|' or `|r|',
+you'll get the same effect as `|S|' except that
+\TeX\ won't even stop for missing files.
+\li If you type `|Q|' or `|q|',
+\TeX\ will continue processing your document but
+will neither stop for errors nor display them at your terminal. The
+errors will still show up in the log file.
+\li If you type `|X|' or `|x|',
+\TeX\ will clean up as best it can, discard the page
+it's working on, and quit. You can still print or view the
+pages that \TeX\ has already processed.
+\li If you type `|E|' or `|e|', \TeX\ will clean up and terminate
+as it would for `|X|' or `|x|' and then enter your text editor,
+positioning you at the erroneous line.
+(Not all systems support this option.)
+\li If you type `|H|' or `|h|',
+you'll get a further explanation of the error displayed
+at your terminal and
+possibly some advice about what to do about it. This explanation will also
+appear in your log file. For the undefined control sequence above,
+you'll get:
+{\hfuzz = 2in
+\csdisplay
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+|
+}
+\li If you type `|?|', you'll get this same message again.
+\endulist
+\noindent
+The other two alternatives, typing `|I|' or a small integer, provide ways of
+getting \TeX\ back on the track so that your error won't cause further errors
+later in your document:
+\ulist
+\li If you type `|I|' or `|i|'
+followed by some text, then \TeX\ will insert
+that text as though it had occurred just after the point of the error,
+at the innermost level where \TeX\ is working.
+In the case of the example above, that means at \TeX's
+position in your original input, namely, just after `|\quid|'.
+Later you'll see an example that shows
+the difference between inserting something at the innermost level and
+inserting it into your original input. In the example above of the undefined
+control sequence, if you type:
+\csdisplay
+I\quad
+|
+\TeX\ will carry out the |\quad| command and produce a quad space
+where you intended to have one.
+\li If you type a positive integer less than $100$ (not less than $10$ as the
+message misleadingly suggests),
+\TeX\ will delete that number of tokens from the innermost
+level where it is working.
+(If you type an integer greater than or equal to $100$, \TeX\ will
+delete $10$ tokens!)
+\endulist
+
+Here's an example of another common error:
+\csdisplay
+Skip across \hskip 3cn by 3 centimeters.
+|
+The error message for this is:
+\csdisplay
+!! Illegal unit of measure (pt inserted).
+<to be read again>
+ c
+<to be read again>
+ n
+l.340 Skip across \hskip 3cn
+ by 3 centimeters.
+|
+^^|<to be read again>|
+In this case \TeX\ has observed that `|3|' is followed by something that
+isn't a proper unit of measure, and so it's assumed the unit of measure to be
+points. \TeX\ will read the tokens of `|cn|' again and insert them into
+your input, which is not what you want. In this case you can get a better
+result by first typing `|2|' to bypass the `|cn|'.
+You'll get the message:
+\csdisplay
+<recently read> n
+
+l.340 Skip across \hskip 3cn
+ by 3 centimeters.
+|
+
+Now you can type
+`|I\hskip 3cm|' to get the skip you wanted (in addition to the |3pt| skip
+that you've already gotten).\footnote
+{By typing `|I\unskip\hskip 3cm|' you can get rid of the |3pt| skip.}
+
+If you type something that's only valid in math mode, \TeX\ will switch over
+to math mode for you whether or not that's what you really wanted.
+For example:
+\csdisplay
+So \spadesuit s are trumps.
+|
+Here's \TeX's error message:
+\csdisplay
+!! Missing $ inserted.
+<inserted text>
+ $
+<to be read again>
+ \spadesuit
+l.330 So \spadesuit
+ s are trumps.
+|
+Since the |\spadesuit| symbol is only allowed in math mode,
+\TeX\ has inserted a `|$|' in front of it.
+After \TeX\ inserts a token, it's positioned in \emph{front} of
+that token, in this case the `|$|', ready to read it.
+Typing `|2|' will cause \TeX\ to skip both the `|$|'
+and the `|\spadesuit|' tokens, leaving it ready to process the `|s|'
+in `|s are trumps.|'.
+(If you just let \TeX\ continue, it will typeset `|s are trumps|'
+in math mode.)
+
+Here's an example where \TeX's error diagnostic is downright wrong:
+\csdisplay
+\hbox{One \vskip 1in two.}
+|
+The error message is:
+\csdisplay
+!! Missing } inserted.
+<inserted text>
+ }
+<to be read again>
+ \vskip
+l.29 \hbox{One \vskip
+ 1in two.}
+|
+^^|<inserted text>|
+The problem is that you can't use |\vskip| when \TeX\ is in
+restricted horizontal mode, i.e, constructing an hbox.
+But instead of rejecting the |\vskip|, \TeX\ has inserted a right brace
+in front of it in an attempt to close out the hbox.
+If you accept \TeX's correction, \TeX\ will complain again
+when it gets to the correct right brace later on. It will also complain
+about anything before that right brace that isn't allowed in vertical mode.
+These additional complaints will be particularly confusing
+because the errors they indicate are bogus, a
+result of the propagated effects of the inappropriate
+insertion of the right brace.
+Your best bet is to type `|5|', skipping past all the tokens
+in `|}\vskip 1in|'.
+
+Here's a similar example in which the error message is longer
+than any we've seen so far:
+\csdisplay
+\leftline{Skip \smallskip a little further.} But no more.
+|
+The mistake here is that |\smallskip| only works in a vertical mode.
+The error message is something like:
+\csdisplay
+!! Missing } inserted.
+<inserted text>
+ }
+<to be read again>
+ \vskip
+\smallskip ->\vskip
+ \smallskipamount
+<argument> Skip \smallskip
+ a little further.
+\leftline #1->\line {#1
+ \hss }
+l.93 ...Skip \smallskip a little further.}
+ But no more.
+|
+The error messages here give you a tour through the macros that are used in
+\plainTeX's implementation of |\leftline|---macros
+that you probably don't care about.
+The first line tells you that \TeX\ intends to cure the problem by
+inserting a right brace.
+\TeX\ hasn't actually read the
+right brace yet, so you can delete it if you choose to.
+Each component of the message after the first line
+(the one with the `!') occupies a pair of lines.
+Here's what the successive pairs of lines mean:
+\olist
+\li The first pair indicates that \TeX\ has inserted, but not yet read,
+a right brace.
+\li The next pair indicates that after reading the right brace, \TeX\ will
+again read a `|\vskip|' command (gotten from the macro definition
+of |\smallskip|).
+\li The third pair indicates that \TeX\ was expanding the |\smallskip|
+macro when it found the error. The pair also displays the definition of
+|\smallskip| and indicates how far \TeX\ has gotten in expanding and
+executing that definition. Specifically, it's just attempted
+unsuccessfully to execute the |\vskip| command. In general, a
+diagnostic line that starts with a control sequence followed by `|->|'
+indicates that \TeX\ has been expanding and executing a macro by that
+name.
+\li The fourth pair indicates that \TeX\ was processing a macro argument
+when it found the |\smallskip| and also indicates \TeX's position in that
+argument, i.e., it's just processed the |\smallskip| (unsuccessfully).
+By looking ahead to the next pair of lines
+we can see that the argument was passed to
+|\leftline|.
+\li The fifth pair indicates that \TeX\ was expanding
+the |\leftline|
+macro when it found the error.
+(In this example the error occurred while \TeX\ was
+in the middle of interpreting several
+macro definitions at different levels of expansion.)
+Its position after |#1| indicates that the last thing it saw was the
+first (and in this case the only) argument to |\leftline|.
+\li The last pair indicates where \TeX\ is positioned in your input file.
+Note that this position is well beyond the position where it's
+inserting the right brace and reading `|\vskip|' again.
+That's because \TeX\ has already read the entire argument to |\leftline|
+from your input file, even though it's only processed part of that argument.
+The dots at the beginning of the pair indicate a preceding part of the
+input line that isn't shown. This preceding part, in fact, includes
+the |\leftline| control sequence that made the |\vskip| illegal.
+\endolist
+\noindent
+In a long message like this, you'll generally find only the first line and the
+last pair of lines to be useful; but it sometimes helps to know what the other
+lines are about. Any text that you insert or delete will be
+inserted or deleted at the
+innermost level. In this example the insertion or deletion would occur
+just before the
+inserted right brace.
+Note in particular that in this case \TeX\ puts any text you might insert
+\emph{not} into your input text but into a macro definition
+several levels down. (The original macro definition is of course not modified.)
+
+You can use the ^|\errorcontextlines| command \ctsref{\errorcontextlines}
+to limit the
+number of pairs of error context lines that \TeX\ produces.
+If you're not interested in all the information that \TeX\ is giving you,
+you can set |\error!-contextlines| to $0$. That will give you just the first
+and last pairs of lines.
+
+Finally,
+we'll mention two other indicators that can appear at the start of a pair
+of error message lines:
+\ulist
+\li ^|<output>| indicates that \TeX\ was in the middle of its output routine
+when this error occurred.
+\li ^|<write>| indicates that \TeX\ was in the middle of executing a
+|\write| command when this error occurred.
+\TeX\ will detect such an error when it is actually doing the |\write|
+(during a |\shipout|), rather than when it first encounters the |\write|.
+\endulist
+
+
+\eix^^{error messages}
+\endchapter
+\byebye