Adapted unweave to Matthias' fixes. It's still off-by-one-space in some cases.
diff --git a/Mac/scripts/unweave.py b/Mac/scripts/unweave.py
index d694ba8..204c963 100644
--- a/Mac/scripts/unweave.py
+++ b/Mac/scripts/unweave.py
@@ -11,8 +11,17 @@
 USEDEFINITION=re.compile("^(?P<pre>.*)<<(?P<name>.*)>>(?P<post>[^=].*)")
 ENDDEFINITION=re.compile("^@")
 
+DEFAULT_CONFIG="""
+config = [
+	("^.*\.cp$", ":unweave-src"),
+	("^.*\.h$", ":unweave-include"),
+]
+genlinedirectives = 0
+gencomments = 1
+"""
+
 class Processor:
-	def __init__(self, filename):
+	def __init__(self, filename, config={}):
 		self.items = {}
 		self.filename = filename
 		self.fp = open(filename)
@@ -20,6 +29,15 @@
 		self.resolving = {}
 		self.resolved = {}
 		self.pushback = None
+		# Options
+		if config.has_key("genlinedirectives"):
+			self.genlinedirectives = config["genlinedirectives"]
+		else:
+			self.genlinedirectives = 1
+		if config.has_key("gencomments"):
+			self.gencomments = config["gencomments"]
+		else:
+			self.gencomments = 0
 		
 	def _readline(self):
 		"""Read a line. Allow for pushback"""
@@ -50,10 +68,9 @@
 			if mo:
 				pre = mo.group('pre')
 				if pre:
-					rv.append((lineno, pre+'\n'))
+##					rv.append((lineno, pre+'\n'))
+					rv.append((lineno, pre))
 			rv.append((lineno, line))
-			# For simplicity we add #line directives now, if
-			# needed.
 			if mo:
 				post = mo.group('post')
 				if post and post != '\n':
@@ -69,6 +86,7 @@
 			
 	def read(self):
 		"""Read the source file and store all definitions"""
+		savedcomment = []
 		while 1:
 			lineno, line = self._readline()
 			if not line: break
@@ -76,10 +94,33 @@
 			if mo:
 				name = mo.group('name')
 				value = self._readitem()
+				if self.gencomments:
+					defline = [(lineno, '// <%s>=\n'%name)]
+					if savedcomment:
+						savedcomment = savedcomment + [(lineno, '//\n')] + defline
+					else:
+						savedcomment = defline
+					savedcomment = self._extendlines(savedcomment)
+					value = savedcomment + value
+					savedcomment = []
 				self._define(name, value)
 			else:
-				pass # We could output the TeX code but we don't bother.
-				
+				if self.gencomments:
+					# It seems initial blank lines are ignored:-(
+					if savedcomment or line.strip():
+						savedcomment.append((lineno, '// '+line))
+						
+	def _extendlines(self, comment):
+		# This routine mimicks some artefact of Matthias' code.
+		rv = []
+		for lineno, line in comment:
+			line = line[:-1]
+			if len(line) < 75:
+				line = line + (75-len(line))*' '
+			line = line + '\n'
+			rv.append((lineno, line))
+		return rv
+		
 	def resolve(self):
 		"""Resolve all references"""
 		for name in self.items.keys():
@@ -134,7 +175,7 @@
 		rv = []
 		for lineno, line in data:
 			curlineno = curlineno + 1
-			if line and line != '\n' and lineno != curlineno:
+			if self.genlinedirectives and line and line != '\n' and lineno != curlineno:
 				rv.append(self._linedirective(lineno))
 				curlineno = lineno
 			rv.append(line)
@@ -150,27 +191,24 @@
 		fp = open(pathname, "w").writelines(data)
 		
 def process(file, config):
-	pr = Processor(file)
+	pr = Processor(file, config)
 	pr.read()
 	pr.resolve()
-	for pattern, folder in config:
+	for pattern, folder in config['config']:
 		pr.save(folder, pattern)
 	
 def readconfig():
 	"""Read a configuration file, if it doesn't exist create it."""
 	configname = sys.argv[0] + '.config'
 	if not os.path.exists(configname):
-		confstr = """config = [
-	("^.*\.cp$", ":unweave-src"),
-	("^.*\.h$", ":unweave-include"),
-]"""
+		confstr = DEFAULT_CONFIG
 		open(configname, "w").write(confstr)
 		print "Created config file", configname
 ##		print "Please check and adapt (if needed)"
 ##		sys.exit(0)
 	namespace = {}
 	execfile(configname, namespace)
-	return namespace['config']
+	return namespace
 
 def main():
 	config = readconfig()
@@ -185,7 +223,7 @@
 		fss, ok = macfs.PromptGetFile("Select .nw source file", "TEXT")
 		if not ok:
 			sys.exit(0)
-		process(fss.as_pathname())
+		process(fss.as_pathname(), config)
 		
 if __name__ == "__main__":
 	main()