![编译器如何在多个定义的标签之间进行选择/排序?](https://linux22.com/image/333784/%E7%BC%96%E8%AF%91%E5%99%A8%E5%A6%82%E4%BD%95%E5%9C%A8%E5%A4%9A%E4%B8%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E6%A0%87%E7%AD%BE%E4%B9%8B%E9%97%B4%E8%BF%9B%E8%A1%8C%E9%80%89%E6%8B%A9%2F%E6%8E%92%E5%BA%8F%EF%BC%9F.png)
我正在将独立论文导入论文文档。由于我没有自己想象的那么有前瞻性,所以我在论文中使用了一些相同的标签(用于引言部分、结论部分,可能还有一些方程式)。
现在,在编译整篇论文时,编译器如何选择引用哪个,比如说\ref{sec:intro}
?它会引用最接近的吗\label{sec:intro}
?还是它会将同一章节中的标签排在其他章节中的相同标签之前?
答案1
该命令在后台\label
使用,它对标签进行检查(嗯,实际上是这样做的)(如果标签已知则发出警告)并使用最后一个提供标签名称的“实体”生成标签。(请参阅中的和命令。\newlabel
\@newl@bel
\label
\newlabel
latex.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.1
3.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}