自己的命令如何意识到 \global?

自己的命令如何意识到 \global?

当我定义一个定义命令的命令时

\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

? 

相关内容