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, 16:26

Felix's gravatar image

Felix
1.3k525666
Akzeptiert-Rate: 47%

\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, 16:42) cgnieder

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, 17:23) cgnieder

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, 21: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, 21:51) Marco_D

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, 16:45

Marco_D's gravatar image

Marco_D
43015
Akzeptiert-Rate: 36%

bearbeitet 04 Jul '13, 18: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, 10:45) Felix
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×2

gestellte Frage: 28 Jun '13, 16:26

Frage wurde gesehen: 24,222 Mal

zuletzt geändert: 05 Jul '13, 10:48

verwandte Fragen