xeCJK: 数学符号莫名变成间隔号
用 MathTime Professional 2 的 \overcbrace 会出现花括号变成中文间隔号的问题:
\documentclass{article}
\usepackage{xeCJK}
\usepackage[lite]{mtpro2}
\begin{document}
$\overcbrace{AIAI}$\par
$\overcbrace{AIAIA}$ ???\par
$\overcbrace{AIAIAI}$
\end{document}
感觉与 https://github.com/CTeX-org/ctex-kit/issues/59 非常类似,不过在那条 issue 里是在文本模式会出问题,本条是在数学模式会出问题。MathTime Professional 2 有免费子集,请前往 官方网站 下载。
mtpro2 的大符号 属于 直接绕过了 NFSS,尴尬的是,在 U 编码 mt2exe 这份字体文件中,U+00B7 位置上有个「宽度为 3.3em 的花括号」。就算在数学模式中,xeCJK 也强制将其转换成中文字体里的间隔号。
切换中文字体的功能,是不是应该在数学模式中禁用?
这种最保险的办法是一个一个单独处理。我们也可以像 LuaTeX-ja 一样对 \char 打补丁,使得用 \char 输出的字符总是使用西文字体。
\documentclass{article}
\usepackage{xeCJK}
\usepackage[lite]{mtpro2}
\makeatletter
\ExplSyntaxOn
\cs_new_protected:Npn \xeCJK_default_char:w
{
\int_compare:nNnTF \tex_XeTeXinterchartokenstate:D > \c_zero_int
{
\c_group_begin_token
\tex_afterassignment:D \@@_default_char_aux:
\l_@@_default_char_int =
}
{ \tex_char:D }
}
\cs_new_protected:Npn \@@_default_char_aux:
{
\tex_XeTeXinterchartokenstate:D = \c_zero_int
\tex_char:D \l_@@_default_char_int
\c_group_end_token
}
\int_new:N \l_@@_default_char_int
\cs_set_eq:NN \char \xeCJK_default_char:w
\ExplSyntaxOff
\makeatother
\begin{document}
$\overcbrace{AIAI}$\par
$\overcbrace{AIAIA}$ ???\par
$\overcbrace{AIAIAI}$
\end{document}
嗯,从程序逻辑上来看,「一个一个单独处理」的确是最保险的办法,正如「中西文之间手动加空格」是最保险的。
mtpro2「超大符号」采用的编码纯粹是 in-house 的,跟 pifont 有点像。在 xeCJK 中,间隔号 U+00B7 是唯一一个造成问题的字符(因被纳入中文类),而 mtpro2 中受到影响的有两个:\overcbrace 与 \widearc。让 xeCJK 为其他包打补丁,不可能遍历,也不方便维护。
另外,\overcbrace 的定义是错的,例如 \ifdim 应该跟相对单位 em 作比较而不是跟绝对单位 pt,又例如 \pointcount@ 的计算方法可以改进成 Floor( \wd\z@ / 1em );\widearc 的功能不全,有些字形出不来。所以,对 mtpro2 打补丁(其源代码中有 10 余处错误,见 mtpro2-patch.tex),是我目前采纳的方案。
