Adjustments to allow elements with subelements as parameters.  This is
used to deal with the table headings and entries.

An additional flag in the element table is used to indicate elements
which have no "general" content, but which do have subelement
content.  These must be flagged distinctly from empty elements.
Currently used for \lineii, \lineiii, and \lineiv.
diff --git a/Doc/tools/sgmlconv/latex2esis.py b/Doc/tools/sgmlconv/latex2esis.py
index 4a86747..4369c5f 100755
--- a/Doc/tools/sgmlconv/latex2esis.py
+++ b/Doc/tools/sgmlconv/latex2esis.py
@@ -2,8 +2,6 @@
 
 """Generate ESIS events based on a LaTeX source document and configuration
 data.
-
-
 """
 __version__ = '$Revision$'
 
@@ -16,6 +14,9 @@
 from esistools import encode
 
 
+DEBUG = 0
+
+
 class Error(Exception):
     pass
 
@@ -40,19 +41,30 @@
 ESCAPED_CHARS = "$%#^ {}&~"
 
 
-def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
+def pushing(name, point, depth):
+    if DEBUG:
+        sys.stderr.write("%s<%s> at %s\n" % (" "*depth, name, point))
+
+def popping(name, point, depth):
+    if DEBUG:
+        sys.stderr.write("%s</%s> at %s\n" % (" "*depth, name, point))
+
+
+def subconvert(line, ofp, table, discards, autoclosing, endchar=None, depth=0):
+    if DEBUG and endchar:
+        sys.stderr.write("subconvert(%s, ..., endchar=%s)\n"
+                         % (`line[:20]`, `endchar`))
     stack = []
     while line:
         if line[0] == endchar and not stack:
+            if DEBUG:
+                sys.stderr.write("subconvert() --> %s\n" % `line[1:21]`)
             return line[1:]
         m = _comment_rx.match(line)
         if m:
             text = m.group(1)
             if text:
-                ofp.write("(COMMENT\n")
-                ofp.write("- %s \n" % encode(text))
-                ofp.write(")COMMENT\n")
-                ofp.write("-\\n\n")
+                ofp.write("(COMMENT\n- %s \n)COMMENT\n-\\n\n" % encode(text))
             line = line[m.end():]
             continue
         m = _begin_env_rx.match(line)
@@ -60,7 +72,7 @@
             # re-write to use the macro handler
             line = r"\%s %s" % (m.group(1), line[m.end():])
             continue
-        m =_end_env_rx.match(line)
+        m = _end_env_rx.match(line)
         if m:
             # end of environment
             envname = m.group(1)
@@ -75,8 +87,9 @@
             elif envname == stack[-1]:
                 ofp.write(")%s\n" % envname)
                 del stack[-1]
+                popping(envname, "a", len(stack) + depth)
             else:
-                print stack
+                sys.stderr.write("stack: %s\n" % `stack`)
                 raise LaTeXFormatError(
                     "environment close for %s doesn't match" % envname)
             line = line[m.end():]
@@ -102,20 +115,25 @@
                 while stack[-1] != macroname:
                     if stack[-1] and stack[-1] not in discards:
                         ofp.write(")%s\n-\\n\n" % stack[-1])
+                    popping(stack[-1], "b", len(stack) + depth - 1)
                     del stack[-1]
                 if macroname not in discards:
                     ofp.write("-\\n\n)%s\n-\\n\n" % macroname)
+                popping(macroname, "c", len(stack) + depth - 1)
                 del stack[-1]
             real_ofp = ofp
             if macroname in discards:
                 ofp = StringIO.StringIO()
             #
-            conversion = table.get(macroname, ([], 0, 0, 0))
-            params, optional, empty, environ = conversion
+            conversion = table.get(macroname, ([], 0, 0, 0, 0))
+            params, optional, empty, environ, nocontent = conversion
             if empty:
                 ofp.write("e\n")
+            elif nocontent:
+                empty = 1
             if not numbered:
                 ofp.write("Anumbered TOKEN no\n")
+            opened = 0
             # rip off the macroname
             if params:
                 if optional and len(params) == 1:
@@ -133,13 +151,15 @@
             #
             if optional and type(params[0]) is type(()):
                 # the attribute name isn't used in this special case
+                pushing(macroname, "a", depth + len(stack))
                 stack.append(macroname)
                 ofp.write("(%s\n" % macroname)
                 m = _start_optional_rx.match(line)
                 if m:
                     line = line[m.end():]
                     line = subconvert(line, ofp, table, discards,
-                                      autoclosing, endchar="]")
+                                      autoclosing, endchar="]",
+                                      depth=depth + len(stack))
                 line = "}" + line
                 continue
             # handle attribute mappings here:
@@ -155,6 +175,7 @@
                 elif type(attrname) is type(()):
                     # This is a sub-element; but don't place the
                     # element we found on the stack (\section-like)
+                    pushing(macroname, "b", len(stack) + depth)
                     stack.append(macroname)
                     ofp.write("(%s\n" % macroname)
                     macroname = attrname[0]
@@ -164,10 +185,17 @@
                 elif type(attrname) is type([]):
                     # A normal subelement.
                     attrname = attrname[0]
-                    stack.append(macroname)
-                    stack.append(attrname)
-                    ofp.write("(%s\n" % macroname)
-                    macroname = attrname
+                    if not opened:
+                        opened = 1
+                        ofp.write("(%s\n" % macroname)
+                        pushing(macroname, "c", len(stack) + depth)
+                    ofp.write("(%s\n" % attrname)
+                    pushing(attrname, "sub-elem", len(stack) + depth + 1)
+                    line = subconvert(skip_white(line)[1:], ofp, table,
+                                      discards, autoclosing, endchar="}",
+                                      depth=depth + len(stack) + 2)
+                    popping(attrname, "sub-elem", len(stack) + depth + 1)
+                    ofp.write(")%s\n" % attrname)
                 else:
                     m = _parameter_rx.match(line)
                     if not m:
@@ -191,12 +219,18 @@
                         "non-empty element '%s' has no content: %s"
                         % (macroname, line[:12]))
                 line = line[m.end():]
-            stack.append(macroname)
-            ofp.write("(%s\n" % macroname)
+            if not opened:
+                ofp.write("(%s\n" % macroname)
+                pushing(macroname, "d", len(stack) + depth)
             if empty:
                 line = "}" + line
+            stack.append(macroname)
             ofp = real_ofp
             continue
+        if line[0] == endchar and not stack:
+            if DEBUG:
+                sys.stderr.write("subconvert() --> %s\n" % `line[1:21]`)
+            return line[1:]
         if line[0] == "}":
             # end of macro
             macroname = stack[-1]
@@ -206,10 +240,12 @@
                and type(conversion) is not type(""):
                 # otherwise, it was just a bare group
                 ofp.write(")%s\n" % stack[-1])
+            popping(macroname, "d", len(stack) + depth - 1)
             del stack[-1]
             line = line[1:]
             continue
         if line[0] == "{":
+            pushing("", "e", len(stack) + depth)
             stack.append("")
             line = line[1:]
             continue
@@ -241,10 +277,12 @@
     while stack and stack[-1] in autoclosing:
         ofp.write("-\\n\n")
         ofp.write(")%s\n" % stack[-1])
+        popping(stack[-1], "e", len(stack) + depth - 1)
         del stack[-1]
     if stack:
         raise LaTeXFormatError("elements remain on stack: "
                                + string.join(stack))
+    # otherwise we just ran out of input here...
 
 
 def convert(ifp, ofp, table={}, discards=(), autoclosing=()):
@@ -259,6 +297,12 @@
             raise
 
 
+def skip_white(line):
+    while line and line[0] in " %\n\t":
+        line = string.lstrip(line[1:])
+    return line
+
+
 def main():
     if len(sys.argv) == 2:
         ifp = open(sys.argv[1])
@@ -271,87 +315,93 @@
         sys.exit(2)
     convert(ifp, ofp, {
         # entries have the form:
-        # name: ([attribute names], first_is_optional, empty, isenv)
-        "appendix": ([], 0, 1, 0),
-        "bifuncindex": (["name"], 0, 1, 0),
-        "catcode": ([], 0, 1, 0),
-        "cfuncdesc": (["type", "name", ("args",)], 0, 0, 1),
-        "chapter": ([("title",)], 0, 0, 0),
-        "chapter*": ([("title",)], 0, 0, 0),
-        "classdesc": (["name", ("constructor-args",)], 0, 0, 1),
-        "ctypedesc": (["name"], 0, 0, 1),
-        "cvardesc":  (["type", "name"], 0, 0, 1),
-        "datadesc":  (["name"], 0, 0, 1),
-        "declaremodule": (["id", "type", "name"], 1, 1, 0),
-        "deprecated": (["release"], 0, 0, 0),
-        "documentclass": (["classname"], 0, 1, 0),
-        "excdesc": (["name"], 0, 0, 1),
-        "funcdesc": (["name", ("args",)], 0, 0, 1),
-        "funcdescni": (["name", ("args",)], 0, 0, 1),
-        "geq": ([], 0, 1, 0),
-        "hline": ([], 0, 1, 0),
-        "indexii": (["ie1", "ie2"], 0, 1, 0),
-        "indexiii": (["ie1", "ie2", "ie3"], 0, 1, 0),
-        "indexiv": (["ie1", "ie2", "ie3", "ie4"], 0, 1, 0),
-        "indexname": ([], 0, 0, 0),
-        "input": (["source"], 0, 1, 0),
-        "item": ([("leader",)], 1, 0, 0),
-        "label": (["id"], 0, 1, 0),
-        "labelwidth": ([], 0, 1, 0),
-        "LaTeX": ([], 0, 1, 0),
-        "leftmargin": ([], 0, 1, 0),
-        "leq": ([], 0, 1, 0),
-        "localmoduletable": ([], 0, 1, 0),
-        "makeindex": ([], 0, 1, 0), 
-        "makemodindex": ([], 0, 1, 0), 
-        "maketitle": ([], 0, 1, 0),
-        "manpage": (["name", "section"], 0, 1, 0),
-        "memberdesc": (["class", "name"], 1, 0, 1),
-        "methoddesc": (["class", "name", ("args",)], 1, 0, 1),
-        "methoddescni": (["class", "name", ("args",)], 1, 0, 1),
-        "moduleauthor": (["name", "email"], 0, 1, 0),
-        "opcodedesc": (["name", "var"], 0, 0, 1),
-        "par": ([], 0, 1, 0),
-        "paragraph": ([("title",)], 0, 0, 0),
-        "renewcommand": (["macro"], 0, 0, 0),
-        "rfc": (["number"], 0, 1, 0),
-        "section": ([("title",)], 0, 0, 0),
-        "sectionauthor": (["name", "email"], 0, 1, 0),
-        "seemodule": (["ref", "name"], 1, 0, 0),
-        "stindex": (["type"], 0, 1, 0),
-        "subparagraph": ([("title",)], 0, 0, 0),
-        "subsection": ([("title",)], 0, 0, 0),
-        "subsubsection": ([("title",)], 0, 0, 0),
-        "list": (["bullet", "init"], 0, 0, 1),
-        "tableii": (["colspec", "style", "head1", "head2"], 0, 0, 1),
-        "tableiii": (["colspec", "style", "head1", "head2", "head3"], 0, 0, 1),
-        "tableiv": (["colspec", "style", "head1", "head2", "head3", "head4"],
-                    0, 0, 1),
-        "version": ([], 0, 1, 0),
-        "versionadded": (["version"], 0, 1, 0),
-        "versionchanged": (["version"], 0, 1, 0),
-        "withsubitem": (["text"], 0, 0, 0),
+        # name: ([attribute names], first_is_optional, empty, isenv, nocontent)
+        "appendix": ([], 0, 1, 0, 0),
+        "bifuncindex": (["name"], 0, 1, 0, 0),
+        "catcode": ([], 0, 1, 0, 0),
+        "cfuncdesc": (["type", "name", ("args",)], 0, 0, 1, 0),
+        "chapter": ([("title",)], 0, 0, 0, 0),
+        "chapter*": ([("title",)], 0, 0, 0, 0),
+        "classdesc": (["name", ("constructor-args",)], 0, 0, 1, 0),
+        "ctypedesc": (["name"], 0, 0, 1, 0),
+        "cvardesc":  (["type", "name"], 0, 0, 1, 0),
+        "datadesc":  (["name"], 0, 0, 1, 0),
+        "declaremodule": (["id", "type", "name"], 1, 1, 0, 0),
+        "deprecated": (["release"], 0, 0, 0, 0),
+        "documentclass": (["classname"], 0, 1, 0, 0),
+        "excdesc": (["name"], 0, 0, 1, 0),
+        "funcdesc": (["name", ("args",)], 0, 0, 1, 0),
+        "funcdescni": (["name", ("args",)], 0, 0, 1, 0),
+        "geq": ([], 0, 1, 0, 0),
+        "hline": ([], 0, 1, 0, 0),
+        "indexii": (["ie1", "ie2"], 0, 1, 0, 0),
+        "indexiii": (["ie1", "ie2", "ie3"], 0, 1, 0, 0),
+        "indexiv": (["ie1", "ie2", "ie3", "ie4"], 0, 1, 0, 0),
+        "indexname": ([], 0, 0, 0, 0),
+        "input": (["source"], 0, 1, 0, 0),
+        "item": ([("leader",)], 1, 0, 0, 0),
+        "label": (["id"], 0, 1, 0, 0),
+        "labelwidth": ([], 0, 1, 0, 0),
+        "LaTeX": ([], 0, 1, 0, 0),
+        "leftmargin": ([], 0, 1, 0, 0),
+        "leq": ([], 0, 1, 0, 0),
+        "lineii": ([["entry"], ["entry"]], 0, 0, 0, 1),
+        "lineiii": ([["entry"], ["entry"], ["entry"]], 0, 0, 0, 1),
+        "lineiv": ([["entry"], ["entry"], ["entry"], ["entry"]], 0, 0, 0, 1),
+        "localmoduletable": ([], 0, 1, 0, 0),
+        "makeindex": ([], 0, 1, 0, 0), 
+        "makemodindex": ([], 0, 1, 0, 0), 
+        "maketitle": ([], 0, 1, 0, 0),
+        "manpage": (["name", "section"], 0, 1, 0, 0),
+        "memberdesc": (["class", "name"], 1, 0, 1, 0),
+        "methoddesc": (["class", "name", ("args",)], 1, 0, 1, 0),
+        "methoddescni": (["class", "name", ("args",)], 1, 0, 1, 0),
+        "moduleauthor": (["name", "email"], 0, 1, 0, 0),
+        "opcodedesc": (["name", "var"], 0, 0, 1, 0),
+        "par": ([], 0, 1, 0, 0),
+        "paragraph": ([("title",)], 0, 0, 0, 0),
+        "renewcommand": (["macro"], 0, 0, 0, 0),
+        "rfc": (["number"], 0, 1, 0, 0),
+        "section": ([("title",)], 0, 0, 0, 0),
+        "sectionauthor": (["name", "email"], 0, 1, 0, 0),
+        "seemodule": (["ref", "name"], 1, 0, 0, 0),
+        "stindex": (["type"], 0, 1, 0, 0),
+        "subparagraph": ([("title",)], 0, 0, 0, 0),
+        "subsection": ([("title",)], 0, 0, 0, 0),
+        "subsubsection": ([("title",)], 0, 0, 0, 0),
+        "list": (["bullet", "init"], 0, 0, 1, 0),
+        "tableii": (["colspec", "style",
+                     ["entry"], ["entry"]], 0, 0, 1, 0),
+        "tableiii": (["colspec", "style",
+                      ["entry"], ["entry"], ["entry"]], 0, 0, 1, 0),
+        "tableiv": (["colspec", "style",
+                     ["entry"], ["entry"], ["entry"], ["entry"]], 0, 0, 1, 0),
+        "version": ([], 0, 1, 0, 0),
+        "versionadded": (["version"], 0, 1, 0, 0),
+        "versionchanged": (["version"], 0, 1, 0, 0),
+        "withsubitem": (["text"], 0, 0, 0, 0),
         #
-        "ABC": ([], 0, 1, 0),
-        "ASCII": ([], 0, 1, 0),
-        "C": ([], 0, 1, 0),
-        "Cpp": ([], 0, 1, 0),
-        "EOF": ([], 0, 1, 0),
-        "e": ([], 0, 1, 0),
-        "ldots": ([], 0, 1, 0),
-        "NULL": ([], 0, 1, 0),
-        "POSIX": ([], 0, 1, 0),
-        "UNIX": ([], 0, 1, 0),
+        "ABC": ([], 0, 1, 0, 0),
+        "ASCII": ([], 0, 1, 0, 0),
+        "C": ([], 0, 1, 0, 0),
+        "Cpp": ([], 0, 1, 0, 0),
+        "EOF": ([], 0, 1, 0, 0),
+        "e": ([], 0, 1, 0, 0),
+        "ldots": ([], 0, 1, 0, 0),
+        "NULL": ([], 0, 1, 0, 0),
+        "POSIX": ([], 0, 1, 0, 0),
+        "UNIX": ([], 0, 1, 0, 0),
         #
         # Things that will actually be going away!
         #
-        "fi": ([], 0, 1, 0),
-        "ifhtml": ([], 0, 1, 0),
-        "makeindex": ([], 0, 1, 0),
-        "makemodindex": ([], 0, 1, 0),
-        "maketitle": ([], 0, 1, 0),
-        "noindent": ([], 0, 1, 0),
-        "tableofcontents": ([], 0, 1, 0),
+        "fi": ([], 0, 1, 0, 0),
+        "ifhtml": ([], 0, 1, 0, 0),
+        "makeindex": ([], 0, 1, 0, 0),
+        "makemodindex": ([], 0, 1, 0, 0),
+        "maketitle": ([], 0, 1, 0, 0),
+        "noindent": ([], 0, 1, 0, 0),
+        "protect": ([], 0, 1, 0, 0),
+        "tableofcontents": ([], 0, 1, 0, 0),
         },
             discards=["fi", "ifhtml", "makeindex", "makemodindex", "maketitle",
                       "noindent", "tableofcontents"],