我一直在尝试编写一个 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