使用 newtheorem 的 * 变体时如何解决 cref 引用格式未定义的问题

使用 newtheorem 的 * 变体时如何解决 cref 引用格式未定义的问题

我想知道如何使用 newtheorem* 并在标记定理上使用 cref。cleveref 似乎不能很好地与这个 * 变体配合使用。

示例结果为“标签类型 `` 的 cref 引用格式未定义”:

\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}

\theoremstyle{definition} \newtheorem {hey}{Sandwich}
\theoremstyle{definition} \newtheorem*{hi}{Creek}

\begin{document}
\begin{hey}\label{sand}
aa
\end{hey}

\begin{hi}\label{dirt}
bb
\end{hi}

\cref{sand} % Sandwich 1

\cref{dirt} % warning and results in ??; want: Creek

\end{document}

答案1

由于\newtheorem*没有分配计数器,因此使用\cref将不起作用。如果您只想缩写长名称,请使用宏:

\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}

\theoremstyle{definition}
\newtheorem {hey}{Sandwich}
\newcommand{\CR}{Creek}
\newtheorem*{hi}{\CR}

\begin{document}
\begin{hey}\label{sand}
aa
\end{hey}

\begin{hi}
bb
\end{hi}

\cref{sand} % Sandwich 1

\CR % Creek

\end{document}

在此处输入图片描述

另一方面,您可能有几个命名定理,使用cleveref会有所帮助。

\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}

\theoremstyle{definition}
\newtheorem {hey}{Sandwich}

\newtheoremstyle{named}
  {\topsep}     % ABOVESPACE
  {\topsep}     % BELOWSPACE
  {\normalfont} % BODYFONT
  {0pt}         % INDENT (empty value is the same as 0pt)
  {\bfseries}   % HEADFONT
  {.}           % HEADPUNCT
  {5pt plus 1pt minus 1pt} % HEADSPACE
  {\thmname{#1}} % CUSTOM-HEAD-SPEC
\theoremstyle{named}
\newtheorem{namedinner}{\protect\thenamedinner}
\newenvironment{named}[1]
 {\renewcommand{\thenamedinner}{#1}\namedinner}
 {\endnamedinner}
\crefformat{namedinner}{#2#1#3}

\begin{document}
\begin{hey}\label{sand}
aa
\end{hey}

\begin{named}{Creek}\label{dirt}
bb
\end{named}

\begin{named}{River}\label{rain}
cc
\end{named}

\cref{sand} % Sandwich 1

\cref{dirt} % Creek

\cref{rain} % River

\end{document}

在此处输入图片描述

相关内容