Книга: UNIX — универсальная среда программирования

9.1 Пакет макроопределений ms

9.1 Пакет макроопределений ms

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

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

.PP
.ft В
Это небольшой абзац, выделенный жирным шрифтом.

Все встроенные команды troff имеют имена, образованные строчными буквами, поэтому по соглашению командам в пакетах даются имена из прописных букв. В нашем примере .PP есть команда ms для абзаца, a .ff — команда troff, вызывающая замену обычного шрифта жирным. (Имена команд, управляющих шрифтами, состоят из прописных букв; шрифты могут быть разными на разных наборных устройствах.)

Команда второго вида это последовательность символов, начинающаяся с обратной дробной черты , которая может оказаться в любом месте входного потока. Например, команда fB также вызывает переключение на жирный шрифт. Она является примером чистой troff; ниже мы коротко ее рассмотрим.

Для форматирования достаточно вводить команду .PP перед каждым абзацем. В принципе при подготовке большинства документов можно обойтись дюжиной разных команд ms. Так, приложение 2, описывающее hoc, имеет название, имена авторов, резюме, автоматически нумеруемые заголовки разделов и абзацы. Здесь используется всего 14 различных команд, причем некоторые из них парами. В ms документ принимает следующую общую форму:

.TL
Название документа (одна или более строк)
.AU
Имена авторов, одно на строке
.AB
Резюме, оканчивающееся .AE
.AE
.NH
Нумеруемые заголовки (автоматически)
.PP
Абзац...
.PP
Другой абзац...
.SH
Подзаголовок (нет нумерации)
.PP
...

Команды форматирования могут появиться в начале строки. Входной текст между командами размещается в произвольной форме: расположение концов строк в нем не существенно, так как troff переносит слова с одной строки на другую, чтобы сделать строки более полными (процесс, называемый заполнением), и расставляет дополнительные пробелы между словами, чтобы выровнять границы (выравнивание). Тем не менее начинать каждое предложение с новой строки считается хорошим стилем; это облегчает последующее редактирование.

Ниже показано начало непосредственного документа hoc:

.TL
Hoc - диалоговый язык для арифметики с плавающей точкой
.AU
Брайан Керниган
Роб Пайк
.AB
.I Hoc
это простой программируемый интерпретатор
для выражений с плавающей точкой.
Он обеспечивает поток управления в стиле Си,
определения функций и обычные
числовые встроенные функции,
такие как косинус и логарифм.
.AE
.NH
Выражения
.PP
.I Hoc
Это язык выражений, во многом подобный Си:
хотя он содержит несколько управляющих операторов,
большинство операторов, таких как присваивания,
это выражения, чьи значения не принимаются
во внимание.
...

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

При использовании пакета макроопределений он специфицируется как аргумент troff:

$ troff -ms hoc.ms

Символы после -m определяют пакет макроопределений.[17] После форматирования с помощью ms документ hoc выглядит так:

Hoc — диалоговый язык для арифметики с плавающей точкой

Брайан Керниган

Роб Пайк

РЕЗЮМЕ

Hoc — это простой программируемый интерпретатор для выражений с плавающей точкой. Он обеспечивает поток управления в стиле Си, определения функций и обычные числовые встроенные функции, такие как косинус и логарифм.

1. Выражения

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

Отображения

Хотя нам и удобно, что troff осуществляет заполнение и выравнивание текста, иногда нежелательно, в частности для программ, выравнивать их границы. Такое форматированное представление называется отображением текста. Команды ms .DS (начало отображения) и .DE (конец отображения) ограничивают текст, благодаря чему он выводится с отступами, но без реорганизации. Посмотрите на следующий фрагмент руководства по hoc, включающий короткое отображение:

.PP
.I Hoc
Это язык выражений,
во многом подобный Си:
хотя он содержит несколько управляющих операторов,
большинство операторов, таких как присваивания,
это выражения, чьи значения не принимаются во внимание.
Например, оператор присваивания
= присваивает значение его правой части
его левому операнду и вырабатывает значение,
используемое в многократном присваивании.
Грамматика выражений такова:
.DS
.I
выражение: число
 | переменная
 | (выражение)
 | выражение бинарная-операция выражение
 | унарная-операция выражение
 | функция(аргументы)
.R
.DE
Числа представляются с плавающей точкой.

Данный фрагмент печатается так:

Hoc — это язык выражений, во многом подобный Си; хотя он содержит несколько управляющих операторов, большинство операторов, таких как присваивания, — это выражения, чьи значения не принимаются во внимание. Например, оператор присваивания = присваивает значение своей правой части левому операнду и вырабатывает значение, используемое в многократном присваивании. Грамматика выражений такова:

выражение: число

 | переменная

 | (выражение)

 | выражение бинарная_операция выражение

 | унарная_операция выражение

 | функция (аргументы)

Числа представляются с плавающей точкой.

Текст внутри отображения не является ни нормально заполненным, ни выравненным. Далее, если места на текущей странице не хватает, отображаемый материал (и все, что за ним следует) переносится на следующую страницу. Команда .DS обеспечивает несколько флагов, включая L для левого выравнивания, С для индивидуальной центровки каждой строки и В для центровки всего отображения.

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

Смена шрифта

Макроопределения ms обеспечивают три команды смены шрифта. Команда .R меняет шрифт на латинский (обычный), .I устанавливает курсив, а .B — жирный шрифт:

Этот текст обычный,
.I
это курсив
.R
это снова обычный, а
.B
это жирный шрифт.

При выполнении команд приведенный выше текст превращается в следующий:

Этот текст обычный, это курсив, это снова обычный, а это жирный шрифт.

Команды .I и воспринимают возможные аргументы, причем смена шрифта относится только к аргументу. В troff аргументы, содержащие пробелы, должны быть экранированы, и единственным символом для такой операции служит двойная кавычка ".

Это обычный текст, но
.I - это
курсив, а
.В "эти слова"
напечатаны жирным шрифтом.

Данный текст печатается так:

Это обычный текст, но — это курсив, а эти слова напечатаны жирным шрифтом.

В конечном счете второй аргумент для .I или .B, напечатанный обычным шрифтом, добавляется без пробелов к первому аргументу. Это средство широко используется при выборе шрифта для пунктуации. Обратите внимание на последнюю скобку фразы

(взятые в скобки
.I "слова курсивом)"

которая печатается неверно в виде

(взятые в скобки слова курсивом)

и сравните ее с фразой

(взятые в скобки
.I "слова курсивом")

которая печатается верно как

(взятые в скобки слова курсивом)

Различные шрифты распознаются программой nroff, но результат оставляет желать лучшего. Символы курсива подчеркнуты и нет жирных литер, хотя некоторые версии nroff изображают жирный шрифт двойной печатью.

Смешанные команды

Сноски вводятся с помощью .FS и заканчиваются .FE. Ваше дело определить метку (сноску) в виде звездочки * или крестика . Такая сноска создается следующим образом:

определяющая метка типа звездочки или крестика. (dg
.FS
(dg подобно этому .FE
Эта сноска была создана с помощью ...

Выделенные отступом абзацы, возможно с использованием номера или другой пометки на границе, создаются командой .IP. Сделаем следующее:

1. Первый небольшой абзац.

2. Второй абзац, который мы удлиняем, чтобы показать, что отступ во второй строке будет таким же, как в первой.

Для этого нужен такой входной текст:

.IP(1)
Первый небольшой абзац.
.IP(2)
Второй абзац ...

Команды .PP или .LP (выравненный слева абзац) завершают дело, начатое командой .IP. Аргументом .IP может быть любая строка: введите кавычки, а при необходимости и пробелы. Второй аргумент можно использовать, чтобы определить значение отступа.

Когда вы работаете с парой команд .KS и .KE, текст должен быть размещен в одном месте; текст, заключенный между этими командами, будет перенесен на новую страницу, если он не разместится весь на текущей странице. Заменив .KS на .KF, вы можете передвинуть текст за последующий текст в верхнюю часть следующей страницы (если его необходимо поместить на одной странице). Все таблицы в книге построены с помощью .KF.

Можно изменить большинство значений ms, принятых по умолчанию, путем установки некоторого числа регистров, являющихся переменными troff и используемых ms. Наиболее часто применяются регистры, управляющие размером текста и интервалом между строками. Нормальным размером текста считается размер в "10 точек", где точка составляет 1/72 дюйма (единица, заимствованная из полиграфии). Обычно строки печатаются с 12-точечным разделением (интервалом). Чтобы изменить интервал, например на 9 или 11 точек (как сделано в наших отображениях), присвойте указанные числа регистрам PS и VS:

.nr PS 9
.nr VS 11

Другие числовые регистры включают LL для установки длины строки, PI для определения отступов абзацев и PD для отделения последних. Это влияет на следующие .PP или .LP.

Пакет макроопределений mm

Мы не будем подробно рассматривать этот пакет макроопределений, поскольку в целом, а зачастую и в деталях он похож на ms. Пакет mm обеспечивает контроль параметров в расширенном по сравнению с ms диапазоне, обладает большими возможностями (например, автоматически нумеруемые списки) и выдает лучшие сообщения об ошибках. В табл. 9.2 показаны команды mm, эквивалентные командам ms из табл. 9.1.

.AB Печатать резюме; оканчивается .AE
.AU Ввести в следующей строке имя автора; разрешены многократные .AU
.B Начать печатать "жирный" текст либо выделить жирным шрифтом аргумент, если он есть
.DS t Начать отображать (незаполненный) текст, оканчивающийся .DE t=L (выравнивание по левому краю), С (центрирование), В (центрирование блока)
.EQ s Начать выравнивание s (входной поток eqn); оканчивается .EN
.FS Начать печатать сноску; оканчивается .FE
Л Начать печатать текст, выделенный курсивом, или выделить курсивом аргумент, если он есть
.IP s Сделать абзац с отступом, помеченный s
.KF Печатать слитно часть текста, если необходимо целиком передвинуть на следующую страницу; конец ее .KE
.KS Печатать статно часть текста на странице; заканчивается .KE
.LP Печатать новый выравненный слева абзац
.NH n Ввести чистовой заголовок n-го уровня; затем сам заголовок до .PP или .LP
.PP Сделать новый абзац
.R Вернуться к обычному шрифту
.SH Ввести подзаголовок; заголовок следует далее до .PP
.TL Далее печатать название до следующей команды ms
.TS Начать печатать таблицу (входной поток tbl); оканчивается .ТЕ

Таблица 9.1: Распространенные команды форматирования ms (см. также справочное руководство по ms(7))

.AS Начать печатать резюме; оканчивается .AE
.AU Задать имя автора
.B Начать печатать "жирный" текст либо выделить жирным шрифтом аргумент, если он есть
.DF Задать слитную часть текста, если необходимо ее целиком передвинуть на следующую страницу; оканчивается .DE
.DS Начать отображать текст; оканчивается .DE
.EQ Начать выравнивание (входной поток eqn); оканчивается .EN
.FS Начать печатать сноску; оканчивается .FE
.I Начать печатать текст, выделенный курсивом, или выделить курсивом аргумент, если он есть
.Hn "..." Задать нумерованный заголовок n-го уровня "…"
.HU "..." Задать ненумерованный заголовок "…"
.P Сделать абзац. Используйте .nr Pt 1 один раз для создания абзаца с отступом
.R Вернуться к обычному шрифту
.TL Задать заголовок до следующей команды mm
.TS Начать печатать таблицу (tbl входной поток); оканчивается .ТЕ

Таблица 9.2: Распространенные команды форматирования mm

Упражнение 9.1

Пропуск завершающей команды типа .AE или .DE обычно ведет к неприятностям. Напишите программу mscheck для обнаружения ошибок во входном потоке ms (или в предпочитаемом вами пакете). Совет: воспользуйтесь awk.

Оглавление книги


Генерация: 1.667. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз