![命令中的活动字符](https://linux22.com/image/331238/%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%E6%B4%BB%E5%8A%A8%E5%AD%97%E7%AC%A6.png)
我想\forall
触发某种行为(出于以下示例的目的:将文本颜色更改为红色),当(
遇到下一个行为时,该行为将被取消。当(
问题不在命令中时,我可以使其工作,但当问题在命令中时则不行。这是一个 MWE:
\documentclass{article}
\usepackage{color}
\let\oldforall\forall
\renewcommand{\forall}{%
\oldforall%
\color[rgb]{1,0,0}%
\catcode`(=\active%
}
\let\lparen=(
\catcode`(=\active
\renewcommand{(}{%
\color[rgb]{0,0,0}%
\catcode`(=12\relax%
\lparen}%
\catcode`(=12
\newcommand{\acommand}[1]{#1}
\begin{document}
This works: $\forall x(x^2\geq0)$
This doesn't: \acommand{$\forall x(x^2\geq0)$}
\end{document}
我需要一个不涉及改变定义的解决方案\acommand
,因为这必须适用于任何宏(
可能会发现自己处于其中。
我可以理解“激活”作为宏传递的参数中的活动字符问题在于,将(
作为一个被动字符传递给宏,此时将其变为主动字符已经太晚了。但我不明白解决方案,所以我无法将其应用于我的问题。
答案1
当宏获取其参数时,Catcodes 会被冻结。
您可以使用更灵活的“数学激活”概念来制作变体,从而摆脱这种限制。
\documentclass{article}
\usepackage{color}
\usepackage{amsmath}
% added to test compatibility, because it is not generally
% possibly to have a globally (math) active ( with amsmath
% but here activation is done only temporarily
\let\oldforall\forall
\renewcommand{\forall}{%
\oldforall
\color[rgb]{1,0,0}%
\edef\mathcodeofleftparen{\the\mathcode`\(}%
\mathcode`\(="8000
}
\catcode`(=\active
\def({%
\color[rgb]{0,0,0}%
\mathcode`\(=\mathcodeofleftparen\relax
\string(}
\catcode`(=12
\newcommand{\acommand}[1]{#1}
\begin{document}
This works: $\forall x(x^2\geq0), \forall y(y^3\leq0)$
This too: \acommand{$\forall x(x^2\geq0), \forall y(y^3\leq0)$}
By the way, spacing does not look ideal.
\end{document}
\forall
如果总是系统地与 一起使用,那么还可以设想将其重新定义为分隔宏(
。
但是,无论是分隔宏还是上述代码中的方法都不允许出现类似的事情 \forall x \left(...
。因此,我建议采用一种基于合适标记的更简单的方法,例如
\newcommand*{\cforall}[1]{\forall\color[rgb]{1,0,0}#1\color[rgb]{0,0,0}}
用作\cforall {x}(stuff)
, 或\cforall x\left(stuff\right)
等等......