![Cleveref 搞乱了定理风格](https://linux22.com/image/321590/Cleveref%20%E6%90%9E%E4%B9%B1%E4%BA%86%E5%AE%9A%E7%90%86%E9%A3%8E%E6%A0%BC.png)
我使用不同的theorem
环境,理论上由于我的代码,它们应该都具有相同的样式。只要我不加载包,它们就会具有相同的样式cleveref
。如果我加载它,只有推论保持不变。我该如何让它cleveref
表现得好(=不干扰样式)?!
\documentclass{amsbook}
\usepackage{amsmath}
\usepackage{cleveref}
\theoremstyle{plain}
\newtheorem{corollary}{Corollary}\numberwithin{corollary}{chapter}
\newtheorem{example}[corollary]{Example}
\newtheorem{lemma}[corollary]{Lemma}
\begin{document}
\begin{corollary}
A corollary.
\end{corollary}
\begin{example}
An example.
\end{example}
\begin{lemma}
A lemma.
\end{lemma}
\end{document}
混乱的版本看起来像这样:
我想要的是所有定理环境看起来都像推论。正如我所说,如果我不加载 cleveref,它们就会像推论一样。
答案1
在我看来,amsbook
该类对定理采取了错误的处理方式:它定义了一个略有不同的结构,amsthm
并伪造了这个正在加载的包,因此将其置于cleveref
危险之中,因为这个包就像amsthm
真的被加载了一样。
我的解决方案是忘记类所做的设置并返回amsthm
,定义一个新的定理样式来模拟amsbook
开始时所做的操作。有点复杂,但它确保与的合作cleveref
。
\documentclass{amsbook}
\usepackage{amsmath}
% nullify amsbook setup about theorems
\expandafter\let\csname [email protected]\endcsname\relax
\let\theoremstyle\relax
\let\newtheoremstyle\relax
\let\pushQED\relax
\let\popQED\relax
\let\qedhere\relax
\let\mathqed\relax
\let\openbox\relax
\let\proof\relax\let\endproof\relax
\usepackage{amsthm}
\usepackage{cleveref}
% make a new setup that emulates `amsbook`
\makeatletter
\renewcommand{\thm@space@setup}{% like amsbook does
\thm@preskip=.5\baselineskip\@plus.2\baselineskip \@minus.2\baselineskip
\thm@postskip=\thm@preskip
}
\newtheoremstyle{amsplain}
{\thm@preskip}
{\thm@postskip}
{\itshape}
{\parindent}
{\scshape}
{.}
{ }
{}
\makeatother
\theoremstyle{amsplain}
\newtheorem{corollary}{Corollary}[chapter]
\newtheorem{example}[corollary]{Example}
\newtheorem{lemma}[corollary]{Lemma}
\begin{document}
Some text before so that it shows indentation
and let's go on until the text breaks across lines
to show also the left margin.
\begin{corollary}
A corollary.
\end{corollary}
\begin{example}
An example.
\end{example}
\begin{lemma}
A lemma.
\end{lemma}
\end{document}
答案2
cleveref
使用计数器和引用做了很多复杂的事情,在之前使用它 \newtheorem{example}
等不会告知cleveref
应该example
使用corollary
计数器等(然后也一样lemma
)
一般规则:cleveref
作为最后一个包加载,即使在之后hyperref
!!!
\documentclass{amsbook}
\usepackage{amsmath}
\theoremstyle{plain}
\newtheorem{corollary}{Corollary}\numberwithin{corollary}{chapter}
\newtheorem{example}[corollary]{Example}
\newtheorem{lemma}[corollary]{Lemma}
\usepackage{cleveref}
\begin{document}
\begin{corollary}
A corollary.
\end{corollary}
\begin{example}
An example.
\end{example}
\begin{lemma}
A lemma.
\end{lemma}
\end{document}