1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#! /usr/bin/env python3
# rmanprocess.py
# Massages output of PolyGlotMan's `rman -f latex2e` to fit Tufteian userguide style.
# Example:
# rman -f latex2e hmmbuild.man | rmanprocess.py > manpage.tex
#
import sys
import re
in_synopsis = False
if len(sys.argv) == 1:
f = sys.stdin
else:
f = open(sys.argv[1])
for line in f:
line = line.rstrip('\n')
# State flags (where are we in the document)
if re.match(r'\\section{Synopsis}', line):
in_synopsis = True
elif re.match(r'\\section{', line):
in_synopsis = False
#
# Linewise substitutions: replace certain entire lines with something else.
#
# Remove \documentclass, and changes to \parindent and \parskip
if re.match(r'\\documentclass', line): continue
if re.match(r'\\setlength{\\parindent}', line): continue
if re.match(r'\\setlength{\\parskip}', line): continue
if re.match(r'\\begin\{document\}', line): continue
# Replace \section{Name} with \section{progname - description}, using next line too.
if re.match(r'\\section\{Name\}', line):
for line in f:
if not re.fullmatch(r'\s*', line):
break
m = re.match(r'(\S+)\s*\\?-\s*(.+)$', line)
if m:
print(r'\section{{\texorpdfstring{{\monob{{{0}}}}}{{{0}}} - {1}}}'.format(m.group(1), m.group(2)))
else:
print("Error: no progname/description line found");
sys.exit(1)
continue
# Remove everything after \section{See Also), and finish.
if re.match(r'\\section\{See', line) or re.match(r'\\end\{document', line):
print("\\newpage");
break
#
# Extra directives: preface certain lines with something extra, but still
# process the line.
#
# In synopsis, put \noindent in front of each commandline, and preserve the .B's as bold.
if in_synopsis and re.match(r'\s*\\textbf{', line):
line = re.sub(r'\\textbf\{', r'\\monob{', line)
print("\\noindent")
#
# Substitutions within a line.
# The order of these replacements is important. (More specific ones first.)
#
line = re.sub(r'\\begin\{itemize\}', r'\\begin{wideitem}', line)
line = re.sub(r'\\end\{itemize\}', r'\\end{wideitem}', line)
line = re.sub(r'\\section\{', r'\\subsection*{', line) # \subsection* suppresses inclusion in TOC
line = re.sub(r'--', r'{-}{-}', line)
line = re.sub(r'\\item\s*\[\\textbf', r'\\item [\\monob', line) # option names in .TP are emphasized bold
line = re.sub(r'\\textbf\{\\% ', r'\\user{\\% ', line) # example command lines are bold, on their own line
line = re.sub(r'\\textit\{', r'\\monoi{', line) # metavariables (options, args) are .I in man, mono italic in tex
line = re.sub(r'\\textbf\{', r'\\mono{', line) # literals (commands, etc) are .B in man, normal mono in tex
print(line)
if f != sys.stdin:
f.close()
|