如果我做
\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 的设置:如果加载了 cleveref前catcode 重新定义可以很好地加载,但如果在以下情况下加载则不行:
\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}