Babel 西班牙语和俄语不兼容吗?

Babel 西班牙语和俄语不兼容吗?

我正在尝试编译大约三年前创建的旧文档。 当时,它使用 pdflatex 和 TL2019 或 TL2020(我不确定是哪一个)运行良好。 现在使用 pdflatex 和 TL2022 时出现错误:

! LaTeX Error: Command \tg already defined.
               Or name \end... illegal, see p.192 of the manual.

\arctg和命令也一样\cosec

我隔离了这个问题(或者说我认为是这样),当我将babel西班牙语(作为主要语言)和俄语放在一起时,它就出现了amsmath。我猜问题是两种语言都定义了相同的宏,并且不知何故产生了错误,但我不知道如何防止它们。

我的 M(non)WE 是:

\documentclass{article}

\usepackage[T2A,T1]{fontenc}
\usepackage[main=spanish,russian]{babel}
\usepackage{amsmath}

\begin{document}
\tableofcontents
\section{Una sección}
En cirílico \foreignlanguage{russian}{Лев Семёнович Понтр\'{я}гин},
y en alfabeto occidental Lev Semënovi\v{c} Pontrâ\'{g}in.
\end{document}

备注。如果我删除以下任何一项,它就会起作用:

  • amsmath包裹。
  • main西班牙语选项。
  • 俄语(和西里尔文)。

我也改变了包的加载顺序,但是无济于事。

答案1

这是一个隐藏了几十年的错误。

babel由于传统,西班牙语和俄语模块都希望定义“本地”数学运算符。

在过去,使用你的设置,西班牙语定义会悄悄覆盖俄语定义,但最近russianb.ldf被替换了

\def\tg{\mathop{\operator@font tg}\nolimits}

\AtBeginDocument{%
  \@ifpackageloaded{amsopn}
  {%
    [...]
    \DeclareMathOperator{\tg}{tg}%
    [...]
  }{%
    [...]
    \DeclareRobustCommand\tg{\mathop{\operator@font tg}\nolimits}%
    [...]
  }

这是一件好事(与西班牙语模块的做法相反,不管是否amsmath已加载),前提是没有其他语言模块定义\tg。不幸的是,spanish.ldf确实如此。

尽管西班牙语提供了一种(不太友好的)方法来禁用“本地语言”操作符,但俄语却没有。1 我看来,两者都应该绑定中的定义\extras<language>:例如,在文档的俄语部分出现“lím”会很奇怪。

有办法吗?我看不出有办法进行一般的双语排版。但如果你只需要russian排版一些俄语单词(例如名字),你可以避免加载所有内容russian.ldf,而只要求基本支持。

\documentclass{article}

\usepackage[T2A,T1]{fontenc}
\usepackage[main=spanish]{babel}
\babelprovide{russian}
\usepackage{amsmath}


\begin{document}

\tableofcontents
\section{Una sección}
En cirílico \foreignlanguage{russian}{Лев Семёнович Понтр\'{я}гин},
y en alfabeto occidental Lev Semënovi\v{c} Pontrâgin.
\end{document}

在此处输入图片描述

如果你依赖于基于 Debian 的 TeX Live,则可以采用以下临时解决方法:

\documentclass{article}

\usepackage[T2A,T1]{fontenc}
\usepackage[main=spanish]{babel}
\babelprovide{russian}
\usepackage{amsmath}

\newcommand{\rus}[1]{{%
  \fontencoding{T2A}\selectfont\foreignlanguage{russian}{#1}%
}}


\begin{document}

\tableofcontents
\section{Una sección}
En cirílico \rus{Лев Семёнович Понтр\'{я}гин},
y en alfabeto occidental Lev Semënovi\v{c} Pontrâgin.
\end{document}

脚注。
1为了禁用西班牙风格的操作符,可以这样做

\makeatletter\let\es@operators\relax\makeatother

但这对于当前的情况没有帮助,因为它删除了有关西班牙语样式数学运算符的所有内容。如果文档以俄语为主要语言,这将有效,但反过来却行不通,而且没有真正的方法让俄语和西班牙语样式的运算符共存于同一个文档中。实际上,目前没有办法制作双语文档。

答案2

作为@egreg 答案的补充[编辑:有一些不准确之处],如果你想要 中的更改,这里有一个解决方法。它首先保存并禁用使用第一个隐式spanish进行的重新定义,然后在定义之后,启用它们并再次选择。这个最小示例打印“lím tg lim tg lím tg”。spanish\selectlanguage{spanish}russian\tgspanish

\documentclass{article}

\usepackage[T2A, T1]{fontenc}
\usepackage[russian,spanish]{babel}

\let\savemathspanish\mathspanish
\let\mathspanish\relax
\AtBeginDocument{%
  \let\mathspanish\savemathspanish
  \selectlanguage{spanish}}

\usepackage{amsmath}

\begin{document}

$\lim\tg$ \foreignlanguage{russian}{$\lim\tg$} $\lim\tg$ 

\end{document}

相关内容