- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания UNIX — универсальная среда программирования - Брайан Керниган
Шрифт:
Интервал:
Закладка:
Итак, после обозначения
.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/[email protected], градусы и радианы
E 2.71828182845904523536 @[email protected], основание натурального логарифма
GAMMA 0.57721566490153286060 @[email protected], константа Эйлера-Масчерони
PHI 1.61803398874989484820 @(sqrt5+1)/[email protected], золотое сечение
PI 3.14159265358979323846 @[email protected], круговое трансцендентное число
.ТЕ
Из этой таблицы, кроме того, видно, как строки tbl помещают десятичные точки в числовых (n) столбцах. Результат показан ниже.
Таблица 3: Встроенные константы DEG 57.29577951308232087680 180/π, градусы на радианы E 2.71828182845904523536 е, основание натуральных логарифмов GAMMA 0.57721566490153286060 γ, константа Эйлера-Масчерони PHI 1.61803398874989484820 (√5 + 1)/2, золотое сечение PI 3.14159265358979323846 π, круговое трансцендентное числоИ, наконец, поскольку eqn выделяет курсивом любую строку букв, которые она не распознает, довольно просто выделять обычные слова курсивом. Последовательность @[email protected] например, печатается как 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++ }
/^.IS/ { ideal++ }
/^.[/ { refer++ }
END {
if (refer > 0) printf "refer | "
if (pic > 0) printf "pic | "
if (ideal > 0) printf "ideal | "
if (tbl > 0) printf "tbl | "
if (eqn > 0) printf "eqn | "
printf "troff "
if (ms > 0) printf "-ms"
printf "n"
} '
$
(Флаг -h заставляет ее подавлять заголовки имен файлов на каждой строке: к сожалению, этот аргумент есть не во всех версиях системы.) При сканировании входного потока собирается информация о том, какие компоненты используются. После просмотра входной поток обрабатывается в требуемой последовательности для печати выходного текста. В формировании документов troff со стандартными препроцессорами есть специфика, и главная задача состоит в том, чтобы заставить "думать" об этом саму машину.
Программа doctype в нашем примере подобна bundle-программе, которая создает программу. Однако в таком виде она требует от пользователя вновь вводить строку для shell. В одном из приводимых ниже упражнений вам предлагается это исправить.
Когда дело дойдет до запуска реальных команд troff, не забывайте, что поведение программы зависит от системы: на некоторых установках она управляет наборным устройством непосредственно, в то время как на других выдает в стандартный выходной поток информацию, которая должна быть послана на наборное устройство отдельной программой.
Между прочим, в новой версии этой программы не предусмотрена программа egrep или sort; awk сама просматривает весь входной поток. Для больших документов такой вариант оказывается слишком медленным, поэтому для ускорения поиска мы добавили egrep и затем sort -u, чтобы избавиться от дублирования. При построении типичных документов накладные расходы по созданию двух дополнительных разбирающих данные процессов меньше, чем запуск awk в тех же целях с большим объемом входного текста.
В качестве иллюстрации сравним doctype с версией, только запускающей awk применительно к содержимому данной главы (около 52 000 символов):
$ time awk '... doctype without egrep ...' ch9.*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
real 31.0
user 8.9
sys 2.8
$ time doctype ch9*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
real 7.0
user 1.0
sys 2.3
$
Сравнение, очевидно, в пользу версии с тремя процессами. (Работа была выполнена в однопользовательском режиме; соотношение значений времени показало бы даже более значительное преимущество версии egrep и при повышенной нагрузке на систему.) Отметим, что, прежде чем начать оптимизацию, мы получили сначала простую работающую версию.
Упражнение 9.2Как мы сформатировали эту главу?
Упражнение 9.3Если вашим ограничителем для eqn является знак доллара, то как вы получите этот знак в выходном потоке? Подсказка: исследуйте кавычки и предопределенные слова eqn.
Упражнение 9.4Почему команда
$ doctype имена_файлов
не выполняется? Модифицируйте doctype так, чтобы запускать команду, полученную в результате, вместо того, чтобы ее печатать.
Упражнение 9.5Важны ли накладные расходы на добавочную команду cat в doctype? Перепишите doctype, чтобы избавиться от дополнительного процесса. Какая версия проще?
Упражнение 9.6Что лучше: использовать doctype или писать файл shell, содержащий команды, для форматирования конкретного документа?
Упражнение 9.7Поэкспериментируйте с различными комбинациями grep, egrep, fgrep, sed, awk и sort, чтобы повысить быстродействие doctype.
9.4 Справочник
Основной документацией для команды является обычно справочная страничка (называемая далее справочником) одностраничное описание в справочном руководстве по UNIX (см. рис. 9.2). Справочник хранится в стандартном каталоге, как правило, в /usr/man, в подкаталоге, нумерованном в соответствии с разделом руководства. Например, наш справочник для hoc хранится в /usr/man/man1/hoc.1.
Справочники печатаются с помощью команды man(1), т.е. файла shell, который запускает nroff -man, поэтому man hoc печатает справочник hoc. Если одно и то же имя появляется в нескольких разделах, как само man (раздел 1 описывает команду, тогда как раздел 7 описывает макрокоманды), то раздел можно определить для man как
$ man 7 man
В результате печатается только описание макрокоманд пакета man. По умолчанию принято печатать все справочники с определенным именем, использующим nroff, но man -t порождает справочники для наборного устройства с помощью troff.