
Im bodeplot
Paket habe ich neue Umgebungen definiert mit (so definiert, um Probleme mit der Externalisierung von tikz
Grafiken zu vermeiden)
\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}
}{}
Ich möchte, dass Benutzer die neue Umgebung nutzen können, um Dinge wie diese zu tun
\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}
Dies alles funktioniert für englischsprachige Dokumente. Wenn ein Benutzer jedoch babel
eine Sprache verwendet, die bestimmte Zeichen aktiviert #4
, kann das Dokument nicht kompiliert werden. Wenn ich beispielsweise hinzufüge
\usepackage[french]{babel}
\usetikzlibrary{babel}
zur Präambel, ich bekomme Kompilierungsfehler.
Ich habe es geschafft, es für die Arbeit in französischer Sprache zum Laufen zu bringen, indem ich nachgesehen frenchbsetup
und verwendet habe
\AddToHook{env/MyEnv/begin}{\shorthandoff{;:!?}}
wenn es erkannt wird. So etwas für jedes aktive Zeichen in jeder Sprache zu tun, scheint jedoch der falsche Ansatz zur Lösung dieses Problems zu sein.
Gibt es eine bessere Möglichkeit, aktive Zeichen in Makros wie diesem zu erkennen und zu verwalten, die mit allen von unterstützten Sprachen funktioniert babel
?
Antwort1
Ich bin nicht sicher, wie tikz
das mit Catcodes funktioniert, aber ich nehme an, dass sie irgendwie auf ihre Standardwerte geändert werden müssen, normalerweise 12 ('andere'). Und die einzige Möglichkeit ist mit \shorthandoff
(oder mit dem niedrigen Level \catcode
).
Vielleicht funktioniert jedoch die folgende Idee für Sie: Es gibt ein Makro namens , das \dospecials
„spezielle“ Zeichen speichert und babel
Kurzzeichen hinzufügt. Da sie als Makros gespeichert werden (d. h. ;
als gespeichert werden \;
), benötigen wir einen Trick, um das eigentliche Zeichen zu erhalten. Dann können wir verwenden \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
Dies zeigt ->~:;!?.
, was, wenn wir die von hinzugefügten Zeichen entfernen \show
, ist ~:;!?
. Es funktioniert vielleicht nicht für Sie, aber zumindest habe ich es versucht