
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 equation
contador. 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}
O problema é: os itens enumerados são "numerados" (rotulados?) corretamente, mas não são referenciados corretamente. Aliás, isso não é um cleveref
problema - o mesmo problema surge com \ref
e \eqref
.
Pergunta: O que estou perdendo? Observe que é importante que eu use o enumitem
pacote.
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}
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
- \@currentlabel
e \@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 \refstepcounter
de \item
. O único lugar onde você pode fazer isso é em algum lugar entre o internal \refstepcounter
chamado por \item
e \makelabel
. Não vejo nenhum lugar no enumitem
código onde isso possa ser feito, exceto hackear seu caminho.
Mas é bastante simples de enumerate
usar equation
como contador. Como não queremos redefini-lo, não podemos usá-lo diretamente \usecounter
, mas podemos apenas configurá-lo \@listctr
para 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}
Não há necessidade de adulterar \crefalias
, ou similar, pois cleveref
apenas "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.