![错误地交叉引用带有定制标签的枚举列表中的项目](https://linux22.com/image/475679/%E9%94%99%E8%AF%AF%E5%9C%B0%E4%BA%A4%E5%8F%89%E5%BC%95%E7%94%A8%E5%B8%A6%E6%9C%89%E5%AE%9A%E5%88%B6%E6%A0%87%E7%AD%BE%E7%9A%84%E6%9E%9A%E4%B8%BE%E5%88%97%E8%A1%A8%E4%B8%AD%E7%9A%84%E9%A1%B9%E7%9B%AE.png)
这篇文章的灵感来自于最近查询提出了一个相关但不完全相同的问题。
假设有人希望将枚举列表的标签显示为方程式编号(方程式编号放在左侧)。实际上,列表项应该共享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
为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
。
当然,这有点不正当,你需要在使用它时表现出一定的自我克制(例如,嵌套结果不会很漂亮,等等)。但是,除此之外,似乎可以以合理的方式完成工作。