+<functions>
+<function name="informaltable">
+<![CDATA[
+# eval colums
+(ctl,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # reads tgroup
+if elem != "tgroup":
+ raise RuntimeError("unknown elem, <tgroup> expected in <informaltable>: "+elem)
+cols = int(attrs["cols"])
+colsep = ""
+if attrs["colsep"] == "1":
+ colsep = "|"
+rowsep = False
+if attrs["rowsep"] == "1":
+ rowsep = True
+align = "r"
+if attrs["align"] == "left":
+ align = "l"
+out = r"\begin{tabular}{" + (cols-1)*(align+colsep) + align + "}\n"
+(ctl,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # searches tbody
+while ctl != XMLE.EC_END:
+ if elem == "tbody": # tbody found
+ (ctl1,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # reads row
+ while ctl1 != XMLE.EC_END:
+ if elem != "row":
+ raise RuntimeError("Only <row> expected in <tbody>: "+elem)
+ (ctl2,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # reads entry
+ entry_sep = ""
+ while ctl2 != XMLE.EC_END:
+ if elem != "entry":
+ raise RuntimeError("Only <entry> expected in <row>: "+elem)
+ out += entry_sep + value
+ entry_sep = " & "
+ (ctl2,elem, value, attrs) = source.extractElement(ctl2) # reads entry
+ out += r" \\" + "\n"
+ (ctl1,elem, value, attrs) = source.extractElement(ctl1) # reads row
+ out += r"\end{tabular}"
+ (ctl,elem, value, attrs) = source.extractElement(ctl) # searches tbody
+]]></function>
+</functions>
+<global>
+<informaltable exec="informaltable"/>
+</global>