Введение в ConTEXtАвтор: Владимир Лидовский Мы продолжаем знакомить читателей с компонентами меритократически[Меритократия - власть достойных. - Прим. ред.] элитарной издательской системы TEX, основы которой заложены одним из самых авторитетных людей в области ИТ - Дональдом Кнутом. Эта система весьма сложна и хорошо развита, хотя круг ее пользователей - в основном научных сотрудников - относительно невелик. Она использует некоторые уникальные форматы данных и имеет ряд особенностей (описание почти всей TEX-терминологии, а также основных TEX-компонентов см. в предыдущей статье на эту тему["Современная TEXнология" ("КТ" #6 от 25.02.03)]).Система pdfTEX вместе с неразрывно связанным с нею макропакетом[Макропакет вводит дополнительный набор макросов в систему. Без базового макропакета (plain, LaTEX, ConTEXt или др.) TEX функционировать не может] ConTEXt - наиболее бурно растущая с 2001 года ветвь на почти тридцатилетнем дереве TEXнологии. За 2005 год появилось семь обновлений pdfTEX и 33 ConTEXt (несколько обновлений уже вышло и в нынешнем году). В каком-то смысле это революционные разработки. Они меняют почти все: цели системы, ее фундаментальные основы, географические координаты центров поддержки. Все нововведения, однако, стоят на крепком фундаменте полной совместимости с традиционными TEX-системами. НапоминаниеДля читателя, не знакомого с TEX’ом, напомню некоторые основные факты. В отличие от визуальных (WYSIWYG) издательских систем TEX является компилятором, преобразующим исходный текст документа в файл формата dvi (Device Independent), пригодный к распечатке на совместимом оборудовании. Изначально TEX был ориентирован на работу исключительно с печатающими устройствами, - до середины 90-х даже предпросмотр dvi-файлов на экране дисплея был либо слишком неудобен, либо требовал дорогостоящей немассовой аппаратуры. Конечно, о включении каких-то интерактивных элементов, вроде гиперссылок, тогда не могло быть и речи. До появления pdfTEX были лишь две попытки "сменить ориентиры". В первую очередь это система Texinfo, представляющая собой макропакет к TEX и являющаяся стандартом для документации проекта GNU. Она позволяет из одного документа получать распечатку или гипертекст (в частности, html). Сама идея получать из одного документа данные в форматах совершенно разного назначения присутствует в TEX изначально - редактор и его основные компоненты написаны на языке WEB, тексты на котором преобразуются либо в программы на Паскале, либо в документ-описание в формате plain TEX. Код pdfTEX частично связан с WEB, поскольку основан на исходных кодах TEX. С середины 90-х предпросмотр результатов работы TEX в формате dvi стал обычной практикой. Программы просмотра простейшим образом поддерживают гиперссылки - для работы с ними просто-напросто вызывается интернет-браузер. Помимо Texinfo, веб-ссылки поддерживаются, в частности, популярнейшим макропакетом LaTEX. Но радикальный поворот к интерактивным электронным документам произошел только в связке pdfTEX+ConTEXt. Именно в ней создание, например, электронных учебников (ConTEXt разрабатывался для нужд сферы образования) или справочников стало не побочной возможностью, но одним из приоритетов развития. ![]() pdfTEX сохраняет совместимость с dvi, но позволяет также использовать pdf, что, с одной стороны, ставит его в зависимость от этого формата (и косвенно от разрабатывающей его компании Adobe), а с другой - предоставляет ряд дополнительных возможностей. В pdfTEX, однако, произошел полный отказ от расширений на языке PostScript, встречающихся в некоторых макропакетах. Центры разработки pdfTEX и ConTEXt расположены в Европе, в основном в Нидерландах. Участие в этих проектах принимают и разработчики из Восточной Европы. TEX и dviФормат dvi превосходно отображает документы, содержащие только текст с масштабируемыми шрифтами, математические формулы и таблицы. Реализация работы с формулами в TEX до сих пор является наилучшей среди всего существующего программного обеспечения. Таблицы тоже реализованы на достаточно высоком уровне, но чуть хуже, чем в ряде коммерческих программ. В представлении текстов уже появляется ряд проблем: нет возможности менять межбуквенные интервалы при работе с одним шрифтом; текст можно размещать только по горизонтали; улучшенный алгоритм разбиения абзаца на строки поддерживается не всеми реализациями TEX. Для работы с графическими изображениями есть только одно примитивное средство - резервировать на бумаге место для последующего помещения туда графики. Цветов только два - черный и белый. Впрочем, в 80-х годах любой продукт такого класса не был способен на большее. Однако отказ от продолжения разработки METAFONT[METAFONT - компилятор масштабируемых шрифтов TEX], а затем и самого TEX их автором и быстрое наращивание ресурсов персональных компьютеров сделали эти слабости очевидными. Конечно, не следует забывать, что TEX создавался не как система общего назначения, а скорее как средство для написания Кнутом знаменитого "Искусства программирования для ЭВМ"[Кстати, эту книгу рекомендует прочитать всем, кто считает себя хорошим программистом, небезызвестный Билл Гейтс и добавляет: "Если вы сможете ее одолеть, вам определенно следует направить мне резюме"].
PostScript и dvipsPostScript очень интересный и привлекательный универсальный язык программирования. Теоретически на нем можно решать любые алгоритмизируемые задачи, хотя обычно он воспринимается скорее как формат векторной графики. Использование постфиксной (польской обратной) записи, ассоциативных массивов и поддержка на базовом уровне работы со сложной графикой выгодно отличают его от многих других языков. К сожалению, в абсолютном большинстве случаев он используется как язык для взаимодействия непосредственно с печатающей аппаратурой (PostScript-принтерами и др.), что, с одной стороны, делает нежелательным наличие в нем обычных программных конструкций типа циклов, присваиваний и т. п. (поведение совокупности которых невозможно предсказать, не выполнив код), а с другой - требует внесения дополнительной информации (в виде комментариев) для устройств вывода. Кроме того, специфическая узкая направленность PostScript обусловила почти полное отсутствие в нем средств для взаимодействия с пользователем. Система dvips, существующая в нескольких вариантах, конвертирует файлы в формате dvi в PostScript-программы. Возможности PostScript (вставка картинок, трансформация текста, цвет) значительно шире, чем у dvi, и естественно, что для их использования были разработаны макропакеты. Формат dvi, благодаря наличию в TEX команды \special, позволяет вставлять указания, специфические для выбранного драйвера, в частности программы на PostScript. Файл в формате PostScript (или PDF, о котором ниже) не зависит от программного обеспечения компьютера, тогда как dvi-файл требует наличия всех шрифтов, использованных при его создании. Этот формат (portable document format) - прямое развитие PostScript, хотя он и не является "настоящим" языком программирования. В pdf нельзя, например, вычислить 2+2. Данные в этом формате в основном бинарные, но даже текстовая часть связана абсолютными ссылками, что не позволяет ее изменять. ![]() Зато pdf обладает неплохими средствами для организации диалога с пользователем. Фактически pdf по этому параметру не уступает html (поддерживаются гиперссылки, формы, которые могут обрабатываться самим документом или веб-сервером, а также javascript) и может использоваться вместо него. В отличие от html, языка обобщенной (логической) разметки, pdf жестко фиксирует способ показа каждого элемента документа. Структура pdf-файла весьма проста - это список занумерованных объектов, после которых следует каталог ссылок на них, а затем - ссылка на этот каталог. Часть данных в pdf-формате (содержимое объектов), как правило, упакована по известным алгоритмам сжатия. Одним из недостатков pdf, отсутствующим у PostScript, является необходимость считывания всего документа перед показом любой его части, что обусловлено местом расположения каталога объектов. Система pdfTEX создает основу для работы макропакетов типа ConTEXt, выдавая результат сразу в виде pdf. С одной стороны, она позволяет использовать разнообразные полиграфические средства - такие же, как в PostScript; а с другой - поддерживает все диалоговые возможности pdf: работу с графическими изображениями, цветом, мультимедиа, трансформацией текстов и изображений, элементами управления типа кнопок, полей ввода данных и т. п., а также веб-ссылки. Отметим еще всплывающие аннотации к любому участку документа, возможность размещения статьи в виде не связанных друг с другом фрагментов текста и простоту - одной командой - изготовления брошюр, когда, например, на листе A4 печатаются две страницы A5. рdf-ссылки могут указывать не только на какой-то URL, но и на другое место в текущем файле, а также на другой pdf-документ, и содержат указание не только на то, куда они отсылают, но и на способ отображения целевого объекта. В pdfTEX большое внимание уделяется работе с объектами - более мощными разновидностями традиционных теховских "боксов"[Бокс (калька с английского слова box) - прямоугольник, куда помещается картинка (в простейшем случае состоящая из одного символа)]. ![]() Эта система может быть напрямую использована с большинством TEX-макропакетов, в частности с LaTEX. Однако pdfTEX запрещает прямо использовать PostScript, а значит, и такие макропакеты, как TEXdraw, PSTricks и др. Кроме того, отсекается ряд расширений к некоторым макропакетам, например Xy-pic. В документ стало невозможным вставлять картинки в формате eps. Если последнюю проблему легко решить, переконвертировав изображение в png, jpeg или pdf, которые поддерживаются pdfTEX, то другие проблемы в рамках pdfTEX решения не имеют, поскольку команда \special игнорируется. Система pdfTEX в не-dvi-режиме производит только pdf и позволяет вставлять фрагменты данных тоже лишь в формате pdf (при помощи команды \pdfliteral). Вообще говоря, использовать с форматом pdf макропакеты, основанные на PostScript, все-таки можно, если применять только стандартные средства: конвертер ps2pdf из пакета программ Ghostscript или сразу драйвер dvipdfm - аналог dvips, который может непосредственно из dvi получать pdf. Однако использовать в одном документе средства и PostScript, и pdfTEX практически невозможно. Единственный способ обойти это ограничение - прямая постраничная вставка содержимого одного документа pdf в другой - очень громоздок. ![]() К сожалению, поддержка кириллицы в pdfTEX находится на примитивном уровне. Хотя внешний вид документов с кириллическими символами заслуживает высшей оценки, их содержимое практически невозможно использовать как текст - нельзя проводить поиск слов, а также копировать фрагменты текста в другие документы. Проблема вызвана недостаточной поддержкой кириллицы в разработках фирмы Adobe - отсутствует стандартная таблица для связи фирменных названий кириллических символов с их кодами в Unicode, то есть это изъян не pdfTEX, а самого формата pdf. К pdfTEX добавлена недокументированная команда \pdffontattr, позволяющая использовать такого рода таблицы, созданные сторонними лицами. Например, Владимир Волович разработал и поместил в CTAN (Comprehensive TEX Archive Network) таблицы для стандартных кодировок LaTEX, но только для невиртуальных шрифтов. К сожалению, многие кириллические шрифты - виртуальные[Виртуальные шрифты состоят из знаков, набранных из разных файлов с шрифтами - postscript type 1 или 3, true type, metafont и пр. Обозначенная проблема автором статьи частично решена: большинство виртуальных шрифтов и все кириллические можно связать с Unicode, использовав соответствующие таблицы для всех невиртуальных шрифтов, входящих в состав виртуальных; см. https://info.vsu.ru/Lists/CyrTeX-ru/Message/3635.html ]. Кроме того, в закладках (это, как правило, оглавление в отдельном окне сбоку) нельзя напрямую использовать что-либо кроме символов из стандартных кодировок Adobe, среди которых кириллицы нет. Проблема решается лишь прямой вставкой кодов Unicode (UTF-16BE) для букв кириллицы, для чего нужен соответствующий макрос. Вдобавок в большинстве макропакетов TEX символ "\" (backslash) очень трудно использовать самостоятельно, а в формате pdf все Unicode-коды удобнее начинать именно с него. ConTEXt
ConTEXt содержит весь необходимый инструментарий для создания документов со сколь угодно сложной структурой. Большое внимание уделено удобству работы со ссылками на различные компоненты документа, идентификации этих компонентов и способам размещения друг относительно друга. ConTEXt включает в себя:
В отличие от обладающего сотнями стилевых настроек LaTEX’а, ConTEXt пока не имеет простых средств, позволяющих быстро изменить внешний вид документа. Для построения перекрестных ссылок, оглавления, списка таблиц, фигур и т. п. используется вспомогательная программа texutil на языке Perl. Кроме того, ConTEXt может "незаметно" (автоматически) использовать в процессе работы систему METAPOST[METAPOST - аналог METAFONT, но производит результат на PostScript и часто используется для создания не шрифтов, а отдельных масштабируемых иллюстраций]. Хотя внешне ConTEXt отличается от первого кнутовского макропакета plain TEX меньше, чем Texinfo, но все же гораздо больше, чем LaTEX. В ConTEXt практически не используются макросы plain TEX. Даже запись математических формул выглядит иначе. Все соответствующие элементы документа (номера страниц в индексах, элементы оглавления и т. п.) автоматически получаются интерактивными. Эта возможность, однако, приводит к существенному росту размера документа (к счастью, ее можно отключить). Для ConTEXt существует пока лишь одно значительное расширение - пакет PPCTEX, предназначенный для печати структурных формул химических соединений. Есть также десятка два небольших расширений-модулей для решения сравнительно несложных задач - например, для подключения разного рода шрифтов или печати нормальных форм Бэкуса-Наура (НФБН). ![]() В заключение отметим гибкость основ ConTEXt, отсутствие в нем жесткой привязки как к pdfTEX, так и к формату pdf. ConTEXt всегда может производить результат в dvi-формате с разделами \special для разных драйверов dvips, dvipdfm и т. п. Конечно, в таких "dvi" может отсутствовать все, кроме раздела для команд конкретного драйвера. ConTEXt может также работать и с XML. Исчерпывающая информация по pdfTEX и ConTEXt доступна в электронной форме на www.pdftex.org, www.pragma-ade.com, mirror.contextgarden.net. В качестве примера можно привести код простого законченного семистраничного документа ConTEXt из трех глав с подразделами, титульным листом, указателем с индексами и оглавлением. \starttext \setupbodyfont[cyr] \startstandardmakeup \midaligned{Как сделать документ} \midaligned{самим автором} \stopstandardmakeup \completecontent \chapter{Введение} … ваш текст\index{элемент индекса} … \chapter{Глава 1} \section[firstsection]{Первый раздел} … ваш текст … \section{Второй раздел} \subsection{первый подраздел} … ваш текст\index{другой элемент индекса} … \subsection{второй подраздел} … ваш текст … \section{третий подраздел} … ваш текст … \chapter{Другая глава} … ваш текст … \chapter[lastchapter]{Последняя глава} … ваш текст … \completeindex \stoptext
|