
這篇文章的靈感來自最近查詢這提出了一個相關但不相同的問題。
假設人們希望將枚舉清單的標籤顯示為方程式編號(方程式編號位於左側)。事實上,列表項應該共享計數器equation
。以下 MWE 在以下功能的幫助下完成了這項任務列舉項包裹。
\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}
問題是:枚舉的項目被正確地「編號」(標記?),但它們沒有正確地交叉引用。順便說一句,這不是問題 -和cleveref
也會出現同樣的問題。\ref
\eqref
問題:我缺少什麼?請注意,使用該enumitem
包很重要。
答案1
我會定義一個特殊的環境。
\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}
答案2
當你這樣做時format=\refstepcounter{equation}
,\refstepcounter
被稱為「內部」\makelabel
,它被分組。當然,計數器本身是全域步進的,但是當組結束時,應該可供下一個使用的變數\label
-\@currentlabel
和- 會遺失,因此不會看到由 設定的那些值。\@currentcounter
\label{item:I}
\refstepcounter{equation}
現在,在(以某種方式)\refstepcounter{equation}
之後調用\item
已經太晚了,因為該項目的標籤已經排版,而在之前調用它又太早了,\item
因為它將被\refstepcounter
. \item
唯一可以執行此操作的地方是在\refstepcounter
由\item
和調用的內部之間的某個位置\makelabel
。我認為在 的程式碼中沒有任何地方enumitem
可以完成此操作,除非破解您的方法。
但是,它很簡單,可以用作enumerate
計數器equation
。由於我們不想重置它,所以不能直接使用\usecounter
,而只能設定\@listctr
為 be 來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}
無需篡改\crefalias
或類似的操作,因為cleveref
只會「相信」這是正常的equation
。
當然,這有點迂迴,使用時需要有一些自我約束(例如嵌套不會很漂亮等)。但是,除此之外,似乎以合理的方式完成了工作。