`\autoref`(来自 hyperref 包)如何知道我指的是哪种类型的标签?

`\autoref`(来自 hyperref 包)如何知道我指的是哪种类型的标签?

我已经研究源代码\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应该是标签名称(例如chaptersection等等),但我不明白这段代码是如何工作的。

\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 ... \endcsnameTeX 按主题分类

相关内容