我在样式文件中定义了一个自定义环境,我正在尝试为其创建一个特定的 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
它对您使用它的地方没有影响,因为您已经在显示数学,而不是普通段落。