我目前正在使用带有 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
使用时,冒号是活动的,所以会发生以下情况:
- 冒号被其作为宏的定义所取代;
- TeX 遵守规则,因此它插入一个普通的冒号(见下文);
- 普通冒号是数学主动的,所以 的定义
mathtools
用其作为主动字符的定义替换它; - 我们处于与步骤 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
。
这个问题该如何解决?我看到了一个可行的策略。
babel-french
应该做的,而不仅仅是\string:
,\ifmmode\maybemathtoolscolon\else\string:\fi
在文档开头定义
\maybemathtoolscolon
,这样就可以检查是否mathtools
已经加载;如果是,那么就可以定义为\mathtoolscolon
,否则就是标准的\string:
mathtools
应定义\mathtoolscolon
为选项\ordinarycolon
是否centeredcolon
处于非活动状态或\mathrel{\mathop\ordinarycolon}
其他情况。
就目前情况而言,没有希望使 选项centeredcolon
与mathtools
一起可用babel-french
。
以上所有情况都不会发生在 LuaLaTeX 或 XeLaTeX 中,因为在这些情况下babel-french
使用完全不同的方法来间隔文本中的冒号。