неверная перекрестная ссылка на элемент в нумерованном списке с индивидуальными метками

неверная перекрестная ссылка на элемент в нумерованном списке с индивидуальными метками

Эта публикация вдохновленанедавний запроскоторый задал связанный, но не идентичный вопрос.

Предположим, что кто-то хочет отобразить метки нумерованного списка, как если бы они были номерами уравнений (с номерами уравнений, размещенными слева). Фактически, элементы списка должны разделять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, чтобы быть 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.

Конечно, это немного хитро, и вам нужно проявить некоторую сдержанность при его использовании (например, вложение не получится красивым и т. д.). Но, в остальном, кажется, что работа выполняется разумным образом.

Связанный контент