编译器如何在多个定义的标签之间进行选择/排序?

编译器如何在多个定义的标签之间进行选择/排序?

我正在将独立论文导入论文文档。由于我没有自己想象的那么有前瞻性,所以我在论文中使用了一些相同的标签(用于引言部分、结论部分,可能还有一些方程式)。

现在,在编译整篇论文时,编译器如何选择引用哪个,比如说\ref{sec:intro}?它会引用最接近的吗\label{sec:intro}?还是它会将同一章节中的标签排在其他章节中的相同标签之前?

答案1

该命令在后台\label使用,它对标签进行检查(嗯,实际上是这样做的)(如果标签已知则发出警告)并使用最后一个提供标签名称的“实体”生成标签。(请参阅中的和命令。\newlabel\@newl@bel\label\newlabellatex.ltx

这里的关键点是\global\@namedef这里的用法:

\def\@newl@bel#1#2#3{{%
  \@ifundefined{#1@#2}%
    \relax
    {\gdef \@multiplelabels {%
       \@latex@warning@no@line{There were multiply-defined labels}}%
     \@latex@warning@no@line{Label `#2' multiply defined}}%
  \global\@namedef{#1@#2}{#3}}}

即,如果标签已经存在,则标签名称将再次被“覆盖”,并且仅存储最后一个值。

这意味着先前的值将被覆盖并且始终使用最后一个值。

在下面的例子中,打印了的值2,因为第二个章节标签覆盖了第一个章节标签。

\documentclass{book}


\begin{document}

In \ref{firstchapter} we will see that

\chapter{Chapter First}\label{firstchapter}

\chapter{Second Chapter} \label{firstchapter}


\end{document}

这是相应的.aux文件:

\relax 
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Chapter First}{3}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{firstchapter}{{1}{3}}
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Second Chapter}{5}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{firstchapter}{{2}{5}}

在此处输入图片描述

一些编辑--由于标签是针对该部分制作的(在此示例中),conclusion因此将打印对标签的引用3.13.1

\documentclass{book}


\begin{document}

In \ref{firstchapter} we will see that -- use the \ref{conclusion} for this!

\chapter{Chapter First}\label{firstchapter}

\section{Conclusion} \label{conclusion}
\chapter{Second Chapter} \label{firstchapter}


\section{Other conclusion} \label{conclusion}


\chapter{Last chapter}

\section{Conclusion that's not wanted} \label{conclusion}

\end{document}

相关内容