
No bodeplot
pacote, defini novos ambientes usando (definido assim para evitar problemas com externalização de tikz
grá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 babel
alguma linguagem que torne alguns caracteres #4
ativos, 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 frenchbsetup
e 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 tikz
lidar 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 \dospecials
armazena caracteres 'especiais' e babel
adiciona 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