我已经研究源代码\autoref
很长时间了,但还是不明白\autoref
确定标签类型的方法。
我有点迷失在相关代码中(hyperref.dtx
第 13400 至 13474 行):
\DeclareRobustCommand*{\autoref}{%
\leavevmode
\@ifstar{\HyRef@autoref\@gobbletwo}{\HyRef@autoref\hyper@@link}%
}
\def\HyRef@autoref#1#2{%
\begingroup
\Hy@safe@activestrue
\expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}%
\endgroup
}
\def\HyRef@autosetref#1#2#3{% link command, csname, refname
\HyRef@ShowKeysRef{#2}%
\ifcase 0\ifx#1\relax 1\fi\ifx#1\Hy@varioref@undefined 1\fi\relax
\edef\HyRef@thisref{%
\expandafter\@fourthoffive#1\@empty\@empty\@empty
}%
\expandafter\HyRef@testreftype\HyRef@thisref.\\%
\Hy@safe@activesfalse
#3{%
\expandafter\@fifthoffive#1\@empty\@empty\@empty
}{%
\expandafter\@fourthoffive#1\@empty\@empty\@empty
}{%
\HyRef@currentHtag
\expandafter\@firstoffive#1\@empty\@empty\@empty
\null
}%
\else
\protect\G@refundefinedtrue
\nfss@text{\reset@font\bfseries ??}%
\@latex@warning{%
Reference `#2' on page \thepage\space undefined%
}%
\fi
}
我相信\HyRef@currentHtag
应该是标签名称(例如chapter
,section
等等),但我不明白这段代码是如何工作的。
\csname r@#2\endcsname
(扩展为)有什么作用\r@#2
?#2
这里的标签(例如chap:1
由 定义\label{chap:1}
)
答案1
故事以 开始\refstepcounter
,然后跟随\label
和文件,最后以或 之.aux
类的参考命令结束。\ref
\autoref
在 LaTeX2e 格式(简化形式)中,
\refstepcounter{<counter>}
步骤<counter>
,然后将其值存储(或更新)在中\@currentlabel
。\label{<key>}
写入\newlabel{<key>}{{<value of \@currentlabel>}{<value of \thepage}}
文件.aux
,其中建立标签键和参考内容之间的链接。.aux
当输入时\begin{document}
,\newlabel
会展开并定义\r@<key>
为{<value of \@currentlabel>}{<value of \thepage}
。- 最后,
\ref{<key>}
和分别\pageref{<key>}
获取<value of \@currentlabel>
和<value of \thepage}
链接到<key>
。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
% 3. at second running, .aux file is input and
% \r@key is defined to be "{3}{1}"
section \ref{key}
% 4. get 3 from \r@key and output 3
\setcounter{section}{2}
\section{title}
% 1. now \@currentlabel is 3
\label{key} % current page is 1
% 2. now \newlabel{key}{{2}{1}} is written to .aux file
\end{document}
hyperref
<key> -> <value>, <page>
将链接扩展至<key> -> <value>, <page>, <name>, <hyper ref>, <file>
。使用上面的例子,
- 现在
\section{<name>}
(调用\refstepcounter
)更新\@currentlabel
为 3、更新\@currentlabelname
为<name>
(即“title”),并\@currentHref
更新为<hyper ref>
(即“section.3”,形式为<counter name>.<counter value>). Note that the counter name is contained in
`. - 现在
\label{key}
写入文件\newlabel{key}{{3}{1}{title}{section.13}{}}
.aux
- 现在输入
.aux
文件定义\r@key
为{3}{1}{title}{section.13}{}
。 - 现在
\ref
和\pageref
以前一样,并\nameref{<key>}
获取<name>
(在我们的例子中为“标题”),获取(即“第 3 节”)\autoref{<key>}
的组合。<autoref name per counter> <value>
附言:
\nameref
由包提供nameref
,该包随 一起分发并自动加载hyperref
。- 假设
#2
是“key”,则在扩展的一步中\csname r@#2\endcsname
扩展为控制序列。您可以在以下文档中了解更多信息:\r@key
\csname ... \endcsname
TeX 按主题分类。