据悉这里,似乎无法将\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
更新
thmtools
v0.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}