我在文档中使用 winedt 6.0 和 SIAM 模板。编译时,我收到一条错误消息,指出:
! SIAM Label Error: There were multipy-defined labels
Correct multiply-defined labels.
Type H <return> for immediate help.
...
l.14 \newlabel{L2norm}{{2.2}{3}}
根据最后一行,我推测重复的标签是 L2norm。我这样假设正确吗?我遵循了这个帖子找到这个多重定义的标签。事实证明,我以前有一个标签“L2norm”,但后来将其更改为“L2normerr”。没有其他标签有这个字符串,我也没有找到任何其他重复的标签(仅使用搜索<ctrl-f>
)。我肯定我误解了一些东西,但我不确定是什么......请帮忙!:)
答案1
该作业可能正在使用在您更改标签之前创建的旧 .aux 文件。删除有问题的 .aux 文件,或重新运行该作业(两次),错误消息就会消失。如果没有,您引用的帖子中的建议有助于您找到落后者。
为什么会这样?当在运行之间更改标签时,下一次 Latex 运行将首先读取现有.aux
文件(使用旧标签)。只有这样,它才会创建一个新.aux
文件(使用新标签),以便在下次运行时读入。因此,标签的值(和其他“已保存”的材料,如目录)总是落后一次运行。
您可能已经注意到,在第一次运行后,没有目录,并且显示交叉引用??
。这是因为在完成该运行之前没有.aux
可用的文件。如果您确实想确保标签正确,则可以在进行会影响其值的更改时,通过删除所有.aux
(和.toc
,.lof
和.lot
)文件来重新启动循环。当您在输出中看到时??
,这强烈提醒您需要再次运行。
答案2
如果错误消息中没有有用的信息,有时很难找到重复的标签。如果您的系统上有 Python 3,则可以使用以下解决方案(经过少量修改后,它也应该适用于 Python 2)。将以下代码粘贴到文本文件中并将其保存为 find_duplicates.py:
#find_duplicates.py (python code)
#inputs: path to tex file
#prints all labels of the form \label{something} that occur more than once
import sys
import re
filename = sys.argv[1]
f = open(filename,'r')
file = f.read()
f.close()
#find all the \label{something} and get something
g = re.compile('\\label\{\w*\}')
labels = g.findall(file)
sortedLabels = sorted(labels)
#get labels that occur more than once
labelCounts = {}
repeatedLabels = []
for label in labels:
if(label) in labelCounts:
labelCounts[label] = labelCounts[label]+1
repeatedLabels.append(label)
else:
labelCounts[label] = 1
print('repeated labels: ',repeatedLabels)
然后,在命令行中输入:
python find_duplicates.py name_of_your_tex_file.tex
输出将是重复标签的列表。然后您可以进入 tex 文件并删除重复项。
答案3
在大多数情况下,上述解决方案对我有用。但是,在某些情况下,我需要快速完成文档,无法使用上述方法解决问题。因此,可以通过调整siamart.cls
(对我来说是 1147 - 1176 行)来快速解决问题:
\gdef\@siamlabel@error#1#2{%
\GenericError{%
\space\space\space\@spaces\@spaces\@spaces
}{%
SIAM Label Error: #1%
}{%
Correct multiply-defined labels.%
}{#2}%
}
%%% NEW -- causes multiply defined labels to generate errors
\def\@newl@bel#1#2#3{%
\@ifundefined{#1@#2}%
\relax
{\gdef \@multiplelabels {%
\@latex@warning@no@line{Label `#2' multiply defined}}%
\@siamlabel@error{There were multiply-defined labels}{}}%
\global\@namedef{#1@#2}{#3}}
\def\newlabel{\@newl@bel r}
\@onlypreamble\@newl@bel
\let \@multiplelabels \relax
\def\label#1{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
\@esphack}
\def\refstepcounter#1{\stepcounter{#1}%
\protected@edef\@currentlabel
{\csname p@#1\endcsname\csname the#1\endcsname}%
}
%%%
只需删除/注释掉后半部分,即
%%% NEW -- causes multiply defined labels to generate errors
%\def\@newl@bel#1#2#3{%
% \@ifundefined{#1@#2}%
% \relax
% {\gdef \@multiplelabels {%
% \@latex@warning@no@line{Label `#2' multiply defined}}%
% \@siamlabel@error{There were multiply-defined labels}{}}%
% \global\@namedef{#1@#2}{#3}}
%\def\newlabel{\@newl@bel r}
%\@onlypreamble\@newl@bel
%\let \@multiplelabels \relax
%\def\label#1{\@bsphack
% \protected@write\@auxout{}%
% {\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
% \@esphack}
%\def\refstepcounter#1{\stepcounter{#1}%
% \protected@edef\@currentlabel
% {\csname p@#1\endcsname\csname the#1\endcsname}%
%}
%%%
但请注意,这会阻止模板检测多重定义的标签(即,多重定义的标签被跳过并且不会被呈现)。