我有这个非常基本的文件:
\documentclass[12pt]{article}
\begin{document}
\label{a}
Reference \ref{a}
\end{document}
但是我编译了几次之后,得到的文档只有“参考”,而没有“参考 1”。我遗漏了什么?
答案1
\refstepcounter
您没有引用任何内容,因为该小文档没有增加计数器。\label
需要\refstepcounter
,因为该宏定义了\@currentlabel
,它保存了计数器值(或更好:参考格式)(当然,\@currentlabel
可以事先定义以创建“假”标签)
现在,在之前latex.ltx
定义一个空的,并且该信息被使用,所以您看到的是而不是。\@currentlabel
\begin{document}
\label
Reference
Reference 1
那个小小的OP文档的文件.aux
也很小:
\relax
\newlabel{a}{{}{1}}
名称后面是标签名称a
和交叉引用信息,即{{}{1}}
。里面的第一个括号对是空的,而第二个括号的1
内容是页码,而不是请求的参考编号——向文件中LaTeX
写入了一个空\@currentlabel
内容.aux
。
以下是来自(第 4089f 行)的相关代码latex.ltx
,我的评论。
\def\label#1{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\@currentlabel}{\thepage}}}% Use `\@currentlabel`
\@esphack}
\def\refstepcounter#1{\stepcounter{#1}%
\protected@edef\@currentlabel
{\csname p@#1\endcsname\csname the#1\endcsname}% Define `\@currentlabel`
}
\def\@currentlabel{}% Empty definition at the beginning.
假设一个标准文档类像article
,例如\section
(不是\section*
)在内部使用\refstepcounter{section}
(实际上是\@sect
调用该宏,但让我们暂时忽略这一点,也secnumdepth
必须具有适当的值这一事实)并且以下示例将提供参考:
\documentclass[12pt]{article}
\begin{document}
\section{Foo}\label{a}
Reference \ref{a}
\end{document}
答案2
LaTeX 的\label
-\ref
交叉引用机制依赖于\label
与某个变量关联的指令- 这可能是与或环境以及等标题counter
关联的计数器- 正在递增。(递增通常发生在“幕后”,普通作者看不到。)figure
table
\section
\subsection
如果由于某种原因,您不想创建\label
-\ref
种类的交叉引用,您应该研究加载hyperref
包并使用其\hypertarget
-\hyperlink
交叉引用机制。
\hypertarget
和宏都接受 2 个参数,而不是 1 个参数(和 的\hyperlink
情况一样) 。请考虑以下简单代码:\label
\ref
\documentclass[12pt]{article}
\usepackage[colorlinks,allcolors=black]{hyperref}
\begin{document}
\hypertarget{item:a}{a}
\clearpage
Reference \hyperlink{item:a}{item a}
\end{document}
观察\hypertarget
和相关\hyperlink
指令的第一个参数是(事实上,必须是!)相同的。
编译后,会得到一个两页的文档。在编译后的文档中,如果您单击第二页中的字符串“item a”,查看器将带您到第一页上的字符串“a”。(请注意,根据示例的构造,超链接不是直接可见的,因为链接颜色在文档的序言中设置为黑色。)
答案3
在我的例子中,我使用的是 section*{} 而不是 section{}。其次,我必须将 \label 标签放在 \caption 标签下方。更改这些后,问题就解决了。