#!/bin/rc
# doctype: synthesize proper command line for troff
troff=troff
eqn=eqn
prefer=prefer
opt=''
dev=''
while(~ $1 -*){
switch($1){
case -n;
troff=nroff
eqn=neqn
prefer='prefer -n'
case -T
dev=$1
case -*
opt=$opt' $1'
}
shift
}
ifs='
'{
files=`{echo $*}
}
grep -h
'\$LIST|\|reference|Jp|^\.(EQ|TS|\[|PS|IS|GS|G1|GD|PP|BM|LP|BP|PI|cstart|begin|TH...|TI)|^\.P$'
$* |
sort -u |
awk '
BEGIN { files = "'$"files'" }
/\$LIST/ { e++ }
/^\.PP/ { ms++ }
/^\.LP/ { ms++ }
/^\.EQ/ { eqn++ }
/^\.TS/ { tbl++ }
/^\.PS/ { pic++ }
/^\.IS/ { ideal++ }
/^\.GS/ { tped++ }
/^\.G1/ { grap++; pic++ }
/^\.GD/ { dag++; pic++ }
/^\.\[/ { refer++ }
/\|reference/ { prefer++ }
/^\.cstart/ { chem++; pic++ }
/^\.begin +dformat/ { dformat++; pic++ }
/^\.TH.../ { man++ }
/^\.BM/ { lbits++ }
/^\.P$/ { mm++ }
/^\.BP/ { pictures++ }
/^\.PI/ { pictures++ }
/^\.TI/ { mcs++ }
/^\.ft *Jp|\\f\(Jp/ { nihongo++ }
END {
x = ""
if (refer) {
if (e) x = "refer/refer -e " files " | "
else x = "refer/refer " files "| "
files = ""
}
else if (prefer) { x = "cat " files "| '$prefer'| "; files
= "" }
if (tped) { x = x "tped " files " | "; files = "" }
if (dag) { x = x "dag " files " | "; files = "" }
if (ideal) { x = x "ideal -q " files " | "; files = "" }
if (grap) { x = x "grap " files " | "; files = "" }
if (chem) { x = x "chem " files " | "; files = "" }
if (dformat) { x = x "dformat " files " | "; files = "" }
if (pic) { x = x "pic " files " | "; files = "" }
if (tbl) { x = x "tbl " files " | "; files = "" }
if (eqn) { x = x "'$eqn' '$dev' " files " | ";
files = "" }
x = x "'$troff' "
if (man) x = x "-man"
else if (ms) x = x "-ms"
else if (mm) x = x "-mm"
if (mcs) x = x " -mcs"
if (lbits) x = x " -mbits"
if (pictures) x = x " -mpictures"
if (nihongo) x = x " -mnihongo"
x = x " '$opt' '$dev' " files
print x
}'
On Feb 23, 2021, at 5:42 AM, Jaap Akkerhuis
<jaapna(a)xs4all.nl> wrote:
On Feb 23, 2021, at 3:47, M Douglas McIlroy
<m.douglas.mcilroy(a)dartmouth.edu> wrote:
I can imagine a simple perl (or python or
whatever) script that would run
through groff input [and] determine which preprocessors are actually
needed ...
Brian imagined such and implemented it way back when. Though I used
it, I've forgotten its name. One probably could have fooled it by
tricks like calling pic only in a .so file and perhaps renaming .so.
But I never heard of it failing in real life. It does impose an extra
pass over the input, but may well save a pass compared to the
defensive groff -pet that I often use or to the rerun necessary when I
forget to mention some or all of the filters.
If I remember correctly, it was an awk script printing out the
suggested pipeline to use. One could then cut and paste that line.
jaap