hyperref 和 enumitem 包(以及 \refstepcounter)之间的冲突

hyperref 和 enumitem 包(以及 \refstepcounter)之间的冲突

以下两篇文章中概述的解决方案似乎与 hyperref 包相冲突。

  1. 如何跳过子枚举级别的 \item
  2. 用于数学证明的嵌套枚举列表

这是 MWE。示例的期望输出是

1. Outer
2.1. This is line 2.1, in block 2. 
2.2. Inner again
3. Outer again
4. Let’s end here

该输出确实是由下面的 LaTeX 源生成的,但是如果我取消注释标题中的 \usepackage{hyperref} 行,则 LaTeX 会在 \skipitem 命令之后立即给我一个错误,如下面的内联注释所述:

\documentclass{article}

% \usepackage{hyperref}
% if we uncomment the above line, we get an error as described below

\usepackage{enumitem}

\newlist{steps}{enumerate}{9}
\setlist[steps]{itemindent=0pt}
\setlist[steps,1]{label=\arabic*.,ref=\arabic*}
\setlist[steps,2]{label=\arabic{stepsi}.\arabic*.,ref=\arabic{stepsi}.\arabic*}

\makeatletter
\newcommand{\skipitem}{\refstepcounter{\@enumctr}}
\makeatother

\begin{document}
\begin{steps}
\item Outer
  \skipitem
  % If we uncomment the \usepackage{hyperref} line in the header,
  % we get the following error after the \skipitem above
  % 
  % ./tmp.tex:20: Missing number, treated as zero.
  % <to be read again> 
  %   \[email protected] 
  % l.20   \skipitem
  % \item[] \label{blockA}
  \label{blockA}\item[]
  \begin{steps}
  \item\label{lineB} This is line~\ref{lineB}, in block~\ref{blockA}.
  \item Inner again
  \end{steps}
\item Outer again
\item Let's end here
\end{steps}

\end{document}

有人能帮我解决这个冲突吗,这样我就可以使用 hyperref 和 enumitems 和 refstepcounter 吗?谢谢。

(注意:可以使用较小的工作示例,但它们会给出不同的错误消息。我希望使当前示例能够正常工作。)

答案1

最后加载即可hyperref。除了已公布的例外情况(例如),它应该是最后一个cleveref

\documentclass{article}
\usepackage{enumitem}
\newlist{steps}{enumerate}{9}
\setlist[steps]{itemindent=0pt}
\setlist[steps,1]{label=\arabic*.,ref=\arabic*}
\setlist[steps,2]{label=\arabic{stepsi}.\arabic*.,ref=\arabic{stepsi}.\arabic*}
\makeatletter
\newcommand{\skipitem}{\refstepcounter{\@enumctr}}
\makeatother
\usepackage{hyperref}
\begin{document}
\begin{steps}
  \item Outer
  \skipitem
  \label{blockA}\item[]
  \begin{steps}
    \item\label{lineB} This is line~\ref{lineB}, in block~\ref{blockA}.
    \item Inner again
  \end{steps}
  \item Outer again
  \item Let's end here
\end{steps}
\end{document}

链接活着

请注意,您可能需要删除生成的文件并干净地编译,以避免在更正代码后首次运行时出现错误。

相关内容