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
(именно так у нас и получилось с этим разделом).Итак, после обозначения
.EQ
delim @ @
.EN
можно напечатать встроенное выражение в виде
@ sum from i == 0 to infinity x sub i @ can be printed.
Встроенные выражения используются для вывода формул в таблице (см. пример из документации по
hoc
):.TS
center,box
css
lfCWn1.
\fВТаблица 3:\fР Встроенные константы
.sp.5
DEG 57.29577951308232087680 @180/pi@, градусы и радианы
E 2.71828182845904523536 @e@, основание натурального логарифма
GAMMA 0.57721566490153286060 @gamma@, константа Эйлера-Масчерони
PHI 1.61803398874989484820 @(sqrt5+1)/2@, золотое сечение
PI 3.14159265358979323846 @pi@, круговое трансцендентное число
.ТЕ
Из этой таблицы, кроме того, видно, как строки
tbl
помещают десятичные точки в числовых (n
) столбцах. Результат показан ниже.Таблица 3: Встроенные константыDEG
57.29577951308232087680 180/π, градусы на радианы E
2.71828182845904523536 е, основание натуральных логарифмов GAMMA
0.57721566490153286060 γ, константа Эйлера-Масчерони PHI
1.61803398874989484820 (√5 + 1)/2, золотое сечение PI
3.14159265358979323846 π, круговое трансцендентное число
И, наконец, поскольку
eqn
выделяет курсивом любую строку букв, которые она не распознает, довольно просто выделять обычные слова курсивом. Последовательность @Word@
например, печатается как Word. Но будьте внимательны: eqn
распознает некоторые обычные символы (такие, как from
и to
) и специальным образом их рассматривает: она "глотает" пробелы, поэтому указанный прием следует применять с осторожностью.Получение выходного потокаКак только ваш документ готов, вы должны соединить все препроцессоры и
troff
в цепочку, чтобы получить выходной поток. Порядок команд следующий: tbl
, eqn
, troff
. Если вы просто используете troff
, то печатайте$ troff -ms имена_файлов
(или -mm
)Иначе вам придется задать аргумент
имена_файлов
первой команде в цепочке и дать остальным командам читать их стандартный входной поток, как показано ниже:$ eqn имена_файлов | troff -ms
или
$ tbl имена_файлов | eqn | troff -ms
Неудобно следить за тем из препроцессоров, который действительно должен печатать какой-то отдельный документ. Мы сочли уместным написать программу
doctype
, обеспечивающую вывод соответствующей последовательности команд:$ doctype ch9.*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
$ doctype hoc.ms
cat hoc.ms | tbl | eqn | troff -ms
$
Программа
doctype
реализована с помощью инструментов, рассмотренных в гл. 4. В частности, программа awk
отыскивает последовательность команд, используемую препроцессорами, и печатает строку команд, которые нужно вызвать, чтобы отформатировать документ. Она также находит команду .PP
(абзац) для форматирования пакетом запросов ms
.$ cat doctype
# doctype: synthesize proper command line for troff
echo -n "cat $* | "
egrep -h (EQ|TS|\[|PS|IS|PP)' $* |
sort -u |
awk '
/^\.PP/ { ms++ }
/^\.EQ/ { eqn++ }
/^\.TS/ { tbl++ }
/^\.PS/ { pic++ }