diff --git a/Doc/partparse.py b/Doc/partparse.py
index 2f072bb..86bea47 100644
--- a/Doc/partparse.py
+++ b/Doc/partparse.py
@@ -4,7 +4,7 @@
 #
 # This is *not* a good example of good programming practices. In fact, this
 #     file could use a complete rewrite, in order to become faster, more
-#     easy extensible and maintainable.
+#     easily extensible and maintainable.
 #
 # However, I added some comments on a few places for the pityful person who
 #     would ever need to take a look into this file.
@@ -12,7 +12,11 @@
 # Have I been clear enough??
 #
 # -jh
-
+#
+# Yup.  I made some performance improvements and hope this lasts a while;
+#     I don't want to be the schmuck who ends up re-writting it!
+#
+# -fld
 
 import sys, string, regex, getopt, os
 
@@ -28,7 +32,7 @@
 MODE_GOBBLEWHITE = 6
 
 the_modes = (MODE_REGULAR, MODE_VERBATIM, MODE_CS_SCAN, MODE_COMMENT,
-	  MODE_MATH, MODE_DMATH, MODE_GOBBLEWHITE)
+	     MODE_MATH, MODE_DMATH, MODE_GOBBLEWHITE)
 
 # Show the neighbourhood of the scanned buffer
 def epsilon(buf, where):
@@ -62,7 +66,7 @@
 
     def __cmp__(self, other):
 	if type(self) != type(other):
-	    other = mode(other)
+	    other = mode[other]
 	return cmp(self.mode, other.mode)
 
     def __repr__(self):
@@ -84,7 +88,9 @@
 	    raise ValueError, 'mode not in the_modes'
 
 # just a wrapper around a class initialisation
-mode = Mode
+mode = {}
+for t in the_modes:
+    mode[t] = Mode(t)
 
 
 # After phase 1, the text consists of chunks, with a certain type
@@ -106,15 +112,16 @@
 ENDLINE = 9			# END-OF-LINE, data = '\n'
 DENDLINE = 10			# DOUBLE EOL, data='\n', indicates \par
 ENV = 11			# LaTeX-environment
-    # data =(envname,[ch,ch,ch,.])
+				# data =(envname,[ch,ch,ch,.])
 CSLINE = 12			# for texi: next chunk will be one group
-    # of args. Will be set all on 1 line
+				# of args. Will be set all on 1 line
 IGNORE = 13			# IGNORE this data
 ENDENV = 14			# TEMP END OF GROUP INDICATOR
 IF = 15				# IF-directive
-    # data = (flag,negate,[ch, ch, ch,...])
+				# data = (flag,negate,[ch, ch, ch,...])
+
 the_types = (PLAIN, GROUP, CSNAME, COMMENT, DMATH, MATH, OTHER, ACTIVE,
-	  GOBBLEDWHITE, ENDLINE, DENDLINE, ENV, CSLINE, IGNORE, ENDENV, IF)
+	     GOBBLEDWHITE, ENDLINE, DENDLINE, ENV, CSLINE, IGNORE, ENDENV, IF)
 
 # class, just to display symbolic name
 class ChunkType:
@@ -125,7 +132,7 @@
 
     def __cmp__(self, other):
 	if type(self) != type(other):
-	    other = chunk_type(other)
+	    other = chunk_type[other]
 	return cmp(self.chunk_type, other.chunk_type)
 
     def __repr__(self):
@@ -165,24 +172,19 @@
 	    raise ValueError, 'chunk_type not in the_types'
 
 # ...and the wrapper
-_all_chunk_types = {}
+chunk_type = {}
 for t in the_types:
-    _all_chunk_types[t] = ChunkType(t)
-
-def chunk_type(t):
-    return _all_chunk_types[t]
+    chunk_type[t] = ChunkType(t)
 
 # store a type object of the ChunkType-class-instance...
-chunk_type_type = type(chunk_type(0))
+chunk_type_type = type(chunk_type[PLAIN])
 
 # this class contains a part of the parsed buffer
 class Chunk:
     def __init__(self, chtype, where, data):
 	if type(chtype) != chunk_type_type:
-	    chtype = chunk_type(chtype)
+	    chtype = chunk_type[chtype]
 	self.chtype = chtype
-	if type(where) != IntType:
-	    raise TypeError, "'where' is not a number"
 	self.where = where
 	self.data = data
 
@@ -376,7 +378,7 @@
 rc_endwhite = make_rc_endwhite(my_cc)
 
 
-# parseit (BUF, PARSEMODE=mode(MODE_REGULAR), START=0, RECURSION-LEVEL=0)
+# parseit (BUF, PARSEMODE=mode[MODE_REGULAR], START=0, RECURSION-LEVEL=0)
 #     RECURSION-LEVEL will is incremented on entry.
 #     result contains the list of chunks returned
 #     together with this list, the buffer position is returned
@@ -385,22 +387,12 @@
 #     {,D}MATH-mode scan has been enetered.
 #     This has been done in order to better check for environment-mismatches
 
-def parseit(buf, *rest):
+def parseit(buf, parsemode=mode[MODE_REGULAR], start=0, lvl=0):
     global lineno
 
-    if len(rest) == 3:
-	parsemode, start, lvl = rest
-    elif len(rest) == 2:
-	parsemode, start, lvl = rest + (0, )
-    elif len(rest) == 1:
-	parsemode, start, lvl = rest + (0, 0)
-    elif len(rest) == 0:
-	parsemode, start, lvl = mode(MODE_REGULAR), 0, 0
-    else:
-	raise TypeError, 'usage: parseit(buf[, parsemode[, start[, level]]])'
     result = []
     end = len(buf)
-    if lvl == 0 and parsemode == mode(MODE_REGULAR):
+    if lvl == 0 and parsemode == mode[MODE_REGULAR]:
 	lineno = 1
     lvl = lvl + 1
 
@@ -410,7 +402,7 @@
     # some of the more regular modes...
     #
 
-    if parsemode in (mode(MODE_REGULAR), mode(MODE_DMATH), mode(MODE_MATH)):
+    if parsemode in (mode[MODE_REGULAR], mode[MODE_DMATH], mode[MODE_MATH]):
 	cstate = []
 	newpos = start
 	curpmode = parsemode
@@ -418,7 +410,7 @@
 	    where = newpos
 	    #print '\tnew round: ' + epsilon(buf, where)
 	    if where == end:
-		if lvl > 1 or curpmode != mode(MODE_REGULAR):
+		if lvl > 1 or curpmode != mode[MODE_REGULAR]:
 		    # not the way we started...
 		    raise EOFError, 'premature end of file.' + lle(lvl, buf, where)
 		# the real ending of lvl-1 parse
@@ -447,7 +439,7 @@
 	    elif foundchar in my_cc[CC_RBRACE]:
 		if lvl <= 1:
 		    raise error, 'ENDGROUP while in base level.' + lle(lvl, buf, where)
-		if  lvl == 1 and mode != mode(MODE_REGULAR):
+		if  lvl == 1 and mode != mode[MODE_REGULAR]:
 		    raise error, 'endgroup while in math mode. +lin() + epsilon(buf, where)'
 		return where + 1, result
 
@@ -467,7 +459,7 @@
 
 	    elif foundchar in my_cc[CC_COMMENT]:
 		newpos, data = parseit(buf,
-			  mode(MODE_COMMENT), where+1, lvl)
+			  mode[MODE_COMMENT], where+1, lvl)
 		result.append(chunk(COMMENT, where, data))
 
 	    elif foundchar in my_cc[CC_MATHSHIFT]:
@@ -479,13 +471,11 @@
 		    #
 		    # double mathshift, e.g. '$$'
 		    #
-		    if curpmode == mode(MODE_REGULAR):
-			newpos, data = parseit(buf,
-				  mode(MODE_DMATH),
-				  where+2, 0)
-			result.append(chunk(DMATH,
-				  where, data))
-		    elif curpmode == mode(MODE_MATH):
+		    if curpmode == mode[MODE_REGULAR]:
+			newpos, data = parseit(buf, mode[MODE_DMATH],
+					       where + 2, 0)
+			result.append(chunk(DMATH, where, data))
+		    elif curpmode == mode[MODE_MATH]:
 			raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
 		    elif lvl != 1:
 			raise error, 'bad mathend.' + lle(lvl, buf, where)
@@ -495,13 +485,11 @@
 		    #
 		    # single math shift, e.g. '$'
 		    #
-		    if curpmode == mode(MODE_REGULAR):
-			newpos, data = parseit(buf,
-				  mode(MODE_MATH),
-				  where+1, 0)
-			result.append(chunk(MATH,
-				  where, data))
-		    elif curpmode == mode(MODE_DMATH):
+		    if curpmode == mode[MODE_REGULAR]:
+			newpos, data = parseit(buf, mode[MODE_MATH],
+					       where + 1, 0)
+			result.append(chunk(MATH, where, data))
+		    elif curpmode == mode[MODE_DMATH]:
 			raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
 		    elif lvl != 1:
 			raise error, 'bad mathend.' + lv(lvl, buf, where)
@@ -530,7 +518,7 @@
 		#
 		lineno = lineno + 1
 		savedwhere = where
-		newpos, dummy = parseit(buf, mode(MODE_GOBBLEWHITE), where + 1, lvl)
+		newpos, dummy = parseit(buf, mode[MODE_GOBBLEWHITE], where + 1, lvl)
 		if newpos != end and buf[newpos] in my_cc[CC_ENDLINE]:
 		    result.append(chunk(DENDLINE, savedwhere, foundchar))
 		else:
@@ -539,7 +527,7 @@
 		result.append(chunk(OTHER, where, foundchar))
 		newpos = where + 1
 
-    elif parsemode == mode(MODE_CS_SCAN):
+    elif parsemode == mode[MODE_CS_SCAN]:
 	#
 	# scan for a control sequence token. `\ape', `\nut' or `\%'
 	#
@@ -561,10 +549,10 @@
 	    if buf[pos] == '\n':
 		lineno = lineno + 1
 		spos = pos + 1
-	    pos2, dummy = parseit(buf, mode(MODE_GOBBLEWHITE), spos, lvl)
+	    pos2, dummy = parseit(buf, mode[MODE_GOBBLEWHITE], spos, lvl)
 	    return pos2, (start, pos)
 
-    elif parsemode == mode(MODE_GOBBLEWHITE):
+    elif parsemode == mode[MODE_GOBBLEWHITE]:
 	if start == end:
 	    return start, ''
 	pos = rc_endwhite.search(buf, start)
@@ -572,17 +560,16 @@
 	    pos = start
 	return pos, (start, pos)
 
-    elif parsemode == mode(MODE_COMMENT):
+    elif parsemode == mode[MODE_COMMENT]:
 	pos = rc_comment.search(buf, start)
 	lineno = lineno + 1
 	if pos < 0:
 	    print 'no newline perhaps?'
 	    raise EOFError, 'can\'t find end of comment'
 	pos = pos + 1
-	pos2, dummy = parseit(buf, mode(MODE_GOBBLEWHITE), pos, lvl)
+	pos2, dummy = parseit(buf, mode[MODE_GOBBLEWHITE], pos, lvl)
 	return pos2, (start, pos)
 
-
     else:
 	raise error, 'Unknown mode (' + `parsemode` + ')'
 
@@ -608,42 +595,44 @@
     global lineno
 
     # get the control sequence name...
-    newpos, data = parseit(buf, mode(MODE_CS_SCAN), where+1, lvl)
+    newpos, data = parseit(buf, mode[MODE_CS_SCAN], where+1, lvl)
     saveddata = data
+    s_buf_data = s(buf, data)
 
-    if s(buf, data) in ('begin', 'end'):
+    if s_buf_data in ('begin', 'end'):
 	# skip the expected '{' and get the LaTeX-envname '}'
-	newpos, data = parseit(buf, mode(MODE_REGULAR), newpos+1, lvl)
+	newpos, data = parseit(buf, mode[MODE_REGULAR], newpos+1, lvl)
 	if len(data) != 1:
-	    raise error, 'expected 1 chunk of data.' + \
-		      lle(lvl, buf, where)
+	    raise error, 'expected 1 chunk of data.' + lle(lvl, buf, where)
 
 	# yucky, we've got an environment
 	envname = s(buf, data[0].data)
+	s_buf_saveddata = s(buf, saveddata)
 	##print 'FOUND ' + s(buf, saveddata) + '. Name ' + `envname` + '.' + lv(lvl)
-	if s(buf, saveddata) == 'begin' and envname == 'verbatim':
+	if s_buf_saveddata == 'begin' and envname == 'verbatim':
 	    # verbatim deserves special treatment
 	    pos = re_endverb.search(buf, newpos)
 	    if pos < 0:
-		raise error, `endverbstr` + ' not found.' + lle(lvl, buf, where)
+		raise error, "%s not found.%s" \
+		      % (`endverbstr`, lle(lvl, buf, where))
 	    result.append(chunk(ENV, where, (envname, [chunk(PLAIN, newpos, (newpos, pos))])))
 	    newpos = pos + len(endverbstr)
 
-	elif s(buf, saveddata) == 'begin':
+	elif s_buf_saveddata == 'begin':
 	    # start parsing recursively... If that parse returns
 	    # from an '\end{...}', then should the last item of
 	    # the returned data be a string containing the ended
 	    # environment
 	    newpos, data = parseit(buf, curpmode, newpos, lvl)
 	    if not data or type(data[-1]) is not StringType:
-		raise error, 'missing \'end\'' + lle(lvl, buf, where) + epsilon(buf, newpos)
+		raise error, "missing 'end'" + lle(lvl, buf, where) \
+		      + epsilon(buf, newpos)
 	    retenv = data[-1]
 	    del data[-1]
 	    if retenv != envname:
 		#[`retenv`, `envname`]
-		raise error, 'environments do not match.' + \
-			  lle(lvl, buf, where) + \
-			  epsilon(buf, newpos)
+		raise error, 'environments do not match.%s%s' \
+		      % (lle(lvl, buf, where), epsilon(buf, newpos))
 	    result.append(chunk(ENV, where, (retenv, data)))
 	else:
 	    # 'end'... append the environment name, as just
@@ -655,9 +644,9 @@
 
     # end of \begin ... \end handling
 
-    elif s(buf, data)[0:2] == 'if':
+    elif s_buf_data[0:2] == 'if':
 	# another scary monster: the 'if' directive
-	flag = s(buf, data)[2:]
+	flag = s_buf_data[2:]
 
 	# recursively call parseit, just like environment above..
 	# the last item of data should contain the if-termination
@@ -677,15 +666,15 @@
 	    newpos, data = parseit(buf, curpmode, newpos, lvl)
 	    if not data or data[-1] not in ('fi', ):
 		raise error, 'wrong if...else... termination' \
-			  + lle(lvl, buf, where) \
-			  + epsilon(buf, newpos)
+		      + lle(lvl, buf, where) \
+		      + epsilon(buf, newpos)
 
 	    ifterm = data[-1]
 	    del data[-1]
 	    result.append(chunk(IF, where, (flag, 1, data)))
 	#done implicitely: return None, newpos
 
-    elif s(buf, data) in ('else', 'fi'):
+    elif s_buf_data in ('else', 'fi'):
 	result.append(s(buf, data))
 	# order calling party to return tuple
 	return (newpos, result), newpos
@@ -702,8 +691,8 @@
 	pos = regex.compile(un_re(delimchar)).search(buf, x2 + 1)
 	if pos < 0:
 	    raise error, 'end of \'verb\' argument (' + \
-		      `delimchar` + ') not found.' + \
-		      lle(lvl, buf, where)
+		  `delimchar` + ') not found.' + \
+		  lle(lvl, buf, where)
 	result.append(chunk(GROUP, x2, [chunk(PLAIN, x2+1, (x2+1, pos))]))
 	newpos = pos + 1
     else:
@@ -729,7 +718,7 @@
 
 # copy a chunk, would better be a method of class Chunk...
 def chunkcopy(ch):
-    if ch.chtype == chunk_type(GROUP):
+    if ch.chtype == chunk_type[GROUP]:
 	return chunk(GROUP, ch.where, map(chunkcopy, ch.data))
     else:
 	return chunk(ch.chtype, ch.where, ch.data)
@@ -743,12 +732,12 @@
     ##dumpit(buf, wobj.write, pp[item:min(length, item + 5)])
     ##print 'GETNEXTARG, (len, item) =', `length, item` + ' ---> ' + wobj.data + ' <---'
 
-    while item < length and pp[item].chtype == chunk_type(ENDLINE):
+    while item < length and pp[item].chtype == chunk_type[ENDLINE]:
 	del pp[item]
 	length = length - 1
     if item >= length:
 	raise error, 'no next arg.' + epsilon(buf, pp[-1].where)
-    if pp[item].chtype == chunk_type(GROUP):
+    if pp[item].chtype == chunk_type[GROUP]:
 	newpp = pp[item].data
 	del pp[item]
 	length = length - 1
@@ -761,7 +750,7 @@
 	    dumpit(buf, wobj.write, newpp)
 	    ##print 'GETNEXTARG: inserted ' + `wobj.data`
 	return length, item
-    elif pp[item].chtype == chunk_type(PLAIN):
+    elif pp[item].chtype == chunk_type[PLAIN]:
 	#grab one char
 	print 'WARNING: grabbing one char'
 	if len(s(buf, pp[item].data)) > 1:
@@ -795,7 +784,7 @@
     ##print 'GETOPTARG, (len, item) =', `length, item` + ' ---> ' + wobj.data + ' <---'
 
     if item >= length or \
-	      pp[item].chtype != chunk_type(PLAIN) or \
+	      pp[item].chtype != chunk_type[PLAIN] or \
 	      s(buf, pp[item].data)[0] != '[':
 	return length, item
 
@@ -807,7 +796,7 @@
     while 1:
 	if item == length:
 	    raise error, 'No end of optional arg found'
-	if pp[item].chtype == chunk_type(PLAIN):
+	if pp[item].chtype == chunk_type[PLAIN]:
 	    text = s(buf, pp[item].data)
 	    pos = re_endopt.search(text)
 	    if pos >= 0:
@@ -842,7 +831,7 @@
 # map commands like these to themselves as plaintext
 wordsselves = ('UNIX', 'ABC', 'C', 'ASCII', 'EOF', 'LaTeX')
 # \{ --> {,  \} --> }, etc
-themselves = ('{', '}', '.', '@', ' ', '\n') + wordsselves
+themselves = ('{', '}', ',', '.', '@', ' ', '\n') + wordsselves
 # these ones also themselves (see argargs macro in myformat.sty)
 inargsselves = (',', '[', ']', '(', ')')
 # this is how *I* would show the difference between emph and strong
@@ -872,33 +861,34 @@
 	    break
 	ch = pp[i]
 	i = i+1
-	if ch.chtype == chunk_type(PLAIN):
+	if ch.chtype == chunk_type[PLAIN]:
 	    pass
-	elif ch.chtype == chunk_type(CSNAME):
-	    if s(buf, ch.data) in themselves or hist.inargs and s(buf, ch.data) in inargsselves:
-		ch.chtype = chunk_type(PLAIN)
-	    elif s(buf, ch.data) == 'e':
-		ch.chtype = chunk_type(PLAIN)
+	elif ch.chtype == chunk_type[CSNAME]:
+	    s_buf_data = s(buf, ch.data)
+	    if s_buf_data in themselves or hist.inargs and s_buf_data in inargsselves:
+		ch.chtype = chunk_type[PLAIN]
+	    elif s_buf_data == 'e':
+		ch.chtype = chunk_type[PLAIN]
 		ch.data = '\\'
-	    elif len(s(buf, ch.data)) == 1 \
-		      and s(buf, ch.data) in onlylatexspecial:
-		ch.chtype = chunk_type(PLAIN)
+	    elif len(s_buf_data) == 1 \
+		      and s_buf_data in onlylatexspecial:
+		ch.chtype = chunk_type[PLAIN]
 		# if it is followed by an empty group,
 		# remove that group, it was needed for
 		# a true space
 		if i < length \
-			  and pp[i].chtype==chunk_type(GROUP) \
+			  and pp[i].chtype==chunk_type[GROUP] \
 			  and len(pp[i].data) == 0:
 		    del pp[i]
 		    length = length-1
 
-	    elif s(buf, ch.data) in markcmds.keys():
+	    elif s_buf_data in markcmds.keys():
 		length, newi = getnextarg(length, buf, pp, i)
 		str = flattext(buf, pp[i:newi])
 		del pp[i:newi]
 		length = length - (newi - i)
-		ch.chtype = chunk_type(PLAIN)
-		markcmd = s(buf, ch.data)
+		ch.chtype = chunk_type[PLAIN]
+		markcmd = s_buf_data
 		x = markcmds[markcmd]
 		if type(x) == TupleType:
 		    pre, after = x
@@ -909,18 +899,18 @@
 		    raise 'FATAL', 'corrupt markcmds'
 		ch.data = str
 	    else:
-		if s(buf, ch.data) not in ignoredcommands:
-		    print 'WARNING: deleting command ' + `s(buf, ch.data)`
+		if s_buf_data not in ignoredcommands:
+		    print 'WARNING: deleting command ' + s_buf_data
 		    print 'PP' + `pp[i-1]`
 		del pp[i-1]
 		i, length = i-1, length-1
-	elif ch.chtype == chunk_type(GROUP):
+	elif ch.chtype == chunk_type[GROUP]:
 	    length, newi = getnextarg(length, buf, pp, i-1)
 	    i = i-1
 ##			str = flattext(buf, crcopy(pp[i-1:newi]))
 ##			del pp[i:newi]
 ##			length = length - (newi - i)
-##			ch.chtype = chunk_type(PLAIN)
+##			ch.chtype = chunk_type[PLAIN]
 ##			ch.data = str
 	else:
 	    pass
@@ -937,15 +927,16 @@
     ##print 'WORDS ' + `words`
 
     if len(words) == 2 \
-	      and string.lower(words[0]) == 'built-in' \
-	      and string.lower(words[1]) not in ('modules', 'functions'):
+       and string.lower(words[0]) == 'built-in' \
+       and string.lower(words[1]) not in ('modules', 'functions'):
 	return words[1]
     if len(words) == 3 and string.lower(words[1]) == 'module':
 	return words[2]
     if len(words) == 3 and string.lower(words[1]) == 'object':
 	return string.join(words[0:2])
-    if len(words) > 4 and string.lower(string.join(words[-4:])) == \
-	      'methods and data attributes':
+    if len(words) > 4 \
+       and (string.lower(string.join(words[-4:])) \
+	    == 'methods and data attributes'):
 	return string.join(words[:2])
     return text
 
@@ -966,16 +957,16 @@
 	    break
 	ch = pp[i]
 	i = i+1
-	if ch.chtype == chunk_type(ENDLINE):
+	if ch.chtype == chunk_type[ENDLINE]:
 	    continue
-	if ch.chtype == chunk_type(DENDLINE):
+	if ch.chtype == chunk_type[DENDLINE]:
 	    continue
-	if ch.chtype == chunk_type(PLAIN):
+	if ch.chtype == chunk_type[PLAIN]:
 	    if re_whitespace.search(s(buf, ch.data)) == 0 and \
 		      re_whitespace.match(s(buf, ch.data)) == len(s(buf, ch.data)):
 		continue
 	    return -1
-	if ch.chtype == chunk_type(CSNAME):
+	if ch.chtype == chunk_type[CSNAME]:
 	    if s(buf, ch.data) == cmdname:
 		return i # _after_ the command
 	    return -1
@@ -1076,7 +1067,7 @@
     if not command:
 	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
-    ch.chtype = chunk_type(CSLINE)
+    ch.chtype = chunk_type[CSLINE]
     ch.data = command
 
     cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
@@ -1124,7 +1115,7 @@
     if not command:
 	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
-    ch.chtype = chunk_type(CSLINE)
+    ch.chtype = chunk_type[CSLINE]
     ch.data = command
 
     cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
@@ -1170,7 +1161,7 @@
     if not command:
 	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
-    ch.chtype = chunk_type(CSLINE)
+    ch.chtype = chunk_type[CSLINE]
     ch.data = command
 
     cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
@@ -1235,11 +1226,11 @@
 	    # has been inserted, e.g., the \end{...} clauses
 	    raise 'FATAL', 'got string, probably too many ' + `end`
 
-	if ch.chtype == chunk_type(GROUP):
+	if ch.chtype == chunk_type[GROUP]:
 	    # check for {\em ...} constructs
 	    if ch.data and \
-		      ch.data[0].chtype == chunk_type(CSNAME) and \
-		      s(buf, ch.data[0].data) in fontchanges.keys():
+	       ch.data[0].chtype == chunk_type[CSNAME] and \
+	       s(buf, ch.data[0].data) in fontchanges.keys():
 		k = s(buf, ch.data[0].data)
 		del ch.data[0]
 		pp.insert(i-1, chunk(CSNAME, ch.where, fontchanges[k]))
@@ -1248,7 +1239,7 @@
 	    # recursively parse the contents of the group
 	    changeit(buf, ch.data)
 
-	elif ch.chtype == chunk_type(IF):
+	elif ch.chtype == chunk_type[IF]:
 	    # \if...
 	    flag, negate, data = ch.data
 	    ##print 'IF: flag, negate = ' + `flag, negate`
@@ -1265,7 +1256,7 @@
 		length = length + len(data)
 
 
-	elif ch.chtype == chunk_type(ENV):
+	elif ch.chtype == chunk_type[ENV]:
 	    # \begin{...} ....
 	    envname, data = ch.data
 
@@ -1340,7 +1331,7 @@
 
 		if newi-i != 1:
 		    raise error, 'Sorry, expected 1 chunk argument'
-		if pp[i].chtype != chunk_type(PLAIN):
+		if pp[i].chtype != chunk_type[PLAIN]:
 		    raise error, 'Sorry, expected plain text argument'
 		hist.itemargmacro = s(buf, pp[i].data)
 		del pp[i:newi]
@@ -1390,7 +1381,7 @@
 	    else:
 		print 'WARNING: don\'t know what to do with env ' + `envname`
 
-	elif ch.chtype == chunk_type(ENDENV):
+	elif ch.chtype == chunk_type[ENDENV]:
 	    envname = ch.data
 	    if envname != hist.inenv[0]:
 		raise error, '\'end\' does not match. Name ' + `envname` + ', expected ' + `hist.inenv[0]`
@@ -1442,75 +1433,78 @@
 	    else:
 		print 'WARNING: ending env ' + `envname` + 'has no actions'
 
-	elif ch.chtype == chunk_type(CSNAME):
+	elif ch.chtype == chunk_type[CSNAME]:
 	    # control name transformations
-	    if s(buf, ch.data) == 'optional':
-		pp[i-1].chtype = chunk_type (PLAIN)
+	    s_buf_data = s(buf, ch.data)
+	    if s_buf_data == 'optional':
+		pp[i-1].chtype = chunk_type[PLAIN]
 		pp[i-1].data = '['
 		if (i < length) and \
-		   (pp[i].chtype == chunk_type(GROUP)):
+		   (pp[i].chtype == chunk_type[GROUP]):
 		    cp=pp[i].data
 		    pp[i:i+1]=cp + [
 			chunk(PLAIN, ch.where, ']')]
 		    length = length+len(cp)
-	    elif s(buf, ch.data) in ignoredcommands:
+	    elif s_buf_data in ignoredcommands:
 		del pp[i-1]
 		i, length = i-1, length-1
-	    elif s(buf, ch.data) == '@' and \
+	    elif s_buf_data == '@' and \
 		      i != length and \
-		      pp[i].chtype == chunk_type(PLAIN) and \
+		      pp[i].chtype == chunk_type[PLAIN] and \
 		      s(buf, pp[i].data)[0] == '.':
 		# \@. --> \. --> @.
 		ch.data = '.'
 		del pp[i]
 		length = length-1
-	    elif s(buf, ch.data) == '\\':
+	    elif s_buf_data == '\\':
 		# \\ --> \* --> @*
 		ch.data = '*'
-	    elif len(s(buf, ch.data)) == 1 and \
-		      s(buf, ch.data) in onlylatexspecial:
-		ch.chtype = chunk_type(PLAIN)
+	    elif len(s_buf_data) == 1 and \
+		      s_buf_data in onlylatexspecial:
+		ch.chtype = chunk_type[PLAIN]
 		# check if such a command is followed by
 		# an empty group: e.g., `\%{}'.  If so, remove
 		# this empty group too
 		if i < length and \
-			  pp[i].chtype == chunk_type(GROUP) \
+			  pp[i].chtype == chunk_type[GROUP] \
 			  and len(pp[i].data) == 0:
 		    del pp[i]
 		    length = length-1
 
-	    elif hist.inargs and s(buf, ch.data) in inargsselves:
+	    elif hist.inargs and s_buf_data in inargsselves:
 		# This is the special processing of the
 		# arguments of the \begin{funcdesc}... or
 		# \funcline... arguments
 		# \, --> , \[ --> [, \] --> ]
-		ch.chtype = chunk_type(PLAIN)
+		ch.chtype = chunk_type[PLAIN]
 
-	    elif s(buf, ch.data) == 'renewcommand':
+	    elif s_buf_data == 'renewcommand':
 		# \renewcommand{\indexsubitem}....
 		i, length = i-1, length-1
 		del pp[i]
 		length, newi = getnextarg(length, buf, pp, i)
 		if newi-i == 1 \
 			  and i < length \
-			  and pp[i].chtype == chunk_type(CSNAME) \
+			  and pp[i].chtype == chunk_type[CSNAME] \
 			  and s(buf, pp[i].data) == 'indexsubitem':
 		    del pp[i:newi]
 		    length = length - (newi-i)
 		    length, newi = getnextarg(length, buf, pp, i)
 		    text = flattext(buf, pp[i:newi])
 		    if text[:1] != '(' or text[-1:] != ')':
-			raise error, 'expected indexsubitme enclosed in braces'
+			raise error, \
+			      'expected indexsubitem enclosed in parenteses'
 		    words = string.split(text[1:-1])
 		    hist.indexsubitem = words
+## 		    print 'set hist.indexsubitem =', words
 		    del text, words
 		else:
 		    print 'WARNING: renewcommand with unsupported arg removed'
 		del pp[i:newi]
 		length = length - (newi-i)
 
-	    elif s(buf, ch.data) == 'item':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'item':
+		ch.chtype = chunk_type[CSLINE]
 		length, newi = getoptarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
 		del pp[i:newi]
@@ -1518,7 +1512,7 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		i, length = i+1, length+1
 
-	    elif s(buf, ch.data) == 'ttindex':
+	    elif s_buf_data == 'ttindex':
 		idxsi = hist.indexsubitem
 
 		cat_class = ''
@@ -1535,7 +1529,7 @@
 		if not cat_class:
 		    cat_class = '('+string.join(idxsi)+')'
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = command
 
 		length, newi = getnextarg(length, buf, pp, i)
@@ -1562,32 +1556,30 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'ldots':
+	    elif s_buf_data == 'ldots':
 		# \ldots --> \dots{} --> @dots{}
 		ch.data = 'dots'
 		if i == length \
-			  or pp[i].chtype != chunk_type(GROUP) \
+			  or pp[i].chtype != chunk_type[GROUP] \
 			  or pp[i].data != []:
 		    pp.insert(i, chunk(GROUP, ch.where, []))
 		    i, length = i+1, length+1
-	    elif s(buf, ch.data) in wordsselves:
+	    elif s_buf_data in themselves:
 		# \UNIX --> UNIX
-		ch.chtype = chunk_type(PLAIN)
+		ch.chtype = chunk_type[PLAIN]
 		if i != length \
-			  and pp[i].chtype == chunk_type(GROUP) \
+			  and pp[i].chtype == chunk_type[GROUP] \
 			  and pp[i].data == []:
 		    del pp[i]
 		    length = length-1
-	    elif s(buf, ch.data) in for_texi:
+	    elif s_buf_data in for_texi:
 		pass
 
-	    elif s(buf, ch.data) == 'e':
+	    elif s_buf_data == 'e':
 		# "\e" --> "\"
 		ch.data = '\\'
-		ch.chtype = chunk_type(PLAIN)
-	    elif (s(buf, ch.data) == 'lineiii') or\
-		 (s(buf, ch.data) == 'lineii'):
+		ch.chtype = chunk_type[PLAIN]
+	    elif s_buf_data in ('lineiii', 'lineii'):
 		# This is the most tricky one
 		# \lineiii{a1}{a2}[{a3}] -->
 		# @item @<cts. of itemargmacro>{a1}
@@ -1602,16 +1594,13 @@
 		if (hist.inenv[0] != 'tableiii') and \
 		   (hist.inenv[0] != 'tableii'):
 		    raise error, \
-			      'wrong command (' + \
-			      s(buf, ch.data)+ \
-			      ') in wrong environment (' \
-			      + `hist.inenv[0]` + ')'
-		ch.chtype = chunk_type(CSLINE)
+			  'wrong command (%s) in wrong environment (%s)' \
+			  % (s_buf_data, `hist.inenv[0]`)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'item'
 		length, newi = getnextarg(length, buf, pp, i)
-		ingroupch = [chunk(CSNAME, 0,
-			  hist.itemargmacro),
-			  chunk(GROUP, 0, pp[i:newi])]
+		ingroupch = [chunk(CSNAME, 0, hist.itemargmacro),
+			     chunk(GROUP, 0, pp[i:newi])]
 		del pp[i:newi]
 		length = length - (newi-i)
 ##				print 'ITEM ARG: --->',
@@ -1636,19 +1625,17 @@
 		if length != len(pp):
 		    raise 'IN LINEIII IS THE ERR', `i`
 
-	    elif s(buf, ch.data) in ('chapter', 'section', 'subsection', 'subsubsection'):
+	    elif s_buf_data in ('chapter', 'section', 'subsection', 'subsubsection'):
 		#\xxxsection{A} ---->
 		# @node A, , ,
 		# @xxxsection A
 		## also: remove commas and quotes
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		length, newi = getnextarg(length, buf, pp, i)
 		afternodenamecmd = next_command_p(length, buf, pp, newi, 'nodename')
 		if afternodenamecmd < 0:
 		    cp1 = crcopy(pp[i:newi])
-		    pp[i:newi] = [
-			      chunk(GROUP, ch.where,
-			      pp[i:newi])]
+		    pp[i:newi] = [chunk(GROUP, ch.where, pp[i:newi])]
 		    length, newi = length - (newi-i) + 1, i+1
 		    text = flattext(buf, cp1)
 		    text = invent_node_names(text)
@@ -1658,9 +1645,7 @@
 		    del pp[newi:endarg]
 		    length = length - (endarg-newi)
 
-		    pp[i:newi] = [
-			      chunk(GROUP, ch.where,
-			      pp[i:newi])]
+		    pp[i:newi] = [chunk(GROUP, ch.where, pp[i:newi])]
 		    length, newi = length - (newi-i) + 1, i + 1
 		    text = flattext(buf, cp1)
 		if text[-1] == '.':
@@ -1672,43 +1657,38 @@
 		else:
 		    hist.nodenames.append(text)
 		text = rm_commas_etc(text)
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'node'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, text+', , ,')
-			  ])]
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'node'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, text+', , ,')
+				   ])]
 		i, length = newi+2, length+2
 
-	    elif s(buf,ch.data) == 'funcline':
+	    elif s_buf_data == 'funcline':
 		# fold it to a very short environment
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'end'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, hist.command)])]
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'end'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, hist.command)])]
 		i, length = i+2, length+2
 		length, i = do_funcdesc(length, buf, pp, i)
 
-	    elif s(buf,ch.data) == 'dataline':
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'end'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, hist.command)])]
+	    elif s_buf_data == 'dataline':
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'end'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, hist.command)])]
 		i, length = i+2, length+2
 		length, i = do_datadesc(length, buf, pp, i)
 
-	    elif s(buf,ch.data) == 'excline':
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'end'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, hist.command)])]
+	    elif s_buf_data == 'excline':
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'end'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, hist.command)])]
 		i, length = i+2, length+2
 		length, i = do_excdesc(length, buf, pp, i)
 
-
-	    elif s(buf, ch.data) == 'index':
+	    elif s_buf_data == 'index':
 		#\index{A} --->
 		# @cindex A
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		length, newi = getnextarg(length, buf, pp, i)
 
@@ -1718,8 +1698,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-	    elif s(buf, ch.data) == 'bifuncindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'bifuncindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'findex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1735,9 +1715,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'obindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'obindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'findex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1753,9 +1732,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'opindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'opindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'findex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1771,9 +1749,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'bimodindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'bimodindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'pindex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1789,12 +1766,11 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-	    elif s(buf, ch.data) == 'sectcode':
+	    elif s_buf_data == 'sectcode':
 		ch.data = 'code'
 
-
-	    elif s(buf, ch.data) == 'stmodindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'stmodindex':
+		ch.chtype = chunk_type[CSLINE]
 		# use the program index as module index
 		ch.data = 'pindex'
 		length, newi = getnextarg(length, buf, pp, i)
@@ -1811,11 +1787,10 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'stindex':
+	    elif s_buf_data == 'stindex':
 		# XXX must actually go to newindex st
 		wh = ch.where
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = [chunk(CSNAME, wh, 'code'),
@@ -1839,8 +1814,7 @@
 		pp.insert(i, chunk(GROUP, wh, t))
 		i, length = i+1, length+1
 
-
-	    elif s(buf, ch.data) == 'indexii':
+	    elif s_buf_data == 'indexii':
 		#\indexii{A}{B} --->
 		# @cindex A B
 		# @cindex B, A
@@ -1855,7 +1829,7 @@
 		del pp[i:newi]
 		length = length - (newi-i)
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		pp.insert(i, chunk(GROUP, ch.where, cp11 + [
 			  chunk(PLAIN, ch.where, ' ')] + cp12))
@@ -1865,7 +1839,7 @@
 			  chunk(PLAIN, ch.where, ', ')]+ cp21)]
 		i, length = i+2, length+2
 
-	    elif s(buf, ch.data) == 'indexiii':
+	    elif s_buf_data == 'indexiii':
 		length, newi = getnextarg(length, buf, pp, i)
 		cp11 = pp[i:newi]
 		cp21 = crcopy(pp[i:newi])
@@ -1885,7 +1859,7 @@
 		del pp[i:newi]
 		length = length - (newi-i)
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		pp.insert(i, chunk(GROUP, ch.where, cp11 + [
 			  chunk(PLAIN, ch.where, ' ')] + cp12
@@ -1905,8 +1879,7 @@
 			  cp32)]
 		i, length = i+2, length+2
 
-
-	    elif s(buf, ch.data) == 'indexiv':
+	    elif s_buf_data == 'indexiv':
 		length, newi = getnextarg(length, buf, pp, i)
 		cp11 = pp[i:newi]
 		cp21 = crcopy(pp[i:newi])
@@ -1936,7 +1909,7 @@
 		del pp[i:newi]
 		length = length - (newi-i)
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		ingroupch = cp11 + \
 			  spacech + cp12 + \
@@ -1966,11 +1939,15 @@
 			  chunk(GROUP, ch.where, ingroupch)]
 		i, length = i+2, length+2
 
+## 	    elif s_buf_data == 'indexsubitem':
+## 		ch.data = flattext(buf, [ch])
+## 		ch.chtype = chunk_type[PLAIN]
 
+	    elif s_buf_data in ('noindent', 'indexsubitem'):
+		pass
 
 	    else:
-		print 'don\'t know what to do with keyword ' + `s(buf, ch.data)`
-
+		print "don't know what to do with keyword " + s_buf_data
 
 
 re_atsign = regex.compile('[@{}]')
@@ -1992,22 +1969,20 @@
 	ch = pp[i]
 	i = i + 1
 
-	if addspace:
-	    dospace = 1
-	    addspace = 0
-	else:
-	    dospace = 0
+	dospace = addspace
+	addspace = 0
 
-	if ch.chtype == chunk_type(CSNAME):
-	    wm('@' + s(buf, ch.data))
-	    if s(buf, ch.data) == 'node' and \
-		      pp[i].chtype == chunk_type(PLAIN) and \
+	if ch.chtype == chunk_type[CSNAME]:
+	    s_buf_data = s(buf, ch.data)
+	    wm('@' + s_buf_data)
+	    if s_buf_data == 'node' and \
+		      pp[i].chtype == chunk_type[PLAIN] and \
 		      s(buf, pp[i].data) in out.doublenodes:
 		##XXX doesnt work yet??
 		wm(' ZZZ-' + zfill(`i`, 4))
-	    if s(buf, ch.data)[0] in string.letters:
+	    if s_buf_data[0] in string.letters:
 		addspace = 1
-	elif ch.chtype == chunk_type(PLAIN):
+	elif ch.chtype == chunk_type[PLAIN]:
 	    if dospace and s(buf, ch.data) not in (' ', '\t'):
 		wm(' ')
 	    text = s(buf, ch.data)
@@ -2018,32 +1993,32 @@
 		wm(text[:pos] + '@' + text[pos])
 		text = text[pos+1:]
 	    wm(text)
-	elif ch.chtype == chunk_type(GROUP):
+	elif ch.chtype == chunk_type[GROUP]:
 	    wm('{')
 	    dumpit(buf, wm, ch.data)
 	    wm('}')
-	elif ch.chtype == chunk_type(DENDLINE):
+	elif ch.chtype == chunk_type[DENDLINE]:
 	    wm('\n\n')
 	    while i != length and pp[i].chtype in \
-		      (chunk_type(DENDLINE), chunk_type(ENDLINE)):
+		      (chunk_type[DENDLINE], chunk_type[ENDLINE]):
 		i = i + 1
-	elif ch.chtype == chunk_type(OTHER):
+	elif ch.chtype == chunk_type[OTHER]:
 	    wm(s(buf, ch.data))
-	elif ch.chtype == chunk_type(ACTIVE):
+	elif ch.chtype == chunk_type[ACTIVE]:
 	    wm(s(buf, ch.data))
-	elif ch.chtype == chunk_type(ENDLINE):
+	elif ch.chtype == chunk_type[ENDLINE]:
 	    wm('\n')
-	elif ch.chtype == chunk_type(CSLINE):
+	elif ch.chtype == chunk_type[CSLINE]:
 	    if i >= 2 and pp[i-2].chtype not in \
-		      (chunk_type(ENDLINE), chunk_type(DENDLINE)) \
-		      and (pp[i-2].chtype != chunk_type(PLAIN)
+		      (chunk_type[ENDLINE], chunk_type[DENDLINE]) \
+		      and (pp[i-2].chtype != chunk_type[PLAIN]
 		      or s(buf, pp[i-2].data)[-1] != '\n'):
 
 		wm('\n')
 	    wm('@' + s(buf, ch.data))
 	    if i == length:
 		raise error, 'CSLINE expected another chunk'
-	    if pp[i].chtype != chunk_type(GROUP):
+	    if pp[i].chtype != chunk_type[GROUP]:
 		raise error, 'CSLINE expected GROUP'
 	    if type(pp[i].data) != ListType:
 		raise error, 'GROUP chould contain []-data'
@@ -2064,26 +2039,25 @@
 		    text = text[pos+1:]
 		wm(text)
 	    if i >= length or \
-		      pp[i].chtype not in (chunk_type(CSLINE),
-		      chunk_type(ENDLINE), chunk_type(DENDLINE)) \
-		      and (pp[i].chtype != chunk_type(PLAIN)
+		      pp[i].chtype not in (chunk_type[CSLINE],
+		      chunk_type[ENDLINE], chunk_type[DENDLINE]) \
+		      and (pp[i].chtype != chunk_type[PLAIN]
 		      or s(buf, pp[i].data)[0] != '\n'):
 		wm('\n')
 
-	elif ch.chtype == chunk_type(COMMENT):
-##			print 'COMMENT: previous chunk =', pp[i-2]
-##			if pp[i-2].chtype == chunk_type(PLAIN):
-##				print 'PLAINTEXT =', `s(buf, pp[i-2].data)`
+	elif ch.chtype == chunk_type[COMMENT]:
+## 	    print 'COMMENT: previous chunk =', pp[i-2]
+## 	    if pp[i-2].chtype == chunk_type[PLAIN]:
+## 		print 'PLAINTEXT =', `s(buf, pp[i-2].data)`
 	    if s(buf, ch.data) and \
 		      regex.match('^[ \t]*$', s(buf, ch.data)) < 0:
-		if i >= 2 and pp[i-2].chtype not in \
-			  (chunk_type(ENDLINE), chunk_type(DENDLINE)) \
-			  and not (pp[i-2].chtype == chunk_type(PLAIN)
-			  and regex.match('\\(.\\|\n\\)*[ \t]*\n$', s(buf, pp[i-2].data)) >= 0):
-		    print 'ADDING NEWLINE'
+		if i >= 2 \
+		   and pp[i-2].chtype not in (chunk_type[ENDLINE], chunk_type[DENDLINE]) \
+		   and not (pp[i-2].chtype == chunk_type[PLAIN]
+			    and regex.match('\\(.\\|\n\\)*[ \t]*\n$', s(buf, pp[i-2].data)) >= 0):
 		    wm('\n')
 		wm('@c ' + s(buf, ch.data))
-	elif ch.chtype == chunk_type(IGNORE):
+	elif ch.chtype == chunk_type[IGNORE]:
 	    pass
 	else:
 	    try:
diff --git a/Doc/tools/partparse.py b/Doc/tools/partparse.py
index 2f072bb..86bea47 100644
--- a/Doc/tools/partparse.py
+++ b/Doc/tools/partparse.py
@@ -4,7 +4,7 @@
 #
 # This is *not* a good example of good programming practices. In fact, this
 #     file could use a complete rewrite, in order to become faster, more
-#     easy extensible and maintainable.
+#     easily extensible and maintainable.
 #
 # However, I added some comments on a few places for the pityful person who
 #     would ever need to take a look into this file.
@@ -12,7 +12,11 @@
 # Have I been clear enough??
 #
 # -jh
-
+#
+# Yup.  I made some performance improvements and hope this lasts a while;
+#     I don't want to be the schmuck who ends up re-writting it!
+#
+# -fld
 
 import sys, string, regex, getopt, os
 
@@ -28,7 +32,7 @@
 MODE_GOBBLEWHITE = 6
 
 the_modes = (MODE_REGULAR, MODE_VERBATIM, MODE_CS_SCAN, MODE_COMMENT,
-	  MODE_MATH, MODE_DMATH, MODE_GOBBLEWHITE)
+	     MODE_MATH, MODE_DMATH, MODE_GOBBLEWHITE)
 
 # Show the neighbourhood of the scanned buffer
 def epsilon(buf, where):
@@ -62,7 +66,7 @@
 
     def __cmp__(self, other):
 	if type(self) != type(other):
-	    other = mode(other)
+	    other = mode[other]
 	return cmp(self.mode, other.mode)
 
     def __repr__(self):
@@ -84,7 +88,9 @@
 	    raise ValueError, 'mode not in the_modes'
 
 # just a wrapper around a class initialisation
-mode = Mode
+mode = {}
+for t in the_modes:
+    mode[t] = Mode(t)
 
 
 # After phase 1, the text consists of chunks, with a certain type
@@ -106,15 +112,16 @@
 ENDLINE = 9			# END-OF-LINE, data = '\n'
 DENDLINE = 10			# DOUBLE EOL, data='\n', indicates \par
 ENV = 11			# LaTeX-environment
-    # data =(envname,[ch,ch,ch,.])
+				# data =(envname,[ch,ch,ch,.])
 CSLINE = 12			# for texi: next chunk will be one group
-    # of args. Will be set all on 1 line
+				# of args. Will be set all on 1 line
 IGNORE = 13			# IGNORE this data
 ENDENV = 14			# TEMP END OF GROUP INDICATOR
 IF = 15				# IF-directive
-    # data = (flag,negate,[ch, ch, ch,...])
+				# data = (flag,negate,[ch, ch, ch,...])
+
 the_types = (PLAIN, GROUP, CSNAME, COMMENT, DMATH, MATH, OTHER, ACTIVE,
-	  GOBBLEDWHITE, ENDLINE, DENDLINE, ENV, CSLINE, IGNORE, ENDENV, IF)
+	     GOBBLEDWHITE, ENDLINE, DENDLINE, ENV, CSLINE, IGNORE, ENDENV, IF)
 
 # class, just to display symbolic name
 class ChunkType:
@@ -125,7 +132,7 @@
 
     def __cmp__(self, other):
 	if type(self) != type(other):
-	    other = chunk_type(other)
+	    other = chunk_type[other]
 	return cmp(self.chunk_type, other.chunk_type)
 
     def __repr__(self):
@@ -165,24 +172,19 @@
 	    raise ValueError, 'chunk_type not in the_types'
 
 # ...and the wrapper
-_all_chunk_types = {}
+chunk_type = {}
 for t in the_types:
-    _all_chunk_types[t] = ChunkType(t)
-
-def chunk_type(t):
-    return _all_chunk_types[t]
+    chunk_type[t] = ChunkType(t)
 
 # store a type object of the ChunkType-class-instance...
-chunk_type_type = type(chunk_type(0))
+chunk_type_type = type(chunk_type[PLAIN])
 
 # this class contains a part of the parsed buffer
 class Chunk:
     def __init__(self, chtype, where, data):
 	if type(chtype) != chunk_type_type:
-	    chtype = chunk_type(chtype)
+	    chtype = chunk_type[chtype]
 	self.chtype = chtype
-	if type(where) != IntType:
-	    raise TypeError, "'where' is not a number"
 	self.where = where
 	self.data = data
 
@@ -376,7 +378,7 @@
 rc_endwhite = make_rc_endwhite(my_cc)
 
 
-# parseit (BUF, PARSEMODE=mode(MODE_REGULAR), START=0, RECURSION-LEVEL=0)
+# parseit (BUF, PARSEMODE=mode[MODE_REGULAR], START=0, RECURSION-LEVEL=0)
 #     RECURSION-LEVEL will is incremented on entry.
 #     result contains the list of chunks returned
 #     together with this list, the buffer position is returned
@@ -385,22 +387,12 @@
 #     {,D}MATH-mode scan has been enetered.
 #     This has been done in order to better check for environment-mismatches
 
-def parseit(buf, *rest):
+def parseit(buf, parsemode=mode[MODE_REGULAR], start=0, lvl=0):
     global lineno
 
-    if len(rest) == 3:
-	parsemode, start, lvl = rest
-    elif len(rest) == 2:
-	parsemode, start, lvl = rest + (0, )
-    elif len(rest) == 1:
-	parsemode, start, lvl = rest + (0, 0)
-    elif len(rest) == 0:
-	parsemode, start, lvl = mode(MODE_REGULAR), 0, 0
-    else:
-	raise TypeError, 'usage: parseit(buf[, parsemode[, start[, level]]])'
     result = []
     end = len(buf)
-    if lvl == 0 and parsemode == mode(MODE_REGULAR):
+    if lvl == 0 and parsemode == mode[MODE_REGULAR]:
 	lineno = 1
     lvl = lvl + 1
 
@@ -410,7 +402,7 @@
     # some of the more regular modes...
     #
 
-    if parsemode in (mode(MODE_REGULAR), mode(MODE_DMATH), mode(MODE_MATH)):
+    if parsemode in (mode[MODE_REGULAR], mode[MODE_DMATH], mode[MODE_MATH]):
 	cstate = []
 	newpos = start
 	curpmode = parsemode
@@ -418,7 +410,7 @@
 	    where = newpos
 	    #print '\tnew round: ' + epsilon(buf, where)
 	    if where == end:
-		if lvl > 1 or curpmode != mode(MODE_REGULAR):
+		if lvl > 1 or curpmode != mode[MODE_REGULAR]:
 		    # not the way we started...
 		    raise EOFError, 'premature end of file.' + lle(lvl, buf, where)
 		# the real ending of lvl-1 parse
@@ -447,7 +439,7 @@
 	    elif foundchar in my_cc[CC_RBRACE]:
 		if lvl <= 1:
 		    raise error, 'ENDGROUP while in base level.' + lle(lvl, buf, where)
-		if  lvl == 1 and mode != mode(MODE_REGULAR):
+		if  lvl == 1 and mode != mode[MODE_REGULAR]:
 		    raise error, 'endgroup while in math mode. +lin() + epsilon(buf, where)'
 		return where + 1, result
 
@@ -467,7 +459,7 @@
 
 	    elif foundchar in my_cc[CC_COMMENT]:
 		newpos, data = parseit(buf,
-			  mode(MODE_COMMENT), where+1, lvl)
+			  mode[MODE_COMMENT], where+1, lvl)
 		result.append(chunk(COMMENT, where, data))
 
 	    elif foundchar in my_cc[CC_MATHSHIFT]:
@@ -479,13 +471,11 @@
 		    #
 		    # double mathshift, e.g. '$$'
 		    #
-		    if curpmode == mode(MODE_REGULAR):
-			newpos, data = parseit(buf,
-				  mode(MODE_DMATH),
-				  where+2, 0)
-			result.append(chunk(DMATH,
-				  where, data))
-		    elif curpmode == mode(MODE_MATH):
+		    if curpmode == mode[MODE_REGULAR]:
+			newpos, data = parseit(buf, mode[MODE_DMATH],
+					       where + 2, 0)
+			result.append(chunk(DMATH, where, data))
+		    elif curpmode == mode[MODE_MATH]:
 			raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
 		    elif lvl != 1:
 			raise error, 'bad mathend.' + lle(lvl, buf, where)
@@ -495,13 +485,11 @@
 		    #
 		    # single math shift, e.g. '$'
 		    #
-		    if curpmode == mode(MODE_REGULAR):
-			newpos, data = parseit(buf,
-				  mode(MODE_MATH),
-				  where+1, 0)
-			result.append(chunk(MATH,
-				  where, data))
-		    elif curpmode == mode(MODE_DMATH):
+		    if curpmode == mode[MODE_REGULAR]:
+			newpos, data = parseit(buf, mode[MODE_MATH],
+					       where + 1, 0)
+			result.append(chunk(MATH, where, data))
+		    elif curpmode == mode[MODE_DMATH]:
 			raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
 		    elif lvl != 1:
 			raise error, 'bad mathend.' + lv(lvl, buf, where)
@@ -530,7 +518,7 @@
 		#
 		lineno = lineno + 1
 		savedwhere = where
-		newpos, dummy = parseit(buf, mode(MODE_GOBBLEWHITE), where + 1, lvl)
+		newpos, dummy = parseit(buf, mode[MODE_GOBBLEWHITE], where + 1, lvl)
 		if newpos != end and buf[newpos] in my_cc[CC_ENDLINE]:
 		    result.append(chunk(DENDLINE, savedwhere, foundchar))
 		else:
@@ -539,7 +527,7 @@
 		result.append(chunk(OTHER, where, foundchar))
 		newpos = where + 1
 
-    elif parsemode == mode(MODE_CS_SCAN):
+    elif parsemode == mode[MODE_CS_SCAN]:
 	#
 	# scan for a control sequence token. `\ape', `\nut' or `\%'
 	#
@@ -561,10 +549,10 @@
 	    if buf[pos] == '\n':
 		lineno = lineno + 1
 		spos = pos + 1
-	    pos2, dummy = parseit(buf, mode(MODE_GOBBLEWHITE), spos, lvl)
+	    pos2, dummy = parseit(buf, mode[MODE_GOBBLEWHITE], spos, lvl)
 	    return pos2, (start, pos)
 
-    elif parsemode == mode(MODE_GOBBLEWHITE):
+    elif parsemode == mode[MODE_GOBBLEWHITE]:
 	if start == end:
 	    return start, ''
 	pos = rc_endwhite.search(buf, start)
@@ -572,17 +560,16 @@
 	    pos = start
 	return pos, (start, pos)
 
-    elif parsemode == mode(MODE_COMMENT):
+    elif parsemode == mode[MODE_COMMENT]:
 	pos = rc_comment.search(buf, start)
 	lineno = lineno + 1
 	if pos < 0:
 	    print 'no newline perhaps?'
 	    raise EOFError, 'can\'t find end of comment'
 	pos = pos + 1
-	pos2, dummy = parseit(buf, mode(MODE_GOBBLEWHITE), pos, lvl)
+	pos2, dummy = parseit(buf, mode[MODE_GOBBLEWHITE], pos, lvl)
 	return pos2, (start, pos)
 
-
     else:
 	raise error, 'Unknown mode (' + `parsemode` + ')'
 
@@ -608,42 +595,44 @@
     global lineno
 
     # get the control sequence name...
-    newpos, data = parseit(buf, mode(MODE_CS_SCAN), where+1, lvl)
+    newpos, data = parseit(buf, mode[MODE_CS_SCAN], where+1, lvl)
     saveddata = data
+    s_buf_data = s(buf, data)
 
-    if s(buf, data) in ('begin', 'end'):
+    if s_buf_data in ('begin', 'end'):
 	# skip the expected '{' and get the LaTeX-envname '}'
-	newpos, data = parseit(buf, mode(MODE_REGULAR), newpos+1, lvl)
+	newpos, data = parseit(buf, mode[MODE_REGULAR], newpos+1, lvl)
 	if len(data) != 1:
-	    raise error, 'expected 1 chunk of data.' + \
-		      lle(lvl, buf, where)
+	    raise error, 'expected 1 chunk of data.' + lle(lvl, buf, where)
 
 	# yucky, we've got an environment
 	envname = s(buf, data[0].data)
+	s_buf_saveddata = s(buf, saveddata)
 	##print 'FOUND ' + s(buf, saveddata) + '. Name ' + `envname` + '.' + lv(lvl)
-	if s(buf, saveddata) == 'begin' and envname == 'verbatim':
+	if s_buf_saveddata == 'begin' and envname == 'verbatim':
 	    # verbatim deserves special treatment
 	    pos = re_endverb.search(buf, newpos)
 	    if pos < 0:
-		raise error, `endverbstr` + ' not found.' + lle(lvl, buf, where)
+		raise error, "%s not found.%s" \
+		      % (`endverbstr`, lle(lvl, buf, where))
 	    result.append(chunk(ENV, where, (envname, [chunk(PLAIN, newpos, (newpos, pos))])))
 	    newpos = pos + len(endverbstr)
 
-	elif s(buf, saveddata) == 'begin':
+	elif s_buf_saveddata == 'begin':
 	    # start parsing recursively... If that parse returns
 	    # from an '\end{...}', then should the last item of
 	    # the returned data be a string containing the ended
 	    # environment
 	    newpos, data = parseit(buf, curpmode, newpos, lvl)
 	    if not data or type(data[-1]) is not StringType:
-		raise error, 'missing \'end\'' + lle(lvl, buf, where) + epsilon(buf, newpos)
+		raise error, "missing 'end'" + lle(lvl, buf, where) \
+		      + epsilon(buf, newpos)
 	    retenv = data[-1]
 	    del data[-1]
 	    if retenv != envname:
 		#[`retenv`, `envname`]
-		raise error, 'environments do not match.' + \
-			  lle(lvl, buf, where) + \
-			  epsilon(buf, newpos)
+		raise error, 'environments do not match.%s%s' \
+		      % (lle(lvl, buf, where), epsilon(buf, newpos))
 	    result.append(chunk(ENV, where, (retenv, data)))
 	else:
 	    # 'end'... append the environment name, as just
@@ -655,9 +644,9 @@
 
     # end of \begin ... \end handling
 
-    elif s(buf, data)[0:2] == 'if':
+    elif s_buf_data[0:2] == 'if':
 	# another scary monster: the 'if' directive
-	flag = s(buf, data)[2:]
+	flag = s_buf_data[2:]
 
 	# recursively call parseit, just like environment above..
 	# the last item of data should contain the if-termination
@@ -677,15 +666,15 @@
 	    newpos, data = parseit(buf, curpmode, newpos, lvl)
 	    if not data or data[-1] not in ('fi', ):
 		raise error, 'wrong if...else... termination' \
-			  + lle(lvl, buf, where) \
-			  + epsilon(buf, newpos)
+		      + lle(lvl, buf, where) \
+		      + epsilon(buf, newpos)
 
 	    ifterm = data[-1]
 	    del data[-1]
 	    result.append(chunk(IF, where, (flag, 1, data)))
 	#done implicitely: return None, newpos
 
-    elif s(buf, data) in ('else', 'fi'):
+    elif s_buf_data in ('else', 'fi'):
 	result.append(s(buf, data))
 	# order calling party to return tuple
 	return (newpos, result), newpos
@@ -702,8 +691,8 @@
 	pos = regex.compile(un_re(delimchar)).search(buf, x2 + 1)
 	if pos < 0:
 	    raise error, 'end of \'verb\' argument (' + \
-		      `delimchar` + ') not found.' + \
-		      lle(lvl, buf, where)
+		  `delimchar` + ') not found.' + \
+		  lle(lvl, buf, where)
 	result.append(chunk(GROUP, x2, [chunk(PLAIN, x2+1, (x2+1, pos))]))
 	newpos = pos + 1
     else:
@@ -729,7 +718,7 @@
 
 # copy a chunk, would better be a method of class Chunk...
 def chunkcopy(ch):
-    if ch.chtype == chunk_type(GROUP):
+    if ch.chtype == chunk_type[GROUP]:
 	return chunk(GROUP, ch.where, map(chunkcopy, ch.data))
     else:
 	return chunk(ch.chtype, ch.where, ch.data)
@@ -743,12 +732,12 @@
     ##dumpit(buf, wobj.write, pp[item:min(length, item + 5)])
     ##print 'GETNEXTARG, (len, item) =', `length, item` + ' ---> ' + wobj.data + ' <---'
 
-    while item < length and pp[item].chtype == chunk_type(ENDLINE):
+    while item < length and pp[item].chtype == chunk_type[ENDLINE]:
 	del pp[item]
 	length = length - 1
     if item >= length:
 	raise error, 'no next arg.' + epsilon(buf, pp[-1].where)
-    if pp[item].chtype == chunk_type(GROUP):
+    if pp[item].chtype == chunk_type[GROUP]:
 	newpp = pp[item].data
 	del pp[item]
 	length = length - 1
@@ -761,7 +750,7 @@
 	    dumpit(buf, wobj.write, newpp)
 	    ##print 'GETNEXTARG: inserted ' + `wobj.data`
 	return length, item
-    elif pp[item].chtype == chunk_type(PLAIN):
+    elif pp[item].chtype == chunk_type[PLAIN]:
 	#grab one char
 	print 'WARNING: grabbing one char'
 	if len(s(buf, pp[item].data)) > 1:
@@ -795,7 +784,7 @@
     ##print 'GETOPTARG, (len, item) =', `length, item` + ' ---> ' + wobj.data + ' <---'
 
     if item >= length or \
-	      pp[item].chtype != chunk_type(PLAIN) or \
+	      pp[item].chtype != chunk_type[PLAIN] or \
 	      s(buf, pp[item].data)[0] != '[':
 	return length, item
 
@@ -807,7 +796,7 @@
     while 1:
 	if item == length:
 	    raise error, 'No end of optional arg found'
-	if pp[item].chtype == chunk_type(PLAIN):
+	if pp[item].chtype == chunk_type[PLAIN]:
 	    text = s(buf, pp[item].data)
 	    pos = re_endopt.search(text)
 	    if pos >= 0:
@@ -842,7 +831,7 @@
 # map commands like these to themselves as plaintext
 wordsselves = ('UNIX', 'ABC', 'C', 'ASCII', 'EOF', 'LaTeX')
 # \{ --> {,  \} --> }, etc
-themselves = ('{', '}', '.', '@', ' ', '\n') + wordsselves
+themselves = ('{', '}', ',', '.', '@', ' ', '\n') + wordsselves
 # these ones also themselves (see argargs macro in myformat.sty)
 inargsselves = (',', '[', ']', '(', ')')
 # this is how *I* would show the difference between emph and strong
@@ -872,33 +861,34 @@
 	    break
 	ch = pp[i]
 	i = i+1
-	if ch.chtype == chunk_type(PLAIN):
+	if ch.chtype == chunk_type[PLAIN]:
 	    pass
-	elif ch.chtype == chunk_type(CSNAME):
-	    if s(buf, ch.data) in themselves or hist.inargs and s(buf, ch.data) in inargsselves:
-		ch.chtype = chunk_type(PLAIN)
-	    elif s(buf, ch.data) == 'e':
-		ch.chtype = chunk_type(PLAIN)
+	elif ch.chtype == chunk_type[CSNAME]:
+	    s_buf_data = s(buf, ch.data)
+	    if s_buf_data in themselves or hist.inargs and s_buf_data in inargsselves:
+		ch.chtype = chunk_type[PLAIN]
+	    elif s_buf_data == 'e':
+		ch.chtype = chunk_type[PLAIN]
 		ch.data = '\\'
-	    elif len(s(buf, ch.data)) == 1 \
-		      and s(buf, ch.data) in onlylatexspecial:
-		ch.chtype = chunk_type(PLAIN)
+	    elif len(s_buf_data) == 1 \
+		      and s_buf_data in onlylatexspecial:
+		ch.chtype = chunk_type[PLAIN]
 		# if it is followed by an empty group,
 		# remove that group, it was needed for
 		# a true space
 		if i < length \
-			  and pp[i].chtype==chunk_type(GROUP) \
+			  and pp[i].chtype==chunk_type[GROUP] \
 			  and len(pp[i].data) == 0:
 		    del pp[i]
 		    length = length-1
 
-	    elif s(buf, ch.data) in markcmds.keys():
+	    elif s_buf_data in markcmds.keys():
 		length, newi = getnextarg(length, buf, pp, i)
 		str = flattext(buf, pp[i:newi])
 		del pp[i:newi]
 		length = length - (newi - i)
-		ch.chtype = chunk_type(PLAIN)
-		markcmd = s(buf, ch.data)
+		ch.chtype = chunk_type[PLAIN]
+		markcmd = s_buf_data
 		x = markcmds[markcmd]
 		if type(x) == TupleType:
 		    pre, after = x
@@ -909,18 +899,18 @@
 		    raise 'FATAL', 'corrupt markcmds'
 		ch.data = str
 	    else:
-		if s(buf, ch.data) not in ignoredcommands:
-		    print 'WARNING: deleting command ' + `s(buf, ch.data)`
+		if s_buf_data not in ignoredcommands:
+		    print 'WARNING: deleting command ' + s_buf_data
 		    print 'PP' + `pp[i-1]`
 		del pp[i-1]
 		i, length = i-1, length-1
-	elif ch.chtype == chunk_type(GROUP):
+	elif ch.chtype == chunk_type[GROUP]:
 	    length, newi = getnextarg(length, buf, pp, i-1)
 	    i = i-1
 ##			str = flattext(buf, crcopy(pp[i-1:newi]))
 ##			del pp[i:newi]
 ##			length = length - (newi - i)
-##			ch.chtype = chunk_type(PLAIN)
+##			ch.chtype = chunk_type[PLAIN]
 ##			ch.data = str
 	else:
 	    pass
@@ -937,15 +927,16 @@
     ##print 'WORDS ' + `words`
 
     if len(words) == 2 \
-	      and string.lower(words[0]) == 'built-in' \
-	      and string.lower(words[1]) not in ('modules', 'functions'):
+       and string.lower(words[0]) == 'built-in' \
+       and string.lower(words[1]) not in ('modules', 'functions'):
 	return words[1]
     if len(words) == 3 and string.lower(words[1]) == 'module':
 	return words[2]
     if len(words) == 3 and string.lower(words[1]) == 'object':
 	return string.join(words[0:2])
-    if len(words) > 4 and string.lower(string.join(words[-4:])) == \
-	      'methods and data attributes':
+    if len(words) > 4 \
+       and (string.lower(string.join(words[-4:])) \
+	    == 'methods and data attributes'):
 	return string.join(words[:2])
     return text
 
@@ -966,16 +957,16 @@
 	    break
 	ch = pp[i]
 	i = i+1
-	if ch.chtype == chunk_type(ENDLINE):
+	if ch.chtype == chunk_type[ENDLINE]:
 	    continue
-	if ch.chtype == chunk_type(DENDLINE):
+	if ch.chtype == chunk_type[DENDLINE]:
 	    continue
-	if ch.chtype == chunk_type(PLAIN):
+	if ch.chtype == chunk_type[PLAIN]:
 	    if re_whitespace.search(s(buf, ch.data)) == 0 and \
 		      re_whitespace.match(s(buf, ch.data)) == len(s(buf, ch.data)):
 		continue
 	    return -1
-	if ch.chtype == chunk_type(CSNAME):
+	if ch.chtype == chunk_type[CSNAME]:
 	    if s(buf, ch.data) == cmdname:
 		return i # _after_ the command
 	    return -1
@@ -1076,7 +1067,7 @@
     if not command:
 	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
-    ch.chtype = chunk_type(CSLINE)
+    ch.chtype = chunk_type[CSLINE]
     ch.data = command
 
     cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
@@ -1124,7 +1115,7 @@
     if not command:
 	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
-    ch.chtype = chunk_type(CSLINE)
+    ch.chtype = chunk_type[CSLINE]
     ch.data = command
 
     cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
@@ -1170,7 +1161,7 @@
     if not command:
 	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
-    ch.chtype = chunk_type(CSLINE)
+    ch.chtype = chunk_type[CSLINE]
     ch.data = command
 
     cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
@@ -1235,11 +1226,11 @@
 	    # has been inserted, e.g., the \end{...} clauses
 	    raise 'FATAL', 'got string, probably too many ' + `end`
 
-	if ch.chtype == chunk_type(GROUP):
+	if ch.chtype == chunk_type[GROUP]:
 	    # check for {\em ...} constructs
 	    if ch.data and \
-		      ch.data[0].chtype == chunk_type(CSNAME) and \
-		      s(buf, ch.data[0].data) in fontchanges.keys():
+	       ch.data[0].chtype == chunk_type[CSNAME] and \
+	       s(buf, ch.data[0].data) in fontchanges.keys():
 		k = s(buf, ch.data[0].data)
 		del ch.data[0]
 		pp.insert(i-1, chunk(CSNAME, ch.where, fontchanges[k]))
@@ -1248,7 +1239,7 @@
 	    # recursively parse the contents of the group
 	    changeit(buf, ch.data)
 
-	elif ch.chtype == chunk_type(IF):
+	elif ch.chtype == chunk_type[IF]:
 	    # \if...
 	    flag, negate, data = ch.data
 	    ##print 'IF: flag, negate = ' + `flag, negate`
@@ -1265,7 +1256,7 @@
 		length = length + len(data)
 
 
-	elif ch.chtype == chunk_type(ENV):
+	elif ch.chtype == chunk_type[ENV]:
 	    # \begin{...} ....
 	    envname, data = ch.data
 
@@ -1340,7 +1331,7 @@
 
 		if newi-i != 1:
 		    raise error, 'Sorry, expected 1 chunk argument'
-		if pp[i].chtype != chunk_type(PLAIN):
+		if pp[i].chtype != chunk_type[PLAIN]:
 		    raise error, 'Sorry, expected plain text argument'
 		hist.itemargmacro = s(buf, pp[i].data)
 		del pp[i:newi]
@@ -1390,7 +1381,7 @@
 	    else:
 		print 'WARNING: don\'t know what to do with env ' + `envname`
 
-	elif ch.chtype == chunk_type(ENDENV):
+	elif ch.chtype == chunk_type[ENDENV]:
 	    envname = ch.data
 	    if envname != hist.inenv[0]:
 		raise error, '\'end\' does not match. Name ' + `envname` + ', expected ' + `hist.inenv[0]`
@@ -1442,75 +1433,78 @@
 	    else:
 		print 'WARNING: ending env ' + `envname` + 'has no actions'
 
-	elif ch.chtype == chunk_type(CSNAME):
+	elif ch.chtype == chunk_type[CSNAME]:
 	    # control name transformations
-	    if s(buf, ch.data) == 'optional':
-		pp[i-1].chtype = chunk_type (PLAIN)
+	    s_buf_data = s(buf, ch.data)
+	    if s_buf_data == 'optional':
+		pp[i-1].chtype = chunk_type[PLAIN]
 		pp[i-1].data = '['
 		if (i < length) and \
-		   (pp[i].chtype == chunk_type(GROUP)):
+		   (pp[i].chtype == chunk_type[GROUP]):
 		    cp=pp[i].data
 		    pp[i:i+1]=cp + [
 			chunk(PLAIN, ch.where, ']')]
 		    length = length+len(cp)
-	    elif s(buf, ch.data) in ignoredcommands:
+	    elif s_buf_data in ignoredcommands:
 		del pp[i-1]
 		i, length = i-1, length-1
-	    elif s(buf, ch.data) == '@' and \
+	    elif s_buf_data == '@' and \
 		      i != length and \
-		      pp[i].chtype == chunk_type(PLAIN) and \
+		      pp[i].chtype == chunk_type[PLAIN] and \
 		      s(buf, pp[i].data)[0] == '.':
 		# \@. --> \. --> @.
 		ch.data = '.'
 		del pp[i]
 		length = length-1
-	    elif s(buf, ch.data) == '\\':
+	    elif s_buf_data == '\\':
 		# \\ --> \* --> @*
 		ch.data = '*'
-	    elif len(s(buf, ch.data)) == 1 and \
-		      s(buf, ch.data) in onlylatexspecial:
-		ch.chtype = chunk_type(PLAIN)
+	    elif len(s_buf_data) == 1 and \
+		      s_buf_data in onlylatexspecial:
+		ch.chtype = chunk_type[PLAIN]
 		# check if such a command is followed by
 		# an empty group: e.g., `\%{}'.  If so, remove
 		# this empty group too
 		if i < length and \
-			  pp[i].chtype == chunk_type(GROUP) \
+			  pp[i].chtype == chunk_type[GROUP] \
 			  and len(pp[i].data) == 0:
 		    del pp[i]
 		    length = length-1
 
-	    elif hist.inargs and s(buf, ch.data) in inargsselves:
+	    elif hist.inargs and s_buf_data in inargsselves:
 		# This is the special processing of the
 		# arguments of the \begin{funcdesc}... or
 		# \funcline... arguments
 		# \, --> , \[ --> [, \] --> ]
-		ch.chtype = chunk_type(PLAIN)
+		ch.chtype = chunk_type[PLAIN]
 
-	    elif s(buf, ch.data) == 'renewcommand':
+	    elif s_buf_data == 'renewcommand':
 		# \renewcommand{\indexsubitem}....
 		i, length = i-1, length-1
 		del pp[i]
 		length, newi = getnextarg(length, buf, pp, i)
 		if newi-i == 1 \
 			  and i < length \
-			  and pp[i].chtype == chunk_type(CSNAME) \
+			  and pp[i].chtype == chunk_type[CSNAME] \
 			  and s(buf, pp[i].data) == 'indexsubitem':
 		    del pp[i:newi]
 		    length = length - (newi-i)
 		    length, newi = getnextarg(length, buf, pp, i)
 		    text = flattext(buf, pp[i:newi])
 		    if text[:1] != '(' or text[-1:] != ')':
-			raise error, 'expected indexsubitme enclosed in braces'
+			raise error, \
+			      'expected indexsubitem enclosed in parenteses'
 		    words = string.split(text[1:-1])
 		    hist.indexsubitem = words
+## 		    print 'set hist.indexsubitem =', words
 		    del text, words
 		else:
 		    print 'WARNING: renewcommand with unsupported arg removed'
 		del pp[i:newi]
 		length = length - (newi-i)
 
-	    elif s(buf, ch.data) == 'item':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'item':
+		ch.chtype = chunk_type[CSLINE]
 		length, newi = getoptarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
 		del pp[i:newi]
@@ -1518,7 +1512,7 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		i, length = i+1, length+1
 
-	    elif s(buf, ch.data) == 'ttindex':
+	    elif s_buf_data == 'ttindex':
 		idxsi = hist.indexsubitem
 
 		cat_class = ''
@@ -1535,7 +1529,7 @@
 		if not cat_class:
 		    cat_class = '('+string.join(idxsi)+')'
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = command
 
 		length, newi = getnextarg(length, buf, pp, i)
@@ -1562,32 +1556,30 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'ldots':
+	    elif s_buf_data == 'ldots':
 		# \ldots --> \dots{} --> @dots{}
 		ch.data = 'dots'
 		if i == length \
-			  or pp[i].chtype != chunk_type(GROUP) \
+			  or pp[i].chtype != chunk_type[GROUP] \
 			  or pp[i].data != []:
 		    pp.insert(i, chunk(GROUP, ch.where, []))
 		    i, length = i+1, length+1
-	    elif s(buf, ch.data) in wordsselves:
+	    elif s_buf_data in themselves:
 		# \UNIX --> UNIX
-		ch.chtype = chunk_type(PLAIN)
+		ch.chtype = chunk_type[PLAIN]
 		if i != length \
-			  and pp[i].chtype == chunk_type(GROUP) \
+			  and pp[i].chtype == chunk_type[GROUP] \
 			  and pp[i].data == []:
 		    del pp[i]
 		    length = length-1
-	    elif s(buf, ch.data) in for_texi:
+	    elif s_buf_data in for_texi:
 		pass
 
-	    elif s(buf, ch.data) == 'e':
+	    elif s_buf_data == 'e':
 		# "\e" --> "\"
 		ch.data = '\\'
-		ch.chtype = chunk_type(PLAIN)
-	    elif (s(buf, ch.data) == 'lineiii') or\
-		 (s(buf, ch.data) == 'lineii'):
+		ch.chtype = chunk_type[PLAIN]
+	    elif s_buf_data in ('lineiii', 'lineii'):
 		# This is the most tricky one
 		# \lineiii{a1}{a2}[{a3}] -->
 		# @item @<cts. of itemargmacro>{a1}
@@ -1602,16 +1594,13 @@
 		if (hist.inenv[0] != 'tableiii') and \
 		   (hist.inenv[0] != 'tableii'):
 		    raise error, \
-			      'wrong command (' + \
-			      s(buf, ch.data)+ \
-			      ') in wrong environment (' \
-			      + `hist.inenv[0]` + ')'
-		ch.chtype = chunk_type(CSLINE)
+			  'wrong command (%s) in wrong environment (%s)' \
+			  % (s_buf_data, `hist.inenv[0]`)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'item'
 		length, newi = getnextarg(length, buf, pp, i)
-		ingroupch = [chunk(CSNAME, 0,
-			  hist.itemargmacro),
-			  chunk(GROUP, 0, pp[i:newi])]
+		ingroupch = [chunk(CSNAME, 0, hist.itemargmacro),
+			     chunk(GROUP, 0, pp[i:newi])]
 		del pp[i:newi]
 		length = length - (newi-i)
 ##				print 'ITEM ARG: --->',
@@ -1636,19 +1625,17 @@
 		if length != len(pp):
 		    raise 'IN LINEIII IS THE ERR', `i`
 
-	    elif s(buf, ch.data) in ('chapter', 'section', 'subsection', 'subsubsection'):
+	    elif s_buf_data in ('chapter', 'section', 'subsection', 'subsubsection'):
 		#\xxxsection{A} ---->
 		# @node A, , ,
 		# @xxxsection A
 		## also: remove commas and quotes
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		length, newi = getnextarg(length, buf, pp, i)
 		afternodenamecmd = next_command_p(length, buf, pp, newi, 'nodename')
 		if afternodenamecmd < 0:
 		    cp1 = crcopy(pp[i:newi])
-		    pp[i:newi] = [
-			      chunk(GROUP, ch.where,
-			      pp[i:newi])]
+		    pp[i:newi] = [chunk(GROUP, ch.where, pp[i:newi])]
 		    length, newi = length - (newi-i) + 1, i+1
 		    text = flattext(buf, cp1)
 		    text = invent_node_names(text)
@@ -1658,9 +1645,7 @@
 		    del pp[newi:endarg]
 		    length = length - (endarg-newi)
 
-		    pp[i:newi] = [
-			      chunk(GROUP, ch.where,
-			      pp[i:newi])]
+		    pp[i:newi] = [chunk(GROUP, ch.where, pp[i:newi])]
 		    length, newi = length - (newi-i) + 1, i + 1
 		    text = flattext(buf, cp1)
 		if text[-1] == '.':
@@ -1672,43 +1657,38 @@
 		else:
 		    hist.nodenames.append(text)
 		text = rm_commas_etc(text)
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'node'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, text+', , ,')
-			  ])]
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'node'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, text+', , ,')
+				   ])]
 		i, length = newi+2, length+2
 
-	    elif s(buf,ch.data) == 'funcline':
+	    elif s_buf_data == 'funcline':
 		# fold it to a very short environment
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'end'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, hist.command)])]
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'end'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, hist.command)])]
 		i, length = i+2, length+2
 		length, i = do_funcdesc(length, buf, pp, i)
 
-	    elif s(buf,ch.data) == 'dataline':
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'end'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, hist.command)])]
+	    elif s_buf_data == 'dataline':
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'end'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, hist.command)])]
 		i, length = i+2, length+2
 		length, i = do_datadesc(length, buf, pp, i)
 
-	    elif s(buf,ch.data) == 'excline':
-		pp[i-1:i-1] = [
-			  chunk(CSLINE, ch.where, 'end'),
-			  chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where, hist.command)])]
+	    elif s_buf_data == 'excline':
+		pp[i-1:i-1] = [chunk(CSLINE, ch.where, 'end'),
+			       chunk(GROUP, ch.where, [
+				   chunk(PLAIN, ch.where, hist.command)])]
 		i, length = i+2, length+2
 		length, i = do_excdesc(length, buf, pp, i)
 
-
-	    elif s(buf, ch.data) == 'index':
+	    elif s_buf_data == 'index':
 		#\index{A} --->
 		# @cindex A
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		length, newi = getnextarg(length, buf, pp, i)
 
@@ -1718,8 +1698,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-	    elif s(buf, ch.data) == 'bifuncindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'bifuncindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'findex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1735,9 +1715,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'obindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'obindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'findex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1753,9 +1732,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'opindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'opindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'findex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1771,9 +1749,8 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'bimodindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'bimodindex':
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'pindex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = pp[i:newi]
@@ -1789,12 +1766,11 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-	    elif s(buf, ch.data) == 'sectcode':
+	    elif s_buf_data == 'sectcode':
 		ch.data = 'code'
 
-
-	    elif s(buf, ch.data) == 'stmodindex':
-		ch.chtype = chunk_type(CSLINE)
+	    elif s_buf_data == 'stmodindex':
+		ch.chtype = chunk_type[CSLINE]
 		# use the program index as module index
 		ch.data = 'pindex'
 		length, newi = getnextarg(length, buf, pp, i)
@@ -1811,11 +1787,10 @@
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		length, i = length+1, i+1
 
-
-	    elif s(buf, ch.data) == 'stindex':
+	    elif s_buf_data == 'stindex':
 		# XXX must actually go to newindex st
 		wh = ch.where
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = [chunk(CSNAME, wh, 'code'),
@@ -1839,8 +1814,7 @@
 		pp.insert(i, chunk(GROUP, wh, t))
 		i, length = i+1, length+1
 
-
-	    elif s(buf, ch.data) == 'indexii':
+	    elif s_buf_data == 'indexii':
 		#\indexii{A}{B} --->
 		# @cindex A B
 		# @cindex B, A
@@ -1855,7 +1829,7 @@
 		del pp[i:newi]
 		length = length - (newi-i)
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		pp.insert(i, chunk(GROUP, ch.where, cp11 + [
 			  chunk(PLAIN, ch.where, ' ')] + cp12))
@@ -1865,7 +1839,7 @@
 			  chunk(PLAIN, ch.where, ', ')]+ cp21)]
 		i, length = i+2, length+2
 
-	    elif s(buf, ch.data) == 'indexiii':
+	    elif s_buf_data == 'indexiii':
 		length, newi = getnextarg(length, buf, pp, i)
 		cp11 = pp[i:newi]
 		cp21 = crcopy(pp[i:newi])
@@ -1885,7 +1859,7 @@
 		del pp[i:newi]
 		length = length - (newi-i)
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		pp.insert(i, chunk(GROUP, ch.where, cp11 + [
 			  chunk(PLAIN, ch.where, ' ')] + cp12
@@ -1905,8 +1879,7 @@
 			  cp32)]
 		i, length = i+2, length+2
 
-
-	    elif s(buf, ch.data) == 'indexiv':
+	    elif s_buf_data == 'indexiv':
 		length, newi = getnextarg(length, buf, pp, i)
 		cp11 = pp[i:newi]
 		cp21 = crcopy(pp[i:newi])
@@ -1936,7 +1909,7 @@
 		del pp[i:newi]
 		length = length - (newi-i)
 
-		ch.chtype = chunk_type(CSLINE)
+		ch.chtype = chunk_type[CSLINE]
 		ch.data = 'cindex'
 		ingroupch = cp11 + \
 			  spacech + cp12 + \
@@ -1966,11 +1939,15 @@
 			  chunk(GROUP, ch.where, ingroupch)]
 		i, length = i+2, length+2
 
+## 	    elif s_buf_data == 'indexsubitem':
+## 		ch.data = flattext(buf, [ch])
+## 		ch.chtype = chunk_type[PLAIN]
 
+	    elif s_buf_data in ('noindent', 'indexsubitem'):
+		pass
 
 	    else:
-		print 'don\'t know what to do with keyword ' + `s(buf, ch.data)`
-
+		print "don't know what to do with keyword " + s_buf_data
 
 
 re_atsign = regex.compile('[@{}]')
@@ -1992,22 +1969,20 @@
 	ch = pp[i]
 	i = i + 1
 
-	if addspace:
-	    dospace = 1
-	    addspace = 0
-	else:
-	    dospace = 0
+	dospace = addspace
+	addspace = 0
 
-	if ch.chtype == chunk_type(CSNAME):
-	    wm('@' + s(buf, ch.data))
-	    if s(buf, ch.data) == 'node' and \
-		      pp[i].chtype == chunk_type(PLAIN) and \
+	if ch.chtype == chunk_type[CSNAME]:
+	    s_buf_data = s(buf, ch.data)
+	    wm('@' + s_buf_data)
+	    if s_buf_data == 'node' and \
+		      pp[i].chtype == chunk_type[PLAIN] and \
 		      s(buf, pp[i].data) in out.doublenodes:
 		##XXX doesnt work yet??
 		wm(' ZZZ-' + zfill(`i`, 4))
-	    if s(buf, ch.data)[0] in string.letters:
+	    if s_buf_data[0] in string.letters:
 		addspace = 1
-	elif ch.chtype == chunk_type(PLAIN):
+	elif ch.chtype == chunk_type[PLAIN]:
 	    if dospace and s(buf, ch.data) not in (' ', '\t'):
 		wm(' ')
 	    text = s(buf, ch.data)
@@ -2018,32 +1993,32 @@
 		wm(text[:pos] + '@' + text[pos])
 		text = text[pos+1:]
 	    wm(text)
-	elif ch.chtype == chunk_type(GROUP):
+	elif ch.chtype == chunk_type[GROUP]:
 	    wm('{')
 	    dumpit(buf, wm, ch.data)
 	    wm('}')
-	elif ch.chtype == chunk_type(DENDLINE):
+	elif ch.chtype == chunk_type[DENDLINE]:
 	    wm('\n\n')
 	    while i != length and pp[i].chtype in \
-		      (chunk_type(DENDLINE), chunk_type(ENDLINE)):
+		      (chunk_type[DENDLINE], chunk_type[ENDLINE]):
 		i = i + 1
-	elif ch.chtype == chunk_type(OTHER):
+	elif ch.chtype == chunk_type[OTHER]:
 	    wm(s(buf, ch.data))
-	elif ch.chtype == chunk_type(ACTIVE):
+	elif ch.chtype == chunk_type[ACTIVE]:
 	    wm(s(buf, ch.data))
-	elif ch.chtype == chunk_type(ENDLINE):
+	elif ch.chtype == chunk_type[ENDLINE]:
 	    wm('\n')
-	elif ch.chtype == chunk_type(CSLINE):
+	elif ch.chtype == chunk_type[CSLINE]:
 	    if i >= 2 and pp[i-2].chtype not in \
-		      (chunk_type(ENDLINE), chunk_type(DENDLINE)) \
-		      and (pp[i-2].chtype != chunk_type(PLAIN)
+		      (chunk_type[ENDLINE], chunk_type[DENDLINE]) \
+		      and (pp[i-2].chtype != chunk_type[PLAIN]
 		      or s(buf, pp[i-2].data)[-1] != '\n'):
 
 		wm('\n')
 	    wm('@' + s(buf, ch.data))
 	    if i == length:
 		raise error, 'CSLINE expected another chunk'
-	    if pp[i].chtype != chunk_type(GROUP):
+	    if pp[i].chtype != chunk_type[GROUP]:
 		raise error, 'CSLINE expected GROUP'
 	    if type(pp[i].data) != ListType:
 		raise error, 'GROUP chould contain []-data'
@@ -2064,26 +2039,25 @@
 		    text = text[pos+1:]
 		wm(text)
 	    if i >= length or \
-		      pp[i].chtype not in (chunk_type(CSLINE),
-		      chunk_type(ENDLINE), chunk_type(DENDLINE)) \
-		      and (pp[i].chtype != chunk_type(PLAIN)
+		      pp[i].chtype not in (chunk_type[CSLINE],
+		      chunk_type[ENDLINE], chunk_type[DENDLINE]) \
+		      and (pp[i].chtype != chunk_type[PLAIN]
 		      or s(buf, pp[i].data)[0] != '\n'):
 		wm('\n')
 
-	elif ch.chtype == chunk_type(COMMENT):
-##			print 'COMMENT: previous chunk =', pp[i-2]
-##			if pp[i-2].chtype == chunk_type(PLAIN):
-##				print 'PLAINTEXT =', `s(buf, pp[i-2].data)`
+	elif ch.chtype == chunk_type[COMMENT]:
+## 	    print 'COMMENT: previous chunk =', pp[i-2]
+## 	    if pp[i-2].chtype == chunk_type[PLAIN]:
+## 		print 'PLAINTEXT =', `s(buf, pp[i-2].data)`
 	    if s(buf, ch.data) and \
 		      regex.match('^[ \t]*$', s(buf, ch.data)) < 0:
-		if i >= 2 and pp[i-2].chtype not in \
-			  (chunk_type(ENDLINE), chunk_type(DENDLINE)) \
-			  and not (pp[i-2].chtype == chunk_type(PLAIN)
-			  and regex.match('\\(.\\|\n\\)*[ \t]*\n$', s(buf, pp[i-2].data)) >= 0):
-		    print 'ADDING NEWLINE'
+		if i >= 2 \
+		   and pp[i-2].chtype not in (chunk_type[ENDLINE], chunk_type[DENDLINE]) \
+		   and not (pp[i-2].chtype == chunk_type[PLAIN]
+			    and regex.match('\\(.\\|\n\\)*[ \t]*\n$', s(buf, pp[i-2].data)) >= 0):
 		    wm('\n')
 		wm('@c ' + s(buf, ch.data))
-	elif ch.chtype == chunk_type(IGNORE):
+	elif ch.chtype == chunk_type[IGNORE]:
 	    pass
 	else:
 	    try:
