falscher Querverweis auf ein Element in einer Aufzählungsliste mit maßgeschneiderten Beschriftungen

falscher Querverweis auf ein Element in einer Aufzählungsliste mit maßgeschneiderten Beschriftungen

Dieser Beitrag ist inspiriert von einemLetzte Abfragedas eine verwandte, aber nicht identische Frage stellte.

Angenommen, man möchte die Beschriftungen einer nummerierten Liste so anzeigen, als wären sie Gleichungsnummern (wobei die Gleichungsnummern auf der linken Seite stehen). Tatsächlich sollen die Listenelemente den equationZähler gemeinsam nutzen. Das folgende MWE erreicht dies mithilfe desAufzählungselementPaket.

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

Bildbeschreibung hier eingeben

Das Problem ist: Die aufgezählten Elemente sind zwar korrekt „nummeriert“ (beschriftet?), aber die Querverweise sind nicht korrekt. Übrigens ist das kein cleverefProblem – das gleiche Problem tritt bei \refund auf \eqref.

Frage: Was übersehe ich? Beachten Sie, dass es wichtig ist, dass ich das enumitemPaket verwende.

Antwort1

Ich würde eine spezielle Umgebung definieren.

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

Bildbeschreibung hier eingeben

Antwort2

Wenn Sie dies tun format=\refstepcounter{equation}, \refstepcounterwird innerhalb aufgerufen \makelabel, das gruppiert ist. Der Zähler selbst wird natürlich global schrittweise ausgeführt, aber die Variablen, die für das nächste \label-- \@currentlabelund \@currentcounter-- verfügbar sein sollen, gehen verloren, wenn die Gruppe endet, daher \label{item:I}werden diese Werte nicht als von festgelegt angezeigt \refstepcounter{equation}.

Nun ist ein Aufruf \refstepcounter{equation}nach \item(irgendwie) zu spät, da die Beschriftung des Elements bereits gesetzt ist, und ein Aufruf vor \itemist zu früh, da es durch den internen \refstepcounterWert von überschrieben wird \item. Die einzige Stelle, an der Sie dies tun könnten, ist irgendwo zwischen dem internen Wert, \refstepcounterder von aufgerufen wird \item, und \makelabel. Ich sehe im Code von überhaupt keine Stelle, enumiteman der dies getan werden könnte, außer Sie hacken sich durch.

Es ist jedoch einfach genug, es als Zähler zu enumerateverwenden equation. Da wir es nicht zurücksetzen möchten, können wir es nicht direkt verwenden \usecounter, sondern stattdessen nur auf \@listctrsetzen 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}

Bildbeschreibung hier eingeben

Es besteht keine Notwendigkeit, Änderungen vorzunehmen \crefaliasoder Ähnliches vorzunehmen, da cleverefwir einfach „glauben“, dass es sich um einen normalen handelt equation.

Natürlich ist das ein wenig hinterhältig und Sie müssen bei der Verwendung etwas Zurückhaltung üben (z. B. wird die Verschachtelung nicht schön, usw.). Aber ansonsten scheint es die Aufgabe auf vernünftige Weise zu erledigen.

verwandte Informationen