Theorem/Satz 的灵活定义及其引用无法正常工作

Theorem/Satz 的灵活定义及其引用无法正常工作

我正在尝试结合ntheorem并定义一个根据语言称为“Theorem”或“Satz”的多语言环境,但我遇到了以下问题translationsclevereftheorem

\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而不是Theoremtranslations 列表加载?

答案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}

在此处输入图片描述

相关内容