![当我使用自定义 \item 和 hyperref 时出现错误标签](https://linux22.com/image/443411/%E5%BD%93%E6%88%91%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%20%5Citem%20%E5%92%8C%20hyperref%20%E6%97%B6%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E6%A0%87%E7%AD%BE.png)
首先我参考这个答案: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
)。要解决这个问题,请\phantomsection
在T
rue 分支中发出:
\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}