So verwenden Sie Cleveref-Namen als Theoremnamen mit thmtools

So verwenden Sie Cleveref-Namen als Theoremnamen mit thmtools

Ich versuche, mit einige theoremähnliche Umgebungen einzurichten thmtools, damit es funktioniert und cleverergleichzeitig die Kompatibilität mit verschiedenen Sprachen gewahrt bleibt.

cleverefWenn ich danach lade, thmtoolsscheint es mit übersetzten Querverweisen, die aus dem \crefBefehl kommen, sehr gut zu funktionieren. Es scheint, dass eine Kombination aus babelund cleverefbereits 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 cleverefHandbuch 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, thmtoolserhalte 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, \newtheoremdamit 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@nameist noch nicht definiert, wann \newtheoremausgegeben 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}

Bildbeschreibung hier eingeben

Wenn Sie dies kompatibel machen möchten, \declaretheoremmüssen Sie \noexpandvor 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}

Bildbeschreibung hier eingeben

verwandte Informationen