troff ( / ˈ t iː r ɒ f / ), сокращение от «typesetter roff», является основным компонентом системы обработки документов , разработанной Bell Labs для операционной системы Unix . troff и связанный с ним nroff были разработаны на основе оригинального roff .
В то время как nroff был предназначен для вывода на терминалы и линейные принтеры, troff был предназначен для вывода на системы наборного набора , в частности, Graphic Systems CAT , представленную в 1972 году. Оба использовали один и тот же базовый язык разметки , и один и тот же исходный файл обычно мог использоваться nroff или troff без изменений.
troff содержит команды для назначения шрифтов, интервалов, абзацев, полей, сносок и многого другого. В отличие от многих других текстовых форматировщиков, troff может располагать символы на странице произвольно, даже перекрывая их, и имеет полностью программируемый язык ввода. Отдельные препроцессоры используются для более удобного создания таблиц, диаграмм и математических формул. Входные данные для troff — это простые текстовые файлы, которые можно создать в любом текстовом редакторе.
Были созданы обширные пакеты макросов для различных стилей документов. Типичный дистрибутив troff включает макросы me для форматирования исследовательских работ, макросы man и mdoc для создания страниц man Unix , макросы mv для создания монтируемых прозрачных пленок , а также макросы ms и mm для писем, книг, технических меморандумов и отчетов.
Происхождение troff можно проследить до программы форматирования текста RUNOFF , которая была написана Джеромом Х. Зальцером для операционной системы CTSS Массачусетского технологического института в середине 1960-х годов. (Название предположительно произошло от фразы I'll run off a document . )
Боб Моррис перенес его на архитектуру GE 635 и назвал программу roff (сокращение от runoff ). [ необходима ссылка ] Она была переписана как rf для PDP-7 , и в то же время (1969) Дуг Макилрой переписал расширенную и упрощенную версию roff на языке программирования BCPL .
Первая версия Unix была разработана на PDP-7, который стоял в Bell Labs . В 1971 году разработчики захотели получить PDP-11 для дальнейшей работы над операционной системой. Чтобы оправдать стоимость этой системы, они предложили реализовать систему форматирования документов для патентного отдела Bell Labs. [1] Эта первая программа форматирования была повторной реализацией roff Макилроя , написанной Джо Ф. Оссаной .
Когда им понадобился более гибкий язык, была написана новая версия roff под названием nroff ( более новая «roff» ), которая стала основой для всех будущих версий. Когда они получили фотонаборный аппарат Graphic Systems CAT , Осанна модифицировала nroff для поддержки нескольких шрифтов и пропорциональных интервалов . Названный troff , от наборщика roff , его сложный вывод поразил производителя наборного аппарата и смутил рецензентов , которые думали, что рукописи с использованием troff уже публиковались ранее. [2] [3] Таким образом, название troff произносится как / ˈ t iː r ɒ f /, а не * / ˈ t r ɒ f / .
Вместе с troff появился nroff (на самом деле это была почти одна и та же программа), который был предназначен для вывода данных на строчные принтеры и символьные терминалы . Он понимал все, что делал troff , и игнорировал команды, которые не были применимы, например, изменение шрифта .
Troff Осанны был написан на языке ассемблера PDP-11 и производил вывод специально для фотонаборного устройства CAT . Он переписал его на C , хотя теперь он состоял из 7000 строк некомментированного кода и все еще зависел от CAT. Поскольку CAT стал менее распространенным и больше не поддерживался производителем, необходимость сделать его поддерживающим другие устройства стала приоритетной. Осанна умер до того, как эта задача была выполнена, поэтому Брайан Керниган взялся за переписывание troff . Новая переписанная версия производила аппаратно-независимый код, который постпроцессорам было очень легко читать и переводить в соответствующие коды принтера. Кроме того, эта новая версия troff (часто называемая ditroff для device independent troff ) имела несколько расширений, которые включали функции рисования. [4] Документация программы определяет формат вывода ditroff , который используется многими современными клонами troff, такими как GNU groff .
В 1983 году troff был одним из нескольких инструментов UNIX, доступных для операционной системы UNOS компании Charles River Data Systems по лицензии Bell Laboratories . [5]
Коллекция инструментов troff (включая пре- и постпроцессоры) в конечном итоге была названа Documenter's WorkBench (DWB) и находилась в процессе непрерывной разработки в Bell Labs, а затем в отделившейся Unix System Laboratories (USL) до 1994 года. В то время SoftQuad взяла на себя поддержку, хотя Брайан Керниган продолжал совершенствовать troff самостоятельно. Таким образом, используются по крайней мере следующие варианты оригинального troff Bell Labs:
Хотя troff был вытеснен другими программами, такими как Interleaf , FrameMaker и LaTeX , он все еще используется довольно широко. Он остается форматировщиком по умолчанию для документации UNIX .
Программное обеспечение было переработано как groff для системы GNU , начиная с 1990 года. Кроме того, из-за открытого исходного кода древних систем UNIX , а также современных преемников, таких как основанные на ditroff версии с открытым исходным кодом, найденные в OpenSolaris и Plan 9 от Bell Labs , существует несколько версий AT&T troff (CAT и основанные на ditroff [6] ), доступных под различными лицензиями с открытым исходным кодом.
В целом, не поощрялось использование troff напрямую, а скорее переход через более простой в использовании интерфейс. [7] [8] Troff включает макросы , которые запускаются перед началом обработки документа. Эти макросы включают настройку верхних и нижних колонтитулов страниц, определение новых команд и влияние на то, как будет отформатирован вывод. Аргумент командной строки для включения набора макросов -m name , что привело к тому, что многие наборы макросов стали известны как базовое имя файла с ведущим m . [9]
Стандартные наборы макросов, начинающиеся с m :
mandoc
— это слияние, которое поддерживает оба набора ручных команд. [14]Макросы ms были первыми из них, разработанными в AT&T, до того, как их вытеснили макросы mm. [18] Одной из целей макросов mm было то, чтобы их можно было использовать в машинописном пуле Bell Labs, и со временем это произошло, и макросы mm стали стандартом в Bell Labs. [19] AT&T сделала макросы mm коммерчески доступными для System V Unix. [18] Напротив, макросы me были разработаны в Беркли. [18]
Пример простого делового письма, подготовленного с помощью макросов mm:
.НД "10 января 1993 г.".AU "Мисс Джейн Смит".AT "Предстоящая встреча".МТ 5.ДССсылка #A12345.sp 4Г-н Сэмюэл ДжонсДиректор полевого отделения, Бюро инспекций1010 Правительственная площадьКэпитолтаун, ST.sp 3Уважаемый г-н Джонс,.sp 2.ПСсылаясь на отмеченное обязательство представить на государственную инспекцию наш недавно созданный производственный процесс, мы просим вас рассмотреть возможную нецелесообразность подчинения инновационных технологий завтрашнего дня во многом устаревшим требованиям вчерашнего дня. Если наше великое государство хочет процветать в двадцать первом веке, мы должны принять меры.Б сейчас,в.Я этогод.Я этодесятилетие, чтобы подготовить нашу промышленную базу к межгосударственной и международной конкуренции, которая обязательно появится. Наш новый процесс делает именно это. Пожалуйста, не позволяйте, чтобы его уничтожила нормативная среда, которая больше не подходит..ПБлагодарим Вас за рассмотрение нашей позиции..FC С уважением.SG
Полный список доступных макросов обычно приводится на tmac(5)
странице руководства . [14]
По мере развития troff , поскольку есть несколько вещей, которые нельзя легко сделать в troff , было разработано несколько препроцессоров . Эти программы преобразуют определенные части документа во входные данные troff , естественным образом вписываясь в использование «конвейеров» в Unix — отправляя вывод одной программы в качестве входных данных другой (см. каналы и фильтры ). Обычно каждый препроцессор транслирует только разделы входного файла, которые специально помечены, пропуская остальную часть файла без изменений. Встроенные инструкции препроцессора написаны на простом языке программирования, специфичном для приложения, что обеспечивает высокую степень мощности и гибкости.
Три препроцессора предоставляют troff возможности рисования, определяя предметно-ориентированный язык для описания изображения.
Кроме того, существует команда soelim, которая удаляет .so
директивы включения из входного текста. [24]
Типичная структура трубопровода может быть следующей:
soelim file | refer | ideal | pic | tbl | eqn | troff
Еще больше препроцессоров позволяют рисовать более сложные изображения, генерируя выходные данные для pic .
Разработано несколько других интерфейсов, призванных стать более дружественными интерфейсами для troff.
Один из них — Sanscribe , изначально разработанный в Беркли, а затем усовершенствованный в 1980-х несколькими пользователями, включая Intel и InterACT . Sanscribe, используемый для написания записок, отчетов, документов, построен на основе базовых команд troff, а также макросов me и различных пре- и постпроцессоров, таких как soelim, eqn, tbl, grap и pic. Однако это основной двоичный файл программы, а не препроцессор. Возможность условного включения делает его особенно полезным для поддержки многоплатформенных справочных руководств. Однако Sanscribe является хрупким и склонным к появлению криптографических ошибок или созданию странно отформатированных результатов. [28]
Специализированный фронтенд — vgrind , который генерирует красиво отформатированные листинги исходных программ с такими функциями, как выделение комментариев курсивом, ключевых слов жирным шрифтом и имен функций, выделенных на полях. Он может работать как фильтр или как основная программа, а его вывод передается в troff. Он поддерживает языки, используемые в лабораториях Bell Labs, включая не только Fortran , C и C++, но и инструменты, специфичные для домена, такие как Bourne shell и yacc, а также более отдаленные, такие как Emacs Lisp и Icon . [24]
Другой подход используется в наборе инструментов CADiZ для обозначения Z. Вместо того, чтобы cadiz
программа была препроцессором в передней части конвейера, она взаимодействует несколько раз с troff
как входными, так и выходными данными, используя сохраненные файлы, а не конвейер. CADiZ также содержит свой собственный набор макросов, вызываемых .ZA
через .ZZ
. [29]