什么时候使用隐式括号而不是显式括号会更有帮助?

什么时候使用隐式括号而不是显式括号会更有帮助?

我们已经讨论了这个问题“什么时候可以使用隐式括号代替显式括号?”;这立即让我想到一个问题:“为什么人们会想要这样做?”

(请记住,隐式括号例如\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\bgroupin\getaddress和通过via调用的\egroupin 。发生的事情是开始一个,然后以(或任何其他调用)的出现结束。这样构造的框可以“在信件中和信封上的标签中使用”,正如 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 }

(括号太多的话我就会感到困惑)

相关内容