Como usar nomes inteligentes como nomes de teoremas com thmtools

Como usar nomes inteligentes como nomes de teoremas com thmtools

Estou tentando configurar alguns ambientes semelhantes a teoremas thmtools, fazendo-os funcionar clevererenquanto tento permanecer compatível com diferentes idiomas.

Se eu carregar cleverefdepois thmtools, parece funcionar muito bem com referências cruzadas traduzidas que saem do \crefcomando. Parece que uma combinação de babele cleverefjá sabe traduzir "teorema", "lema" e "definição" para o meu idioma (quem está fornecendo a tradução e como?).

No entanto, o mesmo não acontece com o meio ambientenomes, então tenho que fornecer de alguma forma uma string traduzida para a name=opção \declaretheorem. Descobri no cleverefmanual que existem algumas macros que fornecem os nomes usados ​​pelo pacote, como \cref@theorem@name, e estou tentando usá-las. Tudo funcionou bem quando eu estava usando amsthm, mas se eu carregar thmtoolsrecebo uma mensagem de erro inexplicável.

O exemplo mínimo a seguir deve mostrar o problema:

\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}

Compilando o código acima recebo o erro:

./mwe.tex:10: Undefined control sequence. [\makeatother]

Observe que no código acima estou usando \newtheoremapenas para fazer o exemplo funcionar se você comentar a \usepackage{thmtools}linha. O mesmo problema acontece se eu usar \declaretheorem(o que obviamente não está disponível sem thmtools).

O que esta acontecendo aqui?

PS: Não estou escrevendo "Teorema" apenas como nome do teorema porque estou escrevendo um arquivo de classe e quero permanecer compatível com vários idiomas.

Responder1

Frango ou ovo?;-)

\cref@theorem@nameainda não está definido quando \newtheoremserá emitido. Solução: use \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}

insira a descrição da imagem aqui

Se você quiser tornar isso compatível, \declaretheoremvocê deve adicionar alguns \noexpand's na frente do nome simbólico.

Aqui está uma maneira menos pesada:

\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}

insira a descrição da imagem aqui

informação relacionada