Wenn ich die Wirkung eines Befehls oder einer Redefinition begrenzen will, sofern das geht und wenn eine vorhandene Umgebung das nicht eh schon begrenzt, dann benutze ich geschweifte Klammern:

{\befehl
... % Text und Befehle
}% hier wirkt \befehl nicht mehr

Nun sehe ich im Code von anderen oft

\begingroup
...
\endgroup

oder

\bgroup
...
\egroup

Was sind die Unterschiede? Falls es Unterschiede gibt, in welchen Situationen sollte man die jeweilige Syntax verwenden?

gefragt 28 Jun '13, 10:26

Felix's gravatar image

Felix
1.3k225366
Akzeptiert: 89%

\begingroup und \endgroup sind TeX primitives, die eine Gruppe öffnen bzw. schließen, während \bgroup und \egroup im LaTeX Kernel (auch im plain Format) folgendermaßen definiert sind: \let\bgroup={ \let\egroup=}

(28 Jun '13, 10:42) Clemens

Die genannten \let Assignments stehen in Zeile 517 von plain.tex und in Zeile 78 (und nochmal in den Zeilen 443 und 444) von latex.ltx.

(28 Jun '13, 11:23) Clemens

In einigen Situationen kann man bgroup und egroup auch als Ersatz für { ... } verwenden. Das Beispiel mit hbox{...}, aber auch hboxbgroup ... egroup ist ja schon in der Antwort.

Außerdem geht auch toks0=bgroup ... }, aber hier nur die öffnende Klammer. Aber diese Spitzfindigkeiten sprengen die Antworten auf diese Frage, oder?

(28 Jun '13, 15:07) bernd

@Bernd: Ich denke nicht. Wir können natürlich auch Spitzfindigkeiten angeben. Habe u.a. mit meinen letzten zwei Aufzählungspunkten versucht, welche zu benennen.

(28 Jun '13, 15:51) Marco Daniel

Wie du richtig gesagt hast, erlauben alle drei Paare Gruppen zu erstellen.

Alle nachstehende Beispiele sind mit plain TeX zu übersetzen.

Es gibt aber gewisse Besonderheiten. So kannst du { und \egroup kombinieren:

{\bf Hallo \egroup Welt!
\bye

Diese Kombination ist mittels \begingroup und \endgroup nicht möglich.

Zudem können als Argumentklammern { sowie \bgroup genutzt werden. Dies zeigt folgendes Beispiel:

\setbox0=\hbox\bgroup \bf Hallo \egroup
\setbox0=\hbox{\unhbox0 Welt}
\box0
\bye

Somit sind auch makroübergreifende Gruppen möglich, was weder durch {} noch \begingroup erreicht werden kann. Das nachstehendes Beispiel zeigt dieses:

\def\startbox{\setbox0=\hbox\bgroup}
\def\endbox{\egroup\par Die Ausgabe: \box0}

\startbox
  Hallo Welt
\endbox
\bye

Natürlich kann aber \begingroup und \endgroup in den genannten Anweisungen verwendet werden:

\def\startbox{\begingroup\setbox0=\hbox\bgroup}
\def\endbox{\egroup\par Die Ausgabe: \box0\endgroup}

\startbox
  Hallo Welt
\endbox
\bye

Insgesamt lässt sich also festhalten, dass {...} und \bgroup...\egroup Argumente gruppieren können.

Die Anweisungen \begingroup...\endgroup erzeugen einen Block, und zu jedem \begingroup muss ein \endgroup existieren.

Besonderheiten:

  • Beachte bitte, dass \def\foobar\bgroup und \def\foobar{ verschieden sind.
  • \begingroup ändert nichts an Eigenschaften, wie folgendes Beispiel zeigt:

    $$ 1\bgroup+\egroup1=x$$
    
    $$ 1\begingroup+\endgroup1=x$$
    \bye
    

Aufgrund der Eindeutigkeit der Korrespondenz von \begingroup und \endgroup rate ich zu diesen Anweisungen. Die Kombination von \bgroup...\egroup bzw. {} sollte man nur anwenden, wenn man sie auch wirklich braucht.

Permanenter link

beantwortet 28 Jun '13, 10:45

Marco%20Daniel's gravatar image

Marco Daniel
24015

bearbeitet 04 Jul '13, 12:56

Vielen Dank für die tolle Erklärung! Ich ziehe also \begingroup vor und behalte im Kopf, dass \bgroup auch diese Besonderheit hat, über Makros hinweg gruppieren zu können.

(05 Jul '13, 04:45) Felix
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×2

Frage gestellt: 28 Jun '13, 10:26

Frage wurde angeschaut: 8,124 Mal

Zuletzt aktualisiert: 05 Jul '13, 04:48

Verwandte Fragen