我正在使用的\cleveref
软件包的\crefrange
功能在环境中不起作用assumption
。有人能告诉我如何解决这个问题吗?
代码如下:
\documentclass[12pt]{article}
\usepackage{amssymb,amsmath,latexsym,amsthm,amsfonts,mathtools}
\usepackage{hyperref}
\hypersetup{colorlinks, breaklinks, citecolor=cyan, linkcolor=cyan, urlcolor=cyan}
\usepackage[nameinlink,noabbrev,sort&compress]{cleveref}
\theoremstyle{plain}% Theorem-like structures provided by amsthm.sty
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}{Lemma}
\newtheorem{corollary}{Corollary}
\newtheorem{proposition}{Proposition}
\newtheorem{assumption}{Assumption}
\theoremstyle{remark}
\newtheorem{remark}{Remark}
\newtheorem{notation}{Notation}
\theoremstyle{definition}
\newtheorem{definition}{Definition}
\newtheorem{example}{Example}
\newtheorem{problem}{Problem}
\begin{document}
\begin{theorem}\label{thm:T1}
Some theorem
\end{theorem}
\begin{theorem}\label{thm:T2}
Some other theorem
\end{theorem}
\crefrange{thm:T1}{thm:T2}
\begin{assumption}\label{asm:A1}
First Assumption
\end{assumption}
\cref{asm:A1}
\begin{assumption}\label{asm:A2}
Second Assumption
\end{assumption}
\Cref{asm:A2}
\crefrange{asm:A1}{asm:A2}
\end{document}
答案1
你提出的问题与\crefrange
本身,也与包无关amsmath
。相反,它之所以出现是因为cleveref
包默认没有被告知如何创建复数形式名词“假设”的复数形式。因此,诸如 之类的宏(这些宏\crefrange
被设计为使用名词的复数形式)无法正确执行其工作。
amsmath
请考虑以下简化版的代码。[附言:请注意,如果已加载,则无需显式加载mathtools
;同样,如果已加载,则无需amsfonts
显式加载amssymb
。另外,如果已加载,则没有理由加载古老的latexsym
包amssymb
。] 观察发现\cref{asm:A1,asm:A2}
和都\crefrange{asm:A1}{asm:A2}
无法生成正确的交叉引用调用。
\documentclass[12pt]{article}
\usepackage{amssymb,amsthm,mathtools}
\usepackage[colorlinks,allcolors=cyan]{hyperref}
\usepackage[nameinlink,noabbrev]{cleveref}
\newtheorem{assumption}{Assumption}
%% Uncomment to get correct cross-referencing call-outs:
%\crefname{assumption}{assumption}{assumptions}
\begin{document}
\begin{assumption}\label{asm:A1}First\end{assumption}
\begin{assumption}\label{asm:A2}Second\end{assumption}
\Cref{asm:A1,asm:A2}
\Crefrange{asm:A1}{asm:A2}
\end{document}
怎么办?只需添加说明
\crefname{assumption}{assumption}{assumptions}
在序言中(cleveref
自然是在加载之后),一切都会好起来的。
附录:您可能有两个后续问题。首先,cleveref
默认情况下,哪些计数器标签是被识别的,无论是单数形式还是复数形式?其次,如何在没有适当指令帮助的情况下,正确cleveref
生成对环境的单数形式交叉引用 assumption
(请注意,是\cref{asm:A1}
输出assumption 1
,而不仅仅是输出)?? 1
?即使它不能正确处理复数形式实例\crefname
?
关于第一个问题:截至 2019 年 9 月,cleveref.sty
如果软件包选项capitalize
为不是设置并且如果语言选项english
(默认)生效:
\crefname@preamble{page}{page}{pages}%
\crefname@preamble{table}{table}{tables}%
\crefname@preamble{part}{part}{parts}%
\crefname@preamble{chapter}{chapter}{chapters}%
\crefname@preamble{section}{section}{sections}%
\crefname@preamble{appendix}{appendix}{appendices}%
\crefname@preamble{enumi}{item}{items}%
\crefname@preamble{footnote}{footnote}{footnotes}%
\crefname@preamble{theorem}{theorem}{theorems}%
\crefname@preamble{lemma}{lemma}{lemmas}%
\crefname@preamble{corollary}{corollary}{corollaries}%
\crefname@preamble{proposition}{proposition}{propositions}%
\crefname@preamble{definition}{definition}{definitions}%
\crefname@preamble{result}{result}{results}%
\crefname@preamble{example}{example}{examples}%
\crefname@preamble{remark}{remark}{remarks}%
\crefname@preamble{note}{note}{notes}%
\crefname@preamble{algorithm}{algorithm}{algorithms}%
\crefname@preamble{listing}{listing}{listings}%
\crefname@preamble{line}{line}{lines}%
(如果设置了包选项,则会运行一组非常相似的指令capitalize
。默认语言选项为。english
如果启用了合适的替代语言相关选项,则会创建名称标签的非英语形式。截至 2019 年 9 月,可用的语言选项按字母顺序排列,,,,,,[ ! brazilian
] ,,和,,,,,,,和。)请注意,单数形式和复数形式标签是为以下 9 个类定理环境预定义的:,,,,,,,,,,和。相反,观察到catalan
danish
dutch
esperanto
french
german
ngerman
italian
norsk
russian
spanish
swedish
ukrainian
theorem
lemma
corollary
proposition
definition
result
example
remark
note
assumption
不是在这 9 个环境中。这就是为什么有必要\crefname{assumption}{assumption}{assumptions}
在文档的序言中提供说明的原因。在此过程中,如果您需要创建对这些环境的复数形式的交叉引用,您可能还希望为和环境运行适当的\crefname
说明。notation
problem
第二个问题:为什么它“有效”,即使我们刚刚确认,对于名为 的环境,\cref{asm:A1}
没有定义名称标签?好吧,只要定理类环境(例如)通过语句定义cleveref
assumption
assumption
\newtheorem
后和都已加载(顺便说一下, 强烈鼓励这种排序),amsthm
它cleveref
足够聪明(双关语)来解析指令cleveref
cleveref
\newtheorem{assumption}{Assumption}
并将单词“Assumption”视为与环境相关的单数形式标签assumption
。在我看来,这非常巧妙!