
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 equation
Zä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}
Das Problem ist: Die aufgezählten Elemente sind zwar korrekt „nummeriert“ (beschriftet?), aber die Querverweise sind nicht korrekt. Übrigens ist das kein cleveref
Problem – das gleiche Problem tritt bei \ref
und auf \eqref
.
Frage: Was übersehe ich? Beachten Sie, dass es wichtig ist, dass ich das enumitem
Paket 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}
Antwort2
Wenn Sie dies tun format=\refstepcounter{equation}
, \refstepcounter
wird 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
-- \@currentlabel
und \@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 \item
ist zu früh, da es durch den internen \refstepcounter
Wert von überschrieben wird \item
. Die einzige Stelle, an der Sie dies tun könnten, ist irgendwo zwischen dem internen Wert, \refstepcounter
der von aufgerufen wird \item
, und \makelabel
. Ich sehe im Code von überhaupt keine Stelle, enumitem
an der dies getan werden könnte, außer Sie hacken sich durch.
Es ist jedoch einfach genug, es als Zähler zu enumerate
verwenden equation
. Da wir es nicht zurücksetzen möchten, können wir es nicht direkt verwenden \usecounter
, sondern stattdessen nur auf \@listctr
setzen 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}
Es besteht keine Notwendigkeit, Änderungen vorzunehmen \crefalias
oder Ähnliches vorzunehmen, da cleveref
wir 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.