Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xeCJK: 数学符号莫名变成间隔号 #407

Open
RuixiZhang42 opened this issue Mar 11, 2019 · 2 comments
Open

xeCJK: 数学符号莫名变成间隔号 #407

RuixiZhang42 opened this issue Mar 11, 2019 · 2 comments
Assignees

Comments

@RuixiZhang42
Copy link
Member

RuixiZhang42 commented Mar 11, 2019

用 MathTime Professional 2 的 \overcbrace 会出现花括号变成中文间隔号的问题:

\documentclass{article}
\usepackage{xeCJK}
\usepackage[lite]{mtpro2}
\begin{document}
$\overcbrace{AIAI}$\par
$\overcbrace{AIAIA}$ ???\par
$\overcbrace{AIAIAI}$
\end{document}

middledot

感觉与 #59 非常类似,不过在那条 issue 里是在文本模式会出问题,本条是在数学模式会出问题。MathTime Professional 2 有免费子集,请前往 官方网站 下载。

mtpro2 的大符号 属于 U 编码 直接绕过了 NFSS,尴尬的是,在 mt2exe 这份字体文件中,U+00B7 位置上有个「宽度为 3.3em 的花括号」。就算在数学模式中,xeCJK 也强制将其转换成中文字体里的间隔号。

切换中文字体的功能,是不是应该在数学模式中禁用?

RuixiZhang42 added a commit to RuixiZhang42/font-pairing-guide that referenced this issue Mar 11, 2019
RuixiZhang42 added a commit to RuixiZhang42/font-pairing-guide that referenced this issue Mar 11, 2019
@qinglee qinglee self-assigned this Mar 12, 2019
@qinglee
Copy link
Member

qinglee commented Mar 12, 2019

这种最保险的办法是一个一个单独处理。我们也可以像 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}

@qinglee qinglee added the bug label Mar 12, 2019
@RuixiZhang42
Copy link
Member Author

嗯,从程序逻辑上来看,「一个一个单独处理」的确是最保险的办法,正如「中西文之间手动加空格」是最保险的。

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),是我目前采纳的方案。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants