Страница руководства ROFF

Перевод: Бисярин Артём 
Сей документ доступен также в формате roff
 

Содержание:

ИМЯ
ОПИСАНИЕ
ИСТОРИЯ
ИСПОЛЬЗОВАНИЕ ROFF
ROFF-ПРОГРАММИРОВАНИЕ
РАСШИРЕНИЯ ИМЕН ФАЙЛОВ
РЕДАКТИРОВАНИЕ ROFF
ОШИБКИ
СМОТРИТЕ ТАКЖЕ
АВТОРЫ
 

ИМЯ

roff − основные принципы и история типографской системы roff

 

ОПИСАНИЕ

Roff — это общее имя набора типографских программ, известных под именами troff, nroff, ditroff, groff, и т.д. Типографская система roff состоит из расширяемого языка форматирования текста и набора программ для конвертирования в другие текстовые форматы и для печати. По традиции, roff является главной системой подготовки текста в Unix; до сих пор в стандартной сборке каждой юникс-подобной операционной системы как базовый пакет включена roff-система.

Наиболее распространенной реализацией roff-системы сегодня является свободная программная разработка GNU roff, groff(1). Разработки выпущенные до groff называют классическими (берущие начало в 1973-м). groff реализовывает внешний интерфейс и функциональность своих классических предков, но кроме этого имеет много нововведений. Так как groff единственная система доступная для каждой (почти для каждой) вычислительной системы, она является стандартом де-факто roff сегодня.

В некоторых старых системах Unix была программа roff реализующая runoff из операционной системы Multics ср. раздел ИСТОРИЯ. Функциональность этой программы была очень ограничена даже по сравнению со старой troff; она не поддерживается больше. Следовательно, в этом документе термин roff всегда ссылается на общее понятие roff-системы, а не на старую программу roff.

Несмотря на свой возраст, roff широко используется сегодня, к примеру, страницы руководства UNIX систем (man pages), многие книги о программном обеспечении, системная документация, стандарты и корпоративные документы написаны в roff. Вывод roff для текстовых устройств все еще непревзойденный, а его графический вывод имеет такое же качество как другие свободные типографские программы и лучшее чем некоторые коммерческие.

Наиболее популярное применение roff это концепция страниц руководств (man pages); это стандартная система документации во многих операционных системах.

Этот документ описывает исторические факты о разработке системы roff; некоторые аспекты использования общие для всех версий roff, детали конвейера roff, которые обычно спрятаны за такими обертками как groff(1); общий обзор языка форматирования; некоторые советы по редактированию roff-файлов; и много ссылок для дальнейшего изучения.

 

ИСТОРИЯ

У системы подготовки текстов roff очень длинная история, берущая начало в 1960-х. Сама система roff тесно связана с операционной системой Unix, но корни roff уходят далее к более ранним операционным системам CTSS и Multics.

runoff — предшественница roff

Развитие roff неразрывно связано с историей операционных систем. Ее предшественница runoff была написана Jerry Saltzer для операционной системы CTSS (Compatible Time Sharing System) уже в 1961-м. Когда дальнейшее развитие CTSS привело к возникновению в 1963 году Multics, известному предшественнику Unix, runoff стал основным форматом для документирования и подготовки текстов. В то время обе операционные системы могли запускаться только на очень дорогом оборудовании, по этому они в основном использовались в исследованиях, а также для государственных и военных задач.

Возможности языка runoff были весьма ограничены по сравнению с современным roff. В 1960-х был возможен только текстовый вывод. Он мог быть реализован с помощью набора запросов длинной в два символа, многие из которых сохранились в roff в оригинальном виде. Язык был сформирован согласно обычаям типографского набора докомпьютерного века, согласно которым, строки начинающиеся с точки использовались в рукописях для указаний наборщику отформатировать текст определенным образом.

Программа runoff была написана сначала на языке PL/1 позже на BCPL, предке языка программирования C. runoff использовалась в работе справочной системы Multics, выполняя задачу похожую на ту, которую выполняет roff в страницах руководства Unix. Все еще можно встретить документы написанные на языке runoff; для примеров смотри домашнюю страницу Saltzer, ср. раздел СМОТРИ ТАКЖЕ.

Классическая система nroff/troff

В 1970-х, Unix, потомок Multics, стал очень популярным, поскольку мог работать на доступном оборудовании и, в те времена, был легко доступен для университетов. В MIT (the Massachusetts Institute of Technology) существовала потребность в управлении наборным устройством Wang Graphic Systems CAT устройством графического вывода машины PDP-11 работающей под Unix. Так как runoff оказалась слишком ограниченной для этой задачи, она была доработана до более мощной системы форматирования текста трудами Josef F. Osanna, главного разработчика операционной системы Multics и программиста нескольких runoff-портов.

Имя runoff было сокращено до roff. Значительно расширенный язык в реализации Osanna-ы уже включал все элементы полной roff-системы. Все современные roff-системы стараются обеспечить совместимость с этой системой. Таким образом, Joe Osanna может быть назван отцом всех roff-систем.

Первая roff-система имела три форматирующие программы:

  • troff — (typesetter roff) генерировала графический вывод для наборного устройства, CAT единственного устройства с которым могла работать.
  • nroff — давала текстовый вывод подходящий для терминалов и устройств построчной печати.
  • roff — была повторной реализацией бывшей программы runoff с ее ограниченными возможностями; это программа больше не появлялась в последующих версиях. Сегодня, имя roff используют для ссылки на troff/nroff систему в целом.

Первая версия Osanna-ы была написана на ассемблере PDP-11 и выпущена в 1973-м. Brian Kernighan присоединился к разработке roff переписав ее на языке программирования C. Версия на C была выпущена в 1975-м.

Синтаксис языка форматирования программ nroff/troff был документирован в знаменитом Troff User’s Manual [CSTR #54], впервые опубликованном в 1976, пересматриваемое и исправляемое Brian Kernighan вплоть до 1992. Этот документ является спецификацией классического troff. Все последующие roff-системы старались быть совместимы с этой спецификацией.

В 1977-м, после того как Osanna скончался от инфаркта в возрасте около пятидесяти лет, Kernighan продолжил разработку troff. Смысл следующего этапа разработки заключался в том, чтобы оснастить troff универсальным интерфейсом для поддержки большего количества устройств, промежуточным форматом для вывода и системой пост-процессинга. Это завершило формирование структуры roff-системы и привело ее к такому виду, в котором она существует по сей день; см. раздел ИСПОЛЬЗОВАНИЕ ROFF. В 1979-м эти новинки были описаны в документе [CSTR #97]. Эта новая версия troff является базой для всех существующих более новых систем troff, включая groff. В некоторых системах, этот устройство-независимый (device independent) troff присутствовал в виде бинарного файла ditroff(7). Все современные программы troff автоматически предоставляют полные возможности ditroff.

Коммерциализация

Большим упадком вылилась коммерциализация, некогда легко доступной, операционной системы Unix 7. Расцвел целый букет разнящихся операционных систем, соревнующихся между собой несовместимостями в расширениях. Одно хорошо, несовместимости не затронули первоначальный troff. Все коммерческие roff-системы хотя и продавались различными компаниями как свои, но использовали Osanna/Kernighan-овский открытый исходный код и документацию, и содержали минимум изменений.

Исходные коды древнего Unix и классического troff не были доступны два десятилетия. К счастью, Caldera купила SCO UNIX в 2001-м. В дальнейшем, Caldera сделала древний исходный код доступным он-лайн для некоммерческого использования, ср. раздел СМОТРИ ТАКЖЕ.

Свободный roff

Ни одна коммерческая разработка roff-системы не могла получить статус преемницы дальнейшего развития roff. Все были заинтересованы только в своей собственной выгоде. Это привело к стремительному падению, некогда великолепной, ОС Unix в 1980-е.

Как контрмеру к галопирующей коммерциализации, AT&T Bell Labs старалась начать спасительный проект с их ОС Plan 9 Она свободно доступна для некоммерческого использования, в том числе и исходники, но имеет коммерческую лицензию, что препятствует свободной разработке. Эта концепция устарела, поэтому Plan 9 не была принята как платформа которая бы связала мейн-стрим разработки.

Единственное спасение пришло от появлявшихся на протяжении 1980-х и 1990-х свободных ОС (386BSD, GNU/Linux, и т.д.) и программных проектов. Они реализовывали возможности классического Unix, так что старый опыт не был утерян, а также много расширений. В 21-м веке юникс-подобные ОС снова являются важным фактором в компьютерной индустрии, и все благодаря свободному программному обеспечению.

Наиболее значительным свободным roff-проектом был GNU-порт troff, созданный James Clark и выпущенный под GNU Public License. Он был назван groff (GNU roff). См. groff(1) для обзора.

Система roff все еще активно разрабатываемая. Она совместима с классическим troff и имеет много расширений. Это первая roff-система которая доступна на почти всех ОС и она свободна. Это делает groff стандартом де-факто roff-систем сегодня.

 

ИСПОЛЬЗОВАНИЕ ROFF

Большинство людей даже не заметят того, что они фактически используют roff. Когда вы читаете страницу руководства Unix (man page), roff работает в фоновом режиме. roff-документы могут быть просмотрены с помощью "родного" вьювера xditview(1x), стандартной программы дистрибутива X window, см. X(7x). Но использование roff явно также не вызовет особых трудностей.

Некоторые реализации roff предоставляют программы-обертки, которые облегчают использование roff-системы в командной строке. К примеру, GNU реализация roff, groff(1) предоставляет опции командной строки, для того чтобы избежать длинных конвейеров команд классического troff; программа grog(1) пытается угадывать на основе документа какие аргументы могут быть использованы для запуска groff; людям, которым не нравится указание опций командной строки, следует попробовать groffer(1) программу для графического отображения файлов groff и страниц руководств.

Конвейер roff

Каждая roff-система состоит из препроцессоров, форматирующих roff-программ и набора постпроцессоров для различных устройств. Эта концепция опирается на использование механизма конвейеризации, то есть, набора программ каждая из которых вызывается одна после другой, при чем вывод каждой программы в очереди используется как ввод для следующей программы.

sh# cat file | ... | preproc | ... | troff options | postproc

Препроцессоры генерируют roff-код который передается в roff-форматер (напр. troff), который в свою очередь генерирует промежуточный вывод который передается в постпроцессор устройства для печати или окончательного вывода.

Все эти части используют свои собственные языки программирования; каждый язык совершенно не связан с остальными частями. Более того, часто используются макро-пакеты roff, каждый из которых решает свою, особую, задачу.

Большинство roff-документов используют макрос некоторого пакета, смешанный с кодом для одного или более препроцессора, приправленный несколькими элементами из чистого языка roff. Пользователи редко нуждаются в полной мощи языка форматирования roff; глубокие знания о нем необходимы только программистам макро-пакетов.

Препроцессоры

Препроцессор roff — это любая программа которая генерирует вывод синтаксически подчиняющийся правилам языка форматирования roff. Каждый препроцессор определяет свой собственный язык, который, проходя через программу-препроцессор, транслируется в roff-код. Части написанные на этих языках могут быть включены в документ roff; они распознаваемы с помощью специальных запросов или макросов roff. Каждый документ расширенный кодом препроцессора должен быть пропущен через все соответствующие препроцессоры перед непосредственной передачей программе-форматировщику roff, в виду того, что форматировщик просто игнорирует весь неизвестный ему код. Программы-препроцессоры извлекают и преобразовывают только те части документа которые им предназначены.

Существует множество свободных и коммерческих препроцессоров roff. Некоторые из них доступны не во всех системах, но есть небольшой набор препроцессоров которые рассматриваются как неотъемлемые части каждой roff-системы. Классическими препроцессорами являются:

  • tbl — для таблиц
  • eqn — для математических формул
  • pic — для рисования диаграмм
  • refer — для библиографических ссылок
  • soelim — для включения макро-файлов из стандартных местоположений

Другие известные препроцессоры которые не доступны на всех системах:

  • chem — для рисования химических формул
  • grap — для создания графических элементов
  • grn — для включения изображений gremlin(1)

Программы-форматировщики

Форматировщик roff — это программа выполняющая грамматический разбор документов написанных на языке форматирования roff или использующая один из макро-пакетов roff. Он генерирует промежуточный вывод, который предназначен для передачи постпроцессору конкретного устройства, что должно быть указано форматировщику с помощью опции командной строки. Документы должны быть пропущены через все необходимые препроцессоры перед передачей форматировщику.

Вывод производимый форматировщиком roff представляется на совершенно другом языке, в формате промежуточного вывода или выводе troff. Спецификация этого языка была впервые описана в [CSTR #97]; его GNU-расширения документированы в groff_out(5). По сравнению с высокоуровневым языком roff, язык промежуточного вывода это язык ассемблера. Генерируемый промежуточный вывод оптимизирован для определенного устройства, но язык одинаков для всех устройств.

Форматировщик roff является сердцем roff-системы. Традиционная roff имела два форматировщика, nroff для текстовых устройств и troff для графических.

Часто, имя troff используется как общий термин для обозначения обеих форматировщиков.

Устройства и постпроцессоры

Устройствами называют интерфейсы к оборудованию, такому как принтеры, текстовые или графические терминалы, и т.д., или программные интерфейсы, например, для конвертирования в другой текстовый или графический формат.

Постпроцессор roff — это программа конвертирующая вывод troff в форму подходящую для определенного устройства. В этом постпроцессоры похожи на драйверы устройств.

Для каждого устройства имеется оптимально подходящий для него постпроцессор. Постпроцессор производит грамматический разбор сгенерированного промежуточного вывода и выдает специфический для устройства код, который посылается устройству напрямую.

Нет четкого списка устройств и программ-постпроцессоров, потому что он сильно зависит от программных и аппаратных возможностей конкретного компьютера. К примеру, классические устройства упомянутые в [CSTR #54] очень сильно изменились с тех пор. Старое оборудование не существует более и преобразования величин того времени были довольно неточны по сравнению с их современными аналогами.

Например, устройство Postscript post в классической troff имела разрешение 720, когда groff-устройство ps имеет 72000, что в сто крат больше.

Сегодня операционные системы предоставляют драйвера устройств для большинства печатающих (принтеро-подобных) устройств, по сему нет необходимости писать специальный постпроцессор устройства для каждого принтера.

 

ROFF-ПРОГРАММИРОВАНИЕ

Документы использующие roff являются простыми текстовыми файлами c вкраплением элементов форматирования roff. Язык форматирования roff довольно мощный; это практически полноценный язык программирования, при чем предоставляющий элементы для расширения языка. С этим, стало возможным разрабатывать макро-пакеты для различных задач. Такие макро-пакеты намного удобней в использовании чем чистый roff. Поэтому большинство людей выберут макро-пакет, не беспокоясь о внутренней организации языка roff.

Макро-пакеты

Макро пакеты — это коллекции макросов, которые пригодны для форматирования документов определенного вида удобным способом. Это значительно облегчает использование roff. Определения макросов пакета содержатся в файле name.tmac (классически tmac.name). Все tmac-файлы хранятся в одной или более директориях в стандартизированных местоположениях. Подробности об именовании макро-пакетов и их расположении можно найти в groff_tmac(5).

Макро-пакет который должен быть использован в документе может быть объявлен форматировщику с помощью опции командной строки -m, см. troff(1), или его можно указать внутри документа используя запросы включения файла языка roff, см. groff(7).

Известными классическими макро-пакетами являются man для традиционных страниц руководств; mdoc для страниц руководств в стиле BSD; наборы макросов для книг, статей и писем me (вероятно от имени его создателя Eric Allman), ms (от Manuscript Macros), и mm (от Memorandum Macros).

Язык форматирования roff

Классический язык форматирования roff документирован в Troff User’s Manual [CSTR═#54]. Язык roff представляет собой полноценный язык программирования имеющий запросы, определения макросов, эскейп-последовательности, строковые переменные, цифровые (number) или размерные (size) регистры и управление потоком исполнения.

Запросы — это предопределенные базовые команды форматирования подобно основным командам в командной строке. Пользователь может определять запросо-подобные элементы используя предопределенные элементы roff. После этого их называют макросами. Составитель документа не заметит никаких отличий в использовании запросов или макросов; оба записываемы в своей собственной строке начинающейся с точки.

Эскейп-последовательности — элементы roff начинающиеся с обратной косой черты (backslash) ‘\’. Они могут располагаться в любой позиции строки. Они используются для реализации различных возможностей, включая вставку не ASCII символов с помощью \(, изменения шрифта с \f, внутристроковые комментарии с \", экранирование специальных управляющих символов как \\, и для многих других целей.

Строки — это переменные которые могут хранить строку. Строка сохраняется с помощью запроса .ds Сохраненная строка может быть извлечена позднее с помощью эскейп-последовательности \*.

Регистры хранят числа и размеры. Регистр может быть установлен запросом .nr и его значение можно извлечь с помощью эскейп-последовательности \n.

 

РАСШИРЕНИЯ ИМЕН ФАЙЛОВ

Страницы руководства (man pages) содержат номер раздела как расширение имени файла, например, имя файла для этого документа roff.7, то есть, он содержится в седьмом разделе страниц руководства.

Классические макро-пакеты содержат имя пакета как расширение, например file.me для документа использующего макро пакет me file.mm для mm, file.ms для ms, file.pic для pic файлов, и т.д.

Но не существует общепринятой схемы именования roff-документов, хотя file.tr (от troff file ) встречался время от времени. Возможно должен бы был существовать стандарт для расширений roff-файлов.

Расширения имен файлов могут быть очень удобными в сочетании с программой постраничного просмотра less(1) Она предоставляет возможность передавать весь ввод в конвейер командной строки, который указан в переменной LESSOPEN. Этот процесс не очень хорошо документирован, поэтому вот пример:

sh# LESSOPEN=’|lesspipe %s’ где lesspipe это команда предоставляемая системой или ваш собственный скрипт.  

РЕДАКТИРОВАНИЕ ROFF

Лучшей программой для редактирования документа roff является Emacs (или Xemacs), см. emacs(1). Он предоставляет режим nroff подходящий для различных диалектов roff. Этот режим может быть активирован нижеуказанными методами.

Во время редактирования файла в Emacs режим может быть изменен с помощью команды ‘M-x nroff-mode’, где M-x означает зажать клавишу Meta (или Alt) и, не отпуская ее, нажать клавишу x.

Но также возможно автоматическое включение режима при открытии файла в редакторе.

  • Наиболее привычный метод это включать следующие три закомментированные строки в конец файла. .\" Local Variables:
    .\" mode: nroff
    .\" End:
  • Существует набор расширений файлов, например открытие страницы руководства автоматически ведет к включению режима nroff.
  • Теоретически, возможно написать последовательность .\"-*-═nroff═-*- как первую строку файла чтобы открыть его в режиме nroff при загрузке. К несчастью, это сбивает с толку некоторые приложения, например программу man.

Все форматировщики roff предоставляют автоматический перенос строк и вертикальные и горизонтальные отступы. Для того чтобы не мешать этому, следующие советы могут быть полезны.

  • Не включайте пустые или заполненные пробелами строки в roff-документ. Вместо этого, используйте пустой запрос (строка содержащая только точку) или строковый комментарий .\" если необходимо включить элемент структурирования.
  • Не начинайте строку с пробельного символа, так как это может привести к непредсказуемому поведению. Параграфы с отступами могут быть созданы программным способом с помощью запросов roff.
  • Начинайте каждое предложение с новой строки, так как пустое пространство после точки обрабатывается по-разному, в зависимости от того, что она завершает — аббревиатуру или предложение. Чтобы отличать эти два случая, вставляйте разрыв строки после каждого предложения.
  • В дополнение используйте режим автозаполнения в emacs, он отлично подходит для вставки пустого roff-запроса (строки состоящей из одной только точки) после каждого предложения.

Следующий пример демонстрирует как мог бы выглядеть оптимально сформированный документ roff.

This is an example for a roff document.
.
This is the next sentence in the same paragraph.
.
This is a longer sentence stretching over several
lines; abbreviations like ‘cf.’ are easily
identified because the dot is not followed by a
line break.
.
In the output, this will still go to the same
paragraph.

Помимо Emacs, некоторые другие редакторы также предоставляют стилевые файлы nroff, например, vim(1), расширенная версия редактора vi(1).

 

ОШИБКИ

UNIX это зарегистрированная торговая марка Open Group. Но дела значительно улучшились после попкупки Caldera-ой SCO UNIX в 2001-м.

 

СМОТРИТЕ ТАКЖЕ

Существует много документации по roff. Первоначальные документы по классическому troff до сих пор доступны и все стороны groff детально документированы.

Интернет сайты

  • troff.org — Исторический сайт troff предоставляет обзор и указания на все исторические аспекты roff.
  • Multics — Сайт Multics содержит большое количество информации о проектах MIT, CTSS, раннем Unix, включая runoff; особо полезны глоссарий и ссылки на древние документы.
  • Unix Archive — Архив древних юниксов предоставляет исходные коды и некоторые бинарные файлы древних юниксов (включая исходники troff и документацию на нее) которые были сделаны публичными Caldera-ой с 2001-го, напр. знаменитый Unix version 7 для PDP-11 на сайте Unix V7.
  • Разработчики в AT&T Bell Labs — Bell Labs Computing and Mathematical Sciences Research предоставляет возможность поиска для отслеживания информации о ранних разработчиках.
  • Plan 9 — Операционная система Plan 9 от AT&T Bell Labs.
  • runoff — домашняя страница Jerry Saltzer содержит несколько документов использующих древний язык форматирования runoff.
  • Документы CSTR — Сайт Bell Labs CSTR содержит первоначальные руководства по troff (CSTR #54, #97, #114, #116, #122) и знаменитые исторические документы о программировании.
  • GNU roff — сайт groff предоставляет свободную реализацию roff — groff, стандарт де-факто roff-систем.

Историческая документация по roff

Многие классические документы по troff до сих пор доступны он-лайн. Два главных руководства по языку troff:

Документация по препроцессорам:

Страницы руководства

Ввиду ее сложной структуры, полная roff-система имеет много страниц руководств, каждая описывающая одну сторону roff. К несчастью, не существует единой схемы именования документации среди различных систем roff.

В groff, страница руководства groff(1) содержит обзор всей доступной документации.

В других системах действуйте на свое усмотрение, но troff(1) могла бы быть хорошей отправной точкой.

 

АВТОРЫ

Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.

Этот документ распространяется по условиям FDL (GNU Free Documentation License) версии 1.1 или более поздней. Вы должны были получить копию FDL вместе с вашей копией продукта, она также доступна в сети по адресу GNU copyleft site.

Этот документ является частью groff, GNU-дистрибутива roff. Он был написан Bernd Warken; поддержку осуществляет Werner Lemberg.

Комментарии (заморожены на какое-то время)

На этой странице еще нет комментариев.


Интернет реклама