错误地交叉引用带有定制标签的枚举列表中的项目

错误地交叉引用带有定制标签的枚举列表中的项目

这篇文章的灵感来自于最近查询提出了一个相关但不完全相同的问题。

假设有人希望将枚举列表的标签显示为方程式编号(方程式编号放在左侧)。实际上,列表项应该共享equation。以下 MWE 借助枚举项包裹。

\documentclass{article}
\usepackage[leqno]{amsmath}
\counterwithin{equation}{section}

\usepackage{parskip}
\usepackage{enumitem}

\usepackage[colorlinks,allcolors=red]{hyperref}
\usepackage[nameinlink,noabbrev]{cleveref}

\begin{document}
\setcounter{section}{2} % just for this example

A displayed and numbered equation:
\begin{equation}\label{eq:a}
1+1=2
\end{equation}
and a cross-reference to \cref{eq:a}.

An enumerated list that's ``numbered'' the same way as a displayed equation:  
\begin{enumerate}[format=\refstepcounter{equation}, label=(\theequation), left=0pt]
\item  First enumerated fact.  \label{item:I}
\item  Second enumerated fact. 
\end{enumerate} 
I want to cross-reference \cref{item:I} the same way as \cref{eq:a}.
\end{document}

在此处输入图片描述

问题是:枚举项“编号”(标签?)正确,但交叉引用不正确。顺便说一句,这不是问题——和 也cleveref存在同样的问题。\ref\eqref

问题:我遗漏了什么?请注意,使用该enumitem包非常重要。

答案1

我会定义一个特殊的环境。

\documentclass{article}
\usepackage[leqno]{amsmath}
\counterwithin{equation}{section}

\usepackage{enumitem}

\usepackage[colorlinks,allcolors=red]{hyperref}
\usepackage[nameinlink,noabbrev]{cleveref}

% define a proper environment
\newlist{eqlist}{enumerate}{1}
\crefname{eqlisti}{item}{items}
% the counter is shared
\ExpandArgs{cc}\RenewCommandCopy{c@eqlisti}{c@equation}
\setlist[eqlist,1]{
  left=0pt,                      % labels flush left
  label=\textup{(\theequation)}, % like for equations
  before=\stepcounter{equation}, % we want to go on with numbering
  resume,                        % don't forget the final number
}

\begin{document}
\setcounter{section}{2} % just for this example

A displayed and numbered equation:
\begin{equation}\label{eq:a}
1+1=2
\end{equation}
and a cross-reference to \cref{eq:a}.

An enumerated list that's ``numbered'' the same way as a displayed equation:  
\begin{eqlist}
\item  First enumerated fact.  \label{item:I}
\item  Second enumerated fact. 
\end{eqlist} 
I want to cross-reference \cref{item:I} the same way as \cref{eq:a}.

A displayed and numbered equation:
\begin{equation}\label{eq:b}
1+1=2
\end{equation}
and a cross-reference to \cref{eq:b}.

An enumerated list that's ``numbered'' the same way as a displayed equation:  
\begin{eqlist}
\item  First enumerated fact.  \label{item:I+}
\item  Second enumerated fact. 
\end{eqlist} 
I want to cross-reference \cref{item:I+} the same way as \cref{eq:b}.

\end{document}

在此处输入图片描述

答案2

当您执行 时format=\refstepcounter{equation}\refstepcounter会在 内调用, 会被分组。当然,计数器本身是全局步进的,但是 应该对下一个--和--\makelabel可用的变量会在组结束时丢失,因此不会看到 设置的那些值。\label\@currentlabel\@currentcounter\label{item:I}\refstepcounter{equation}

现在,\refstepcounter{equation}在之后调用\item(不知何故)已经太迟了,因为项目的标签已经排版完毕,而在之前调用\item又太早,因为它会被 的内部覆盖\refstepcounter\item唯一可以执行此操作的地方是在\refstepcounter调用的内部\item和之间\makelabel。我看不出enumitem的代码中有什么地方可以做到这一点,除非你破解它。

enumerate不过,作为计数器使用起来很简单,equation因为我们不想重置它,所以我们不能直接使用\usecounter,而只能设置\@listctrequation

\documentclass{article}
\usepackage[leqno]{amsmath}
\counterwithin{equation}{section}

\usepackage{parskip}
\usepackage{enumitem}

\usepackage[colorlinks,allcolors=red]{hyperref}
\usepackage[nameinlink,noabbrev]{cleveref}

\makeatletter
\newcommand{\mysetlistctr}[1]{\def\@listctr{#1}}
\makeatother

\begin{document}
\setcounter{section}{2} % just for this example

A displayed and numbered equation:
\begin{equation}\label{eq:a}
1+1=2
\end{equation}
and a cross-reference to \cref{eq:a}.

An enumerated list that's ``numbered'' the same way as a displayed equation:
\begin{enumerate}[first*=\mysetlistctr{equation}, label=(\theequation), left=0pt]
\item  First enumerated fact.  \label{item:I}
\item  Second enumerated fact.
\end{enumerate}
I want to cross-reference \cref{item:I} the same way as \cref{eq:a}.
\end{document}

在此处输入图片描述

无需篡改\crefalias或类似操作,因为cleveref只会“相信”这是一个正常的equation

当然,这有点不正当,你需要在使用它时表现出一定的自我克制(例如,嵌套结果不会很漂亮,等等)。但是,除此之外,似乎可以以合理的方式完成工作。

相关内容