我们已经讨论了这个问题“什么时候可以使用隐式括号代替显式括号?”;这立即让我想到一个问题:“为什么人们会想要这样做?”
(请记住,隐式括号例如\bgroup
和\egroup
如纯 TeX 中的代码所定义\let\bgroup={ \let\egroup=}
。)
我想这基本上与“什么时候必须使用隐式括号而不是显式括号?”这个问题相同。
答案1
TeXbook 的附录 E 中有一个很好的例子,其中描述了一种信件格式。下面是几行可能的信件:
\address
Prof.~Brian~K. Reid
Department of Electrical Engineering
Stanford University
Stanford, CA 94305
\body
其中,\address
和\body
定义如下:
\def\address{\beginlinemode\getaddress}
{\obeylines\gdef\getaddress #1
#2
{#1\gdef\addressee{#2}%
\global\setbox\theaddress=\vbox\bgroup\raggedright%
\hsize=\longindentation \everypar{\hangindent2em}#2
\def\endmode{\egroup\endgroup \copy\theaddress \bigskip}}}
\def\body{\beginparmode}
\def\beginparmode{\endmode
\begingroup\parskip=\medskipamount
\def\endmode{\par\endgroup}}
请主要关注\vbox\bgroup
in\getaddress
和通过via调用的\egroup
in 。发生的事情是开始一个,然后以(或任何其他调用)的出现结束。这样构造的框可以“在信件中和信封上的标签中使用”,正如 Knuth 解释的那样。\endmode
\beginparmode
\body
\address
\vbox
\body
\endmode
答案2
例如,你可以这样做:
\def\blah{\bgroup\bf}
\def\bloh{\egroup}
not bold \blah bold\bloh not bold
这样做:
\def\blah{{\bf}
\def\bloh{}}
就会有完全不同的结果。
答案3
除了无数其他用途之外,它还提供了一种方便的方法,用于将段落存储在框中以供以后处理。
\newbox\savedparbox
\def\saveparbox{\par\begingroup
\def\par{\egroup\endgroup}
\global\setbox\savedparbox\vbox\bgroup}
Ordinary paragraph.
\saveparbox
This paragraph will be saved in \string\box\string\savedparbox.
If you wish, you can unpack the box and do all kinds of processing on it.
In this demo, I won't do any processing.
Look in the log file to examine the box contents.
\showboxdepth=99
\showboxbreadth=999
\showbox\savedparbox
Another ordinary paragraph.
\bye
答案4
在宏内部,\bgroup
有时有助于提高可读性:
\def\IntroEntry#1#2%
{\blank[line]
\begingroup
\setupalign[right]
\setuptolerance[verytolerant]
\setupindenting[no]
\switchtobodyfont[9pt]
\ss
\begingroup
\bf #1\par
\endgroup
#2\par
\endgroup }
(括号太多的话我就会感到困惑)