如何使用 cleveref 名称作为 thmtools 中的定理名称

如何使用 cleveref 名称作为 thmtools 中的定理名称

我正在尝试使用 设置一些类似定理的环境thmtools,使其能够正常工作,cleverer同时尝试与不同的语言保持兼容。

如果我加载cleveref后,thmtools它似乎可以很好地处理来自\cref命令的翻译交叉引用。似乎babel和的组合cleveref已经知道如何将“定理”、“引理”和“定义”翻译成我的语言(谁提供翻译以及如何提供翻译?)。

然而,环境问题却并非如此名称,所以我必须以某种方式为 选项提供一个翻译的字符串name=\declaretheorem我在手册中发现cleveref有一些宏提供了包使用的名称,例如\cref@theorem@name,我正在尝试使用它们。当我使用 时,一切都运行良好amsthm,但如果我加载,thmtools我会收到一条莫名其妙的错误消息。

下面这个最小的例子应该能说明这个问题:

\documentclass[italian]{article}

\usepackage{amsthm}
\usepackage{thmtools} % Comment this line and it works
\usepackage[capitalise]{cleveref}
\usepackage{babel}

\makeatletter
\newtheorem{theorem}{\cref@theorem@name}
\makeatother

\begin{document}

\begin{theorem}
Let ABC be a triangle. If it hits your head it will hurt\ldots
\end{theorem}

\end{document}

编译上面的代码我得到错误:

./mwe.tex:10: Undefined control sequence. [\makeatother]

注意,在上面的代码中,我\newtheorem仅使用 来使示例工作,如果您注释了该行。如果我使用(当然,没有 则不可用),\usepackage{thmtools}也会出现同样的问题。\declaretheoremthmtools

这里发生了什么事?

PS:我没有仅仅将“Teorema”写为定理名称,因为我正在编写一个类文件,并且我想与多种语言保持兼容。

答案1

是鸡还是蛋?;-)

\cref@theorem@name\newtheorem发出时尚未定义。解决方案:使用\noexpand

\documentclass[italian]{article}
\usepackage[T1]{fontenc}

\usepackage{amsthm}
\usepackage{thmtools} % Comment this line and it works
\usepackage[capitalise]{cleveref}
\usepackage{babel}

\makeatletter
\newtheorem{theorem}{\noexpand\cref@theorem@name}
\makeatother

\begin{document}

\begin{theorem}\label{test}
Let ABC be a triangle. If it hits your head it will hurt\ldots
\end{theorem}

\cref{test}

\end{document}

在此处输入图片描述

如果要使其兼容,则必须在符号名称前面\declaretheorem添加几个“”。\noexpand

这是一个不太麻烦的方法:

\documentclass[italian]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}

\usepackage{amsthm}
\usepackage{thmtools} % Comment this line and it works
\usepackage[capitalise]{cleveref}

\newcommand{\dtname}[1]{%
  \expandafter\noexpand
  \expandafter\noexpand
  \expandafter\noexpand
  \csname cref@#1@name\endcsname
}
\newcommand{\ntname}[1]{%
  \expandafter\noexpand
  \csname cref@#1@name\endcsname
}

\newtheorem{theorem}{\ntname{theorem}}

\declaretheorem[name=\dtname{lemma}]{lemma}

\begin{document}

\begin{lemma}\label{tl}
$0\ne 1$
\end{lemma}

\begin{theorem}\label{test}
Sia $ABC$ un triangolo. Se ti piglia in testa ti farà male.
\end{theorem}

Il \cref{test} e il \cref{tl} sono importanti.

\end{document}

在此处输入图片描述

相关内容