我正在将独立论文导入论文文档。由于我没有自己想象的那么有前瞻性,所以我在论文中使用了一些相同的标签(用于引言部分、结论部分,可能还有一些方程式)。
现在,在编译整篇论文时,编译器如何选择引用哪个,比如说\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}