summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/plain/impatient-cn/errors.tex
blob: 1d2369b60b921b01867b4c346d0eccb307cd0439 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
% -*- coding: utf-8 -*-
% 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}
\chapter{理解错误信息}

\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.
\codefuzz = 4pc % for this chapter only (in scope of \chapter)
\bix^^{错误信息}
解释 \TeX\ 的错误信息有时候就像,
你跟医生抱怨你感觉疲乏无力,医生却递给你一份血生化细目表。
对你的痛苦的解释也许就在那里,但却不容易弄清楚它是什么。
掌握一些简单规则对你理解 \TeX\ 错误信息并从中受益将大有帮助。

%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.
你的第一个目标应当是理解什么东西导致 \TeX\ 报错。
第二个目标(如果是交互式使用 \TeX )应当是在一次运行中捕获尽可能多的错误。%
\footnote{译注:本章的各个节标题为译者所加。}

\section{第一个例子}

%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}).
我们来看一个例子。假设你的输入中包含下面这行:
\csdisplay
We skip \quid a little bit.
|
你本想输入 `|\quad|',却输入成 `|\quid|'。
此时 \TeX\ 将给出下面的信息:
\csdisplay
!! Undefined control sequence.
l.291 We skip \quid
                   a little bit.
?
|
此信息将同时出现在终端上和日志文件中。
^^{日志文件//错误信息}
第一行始终以感叹号(|!!|)开头,告诉你出现了什么问题。
在 `|?|' 提示符之前的最后两行(在此例子中同样也是接下来的两行)%
告诉你 \TeX\ 在何处发现此错误。
它在当前输入文件的第 $291$  行发现了错误,
两个信息行之间的断行表示 \TeX\ 在第 $291$ 行的精确位置,即在 |\quid| 后面。
当前输入文件是指,在运行时的终端输出上,
最接近的非闭合左圆括号后显示的文件(见\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.
%|
%}%
这种错误,即控制序列未定义,是你最常出现的错误之一。
如果你在提示符后键入另一个 `|?|',\TeX\ 将显示下列信息:
{\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
这些选择各自的含义如下:
\ulist
\li 如果你键入 \asciichar{return},
\TeX\ 将继续处理你的文档。在此例子中它就忽略了 |\quid|。
\li 如果你键入 `|S|'(或者 `|s|'——这时候大小写是等价的),
\TeX\ 将继续处理你的文档且不再暂停,\emph{除非}找不到某文件。
但错误信息还是会出现在终端上和日志文件中。
\li 如果你键入 `|R|' 或 `|r|',
你将得到与 `|S|' 相同的结果,但此时 \TeX\ 即使找不到文件也不会暂停。
\li 如果你键入 `|Q|' 或 `|q|',
\TeX\ 将继续处理你的文档,且遇到错误后将不会再暂停,也不会在终端上显示。
错误信息还是会记录到日志文件中。
\li 如果你键入 `|X|' 或 `|x|',
\TeX\ 将尽力清理干净,丢弃正在构造的页面,并退出。
你仍然可以打印或查看 \TeX\ 已经生成的页面。
\li 如果你键入 `|E|' 或 `|e|',
\TeX\ 将如同 `|X|' 或 `|x|' 那样清理并中止,然后打开文本编辑器,跳转到错误所在的行。%
(并非所有系统都支持此选项。)
\li 如果你键入 `|H|' 或 `|h|',
你将在终端上看到对此错误的进一步解释,可能还有对此错误的一些建议。
这些信息同样会记录到你的日志文件中。
对于上述例子的未定义控制序列,你将得到下列信息:
{\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 如果你键入 `|?|',你将得到和上面相同的信息。
\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
\noindent
另外两个选择,即键入 `|I|' 或一个小整数,
提供一种让 \TeX\ 回到正常轨道上的方法,
使得该错误不会在文档后面导致更多的错误:
\ulist
\li 如果你键入 `|I|' 或 `|i|' 并加上一些文本,
\TeX\ 将把文本插入错误位置之后,放在 \TeX\ 处理的最内层级。
在上面这个例子中,这表示在 \TeX\ 的原始输入的位置,即在 `|\quid|' 之后。
稍后我们将给出一个例子,说明把某些东西插入到最内层级与插入到原始输入的区别。
在上面这个控制序列未定义的例子中,如果你键入:
\csdisplay
I\quad
|
\TeX\ 将执行 |\quad| 命令并在你需要的地方生成一个全方间隔。
\li 如果你键入一个小于 $100$(错误信息让人误解为小于 $10$)的正整数,
\TeX\ 将从它处理的最内层级删除该数目的记号。%
(如果你键入大于或等于 $100$ 的整数,\TeX\ 将只删除 $10$ 个记号!)
\endulist

\section{第二个例子}

%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.
%|
这里是另一种常见错误的例子:
\csdisplay
Skip across \hskip 3cn by 3 centimeters.
|
这个例子的错误信息为:
\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>|
这里 \TeX\ 注意到 `|3|' 后面不是一个正确的度量单位,因此它假设该度量单位为点。
\TeX\ 将重新读取 `|cn|' 的记号并将它们插入你的输入中,而这并不是你想要的。
在这种情形下若想得到更好的结果,你可以先键入 `|2|' 以跳过 `|cn|'。
这样你将得到如下信息:
\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.}
现在你可以键入 `|I\hskip 3cm|' 以得到你所要的间距(加上你已经得到的 |3pt| 间距)。%
\footnote{若改为键入 `|I\unskip\hskip 3cm|',你就可以去掉这个 |3pt| 的间距。}

\section{第三个例子}

%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.)
如果你输入某些仅可用于数学模式的内容,\TeX\ 将帮你切换到数学模式,
不管这是否你真正想要的。例如:
\csdisplay
So \spadesuit s are trumps.
|
下面是 \TeX\ 的错误信息:
\csdisplay
!! Missing $ inserted.
<inserted text>
                $
<to be read again>
                   \spadesuit
l.330 So \spadesuit
                  s are trumps.
|
由于 |\spadesuit| 符号仅可在数学模式中使用,
\TeX\ 已经在它前面插入一个 `|$|'。
在插入某个记号之后,\TeX\ 位于该记号的\emph{前面},
在此情形中就是位于 `|$|' 前面,并准备读取输入。
键入 `|2|' 将让 \TeX\ 跳过 `|$|' 和 `|\spadesuit|' 记号,
让它准备处理 `|s are trumps.|' 中的 `|s|'。%
(若你只是让 \TeX\ 继续,它将在数学模式中排版 `|s are trumps|'。)

\section{第四个例子}

%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|'.
在下面这个例子中,\TeX\ 对错误的诊断是完全不正确的:
\csdisplay
\hbox{One \vskip 1in two.}
|
它给出的错误信息如下:
\csdisplay
!! Missing } inserted.
<inserted text>
                }
<to be read again>
                   \vskip
l.29 \hbox{One \vskip
                     1in two.}
|
^^|<inserted text>|
问题在于,当 \TeX\ 位于受限水平模式中,即正在构建水平盒子时,不能使用 |\vskip|。
但 \TeX\ 不是丢掉 |\vskip|,而是在它前面插入一个右花括号,以结束该水平盒子。
如果你接受 \TeX\ 的修改,\TeX\ 遇到稍后的正确右花括号时将再次报错。
它还将对该右花括号之前的任何不能出现在竖直模式的东西报错。
这些额外的错误将是特别让人迷惑的,因为这些错误所说的都是假的,
它们是不恰当插入右花括号后产生的结果。
你的最佳做法是键入 `|5|' 以跳过在 `|}\vskip 1in|' 中的所有记号。

\section{第五个例子}

%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:
这里还有个相似的例子,它的错误信息比你之前看到的都要长:
\csdisplay
\leftline{Skip \smallskip a little further.} But no more.
|
错误在于 |\smallskip| 只能在竖直模式中使用。给出的错误信息如下:
\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.
|
这些错误信息带你巡视了在 \plainTeX\ 中用于实现 |\leftline| 的各个宏——%
这些宏也许是你并不在乎的。
第一行告诉你 \TeX\ 试图通过插入右花括号解决此问题。
\TeX\ 还未读到右花括号,因此若你想的话你可以删除它。
第一行(带 `!' 的那行)之后的信息每部分都由两行组成。
下面是各部分的两行信息的含义:
%\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
\olist
\li 第一对双行表示 \TeX\ 已经插入,但尚未读到的右花括号。
\li 第二对双行表示在读取右花括号后,
\TeX\ 将重新读取 `|\vskip|' 命令(它来自 |\smallskip| 宏的定义中)。
\li 第三对双行表示 \TeX\ 是在展开 |\smallskip| 时发现的错误。
此部分也显示 |\smallskip| 的定义,并表示在展开和执行该定义时已经读到哪里。
具体地说,它是在执行|\vskip| 命令时失败的。
一般地,以控制序列加 `|->|' 开始的信息行表示 \TeX\ 已展开执行的宏的名称。
\li 第四对双行表示 \TeX\ 在处理宏参量时发现了 |\smallskip|,
同时也表示 \TeX\ 在该参量中的位置,即它正在处理 |\smallskip|(失败了)。
通过往前查找接下来两行,你可以看到此参量是传递给 |\leftline| 的。
\li 第五对双行表示 \TeX\ 是在展开 |\leftline| 宏是发现的错误。%
(在这个例子中,错误发生在 \TeX\ 解释多个不同层级的宏定义的中间。)%
在 |#1| 后面的位置表示它最后读取到的是 |\leftline| 的第一个(在这里也是唯一的)参量。
\li 最后对双行表示 \TeX\ 在你的输入文件的位置。
注意此位置远远超出它插入右花括号并重新读取 `|\vskip|' 的位置。
这是因为 \TeX\ 已经从输入文件读取了 |\leftline| 的完整参量,
即使它仅仅处理该参量的一部分。
这两行信息开头的圆点表示输入行前面一部分内容没显示出来。
前面那部分内容实际上就包括让 |\vskip| 变得不合法的 |\leftline| 控制序列。
\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.)
\noindent
在类似这样的长篇信息中,你通常发现只有第一行和最后两行是有用的;
但知道其他行是怎么回事有时候也有益处。
任何你插入或删除的文本将在最内层级中插入或删除。
在这里例子中,插入或删除将出现在 \TeX\ 插入的右花括号前。
特别要注意,在此情形中 \TeX\ 将\emph{不会}把你可能插入的文本放在你的输入文本中,
而是放在多层宏定义的最里面。%
(原始的宏定义当然并不会被改动。)

%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.
你可以用 ^|\errorcontextlines|\ctsref{\errorcontextlines}命令限制
\TeX\ 生成的错误信息双行的数目。
如果你并非对 \TeX\ 给你的所有信息都感兴趣,
你可以设定 |\error!-contextlines| 为 $0$。
这样错误信息将只有最前面两行和最后面两行。

%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
最后,我们提及可能出现在错误信息行对开头的另外两个指示词:
\ulist
\li ^|<output>| 表示 \TeX\ 在它的输出例行程序中间遇到此错误。
\li ^|<write>| 表示 \TeX\ 在执行 |\write| 命令时遇到此错误。
\TeX\ 将在实际执行 |\write| 时才检测这样的错误(在 |\shipout| 时),
而不是在刚遇到 |\write| 命令时。
\endulist

%\eix^^{error messages}
%\endchapter
%\byebye
\eix^^{错误信息}

\ifoldeplain\else\ifcompletebook\else
\vskip4em{\sectionfonts\leftline{本章索引}}
\readindexfile{i}
\fi\fi

\endchapter
\byebye