由“cleveref”定义的“\label”命令在“thm-restate”环境中失败

由“cleveref”定义的“\label”命令在“thm-restate”环境中失败

据悉这里,似乎无法将\label(由 定义的版本cleveref)的可选参数与thm-restate包一起使用。知道哪里出了问题吗?

在此处输入图片描述

梅威瑟:

\documentclass{article}
\usepackage{amsthm}
\usepackage{thm-restate}
\newtheorem{lemma}{Lemma}
\usepackage{hyperref}
\usepackage{cleveref}

\begin{document}

\begin{lemma}[Lemma not restated]
  \label[lemma]{lemma:restated}
  Not an issue if not restated.
\end{lemma}

But when restated\dots
\begin{restatable}[Lemma restated]{lemma}{myname}
  \label[lemma]{lemma:myname}
  Hello
\end{restatable}
\dots it gives strange output:
\myname*

\end{document}

答案1

更新

thmtoolsv0.69 2020-07-16包含以下补丁,我现在是它的新维护者。


cleveref这是和之间的兼容性问题thm-restate

  • restatable环境中,特定命令被忽略。\label就是其中之一。
  • 在 LaTeX2e 风格中,\label只接受一个强制参数,因此它会被忽略\let\label\@gobble(在环境定义中thmt@restatable,在thm-restate.sty
  • 但是cleveref包扩展了\label接受两个参数,其中第一个是可选的。
  • 因此restatable现在仅[在使用中忽略,并在输出中\label[lemma]{lemma:restated}保留。lemma]{lemma:restated}

下面的例子展示一个解决方案:

\documentclass{article}
\usepackage{amsthm}
\usepackage{thm-restate}
\newtheorem{lemma}{Lemma}

\usepackage{hyperref}
\usepackage{cleveref}

\usepackage{xpatch}

\makeatletter
\@ifpackageloaded{cleveref}{
  \xpatchcmd\thmt@restatable
    {\let\label=\@gobble}
    {\let\label=\gobbled@cleveref@label}
    {}{\fail}
  
  \newcommand\gobbled@cleveref@label[2][]{}
}{}
\makeatother

\begin{document}

\begin{lemma}[Lemma not restated]
  \label[lemma]{lemma:restated}
  Not an issue if not restated.
\end{lemma}

But when restated\dots
\begin{restatable}[Lemma restated]{lemma}{myname}
  \label[lemma]{lemma:myname}
  Hello
\end{restatable}
\dots it gives strange output:
\myname*

\cref{lemma:myname}
\end{document}

在此处输入图片描述

相关内容