当文档被分成单独的文件时,如何确保 varioref 生成唯一的标签?

当文档被分成单独的文件时,如何确保 varioref 生成唯一的标签?

添加后瓦里雷夫包(从 TeX 输入生成类似“第 YY 页上的图 XX”之类的文本\vref{fig:example}),我开始看到类似这样的警告

LaTeX Warning: Label `1@xvr' multiply defined.
LaTeX Warning: Label `1@vr' multiply defined.

我的文档的章节存储在单独的文件中:chapter1.texchapter2.tex等,这些章节从主文档中引用,使用

\include{Chapter1/chapter1}
\include{Chapter2/chapter2}
...

我把问题追溯到通过将计数器与和与连接起来来varioref生成自己的xvr和标签。似乎这个计数器会为每个文件重置。例如,在我的文档中,包含vr@xvr@vrchapter5.aux

\newlabel{1@xvr}{{}{181}{Review of ...}{subsection.5.3.2}{}}
\newlabel{1@vr}{{}{181}{Review of ...}{subsection.5.3.2}{}}

chapter6.aux包含

\newlabel{1@xvr}{{}{198}{Introduction to ...}{section.6.1}{}}
\newlabel{1@vr}{{}{198}{Introduction to ...}{section.6.1}{}}

显然,生成的标签varioref在各个章节之间是重复的,尽管它们在章节内是唯一的。我希望修复这个问题,因为我不确定在引用不同章节中的标签时(例如,\vref{sec:Introduction to ...}来自chapter5.tex上例中的标签),页码引用在所有情况下都是正确的。

提前感谢您提供的任何帮助!

更新似乎varioref对于CUED 论文模板因人而异!

答案1

varioref使用命令的保存版本\label在文件中生成这样的标签.aux

\def\vref@label#1{\@bsphack
  \protected@write\@auxout{}%
         {\string\newlabel{#1}{{}{\thepage}}}%
  \@esphack}

\label这与in的定义大致相同,latex.ltx只是它不传递\@currentlabel\newlabel

保存此版本的真正原因是以一种不适合 varioref 目的的方式babel重新amsmath定义。\label

但是,这些模板中所做的修改似乎会导致 LaTeX 计数器vrcnt按包含内容重置(或者可能一般按章节重置?),因此您会得到双重标签。

在 varioref 中,它的定义很简单

\newcounter{vrcnt}

所以永远不应该重置。也许 mod 会改变\newcounter

我的建议是

  1. 尝试尽早加载varioref,甚至在\RequirePackage课程开始前加载,或者如果不起作用

  2. 每个章节文件明确设置,例如,

    \setcounter{vrcnt}{1000}
    

    每章增加 1000 - 这是一个手动的解决方法,但我想它会起作用。

  3. 或者您可以尝试更改\vref@label为包含\thechapter在标签名称中,或者使标签再次唯一所需的任何内容,例如

    \makeatletter
    \def\vref@label#1{\@bsphack
      \protected@write\@auxout{}%
             {\string\newlabel{\thechapter:#1}{{}{\thepage}}}%
      \@esphack}
    \makeatother
    

    在序言中。

最终,完成类文件的人员需要查看那里,因为计数器无缘无故地重置有点奇怪。

相关内容