答案1
使用该-ini
标志运行 TeX 意味着您在没有任何预加载格式的情况下运行。您除了原始命令之外什么也得不到,这意味着\
和\&
未定义。这就是您收到错误的原因。您真的想运行 iniTeX 吗?
i
表示在错误发生的位置插入以下文本。x
是通常的退出命令。e
理论上会停止,然后在错误点打开编辑器。我猜这是缺少一些实现/配置,这就是你得到分段错误的原因。这些只是 TeX 提供的一些交互式错误处理命令。请参阅TeXbook有关它们如何工作的更多信息。我从来没有真正关心过它们。它们在 80 年代早期很有意义,当时计算机速度很慢,计算时间很昂贵,但即使到了 1986 年我第一次开始使用 TeX 时,程序运行速度也足够快,因此通常更明智的做法是使用 x 来停止 TeX,修复输入文件中的错误并继续。
答案2
恭喜,您发现了 TeX 中的错误。
编辑休假回来后,我仔细检查了这个问题,发现:这个 bug 是在 TeX 的 C 实现中,而不是 TeX 本身(由 D. Knuth 编写)。所以,下面这段话(几天前我给出的)并不完全正确:
TeX 的最后一次修订(版本 3.14159265)是由 D. Knuth 于 2014 年完成的,下一次修订将在 2020 年底进行。如果您发送此错误报告,您将获得 D. Knuth 的一张小额支票。当然,这只有在您的错误报告被视为 TeX 的真正错误时才有效。如何提交错误报告在这里在勘误表部分。
错误描述:如果我们调用一个错误(\
在您的示例中未定义),则I
可以使用选项。如果我们将选项与下一个错误(在您的示例中未定义)I
的行一起使用,并且该行在此处未关闭(在您的示例中如下),则第二个错误提供所有选项,包括选项。但是使用选项会导致 TeX 崩溃,因为在这种情况下文件名为零。\&
I
V
E
E
详细来说:I
TeX web 的 §84 中的选项运行来自 §87 的代码,其中处理了 begin_file_reading 过程。此过程位于 §328 中,这里是:name := 0
。name
是在 §302 中定义的宏:name = cur_input.name_field
。现在,我们可以返回到 §84,在那里E
解决了该选项。它创建了文件名(可以发送给编辑器),input_stack[base_ptr].name_field
但这与 相同,cur_input.name_field
并且它被设置为零。这里没有文件名,只有零。基于 C 的 TeX 实现因分段错误而崩溃,因为我们想要打开文件名有缺陷的文件。
编辑:当我用代码做实验tex.web
并停用选项后给出的系统相关代码E
时,正确答案在这里:You want to edit file <correct name> at line <correct number>
。错误位于lib/texmfmp.c
第 2579 行,其中关闭了打开的文件并从全局变量中读取打开文件的最大索引。当使用选项但在这种情况下没有打开新文件时,inopen
此变量会增加。所以,我们无法关闭不存在的文件。Knuth 在 §304 中说:“全局变量等于最高非标记列表级别的值。”这意味着它并不总是当前打开的文件的数量。Knuth 的代码和他在代码中的注释在这里是正确的,错误是在系统相关的实现中。I
lib/texmf.c
in_open
答案3
原始发帖人:与您的其他报告一样……如果您看到此内容,请给我发送电子邮件,地址为 karl@tug.org,以便我们在向 Don Knuth 提交的报告中给予您适当的荣誉。(我们认为 tex.web 和 web2c 中都存在错误;可以诱导 tex.web 代码在“您想要编辑……”消息中打印虚假的文件名。)
至于 begin_file_reading,我们可以说,它的命名不太理想。它真正做的是“开始一个输入级别”——无论是从文件还是从终端交互。
我刚刚向 TeX Live 提交了一个修复程序(希望如此),r55857(http://tug.org/svn/texlive/trunk/Build/source/texk/web2c/lib/texmfmp.c?r1=53078&r2=55857&pathrev=55857)。它需要查看 input_stack[] 的所有元素,以辨别 input_file[] 中的给定条目实际上是文件还是终端交互产生的非文件。以前,我们只是关闭 input_file[] 中的所有内容,但那是错误的。
关于“今年年底” - 请尽快将所有 Knuthian 错误报告发送给我或 tex-k at tug.org!不要等到 12 月 31 日。我的非官方截止日期是 11 月 1 日。所有报告在进入 Knuth 堆之前都必须经过审查,这需要时间。更多信息:https://tug.org/texmfbug。
谢谢大家。
答案4
将此更改应用于原来的tex.web 你会发现 TeX 中没有任何错误:
@x
@.You want to edit file x@>
slow_print(input_stack[base_ptr].name_field);
print(" at line "); print_int(line);
@y
@.You want to edit file x@>
slow_print(input_stack[base_ptr].name_field);
print(" which has string number ");
print_int(input_stack[base_ptr].name_field);
@z
输出:
You want to edit file h.tex which has string number 1346
(即input_stack[base_ptr].name_field
不为零)
因此,相关的变更条目完全无用且没有任何用途:
431. Don't exit to editor if no input file is at the bottom line
(Xiaosa Zhang, 03 July 2020)
@x module 84
"E": if base_ptr>0 then
@y
"E": if base_ptr>0 then if input_stack[base_ptr].name_field>=256 then
@z
@x module 85
if base_ptr>0 then print("E to edit your file,");
@y
if base_ptr>0 then if input_stack[base_ptr].name_field>=256 then
print("E to edit your file,");
@z
(一切灾难都是web2c造成的)