我有一个围绕 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 工具在这里很有用)在某个时候,好的和坏的执行必须有所不同,这会向您显示哪个命令具有不同的定义。