编辑

编辑

我正在尝试追踪 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 二进制文件要到明年才会更新,但希望缺少字符警告是无害的。

相关内容