diff --git a/Doc/tools/partparse.py b/Doc/tools/partparse.py
index db53a01..2f072bb 100644
--- a/Doc/tools/partparse.py
+++ b/Doc/tools/partparse.py
@@ -27,61 +27,61 @@
 MODE_DMATH = 5
 MODE_GOBBLEWHITE = 6
 
-the_modes = MODE_REGULAR, MODE_VERBATIM, MODE_CS_SCAN, MODE_COMMENT, \
-	  MODE_MATH, MODE_DMATH, MODE_GOBBLEWHITE
+the_modes = (MODE_REGULAR, MODE_VERBATIM, MODE_CS_SCAN, MODE_COMMENT,
+	  MODE_MATH, MODE_DMATH, MODE_GOBBLEWHITE)
 
 # Show the neighbourhood of the scanned buffer
 def epsilon(buf, where):
-	wmt, wpt = where - 10, where + 10
-	if wmt < 0:
-		wmt = 0
-	if wpt > len(buf):
-		wpt = len(buf)
-	return ' Context ' + `buf[wmt:where]` + '.' + `buf[where:wpt]` + '.'
+    wmt, wpt = where - 10, where + 10
+    if wmt < 0:
+	wmt = 0
+    if wpt > len(buf):
+	wpt = len(buf)
+    return ' Context ' + `buf[wmt:where]` + '.' + `buf[where:wpt]` + '.'
 
 # Should return the line number. never worked
 def lin():
-	global lineno
-	return ' Line ' + `lineno` + '.'
+    global lineno
+    return ' Line ' + `lineno` + '.'
 
 # Displays the recursion level.
 def lv(lvl):
-	return ' Level ' + `lvl` + '.'
+    return ' Level ' + `lvl` + '.'
 
 # Combine the three previous functions. Used often.
 def lle(lvl, buf, where):
-	return lv(lvl) + lin() + epsilon(buf, where)
-	
-	
+    return lv(lvl) + lin() + epsilon(buf, where)
+
+
 # This class is only needed for _symbolic_ representation of the parse mode.
 class Mode:
-	def __init__(self, arg):
-		if arg not in the_modes:
-			raise ValueError, 'mode not in the_modes'
-		self.mode = arg
+    def __init__(self, arg):
+	if arg not in the_modes:
+	    raise ValueError, 'mode not in the_modes'
+	self.mode = arg
 
-	def __cmp__(self, other):
-		if type(self) != type(other):
-			other = mode(other)
-		return cmp(self.mode, other.mode)
+    def __cmp__(self, other):
+	if type(self) != type(other):
+	    other = mode(other)
+	return cmp(self.mode, other.mode)
 
-	def __repr__(self):
-		if self.mode == MODE_REGULAR:
-			return 'MODE_REGULAR'
-		elif self.mode == MODE_VERBATIM:
-			return 'MODE_VERBATIM'
-		elif self.mode == MODE_CS_SCAN:
-			return 'MODE_CS_SCAN'
-		elif self.mode == MODE_COMMENT:
-			return 'MODE_COMMENT'
-		elif self.mode == MODE_MATH:
-			return 'MODE_MATH'
-		elif self.mode == MODE_DMATH:
-			return 'MODE_DMATH'
-		elif self.mode == MODE_GOBBLEWHITE:
-			return 'MODE_GOBBLEWHITE'
-		else:
-			raise ValueError, 'mode not in the_modes'
+    def __repr__(self):
+	if self.mode == MODE_REGULAR:
+	    return 'MODE_REGULAR'
+	elif self.mode == MODE_VERBATIM:
+	    return 'MODE_VERBATIM'
+	elif self.mode == MODE_CS_SCAN:
+	    return 'MODE_CS_SCAN'
+	elif self.mode == MODE_COMMENT:
+	    return 'MODE_COMMENT'
+	elif self.mode == MODE_MATH:
+	    return 'MODE_MATH'
+	elif self.mode == MODE_DMATH:
+	    return 'MODE_DMATH'
+	elif self.mode == MODE_GOBBLEWHITE:
+	    return 'MODE_GOBBLEWHITE'
+	else:
+	    raise ValueError, 'mode not in the_modes'
 
 # just a wrapper around a class initialisation
 mode = Mode
@@ -106,88 +106,88 @@
 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,...])
-the_types = PLAIN, GROUP, CSNAME, COMMENT, DMATH, MATH, OTHER, ACTIVE, \
-	  GOBBLEDWHITE, ENDLINE, DENDLINE, ENV, CSLINE, IGNORE, ENDENV, IF
+    # data = (flag,negate,[ch, ch, ch,...])
+the_types = (PLAIN, GROUP, CSNAME, COMMENT, DMATH, MATH, OTHER, ACTIVE,
+	  GOBBLEDWHITE, ENDLINE, DENDLINE, ENV, CSLINE, IGNORE, ENDENV, IF)
 
 # class, just to display symbolic name
 class ChunkType:
-	def __init__(self, chunk_type):
-		if chunk_type not in the_types:
-			raise ValueError, 'chunk_type not in the_types'
-		self.chunk_type = chunk_type
+    def __init__(self, chunk_type):
+	if chunk_type not in the_types:
+	    raise ValueError, 'chunk_type not in the_types'
+	self.chunk_type = chunk_type
 
-	def __cmp__(self, other):
-		if type(self) != type(other):
-			other = chunk_type(other)
-		return cmp(self.chunk_type, other.chunk_type)
+    def __cmp__(self, other):
+	if type(self) != type(other):
+	    other = chunk_type(other)
+	return cmp(self.chunk_type, other.chunk_type)
 
-	def __repr__(self):
-		if self.chunk_type == PLAIN:
-			return 'PLAIN'
-		elif self.chunk_type == GROUP:
-			return 'GROUP'
-		elif self.chunk_type == CSNAME:
-			return 'CSNAME'
-		elif self.chunk_type == COMMENT:
-			return 'COMMENT'
-		elif self.chunk_type == DMATH:
-			return 'DMATH'
-		elif self.chunk_type == MATH:
-			return 'MATH'
-		elif self.chunk_type == OTHER:
-			return 'OTHER'
-		elif self.chunk_type == ACTIVE:
-			return 'ACTIVE'
-		elif self.chunk_type == GOBBLEDWHITE:
-			return 'GOBBLEDWHITE'
-		elif self.chunk_type == DENDLINE:
-			return 'DENDLINE'
-		elif self.chunk_type == ENDLINE:
-			return 'ENDLINE'
-		elif self.chunk_type == ENV:
-			return 'ENV'
-		elif self.chunk_type == CSLINE:
-			return 'CSLINE'
-		elif self.chunk_type == IGNORE:
-			return 'IGNORE'
-		elif self.chunk_type == ENDENV:
-			return 'ENDENV'
-		elif self.chunk_type == IF:
-			return 'IF'
-		else:
-			raise ValueError, 'chunk_type not in the_types'
+    def __repr__(self):
+	if self.chunk_type == PLAIN:
+	    return 'PLAIN'
+	elif self.chunk_type == GROUP:
+	    return 'GROUP'
+	elif self.chunk_type == CSNAME:
+	    return 'CSNAME'
+	elif self.chunk_type == COMMENT:
+	    return 'COMMENT'
+	elif self.chunk_type == DMATH:
+	    return 'DMATH'
+	elif self.chunk_type == MATH:
+	    return 'MATH'
+	elif self.chunk_type == OTHER:
+	    return 'OTHER'
+	elif self.chunk_type == ACTIVE:
+	    return 'ACTIVE'
+	elif self.chunk_type == GOBBLEDWHITE:
+	    return 'GOBBLEDWHITE'
+	elif self.chunk_type == DENDLINE:
+	    return 'DENDLINE'
+	elif self.chunk_type == ENDLINE:
+	    return 'ENDLINE'
+	elif self.chunk_type == ENV:
+	    return 'ENV'
+	elif self.chunk_type == CSLINE:
+	    return 'CSLINE'
+	elif self.chunk_type == IGNORE:
+	    return 'IGNORE'
+	elif self.chunk_type == ENDENV:
+	    return 'ENDENV'
+	elif self.chunk_type == IF:
+	    return 'IF'
+	else:
+	    raise ValueError, 'chunk_type not in the_types'
 
 # ...and the wrapper
 _all_chunk_types = {}
 for t in the_types:
-	_all_chunk_types[t] = ChunkType(t)
+    _all_chunk_types[t] = ChunkType(t)
 
 def chunk_type(t):
-	return _all_chunk_types[t]
+    return _all_chunk_types[t]
 
 # store a type object of the ChunkType-class-instance...
 chunk_type_type = type(chunk_type(0))
 
 # 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)
-		self.chtype = chtype
-		if type(where) != IntType:
-			raise TypeError, '\'where\' is not a number'
-		self.where = where
-		self.data = data
+    def __init__(self, chtype, where, data):
+	if type(chtype) != chunk_type_type:
+	    chtype = chunk_type(chtype)
+	self.chtype = chtype
+	if type(where) != IntType:
+	    raise TypeError, "'where' is not a number"
+	self.where = where
+	self.data = data
 
-	def __repr__(self):
-		return 'chunk' + `self.chtype, self.where, self.data`
+    def __repr__(self):
+	return 'chunk' + `self.chtype, self.where, self.data`
 
 # and the wrapper
 chunk = Chunk
@@ -216,40 +216,40 @@
 CC_INVALID = 15
 
 # and the names
-cc_names = [\
-	  'CC_ESCAPE', \
-	  'CC_LBRACE', \
-	  'CC_RBRACE', \
-	  'CC_MATHSHIFT', \
-	  'CC_ALIGNMENT', \
-	  'CC_ENDLINE', \
-	  'CC_PARAMETER', \
-	  'CC_SUPERSCRIPT', \
-	  'CC_SUBSCRIPT', \
-	  'CC_IGNORE', \
-	  'CC_WHITE', \
-	  'CC_LETTER', \
-	  'CC_OTHER', \
-	  'CC_ACTIVE', \
-	  'CC_COMMENT', \
-	  'CC_INVALID', \
+cc_names = [
+	  'CC_ESCAPE',
+	  'CC_LBRACE',
+	  'CC_RBRACE',
+	  'CC_MATHSHIFT',
+	  'CC_ALIGNMENT',
+	  'CC_ENDLINE',
+	  'CC_PARAMETER',
+	  'CC_SUPERSCRIPT',
+	  'CC_SUBSCRIPT',
+	  'CC_IGNORE',
+	  'CC_WHITE',
+	  'CC_LETTER',
+	  'CC_OTHER',
+	  'CC_ACTIVE',
+	  'CC_COMMENT',
+	  'CC_INVALID',
 	  ]
 
 # Show a list of catcode-name-symbols
 def pcl(codelist):
-	result = ''
-	for i in codelist:
-		result = result + cc_names[i] + ', '
-	return '[' + result[:-2] + ']'
+    result = ''
+    for i in codelist:
+	result = result + cc_names[i] + ', '
+    return '[' + result[:-2] + ']'
 
 # the name of the catcode (ACTIVE, OTHER, etc.)
 def pc(code):
-	return cc_names[code]
-	
+    return cc_names[code]
+
 
 # Which catcodes make the parser stop parsing regular plaintext
-regular_stopcodes = [CC_ESCAPE, CC_LBRACE, CC_RBRACE, CC_MATHSHIFT, \
-	  CC_ALIGNMENT, CC_PARAMETER, CC_SUPERSCRIPT, CC_SUBSCRIPT, \
+regular_stopcodes = [CC_ESCAPE, CC_LBRACE, CC_RBRACE, CC_MATHSHIFT,
+	  CC_ALIGNMENT, CC_PARAMETER, CC_SUPERSCRIPT, CC_SUBSCRIPT,
 	  CC_IGNORE, CC_ACTIVE, CC_COMMENT, CC_INVALID, CC_ENDLINE]
 
 # same for scanning a control sequence name
@@ -269,37 +269,37 @@
 
 # gather all characters together, specified by a list of catcodes
 def code2string(cc, codelist):
-	##print 'code2string: codelist = ' + pcl(codelist),
-	result = ''
-	for category in codelist:
-		if cc[category]:
-			result = result + cc[category]
-	##print 'result = ' + `result`
-	return result
+    ##print 'code2string: codelist = ' + pcl(codelist),
+    result = ''
+    for category in codelist:
+	if cc[category]:
+	    result = result + cc[category]
+    ##print 'result = ' + `result`
+    return result
 
 # automatically generate all characters of catcode other, being the
 # complement set in the ASCII range (128 characters)
 def make_other_codes(cc):
-	otherchars = range(256)		# could be made 256, no problem
-	for category in all_but_other_codes:
-		if cc[category]:
-			for c in cc[category]:
-				otherchars[ord(c)] = None
-	result = ''
-	for i in otherchars:
-		if i != None:
-			result = result + chr(i)
-	return result
+    otherchars = range(256)		# could be made 256, no problem
+    for category in all_but_other_codes:
+	if cc[category]:
+	    for c in cc[category]:
+		otherchars[ord(c)] = None
+    result = ''
+    for i in otherchars:
+	if i != None:
+	    result = result + chr(i)
+    return result
 
 # catcode dump (which characters have which catcodes).
 def dump_cc(name, cc):
-	##print '\t' + name
-	##print '=' * (8+len(name))
-	if len(cc) != 16:
-		raise TypeError, 'cc not good cat class'
+    ##print '\t' + name
+    ##print '=' * (8+len(name))
+    if len(cc) != 16:
+	raise TypeError, 'cc not good cat class'
 ##	for i in range(16):
 ##		print pc(i) + '\t' + `cc[i]`
-		
+
 
 # In the beginning,....
 epoch_cc = [None] * 16
@@ -316,7 +316,7 @@
 #initex_cc[CC_OTHER] = make_other_codes(initex_cc) I don't need them, anyway
 ##dump_cc('initex_cc', initex_cc)
 
-	
+
 # LPLAIN: LaTeX catcode setting (see lplain.tex)
 lplain_cc = initex_cc[:]
 lplain_cc[CC_LBRACE], lplain_cc[CC_RBRACE] = '{', '}'
@@ -330,7 +330,7 @@
 lplain_cc[CC_OTHER] = make_other_codes(lplain_cc)
 ##dump_cc('lplain_cc', lplain_cc)
 
-	
+
 # Guido's LaTeX environment catcoded '_' as ``other''
 # my own purpose catlist
 my_cc = lplain_cc[:]
@@ -344,27 +344,27 @@
 re_meaning = '\\[]^$'
 
 def un_re(str):
-	result = ''
-	for i in str:
-		if i in re_meaning:
-			result = result + '\\'
-		result = result + i
-	return result
-	
+    result = ''
+    for i in str:
+	if i in re_meaning:
+	    result = result + '\\'
+	result = result + i
+    return result
+
 # NOTE the negate ('^') operator in *some* of the regexps below
 def make_rc_regular(cc):
-	# problems here if '[]' are included!!
-	return regex.compile('[' + code2string(cc, regular_stopcodes) + ']')
+    # problems here if '[]' are included!!
+    return regex.compile('[' + code2string(cc, regular_stopcodes) + ']')
 
 def make_rc_cs_scan(cc):
-	return regex.compile('[^' + code2string(cc, csname_scancodes) + ']')
+    return regex.compile('[^' + code2string(cc, csname_scancodes) + ']')
 
 def make_rc_comment(cc):
-	return regex.compile('[' + code2string(cc, comment_stopcodes) + ']')
+    return regex.compile('[' + code2string(cc, comment_stopcodes) + ']')
 
 def make_rc_endwhite(cc):
-	return regex.compile('[^' + code2string(cc, white_scancodes) + ']')
-	
+    return regex.compile('[^' + code2string(cc, white_scancodes) + ']')
+
 
 
 # regular: normal mode: 
@@ -386,213 +386,205 @@
 #     This has been done in order to better check for environment-mismatches
 
 def parseit(buf, *rest):
-	global lineno
+    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):
-		lineno = 1
-	lvl = lvl + 1
+    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):
+	lineno = 1
+    lvl = lvl + 1
 
-	##print 'parseit(' + epsilon(buf, start) + ', ' + `parsemode` + ', ' + `start` + ', ' + `lvl` + ')'
+    ##print 'parseit(' + epsilon(buf, start) + ', ' + `parsemode` + ', ' + `start` + ', ' + `lvl` + ')'
 
-	#
-	# some of the more regular modes...
-	#
+    #
+    # some of the more regular modes...
+    #
 
-	if parsemode in (mode(MODE_REGULAR), mode(MODE_DMATH), mode(MODE_MATH)):
-		cstate = []
-		newpos = start
-		curpmode = parsemode
-		while 1:
-			where = newpos
-			#print '\tnew round: ' + epsilon(buf, where)
-			if where == end:
-				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
-				return end, result
+    if parsemode in (mode(MODE_REGULAR), mode(MODE_DMATH), mode(MODE_MATH)):
+	cstate = []
+	newpos = start
+	curpmode = parsemode
+	while 1:
+	    where = newpos
+	    #print '\tnew round: ' + epsilon(buf, where)
+	    if where == end:
+		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
+		return end, result
 
-			pos = rc_regular.search(buf, where)
+	    pos = rc_regular.search(buf, where)
 
-			if pos < 0:
-				pos = end
+	    if pos < 0:
+		pos = end
 
-			if pos != where:
-				newpos, c = pos, chunk(PLAIN, where, (where, pos))
-				result.append(c)
-				continue
+	    if pos != where:
+		newpos, c = pos, chunk(PLAIN, where, (where, pos))
+		result.append(c)
+		continue
 
 
-			#
-			# ok, pos == where and pos != end
-			#
-			foundchar = buf[where]
-			if foundchar in my_cc[CC_LBRACE]:
-				# recursive subgroup parse...
-				newpos, data = parseit(buf, curpmode, where+1, lvl)
-				result.append(chunk(GROUP, where, data))
-				
-			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):
-					raise error, 'endgroup while in math mode. +lin() + epsilon(buf, where)'
-				return where + 1, result
-				
-			elif foundchar in my_cc[CC_ESCAPE]:
-				#
-				# call the routine that actually deals with
-				#     this problem. If do_ret is None, than
-				#     return the value of do_ret
-				#
-				# Note that handle_cs might call this routine
-				#     recursively again...
-				#
-				do_ret, newpos = handlecs(buf, where, \
-					  curpmode, lvl, result, end)
-				if do_ret != None:
-					return do_ret
-					
-			elif foundchar in my_cc[CC_COMMENT]:
-				newpos, data = parseit(buf, \
-					  mode(MODE_COMMENT), where+1, lvl)
-				result.append(chunk(COMMENT, where, data))
-				
-			elif foundchar in my_cc[CC_MATHSHIFT]:
-				# note that recursive calls to math-mode
-				# scanning are called with recursion-level 0
-				# again, in order to check for bad mathend
-				#
-				if where + 1 != end and \
-					  buf[where + 1] in \
-					  my_cc[CC_MATHSHIFT]:
-					#
-					# 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):
-						raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
-					elif lvl != 1:
-						raise error, 'bad mathend.' + \
-							  lle(lvl, buf, where)
-					else:
-						return where + 2, result
-				else:
-					#
-					# 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):
-						raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
-					elif lvl != 1:
-						raise error, 'bad mathend.' + \
-							  lv(lvl, buf, where)
-					else:
-						return where + 1, result
-					
-			elif foundchar in my_cc[CC_IGNORE]:
-				print 'warning: ignored char', `foundchar`
-				newpos = where + 1
-				
-			elif foundchar in my_cc[CC_ACTIVE]:
-				result.append(chunk(ACTIVE, where, foundchar))
-				newpos = where + 1
-				
-			elif foundchar in my_cc[CC_INVALID]:
-				raise error, 'invalid char ' + `foundchar`
-				newpos = where + 1
-				
-			elif foundchar in my_cc[CC_ENDLINE]:
-				#
-				# after an end of line, eat the rest of
-				# whitespace on the beginning of the next line
-				# this is what LaTeX more or less does
-				#
-				# also, try to indicate double newlines (\par)
-				#
-				lineno = lineno + 1
-				savedwhere = where
-				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:
-					result.append(chunk(ENDLINE, \
-						  savedwhere, foundchar))
-			else:
-				result.append(chunk(OTHER, where, foundchar))
-				newpos = where + 1
-				
-	elif parsemode == mode(MODE_CS_SCAN):
+	    #
+	    # ok, pos == where and pos != end
+	    #
+	    foundchar = buf[where]
+	    if foundchar in my_cc[CC_LBRACE]:
+		# recursive subgroup parse...
+		newpos, data = parseit(buf, curpmode, where+1, lvl)
+		result.append(chunk(GROUP, where, data))
+
+	    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):
+		    raise error, 'endgroup while in math mode. +lin() + epsilon(buf, where)'
+		return where + 1, result
+
+	    elif foundchar in my_cc[CC_ESCAPE]:
 		#
-		# scan for a control sequence token. `\ape', `\nut' or `\%'
+		# call the routine that actually deals with
+		#     this problem. If do_ret is None, than
+		#     return the value of do_ret
 		#
-		if start == end:
-			raise EOFError, 'can\'t find end of csname'
-		pos = rc_cs_scan.search(buf, start)
-		if pos < 0:
-			pos = end
-		if pos == start:
-			# first non-letter right where we started the search
-			# ---> the control sequence name consists of one single
-			# character. Also: don't eat white space...
-			if buf[pos] in my_cc[CC_ENDLINE]:
-				lineno = lineno + 1
-			pos = pos + 1
-			return pos, (start, pos)
+		# Note that handle_cs might call this routine
+		#     recursively again...
+		#
+		do_ret, newpos = handlecs(buf, where,
+			  curpmode, lvl, result, end)
+		if do_ret != None:
+		    return do_ret
+
+	    elif foundchar in my_cc[CC_COMMENT]:
+		newpos, data = parseit(buf,
+			  mode(MODE_COMMENT), where+1, lvl)
+		result.append(chunk(COMMENT, where, data))
+
+	    elif foundchar in my_cc[CC_MATHSHIFT]:
+		# note that recursive calls to math-mode
+		# scanning are called with recursion-level 0
+		# again, in order to check for bad mathend
+		#
+		if where + 1 != end and buf[where + 1] in my_cc[CC_MATHSHIFT]:
+		    #
+		    # 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):
+			raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
+		    elif lvl != 1:
+			raise error, 'bad mathend.' + lle(lvl, buf, where)
+		    else:
+			return where + 2, result
 		else:
-			spos = pos
-			if buf[pos] == '\n':
-				lineno = lineno + 1
-				spos = pos + 1
-			pos2, dummy = parseit(buf, \
-				  mode(MODE_GOBBLEWHITE), spos, lvl)
-			return pos2, (start, pos)
+		    #
+		    # 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):
+			raise error, 'wrong math delimiiter' + lin() + epsilon(buf, where)
+		    elif lvl != 1:
+			raise error, 'bad mathend.' + lv(lvl, buf, where)
+		    else:
+			return where + 1, result
 
-	elif parsemode == mode(MODE_GOBBLEWHITE):
-		if start == end:
-			return start, ''
-		pos = rc_endwhite.search(buf, start)
-		if pos < 0:
-			pos = start
-		return pos, (start, pos)
+	    elif foundchar in my_cc[CC_IGNORE]:
+		print 'warning: ignored char', `foundchar`
+		newpos = where + 1
 
-	elif parsemode == mode(MODE_COMMENT):
-		pos = rc_comment.search(buf, start)
+	    elif foundchar in my_cc[CC_ACTIVE]:
+		result.append(chunk(ACTIVE, where, foundchar))
+		newpos = where + 1
+
+	    elif foundchar in my_cc[CC_INVALID]:
+		raise error, 'invalid char ' + `foundchar`
+		newpos = where + 1
+
+	    elif foundchar in my_cc[CC_ENDLINE]:
+		#
+		# after an end of line, eat the rest of
+		# whitespace on the beginning of the next line
+		# this is what LaTeX more or less does
+		#
+		# also, try to indicate double newlines (\par)
+		#
 		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)
-		return pos2, (start, pos)
+		savedwhere = where
+		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:
+		    result.append(chunk(ENDLINE, savedwhere, foundchar))
+	    else:
+		result.append(chunk(OTHER, where, foundchar))
+		newpos = where + 1
 
-
+    elif parsemode == mode(MODE_CS_SCAN):
+	#
+	# scan for a control sequence token. `\ape', `\nut' or `\%'
+	#
+	if start == end:
+	    raise EOFError, 'can\'t find end of csname'
+	pos = rc_cs_scan.search(buf, start)
+	if pos < 0:
+	    pos = end
+	if pos == start:
+	    # first non-letter right where we started the search
+	    # ---> the control sequence name consists of one single
+	    # character. Also: don't eat white space...
+	    if buf[pos] in my_cc[CC_ENDLINE]:
+		lineno = lineno + 1
+	    pos = pos + 1
+	    return pos, (start, pos)
 	else:
-		raise error, 'Unknown mode (' + `parsemode` + ')'
+	    spos = pos
+	    if buf[pos] == '\n':
+		lineno = lineno + 1
+		spos = pos + 1
+	    pos2, dummy = parseit(buf, mode(MODE_GOBBLEWHITE), spos, lvl)
+	    return pos2, (start, pos)
+
+    elif parsemode == mode(MODE_GOBBLEWHITE):
+	if start == end:
+	    return start, ''
+	pos = rc_endwhite.search(buf, start)
+	if pos < 0:
+	    pos = start
+	return pos, (start, pos)
+
+    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)
+	return pos2, (start, pos)
+
+
+    else:
+	raise error, 'Unknown mode (' + `parsemode` + ')'
 
 
 #moreresult = cswitch(buf[x1:x2], buf, newpos, parsemode, lvl)
@@ -613,182 +605,182 @@
 # return with the data in return_data
 #
 def handlecs(buf, where, curpmode, lvl, result, end):
-	global lineno
+    global lineno
 
-	# get the control sequence name...
-	newpos, data = parseit(buf, mode(MODE_CS_SCAN), where+1, lvl)
-	saveddata = data
-	
-	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)
-		if len(data) != 1:
-			raise error, 'expected 1 chunk of data.' + \
-				  lle(lvl, buf, where)
+    # get the control sequence name...
+    newpos, data = parseit(buf, mode(MODE_CS_SCAN), where+1, lvl)
+    saveddata = data
 
-		# yucky, we've got an environment
-		envname = s(buf, data[0].data)
-		##print 'FOUND ' + s(buf, saveddata) + '. Name ' + `envname` + '.' + lv(lvl)
-		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)
-			result.append(chunk(ENV, where, (envname, [chunk(PLAIN, newpos, (newpos, pos))])))
-			newpos = pos + len(endverbstr)
+    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)
+	if len(data) != 1:
+	    raise error, 'expected 1 chunk of data.' + \
+		      lle(lvl, buf, where)
 
-		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)
-			retenv = data[-1]
-			del data[-1]
-			if retenv != envname:
-				#[`retenv`, `envname`]
-				raise error, 'environments do not match.' + \
-					  lle(lvl, buf, where) + \
-					  epsilon(buf, newpos)
-			result.append(chunk(ENV, where, (retenv, data)))
-		else:
-			# 'end'... append the environment name, as just
-			# pointed out, and order parsit to return...
-			result.append(envname)
-			##print 'POINT of return: ' + epsilon(buf, newpos)
-			# the tuple will be returned by parseit
-			return (newpos, result), newpos
+	# yucky, we've got an environment
+	envname = s(buf, data[0].data)
+	##print 'FOUND ' + s(buf, saveddata) + '. Name ' + `envname` + '.' + lv(lvl)
+	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)
+	    result.append(chunk(ENV, where, (envname, [chunk(PLAIN, newpos, (newpos, pos))])))
+	    newpos = pos + len(endverbstr)
 
-	# end of \begin ... \end handling
-			
-	elif s(buf, data)[0:2] == 'if':
-		# another scary monster: the 'if' directive
-		flag = s(buf, data)[2:]
-
-		# recursively call parseit, just like environment above..
-		# the last item of data should contain the if-termination
-		# e.g., 'else' of 'fi'
-		newpos, data = parseit(buf, curpmode, newpos, lvl)
-		if not data or data[-1] not in ('else', 'fi'):
-			raise error, 'wrong if... termination' + \
-				  lle(lvl, buf, where) + epsilon(buf, newpos)
-
-		ifterm = data[-1]
-		del data[-1]
-		# 0 means dont_negate flag
-		result.append(chunk(IF, where, (flag, 0, data)))
-		if ifterm == 'else':
-			# do the whole thing again, there is only one way
-			# to end this one, by 'fi'
-			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)
-
-			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'):
-		result.append(s(buf, data))
-		# order calling party to return tuple
-		return (newpos, result), newpos
-
-	# end of \if, \else, ... \fi handling
-
-	elif s(buf, saveddata) == 'verb':
-		x2 = saveddata[1]
-		result.append(chunk(CSNAME, where, data))
-		if x2 == end:
-			raise error, 'premature end of command.' + lle(lvl, buf, where)
-		delimchar = buf[x2]
-		##print 'VERB: delimchar ' + `delimchar`
-		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)
-		result.append(chunk(GROUP, x2, [chunk(PLAIN, x2+1, (x2+1, pos))]))
-		newpos = pos + 1
+	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)
+	    retenv = data[-1]
+	    del data[-1]
+	    if retenv != envname:
+		#[`retenv`, `envname`]
+		raise error, 'environments do not match.' + \
+			  lle(lvl, buf, where) + \
+			  epsilon(buf, newpos)
+	    result.append(chunk(ENV, where, (retenv, data)))
 	else:
-		result.append(chunk(CSNAME, where, data))
-	return None, newpos
+	    # 'end'... append the environment name, as just
+	    # pointed out, and order parsit to return...
+	    result.append(envname)
+	    ##print 'POINT of return: ' + epsilon(buf, newpos)
+	    # the tuple will be returned by parseit
+	    return (newpos, result), newpos
+
+    # end of \begin ... \end handling
+
+    elif s(buf, data)[0:2] == 'if':
+	# another scary monster: the 'if' directive
+	flag = s(buf, data)[2:]
+
+	# recursively call parseit, just like environment above..
+	# the last item of data should contain the if-termination
+	# e.g., 'else' of 'fi'
+	newpos, data = parseit(buf, curpmode, newpos, lvl)
+	if not data or data[-1] not in ('else', 'fi'):
+	    raise error, 'wrong if... termination' + \
+		      lle(lvl, buf, where) + epsilon(buf, newpos)
+
+	ifterm = data[-1]
+	del data[-1]
+	# 0 means dont_negate flag
+	result.append(chunk(IF, where, (flag, 0, data)))
+	if ifterm == 'else':
+	    # do the whole thing again, there is only one way
+	    # to end this one, by 'fi'
+	    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)
+
+	    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'):
+	result.append(s(buf, data))
+	# order calling party to return tuple
+	return (newpos, result), newpos
+
+    # end of \if, \else, ... \fi handling
+
+    elif s(buf, saveddata) == 'verb':
+	x2 = saveddata[1]
+	result.append(chunk(CSNAME, where, data))
+	if x2 == end:
+	    raise error, 'premature end of command.' + lle(lvl, buf, where)
+	delimchar = buf[x2]
+	##print 'VERB: delimchar ' + `delimchar`
+	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)
+	result.append(chunk(GROUP, x2, [chunk(PLAIN, x2+1, (x2+1, pos))]))
+	newpos = pos + 1
+    else:
+	result.append(chunk(CSNAME, where, data))
+    return None, newpos
 
 # this is just a function to get the string value if the possible data-tuple
 def s(buf, data):
-	if type(data) is StringType:
-		return data
-	if len(data) != 2 or not (type(data[0]) is type(data[1]) is IntType):
-		raise TypeError, 'expected tuple of 2 integers'
-	x1, x2 = data
-	return buf[x1:x2]
+    if type(data) is StringType:
+	return data
+    if len(data) != 2 or not (type(data[0]) is type(data[1]) is IntType):
+	raise TypeError, 'expected tuple of 2 integers'
+    x1, x2 = data
+    return buf[x1:x2]
 
 
 ##length, data1, i = getnextarg(length, buf, pp, i + 1)
 
 # make a deep-copy of some chunks
 def crcopy(r):
-	return map(chunkcopy, r)
+    return map(chunkcopy, r)
 
 
 # copy a chunk, would better be a method of class Chunk...
 def chunkcopy(ch):
-	if ch.chtype == chunk_type(GROUP):
-		return chunk(GROUP, ch.where, map(chunkcopy, ch.data))
-	else:
-		return chunk(ch.chtype, ch.where, ch.data)
+    if ch.chtype == chunk_type(GROUP):
+	return chunk(GROUP, ch.where, map(chunkcopy, ch.data))
+    else:
+	return chunk(ch.chtype, ch.where, ch.data)
 
 
 # get next argument for TeX-macro, flatten a group (insert between)
 # or return Command Sequence token, or give back one character
 def getnextarg(length, buf, pp, item):
 
-	##wobj = Wobj()
-	##dumpit(buf, wobj.write, pp[item:min(length, item + 5)])
-	##print 'GETNEXTARG, (len, item) =', `length, item` + ' ---> ' + wobj.data + ' <---'
+    ##wobj = Wobj()
+    ##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):
-		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):
-		newpp = pp[item].data
-		del pp[item]
-		length = length - 1
-		changeit(buf, newpp)
-		length = length + len(newpp)
-		pp[item:item] = newpp
-		item = item + len(newpp)
-		if len(newpp) < 10:
-			wobj = Wobj()
-			dumpit(buf, wobj.write, newpp)
-			##print 'GETNEXTARG: inserted ' + `wobj.data`
-		return length, item
-	elif pp[item].chtype == chunk_type(PLAIN):
-		#grab one char
-		print 'WARNING: grabbing one char'
-		if len(s(buf, pp[item].data)) > 1:
-			pp.insert(item, chunk(PLAIN, pp[item].where, s(buf, pp[item].data)[:1]))
-			item, length = item+1, length+1
-			pp[item].data = s(buf, pp[item].data)[1:]
-		else:
-			item = item+1
-		return length, item
+    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):
+	newpp = pp[item].data
+	del pp[item]
+	length = length - 1
+	changeit(buf, newpp)
+	length = length + len(newpp)
+	pp[item:item] = newpp
+	item = item + len(newpp)
+	if len(newpp) < 10:
+	    wobj = Wobj()
+	    dumpit(buf, wobj.write, newpp)
+	    ##print 'GETNEXTARG: inserted ' + `wobj.data`
+	return length, item
+    elif pp[item].chtype == chunk_type(PLAIN):
+	#grab one char
+	print 'WARNING: grabbing one char'
+	if len(s(buf, pp[item].data)) > 1:
+	    pp.insert(item, chunk(PLAIN, pp[item].where, s(buf, pp[item].data)[:1]))
+	    item, length = item+1, length+1
+	    pp[item].data = s(buf, pp[item].data)[1:]
 	else:
-	        ch = pp[item]
-		try:
-			str = `s(buf, ch.data)`
-		except TypeError:
-			str = `ch.data`
-			if len(str) > 400:
-				str = str[:400] + '...'
-		print 'GETNEXTARG:', ch.chtype, 'not handled, data ' + str
-		return length, item
+	    item = item+1
+	return length, item
+    else:
+	ch = pp[item]
+	try:
+	    str = `s(buf, ch.data)`
+	except TypeError:
+	    str = `ch.data`
+	    if len(str) > 400:
+		str = str[:400] + '...'
+	print 'GETNEXTARG:', ch.chtype, 'not handled, data ' + str
+	return length, item
 
 
 # this one is needed to find the end of LaTeX's optional argument, like
@@ -798,52 +790,52 @@
 # get a LaTeX-optional argument, you know, the square braces '[' and ']'
 def getoptarg(length, buf, pp, item):
 
-	wobj = Wobj()
-	dumpit(buf, wobj.write, pp[item:min(length, item + 5)])
-	##print 'GETOPTARG, (len, item) =', `length, item` + ' ---> ' + wobj.data + ' <---'
+    wobj = Wobj()
+    dumpit(buf, wobj.write, pp[item:min(length, item + 5)])
+    ##print 'GETOPTARG, (len, item) =', `length, item` + ' ---> ' + wobj.data + ' <---'
 
-	if item >= length or \
-		  pp[item].chtype != chunk_type(PLAIN) or \
-		  s(buf, pp[item].data)[0] != '[':
+    if item >= length or \
+	      pp[item].chtype != chunk_type(PLAIN) or \
+	      s(buf, pp[item].data)[0] != '[':
+	return length, item
+
+    pp[item].data = s(buf, pp[item].data)[1:]
+    if len(pp[item].data) == 0:
+	del pp[item]
+	length = length-1
+
+    while 1:
+	if item == length:
+	    raise error, 'No end of optional arg found'
+	if pp[item].chtype == chunk_type(PLAIN):
+	    text = s(buf, pp[item].data)
+	    pos = re_endopt.search(text)
+	    if pos >= 0:
+		pp[item].data = text[:pos]
+		if pos == 0:
+		    del pp[item]
+		    length = length-1
+		else:
+		    item=item+1
+		text = text[pos+1:]
+
+		while text and text[0] in ' \t':
+		    text = text[1:]
+
+		if text:
+		    pp.insert(item, chunk(PLAIN, 0, text))
+		    length = length + 1
 		return length, item
 
-	pp[item].data = s(buf, pp[item].data)[1:]
-	if len(pp[item].data) == 0:
-		del pp[item]
-		length = length-1
-
-	while 1:
-		if item == length:
-			raise error, 'No end of optional arg found'
-		if pp[item].chtype == chunk_type(PLAIN):
-			text = s(buf, pp[item].data)
-			pos = re_endopt.search(text)
-			if pos >= 0:
-				pp[item].data = text[:pos]
-				if pos == 0:
-					del pp[item]
-					length = length-1
-				else:
-					item=item+1
-				text = text[pos+1:]
-				
-				while text and text[0] in ' \t':
-					text = text[1:]
-					
-				if text:
-					pp.insert(item, chunk(PLAIN, 0, text))
-					length = length + 1
-				return length, item
-
-		item = item+1
+	item = item+1
 
 
 # Wobj just add write-requests to the ``data'' attribute
 class Wobj:
-	data = ''
+    data = ''
 
-	def write(self, data):
-		self.data = self.data + data
+    def write(self, data):
+	self.data = self.data + data
 
 # ignore these commands
 ignoredcommands = ('bcode', 'ecode')
@@ -855,7 +847,7 @@
 inargsselves = (',', '[', ']', '(', ')')
 # this is how *I* would show the difference between emph and strong
 #  code 1 means: fold to uppercase
-markcmds = {'code': ('', ''), 'var': 1, 'emph': ('_', '_'), \
+markcmds = {'code': ('', ''), 'var': 1, 'emph': ('_', '_'),
 	  'strong': ('*', '*')}
 
 # recognise patter {\FONTCHANGE-CMD TEXT} to \MAPPED-FC-CMD{TEXT}
@@ -868,95 +860,95 @@
 
 # try to remove macros and return flat text
 def flattext(buf, pp):
-	pp = crcopy(pp)
-	##print '---> FLATTEXT ' + `pp`
-	wobj = Wobj()
+    pp = crcopy(pp)
+    ##print '---> FLATTEXT ' + `pp`
+    wobj = Wobj()
 
-	i, length = 0, len(pp)
-	while 1:
-		if len(pp) != length:
-			raise 'FATAL', 'inconsistent length'
-		if i >= length:
-			break
-		ch = pp[i]
-		i = i+1
-		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)
-				ch.data = '\\'
-			elif len(s(buf, ch.data)) == 1 \
-				  and s(buf, ch.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 len(pp[i].data) == 0:
-					del pp[i]
-					length = length-1
-						
-			elif s(buf, ch.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)
-				x = markcmds[markcmd]
-				if type(x) == TupleType:
-					pre, after = x
-					str = pre+str+after
-				elif x == 1:
-					str = string.upper(str)
-				else:
-					raise 'FATAL', 'corrupt markcmds'
-				ch.data = str
-			else:
-				if s(buf, ch.data) not in ignoredcommands:
-					print 'WARNING: deleting command ' + `s(buf, ch.data)`
-					print 'PP' + `pp[i-1]`
-				del pp[i-1]
-				i, length = i-1, length-1
-		elif ch.chtype == chunk_type(GROUP):
-			length, newi = getnextarg(length, buf, pp, i-1)
-			i = i-1
+    i, length = 0, len(pp)
+    while 1:
+	if len(pp) != length:
+	    raise 'FATAL', 'inconsistent length'
+	if i >= length:
+	    break
+	ch = pp[i]
+	i = i+1
+	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)
+		ch.data = '\\'
+	    elif len(s(buf, ch.data)) == 1 \
+		      and s(buf, ch.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 len(pp[i].data) == 0:
+		    del pp[i]
+		    length = length-1
+
+	    elif s(buf, ch.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)
+		x = markcmds[markcmd]
+		if type(x) == TupleType:
+		    pre, after = x
+		    str = pre+str+after
+		elif x == 1:
+		    str = string.upper(str)
+		else:
+		    raise 'FATAL', 'corrupt markcmds'
+		ch.data = str
+	    else:
+		if s(buf, ch.data) not in ignoredcommands:
+		    print 'WARNING: deleting command ' + `s(buf, ch.data)`
+		    print 'PP' + `pp[i-1]`
+		del pp[i-1]
+		i, length = i-1, length-1
+	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.data = str
-		else:
-			pass
-		
-	dumpit(buf, wobj.write, pp)
-	##print 'FLATTEXT: RETURNING ' + `wobj.data`
-	return wobj.data
+	else:
+	    pass
+
+    dumpit(buf, wobj.write, pp)
+    ##print 'FLATTEXT: RETURNING ' + `wobj.data`
+    return wobj.data
 
 # try to generate node names (a bit shorter than the chapter title)
 # note that the \nodename command (see elsewhere) overules these efforts
 def invent_node_names(text):
-	words = string.split(text)
+    words = string.split(text)
 
-	##print 'WORDS ' + `words`
+    ##print 'WORDS ' + `words`
 
-	if len(words) == 2 \
-		  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':
-		return string.join(words[:2])
-	return text
-	
+    if len(words) == 2 \
+	      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':
+	return string.join(words[:2])
+    return text
+
 re_commas_etc = regex.compile('[,`\'@{}]')
 
 re_whitespace = regex.compile('[ \t]*')
@@ -969,27 +961,27 @@
 # Sometimes this is too much, maybe consider DENDLINE's as stop
 def next_command_p(length, buf, pp, i, cmdname):
 
-	while 1:
-		if i >= len(pp):
-			break
-		ch = pp[i]
-		i = i+1
-		if ch.chtype == chunk_type(ENDLINE):
-			continue
-		if ch.chtype == chunk_type(DENDLINE):
-			continue
-		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 s(buf, ch.data) == cmdname:
-				return i # _after_ the command
-			return -1
-		return -1
-			
-				
+    while 1:
+	if i >= len(pp):
+	    break
+	ch = pp[i]
+	i = i+1
+	if ch.chtype == chunk_type(ENDLINE):
+	    continue
+	if ch.chtype == chunk_type(DENDLINE):
+	    continue
+	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 s(buf, ch.data) == cmdname:
+		return i # _after_ the command
+	    return -1
+	return -1
+
+
 # things that are special to LaTeX, but not to texi..
 onlylatexspecial = '_~^$#&%'
 
@@ -999,17 +991,17 @@
 out = Struct()
 
 def startchange():
-	global hist, out
+    global hist, out
 
-	hist.inenv = []
-	hist.nodenames = []
-	hist.cindex = []
-	hist.inargs = 0
-	hist.enumeratenesting, hist.itemizenesting = 0, 0
+    hist.inenv = []
+    hist.nodenames = []
+    hist.cindex = []
+    hist.inargs = 0
+    hist.enumeratenesting, hist.itemizenesting = 0, 0
 
-	out.doublenodes = []
-	out.doublecindeces = []
-	
+    out.doublenodes = []
+    out.doublecindeces = []
+
 
 spacech = [chunk(PLAIN, 0, ' ')]
 commach = [chunk(PLAIN, 0, ', ')]
@@ -1051,174 +1043,173 @@
 ##   or \funcline{NAME}{ARGS}
 ##
 def do_funcdesc(length, buf, pp, i):
-	startpoint = i-1
-	ch = pp[startpoint]
-	wh = ch.where
-	length, newi = getnextarg(length, buf, pp, i)
-	funcname = chunk(GROUP, wh, pp[i:newi])
-	del pp[i:newi]
-	length = length - (newi-i)
-	save = hist.inargs
-	hist.inargs = 1
-	length, newi = getnextarg(length, buf, pp, i)
-	hist.inargs = save
-	del save
-	the_args = [chunk(PLAIN, wh, '()'[0])] + \
-		  pp[i:newi] + \
-		  [chunk(PLAIN, wh, '()'[1])]
-	del pp[i:newi]
-	length = length - (newi-i)
+    startpoint = i-1
+    ch = pp[startpoint]
+    wh = ch.where
+    length, newi = getnextarg(length, buf, pp, i)
+    funcname = chunk(GROUP, wh, pp[i:newi])
+    del pp[i:newi]
+    length = length - (newi-i)
+    save = hist.inargs
+    hist.inargs = 1
+    length, newi = getnextarg(length, buf, pp, i)
+    hist.inargs = save
+    del save
+    the_args = [chunk(PLAIN, wh, '()'[0])] + pp[i:newi] + \
+	      [chunk(PLAIN, wh, '()'[1])]
+    del pp[i:newi]
+    length = length - (newi-i)
 
-	idxsi = hist.indexsubitem	# words
-	command = ''
-	cat_class = ''
-	if idxsi and idxsi[-1] in ('method', 'protocol'):
-		command = 'defmethod'
-		cat_class = string.join(idxsi[:-1])
-	elif len(idxsi) == 2 and idxsi[1] == 'function':
-		command = 'deffn'
-		cat_class = string.join(idxsi)
-	elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
-		command = 'deffn'
-		cat_class = 'function of ' + string.join(idxsi[1:])
+    idxsi = hist.indexsubitem	# words
+    command = ''
+    cat_class = ''
+    if idxsi and idxsi[-1] in ('method', 'protocol'):
+	command = 'defmethod'
+	cat_class = string.join(idxsi[:-1])
+    elif len(idxsi) == 2 and idxsi[1] == 'function':
+	command = 'deffn'
+	cat_class = string.join(idxsi)
+    elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
+	command = 'deffn'
+	cat_class = 'function of ' + string.join(idxsi[1:])
 
-	if not command:
-		raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
-		
-	ch.chtype = chunk_type(CSLINE)
-	ch.data = command
-	
-	cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
-	cslinearg.append(chunk(PLAIN, wh, ' '))
-	cslinearg.append(funcname)
-	cslinearg.append(chunk(PLAIN, wh, ' '))
-	l = len(cslinearg)
-	cslinearg[l:l] = the_args
+    if not command:
+	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
-	pp.insert(i, chunk(GROUP, wh, cslinearg))
-	i, length = i+1, length+1
-	hist.command = command
-	return length, i
-	
+    ch.chtype = chunk_type(CSLINE)
+    ch.data = command
+
+    cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
+    cslinearg.append(chunk(PLAIN, wh, ' '))
+    cslinearg.append(funcname)
+    cslinearg.append(chunk(PLAIN, wh, ' '))
+    l = len(cslinearg)
+    cslinearg[l:l] = the_args
+
+    pp.insert(i, chunk(GROUP, wh, cslinearg))
+    i, length = i+1, length+1
+    hist.command = command
+    return length, i
+
 
 ## this routine will be called on \begin{excdesc}{NAME}
 ## or \excline{NAME}
 ##	
 def do_excdesc(length, buf, pp, i):
-	startpoint = i-1
-	ch = pp[startpoint]
-	wh = ch.where
-	length, newi = getnextarg(length, buf, pp, i)
-	excname = chunk(GROUP, wh, pp[i:newi])
-	del pp[i:newi]
-	length = length - (newi-i)
+    startpoint = i-1
+    ch = pp[startpoint]
+    wh = ch.where
+    length, newi = getnextarg(length, buf, pp, i)
+    excname = chunk(GROUP, wh, pp[i:newi])
+    del pp[i:newi]
+    length = length - (newi-i)
 
-	idxsi = hist.indexsubitem	# words
-	command = ''
-	cat_class = ''
-	class_class = ''
-	if len(idxsi) == 2 and idxsi[1] == 'exception':
-		command = 'defvr'
-		cat_class = string.join(idxsi)
-	elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
-		command = 'defcv'
-		cat_class = 'exception'
-		class_class = string.join(idxsi[1:])
-	elif len(idxsi) == 4 and idxsi[:3] == ['exception', 'in', 'module']:
-		command = 'defcv'
-		cat_class = 'exception'
-		class_class = string.join(idxsi[2:])
-		
+    idxsi = hist.indexsubitem	# words
+    command = ''
+    cat_class = ''
+    class_class = ''
+    if len(idxsi) == 2 and idxsi[1] == 'exception':
+	command = 'defvr'
+	cat_class = string.join(idxsi)
+    elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
+	command = 'defcv'
+	cat_class = 'exception'
+	class_class = string.join(idxsi[1:])
+    elif len(idxsi) == 4 and idxsi[:3] == ['exception', 'in', 'module']:
+	command = 'defcv'
+	cat_class = 'exception'
+	class_class = string.join(idxsi[2:])
 
-	if not command:
-		raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
-		
-	ch.chtype = chunk_type(CSLINE)
-	ch.data = command
-	
-	cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
+
+    if not command:
+	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
+
+    ch.chtype = chunk_type(CSLINE)
+    ch.data = command
+
+    cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
+    cslinearg.append(chunk(PLAIN, wh, ' '))
+    if class_class:
+	cslinearg.append(chunk(GROUP, wh, [chunk(PLAIN, wh, class_class)]))
 	cslinearg.append(chunk(PLAIN, wh, ' '))
-	if class_class:
-		cslinearg.append(chunk(GROUP, wh, [chunk(PLAIN, wh, class_class)]))
-		cslinearg.append(chunk(PLAIN, wh, ' '))
-	cslinearg.append(excname)
+    cslinearg.append(excname)
 
-	pp.insert(i, chunk(GROUP, wh, cslinearg))
-	i, length = i+1, length+1
-	hist.command = command
-	return length, i
+    pp.insert(i, chunk(GROUP, wh, cslinearg))
+    i, length = i+1, length+1
+    hist.command = command
+    return length, i
 
 ## same for datadesc or dataline...
 def do_datadesc(length, buf, pp, i):
-	startpoint = i-1
-	ch = pp[startpoint]
-	wh = ch.where
-	length, newi = getnextarg(length, buf, pp, i)
-	dataname = chunk(GROUP, wh, pp[i:newi])
-	del pp[i:newi]
-	length = length - (newi-i)
+    startpoint = i-1
+    ch = pp[startpoint]
+    wh = ch.where
+    length, newi = getnextarg(length, buf, pp, i)
+    dataname = chunk(GROUP, wh, pp[i:newi])
+    del pp[i:newi]
+    length = length - (newi-i)
 
-	idxsi = hist.indexsubitem	# words
-	command = ''
-	cat_class = ''
-	class_class = ''
-	if idxsi[-1] in ('attribute', 'option'):
-		command = 'defcv'
-		cat_class = idxsi[-1]
-		class_class = string.join(idxsi[:-1])
-	elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
-		command = 'defcv'
-		cat_class = 'data'
-		class_class = string.join(idxsi[1:])
-	elif len(idxsi) == 4 and idxsi[:3] == ['data', 'in', 'module']:
-		command = 'defcv'
-		cat_class = 'data'
-		class_class = string.join(idxsi[2:])
-		
+    idxsi = hist.indexsubitem	# words
+    command = ''
+    cat_class = ''
+    class_class = ''
+    if idxsi[-1] in ('attribute', 'option'):
+	command = 'defcv'
+	cat_class = idxsi[-1]
+	class_class = string.join(idxsi[:-1])
+    elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
+	command = 'defcv'
+	cat_class = 'data'
+	class_class = string.join(idxsi[1:])
+    elif len(idxsi) == 4 and idxsi[:3] == ['data', 'in', 'module']:
+	command = 'defcv'
+	cat_class = 'data'
+	class_class = string.join(idxsi[2:])
 
-	if not command:
-		raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
-		
-	ch.chtype = chunk_type(CSLINE)
-	ch.data = command
-	
-	cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
+
+    if not command:
+	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
+
+    ch.chtype = chunk_type(CSLINE)
+    ch.data = command
+
+    cslinearg = [chunk(GROUP, wh, [chunk(PLAIN, wh, cat_class)])]
+    cslinearg.append(chunk(PLAIN, wh, ' '))
+    if class_class:
+	cslinearg.append(chunk(GROUP, wh, [chunk(PLAIN, wh, class_class)]))
 	cslinearg.append(chunk(PLAIN, wh, ' '))
-	if class_class:
-		cslinearg.append(chunk(GROUP, wh, [chunk(PLAIN, wh, class_class)]))
-		cslinearg.append(chunk(PLAIN, wh, ' '))
-	cslinearg.append(dataname)
+    cslinearg.append(dataname)
 
-	pp.insert(i, chunk(GROUP, wh, cslinearg))
-	i, length = i+1, length+1
-	hist.command = command
-	return length, i
-	
+    pp.insert(i, chunk(GROUP, wh, cslinearg))
+    i, length = i+1, length+1
+    hist.command = command
+    return length, i
+
 
 # regular indices: those that are not set in tt font by default....
 regindices = ('cindex', )
 
 # remove illegal characters from node names
 def rm_commas_etc(text):
-	result = ''
-	changed = 0
-	while 1:
-		pos = re_commas_etc.search(text)
-		if pos >= 0:
-			changed = 1
-			result = result + text[:pos]
-			text = text[pos+1:]
-		else:
-			result = result + text
-			break
-	if changed:
-		print 'Warning: nodename changhed to ' + `result`
+    result = ''
+    changed = 0
+    while 1:
+	pos = re_commas_etc.search(text)
+	if pos >= 0:
+	    changed = 1
+	    result = result + text[:pos]
+	    text = text[pos+1:]
+	else:
+	    result = result + text
+	    break
+    if changed:
+	print 'Warning: nodename changhed to ' + `result`
 
-	return result
-			
+    return result
+
 # boolean flags
 flags = {'texi': 1}
-	
+
 
 ##
 ## changeit: the actual routine, that changes the contents of the parsed
@@ -1226,932 +1217,927 @@
 ##
 
 def changeit(buf, pp):
-	global onlylatexspecial, hist, out
+    global onlylatexspecial, hist, out
 
-	i, length = 0, len(pp)
-	while 1:
-		# sanity check: length should always equal len(pp)
-		if len(pp) != length:
-			raise 'FATAL', 'inconsistent length. thought ' + `length` + ', but should really be ' + `len(pp)`
-		if i >= length:
-			break
-		ch = pp[i]
-		i = i + 1
+    i, length = 0, len(pp)
+    while 1:
+	# sanity check: length should always equal len(pp)
+	if len(pp) != length:
+	    raise 'FATAL', 'inconsistent length. thought ' + `length` + ', but should really be ' + `len(pp)`
+	if i >= length:
+	    break
+	ch = pp[i]
+	i = i + 1
 
-		if type(ch) is StringType:
-			#normally, only chunks are present in pp,
-			# but in some cases, some extra info
-			# has been inserted, e.g., the \end{...} clauses
-			raise 'FATAL', 'got string, probably too many ' + `end`
+	if type(ch) is StringType:
+	    #normally, only chunks are present in pp,
+	    # but in some cases, some extra info
+	    # has been inserted, e.g., the \end{...} clauses
+	    raise 'FATAL', 'got string, probably too many ' + `end`
 
-		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():
-				k = s(buf, ch.data[0].data)
-				del ch.data[0]
-				pp.insert(i-1, chunk(CSNAME, ch.where, fontchanges[k]))
-				length, i = length+1, i+1
+	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():
+		k = s(buf, ch.data[0].data)
+		del ch.data[0]
+		pp.insert(i-1, chunk(CSNAME, ch.where, fontchanges[k]))
+		length, i = length+1, i+1
 
-			# recursively parse the contents of the group
-			changeit(buf, ch.data)
+	    # recursively parse the contents of the group
+	    changeit(buf, ch.data)
 
-		elif ch.chtype == chunk_type(IF):
-			# \if...
-			flag, negate, data = ch.data
-			##print 'IF: flag, negate = ' + `flag, negate`
-			if flag not in flags.keys():
-				raise error, 'unknown flag ' + `flag`
-				
-			value = flags[flag]
-			if negate:
-				value = (not value)
-			del pp[i-1]
-			length, i = length-1, i-1
-			if value:
-				pp[i:i] = data
-				length = length + len(data)
-					
-			
-		elif ch.chtype == chunk_type(ENV):
-			# \begin{...} ....
-			envname, data = ch.data
+	elif ch.chtype == chunk_type(IF):
+	    # \if...
+	    flag, negate, data = ch.data
+	    ##print 'IF: flag, negate = ' + `flag, negate`
+	    if flag not in flags.keys():
+		raise error, 'unknown flag ' + `flag`
 
-			#push this environment name on stack
-			hist.inenv.insert(0, envname)
-
-			#append an endenv chunk after grouped data
-			data.append(chunk(ENDENV, ch.where, envname))
-			##[`data`]
-
-			#delete this object
-			del pp[i-1]
-			i, length = i-1, length-1
-
-			#insert found data
-			pp[i:i] = data
-			length = length + len(data)
-
-			if envname == 'verbatim':
-				pp[i:i] = [chunk(CSLINE, ch.where, 'example'), \
-					  chunk(GROUP, ch.where, [])]
-				length, i = length+2, i+2
-
-			elif envname == 'itemize':
-				if hist.itemizenesting > len(itemizesymbols):
-					raise error, 'too deep itemize nesting'
-				ingroupch = [chunk(CSNAME, ch.where,\
-					  itemizesymbols[hist.itemizenesting])]
-				hist.itemizenesting = hist.itemizenesting + 1
-				pp[i:i] = [chunk(CSLINE, ch.where, 'itemize'),\
-					  chunk(GROUP, ch.where, ingroupch)]
-				length, i = length+2, i+2
-				
-			elif envname == 'enumerate':
-				if hist.enumeratenesting > len(enumeratesymbols):
-					raise error, 'too deep enumerate nesting'
-				ingroupch = [chunk(PLAIN, ch.where,\
-					  enumeratesymbols[hist.enumeratenesting])]
-				hist.enumeratenesting = hist.enumeratenesting + 1
-				pp[i:i] = [chunk(CSLINE, ch.where, 'enumerate'),\
-					  chunk(GROUP, ch.where, ingroupch)]
-				length, i = length+2, i+2
-				
-			elif envname == 'description':
-				ingroupch = [chunk(CSNAME, ch.where, 'b')]
-				pp[i:i] = [chunk(CSLINE, ch.where, 'table'), \
-					  chunk(GROUP, ch.where, ingroupch)]
-				length, i = length+2, i+2
-				
-			elif (envname == 'tableiii') or \
-			     (envname == 'tableii'):
-				if (envname == 'tableii'):
-					ltable = 2
-				else:
-					ltable = 3
-				wh = ch.where
-				newcode = []
-				
-				#delete tabular format description
-				# e.g., {|l|c|l|}
-				length, newi = getnextarg(length, buf, pp, i)
-				del pp[i:newi]
-				length = length - (newi-i)
-
-				newcode.append(chunk(CSLINE, wh, 'table'))
-				ingroupch = [chunk(CSNAME, wh, 'asis')]
-				newcode.append(chunk(GROUP, wh, ingroupch))
-				newcode.append(chunk(CSLINE, wh, 'item'))
-
-				#get the name of macro for @item
-				# e.g., {code}
-				length, newi = getnextarg(length, buf, pp, i)
-				
-				if newi-i != 1:
-					raise error, 'Sorry, expected 1 chunk argument'
-				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]
-				length = length - (newi-i)
-
-				itembody = []
-				for count in range(ltable):
-					length, newi = getnextarg(length, buf, pp, i)
-					emphgroup = [\
-						  chunk(CSNAME, wh, 'emph'), \
-						  chunk(GROUP, 0, pp[i:newi])]
-					del pp[i:newi]
-					length = length - (newi-i)
-					if count == 0:
-						itemarg = emphgroup
-					elif count == ltable-1:
-						itembody = itembody + \
-							  [chunk(PLAIN, wh, '  ---  ')] + \
-							  emphgroup
-					else:
-						itembody = emphgroup
-				newcode.append(chunk(GROUP, wh, itemarg))
-				newcode = newcode + itembody + [chunk(DENDLINE, wh, '\n')]
-				pp[i:i] = newcode
-				l = len(newcode)
-				length, i = length+l, i+l
-				del newcode, l
-
-				if length != len(pp):
-					raise 'STILL, SOMETHING wrong', `i`
+	    value = flags[flag]
+	    if negate:
+		value = (not value)
+	    del pp[i-1]
+	    length, i = length-1, i-1
+	    if value:
+		pp[i:i] = data
+		length = length + len(data)
 
 
-			elif envname == 'funcdesc':
-				pp.insert(i, chunk(PLAIN, ch.where, ''))
-				i, length = i+1, length+1
-				length, i = do_funcdesc(length, buf, pp, i)
-					  
-			elif envname == 'excdesc':
-				pp.insert(i, chunk(PLAIN, ch.where, ''))
-				i, length = i+1, length+1
-				length, i = do_excdesc(length, buf, pp, i)
-					  
-			elif envname == 'datadesc':
-				pp.insert(i, chunk(PLAIN, ch.where, ''))
-				i, length = i+1, length+1
-				length, i = do_datadesc(length, buf, pp, i)
-					  
-			else:
-				print 'WARNING: don\'t know what to do with env ' + `envname`
-				
-		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]`
-			del hist.inenv[0]
-			del pp[i-1]
-			i, length = i-1, length-1
+	elif ch.chtype == chunk_type(ENV):
+	    # \begin{...} ....
+	    envname, data = ch.data
 
-			if envname == 'verbatim':
-				pp[i:i] = [\
-					  chunk(CSLINE, ch.where, 'end'), \
-					  chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, 'example')])]
-				i, length = i+2, length+2
-			elif envname == 'itemize':
-				hist.itemizenesting = hist.itemizenesting - 1
-				pp[i:i] = [\
-					  chunk(CSLINE, ch.where, 'end'), \
-					  chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, 'itemize')])]
-				i, length = i+2, length+2
-			elif envname == 'enumerate':
-				hist.enumeratenesting = hist.enumeratenesting-1
-				pp[i:i] = [\
-					  chunk(CSLINE, ch.where, 'end'), \
-					  chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, 'enumerate')])]
-				i, length = i+2, length+2
-			elif envname == 'description':
-				pp[i:i] = [\
-					  chunk(CSLINE, ch.where, 'end'), \
-					  chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, 'table')])]
-				i, length = i+2, length+2
-			elif (envname == 'tableiii') or (envname == 'tableii'):
-				pp[i:i] = [\
-					  chunk(CSLINE, ch.where, 'end'), \
-					  chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, 'table')])]
-				i, length = i+2, length + 2
-				pp.insert(i, chunk(DENDLINE, ch.where, '\n'))
-				i, length = i+1, length+1
+	    #push this environment name on stack
+	    hist.inenv.insert(0, envname)
 
-			elif envname in ('funcdesc', 'excdesc', 'datadesc'):
-				pp[i:i] = [\
-					  chunk(CSLINE, ch.where, 'end'), \
-					  chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, hist.command)])]
-				i, length = i+2, length+2
-			else:
-				print 'WARNING: ending env ' + `envname` + 'has no actions'
-				
-		elif ch.chtype == chunk_type(CSNAME):
-			# control name transformations
-			if s(buf, ch.data) == 'optional':
-				pp[i-1].chtype = chunk_type (PLAIN)
-				pp[i-1].data = '['
-				if (i < length) and \
-				   (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:
-				del pp[i-1]
-				i, length = i-1, length-1
-			elif s(buf, ch.data) == '@' and \
-				  i != length 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) == '\\':
-				# \\ --> \* --> @*
-				ch.data = '*'
-			elif len(s(buf, ch.data)) == 1 and \
-				  s(buf, ch.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) \
-					  and len(pp[i].data) == 0:
-					del pp[i]
-					length = length-1
+	    #append an endenv chunk after grouped data
+	    data.append(chunk(ENDENV, ch.where, envname))
+	    ##[`data`]
 
-			elif hist.inargs and s(buf, ch.data) in inargsselves:
-				# This is the special processing of the
-				# arguments of the \begin{funcdesc}... or
-				# \funcline... arguments
-				# \, --> , \[ --> [, \] --> ]
-				ch.chtype = chunk_type(PLAIN)
-				
-			elif s(buf, ch.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 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'
-					words = string.split(text[1:-1])
-					hist.indexsubitem = words
-					del text, words
-				else:
-					print 'WARNING: renewcommand with unsupported arg removed'
-				del pp[i:newi]
-				length = length - (newi-i)
+	    #delete this object
+	    del pp[i-1]
+	    i, length = i-1, length-1
 
-			elif s(buf, ch.data) == 'item':
-				ch.chtype = chunk_type(CSLINE)
-				length, newi = getoptarg(length, buf, pp, i)
-				ingroupch = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
-				pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-				i, length = i+1, length+1
-				
-			elif s(buf, ch.data) == 'ttindex':
-				idxsi = hist.indexsubitem
+	    #insert found data
+	    pp[i:i] = data
+	    length = length + len(data)
 
-				cat_class = ''
-				if len(idxsi) >= 2 and idxsi[1] in \
-					  ('method', 'function', 'protocol'):
-					command = 'findex'
-				elif len(idxsi) >= 2 and idxsi[1] in \
-					  ('exception', 'object'):
-					command = 'vindex'
-				else:
-					print 'WARNING: can\'t categorize ' + `idxsi` + ' for \'ttindex\' command'
-					command = 'cindex'
+	    if envname == 'verbatim':
+		pp[i:i] = [chunk(CSLINE, ch.where, 'example'),
+			  chunk(GROUP, ch.where, [])]
+		length, i = length+2, i+2
 
-				if not cat_class:
-					cat_class = '('+string.join(idxsi)+')'
+	    elif envname == 'itemize':
+		if hist.itemizenesting > len(itemizesymbols):
+		    raise error, 'too deep itemize nesting'
+		ingroupch = [chunk(CSNAME, ch.where,
+			  itemizesymbols[hist.itemizenesting])]
+		hist.itemizenesting = hist.itemizenesting + 1
+		pp[i:i] = [chunk(CSLINE, ch.where, 'itemize'),
+			  chunk(GROUP, ch.where, ingroupch)]
+		length, i = length+2, i+2
 
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = command
+	    elif envname == 'enumerate':
+		if hist.enumeratenesting > len(enumeratesymbols):
+		    raise error, 'too deep enumerate nesting'
+		ingroupch = [chunk(PLAIN, ch.where,
+			  enumeratesymbols[hist.enumeratenesting])]
+		hist.enumeratenesting = hist.enumeratenesting + 1
+		pp[i:i] = [chunk(CSLINE, ch.where, 'enumerate'),
+			  chunk(GROUP, ch.where, ingroupch)]
+		length, i = length+2, i+2
 
-				length, newi = getnextarg(length, buf, pp, i)
-				arg = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
+	    elif envname == 'description':
+		ingroupch = [chunk(CSNAME, ch.where, 'b')]
+		pp[i:i] = [chunk(CSLINE, ch.where, 'table'),
+			  chunk(GROUP, ch.where, ingroupch)]
+		length, i = length+2, i+2
 
-				cat_arg = [chunk(PLAIN, ch.where, cat_class)]
+	    elif (envname == 'tableiii') or (envname == 'tableii'):
+		if (envname == 'tableii'):
+		    ltable = 2
+		else:
+		    ltable = 3
+		wh = ch.where
+		newcode = []
 
-				# determine what should be set in roman, and
-				# what in tt-font
-				if command in regindices:
+		#delete tabular format description
+		# e.g., {|l|c|l|}
+		length, newi = getnextarg(length, buf, pp, i)
+		del pp[i:newi]
+		length = length - (newi-i)
 
-					arg = [chunk(CSNAME, ch.where, 't'), \
-						  chunk(GROUP, ch.where, arg)]
-				else:
-					cat_arg = [chunk(CSNAME, ch.where, 'r'), \
-						  chunk(GROUP, ch.where, cat_arg)]
+		newcode.append(chunk(CSLINE, wh, 'table'))
+		ingroupch = [chunk(CSNAME, wh, 'asis')]
+		newcode.append(chunk(GROUP, wh, ingroupch))
+		newcode.append(chunk(CSLINE, wh, 'item'))
 
-				ingroupch = arg + \
-					  [chunk(PLAIN, ch.where, ' ')] + \
-					  cat_arg
-				
-				pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-				length, i = length+1, i+1
+		#get the name of macro for @item
+		# e.g., {code}
+		length, newi = getnextarg(length, buf, pp, i)
 
-				
-			elif s(buf, ch.data) == 'ldots':
-				# \ldots --> \dots{} --> @dots{}
-				ch.data = 'dots'
-				if i == length \
-					  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:
-				# \UNIX --> UNIX
-				ch.chtype = chunk_type(PLAIN)
-				if i != length \
-					  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:
-				pass
+		if newi-i != 1:
+		    raise error, 'Sorry, expected 1 chunk argument'
+		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]
+		length = length - (newi-i)
 
-			elif s(buf, ch.data) == 'e':
-				# "\e" --> "\"
-				ch.data = '\\'
-				ch.chtype = chunk_type(PLAIN)
-			elif (s(buf, ch.data) == 'lineiii') or\
-			     (s(buf, ch.data) == 'lineii'):
-				# This is the most tricky one
-				# \lineiii{a1}{a2}[{a3}] -->
-				# @item @<cts. of itemargmacro>{a1}
-				#  a2 [ -- a3]
-				#
-				##print 'LINEIIIIII!!!!!!!'
+		itembody = []
+		for count in range(ltable):
+		    length, newi = getnextarg(length, buf, pp, i)
+		    emphgroup = [
+			      chunk(CSNAME, wh, 'emph'),
+			      chunk(GROUP, 0, pp[i:newi])]
+		    del pp[i:newi]
+		    length = length - (newi-i)
+		    if count == 0:
+			itemarg = emphgroup
+		    elif count == ltable-1:
+			itembody = itembody + \
+				  [chunk(PLAIN, wh, '  ---  ')] + emphgroup
+		    else:
+			itembody = emphgroup
+		newcode.append(chunk(GROUP, wh, itemarg))
+		newcode = newcode + itembody + [chunk(DENDLINE, wh, '\n')]
+		pp[i:i] = newcode
+		l = len(newcode)
+		length, i = length+l, i+l
+		del newcode, l
+
+		if length != len(pp):
+		    raise 'STILL, SOMETHING wrong', `i`
+
+
+	    elif envname == 'funcdesc':
+		pp.insert(i, chunk(PLAIN, ch.where, ''))
+		i, length = i+1, length+1
+		length, i = do_funcdesc(length, buf, pp, i)
+
+	    elif envname == 'excdesc':
+		pp.insert(i, chunk(PLAIN, ch.where, ''))
+		i, length = i+1, length+1
+		length, i = do_excdesc(length, buf, pp, i)
+
+	    elif envname == 'datadesc':
+		pp.insert(i, chunk(PLAIN, ch.where, ''))
+		i, length = i+1, length+1
+		length, i = do_datadesc(length, buf, pp, i)
+
+	    else:
+		print 'WARNING: don\'t know what to do with env ' + `envname`
+
+	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]`
+	    del hist.inenv[0]
+	    del pp[i-1]
+	    i, length = i-1, length-1
+
+	    if envname == 'verbatim':
+		pp[i:i] = [
+			  chunk(CSLINE, ch.where, 'end'),
+			  chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where, 'example')])]
+		i, length = i+2, length+2
+	    elif envname == 'itemize':
+		hist.itemizenesting = hist.itemizenesting - 1
+		pp[i:i] = [
+			  chunk(CSLINE, ch.where, 'end'),
+			  chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where, 'itemize')])]
+		i, length = i+2, length+2
+	    elif envname == 'enumerate':
+		hist.enumeratenesting = hist.enumeratenesting-1
+		pp[i:i] = [
+			  chunk(CSLINE, ch.where, 'end'),
+			  chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where, 'enumerate')])]
+		i, length = i+2, length+2
+	    elif envname == 'description':
+		pp[i:i] = [
+			  chunk(CSLINE, ch.where, 'end'),
+			  chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where, 'table')])]
+		i, length = i+2, length+2
+	    elif (envname == 'tableiii') or (envname == 'tableii'):
+		pp[i:i] = [
+			  chunk(CSLINE, ch.where, 'end'),
+			  chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where, 'table')])]
+		i, length = i+2, length + 2
+		pp.insert(i, chunk(DENDLINE, ch.where, '\n'))
+		i, length = i+1, length+1
+
+	    elif envname in ('funcdesc', 'excdesc', 'datadesc'):
+		pp[i:i] = [
+			  chunk(CSLINE, ch.where, 'end'),
+			  chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where, hist.command)])]
+		i, length = i+2, length+2
+	    else:
+		print 'WARNING: ending env ' + `envname` + 'has no actions'
+
+	elif ch.chtype == chunk_type(CSNAME):
+	    # control name transformations
+	    if s(buf, ch.data) == 'optional':
+		pp[i-1].chtype = chunk_type (PLAIN)
+		pp[i-1].data = '['
+		if (i < length) and \
+		   (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:
+		del pp[i-1]
+		i, length = i-1, length-1
+	    elif s(buf, ch.data) == '@' and \
+		      i != length 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) == '\\':
+		# \\ --> \* --> @*
+		ch.data = '*'
+	    elif len(s(buf, ch.data)) == 1 and \
+		      s(buf, ch.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) \
+			  and len(pp[i].data) == 0:
+		    del pp[i]
+		    length = length-1
+
+	    elif hist.inargs and s(buf, ch.data) in inargsselves:
+		# This is the special processing of the
+		# arguments of the \begin{funcdesc}... or
+		# \funcline... arguments
+		# \, --> , \[ --> [, \] --> ]
+		ch.chtype = chunk_type(PLAIN)
+
+	    elif s(buf, ch.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 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'
+		    words = string.split(text[1:-1])
+		    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)
+		length, newi = getoptarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		i, length = i+1, length+1
+
+	    elif s(buf, ch.data) == 'ttindex':
+		idxsi = hist.indexsubitem
+
+		cat_class = ''
+		if len(idxsi) >= 2 and idxsi[1] in \
+			  ('method', 'function', 'protocol'):
+		    command = 'findex'
+		elif len(idxsi) >= 2 and idxsi[1] in \
+			  ('exception', 'object'):
+		    command = 'vindex'
+		else:
+		    print 'WARNING: can\'t categorize ' + `idxsi` + ' for \'ttindex\' command'
+		    command = 'cindex'
+
+		if not cat_class:
+		    cat_class = '('+string.join(idxsi)+')'
+
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = command
+
+		length, newi = getnextarg(length, buf, pp, i)
+		arg = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+
+		cat_arg = [chunk(PLAIN, ch.where, cat_class)]
+
+		# determine what should be set in roman, and
+		# what in tt-font
+		if command in regindices:
+
+		    arg = [chunk(CSNAME, ch.where, 't'),
+			      chunk(GROUP, ch.where, arg)]
+		else:
+		    cat_arg = [chunk(CSNAME, ch.where, 'r'),
+			      chunk(GROUP, ch.where, cat_arg)]
+
+		ingroupch = arg + \
+			  [chunk(PLAIN, ch.where, ' ')] + \
+			  cat_arg
+
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		length, i = length+1, i+1
+
+
+	    elif s(buf, ch.data) == 'ldots':
+		# \ldots --> \dots{} --> @dots{}
+		ch.data = 'dots'
+		if i == length \
+			  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:
+		# \UNIX --> UNIX
+		ch.chtype = chunk_type(PLAIN)
+		if i != length \
+			  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:
+		pass
+
+	    elif s(buf, ch.data) == 'e':
+		# "\e" --> "\"
+		ch.data = '\\'
+		ch.chtype = chunk_type(PLAIN)
+	    elif (s(buf, ch.data) == 'lineiii') or\
+		 (s(buf, ch.data) == 'lineii'):
+		# This is the most tricky one
+		# \lineiii{a1}{a2}[{a3}] -->
+		# @item @<cts. of itemargmacro>{a1}
+		#  a2 [ -- a3]
+		#
+		##print 'LINEIIIIII!!!!!!!'
 ##				wobj = Wobj()
 ##				dumpit(buf, wobj.write, pp[i-1:i+5])
 ##				print '--->' + wobj.data + '<----'
-				if not hist.inenv:
-					raise error, \
-						  'no environment for lineiii'
-				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)
-				ch.data = 'item'
-				length, newi = getnextarg(length, buf, pp, i)
-				ingroupch = [chunk(CSNAME, 0, \
-					  hist.itemargmacro), \
-					  chunk(GROUP, 0, pp[i:newi])]
-				del pp[i:newi]
-				length = length - (newi-i)
+		if not hist.inenv:
+		    raise error, 'no environment for lineiii'
+		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)
+		ch.data = 'item'
+		length, newi = getnextarg(length, buf, pp, i)
+		ingroupch = [chunk(CSNAME, 0,
+			  hist.itemargmacro),
+			  chunk(GROUP, 0, pp[i:newi])]
+		del pp[i:newi]
+		length = length - (newi-i)
 ##				print 'ITEM ARG: --->',
 ##				wobj = Wobj()
 ##				dumpit(buf, wobj.write, ingroupch)
 ##				print wobj.data, '<---'
-				pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-				grouppos = i
-				i, length = i+1, length+1
-				length, i = getnextarg(length, buf, pp, i)
-				length, newi = getnextarg(length, buf, pp, i)
-				if newi > i:
-					# we have a 3rd arg
-					pp.insert(i, chunk(PLAIN, ch.where, '  ---  '))
-					i = newi + 1
-					length = length + 1
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		grouppos = i
+		i, length = i+1, length+1
+		length, i = getnextarg(length, buf, pp, i)
+		length, newi = getnextarg(length, buf, pp, i)
+		if newi > i:
+		    # we have a 3rd arg
+		    pp.insert(i, chunk(PLAIN, ch.where, '  ---  '))
+		    i = newi + 1
+		    length = length + 1
 ##					pp[grouppos].data = pp[grouppos].data \
 ##						  + [chunk(PLAIN, ch.where, '  ')] \
 ##						  + pp[i:newi]
 ##					del pp[i:newi]
 ##					length = length - (newi-i)
-				if length != len(pp):
-					raise 'IN LINEIII IS THE ERR', `i`
+		if length != len(pp):
+		    raise 'IN LINEIII IS THE ERR', `i`
 
-			elif s(buf, ch.data) in ('chapter', 'section', 'subsection', 'subsubsection'):
-				#\xxxsection{A} ---->
-				# @node A, , ,
-				# @xxxsection A
-				## also: remove commas and quotes
-				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])]
-					length, newi = length - (newi-i) + 1, \
-						  i+1
-					text = flattext(buf, cp1)
-					text = invent_node_names(text)
-				else:
-					length, endarg = getnextarg(length, buf, pp, afternodenamecmd)
-					cp1 = crcopy(pp[afternodenamecmd:endarg])
-					del pp[newi:endarg]
-					length = length - (endarg-newi)
+	    elif s(buf, ch.data) in ('chapter', 'section', 'subsection', 'subsubsection'):
+		#\xxxsection{A} ---->
+		# @node A, , ,
+		# @xxxsection A
+		## also: remove commas and quotes
+		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])]
+		    length, newi = length - (newi-i) + 1, i+1
+		    text = flattext(buf, cp1)
+		    text = invent_node_names(text)
+		else:
+		    length, endarg = getnextarg(length, buf, pp, afternodenamecmd)
+		    cp1 = crcopy(pp[afternodenamecmd:endarg])
+		    del pp[newi:endarg]
+		    length = length - (endarg-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] == '.':
-					text = text[:-1]
+		    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] == '.':
+		    text = text[:-1]
 ##				print 'FLATTEXT:', `text`
-				if text in hist.nodenames:
-					print 'WARNING: node name ' + `text` + ' already used'
-					out.doublenodes.append(text)
-				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+', , ,')\
-					  ])]
-				i, length = newi+2, length+2
+		if text in hist.nodenames:
+		    print 'WARNING: node name ' + `text` + ' already used'
+		    out.doublenodes.append(text)
+		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+', , ,')
+			  ])]
+		i, length = newi+2, length+2
 
-			elif s(buf,ch.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)])]
-				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)])]
-				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)])]
-				i, length = i+2, length+2
-				length, i = do_excdesc(length, buf, pp, i)
-				
-				
-			elif s(buf, ch.data) == 'index':
-				#\index{A} --->
-				# @cindex A
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = 'cindex'
-				length, newi = getnextarg(length, buf, pp, i)
+	    elif s(buf,ch.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)])]
+		i, length = i+2, length+2
+		length, i = do_funcdesc(length, buf, pp, i)
 
-				ingroupch = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
-				pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-				length, i = length+1, i+1
+	    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)])]
+		i, length = i+2, length+2
+		length, i = do_datadesc(length, buf, pp, i)
 
-			elif s(buf, ch.data) == 'bifuncindex':
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = 'findex'
-				length, newi = getnextarg(length, buf, pp, i)
-				ingroupch = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
-
-				ingroupch.append(chunk(PLAIN, ch.where, ' '))
-				ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-				ingroupch.append(chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, \
-					  '(built-in function)')]))
-
-				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)
-				ch.data = 'findex'
-				length, newi = getnextarg(length, buf, pp, i)
-				ingroupch = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
-
-				ingroupch.append(chunk(PLAIN, ch.where, ' '))
-				ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-				ingroupch.append(chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, \
-					  '(object)')]))
-
-				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)
-				ch.data = 'findex'
-				length, newi = getnextarg(length, buf, pp, i)
-				ingroupch = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
-
-				ingroupch.append(chunk(PLAIN, ch.where, ' '))
-				ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-				ingroupch.append(chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, \
-					  '(operator)')]))
-
-				pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-				length, i = length+1, i+1
+	    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)])]
+		i, length = i+2, length+2
+		length, i = do_excdesc(length, buf, pp, i)
 
 
-			elif s(buf, ch.data) == 'bimodindex':
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = 'pindex'
-				length, newi = getnextarg(length, buf, pp, i)
-				ingroupch = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
+	    elif s(buf, ch.data) == 'index':
+		#\index{A} --->
+		# @cindex A
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = 'cindex'
+		length, newi = getnextarg(length, buf, pp, i)
 
-				ingroupch.append(chunk(PLAIN, ch.where, ' '))
-				ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-				ingroupch.append(chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, \
-					  '(built-in)')]))
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		length, i = length+1, i+1
 
-				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)
+		ch.data = 'findex'
+		length, newi = getnextarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
 
-			elif s(buf, ch.data) == 'sectcode':
-				ch.data = 'code'
+		ingroupch.append(chunk(PLAIN, ch.where, ' '))
+		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
+		ingroupch.append(chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where,
+			  '(built-in function)')]))
+
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		length, i = length+1, i+1
 
 
-			elif s(buf, ch.data) == 'stmodindex':
-				ch.chtype = chunk_type(CSLINE)
-				# use the program index as module index
-				ch.data = 'pindex'
-				length, newi = getnextarg(length, buf, pp, i)
-				ingroupch = pp[i:newi]
-				del pp[i:newi]
-				length = length - (newi-i)
+	    elif s(buf, ch.data) == 'obindex':
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = 'findex'
+		length, newi = getnextarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
 
-				ingroupch.append(chunk(PLAIN, ch.where, ' '))
-				ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-				ingroupch.append(chunk(GROUP, ch.where, [\
-					  chunk(PLAIN, ch.where, \
-					  '(standard)')]))
+		ingroupch.append(chunk(PLAIN, ch.where, ' '))
+		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
+		ingroupch.append(chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where,
+			  '(object)')]))
 
-				pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-				length, i = length+1, i+1
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		length, i = length+1, i+1
 
 
-			elif s(buf, ch.data) == 'stindex':
-				# XXX must actually go to newindex st
-				wh = ch.where
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = 'cindex'
-				length, newi = getnextarg(length, buf, pp, i)
-				ingroupch = [chunk(CSNAME, wh, 'code'), \
-					  chunk(GROUP, wh, pp[i:newi])]
+	    elif s(buf, ch.data) == 'opindex':
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = 'findex'
+		length, newi = getnextarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
 
-				del pp[i:newi]
-				length = length - (newi-i)
+		ingroupch.append(chunk(PLAIN, ch.where, ' '))
+		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
+		ingroupch.append(chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where,
+			  '(operator)')]))
 
-				t = ingroupch[:]
-				t.append(chunk(PLAIN, wh, ' statement'))
-
-				pp.insert(i, chunk(GROUP, wh, t))
-				i, length = i+1, length+1
-
-				pp.insert(i, chunk(CSLINE, wh, 'cindex'))
-				i, length = i+1, length+1
-
-				t = ingroupch[:]
-				t.insert(0, chunk(PLAIN, wh, 'statement, '))
-				
-				pp.insert(i, chunk(GROUP, wh, t))
-				i, length = i+1, length+1
-				
-
-			elif s(buf, ch.data) == 'indexii':
-				#\indexii{A}{B} --->
-				# @cindex A B
-				# @cindex B, A
-				length, newi = getnextarg(length, buf, pp, i)
-				cp11 = pp[i:newi]
-				cp21 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-				length, newi = getnextarg(length, buf, pp, i)
-				cp12 = pp[i:newi]
-				cp22 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = 'cindex'
-				pp.insert(i, chunk(GROUP, ch.where, cp11 + [\
-					  chunk(PLAIN, ch.where, ' ')] + cp12))
-				i, length = i+1, length+1
-				pp[i:i] = [chunk(CSLINE, ch.where, 'cindex'), \
-					  chunk(GROUP, ch.where, cp22 + [\
-					  chunk(PLAIN, ch.where, ', ')]+ cp21)]
-				i, length = i+2, length+2
-
-			elif s(buf, ch.data) == 'indexiii':
-				length, newi = getnextarg(length, buf, pp, i)
-				cp11 = pp[i:newi]
-				cp21 = crcopy(pp[i:newi])
-				cp31 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-				length, newi = getnextarg(length, buf, pp, i)
-				cp12 = pp[i:newi]
-				cp22 = crcopy(pp[i:newi])
-				cp32 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-				length, newi = getnextarg(length, buf, pp, i)
-				cp13 = pp[i:newi]
-				cp23 = crcopy(pp[i:newi])
-				cp33 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = 'cindex'
-				pp.insert(i, chunk(GROUP, ch.where, cp11 + [\
-					  chunk(PLAIN, ch.where, ' ')] + cp12 \
-					  + [chunk(PLAIN, ch.where, ' ')] \
-					  + cp13))
-				i, length = i+1, length+1
-				pp[i:i] = [chunk(CSLINE, ch.where, 'cindex'), \
-					  chunk(GROUP, ch.where, cp22 + [\
-					  chunk(PLAIN, ch.where, ' ')]+ cp23\
-					  + [chunk(PLAIN, ch.where, ', ')] +\
-					  cp21)]
-				i, length = i+2, length+2
-				pp[i:i] = [chunk(CSLINE, ch.where, 'cindex'), \
-					  chunk(GROUP, ch.where, cp33 + [\
-					  chunk(PLAIN, ch.where, ', ')]+ cp31\
-					  + [chunk(PLAIN, ch.where, ' ')] +\
-					  cp32)]
-				i, length = i+2, length+2
-				
-				
-			elif s(buf, ch.data) == 'indexiv':
-				length, newi = getnextarg(length, buf, pp, i)
-				cp11 = pp[i:newi]
-				cp21 = crcopy(pp[i:newi])
-				cp31 = crcopy(pp[i:newi])
-				cp41 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-				length, newi = getnextarg(length, buf, pp, i)
-				cp12 = pp[i:newi]
-				cp22 = crcopy(pp[i:newi])
-				cp32 = crcopy(pp[i:newi])
-				cp42 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-				length, newi = getnextarg(length, buf, pp, i)
-				cp13 = pp[i:newi]
-				cp23 = crcopy(pp[i:newi])
-				cp33 = crcopy(pp[i:newi])
-				cp43 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-				length, newi = getnextarg(length, buf, pp, i)
-				cp14 = pp[i:newi]
-				cp24 = crcopy(pp[i:newi])
-				cp34 = crcopy(pp[i:newi])
-				cp44 = crcopy(pp[i:newi])
-				del pp[i:newi]
-				length = length - (newi-i)
-
-				ch.chtype = chunk_type(CSLINE)
-				ch.data = 'cindex'
-				ingroupch = cp11 + \
-					  spacech + cp12 + \
-					  spacech + cp13 + \
-					  spacech + cp14
-				pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-				i, length = i+1, length+1
-				ingroupch = cp22 + \
-					  spacech + cp23 + \
-					  spacech + cp24 + \
-					  commach + cp21
-				pp[i:i] = cindexch + [\
-					  chunk(GROUP, ch.where, ingroupch)]
-				i, length = i+2, length+2
-				ingroupch = cp33 + \
-					  spacech + cp34 + \
-					  commach + cp31 + \
-					  spacech + cp32
-				pp[i:i] = cindexch + [\
-					  chunk(GROUP, ch.where, ingroupch)]
-				i, length = i+2, length+2
-				ingroupch = cp44 + \
-					  commach + cp41 + \
-					  spacech + cp42 + \
-					  spacech + cp43
-				pp[i:i] = cindexch + [\
-					  chunk(GROUP, ch.where, ingroupch)]
-				i, length = i+2, length+2
-				
-				
-
-			else:
-				print 'don\'t know what to do with keyword ' + `s(buf, ch.data)`
+		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)
+		ch.data = 'pindex'
+		length, newi = getnextarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+
+		ingroupch.append(chunk(PLAIN, ch.where, ' '))
+		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
+		ingroupch.append(chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where,
+			  '(built-in)')]))
+
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		length, i = length+1, i+1
+
+	    elif s(buf, ch.data) == 'sectcode':
+		ch.data = 'code'
+
+
+	    elif s(buf, ch.data) == 'stmodindex':
+		ch.chtype = chunk_type(CSLINE)
+		# use the program index as module index
+		ch.data = 'pindex'
+		length, newi = getnextarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+
+		ingroupch.append(chunk(PLAIN, ch.where, ' '))
+		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
+		ingroupch.append(chunk(GROUP, ch.where, [
+			  chunk(PLAIN, ch.where,
+			  '(standard)')]))
+
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		length, i = length+1, i+1
+
+
+	    elif s(buf, ch.data) == 'stindex':
+		# XXX must actually go to newindex st
+		wh = ch.where
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = 'cindex'
+		length, newi = getnextarg(length, buf, pp, i)
+		ingroupch = [chunk(CSNAME, wh, 'code'),
+			  chunk(GROUP, wh, pp[i:newi])]
+
+		del pp[i:newi]
+		length = length - (newi-i)
+
+		t = ingroupch[:]
+		t.append(chunk(PLAIN, wh, ' statement'))
+
+		pp.insert(i, chunk(GROUP, wh, t))
+		i, length = i+1, length+1
+
+		pp.insert(i, chunk(CSLINE, wh, 'cindex'))
+		i, length = i+1, length+1
+
+		t = ingroupch[:]
+		t.insert(0, chunk(PLAIN, wh, 'statement, '))
+
+		pp.insert(i, chunk(GROUP, wh, t))
+		i, length = i+1, length+1
+
+
+	    elif s(buf, ch.data) == 'indexii':
+		#\indexii{A}{B} --->
+		# @cindex A B
+		# @cindex B, A
+		length, newi = getnextarg(length, buf, pp, i)
+		cp11 = pp[i:newi]
+		cp21 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+		length, newi = getnextarg(length, buf, pp, i)
+		cp12 = pp[i:newi]
+		cp22 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = 'cindex'
+		pp.insert(i, chunk(GROUP, ch.where, cp11 + [
+			  chunk(PLAIN, ch.where, ' ')] + cp12))
+		i, length = i+1, length+1
+		pp[i:i] = [chunk(CSLINE, ch.where, 'cindex'),
+			  chunk(GROUP, ch.where, cp22 + [
+			  chunk(PLAIN, ch.where, ', ')]+ cp21)]
+		i, length = i+2, length+2
+
+	    elif s(buf, ch.data) == 'indexiii':
+		length, newi = getnextarg(length, buf, pp, i)
+		cp11 = pp[i:newi]
+		cp21 = crcopy(pp[i:newi])
+		cp31 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+		length, newi = getnextarg(length, buf, pp, i)
+		cp12 = pp[i:newi]
+		cp22 = crcopy(pp[i:newi])
+		cp32 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+		length, newi = getnextarg(length, buf, pp, i)
+		cp13 = pp[i:newi]
+		cp23 = crcopy(pp[i:newi])
+		cp33 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = 'cindex'
+		pp.insert(i, chunk(GROUP, ch.where, cp11 + [
+			  chunk(PLAIN, ch.where, ' ')] + cp12
+			  + [chunk(PLAIN, ch.where, ' ')]
+			  + cp13))
+		i, length = i+1, length+1
+		pp[i:i] = [chunk(CSLINE, ch.where, 'cindex'),
+			  chunk(GROUP, ch.where, cp22 + [
+			  chunk(PLAIN, ch.where, ' ')]+ cp23
+			  + [chunk(PLAIN, ch.where, ', ')] +
+			  cp21)]
+		i, length = i+2, length+2
+		pp[i:i] = [chunk(CSLINE, ch.where, 'cindex'),
+			  chunk(GROUP, ch.where, cp33 + [
+			  chunk(PLAIN, ch.where, ', ')]+ cp31
+			  + [chunk(PLAIN, ch.where, ' ')] +
+			  cp32)]
+		i, length = i+2, length+2
+
+
+	    elif s(buf, ch.data) == 'indexiv':
+		length, newi = getnextarg(length, buf, pp, i)
+		cp11 = pp[i:newi]
+		cp21 = crcopy(pp[i:newi])
+		cp31 = crcopy(pp[i:newi])
+		cp41 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+		length, newi = getnextarg(length, buf, pp, i)
+		cp12 = pp[i:newi]
+		cp22 = crcopy(pp[i:newi])
+		cp32 = crcopy(pp[i:newi])
+		cp42 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+		length, newi = getnextarg(length, buf, pp, i)
+		cp13 = pp[i:newi]
+		cp23 = crcopy(pp[i:newi])
+		cp33 = crcopy(pp[i:newi])
+		cp43 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+		length, newi = getnextarg(length, buf, pp, i)
+		cp14 = pp[i:newi]
+		cp24 = crcopy(pp[i:newi])
+		cp34 = crcopy(pp[i:newi])
+		cp44 = crcopy(pp[i:newi])
+		del pp[i:newi]
+		length = length - (newi-i)
+
+		ch.chtype = chunk_type(CSLINE)
+		ch.data = 'cindex'
+		ingroupch = cp11 + \
+			  spacech + cp12 + \
+			  spacech + cp13 + \
+			  spacech + cp14
+		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+		i, length = i+1, length+1
+		ingroupch = cp22 + \
+			  spacech + cp23 + \
+			  spacech + cp24 + \
+			  commach + cp21
+		pp[i:i] = cindexch + [
+			  chunk(GROUP, ch.where, ingroupch)]
+		i, length = i+2, length+2
+		ingroupch = cp33 + \
+			  spacech + cp34 + \
+			  commach + cp31 + \
+			  spacech + cp32
+		pp[i:i] = cindexch + [
+			  chunk(GROUP, ch.where, ingroupch)]
+		i, length = i+2, length+2
+		ingroupch = cp44 + \
+			  commach + cp41 + \
+			  spacech + cp42 + \
+			  spacech + cp43
+		pp[i:i] = cindexch + [
+			  chunk(GROUP, ch.where, ingroupch)]
+		i, length = i+2, length+2
+
+
+
+	    else:
+		print 'don\'t know what to do with keyword ' + `s(buf, ch.data)`
+
+
+
 re_atsign = regex.compile('[@{}]')
 re_newline = regex.compile('\n')
 
 def dumpit(buf, wm, pp):
 
-	global out
-	
-	i, length = 0, len(pp)
+    global out
 
-	addspace = 0
-	
-	while 1:
-		if len(pp) != length:
-			raise 'FATAL', 'inconsistent length'
-		if i == length:
-			break
-		ch = pp[i]
+    i, length = 0, len(pp)
+
+    addspace = 0
+
+    while 1:
+	if len(pp) != length:
+	    raise 'FATAL', 'inconsistent length'
+	if i == length:
+	    break
+	ch = pp[i]
+	i = i + 1
+
+	if addspace:
+	    dospace = 1
+	    addspace = 0
+	else:
+	    dospace = 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 \
+		      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:
+		addspace = 1
+	elif ch.chtype == chunk_type(PLAIN):
+	    if dospace and s(buf, ch.data) not in (' ', '\t'):
+		wm(' ')
+	    text = s(buf, ch.data)
+	    while 1:
+		pos = re_atsign.search(text)
+		if pos < 0:
+		    break
+		wm(text[:pos] + '@' + text[pos])
+		text = text[pos+1:]
+	    wm(text)
+	elif ch.chtype == chunk_type(GROUP):
+	    wm('{')
+	    dumpit(buf, wm, ch.data)
+	    wm('}')
+	elif ch.chtype == chunk_type(DENDLINE):
+	    wm('\n\n')
+	    while i != length and pp[i].chtype in \
+		      (chunk_type(DENDLINE), chunk_type(ENDLINE)):
 		i = i + 1
+	elif ch.chtype == chunk_type(OTHER):
+	    wm(s(buf, ch.data))
+	elif ch.chtype == chunk_type(ACTIVE):
+	    wm(s(buf, ch.data))
+	elif ch.chtype == chunk_type(ENDLINE):
+	    wm('\n')
+	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)
+		      or s(buf, pp[i-2].data)[-1] != '\n'):
 
-		if addspace:
-			dospace = 1
-			addspace = 0
-		else:
-			dospace = 0
+		wm('\n')
+	    wm('@' + s(buf, ch.data))
+	    if i == length:
+		raise error, 'CSLINE expected another chunk'
+	    if pp[i].chtype != chunk_type(GROUP):
+		raise error, 'CSLINE expected GROUP'
+	    if type(pp[i].data) != ListType:
+		raise error, 'GROUP chould contain []-data'
 
-		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 \
-				  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:
-				addspace = 1
-		elif ch.chtype == chunk_type(PLAIN):
-			if dospace and s(buf, ch.data) not in (' ', '\t'):
-				wm(' ')
-			text = s(buf, ch.data)
-			while 1:
-				pos = re_atsign.search(text)
-				if pos < 0:
-					break
-				wm(text[:pos] + '@' + text[pos])
-				text = text[pos+1:]
-			wm(text)
-		elif ch.chtype == chunk_type(GROUP):
-			wm('{')
-			dumpit(buf, wm, ch.data)
-			wm('}')
-		elif ch.chtype == chunk_type(DENDLINE):
-			wm('\n\n')
-			while i != length and pp[i].chtype in \
-				  (chunk_type(DENDLINE), chunk_type(ENDLINE)):
-				i = i + 1
-		elif ch.chtype == chunk_type(OTHER):
-			wm(s(buf, ch.data))
-		elif ch.chtype == chunk_type(ACTIVE):
-			wm(s(buf, ch.data))
-		elif ch.chtype == chunk_type(ENDLINE):
-			wm('\n')
-		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) \
-				  or s(buf, pp[i-2].data)[-1] != '\n'):
+	    wobj = Wobj()
+	    dumpit(buf, wobj.write, pp[i].data)
+	    i = i + 1
+	    text = wobj.data
+	    del wobj
+	    if text:
+		wm(' ')
+		while 1:
+		    pos = re_newline.search(text)
+		    if pos < 0:
+			break
+		    print 'WARNING: found newline in csline arg'
+		    wm(text[:pos] + ' ')
+		    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)
+		      or s(buf, pp[i].data)[0] != '\n'):
+		wm('\n')
 
-				wm('\n')
-			wm('@' + s(buf, ch.data))
-			if i == length:
-				raise error, 'CSLINE expected another chunk'
-			if pp[i].chtype != chunk_type(GROUP):
-				raise error, 'CSLINE expected GROUP'
-			if type(pp[i].data) != ListType:
-				raise error, 'GROUP chould contain []-data'
-
-			wobj = Wobj()
-			dumpit(buf, wobj.write, pp[i].data)
-			i = i + 1
-			text = wobj.data
-			del wobj
-			if text:
-				wm(' ')
-				while 1:
-					pos = re_newline.search(text)
-					if pos < 0:
-						break
-					print 'WARNING: found newline in csline arg'
-					wm(text[:pos] + ' ')
-					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) \
-				  or s(buf, pp[i].data)[0] != '\n'):
-				wm('\n')
-			
-		elif ch.chtype == chunk_type(COMMENT):
+	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'
-					wm('\n')
-				wm('@c ' + s(buf, ch.data))
-		elif ch.chtype == chunk_type(IGNORE):
-			pass
-		else:
-			try:
-				str = `s(buf, ch.data)`
-			except TypeError:
-				str = `ch.data`
-			if len(str) > 400:
-				str = str[:400] + '...'
-			print 'warning:', ch.chtype, 'not handled, data ' + str
+	    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'
+		    wm('\n')
+		wm('@c ' + s(buf, ch.data))
+	elif ch.chtype == chunk_type(IGNORE):
+	    pass
+	else:
+	    try:
+		str = `s(buf, ch.data)`
+	    except TypeError:
+		str = `ch.data`
+	    if len(str) > 400:
+		str = str[:400] + '...'
+	    print 'warning:', ch.chtype, 'not handled, data ' + str
 
 
 
 def main():
-	outfile = None
-	headerfile = 'texipre.dat'
-	trailerfile = 'texipost.dat'
+    outfile = None
+    headerfile = 'texipre.dat'
+    trailerfile = 'texipost.dat'
 
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'o:h:t:')
-	except getopt.error:
-		args = []
+    try:
+	opts, args = getopt.getopt(sys.argv[1:], 'o:h:t:')
+    except getopt.error:
+	args = []
 
-	if not args:
-		print 'usage: partparse [-o outfile] [-h headerfile]',
-		print '[-t trailerfile] file ...'
-		sys.exit(2)
+    if not args:
+	print 'usage: partparse [-o outfile] [-h headerfile]',
+	print '[-t trailerfile] file ...'
+	sys.exit(2)
 
-	for opt, arg in opts:
-		if opt == '-o': outfile = arg
-		if opt == '-h': headerfile = arg
-		if opt == '-t': trailerfile = arg
+    for opt, arg in opts:
+	if opt == '-o': outfile = arg
+	if opt == '-h': headerfile = arg
+	if opt == '-t': trailerfile = arg
 
-	if not outfile:
-		root, ext = os.path.splitext(args[0])
-		outfile = root + '.texi'
+    if not outfile:
+	root, ext = os.path.splitext(args[0])
+	outfile = root + '.texi'
 
-	if outfile in args:
-		print 'will not overwrite input file', outfile
-		sys.exit(2)
+    if outfile in args:
+	print 'will not overwrite input file', outfile
+	sys.exit(2)
 
-	outf = open(outfile, 'w')
-	outf.write(open(headerfile, 'r').read())
+    outf = open(outfile, 'w')
+    outf.write(open(headerfile, 'r').read())
 
-	for file in args:
-		if len(args) > 1: print '='*20, file, '='*20
-		buf = open(file, 'r').read()
-		w, pp = parseit(buf)
-		startchange()
-		changeit(buf, pp)
-		dumpit(buf, outf.write, pp)
+    for file in args:
+	if len(args) > 1: print '='*20, file, '='*20
+	buf = open(file, 'r').read()
+	w, pp = parseit(buf)
+	startchange()
+	changeit(buf, pp)
+	dumpit(buf, outf.write, pp)
 
-	outf.write(open(trailerfile, 'r').read())
+    outf.write(open(trailerfile, 'r').read())
 
-	outf.close()
+    outf.close()
 
 if __name__ == "__main__":
     main()
