referencia cruzada incorrecta a un elemento en una lista enumerada con etiquetas personalizadas

referencia cruzada incorrecta a un elemento en una lista enumerada con etiquetas personalizadas

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 equationcontador. 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}

ingrese la descripción de la imagen aquí

El problema es que los elementos enumerados están "numerados" (¿etiquetados?) correctamente, pero no tienen referencias cruzadas correctamente. Por cierto, esto no es un cleverefproblema: surge el mismo problema con \refy \eqref.

Pregunta: ¿Qué me estoy perdiendo? Tenga en cuenta que es importante que utilice el enumitempaquete.

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}

ingrese la descripción de la imagen aquí

Respuesta2

Cuando lo hace format=\refstepcounter{equation}, \refstepcounterse 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( \@currentlabely \@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 \itemes demasiado pronto porque será sobrescrito por el interno \refstepcounterde \item. El único lugar donde podría hacer esto es en algún lugar entre el \refstepcounterllamado interno por \itemy \makelabel. No veo ningún lugar en enumitemel código de 's donde se pueda hacer esto, salvo hackearlo.

Pero es lo suficientemente simple como para enumerateusarlo equationcomo mostrador. Como no queremos restablecerlo, no podemos usarlo directamente \usecounter, solo podemos configurarlo \@listctrpara que sea equationen 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}

ingrese la descripción de la imagen aquí

No hay necesidad de manipular \crefalias, o similar, ya que cleverefsimplemente "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.

información relacionada