当我定义一个定义命令的命令时
\def\makefoobar{
\def\foo{foo}
\def\bar{bar}
}
并在其前面加上\global
{ \global\makefoobar }
它被当作
{
\global\def\foo{foo}
\def\bar{bar}
}
仅将效果保留\global
到第一个定义,或者更准确地说,的第一个标记\makefoobar
,这可能是定义,也可能不是。
有没有办法定义,\makefoobar
以便像\global
或这样的修饰符\long
会影响其中定义的所有宏,或者我只能定义一个全局替代命令\gmakefoobar
?
答案1
你可以使用
{ \globaldefs=1 \makefoobar }
当 为非零时,所有赋值都是全局的\globadefs
。但请注意,设置会导致很多问题,请谨慎使用。
答案2
\def\makefoobar#1{%
#1\def\foo{foo}%
#1\def\bar{bar}%
}
现在您可以使用
\makefoobar{}
\makefoobar{\global}
\makefoobar{\global\long}
或所有其他组合。
前缀\global
、\long
和\outer
(\protected
仅当引擎使用 e-TeX 扩展时才是最后一个)仅适用于下一个标记,并且它们会进行扩展,因为它们后面必须跟有正确的标记。
我们可以添加一个抽象层。
\def\multipledef#1#2{%
\def#1##1{\def\prefixes{##1}#2}%
}
\def\pdef{\prefixes\def}
\multipledef\makefoobar{%
\pdef\foo{foo}%
\pdef\bar{bar}%
}
% tests follow
\makefoobar{}
\show\foo\show\bar
{\makefoobar{\global\long}}
\show\foo\show\bar
\makefoobar{\protected}
\show\foo\show\bar
这是终端上的会话(pdftex
因为 而使用进行编译\protected
):
> \foo=macro:
->foo.
l.12 \show\foo
\show\bar
?
> \bar=macro:
->bar.
l.12 \show\foo\show\bar
?
> \foo=\long macro:
->foo.
l.15 \show\foo
\show\bar
?
> \bar=\long macro:
->bar.
l.15 \show\foo\show\bar
?
> \foo=\protected macro:
->foo.
l.18 \show\foo
\show\bar
?
> \bar=\protected macro:
->bar.
l.18 \show\foo\show\bar
?