Читаем без скачивания UNIX — универсальная среда программирования - Брайан Керниган
Шрифт:
Интервал:
Закладка:
Вначале появилась eqn. Это было первое применение yacc не для целей программирования[18]. Программа tbl, разработанная позднее, аналогична eqn, хотя и имеет независимый синтаксис; tbl не использует yacc, так как ее грамматика достаточно проста.
Средства программных каналов UNIX предполагают строгое разделение на отдельные программы. Кроме разбиения на части (что так или иначе необходимо, поскольку troff уже достигла максимального размера для PDP-11), программные каналы сужают круг взаимодействия между частями программы и между разрабатывающими их программистами. Последнее особенно важно: чтобы сделать препроцессор, не нужно "залезать" в исходную программу. Далее программные каналы позволяют не создавать большие промежуточные файлы при условии, что компоненты намеренно запускаются отдельно с целью отладки.
Однако организация взаимодействия программ через конвейеры связана с некоторыми проблемами. Отчасти снижается быстродействие, поскольку увеличивается объем ввода и вывода: обычно и eqn, и tbl дают расширение выходного потока по отношению к входному в отношении 8:1. Еще более существенно, что информация идет только в одном направлении. Например, нет способа определения текущего размера шрифта, что создаст неудобства в пользовании языком. И, наконец, трудно обеспечить сообщения об ошибках, так как иногда трудно связать диагностику из troff с eqn и tbl. Тем не менее преимущества разделения значительно перекрывают недостатки, поэтому было написано несколько препроцессоров, основанных на этой модели.
ТаблицыОбсудим кратко работу tbl и прежде всего таблицу операций по документации к hoc. tbl читает свои входные файлы или стандартный входной поток и преобразует текст между командами .TS (начало таблицы) и .ТЕ (конец таблицы) в команды troff, печатающие таблицу, выравнивающие столбцы и обеспечивающие все типографские атрибуты. Строки .TS и .ТЕ тоже копируются, поэтому пакет макроопределений выдает для них подходящие определения с тем, например, чтобы можно было помещать таблицу на одной странице и отделять ее от окружающего текста.
При формировании сложных таблиц вам, конечно, придется обращаться к справочному руководству по tbl. Хотя для уяснения основных принципов работы вполне достаточно приведенного ниже примера (из документации по hoc).
.TS
center, box;
с s
lfCW 1
fВТаблица 1:fP Операции по порядку уменьшения приоритета
.sp.5
^ возведение в степень (s-1FORTRANs0 **) правоассоциативна
!- одноместные логическое и арифметическое отрицания
* / умножение, деление
+- сложение, вычитание
> >= операции отношения: больше, больше или равно < <= меньше, меньше или равно
&== != равно, не равно (все отношения одинакового приоритета)
&& логическое И (оба операнда всегда вычисляются)
|| логическое ИЛИ (оба операнда всегда вычисляются)
&= присваивание, правоассоциативна
.ТЕ
В результате мы получаем следующую таблицу:
Таблица 1: Операции по порядку уменьшения приоритета ^ возведение в степень (FORTRAN **) правоассоциативна ! - одноместные логическое и арифметическое отрицания * / умножение, деление + - сложение, вычитание > >= операции отношения: больше, больше или равно < <= меньше, меньше или равно == != равно, не равно (все отношения одинакового приоритета) && логическое И (оба операнда всегда вычисляются) !! логическое ИЛИ (оба операнда всегда вычисляются) = присваивание, правоассоциативнаСлова перед точкой с запятой описывают глобальные свойства таблицы: центрировать по горизонтали на странице и заключить в рамку. Другие средства включают doublebox (сделать двойную рамку), allbox (включить каждый элемент в рамку) и expand (расширить таблицу на формат страницы).
Следующие строки до точки описывают формат различных секций таблицы. Первая спецификация служит для первой строки таблицы, вторая для второй, последняя для всех остальных строк. В табл. 1 вы видите только две строки спецификаций, поэтому вторая спецификация применяется к каждой строке таблицы посте первой. Символы формата для элементов центрированных в столбце, с, r и l для правого и левого выравнивания и n — для выравнивания чисел по десятичной точке. Символ S определяет столбец с промежутком; в нашем случае 'c s' означает центровку названия над всей таблицей путем задания размера второго столбца так же, как и первого. Для столбца можно определить шрифт. Спецификация tbl lfCW позволяет печатать выравненный по левому краю столбец шрифтом CW.
Текст таблицы следует за информацией для форматирования. Символы табуляции разделяют столбцы и некоторые команды troff, например .sp, которые уместны внутри таблиц. (Отметим пару вхождений &: незащищенный передний символ - и знак = в столбцах указывают tbl на необходимость располагать строки таблицы в этой точке.)
Программа tbl строит более широкий набор таблиц, чем показано в примере: текст может помещаться в рамки, могут вертикально выравниваться заголовки столбцов и т.д. Самый легкий способ использовать tbl для создания сложных таблиц обратиться к справочному руководству по UNIX (том 2A) и применить перечисленные в нем команды.
Математические выраженияВторой препроцессор eqn превращает язык, описывающий математические выражения, в команды troff, чтобы эти выражения печатать. Препроцессор автоматически обрабатывает смены шрифта и формата и, кроме того, предоставляет имена для стандартных математических символов. Входной текст для eqn обычно находится между строками .EQ и .EN, аналогично командам tbl .TS и .ТЕ. Например,
.EQ
x sub i
.EN
выдаёт xi. Если используется пакет ms, уравнение печатается как "отображение", а возможный аргумент .EQ определяет номер уравнения. Например, формула интеграла Коши
записывается как
.EQ (9.1)
f( zeta ) ~=~ 1 over {2 pi i} int from С
f(z) over {z - zeta} dz
.EN
В основу языка eqn и положен способ чтения вслух математических формул. Единственное различие между "разговорной" математикой и входным текстом eqn состоит в том, что скобки { } отменяют заданные по умолчанию правила предшествования языка, однако обычные скобки специального смысла не имеют. Пробелы тем не менее важны. Заметим, что первое вхождение zeta в примере, приведенном выше, окружено пробелами: ключевые слова, такие, как zeta и over, распознаются только тогда, когда они окружены пробелами или скобками, но ни те, ни другие в выходной текст не попадают. Чтобы обеспечить пробелы в выходном потоке, используйте символ ~, как показано в примере (~=~). Для получения скобок используйте "{" и "}".
Существует несколько классов ключевых слов eqn. Греческие буквы записываются прописными и строчными: lambda и LAMBDA (λ и Λ). Другие математические символы имеют имена, такие как sum, int, infty, grad: Σ, ∫, ∞, ∇. Есть знаки позиции, например sub, sup, from, to, and, over:
Эта формула выводится так:
sum from i=0 to infinity x sub i sup 2~→~1 over {2pi}
Существуют знаки операций типа sqrt, расширяющие скобки, фигурные скобки и т.д. Программа eqn, кроме того, позволяет создавать из объектов столбцы и матрицы. Предусмотрены команды для управления шрифтами и позициями, если те, которые установлены по умолчанию, не подходят.
Часто приходится помещать небольшие математические выражения, такие, как log10(x), в тело текста, а не в отображение. Ключевое слово eqn delim определяет пару символов для выделения подобных выстроенных выражений. Символы, задаваемые в качестве левого и правого ограничителей, обычно одинаковы: часто применяется знак доллара $. Но поскольку hoc использует $ для аргументов, в нашем примере мы употребили @. Символ % тоже удобен как ограничитель, но других символов избегайте: многие из них имеют специальные назначения в различных программах, поэтому вы можете спровоцировать непредсказуемое поведение eqn (именно так у нас и получилось с этим разделом).