操作系统:Windows 11
TeX 发行版:Tex Live 2025
描述问题:
使用 amsthm
定义和 thm
环境同计数器的 lem
环境,而后用 cleveref
的 \cref
引用,发现在本地 TeX Live 2025 编译后,定理名称全显示 thm
名称。
最小工作示例(MWE)
\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}[thm]{Lemma}
\crefname{lem}{lemma}{lemmas}
\Crefname{lem}{Lemma}{Lemmas}
\begin{document}
\begin{thm}\label{thm}
foo
\end{thm}
\begin{lem}\label{lem}
foo
\end{lem}
\cref{lem}, \Cref{lem}
\end{document}
在 texpage 和 overleaf 上测试上述代码,\cref{lem}
均可显示名称为 lemma
,然而在本地 texlive 2025 上测试上述代码,结果如图所示
上面的代码其实cleverref
会报警告:
LaTeX Warning: Reference `lem' on page 1 undefined on input line 18.
LaTeX Warning: Reference `lem' on page 1 undefined on input line 18.
此事在下面的几个链接里都有记载:
目前来看的最佳实践似乎是:
\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}[thm]{Lemma}
\AddToHook{env/lem/begin}{\crefalias{thm}{lem}}
\crefname{lem}{lemma}{lemmas}
\Crefname{lem}{Lemma}{Lemmas}
\begin{document}
\begin{thm}\label{thm}
foo
\end{thm}
\begin{lem}\label{lem}
foo
\end{lem}
\noindent
\cref{lem}, \Cref{lem}
\end{document}
似乎在firstaid
中已经修了...但我不太懂这个...
最后补充一下「我本地TL2025会出问题」的内核和宏包版本(\listfiles
):
*File List*
article.cls 2025/01/22 v1.4n Standard LaTeX document class
size10.clo 2025/01/22 v1.4n Standard LaTeX file (size option)
amsthm.sty 2020/05/29 v2.20.6
cleveref.sty 2018/03/27 v0.21.4 Intelligent cross-referencing
l3backend-pdftex.def 2025-04-14 L3 backend support: PDF output (pdfTeX)
其实还有一个办法可以解决,但是麻烦一些。
\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}[thm]{Lemma}
\begin{document}
\begin{thm}\label{thm}
foo
\end{thm}
\begin{lem}\label[lem]{lem}
foo
\end{lem}
\cref{lem}, \Cref{lem}
\end{document}
如果换用别的包,可以这样做
\documentclass{article}
\usepackage{amsthm}
\usepackage{zref-clever}
\AddToHook{env/thm/begin}{\zcsetup{countertype={thm = theorem}}}
\AddToHook{env/lem/begin}{\zcsetup{countertype={thm = lemma}}}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}[thm]{Lemma}
\begin{document}
\begin{thm}\label{thm}
foo
\end{thm}
\begin{lem}\label{lem}
foo
\end{lem}
\zcref{lem}
\end{document}
这里的 theorem
和 lamma
都是 zref-clever
支持的已知类型,如果是未知类型,还可以做类似如下的设置
\zcRefTypeSetup{experiment}{
Name-sg= Experiment,
name-sg= experiment,
Name-pl= Expariments,
name-pl= experiments,
Name-sg-ab= Expr.,
name-sg-ab= expr.,
Name-pl-ab= Exprs.,
name-pl-ab= exprs.
}
然后就可以
\AddToHook{env/expr/begin}{\zcsetup{countertype={expr = experiment}}}
\newtheorem{expr}{Experiment}
仅从这个问题来看,zref-clever
仿佛并未打开多少便利,但已经很多人都换成这个包了,我姑且也慢慢适应吧
可以省略了
x-post: https://github.com/CTeX-org/forum/issues/340
可能muzimuzhi会补充更多信息...