diff --git a/doc/lfun/AddExit b/doc/lfun/AddExit
index 9942ef3..384975f 100644
--- a/doc/lfun/AddExit
+++ b/doc/lfun/AddExit
@@ -1,91 +1,114 @@
+
 AddExit()
-FUNKTION:
-     void AddExit(string|string* cmd, closure|string dest);
+*********
 
-DEFINIERT IN:
-     /std/room/exits
 
-ARGUMENTE:
-     string/string* cmd
-          die Richtung(en), in die der Ausgang fuehrt
-     string/closure dest
-          das Ziel des Ausgangs mit Text/Closure
+FUNKTION
+========
 
-BESCHREIBUNG:
+   void AddExit(string|string* cmd, closure|string dest);
 
-     Es wird ein Ausgang in die Richtung(en) cmd eingefuegt. Die Art des
-     Ausgangs haengt ab von dest:
 
-     - ein String:
-       - mit einem Dateinamen:
-         Der Ausgang fuehrt in den Raum, den der Dateiname bezeichnet.
-       - der Form "<msg>#dateiname"
-         Der Ausgang fuehrt in den Raum, den der Dateiname bezeichnet,
-         bei der Benutzung wird jedoch statt "<name> geht nach <richtung>"
-         "<name> geht nach <msg>" ausgegeben.
-     - eine Closure:
-       Die Closure wird bei Nutzung des Ausgangs aufgerufen. Das entspricht
-       eine SpecialExit - in der gerufenen Funktion muss man den Spieler
-       selbst in den Zielraum bewegen.
-       Gegebenenfalls kann das durch AddCmd() ersetzt werden.
+DEFINIERT IN
+============
 
-BEMERKUNGEN:
-     Man kann fuer den Dateinamen des Zielraumes auch einen relativen Pfad
-     angeben. Die Auswertung erfolgt nach folgendem Schema:
-     - "./<dateiname>"
-       Es wird ein Zielraum relativ zum gleichen Verzeichnis wie dieser
-       Raum angesprochen.
-     - "../<dateiname>"
-       Es wird ein Zielraum relativ zur Verzeichnisebene ueber der
-       dieses Raumes angesprochen (analog mit mehrerern "../..")
+   /std/room/exits
 
-     Mittels P_HIDE_EXITS kann man Ausgaenge verstecken.
 
-     Bei der Benutzung eines Ausgangs wird der Hook H_HOOK_EXIT_USE
-     ausgeloest.
+ARGUMENTE
+=========
 
-BEISPIELE:
-     ### normale Ausgaenge ###
-     // Beim Kommando "sueden" kommt: "<name> geht nach Sueden."
-     AddExit("sueden", "/gilden/abenteurer");
+   string/string* cmd
+        die Richtung(en), in die der Ausgang fuehrt
+   string/closure dest
+        das Ziel des Ausgangs mit Text/Closure
 
-     // Beim Kommando "sueden" kommt: "<name> geht in die Gilde."
-     AddExit("sueden", "in die Gilde#/gilden/abenteurer");
 
-     ### Ausgaenge mit relativen Pfaden ###
-     // Der Name des Raumes sei "/d/inseln/wargon/hafen1"
-     // Dieser Ausgang geht nach "/d/inseln/wargon/kneipe":
-     AddExit("norden", "./kneipe" );
+BESCHREIBUNG
+============
 
-     // Und dieser nach "/d/inseln/anthea/anlege":
-     AddExit("sueden", "../anthea/anlege" );
+   Es wird ein Ausgang in die Richtung(en) cmd eingefuegt. Die Art des
+   Ausgangs haengt ab von dest:
 
-     ### dynamische Ausgaenge ###
-     // ein Ausgang soll nur von Froeschen benutzbar sein:
+   - ein String:
+     - mit einem Dateinamen:
+       Der Ausgang fuehrt in den Raum, den der Dateiname bezeichnet.
+     - der Form "<msg>#dateiname"
+       Der Ausgang fuehrt in den Raum, den der Dateiname bezeichnet,
+       bei der Benutzung wird jedoch statt "<name> geht nach <richtung>"
+       "<name> geht nach <msg>" ausgegeben.
+   - eine Closure:
+     Die Closure wird bei Nutzung des Ausgangs aufgerufen. Das entspricht
+     eine SpecialExit - in der gerufenen Funktion muss man den Spieler
+     selbst in den Zielraum bewegen.
+     Gegebenenfalls kann das durch AddCmd() ersetzt werden.
 
-     static int lochfkt(string dir);		// Prototyp
-     ...
-     AddExit("loch", #'lochfkt);
-     // auch identisch zu:
-     // AddSpecialExit("loch", #'lochfkt); [eine Closure] oder
-     // AddSpecialExit("loch", "lochfkt"); [ein Funktionsname]
 
-     static int lochfkt(string dir) {
-       if (!(this_player()->QueryProp(P_FROG))) {
-         // Kein Frosch => passt nicht!
-         notify_fail("Du bist zu gross!\n");
-         return 0;
-       }
-       // Meldungen werden im move() gleich mitgegeben
-       return this_player()->move("/room/loch", M_GO, 0,
-                    "huepft ins Loch", "huepft herein");
+BEMERKUNGEN
+===========
+
+   Man kann fuer den Dateinamen des Zielraumes auch einen relativen Pfad
+   angeben. Die Auswertung erfolgt nach folgendem Schema:
+   - "./<dateiname>"
+     Es wird ein Zielraum relativ zum gleichen Verzeichnis wie dieser
+     Raum angesprochen.
+   - "../<dateiname>"
+     Es wird ein Zielraum relativ zur Verzeichnisebene ueber der
+     dieses Raumes angesprochen (analog mit mehrerern "../..")
+
+   Mittels P_HIDE_EXITS kann man Ausgaenge verstecken.
+
+   Bei der Benutzung eines Ausgangs wird der Hook H_HOOK_EXIT_USE
+   ausgeloest.
+
+
+BEISPIELE
+=========
+
+   ### normale Ausgaenge ###
+   // Beim Kommando "sueden" kommt: "<name> geht nach Sueden."
+   AddExit("sueden", "/gilden/abenteurer");
+
+   // Beim Kommando "sueden" kommt: "<name> geht in die Gilde."
+   AddExit("sueden", "in die Gilde#/gilden/abenteurer");
+
+   ### Ausgaenge mit relativen Pfaden ###
+   // Der Name des Raumes sei "/d/inseln/wargon/hafen1"
+   // Dieser Ausgang geht nach "/d/inseln/wargon/kneipe":
+   AddExit("norden", "./kneipe" );
+
+   // Und dieser nach "/d/inseln/anthea/anlege":
+   AddExit("sueden", "../anthea/anlege" );
+
+   ### dynamische Ausgaenge ###
+   // ein Ausgang soll nur von Froeschen benutzbar sein:
+
+   static int lochfkt(string dir);            // Prototyp
+   ...
+   AddExit("loch", #'lochfkt);
+   // auch identisch zu:
+   // AddSpecialExit("loch", #'lochfkt); [eine Closure] oder
+   // AddSpecialExit("loch", "lochfkt"); [ein Funktionsname]
+
+   static int lochfkt(string dir) {
+     if (!(this_player()->QueryProp(P_FROG))) {
+       // Kein Frosch => passt nicht!
+       notify_fail("Du bist zu gross!\n");
+       return 0;
      }
+     // Meldungen werden im move() gleich mitgegeben
+     return this_player()->move("/room/loch", M_GO, 0,
+                  "huepft ins Loch", "huepft herein");
+   }
 
-SIEHE AUCH:
-     AddSpecialExit(), GetExits(),
-     RemoveExit(), RemoveSpecialExit(),
-     GuardExit(),
-     H_HOOK_EXIT_USE, P_EXITS, P_HIDE_EXITS, /std/room/exits.c
-     ausgaenge
+
+SIEHE AUCH
+==========
+
+   AddSpecialExit(), GetExits(),
+   RemoveExit(), RemoveSpecialExit(),
+   GuardExit(),
+   H_HOOK_EXIT_USE, P_EXITS, P_HIDE_EXITS, /std/room/exits.c
+   ausgaenge
 
 Letzte Aenderung: 22.12.2016, Bugfix
