![Babel + 章节 + 引用其他方程式的方程式 = 编译问题](https://linux22.com/image/341280/Babel%20%2B%20%E7%AB%A0%E8%8A%82%20%2B%20%E5%BC%95%E7%94%A8%E5%85%B6%E4%BB%96%E6%96%B9%E7%A8%8B%E5%BC%8F%E7%9A%84%E6%96%B9%E7%A8%8B%E5%BC%8F%20%3D%20%E7%BC%96%E8%AF%91%E9%97%AE%E9%A2%98.png)
我想我应该先说明一下,我不是在寻找问题的解决方案,而是在寻找问题发生的根本原因。这个问题已经得到解决。
免责声明:我讨厌 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
文档中被列为“已知问题”。