
En el bodeplot
paquete, definí nuevos entornos usando (definidos así para evitar problemas con la externalización 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}
}{}
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 babel
cualquier 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 frenchbsetup
y 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 tikz
se 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 \dospecials
que almacena caracteres "especiales" y babel
le 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é.