如何让 enumitem 与 hyperref 良好配合?

如何让 enumitem 与 hyperref 良好配合?

在加载包时,如何让包\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 在评论中指出的那样,这并不是一个完整的解决方案。\descriptionlabelbefore

\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}

相关内容