![如何查找为什么在一个文档中有效的代码直到第五次编译后才在另一个文档中有效](https://linux22.com/image/280982/%E5%A6%82%E4%BD%95%E6%9F%A5%E6%89%BE%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E4%B8%80%E4%B8%AA%E6%96%87%E6%A1%A3%E4%B8%AD%E6%9C%89%E6%95%88%E7%9A%84%E4%BB%A3%E7%A0%81%E7%9B%B4%E5%88%B0%E7%AC%AC%E4%BA%94%E6%AC%A1%E7%BC%96%E8%AF%91%E5%90%8E%E6%89%8D%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E6%A1%A3%E4%B8%AD%E6%9C%89%E6%95%88.png)
我有一个围绕 probsoln 构建的相当复杂的多文件文档。一切工作正常,直到我引入一个除法模板,该模板在其他地方工作正常:
\newdimen\digitwidth \settowidth\digitwidth{0}
\def~{\hspace{\digitwidth}}
\def\divrule#1#2{%
\noalign{\moveright#1\digitwidth%
\vbox{\hrule width#2\digitwidth}}}
%This is the divisor
$+3x$
$-1$
\hspace{0mm}
\begin{tabular}[b]{@{}l@{}}
%This is the quotient
\hspace{2mm}
$+2x^{2}$
\hspace{2mm}
$+3x$
\hspace{6mm}
$+1$
\hspace{5mm}
$-2x^{-1}$
\hspace{2mm}
$+[...]$
\hspace{2mm}
\\
\hline
\big)
\begin{tabular}[t]{@{}l@{}l@{}}
%This is the dividend (Its length controls the line.)
$+6x^{3}$
\hspace{5mm}
$+7x^{2}$
\hspace{10mm}
% $+x$
\hspace{15mm}
$-7$
\\
%This is the first product
\hspace{-17.5mm}
{\footnotesize Ominus:}
\hspace{1mm}
$+6x^{3}$
\hspace{5mm}
$-2x^{2}$
\\ %origin,length
\divrule{0}{33}
%This is the first remainder
\hspace{15mm}
$+9x^{2}$
\hspace{13mm}
% $+4x$
\hspace{12mm}
$-7$
\\
%%This is the second product
{\footnotesize Ominus:}
\hspace{2mm}
$+9x^{2}$
\hspace{7mm}
$-3x$
\\
\divrule{8}{25}%origin,length
%%This is the second remainder
\hspace{35mm}
$+3x$
\hspace{8mm}
$-7$
\\
%This is the third product
\hspace{13mm}
{\footnotesize Ominus:}
% \hspace{3mm}
$ $
\hspace{6mm}
$+3x$
\hspace{8mm}
$-1$
\hspace{5mm}
\\
\divrule{17}{17}%origin,length
%This is the third remainder
\hspace{15mm}
$ $
\hspace{10mm}
$ $
\hspace{12mm}
$ $
\hspace{8mm}
$-6$
\end{tabular}
\end{tabular}
然后我收到以下错误:
../QuestionsBase/16/27.tex:439: Illegal parameter number in definition of \@tmp
.
<to be read again>
1
l.439 }
现在,如果我告诉控制台继续,我会得到相同的错误消息,但结果为 2。第三次运行得到相同的结果,但结果再次为 1。第四次运行得到相同的结果,但结果再次为 2,第五次编译成功。
问题似乎出在除法与从 probsoln 派生的代码交互的方式上,所以我完全清楚这不是可以凭教皇权威解决的问题,我也不是在寻找那样的东西。我的问题是:基于上述内容,我应该寻找什么样的东西?有没有参考资料可以让我了解要寻找什么?希望问候 --schremmer
答案1
一些基本工具(用于回答本网站上的任何问题:-)
0)相信错误信息并查看文件的第 439 行:-)
1)留意常见错误。
2)添加 \tracingall
或者有;
3)什么也不做,希望 egreg 回答
1
最危险的代码是
\def~{\hspace{\digitwidth}}
可能有很多代码假设~
有其通常的定义。
有很多缺失%
,尽管没有明显会导致错误
\hspace{0mm}
例如在输出中添加两个单词空格而不是零宽度的空格,因为之前和之后的换行符没有被注释掉(并且没有合并为一个)。
对于特定情况 Illegal parameter number in definition of \@tmp
最常见的原因是某处缺失}
,使得#2
后面的定义被视为\@tmp
应该早先完成的定义的一部分。
2 人份
\tracingall
输出可能非常大(您可能更喜欢\tracingmacros=2
)但如果相同的顶级命令在一个地方有效但在另一个地方无效,则定义中内部使用的某些命令具有不同的定义。因此,在\tracingall
命令前添加 just 并让它运行到错误,然后在提示符下键入 x 来停止。然后对好的文件执行相同操作。然后比较两个日志文件(emacs ediff 或任何其他 diff 工具在这里很有用)在某个时候,好的和坏的执行必须有所不同,这会向您显示哪个命令具有不同的定义。