¿Cómo manejar los caracteres activos de Babel al escribir un paquete?

¿Cómo manejar los caracteres activos de Babel al escribir un paquete?

En el bodeplotpaquete, definí nuevos entornos usando (definidos así para evitar problemas con la externalización de tikzgráficos)

\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}
}{}

Quiero que los usuarios puedan utilizar el nuevo entorno para hacer cosas como esta.

\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}

Todo esto funciona para documentos en inglés. Sin embargo, si un usuario utiliza babelcualquier idioma que active algunos caracteres #4, el documento no se podrá compilar. Por ejemplo, si agrego

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

En el preámbulo, aparece errores de compilación.

Logré hacerlo funcionar para el idioma francés verificando frenchbsetupy usando

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

si se detecta. Sin embargo, hacer algo como esto para cada carácter activo en cada idioma parece un enfoque incorrecto para resolver este problema.

¿Existe una mejor manera de detectar y administrar caracteres activos en macros como esta que funcione con todos los idiomas admitidos babel?

Respuesta1

No estoy seguro de cómo tikzse tratan los códigos cat, pero supongo que deben cambiarse de alguna manera a sus valores predeterminados, generalmente 12 ("otros"). Y la única manera es con \shorthandoff(o con el nivel bajo \catcode).

Sin embargo, quizás la siguiente idea funcione para usted: hay una macro llamada \dospecialsque almacena caracteres "especiales" y babelle agrega abreviaturas. Dado que se almacenan como macros (es decir, ;se almacenan como \;), necesitamos algún truco para obtener el carácter real. Entonces podemos usar \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

Esto mostrará ->~:;!?., que, si eliminamos los caracteres agregados por \show, es ~:;!?. Puede que no te funcione, pero al menos lo intenté.

información relacionada