我正在尝试使用 设置一些类似定理的环境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}
也会出现同样的问题。\declaretheorem
thmtools
这里发生了什么事?
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}