找不到 SIAM 标签错误

找不到 SIAM 标签错误

我在文档中使用 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}%
%}
%%%

但请注意,这会阻止模板检测多重定义的标签(即,多重定义的标签被跳过并且不会被呈现)。

相关内容