这个问题不是要解决问题本身,因为我已经有了解决方法,如下面第 1 点所示。这更多的是试图理解为什么会发生某个错误。考虑以下非常简单的示例,其中包含几个<...>
要替换的字段,这样我就不必输入许多类似的代码块。
\documentclass{amsart}
\usepackage{hyperref}
\usepackage{cleveref}
\newtheorem{<theorem_environment_name>}{Theorem}[section]
\usepackage{crossreftools}
\begin{document}
\begin{<theorem_environment_name>}\label{thm:main}
text
\end{<theorem_environment_name>}
<ref1>
\section{Proof of <ref2>}
\end{document}
- 当
<theorem_environment_name> = theorem
和时<ref1> = <ref2> = \crtcref{thm:main}
,整个过程构建良好,并在两个地方(甚至在 PDF 大纲中)产生预期的引用。 - 当
<theorem_environment_name> = thm
、 和 时<ref1> = <ref2> = \crtcref{thm:main}
,整个事情就崩溃了。第一次构建尝试不会产生任何错误,但会给出未定义引用警告,不会在任何地方打印引用,也不会生成 PDF 轮廓。第二次构建尝试会在 内部产生一百万个致命错误crossreftools
,并且不会输出任何页面。反复构建会产生这种警告和错误的交替模式。 - 这就是真正奇怪的地方。当
<theorem_environment_name> = thm
、<ref1> = \crtcref{thm:main}
、 但是<ref2>
被删除时,整个东西又可以正常构建,并且有一个预期的引用和一个 PDF 轮廓(显然不包含任何引用)。
作为额外的测试,我还尝试了其他类型的声明。\newtheorem{definition}{Definition}
工作正常,{proposition}{Proposition}
、{lemma}{Lemma}
甚至 也是如此{result}{Result}
。 但是如果我尝试任何类似 的东西{prop}{Proposition}
,它就会像上面一样中断。 它也不像{conjecture}{Conjecture}
。 似乎\crtcref
有一个允许的环境名称列表,但我在任何地方都找不到这样的列表包装文档为了crossreftools
。
有人能解释一下为什么\crtcref
对定理环境的名称如此挑剔吗?但仅限于章节标题内?!
我的构建设置:pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) (preloaded format=pdflatex)
答案1
这个问题相当复杂,与如何cleveref
为引用分配正确的名称有关。
对于\newtheorem{theorem}{Theorem}
,包定义\cref@theorem@name
扩展为theorem
。另一方面,对于\newtheorem{thm}{Theorem}
,相关的控制序列是\cref@thm@name
扩展为\protect\MakeLowercase{T}heorem
,这就是 失败的地方crossreftools
。
可能还需要进行一些进一步的手术,但在您的情况下,以下方法可行:诀窍是\MakeLowercase
在相关部分\ExpandableMakeLowercase
用替换\text_lowercase:n
。
\documentclass{amsart}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{crossreftools}
\usepackage{xpatch}
\ExplSyntaxOn
\cs_new_eq:NN \ExpandableMakeLowercase \text_lowercase:n
\ExplSyntaxOff
\makeatletter
\xpatchcmd{\@othm}{\MakeLowercase}{\ExpandableMakeLowercase}{}{}
\xpatchcmd{\@ynthm}{\MakeLowercase}{\ExpandableMakeLowercase}{}{}
\makeatother
\newtheorem{thm}{Theorem}%[section]
\begin{document}
\begin{thm}\label{thm:main}
text
\end{thm}
\crtcref{thm:main}
\section{Proof of \crtcref{thm:main}}
\end{document}