Estou tentando configurar alguns ambientes semelhantes a teoremas thmtools
, fazendo-os funcionar cleverer
enquanto tento permanecer compatível com diferentes idiomas.
Se eu carregar cleveref
depois thmtools
, parece funcionar muito bem com referências cruzadas traduzidas que saem do \cref
comando. Parece que uma combinação de babel
e cleveref
já 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 cleveref
manual 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 thmtools
recebo 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 \newtheorem
apenas 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@name
ainda não está definido quando \newtheorem
será 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}
Se você quiser tornar isso compatível, \declaretheorem
você 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}