我正在尝试结合ntheorem
并定义一个根据语言称为“Theorem”或“Satz”的多语言环境,但我遇到了以下问题translations
:cleveref
theorem
\documentclass[ngerman]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ntheorem,translations}
\usepackage[capitalise]{cleveref}
\begin{filecontents}{tr-german.trsl}
\ProvideDictionaryFor{German}{tr}
\ProvideDictTranslation{Theorem}{Satz}
\ProvideDictTranslation{Theorems}{Sätze}
\end{filecontents}
\LoadDictionaryFor{German}{tr}
% \newtheorem{theorem}{\GetTranslation{Theorem}}[chapter]
\Crefname{theorem}{\GetTranslation{Theorem}}{\GetTranslation{Theorems}}
\AtBeginDocument{%
\newtheorem{theorem}{\GetTranslation{Theorem}}[chapter]
}
\begin{document}
\begin{theorem}[A]
\label{thm:A}
B
\end{theorem}
See \cref{thm:A}
\end{document}
使用新定理的注释行,我得到了 4 个未定义的控制序列,例如
Undefined control sequence.
<argument> ...@language@\@trnslt@current@language
所以似乎语言方面还没有准备好?我可以在文档开头做到这一点,但定理名称的定义和更聪明的人似乎都没有掌握语言。无论我做什么,他们都会坚持使用定理。
有时(我无法在 MWE 中重现这一点)至少似乎\newtheorem
能够掌握语言,但cleverer
参考名称始终保持Theorem
独立,无论我在哪里以及如何尝试重新定义它。
知道如何说服吗两个都打印Satz
而不是Theorem
从translation
s 列表加载?
答案1
您的 MWE 存在两个问题。首先,您没有加载babel
,因此当前语言永远不会更改为ngerman
。其次,\newtheorem
(至少是ntheorem
版本) 试图在定义时扩展参数,这是您不想要的(并且违背了包的意图translations
)。
解决方法:保护你的定理定义(当然还有负载babel
)
\documentclass[ngerman]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{ntheorem,translations}
\usepackage[capitalise]{cleveref}
\begin{filecontents}{tr-german.trsl}
\ProvideDictionaryFor{German}{tr}
\ProvideDictTranslation{Theorem}{Satz}
\ProvideDictTranslation{Theorems}{Sätze}
\end{filecontents}
\LoadDictionaryFor{German}{tr}
\newtheorem{theorem}{\protect\GetTranslation{Theorem}}[chapter]
\Crefname{theorem}{\GetTranslation{Theorem}}{\GetTranslation{Theorems}}
\begin{document}
\begin{theorem}[A]
\label{thm:A}
B
\end{theorem}
See \cref{thm:A}
\GetTranslation{Theorems}
\end{document}