編寫套件時如何處理 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處理catcodes,但我認為它們必須以某種方式更改為其預設值,通常是12(「其他」)。唯一的方法是 with \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,則為~:;!?。它可能不適合你,但至少我嘗試過

相關內容