使用该enumitem
包,我尝试交叉引用列表中的项目enumerate
。
当我使用
\ref
交叉引用某项时,无论我是enumerate
直接在源正文中创建列表,还是在序言中使用\newlist
/环境定义,我都会得到相同的令人满意的结果。但是为什么当我使用而不是\setlist
时,在这两种情况下我得到的结果不一样呢?\cref
\ref
为什么
\cref
在任何一种情况下结果都不起作用?
此示例展示了\ref
、、\cref
前导定义的枚举和直接定义的枚举的所有 4 种组合,仅使用了*
命令的版本;但使用无星号版本也会出现类似的结果。
情况 —\newlist
\setlist
有\ref*
:
\documentclass[12pt]{memoir}
\usepackage{enumitem}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\newlist{romcases}{enumerate}{3}
\setlist[romcases,1]{%
label=\sffamily{Case (\roman*):},
ref=\normalfont{Case (\roman*)},
wide,itemsep=0pt,topsep=0pt
}
\crefname{romcases}{Case}{Case}
\Crefname{romcases}{Case}{Case}
\begin{document}
We distinguish two cases.
\begin{romcases}
\item \label{case:abequal}
$a = b$. Now we see that\dots
\item\label{case:abnotequal}
$a \neq b$. In contrast to \ref*{case:abequal}, in this case \dots
\end{romcases}
\bigskip
\textbf{\emph{NOTE:} Output as expected.}
\end{document}
情况 — 直接\enumerate
与\ref*
:
\documentclass[12pt]{memoir}
\usepackage{enumitem}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\begin{document}
We distinguish two cases.
\begin{enumerate}[%
label=\textsf{Case (\alph*):},ref=\normalfont{Case (\roman*)},
wide,itemsep=0pt,topsep=0pt]
\item \label{case:abequal}
$a = b$.
Now we see that\dots
\item\label{case:abnotequal}
$a \neq b$.
In contrast to \ref*{case:abequal}, in this case \dots
\end{enumerate}
\bigskip
\textbf{\emph{NOTE:} Output \emph{OK}.}
\end{document}
情况 —\newlist
\setlist
有\cref*
:
\documentclass[12pt]{memoir}
\usepackage{enumitem
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\newlist{romcases}{enumerate}{3}
\setlist[romcases,1]{%
label=\sffamily{Case (\roman*):},
ref=\normalfont{Case (\roman*)},
wide,itemsep=0pt,topsep=0pt
}
\crefname{romcases}{Case}{Case}
\Crefname{romcases}{Case}{Case}
\begin{document}
We distinguish two cases.
\begin{romcases}
\item \label{case:abequal}
$a = b$. Now we see that\dots
\item\label{case:abnotequal}
$a \neq b$. In contrast to \cref*{case:abequal}, in this case \dots
\end{romcases}
\bigskip
\textbf{\emph{NOTE:} Output \emph{NOT} as expected.}
\end{document}
情况 — 直接\enumerate
与\cref*
:
\documentclass[12pt]{memoir}
\usepackage{enumitem}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\begin{document}
We distinguish two cases.
\begin{enumerate}[%
label=\textsf{Case (\alph*):},ref=\normalfont{Case (\roman*)},
wide,itemsep=0pt,topsep=0pt]
\item \label{case:abequal}
$a = b$. Now we see that\dots
\item\label{case:abnotequal}
$a \neq b$. In contrast to \cref*{case:abequal}, in this case \dots
\end{enumerate}
\bigskip
\textbf{\emph{NOTE:} Output \emph{NOT} as expected.}
\end{document}
答案1
romcases
当您通过指令调用定义新的枚举列表环境时\newlist
,与 1 级项关联的计数器称为romcasesi
。类似地,与 2 级 romcases 项关联的计数器称为romcasesii
,等等。
如果您要使用cleveref
包的宏来创建“巧妙”的交叉引用,我建议您只ref=\roman*
在参数中指定\setlist[romcases,1]
;注意:没有字符串标签“Case”,也没有括号。然后,使用\creflabelformat
、\crefname
和\Crefname
指令来指定和朋友应该如何格式化和排版交叉引用。这种方法将为您提供最大的灵活性——当您开始在单个语句中包含多个对象并希望自动处理参数排序\cref
时,这将派上用场。\cref
cleveref
\documentclass[12pt]{memoir}
\usepackage{enumitem}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\newlist{romcases}{enumerate}{1}
\setlist[romcases,1]{
label={\sffamily Case (\roman*):},
ref=\roman*, % if to be used with \cref, don't provide label string or parentheses
wide,itemsep=0pt,topsep=0pt}
\creflabelformat{romcasesi}{#2\textup{(#1)}#3} % note presence of parentheses
\crefname{romcasesi}{Case}{Cases} % singular and plural forms of text labels
\Crefname{romcasesi}{Case}{Cases}
\begin{document}
We distinguish two cases:
\begin{romcases}
\item \label{case:abequal} $a = b$. Now we see that\dots
\item\label{case:abnotequal} $a \neq b$. In contrast to \cref{case:abequal}, \dots
\end{romcases}
\end{document}