答案1
\newlabel
需要六个参数的语句hyperref
与默认值两个相比并不正确。hyperref
仍然只使用两个参数\newlabel
,而是在第二个参数里面放了五个参数;默认值是在第二个参数中只打包两个元素……
\label
为了更详细地了解这一点,请考虑定义方式的不同,因为它最终将写入\newlabel
文件.aux
;这是传统的观点\label
(来自latex.ltx
):
def\label#1{%
\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{#1}{%
{\@currentlabel}%
{\thepage}%
}}%
\@esphack}
调用\label{<label>}
将写入\newlabel{<label>}{{\@currentlabel}{\thepage}}
(.aux
解析为\@currentlabel
和,\thepage
无论当前标签及其页面表示应该是什么)。因此,\ref{<label>}
将返回存储的\@currentlabel
(通过\@firstoftwo
调用),而\pageref{<label>}
将返回存储的\thepage
(通过\@secondoftwo
调用)。
现在让我们看看\label
加载时hyperref
(内部nameref.dtx
):
\def\label#1{%
\@bsphack
\begingroup
\def\label@name{#1}%
\label@hook
\protected@write\@auxout{}{%
\string\newlabel{#1}{%
{\@currentlabel}%
{\thepage}%
{\@currentlabelname}%
{\@currentHref}{}%
}%
}%
\endgroup
\@esphack
}%
现在,对 的调用\label{<label>}
将写入\newlabel{<label>}{{\@currentlabel}{\thepage}{\@currentlabelname}{\@currentHref}{}}
。.aux
请注意,前两个元素与传统的 类似\label
。不同之处在于添加了三个元素(最后一个元素故意留空{}
)。后面的讨论在nameref
文档(部分3 实施)。
由于hyperref
现在必须处理从 5 集合中提取元素,如果定义\@firstoffive
,\@secondoffive
,... ,\@fifthoffive
。
最终,\newlabel
传统的 andhyperref
意义只适用于两个参数。只是使用 时第二个参数包含更多元素hyperref
。