为作为参数传递的任意unicode字符提供数学活动定义?

为作为参数传递的任意unicode字符提供数学活动定义?

我一直在尝试编写一个 LaTeX3 函数来使任意 Unicode 字符数学活跃并为其提供定义。我正在使用 XeLaTeX。我的解决方案莫名其妙地适用于某些示例,但对其他示例无效。

它适用于 ascii 字母q

\ExplSyntaxOn
\cs_new_protected:Npn \my_set_math_active:Nn #1 {
    \char_set_mathcode:nn {`#1} {"8000}
    \tl_rescan:nn {\char_set_catcode_active:N #1} {\def #1}
}
\my_set_math_active:Nn q {(test)}
\ExplSyntaxOff

`q' is used in $q$. % works

它也适用于我尝试过的所有非字母(无论如何,不​​复杂的字母;不包括\#等)。但它不适用于数学字母数字符号范围内的任何字母。例如,双击

答案1

编辑:该错误已修复;我还没有检查具体时间。

您发现 XeTeX 的\scantokens(LaTeX3 使用的底层原语\tl_rescan:nn) 实现中存在一个针对 BMP 以外字符的错误。

通过(普通)LuaTeX 运行以下内容将得到(./test.tex ****120162,32**** )正确的字符代码

答案2

已经有一个函数可以全局地为活动字符分配含义,而无需借助于\tl_rescan:nn

\documentclass{article}
\usepackage{xparse}
\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{STIXGeneral}

\ExplSyntaxOn
\cs_new_protected:Npn \my_set_math_active:Nn #1 #2
 {
  \AtBeginDocument{
    \char_set_mathcode:nn {`#1} { "8000 }
  }
  \group_begin:
  \cs_set_protected:Nn \my_set_math_active_temp: { #2 }
  \char_gset_active_eq:NN #1 \my_set_math_active_temp:
  \group_end:
}
\my_set_math_active:Nn q {(testa)}
\my_set_math_active:Nn 

相关内容