Babel + 章节 + 引用其他方程式的方程式 = 编译问题

Babel + 章节 + 引用其他方程式的方程式 = 编译问题

我想我应该先说明一下,我不是在寻找问题的解决方案,而是在寻找问题发生的根本原因。这个问题已经得到解决。

免责声明:我讨厌 Babel,从不使用它。下面的代码是别人的。我只是觉得这里描述的问题非常奇怪,所以我想进一步询问。

以下是该代码的精简版本:

\documentclass[11pt]{book}

\usepackage[spanish]{babel}
\unaccentedoperators
\decimalpoint

\begin{document}

\mainmatter

\chapter{chapter title}

\begin{equation}\label{eq1}
1 \neq 0
\end{equation}

We thus have
\begin{equation}
2 \neq 1\ \Longleftrightarrow\ (\ref{eq1})\ \Longleftrightarrow\ 2 \neq 0
\end{equation}

\end{document}

如果我删除 Babel 行和其后紧接着的两行,则所有内容都会编译并得到以下内容:

在此处输入图片描述

(我知道 2 不等于 0 并不等于 0 和 1 都不相等;我只是用首先想到的东西填充了等式环境。)

如果我重新编译,则会得到预期的结果:

在此处输入图片描述

现在,如果我使用 Babel(除了西班牙语之外没有尝试过其他语言),代码第一次编译时我会得到类似于第一幅图像的结果(带有??),但第二次编译器就会永远卡住:

在此处输入图片描述

以下是代码所有者和我迄今为止尝试过的方法以及结果:

  • usr/local/texlive/2015/texmf-dist/tex/latex/wasysym/uwasy.fd 处的文件在卡住之前出现在控制台的末尾,似乎是定义了某些数学符号的文件,但似乎没有损坏或出现任何问题。
  • 更改\ref{eq1}为除引用之外的任何内容(例如简单的1.1)都会导致编译成功。因此,当 LaTeX 尝试引用第一个方程时,就会出现问题。
  • 注释(或删除)公式 1.1 可成功编译(显然,另一个公式中的引用被 ?? 取代)。
  • 在公式 1.2 之外引用公式 1.1 可成功编译。因此,LaTeX 似乎不喜欢仅从另一个公式中引用一个公式。
  • 在公式 1.2 中引用公式以外的内容(例如子节)可成功编译。因此,LaTeX 似乎只是不喜欢在公式中引用公式。
  • 等式 1.1 的标签和内容对结果没有影响。
  • 我们从头重写了整个文档以检查是否存在有问题的不可见字符,但并没有发现。
  • 注释该\chapter行可成功编译。因此,只有当方程式位于章节环境中时,LaTeX 才会在方程式内部引用方程式时出现问题。
  • 尝试各种看似不相关的事情(例如将序言移到主文件并使用\include包含相关章节,将公式 1.2 放在列表 ( \begin{itemize}) 中等)有时会导致控制台中的最后一行不是 wasysym 行。我们没有进行足够的测试来确定什么时候是 wasysym,什么时候是其他内容。

因为当不调用 Babel 时问题就会消失,所以我的结论是 Babel(至少是西班牙语版本)必须以某种方式干扰章节环境,使得方程式中的方程式引用导致无限循环或类似情况(没有错误消息;编译只是永远卡住了)。

所以我的问题是:(西班牙语) Babel 到底对章节环境做了什么导致这种情况?

提前致谢。

答案1

是的,这是由于\decimalpoint(或者更好的是,它与如何spanish-babel设置事物有关,以便数学中的数字用逗号或句点打印,这取决于\decimalpoint\decimalcomma声明)。

解决方法:使用(\mbox{\ref{eq1}})

更好的是,加载amsmath并使用\eqref

\documentclass[11pt]{book}

\usepackage[spanish]{babel}
\usepackage{amsmath}

\unaccentedoperators
\decimalpoint

\begin{document}

\mainmatter

\chapter{chapter title}

\begin{equation}\label{eq1}
1 \neq 0
\end{equation}

We thus have
\begin{equation}
2 \neq 1\ \Longleftrightarrow\ \eqref{eq1}\ \Longleftrightarrow\ 2 \neq 0
\end{equation}

\end{document}

在此处输入图片描述

这是一个最简单的例子,它可以证明你的一些结论是错误的:

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage{amsmath}

\decimalpoint

\renewcommand{\theequation}{1.\arabic{equation}}

\begin{document}
\begin{equation}\label{eq}\tracingmacros=1
\ref{eq}
\end{equation}
\end{document}

\tracingmacros在公式中使用,以便在日志文件中跟踪宏扩展。这是第二次编译时发生的情况:

\ref ->\protect \ref  

\ref  #1->\@safe@activestrue \org@ref {#1}\@safe@activesfalse 
#1<-eq

\@safe@activestrue ->\let \if@safe@actives \iftrue 

\org@ref #1->\expandafter \@setref \csname r@#1\endcsname \@firstoftwo {#1}
#1<-eq

\@setref #1#2#3->\ifx #1\relax \protect \G@refundefinedtrue \nfss@text {\reset@
font \bfseries ??}\@latex@warning {Reference `#3' on page \thepage \space undef
ined}\else \expandafter #2#1\null \fi 
#1<-\r@eq 
#2<-\@firstoftwo 
#3<-eq

\r@eq ->{1.1}{1}

\@firstoftwo #1#2->#1
#1<-1.1
#2<-1

.->\es@use@shorthand .

\es@use@shorthand ->\if@safe@actives \bbl@afterelse \string \else \bbl@afterfi 
{\ifx \thepage \relax \bbl@afterelse \string \else \bbl@afterfi \es@use@sh \fi 
}\fi 

\bbl@afterelse #1\else #2\fi ->\fi #1
#1<-\string 
#2<-\bbl@afterfi {\ifx \thepage \relax \bbl@afterelse \string \else \bbl@afterf
i \es@use@sh \fi }

.->\es@use@shorthand .

\ref宏设置,\@safe@activestrue然后经过一些工作,它会产生1.1。该数字1经过处理,而不是我们在 处得到的.,即数学活跃(按 排序spanish-babel),因此它表现为宏,但仅在数学模式下。当\if@safe@active返回 true 时,它​​变为\string.。好的,\string.返回类别代码 12 的句点,它是数学活动的,因此它作为活动字符的定义再次展开,即\es@use@shorthand .:无限循环,抱歉。

暂时跳出数学模式,使用\mbox,或使用\eqref隐式使用框,关闭.作为数学活动字符的任何行为并解决问题。

答案2

尝试:

\usepackage[spanish.nodecimaldot]{babel}

或者:

\usepackage[spanish,safe=none]{babel}

问题更多出现在侧面babel而不是一侧spanish。事实上,它在babel文档中被列为“已知问题”。

相关内容