referência cruzada incorreta a um item em uma lista enumerada com rótulos personalizados

referência cruzada incorreta a um item em uma lista enumerada com rótulos personalizados

Esta postagem é inspirada em umconsulta recenteque fez uma pergunta relacionada, mas não idêntica.

Suponha que se deseje exibir os rótulos de uma lista enumerada como se fossem números de equações (com os números das equações colocados à esquerda). Na verdade, os itens da lista devem compartilhar o equationcontador. O seguinte MWE consegue isso com a ajuda doenumitempacote.

\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}

insira a descrição da imagem aqui

O problema é: os itens enumerados são "numerados" (rotulados?) corretamente, mas não são referenciados corretamente. Aliás, isso não é um cleverefproblema - o mesmo problema surge com \refe \eqref.

Pergunta: O que estou perdendo? Observe que é importante que eu use o enumitempacote.

Responder1

Eu definiria um 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}

insira a descrição da imagem aqui

Responder2

Quando você faz o format=\refstepcounter{equation}, \refstepcounteré chamado dentro do \makelabel, que fica agrupado. O contador em si é, obviamente, escalonado globalmente, mas as variáveis ​​que deveriam estar disponíveis para o próximo \label- \@currentlabele \@currentcounter- são perdidas quando o grupo termina, portanto, \label{item:I}não vê esses valores como definidos por \refstepcounter{equation}.

Agora, chamar \refstepcounter{equation}depois \item(de alguma forma) é tarde demais, porque o rótulo do item já está escrito e chamá-lo antes \itemé muito cedo porque será substituído pelo interno \refstepcounterde \item. O único lugar onde você pode fazer isso é em algum lugar entre o internal \refstepcounterchamado por \iteme \makelabel. Não vejo nenhum lugar no enumitemcódigo onde isso possa ser feito, exceto hackear seu caminho.

Mas é bastante simples de enumerateusar equationcomo contador. Como não queremos redefini-lo, não podemos usá-lo diretamente \usecounter, mas podemos apenas configurá-lo \@listctrpara ser 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}

insira a descrição da imagem aqui

Não há necessidade de adulterar \crefalias, ou similar, pois cleverefapenas "acreditará" que isso é normal equation.

Claro, isso é um pouco tortuoso e você precisa exercer algum autocontrole ao usá-lo (por exemplo, o aninhamento não ficará bonito, etc.). Mas, por outro lado, parece fazer o trabalho de maneira razoável.

informação relacionada