diff --git a/doc/lfun/MaterialName b/doc/lfun/MaterialName
index 0e338a3..782a9f7 100644
--- a/doc/lfun/MaterialName
+++ b/doc/lfun/MaterialName
@@ -1,72 +1,96 @@
+
 MaterialName()
-FUNKTION:
-     varargs string MaterialName(string mat, int casus, mixed idinf)
+**************
 
-DEFINIERT IN:
-     /p/daemon/materialdb.c (MATERIALDB)
 
-ARGUMENTE:
-     string mat	 - das zu erkennende Material
-     int casus	 - der Fall
-     mixed idinf - Dinge, welche die Faehigkeiten des Erkennens beeinflussen
-		   (siehe "man MaterialList")
+FUNKTION
+========
 
-BESCHREIBUNG:
-     Diese Funktion sucht unter Beruecksichtigung der Erkennungsbe-
-     schraenkungen des Materials und Faehigkeiten des Spielers den
-     Klarnamen des Materials heraus und gibt den zurueck.
+   varargs string MaterialName(string mat, int casus, mixed idinf)
 
-RUECKGABEWERT:
-     string: Materialname oder genereller Name.
 
-BEISPIELE:
-     // der hier mag alle existierenden Juwelen, auch wenn welche ergaenzt
-     // werden sollten
-     // Parameter: 1. ein Juwel, 2. Casus, 3. 100% Erkennung - ob er sie
-     // beim Empfang dann auch zu 100% erkennt, steht hier nicht!
-     string* likeit;
-     likeit=MATERIALDB->GetGroupMembers(MATGROUP_JEWEL);
-     ...
-     write("Der Alte sagt: Ich mag "+
-	   MATERIALDB->MaterialName(likeit[random(sizeof(likeit))], WEN, 100)+
-	   ".\n");
-     ...
+DEFINIERT IN
+============
 
-     // ein weiser schmied:
-     int i;
-     string *mat, mname, mgroup;
-     mat=m_indices(ob->queryprop(p_material));
-     i=sizeof(mat);
+   /p/daemon/materialdb.c (MATERIALDB)
 
-     write("der schmied sagt: "+ob->name(wer)+" besteht aus ...\n");
-     while(i--) {
-      // den namen erkennen/aussprechen:
-      // materialien werden allgemein ganz schlecht erkannt (zu 5%), aber
-      // alles aus metall wird zu +100% gut erkannt ...
-      mname=materialdb->materialname(mat[i], wer,
-	     ({5, ([material_symmetric_recognizability:
-			({matgroup_metal, 100})])}));
 
-      // und nur metalle analysieren ...
-      if(materialdb->materialgroup(([mat[i]:100]),matgroup_metal)>=100) {
-       int j;
-       string *mgr;
-       mgr=materialdb->getmatmembership(mat[i]);
-       j=sizeof(mgr);
-       mgroup=" gehoert zu ";
-       while(j--) {
-        mgroup+=materialdb->groupname(mgr[j]);
-        if(j>0) mgroup+=", ";
-       }
-      } else mgroup=" kenne ich nicht";
-      printf("%-12.12s: %s\n",mname, mgroup);
+ARGUMENTE
+=========
+
+   string mat  - das zu erkennende Material
+   int casus   - der Fall
+   mixed idinf - Dinge, welche die Faehigkeiten des Erkennens beeinflussen
+                 (siehe "man MaterialList")
+
+
+BESCHREIBUNG
+============
+
+   Diese Funktion sucht unter Beruecksichtigung der Erkennungsbe-
+   schraenkungen des Materials und Faehigkeiten des Spielers den
+   Klarnamen des Materials heraus und gibt den zurueck.
+
+
+RUECKGABEWERT
+=============
+
+   string: Materialname oder genereller Name.
+
+
+BEISPIELE
+=========
+
+   // der hier mag alle existierenden Juwelen, auch wenn welche ergaenzt
+   // werden sollten
+   // Parameter: 1. ein Juwel, 2. Casus, 3. 100% Erkennung - ob er sie
+   // beim Empfang dann auch zu 100% erkennt, steht hier nicht!
+   string* likeit;
+   likeit=MATERIALDB->GetGroupMembers(MATGROUP_JEWEL);
+   ...
+   write("Der Alte sagt: Ich mag "+
+         MATERIALDB->MaterialName(likeit[random(sizeof(likeit))], WEN, 100)+
+         ".\n");
+   ...
+
+   // ein weiser schmied:
+   int i;
+   string *mat, mname, mgroup;
+   mat=m_indices(ob->queryprop(p_material));
+   i=sizeof(mat);
+
+   write("der schmied sagt: "+ob->name(wer)+" besteht aus ...\n");
+   while(i--) {
+    // den namen erkennen/aussprechen:
+    // materialien werden allgemein ganz schlecht erkannt (zu 5%), aber
+    // alles aus metall wird zu +100% gut erkannt ...
+    mname=materialdb->materialname(mat[i], wer,
+           ({5, ([material_symmetric_recognizability:
+                      ({matgroup_metal, 100})])}));
+
+    // und nur metalle analysieren ...
+    if(materialdb->materialgroup(([mat[i]:100]),matgroup_metal)>=100) {
+     int j;
+     string *mgr;
+     mgr=materialdb->getmatmembership(mat[i]);
+     j=sizeof(mgr);
+     mgroup=" gehoert zu ";
+     while(j--) {
+      mgroup+=materialdb->groupname(mgr[j]);
+      if(j>0) mgroup+=", ";
      }
+    } else mgroup=" kenne ich nicht";
+    printf("%-12.12s: %s\n",mname, mgroup);
+   }
 
-SIEHE AUCH:
-     Konzepte:	  material, materialerkennung
-     Grundlegend: P_MATERIAL, /sys/thing/material.h
-     Master:	  AddMaterial(), ConvMaterialList(), MaterialGroup(),
-		  GroupName()
-		  GetGroupMembers(), GetMatMembership()
 
-7. Mai 2004 Gloinson
\ No newline at end of file
+SIEHE AUCH
+==========
+
+   Konzepte:    material, materialerkennung
+   Grundlegend: P_MATERIAL, /sys/thing/material.h
+   Master:      AddMaterial(), ConvMaterialList(), MaterialGroup(),
+                GroupName()
+                GetGroupMembers(), GetMatMembership()
+
+7. Mai 2004 Gloinson
