重新扫描以激活:错误:参数必须连续编号

重新扫描以激活:错误:参数必须连续编号

如果我做

\documentclass[]{article}
\usepackage{tikz-cd}
\begin{document}

\ExplSyntaxOn
\NewDocumentCommand{\zxNoExt}{O{}+m}{% Warning, expl syntax removes space.
  \tl_rescan:nn { \char_set_catcode_active:N \& } { \begin{tikzcd}[#1] #2 \end{tikzcd} }
}
\ExplSyntaxOff


\zxNoExt[
/utils/exec={
  \def\foo#1{Hey #1 !}
},
]{
  \foo{green} & \foo{red}
  %%% I would like this to work as well:
  % & |[foo/.style={color=#1}, foo=red]| Hey
}

\end{document}

ERROR: Parameters must be numbered consecutively. ##然后,由于 ,这将失败并出现错误\def\foo#1。我猜想重新扫描会以一种奇怪的方式解释符号#,但我不确定如何以干净的方式修复此问题。理想情况下,如果可能的话,我更希望解决方案是 LaTeX3。

编辑

由于使用了全局 catcode 重新定义,当前的答案并没有真正解决我的问题。我更希望找到一个没有全局更改的解决方案,因为我非常担心意外的错误。例如,这里有一个例子,展示了这种更改如何弄乱 cleveref + split 的设置:如果加载了 cleverefcatcode 重新定义可以很好地加载,但如果在以下情况下加载则不行:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}    
\usepackage{amsmath}
\usepackage{amssymb}

\usepackage{tikz}
% Does not work if loaded here:
\let\fooamp&
\catcode`&\active
\let&\fooamp

\ExplSyntaxOn
\NewDocumentCommand{\zxNoExt}{O{}+m}{% Warning, expl syntax removes space.
  \begin{tikzcd}[#1] #2 \end{tikzcd} 
}
\ExplSyntaxOff

\usepackage[nameinlink]{cleveref}
% Does work if loaded here:
% \usetikzlibrary{quantikz}

\begin{document}

 \begin{equation}
     \begin{split}
       a=&1+1
     \end{split}
 \end{equation}

\end{document}

所以我真的想避免甚至问自己在全球范围内改变这些选项是否安全。

全局选项可能导致问题的另一个例子是,如果另一个包实际上撤消了我的 catcode 更改。

答案1

您可以使用较慢的例程,将\regex_replace_all:nnN每个&标记(任何类别代码)更改为活动标记&

\documentclass[]{article}
\usepackage{tikz-cd}
\begin{document}

\ExplSyntaxOn
\NewDocumentCommand{\zxNoExt}{O{}+m}
 {% Warning, expl syntax removes space.
  \tl_set:Nn \l_tmpa_tl { \begin{tikzcd}[#1] #2 \end{tikzcd} }
  \regex_replace_all:nnN { \& } { \cA\& } \l_tmpa_tl
  \tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff


\zxNoExt[
/utils/exec={
  \def\foo#1{Hey #1 !}
},
]{
  \foo{green} & \foo{red}
  & |[foo/.style={color=#1}, foo=red]| Hey
}

\end{document}

在此处输入图片描述

答案2

我认为我会让&全球活跃起来

\documentclass[]{article}
\usepackage{tikz-cd}
\let\fooamp&
\catcode`&\active
\let&\fooamp
\begin{document}

\ExplSyntaxOn
\NewDocumentCommand{\zxNoExt}{O{}+m}{% Warning, expl syntax removes space.
  \begin{tikzcd}[#1] #2 \end{tikzcd} 
}
\ExplSyntaxOff


\zxNoExt[
/utils/exec={
  \def\foo#1{Hey #1 !}
},
]{
  \foo{green} & \foo{red}
  %%% I would like this to work as well:
   & |[foo/.style={color=#1}, foo=red]| Hey
}

\end{document}

相关内容