И, наконец, поскольку eqn
@Word@ например, печатается как eqn распознает некоторые обычные символы (такие, как from и to) и специальным образом их рассматривает: она "глотает" пробелы, поэтому указанный прием следует применять с осторожностью.Как только ваш документ готов, вы должны соединить все препроцессоры и troff
tbl, eqn, troff. Если вы просто используете troff, то печатайте$ troff -ms
-mm)Иначе вам придется задать аргумент
$ eqn
или
$ tbl
Неудобно следить за тем из препроцессоров, который действительно должен печатать какой-то отдельный документ. Мы сочли уместным написать программу doctype
$ doctype ch9.*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
$ doctype hoc.ms
cat hoc.ms | tbl | eqn | troff -ms
$
Программа doctype
awk отыскивает последовательность команд, используемую препроцессорами, и печатает строку команд, которые нужно вызвать, чтобы отформатировать документ. Она также находит команду .PP (абзац) для форматирования пакетом запросов ms.$ cat doctype
# doctype: synthesize proper command line for troff
echo -n "cat $* | "
egrep -h (EQ|TS|\[|PS|IS|PP)' $* |
sort -u |
awk '
/^\.PP/ { ms++ }
/^\.EQ/ { eqn++ }
/^\.TS/ { tbl++ }
/^\.PS/ { pic++ }
/^\.IS/ { ideal++ }
/^\.\[/ { refer++ }
END {
if (refer > 0) printf "refer | "
if (pic > 0) printf "pic | "
if (ideal > 0) printf "ideal | "
if (tbl > 0) printf "tbl | "
if (eqn > 0) printf "eqn | "
printf "troff "
if (ms > 0) printf "-ms"
printf "\n"
} '
$
(Флаг -h
troff со стандартными препроцессорами есть специфика, и главная задача состоит в том, чтобы заставить "думать" об этом саму машину.Программа doctype
bundle-программе, которая создает программу. Однако в таком виде она требует от пользователя вновь вводить строку для shell. В одном из приводимых ниже упражнений вам предлагается это исправить.Когда дело дойдет до запуска реальных команд troff
Между прочим, в новой версии этой программы не предусмотрена программа egrep
sort; awk сама просматривает весь входной поток. Для больших документов такой вариант оказывается слишком медленным, поэтому для ускорения поиска мы добавили egrep и затем sort -u, чтобы избавиться от дублирования. При построении типичных документов накладные расходы по созданию двух дополнительных разбирающих данные процессов меньше, чем запуск awk в тех же целях с большим объемом входного текста.В качестве иллюстрации сравним doctype
awk применительно к содержимому данной главы (около 52 000 символов):$ time awk '... doctype without egrep ...' ch9.*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
real 31.0
user 8.9
sys 2.8
$ time doctype ch9*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
real 7.0
user 1.0
sys 2.3
$