编写包时如何处理 babel 活动字符?

编写包时如何处理 babel 活动字符?

bodeplot包中,我使用定义了新的环境(这样定义是为了避免tikz图形外部化的问题)

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

我希望用户能够使用新环境来做这样的事情

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

所有这些对于英语文档都有效。但是,如果用户使用babel任何使某些字符处于#4活动状态的语言,则无法编译该文档。例如,如果我添加

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

回到序言,我收到编译错误。

我设法让它适用于法语工作,通过检查frenchbsetup和使用

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

如果检测到的话。但是,对每种语言中的每个活动字符都执行类似的操作似乎是解决此问题的错误方法。

有没有更好的方法检测和管理此类宏中的活动字符,并且适用于所有支持的语言babel

答案1

我不确定如何tikz处理 catcode,但我推测它们必须以某种方式更改为默认值,通常是 12(“其他”)。唯一的方法是使用\shorthandoff(或使用低级别\catcode)。

但是,也许以下想法对您有用:有一个名为\dospecials存储“特殊”字符的宏,并babel在其中添加简写。由于它们存储为宏(即;存储为\;),我们需要一些技巧来获取实际字符。然后我们可以使用\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

这将显示->~:;!?.,如果我们删除 由 添加的字符\show,则为~:;!?。它可能不适合您,但至少我尝试过

相关内容