| awk ' # format | 
 | #   Input:  sort key (tab) string (tab) numlist | 
 | #   Output: troff format, commands interpreted | 
 |  | 
 | BEGIN {	FS = "\t" | 
 | 	s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz " | 
 | 	# set upper["a"] = "A" | 
 | 	for (i = 1; i <= 27; i++) upper[substr(s,i+27,1)] = substr(s,i,1) | 
 | 	# set lower["a"] =  lower["A"] ="a" | 
 | 	for (i = 1; i <= 27; i++) { | 
 | 		lower[substr(s,i,1)] = substr(s,i+27,1) | 
 | 		lower[substr(s,i+27,1)] = substr(s,i+27,1) | 
 | 	} | 
 | } | 
 | { # mark change between letters with .YY | 
 | 	# find first non-punctuation char | 
 | 	for (i = 1; (c = substr($1,i,1)) != ""; i++) | 
 | 		if (c ~ /[a-zA-Z0-9 ]/) | 
 | 			break | 
 | 	this = c | 
 | 	if (!(this in lower)) lower[this] = " " | 
 | 	this = lower[this] | 
 | 	if (this != last)  # && this != " ") | 
 | 		print ".YY", this, upper[last=this] | 
 | 	quoted = 0 | 
 |  | 
 |   # interpret font change language | 
 |  | 
 | 	if ($2 ~ /^   /)	# different macro, to avoid bad breaks in hier | 
 | 		print ".ZZ" | 
 | 	else | 
 | 		print ".XX" | 
 | 	if (NF == 3) | 
 | 		$0 = $2 "," "  " $3	# discard sort key, leave term .. numlist | 
 | 	else | 
 | 		$0 = $2 | 
 |  | 
 | 	if ($0 ~ /%/) { | 
 | 		quoted = 1 | 
 | 		gsub(/%%/,  "QQ0QQ", $0) | 
 | 		gsub(/%\[/, "QQ1QQ", $0) | 
 | 		gsub(/%\]/, "QQ2QQ", $0) | 
 | 		gsub(/%\{/, "QQ3QQ", $0) | 
 | 		gsub(/%\}/, "QQ4QQ", $0) | 
 | 		gsub(/%~/,  "QQ5QQ", $0) | 
 | 	} | 
 | 	gsub(/%e/, "\\e", $0) # %e -> \e | 
 | 	gsub(/~/, " ", $0)    # unpaddable spaces go away at last | 
 | 	if (gsub(/\[/, "\\\\&\\f(CW", $0)) | 
 | 		gsub(/\]/, "\\fP",   $0) | 
 | 	if (gsub(/\{/, "\\f2",   $0)) | 
 | 		gsub(/\}/, "\\fP",   $0) | 
 | 	if (quoted) { | 
 | 		gsub(/%/, "", $0) | 
 | 		gsub(/QQ0QQ/, "%", $0) | 
 | 		gsub(/QQ1QQ/, "[", $0) | 
 | 		gsub(/QQ2QQ/, "]", $0) | 
 | 		gsub(/QQ3QQ/, "{", $0) | 
 | 		gsub(/QQ4QQ/, "}", $0) | 
 | 		gsub(/QQ5QQ/, "~", $0) | 
 | 	} | 
 | 	printf "\\&%s\n", $0 | 
 | } | 
 | ' $* |