我正在尝试追踪 miktex 中新 xetex 二进制文件的问题的根源。我认为这与 TeXLive 2013 中的以下问题有关:
\documentclass{article}
\usepackage{unicode-math}
\begin{document}
%$a_a$
\message{missing chars}
$a_{aa_{aa}}$
\end{document}
在日志文件中给出消息:
Missing character: There is no ƽ in font [latinmodern-math.otf]/ICU:script=math
;language=DFLT;+ssty=1;!
Missing character: There is no Dž in font [latinmodern-math.otf]/ICU:script=math
;language=DFLT;!
日志文件中提到的缺失字符可能会在后续数学运算中发生变化。在大多数情况下,只有当下标中至少有两个符号时,我才会得到它。先前的数学运算可以改变行为。有人知道这里发生了什么吗?缺失字符消息来自哪里?
附加信息:缺失的字符(以及 miktex 中的错误)出现在结束数学移位时。那么 xelatex 在那里做什么会导致字体错误?
编辑
或多或少,我偶然发现,如果重新加载带有范围选项的数学字体,问题就会消失(在 miktex 中也是如此),我可以在范围代码中追踪到这一行的影响:
\documentclass{article}
\usepackage{unicode-math}
\ExplSyntaxOn
\keys_define:nn {unicode-math} {
nobug .code:n = {
\cs_set_eq:NN \um_map_char_single:nn \um_map_char_parse:nn
}}
\keys_define:nn {unicode-math} {
bug .code:n = {
\cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn
}}
\ExplSyntaxOff
%\setmathfont[bug]{Latin Modern Math}
\setmathfont[nobug]{Latin Modern Math}
\begin{document}
$a^{aa^{aa}}$
\end{document}
设置\um_map_char_noparse:nn
数学码,所以下一步是找出为什么这会干扰新的 xetex 版本。
编辑2
我发现,如果我在数学运算前使用 ^^ 符号,miktex 中的错误消息中的数字(\textfont XXX 未定义)和缺失的字符会发生变化。每次使用 ^^ 时,数字/字符都会“倒计时”。在 TeXLive 中,缺失字符消息有时会消失(显然是因为当前请求的字符在字体中)。如果 ^^21 之间没有 \par,则步骤会更小。三个或更多 ^^^ 也会改变步骤。
这一切都非常奇怪,我怀疑在处理 ^^-notation 时出现了一些错误 -> 这个假设似乎是错误的,参见编辑 4。
\documentclass{article}
\usepackage{unicode-math}
\begin{document}
% font name TL missing char
%no ^^: %197 .5 char 453
%uncomment one-by-one to see changes in error/missing char message
%^^21 %142 .5 char 398
%^^21 %91 .5 -
%^^21 %40 .5 -
%^^21 %245 ^^@ -
%^^21 %194 ^^@ -
%^^21 %143 ^^@ ^^8f
% other char as superscript, only to avoid side effects:
% it doesn't change the behaviour
\catcode`\?=7
$k?{kk}$
\end{document}
编辑3
出现了一个例子(MiKTeX 更新:包“url”中的错误“\textfont 未定义”) 不使用unicode-math。
miktex 用户直接收到错误消息,而在 TeXLive 2013 中必须添加一些 ^^21 才能在日志文件中获取“缺少字符”消息:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[]{LinLibertine_R.otf}
\usepackage{url}
\urlstyle{rm}
\begin{document}
^^21
^^21
^^21
^^21
^^21
Test: \url{http://test-website.com}
\end{document}
错误只发生在特定字体上。例如,LinLibertine_RB.otf 不会发生错误。
编辑4
Joseph Wright 分析了编辑 3 中的示例,并提出了一个不使用 ^^ 符号而是使用简单字符来“倒数”错误/缺失字符数的示例。我还试图找出 libertine 字体的特殊之处,我认为这与数学属性有关:与 LinLibertine-M.otf 不同,该字体设置数学值,如 DelimitedSubFormulaMinHeight。使用其他“数学开放类型”字体进行的测试似乎证实了这一点:
\documentclass{article}
\usepackage[no-math]{fontspec}
\setsansfont{Cambria Math}% or some other font with "math properties"
% like LinLibertine_R.otf or latin modern math
% it doesn't matter if it used outside math
\ExplSyntaxOn
\SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\sfdefault\mddefault\updefault
\ExplSyntaxOff
\begin{document}
A
A
$%
\mathsf{a_{aa}}\showoutput%
$%
\end{document}
解决方法(不太好)
似乎错误消息不会影响最终文档。因此,可以在编写文档时删除unicode-math
并加载fontspec
选项no-math
,并在最后重新启用所需的数学设置,然后使用滚动模式进行编译以忽略所有错误。
编辑 5 - 正在修复
Khaled Hosny 已提交修复:https://github.com/khaledhosny/xetex/commit/b9f323a。希望这将在不久的将来解决这个问题。
编辑 6 - 快乐和幸福
今天对 xelatex 二进制文件的更新似乎已经解决了 miktex 的问题。
答案1
这是 XeTeX 0.9999 中的一个错误,已在 master 中修复(使用这次提交)。MiKTeX 二进制文件似乎已更新,问题已得到验证并已修复(感谢 Ulrike Fischer)。当然,TeX Live 二进制文件要到明年才会更新,但希望缺少字符警告是无害的。