Как использовать умные имена в качестве имен теорем с помощью thmtools

Как использовать умные имена в качестве имен теорем с помощью 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}строку. Та же проблема возникает, если я использую \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}

введите описание изображения здесь

Связанный контент