不兼容 hyperref enumitem

不兼容 hyperref enumitem

通过标题中的内联枚举,autoref 不会选择正确的类型(图形)而是使用item

有解决方法吗?

测试.aux文件:

\newlabel{figure:foo}{{1}{1}{}{Item.2}{}}

测试.tex 文件:

\documentclass{article}

\usepackage{hyperref}

\usepackage[inline]{enumitem}
\setlist[enumerate,1]{label=\textit{(\alph*)}}

\begin{document}

\begin{figure}
figure-content
\caption[]{figure-caption \begin{enumerate*}\item 1\item2\end{enumerate*}}
\label{figure:foo}
\end{figure}

\autoref{figure:foo}

\end{document}

答案1

默认情况下(不带hyperref),在设置 s 时,只有一件事需要跟踪\label- 一个数字。并且,由于数字更改(通过\stepcounter\refstepcounter和)是\addtocounter\setcounter全球的,人们会认为将 放在\label计数器后面不久就会捕获适当的数字进行\ref纠正。然而,捕获的不是实际的数字,而是它的表示(可能不同;例如,\thesection通常<chapter>.<section>或技术上是\thechapter.\arabic{section})。此表示被捕获在宏中\@currentlabel并存储本地您可以通过以下 MWE 看到这一点:

在此处输入图片描述

\documentclass{article}

\begin{document}

\makeatletter% Just for this example

\setcounter{figure}{5}% Just for this example

Figure counter and current label (1): \thefigure~/~\@currentlabel

\begin{figure}[h]
  Figure counter and current label (2): \thefigure~/~\@currentlabel
  \caption{A figure}
  Figure counter and current label (3): \thefigure~/~\@currentlabel
\end{figure}

Figure counter and current label (4): \thefigure~/~\@currentlabel

\end{document}

注意,尽管数字计数器的值是在 (2) 和 (3)(环境figure)中设置为一组,但它的值是如何从 (1) 到 (4) 变化的。但是,唯一一次捕获正确数字的\label情况是 \caption, 但本地组已终止(这里figure再次指环境)。

这证实了“要求”接近\label适当的计数器的步进位置,特别是在处理组(如浮点数或列表)时。

然而,对于hyperref,还有一个额外的组件与每个一起存储\label-超链接锚点(技术上\@currentHref)。此锚点的作用与 相同\@currentlabel。也就是说,它是一个使用每个适当的 进行更新的宏\refstepcounter。但有一个变化是hyperref更新\@currentHref 全球;因此它在当前组的范围中仍然存在。上述 MWE 的扩展显示了这一点:

在此处输入图片描述

\documentclass{article}

\usepackage{hyperref}

\begin{document}

\makeatletter% Just for this example

\setcounter{figure}{5}% Just for this example

Figure counter, current label and anchor name (1): \thefigure~/~\@currentlabel~/~\@currentHref

\begin{figure}[h]
  Figure counter, current label and anchor name (2): \thefigure~/~\@currentlabel~/~\@currentHref
  \caption{A figure}
  Figure counter, current label and anchor name (3): \thefigure~/~\@currentlabel~/~\@currentHref
\end{figure}

Figure counter, current label and anchor name (4): \thefigure~/~\@currentlabel~/~\@currentHref

\end{document}

请注意,在位置 (3) 处,\@currentlabel和都\@currentHref具有指向图形的正确更新值。然而,在该组之外,\@currentlabel丢失了,而仍然\@currentHref存在(由于它的全球的自然)。

为了解决所有这些问题,最好将您的\label尽可能靠近适当的计数器更改的位置,尤其是在使用时,hyperref以避免与指向不正确内容的锚点混淆。您的示例,带有\label 之内\caption在内部之前的某处更新enumerate*如下:

在此处输入图片描述

\documentclass{article}

\usepackage[inline]{enumitem}
\setlist[enumerate,1]{label=\textit{(\alph*)}}

% https://tex.stackexchange.com/q/1863/5764
\usepackage{hyperref}% Load hyperref last

\begin{document}

\begin{figure}
  \caption[]{\label{fig:foo1}figure-caption \begin{enumerate*}\item 1\item2\end{enumerate*}}
  \label{fig:foo2}
\end{figure}

\autoref{fig:foo1}

\autoref{fig:foo2}

\end{document}

fig:foo1提供了正确的锚点名称,因此通过 提供了正确的解释\autoref,而fig:foo2(在全球的\@currentHref内部变化enumerate*)则不然。

相关内容