Hyperref 与 enumitem 冲突

Hyperref 与 enumitem 冲突

代码

\documentclass[11pt]{article}
\usepackage{hyperref}
\usepackage{enumitem}
\newlist{ilist}{enumerate}{3}
\setlist*[ilist]{leftmargin=*}
\setlist*[ilist,1]{label=\arabic*.}
\setlist*[ilist,2]{label=\arabic{ilisti}.,before=\refstepcounter{ilisti}}
\setlist*[ilist,3]{label=\arabic{ilisti}.,before=\refstepcounter{ilisti}}

\begin{document}

\begin{ilist}
\item A
\begin{ilist}
\item B
\begin{ilist}
\item C
\end{ilist}
\end{ilist}
\end{ilist}

\end{document}

以某种方式产生错误

如果我注释掉,错误就会解决\usepackage{hyperref}

有什么想法可以解释原因吗?

答案1

这是 中的一个错误hyperrefhyperref尝试\theH<counter>为每个新计数器提供一个定义并用于此\arabic{#1}。但这意味着 中的命令#1不会直接展开,而这在这里则归结为 enumitem 用于\@definecounter{\enit@c\romannumeral\count@}定义新的列表计数器,因此例如\theHilisti看起来像这样:

> \theHilisti=macro:
->\arabic {\enit@c \romannumeral \count@ }.

我将更改 hyperref 定义。目前的解决方法是

\documentclass[11pt]{article}
\usepackage{hyperref}
\makeatletter
\def\@definecounter#1{%
     \H@definecounter{#1}%
     \expandafter
     \gdef\csname theH#1\expandafter\endcsname\expandafter
          {\expandafter\@arabic\csname c@#1\endcsname}}%
\makeatother   
\usepackage{enumitem}
\newlist{ilist}{enumerate}{3}
\setlist*[ilist]{leftmargin=*}
\setlist*[ilist,1]{label=\arabic*.}
\setlist*[ilist,2]{label=\arabic{ilisti}.,before=\refstepcounter{ilisti}}
\setlist*[ilist,3]{label=\arabic{ilisti}.,before=\refstepcounter{ilisti}}
\begin{document}

\begin{ilist}
\item A
\begin{ilist}
\item B
\begin{ilist}
\item C
\end{ilist}
\end{ilist}
\end{ilist}

\end{document}

相关内容