当我使用自定义 \item 和 hyperref 时出现错误标签

当我使用自定义 \item 和 hyperref 时出现错误标签

首先我参考这个答案:https://tex.stackexchange.com/a/328393/180617得到一个可自定义的ref-able标签\item,但是当我想使用hyperref包来点击跳转时,事情就变得奇怪了。


\documentclass{article}

\makeatletter
\let\it@m\item
\RenewDocumentCommand{\item}{ o }{%
\IfValueTF{#1}{\it@m[#1]\protected@edef\@currentlabel{#1}}{\it@m}
}
\makeatother

\usepackage{enumitem}
\usepackage[colorlinks]{hyperref}
\begin{document}
    \begin{enumerate}
        \item 1
        \item 2
    \end{enumerate}
    \begin{enumerate}[start=3]
        \item [1st] \label{1st} first
        \item [2nd] \label{2nd} second
        \item \label{3rd} third
    \end{enumerate}
    \ref{1st}, \ref{2nd}, \ref{3rd}
\end{document}

经过两次pdflatex,我得到了“正确”的pdf文件

在此处输入图片描述

但是,当我单击1st和时2nd,它总是跳转到第一个enumerate的第一个项目。

main.aux写道

\newlabel{1st}{{1st}{1}{}{Item.1}{}}
\newlabel{2nd}{{2nd}{1}{}{Item.1}{}}
\newlabel{3rd}{{3}{1}{}{Item.2}{}}

为什么会发生这种情况以及如何解决?

编辑: 感谢@werner的回答。但是我发现如果我使用a \ref作为标签,超链接仍然会出错:

\documentclass{article}

\makeatletter
\let\it@m\item% Store \item inside \it@m
\RenewDocumentCommand{\item}{ o }{%
  \IfValueTF{#1}
    {\it@m[#1]\phantomsection\protected@edef\@currentlabel{#1}}
    {\it@m}
}
\makeatother

\usepackage{enumitem}
\usepackage[colorlinks]{hyperref}

\begin{document}
\begin{enumerate}
  \item 1
  \item\label{test} 2
\end{enumerate}

\begin{enumerate}[start=3]
  \item [\ref{test}] \label{1st} first
  \item [2nd] \label{2nd} second
  \item \label{3rd} third
\end{enumerate}

\ref{1st}, \ref{2nd}, \ref{3rd}

\end{document}

在此处输入图片描述

当我点击2底部的 时,我希望它跳转到 行first。但它跳转到了原来的行2。我认为这是由重复的 引起的ref。然而,当我测试这个时:

\documentclass{article}
\usepackage[colorlinks]{hyperref}
\begin{document}
    \section{One}\label{one}
    test
    \section{Two \ref{one}}\label{two}
    \ref{two}
\end{document}

超链接工作正常。为什么?

答案1

当你\item[<lab>]使用可选参数发出时,没有反击。而这种反击对于设置适当的hyperref目标(在内部,这是通过使用 步进计数器来完成的\refstepcounter)。要解决这个问题,请\phantomsectionTrue 分支中发出:

\documentclass{article}

\makeatletter
\let\it@m\item% Store \item inside \it@m
\RenewDocumentCommand{\item}{ o }{%
  \IfValueTF{#1}
    {\it@m[#1]\phantomsection\protected@edef\@currentlabel{#1}}
    {\it@m}
}
\makeatother

\usepackage{enumitem}
\usepackage[colorlinks]{hyperref}

\begin{document}
\begin{enumerate}
  \item 1
  \item 2
\end{enumerate}

\begin{enumerate}[start=3]
  \item [1st] \label{1st} first
  \item [2nd] \label{2nd} second
  \item \label{3rd} third
\end{enumerate}

\ref{1st}, \ref{2nd}, \ref{3rd}

\end{document}

相关内容