为什么 \crtcref 会产生这个奇怪的错误?

为什么 \crtcref 会产生这个奇怪的错误?

这个问题不是要解决问题本身,因为我已经有了解决方法,如下面第 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}
  1. <theorem_environment_name> = theorem和时<ref1> = <ref2> = \crtcref{thm:main},整个过程构建良好,并在两个地方(甚至在 PDF 大纲中)产生预期的引用。
  2. <theorem_environment_name> = thm、 和 时<ref1> = <ref2> = \crtcref{thm:main},整个事情就崩溃了。第一次构建尝试不会产生任何错误,但会给出未定义引用警告,不会在任何地方打印引用,也不会生成 PDF 轮廓。第二次构建尝试会在 内部产生一百万个致命错误crossreftools,并且不会输出任何页面。反复构建会产生这种警告和错误的交替模式。
  3. 这就是真正奇怪的地方。当<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}

在此处输入图片描述

相关内容