在 Mac OS X 上的 TeXShop 中使用 XeLaTex 编译文件时,检测到 XeTeX 驱动程序后控制台会持续挂起:
*geometry* driver: auto-detecting
*geometry* detected driver: xetex
./paper.tex:53: Extended mathchar used as mathchar (71311379).
<to be read again>
\relax
l.53 \begin{document}
可以继续编译,但我想了解发生了什么。问题似乎与mathastext
包有关,我使用该包允许数学和文本格式都使用 TeX Gyre Termes 字体;注释掉该\usepackage
行可以mathastext
缓解问题。
我见过2006 年的讨论(早在 的存在之前mathastext
)说 XeTeX 发行版(v. 0.995 rev. D)中有一个错误,唯一的解决方案是从源代码进行编译。(谷歌搜索结果在这里。) 目前 TeX Live 在 Mac OS 10.6.7 上安装的 XeTeX 版本是 0.9997.4,但问题仍然存在,不知道有没有更新的情报可以修复它或者是什么原因造成的。我在手动构建 XeTeX 时遇到了麻烦。
编辑,20110505
由于下面的讨论非常复杂,我总结了两个主要结论:
- 中有一个错误
amsmath
,需要将选项noendash
传递给mathastext
。Philipp 提供了一个替代修复程序。 - 关于如何使数学格式应用于非数学文本(而不像数学模式)的讨论被转移到另一个帖子:将数学格式应用于非数学字体。
您的代码加载了 mathspec,而这本身就导致后台 fontspec 以选项 no-math 加载?
编辑:最小示例,按照 Philipp 的要求
%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass[12pt]{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{mathspec} % replaces amssymb; do not use unicode-math
\usepackage[italic]{mathastext} % propagates document text font to math mode
\usepackage{xeCJK}
\usepackage{fontspec}
\defaultfontfeatures{Mapping=tex-text}
\setromanfont{TeX Gyre Termes}
\begin{document}
The expected number of collisions in a given unit is \[E(collisions)=k\times\left(1-\left(1-\left(1/n\right)\right)^{{\left(k-1\right)}}\right)\]
\end{document}
另一项编辑,2011.05.04,回复JFBU关于的评论[no-math]
。
和 no-math
被传递给fontspec
:
\usepackage[no-math]{fontspec}
...
\setmainfont[Scale=1,Mapping=tex-text]{TeX Gyre Termes}
...
\usepackage[italic,noendash]{mathastext} % set *after* setmainfont
...
\begin{document}
au\(_{\rm3yā}\)
\end{document}
我明白了。但是没有 no-math
被传递给fontspec
:
\usepackage{fontspec}
...
\setmainfont[Scale=1,Mapping=tex-text]{TeX Gyre Termes}
...
\usepackage[italic,noendash]{mathastext} % set *after* setmainfont
...
\begin{document}
au\(_{\rm3yā}\)
\end{document}
我明白了。我相信它们是相同的;我选择 ā 是因为长音符的高度在 Termes 中非常独特。
编辑,2011.05.04b:回应@JFBU 的另一条评论,\centerline{0123456789}\centerline{$0123456789$}
有和无的外观no-math
已传递给fontspec
。
和no-math
:
无no-math
:
我看不出有什么明显的区别。
答案1
确实存在问题,因为它似乎是由于amsmath
和之间的相互作用造成的mathastext
。作为临时解决方案,请mathastext
使用选项加载noendash
。
编辑 [2012/10/18]。9 月底上传到 CTAN 的 1.15x 版本mathastext
已针对此 +Unicode 字体问题引入了解决方法amsmath
。因此不再需要使用该noendash
选项。编辑结束。
以下内容在我的系统上编译:
\documentclass[12pt]{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{mathspec}
\usepackage{xeCJK}
\usepackage{fontspec}
\defaultfontfeatures{Mapping=tex-text}
\setromanfont{Times New Roman}
\usepackage[italic,noendash]{mathastext}
\begin{document}
The expected number of collisions in a given unit is \[E(collisions)=k\times\left(1-\left(1-\left(1/n\right)\right)^{{\left(k-1\right)}}\right)\]
\end{document}
我改用 Times New Roman,因为我当前使用的系统不支持 TeX Gyre 字体。一旦我更好地了解了发生了什么,我就会修改我的答案。
amsmath.sty
好的,看来问题与(第 745-747 行)中的以下两行有关
\AtBeginDocument{%
\mathchardef\std@minus\mathcode`\-\relax
\mathchardef\std@equal\mathcode`\=\relax
}
并mathastext
使用以下指令重新定义数学模式中的减号:
\XeTeXmathcode`\- ="2 \symmtoperatorfont "2013 \relax
此外,该文件amsopn.sty
(由 amsmath 加载)还定义了一个DeclareMathOperator
似乎还涉及某个宏的宏,该宏将包含\mathcode'\-
(将 ' 读作反引号)。似乎一旦mathastext
上面的行完成了使用短划线作为减号的工作,任何对 的调用都会\mathcode'\-
引发错误,正如人们通过编译以下两行所看到的那样
\XeTeXmathcode`\- ="2 "0 "2013 \relax
\mathchardef\coucou\mathcode`\- \relax
在没有包的 TeX 源中。因此这种情况会导致mathastext
和之间的普遍不兼容amsmath
(LuaTeX 作为引擎也是如此!!),对此我看到的唯一当前解决方法(由于上面的 AtBeginDocument)如下:
mathastext
带选项的负载noendash
- 紧接着
\begin{document}
把下面的行写上 - 如果您使用 LuaLaTeX 而不是 XeLaTeX,请输入第二行。
XeTeX 的行:
\XeTeXmathcode`\- ="2 \symmtoperatorfont "2013 \relax % xetex
LuaLaTeX 的行:
\luatexUmathcode`\-="2 \symmtoperatorfont "2013 \relax % lualatex
希望它能有所帮助。的作者mathastext
应该把这些内容放在 AtBeginDocument 指令中,但前提是保证在 amsmath 内容之后 TeX 会处理这些内容。以下在我的系统上有效:
\documentclass[12pt]{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{mathspec}
\usepackage{xeCJK}
\usepackage{fontspec}
\defaultfontfeatures{Mapping=tex-text}
\setromanfont{Times New Roman}
\usepackage[noendash]{mathastext}
\begin{document}
\XeTeXmathcode`\- ="2 \symmtoperatorfont "2013 \relax
The expected number of collisions in a given unit is \[E(collisions)=k\times\left(1-\left(1-\left(1/n\right)\right)^{{\left(k-1\right)}}\right)\]
a\textendash b
$a-b$
\end{document}
答案2
有一个小故障导致amsmath
它在使用 Unicode 数学字体时无法工作。以下是针对 XeTeX 的修复:
\documentclass{article}
\usepackage[no-math]{fontspec}
\ExplSyntaxOn
\int_new:N \l_mathcode_minus_int
\int_new:N \l_mathcode_equal_int
\exp_args:Nx \AtBeginDocument {
\exp_not:n {
\int_set:Nn \l_mathcode_minus_int { \XeTeXmathcodenum `\- }
\int_set:Nn \l_mathcode_equal_int { \XeTeXmathcodenum `\= }
}
\mathcode \int_eval:n { `\- } = \number \mathcode `\- \scan_stop:
\mathcode \int_eval:n { `\= } = \number \mathcode `\= \scan_stop:
}
\usepackage{amsmath}
\AtBeginDocument {
\XeTeXmathcodenum `\- = \l_mathcode_minus_int
\XeTeXmathcodenum `\= = \l_mathcode_equal_int
}
\ExplSyntaxOff
\usepackage[italic]{mathastext}
\setromanfont{TeX Gyre Termes}
\begin{document}
The expected number of collisions in a given unit is \[E(collisions)=k\times\left(1-\left(1-\left(1/n\right)\right)^{{\left(k-1\right)}}\right)\]
\end{document}