编译问题:使用 mathastext 时出现“扩展 mathchar 用作 mathchar”

编译问题:使用 mathastext 时出现“扩展 mathchar 用作 mathchar”

在 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无数学 2

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)如下:

  1. mathastext带选项的负载noendash
  2. 紧接着\begin{document}把下面的行写上
  3. 如果您使用 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}

相关内容