Глава 9
Подготовка документации
Средства редактирования и форматирования документации стали одним из ранних приложений системы UNIX. Администрация Bell Labs, приобретая первую установку PDP-11, хотела иметь систему подготовки документации, а не операционную систему. (К счастью, заказчики получили больше, чем ожидали.)
Первая форматирующая программа
roff
— небольшая, быстрая программа, с которой легко было работать до тех пор, пока выпускались простые документы с помощью печатающего устройства. Следующая форматирующая программа
nroff
обладала большими возможностями. Ее автор Дж. Осанна вместо того, чтобы обеспечивать каждый вид документации по желанию пользователя, сделал свою программу программируемой, т.е. многие задачи форматирования решались путем программирования на языке
nroff
.
После приобретения в 1973 г. небольшого наборного устройства
nroff
была расширена и смогла поддерживать множество символов, а также шрифты разных кеглей и гарнитур. Новая программа получила название
troff
(по аналогии с "en-roff', а произносили это как "tee-roff".) Программы
nroff
и troff имели одну и ту же основу и один и тот же входной язык;
nroff
игнорировала команды типа смены размера шрифта, которые она не могла выполнить. В настоящей главе речь пойдет главным образом о
troff
, но большинство наших пояснений можно отнести и к
nroff
с учетом ограничений, налагаемых выводными устройствами.
Самое большое достоинство
troff
гибкость базового языка и ее возможности программирования. Она может выполнить почти любую задачу форматирования. Но гибкость обходится недешево, использовать
troff
часто бывает весьма трудно. Следует отметить, что почти все программное обеспечение UNIX для подготовки документации сконструировано таким образом, чтобы заместить некоторые фрагменты "чистой
troff
". Одним из примеров может служить разметка страницы: общий вид документа, как выглядят названия, заголовки и абзацы, где появляются номера страниц, как велики размеры страницы и т.д. Все соответствующие средства не встроены и должны программироваться. Однако пользователю не нужно специфицировать перечисленные выше детали для каждого документа, так как есть стандартный пакет форматирующих команд. Пользователь пакета не говорит: "Следующая строка должна центрироваться, состоять из прописных букв, выделенных жирным шрифтом". Вместо этого он должен сказать: "Следующая строка — заголовок", и тогда используется определение вида названия из пакета. Пользователи имеют дело с логическими компонентами документа названиями, заголовками, абзацами, сносками и т.п., а не с размерами, шрифтами и позициями.
К сожалению, планируемый как "стандартный" пакет команд форматирования не является более стандартным: распространение получили несколько пакетов плюс многие их варианты. Мы рассмотрим здесь два пакета общего назначения:
ms
, первоначальный "стандарт", и
mm
, более новую версию, стандартную в System V, а также пакет
man
для печати справочников. Основной акцент сделан на ms как на стандарт в седьмой версии; он может служить хорошим примером и является достаточно мощным для выполнения работы (с его помощью подготовлена наша книга, правда, пришлось добавить команду для задания требуемого нам шрифта).
Этот опыт типичен — пакеты макроопределений подходят для выполнения многих задач форматирования, но иногда необходимо вернуться к основным командам
troff
. В данной главе мы опишем лишь небольшую часть
troff
.
Хотя
troff
обеспечивает возможность полностью управлять выходным форматом, ее непросто использовать для набора более сложного материала, такого, как формулы, таблицы и рисунки. Их разметка так же трудна, как разметка страницы. Решить упомянутые выше проблемы можно по-разному. Существуют языки специального назначения для формул, таблиц и рисунков, которые заменяют пакеты команд форматирования. Каждый язык поддерживается отдельной программой, транслирующей его в команды
troff
. Программы взаимодействуют через программные каналы. Эти препроцессоры служат хорошим примером подхода к проблемам в UNIX: вместо расширения и усложнения troff с ней взаимодействуют отдельные программы. (Конечно, средства развития языка, описанные в гл. 8, были использованы для облегчения реализации.) Ниже описываются две программы:
tbl
, форматирующая таблицы, и
eqn
, форматирующая математические выражения.
Мы постараемся дать вам советы по подготовке документации и применению поддерживающих инструментов. Приводимые здесь примеры войдут в документ, описывающий язык
hoc
, из гл. 8 и справочного руководства. Сам документ приведен в приложении 2.
9.1 Пакет макроопределений
ms
Основная идея, заложенная в пакет макроопределений, состоит в том, что документ описывается в терминах его логических частей названия, заголовков разделов, абзацев, а не в деталях: расстановка пробелов, выбор шрифтов, определение размеров букв. Это спасает вас от рутинной работы и освобождает документ от несущественных подробностей. Фактически вы можете сделать свой документ совершенно иным, использовав другое множество макроопределений с теми же логическими именами. Так, один и тот же документ мог бы последовательно превращаться в технический отчет, доклад на конференции, журнальную статью и главу из книги с помощью одинаковых команд форматирования, интерпретируемых четырьмя разными пакетами макроопределений.
Входной поток
troff
представляет собой обычный текст, размеченный командами форматирования, независимо от использования пакета макроопределений. Существуют два вида команд. Команда первого вида состоит из точки в начале строки и следующей за ней одной (двух) буквы либо цифры и, возможно, параметра, как показано ниже:
.PP
.ft В
Это небольшой абзац, выделенный жирным шрифтом.
Все встроенные команды
troff
имеют имена, образованные строчными буквами, поэтому по соглашению командам в пакетах даются имена из прописных букв. В нашем примере
.PP
есть команда
ms
для абзаца, a
.ff
— команда
troff
, вызывающая замену обычного шрифта жирным. (Имена команд, управляющих шрифтами, состоят из прописных букв; шрифты могут быть разными на разных наборных устройствах.)
Команда второго вида это последовательность символов, начинающаяся с обратной дробной черты
\
, которая может оказаться в любом месте входного потока. Например, команда
\fB
также вызывает переключение на жирный шрифт. Она является примером чистой
troff
; ниже мы коротко ее рассмотрим.