對帶有定制標籤的枚舉清單中的項目的錯誤交叉引用

對帶有定制標籤的枚舉清單中的項目的錯誤交叉引用

這篇文章的靈感來自最近查詢這提出了一個相關但不相同的問題。

假設人們希望將枚舉清單的標籤顯示為方程式編號(方程式編號位於左側)。事實上,列表項應該共享計數器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,而只能設定\@listctr為 be 來equation代替。

\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

當然,這有點迂迴,使用時需要有一些自我約束(例如嵌套不會很漂亮等)。但是,除此之外,似乎以合理的方式完成了工作。

相關內容