BEGIN {
	linebuf = indent = ""
	curcol = indcol = 0
	maxcol = 78
	progname = ""
	firstsh = 1
	numcol = 0
	spacing = 1
	wordspace = " "
	tab = sprintf("%c",9)
}

/^\.SH / {
	if (firstsh == 0) printf("%s\n\n", linebuf)
	firstsh = 0

	printf("From: %s\nSubject:", progname);
	if ($2 == "NAME") {
		getline
		for (i = 2; i <= NF; i++) printf(" %s", $i);
		printf("\n\n")
		print
	} else {
		for (i = 2; i <= NF; i++) printf(" %s", $i);
		printf("\n\n")
	}

	linebuf = indent = ""
	curcol = indcol = 0
	next
}

/^\.TH / {
	progname = $2
	next
}

/^\.UC / {
	next
}

/^\.(br|sp)/ {
	if (linebuf != indent) {
		printf("%s\n", linebuf)
	}
	linebuf = indent
	curcol = indcol
	next
}

/^\.PP/ {
	if (linebuf != indent) printf("%s\n", linebuf)

	printf("\n")

	linebuf = "   " ; curcol = 3
	indent = "" ; indcol = 0
	next
}

/^\.LP/ {
	if (linebuf != indent) printf("%s\n", linebuf)

	printf("\n")

	linebuf = indent = ""
	curcol = indcol = 0
	next
}

/^\.TP/ {
	if (linebuf != indent) printf("%s\n", linebuf)

	printf("\n")

	getline; linebuf = $0
	indent = "     "
	curcol = indcol = 5
	if (length(linebuf) >= 5) {
		printf("%s\n", linebuf)
		linebuf = indent
	} else {
		while (length(linebuf) < 4) linebuf = linebuf " "
	}
	next
}

/^\.\\"ta/ {
	for (numcol = 2; numcol <= NF; numcol++) tabcol[numcol-1] = $numcol
	numcol = NF
	next
}

/^\.DT/ {
	numcol = 0
	next
}

numcol != 0 {
	j = length($0)
	k = 0
	g = 1
	for (i = 1; i<=j; i++) {
		while (k < tabcol[g]) {
			printf(" ")
			k++
		}
		c = substr($0,i,1)
		if (c == tab) {
			g++
		} else {
			printf("%s", c)
			k++
		}
	}
	printf("\n")
	next
}

/^[ 	]/ {
	if (linebuf != indent) printf("%s\n",linebuf)
	linebuf = indent "     "
	curcol = indcol+5
}

{
	word = 1
	wordspace = " "
	spacing = 1
}

/^\.[IB] / {
	word = 2
}

/^\.[IB]R / {
	wordspace = ""
	word = 2
	spacing = 0
}

{
 	sep = " "
	if (linebuf == indent) sep = ""

	while (word <= NF) {
		k = length($word)
		if ((curcol + k) > maxcol) {
			printf("%s\n", linebuf)
			linebuf = indent
			curcol = indcol
			sep = ""
		}
		linebuf = linebuf sep $word
		sep = wordspace
		curcol += spacing + k
		word++
	}
}

END {
	if (linebuf != indent) printf("%s\n\n", linebuf)
}


syntax highlighted by Code2HTML, v. 0.9.1