
Esta publicación está inspirada en unconsulta recienteque planteaba una pregunta relacionada, pero no idéntica.
Supongamos que uno desea mostrar las etiquetas de una lista enumerada como si fueran números de ecuación (con los números de ecuación colocados a la izquierda). De hecho, se supone que los elementos de la lista comparten el equation
contador. El siguiente MWE logra esto con la ayuda delenumitempaquete.
\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}
El problema es que los elementos enumerados están "numerados" (¿etiquetados?) correctamente, pero no tienen referencias cruzadas correctamente. Por cierto, esto no es un cleveref
problema: surge el mismo problema con \ref
y \eqref
.
Pregunta: ¿Qué me estoy perdiendo? Tenga en cuenta que es importante que utilice el enumitem
paquete.
Respuesta1
Yo definiría un ambiente especial.
\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}
Respuesta2
Cuando lo hace format=\refstepcounter{equation}
, \refstepcounter
se llama dentro \makelabel
, que se agrupa. El contador en sí, por supuesto, se actualiza globalmente, pero las variables que se supone que están disponibles para el siguiente \label
( \@currentlabel
y \@currentcounter
) se pierden cuando finaliza el grupo, por lo que \label{item:I}
no ve esos valores establecidos por \refstepcounter{equation}
.
Ahora, llamar \refstepcounter{equation}
después \item
(de alguna manera) es demasiado tarde, porque la etiqueta del elemento ya está escrita y llamarlo antes \item
es demasiado pronto porque será sobrescrito por el interno \refstepcounter
de \item
. El único lugar donde podría hacer esto es en algún lugar entre el \refstepcounter
llamado interno por \item
y \makelabel
. No veo ningún lugar en enumitem
el código de 's donde se pueda hacer esto, salvo hackearlo.
Pero es lo suficientemente simple como para enumerate
usarlo equation
como mostrador. Como no queremos restablecerlo, no podemos usarlo directamente \usecounter
, solo podemos configurarlo \@listctr
para que sea equation
en su lugar.
\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}
No hay necesidad de manipular \crefalias
, o similar, ya que cleveref
simplemente "creerá" que esto es normal equation
.
Por supuesto, esto es un poco tortuoso y es necesario ejercer cierta moderación al usarlo (por ejemplo, el anidamiento no resultará bonito, etc.). Pero, por lo demás, parece hacer el trabajo de forma razonable.