Cleverref 引用在自定义环境中不起作用

Cleverref 引用在自定义环境中不起作用

我在样式文件中定义了一个自定义环境,我正在尝试为其创建一个特定的 cref 计数器。这是我的环境和代码mystyle.sty

\newcounter{exampleCtr}
\setcounter{exampleCtr}{0}

\newenvironment{LogicProgram}{%
    \refstepcounter{exampleCtr}%
    \start@align\tw@\st@rredtrue\m@ne
    \noindent\textbf{Example~\theexampleCtr}
    \hskip\parindent    
}{%
    \endalign   
}
\crefname{exampleCtr}{Example}{Examples}
\Crefname{exampleCtr}{Examples}{Examples}

当我尝试创建一个逻辑程序并用 cref 引用它时,我只得到“??”(问号),我想这意味着 cref 不知道我想要引用什么。

\begin{LogicProgram}
\label{ex:logic}
& \bot \leftarrow \neg F & : w
\end{LogicProgram}

我尝试用创建一个引用\cref{ex:logic},但没有任何效果。它\Cref在我的文档/工作中的其他点上运行良好,但我无法弄清楚为什么它无法在我的logicprogram环境中找到引用。

我努力了将 cleveref 与 newenvironment 结合使用但这不适用于我的样式文件中的环境。我做错了什么/如何让它工作?

答案1

amsmath对其环境中的标签进行各种技巧。您需要恢复存储在中的标准定义\ltx@label,并且这里的语法有点不标准(如果您尝试一个简单的,您会发现\let):

示例输出

\documentclass{article}

\usepackage{amsmath,cleveref}

\newcounter{exampleCtr}
\setcounter{exampleCtr}{0}

\makeatletter
\newenvironment{LogicProgram}{%
    \refstepcounter{exampleCtr}%
    \start@align\tw@\st@rredtrue\m@ne
    \renewcommand{\label}[1]{\ltx@label{{##1}}}
    \textbf{Example~\theexampleCtr}
    \hskip\parindent
}{%
  \endalign
}
\makeatother

\crefname{exampleCtr}{Example}{Examples}
\Crefname{exampleCtr}{Example}{Examples}

\begin{document}

\begin{LogicProgram}
\label{ex:logic}
& \bot \leftarrow \neg F & : w
\end{LogicProgram}

\Cref{ex:logic}

\end{document}

请注意,您需要\makeatletter...\makeatother在代码周围包含该对,并且\noindent它对您使用它的地方没有影响,因为您已经在显示数学,而不是普通段落。

相关内容