在加载包时,如何让包\nameref
的命令hyperref
工作enumitem
?以下在删除enumitem
修复程序时出现错误。
\documentclass{article}
\usepackage{enumitem}
\usepackage{hyperref}
\begin{document}
\begin{description}
\item [{Test\label{Test}}] Some text
\end{description}
\nameref{Test}
\end{document}
我尝试改变包裹的顺序但是也无济于事。
答案1
类似这样的事情应该有效。
\documentclass{article}
\usepackage{enumitem}
\makeatletter
\newcommand\enit@descriptionlabel@hook[1]{}
\def\enit@description@i#1#2#3#4{%
\ifnum#1>#3\relax
\enit@toodeep
\else
\enit@list{}%
{\let\enit@type\tw@
\advance#1\@ne
\labelwidth\z@
\enit@align@left
\let\makelabel\descriptionlabel
\enit@style@standard
\enit@preset{#2}{#1}{#4}%
\enit@calcleft
\let\enit@svlabel\makelabel
\def\makelabel##1{%
\NR@gettitle{##1}%
\labelsep\z@
\ifenit@boxdesc
\enit@svlabel{\enit@align{\enit@format{\enit@descriptionlabel@hook{##1}}}}%
\else
\nobreak
\enit@svlabel{\enit@format{\enit@descriptionlabel@hook{##1}}}%
\aftergroup\enit@postlabel
\fi}%
\enit@before
\enit@negwidth}%
\enit@keyfirst
\fi}
\usepackage{hyperref}
\AtBeginDocument{\let\descriptionlabel\NRorg@descriptionlabel}
\renewcommand\enit@descriptionlabel@hook[1]{\NR@gettitle{#1}#1}
\begin{document}
\begin{description}
\item [{Test}\label{Test}] Some text
\end{description}
\nameref{Test}
\end{document}
因此,为了使其正常工作,enumitem 必须添加一个钩子,然后 hyperref 必须使用它。
答案2
这是enumitem
文档第 12.2 节中记录的一个已知问题。建议的解决方法是在列表代码中\makelabel
添加let,这确实似乎有效,但正如 Ulrike 在评论中指出的那样,这并不是一个完整的解决方案。\descriptionlabel
before
\documentclass{article}
\usepackage{enumitem}
\usepackage{hyperref}
\begin{document}
\begin{description}[before=\let\makelabel\descriptionlabel]
\item [{Test\label{Test}}] Some text
\end{description}
\nameref{Test}
\end{document}