cleveref 在哪里构建它的标签?

cleveref 在哪里构建它的标签?

我正在尝试调整对嵌套枚举的引用的呈现。这是我的 MWE:

\documentclass[a4paper,14pt,openany]{memoir}

\usepackage{cleveref}

\renewcommand{\theenumi}{\arabic{enumi}}
\renewcommand{\theenumii}{\arabic{enumii}}
\renewcommand{\theenumiii}{\arabic{enumiii}}

\renewcommand{\labelenumi}{\arabic{enumi}}
\renewcommand{\labelenumii}{\arabic{enumii}}
\renewcommand{\labelenumiii}{\arabic{enumiii}}

\crefformat{enumi}{#2#1#3}
\crefformat{enumii}{#2#1#3}
\crefformat{enumiii}{#2#1#3}

\labelcrefformat{enumi}{#2#1#3}
\labelcrefformat{enumii}{#2#1#3}
\labelcrefformat{enumiii}{#2#1#3}

\begin{document}

\begin{enumerate}
 \item\label{first} First level
 \begin{enumerate}
  \item\label{second} Second level
  \begin{enumerate}
   \item\label{third} Third level
  \end{enumerate}  
 \end{enumerate}
\end{enumerate}

First level ref: \cref{first}.

% Expected result: 1
Second level ref: \cref{second}.

% Expected result: 1
Third level ref: \cref{third}.

\end{document}

正如你所看到的,我尽了一切努力,但仍然无法到达cleveref“烹饪”标签的地方:

结果

答案1

您描述的问题是不是与包装有关。如果您使用而不是 ,cleveref这种情况会发生。能够“到达‘烹饪’标签的任何地方”在这里绝对没有用。\ref\crefcleveref

那么,发生了什么?对于mycounter通过\newcounter指令定义的每个计数器变量(例如),LaTeX 都会自动创建一个关联的宏(称为\p@mycounter),用于在创建指向该计数器的交叉引用时创建“前缀”;满的\p@mycounter交叉引用号是和宏的输出的组合\themycounter

这些前缀宏到底应该做什么,是文档类设计者的选择;默认情况下,这些前缀宏通常不执行任何操作。但是,前缀宏\p@enumii\p@enumiii(以及\p@enumiv)是不是空的当使用memoir文档类时:它们分别执行\theenumi\theenumi(\theenumii)。这就是您(重新)发现的。

如果您想重置这两个前缀宏以使它们“不执行任何操作”,您应该在序言中提供以下代码:

\makeatletter
\renewcommand\p@enumii{}
\renewcommand\p@enumiii{}
\makeatother

(该\makeatletter指令将字符的类别代码更改为“字母”;如果没有它,则无法通过 修改@名称包含一个或多个字符的宏。该指令恢复默认类别代码,@\renewcommand\makeatother@, “其他”。)

相关内容