[comp.text.tex] How to include unbalanced brackets `}' in macro substitution?

kirkaas@oahu.cs.ucla.edu (paul kirkaas) (02/05/91)

I want to define macros that end a group, doing a few cleanup chores in
the process --- for example, a \beginvcenter \endvcenter pair to center
text vertically in a page.

I would like to find a way to either:
1) Include a closing brace `}' as part of the macro substitution
    or
2) Figure out how to properly use \begingroup & \endgroup to achieve the
same end.

I have defined a macro \vcenter{ *TEXT* } that will vertically 
center the argument text within the brackets as follows:

\long\def\page{\vbox to\vsize \relax}
\long\def\vcenter#1{\page{\vfil #1 \vfil}}


What I want to do is define two macros \beginvcenter & \endvcenter
which allow me to say:

\beginvcenter
   *TEXT*
\endvcenter

and I don't know how.

-- 
Paul Kirkaas
kirkaas@cs.ucla.edu

ogawa@orion.arc.nasa.gov (Arthur Ogawa) (02/05/91)

You want to define as follows:

\long\def\beginvcenter{\vbox to\vsize\bgroup\vfil}%
\def\endvcenter{\vfil\egroup}%

THen you can write:

\beginvcenter
   *TEXT*
\endvcenter

Be careful: the resulting box will always require a page of its own!

Cheers,
Art Ogawa

eijkhout@s41.csrd.uiuc.edu (Victor Eijkhout) (02/06/91)

kirkaas@oahu.cs.ucla.edu (paul kirkaas) writes:

>I want to define macros that end a group, doing a few cleanup chores in
>the process --- for example, a \beginvcenter \endvcenter pair to center
>text vertically in a page.

>I would like to find a way to either:
>1) Include a closing brace `}' as part of the macro substitution
>    or
>2) Figure out how to properly use \begingroup & \endgroup to achieve the
>same end.

Boxes can be opened/closed by braces or by `implicit braces':
tokens that are \let to a brace.
Because of the definitions \let\bgroup{ \let\egroup}
(l)plain.tex, you can write \hbox\bgroup ... \egroup,
and you can do that with macros:
\def\beginbox{\hbox\bgroup}
\def\endbox{\egroup}

The \begingroup/\endgroup commands cannot be interchanged
with {} or \bgroup/\egroup. But they do define a group
in which changes are local. You can use them therefore
as some sort of runtime error checking:
they will not be matched accidentally with braces
or \bgroup/\egroup tokens appearing.

Victor.