Ich versuche, mit einige theoremähnliche Umgebungen einzurichten thmtools
, damit es funktioniert und cleverer
gleichzeitig die Kompatibilität mit verschiedenen Sprachen gewahrt bleibt.
cleveref
Wenn ich danach lade, thmtools
scheint es mit übersetzten Querverweisen, die aus dem \cref
Befehl kommen, sehr gut zu funktionieren. Es scheint, dass eine Kombination aus babel
und cleveref
bereits weiß, wie „Theorem“, „Lemma“ und „Definition“ in meine Sprache übersetzt werden (wer stellt die Übersetzung bereit und wie?).
Dasselbe gilt jedoch nicht für die UmweltNamen, also muss ich der name=
Option von irgendwie eine übersetzte Zeichenfolge bereitstellen \declaretheorem
. Ich habe im cleveref
Handbuch gefunden, dass es einige Makros gibt, die die vom Paket verwendeten Namen bereitstellen, z. B. \cref@theorem@name
, und ich versuche, sie zu verwenden. Als ich verwendet habe, hat alles gut funktioniert amsthm
, aber wenn ich lade, thmtools
erhalte ich eine unerklärliche Fehlermeldung.
Folgendes Minimalbeispiel soll das Problem verdeutlichen:
\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}
Beim Kompilieren des obigen Codes erhalte ich die folgende Fehlermeldung:
./mwe.tex:10: Undefined control sequence. [\makeatother]
Beachten Sie, dass ich im obigen Code nur verwende, \newtheorem
damit das Beispiel funktioniert, wenn Sie die \usepackage{thmtools}
Zeile kommentieren. Das gleiche Problem tritt auf, wenn ich verwende \declaretheorem
(was natürlich ohne nicht verfügbar ist thmtools
).
Was passiert hier?
PS: Ich schreibe nicht einfach „Teorema“ als Theoremnamen, weil ich eine Klassendatei schreibe und die Kompatibilität mit mehreren Sprachen wahren möchte.
Antwort1
Huhn oder Ei?;-)
\cref@theorem@name
ist noch nicht definiert, wann \newtheorem
ausgegeben wird. Lösung: Verwenden Sie \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}
Wenn Sie dies kompatibel machen möchten, \declaretheorem
müssen Sie \noexpand
vor dem symbolischen Namen ein paar 's hinzufügen.
Hier ist eine weniger aufwendige Methode:
\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}