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