LaTeX 中的公式中含有冒号,导致编译无限期挂起

LaTeX 中的公式中含有冒号,导致编译无限期挂起

我目前正在使用带有 LaTeX Workshop 扩展的 Visual Studio Code 并使用 pdflatex 编译我的文档。

在撰写论文的过程中,我遇到了一个奇怪的问题。每当我在任何公式中包含冒号时,编译过程就永远不会完成。它既不会完成编译,也不会显示任何错误消息。即使在文档中添加看似无害的行(否则编译不会出现问题)也会出现此问题。例如:

$T: \mathcal{M} \rightarrow \mathcal{N}$

包含上述行会导致无休止的编译过程。但是,如果我使用\text{:},它就可以工作!

这是一个已知问题吗?它可能与特定软件包有关吗?

提前感谢您的帮助!


下面是一个出现错误的示例:

\documentclass[a4paper,11pt,twoside]{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[paperwidth=210mm,paperheight=297mm,top=1.4in, bottom=2in, left=1.25in, right=1.25in,headheight=14pt]{geometry}
\usepackage[frenchb, english]{babel}

\usepackage{mathtools}
\mathtoolsset{centercolon}

\begin{document}

hello party people!

\selectlanguage{french}

hello party people!

$T: \mathcal{M} \rightarrow \mathcal{N}$

\end{document}

答案1

总结

当文档中使用该选项时,请不要使用该centeredcolon选项。babel-french

长答案(没有真正的解决方案,抱歉)

这是怎么回事?可怜的结肠正受到babel-french和的双重攻击mathtools

前者使冒号变为活动状态,以符合传统(而且很糟糕,但这只是个人观点)的法语排版规则。后者反而使冒号变为活动状态。

那么,会发生什么?活跃的结肠就像一个宏,它的作用是

删除可能的空格,添加适当的(不间断的)空格,然后插入非活动冒号和另一个空格

数学活动冒号的动作,正如预期的那样mathtools应该是

用稍微凸起的结肠代替

至于具体如何实现,则并不重要。

该问题是一个“竞争条件”。

当 TeX 发现一个数学活动字符时,它通常会做什么?它会查找该字符的定义,就好像它是活动的一样,然后执行操作。但是当babel-french使用时,冒号是活动的,所以会发生以下情况:

  1. 冒号被其作为宏的定义所取代;
  2. TeX 遵守规则,因此它插入一个普通的冒号(见下文);
  3. 普通冒号是数学主动的,所以 的定义mathtools用其作为主动字符的定义替换它;
  4. 我们处于与步骤 1 相同的情况……无限循环。

目前,活跃结肠的定义babel-french

\declare@shorthand{french}{:}{%
  \ifFB@spacing
    \ifhmode
      \ifdim\lastskip>1sp
        \unskip\penalty\@M\FBcolonspace
      \else
        \FDP@colonspace
      \fi
    \fi
  \fi
  \string:}

实际上存在一些数学模式保护:当:在数学模式中发现活动字符时,条件\ifhmode返回 false,因此\string:发出。但这并不能解决问题,正如所见,因为\string:插入了一个非活动冒号,但根据您传递给的选项mathtools,它是数学活动的,因此使用活动字符的定义,这会导致插入普通冒号,依此类推。

mathtools数学活动冒号的定义是绝不使用,因为它已被取代babel

这个问题该如何解决?我看到了一个可行的策略。

  1. babel-french应该做的,而不仅仅是\string:

    \ifmmode\maybemathtoolscolon\else\string:\fi

  2. 在文档开头定义\maybemathtoolscolon,这样就可以检查是否mathtools已经加载;如果是,那么就可以定义为\mathtoolscolon,否则就是标准的\string:

  3. mathtools应定义\mathtoolscolon为选项\ordinarycolon是否centeredcolon处于非活动状态或\mathrel{\mathop\ordinarycolon}其他情况。

就目前情况而言,没有希望使 选项centeredcolonmathtools一起可用babel-french

以上所有情况都不会发生在 LuaLaTeX 或 XeLaTeX 中,因为在这些情况下babel-french使用完全不同的方法来间隔文本中的冒号。

相关内容