本質的には↓の問題と同じだと思います。
そうだと思います.datatoolsのコードには \sys_if_engine_uptex:TF
があるので
datatools は uptex の存在は知っているから問題ない?と思っていたら
やっぱり regexの \x
の話で,
datatools-base.sty の中の \x{2019} だと思います
\Ucharcat{8217}{12}
に相当するものがエラーを出しているようです(8217(10)= 2019(16)).
\x
のスレッドで私がでっちあげたコードで
引数の文字に応じてもっと丁寧にcatcodeを与えれば動くようです.
おおざっぱに FF までは 12,それ以上では 18 のcatcode を与えてみました.
たぶん,「the文字列」がcatcode 12になるので
それにあわせて 12 を割り当てているのではないかと思うので
それに合わせるなら upTeX の「the文字列」の挙動に合わせるのがスマートなのかなとは思いますが,
そこら辺をよくわかってないので,ばっさり 18 にしてみました.
glossariesとかわかってないのでこれがどういう影響を及ぼすかはわかりません.
特に mfirstuc に影響がありそうな気もしないでもないです
(FF未満を12にしてるから大丈夫な気もしますがわかりません).
\documentclass{article}
\ExplSyntaxOn
\cs_set_eq:NN \c_max_char_int \relax
\int_const:Nn \c_max_char_int {"10FFFF}%%範囲を広げる
\cs_set:Npn \__regex_escape_x_end:w #1 ;
{
\int_compare:nNnTF {#1} > \c_max_char_int
{
\msg_expandable_error:nnff { regex } { x-overflow }
{#1} { \int_to_Hex:n {#1} }
}
{
% #1 には文字コードがdecimalで入ってきている
\exp_last_unbraced:Nf \__regex_escape_raw:N
{\int_compare:nTF {#1 < "256}%%とりあえず FF までは12,それ以上は18のどんぶり勘定
{ \char_generate:nn {#1} { 12 } }
{ \char_generate:nn {#1} { 18 } }
}
}
}
\cs_set:Npn \__char_generate_aux:w #1 ; #2 ;
{
\if_int_odd:w 0
\if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi:
\if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi:
\if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi:
\if_int_compare:w #2 > 20 \exp_stop_f: 1 \fi: \exp_stop_f:%%カテゴリコードの範囲を20まで広げてみる
\msg_expandable_error:nn { char }
{ invalid-catcode }
\else:
\if_int_odd:w 0
\if_int_compare:w #1 < \c_zero_int 1 \fi:
\if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
\msg_expandable_error:nn { char }
{ out-of-range }
\else:
\if_int_compare:w #2#1 = 100 \exp_stop_f:
\msg_expandable_error:nn { char } { null-space }
\else:
\__char_generate_aux:nnw {#1} {#2}
\fi:
\fi:
\fi:
\exp_end:
}
\usepackage{glossaries}
\ExplSyntaxOff
\begin{document}
A
\end{document}