命令中的活动字符

命令中的活动字符

我想\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)等等......

相关内容