Я пытаюсь настроить несколько сред, подобных теоремам, с помощью 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: Я не просто пишу «Теорема» в качестве названия теоремы, потому что я пишу файл класса и хочу сохранить совместимость с несколькими языками.
решение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}