Como lidar com caracteres ativos do babel ao escrever um pacote?

Como lidar com caracteres ativos do babel ao escrever um pacote?

No bodeplotpacote, defini novos ambientes usando (definido assim para evitar problemas com externalização 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}
}{}

Quero que os usuários possam usar o novo ambiente para fazer coisas 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}

Tudo isso funciona para documentos em inglês. Porém, se um usuário utilizar babelalguma linguagem que torne alguns caracteres #4ativos, o documento não poderá ser compilado. Por exemplo, se eu adicionar

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

ao preâmbulo, recebo erros de compilação.

Consegui fazer com que funcionasse para o idioma francês, verificando frenchbsetupe usando

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

se for detectado. No entanto, fazer algo assim para todos os caracteres ativos em todos os idiomas parece ser a abordagem errada para resolver esse problema.

Existe uma maneira melhor de detectar e gerenciar caracteres ativos em macros como esta que funcione com todos os idiomas suportados pelo babel?

Responder1

Não tenho certeza de como tikzlidar com catcodes, mas presumo que eles devam ser alterados de alguma forma para seus valores padrão, geralmente 12 ('outros'). E a única maneira é com \shorthandoff(ou com o nível baixo \catcode).

No entanto, talvez a seguinte idéia funcione para você: existe uma macro chamada que \dospecialsarmazena caracteres 'especiais' e babeladiciona abreviações a ela. Como eles são armazenados como macros (ou seja, ;são armazenados como \;), precisamos de algum truque para obter o caractere real. Então 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

Isso mostrará ->~:;!?.que, se removermos os caracteres adicionados por \show, é ~:;!?. Pode não funcionar para você, mas pelo menos eu tentei

informação relacionada