如何简化具有重复模式的代码?

如何简化具有重复模式的代码?

.cls我的文件中有几十行这样的行,用、、等等theorem替换......lemmapropositiondefinition

\NewDocumentEnvironment{theorem}{O{}}{%
    \IfLanguageName{chinese}{\begin{theoremCN}[#1]}{}%
    \IfLanguageName{french}{\begin{theoremFR}[#1]}{}%
    \IfLanguageName{english}{\begin{theoremEN}[#1]}{}%
}{%
    \IfLanguageName{chinese}{\end{theoremCN}}{}%
    \IfLanguageName{french}{\end{theoremFR}}{}%
    \IfLanguageName{english}{\end{theoremEN}}{}%
}
\NewDocumentEnvironment{theorem*}{O{}}{%
    \IfLanguageName{chinese}{\begin{theoremCN*}[#1]}{}%
    \IfLanguageName{french}{\begin{theoremFR*}[#1]}{}%
    \IfLanguageName{english}{\begin{theoremEN*}[#1]}{}%
}{%
    \IfLanguageName{chinese}{\end{theoremCN*}}{}%
    \IfLanguageName{french}{\end{theoremFR*}}{}%
    \IfLanguageName{english}{\end{theoremEN*}}{}%
}

这样的代码差不多有 400 行,有没有什么办法可以简化它?(我记得看到过其他人写过类似的东西\csname...,但我无法弄清楚细节)

答案1

我要在这里冒险并假设你有类似的东西:

\newtheorem{theoremEN}{Theorem}
\newtheorem{theoremFR}{Théorème}
\newtheorem{theoremCN}{定理}

但事实上,你正在根据语言做某事,这暗示着我们想要利用 Babel 的多语言功能。

我们将通过类似以下方式定义我们的定理环境

\newtheorem{theorem}{\theoremname}
\newcommand{\theorem}{} % So we can redefine it with \renewcommand

然后我们就可以添加语言钩子来做类似这样的事情:

\addto\extrasenglish{%
  \renewcommand{\theoremname}{Theorem}
 }
 \addto\extrasfrench{%
   \renewcommand{\theoremname}{Théorème}
 }
 \addtoextraschinese{%
   \renewcommand{\theoremname}{定理}
 }

并根据语言获取适当的定理标签。

按语言进行不同的编号会更具挑战性:我们希望有计数器来保存每种语言的当前定理编号:

\newcounter{theoremEN}
\newcounter{theoremCN}
\newcounter{theoremFR}

然后我们在离开语言时保存该值

\addto\noextrasenglish{\setcounter{theoremEN}{\value{theorem}}}
etc.

并在我们选择语言时恢复它

\addto\extrasenglish{\setcounter{theorem}{\value{theoremEN}}}
etc.

通常的免责声明:这是我凭空想出来的。我没有测试过这些。

相关内容