パッケージを書き込むときに、Babel のアクティブ文字をどのように処理しますか?

パッケージを書き込むときに、Babel のアクティブ文字をどのように処理しますか?

パッケージではbodeplot、(グラフィックスの外部化の問題を回避するためにこのように定義しましたtikz)を使用して新しい環境を定義しました。

\documentclass{standalone}
\usepackage{pgfplots,xparse}
\pgfplotsset{compat=1.18}
\NewDocumentEnvironment{MyEnv}{O{}mm+b}{
  \begin{tikzpicture}
    \begin{semilogxaxis}[xmin={#2},xmax={#3},ymin=0,ymax=1]
      #4
    \end{semilogxaxis}
  \end{tikzpicture}
}{}

ユーザーが新しい環境を使ってこのようなことができるようにしたい

\begin{document}
  \begin{MyEnv}[]{1e-1}{1e4}
    \draw[thick,blue,dashed] (axis cs:1,0) -- (axis cs:100,1);
    \addplot[variable=t,domain=1e-1:1e4] gnuplot {(t>100)?0.2:0.5};
  \end{MyEnv}
\end{document}

これらはすべて英語の文書ではうまくいきます。しかし、ユーザーがbabel一部の文字を#4アクティブにする言語を使用する場合、文書はコンパイルできません。たとえば、

\usepackage[french]{babel}
\usetikzlibrary{babel}

プリアンブルにコンパイルエラーが発生します。

私はフランス語の作業でこれを機能させることができましたfrenchbsetup

\AddToHook{env/MyEnv/begin}{\shorthandoff{;:!?}}

検出された場合。ただし、すべての言語のすべてのアクティブな文字に対してこのようなことを行うのは、この問題を解決するための間違ったアプローチのようです。

でサポートされているすべての言語で機能する、このようなマクロ内のアクティブな文字を検出して管理するより良い方法はありますかbabel?

答え1

が catcodes をどのように処理するかはわかりませんtikzが、何らかの方法でデフォルト値 (通常は 12 (「その他」)) に変更する必要があると思われます。唯一の方法は、\shorthandoff(または低レベルの\catcode) を使用することです。

ただし、おそらく次のアイデアが役に立つでしょう。 というマクロがあり、これが\dospecials「特殊」文字を保存し、それに省略形を追加します。これらはマクロとして保存される (つまり、として保存される)babelため、実際の文字を取得するには何らかのトリックが必要です。次に、 を使用できます。;\;\ifbabelshorthand

\documentclass{article}

\usepackage[french]{babel}

\makeatletter
\let\shorthandlist\@empty
\def\do#1{%
  \begingroup
    \lccode`\~=`#1\relax
    \lowercase{\ifbabelshorthand~{\g@addto@macro\shorthandlist{~}}{}}
  \endgroup}
\dospecials
\makeatother

\show\shorthandlist

これは を表示します->~:;!?.が、 によって追加された文字を削除すると に\showなります~:;!?。うまくいかないかもしれませんが、少なくとも私は試しました。

関連情報