TeX Live 2024 で pLaTeX + glossaries.sty が動かない

TeX Live 2024 で pLaTeX + glossaries.sty が動かない

- wryz77 の投稿
返信数: 1

TeX Live 2024 において,pLaTeX/upLaTeX で glossaries.sty が使えません。例えば,以下のソースコード

\documentclass{article}
\usepackage{glossaries}
\begin{document}
A
\end{document}
 

は次のようなエラーを出力します。

./datatool-base.sty:2220: Use of \??? doesn't match its definition.
<argument> \???  
                 ! LaTeX Error: Character code ##1 too large in \x{##2} regex.
l.2220  }

glossaries.sty が内部で読み込んでいる datatool-base.sty の中の \datatool_if_unicode_engine:TF 関数で止まっているようで,本質的には↓の問題と同じだと思います。
https://okumuralab.org/tex/mod/forum/discuss.php?d=3885

wryz77 への返信

Re: TeX Live 2024 で pLaTeX + glossaries.sty が動かない

- 本田 知亮 の投稿

本質的には↓の問題と同じだと思います。

そうだと思います.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}