Софтерра: Введение в ConTEXt
Софтерра: Введение в 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 создавался не как система общего назначения, а скорее как средство для написания Кнутом знаменитого «Искусства программирования для ЭВМ»[Кстати, эту книгу рекомендует прочитать всем, кто считает себя хорошим программистом, небезызвестный Билл Гейтс и добавляет: «Если вы сможете ее одолеть, вам определенно следует направить мне резюме»].
Все перечисленные и некоторые другие недостатки TEX обусловлены примитивностью формата dvi — передового для 80-х, но явно устаревшего уже в 90-х. Наращивание возможностей этого формата или даже поддержание его «на плаву» — чрезвычайно трудоемкая задача. По идее, для каждого нового устройства вывода нужно писать свой dvi-драйвер. Понятно, что в современных условиях это практически невозможно. Вместо постоянного сопровождения dvi сообществом пользователей TEX был выбран другой путь — путь разработки универсального драйвера, конвертирующего dvi в стандартный для полиграфических систем язык PostScript. Параллельно с развитием GNU-системы Ghostscript, которая обеспечивает трансляцию текстов PostScript в форму, непосредственно воспринимаемую устройствами вывода, это решило проблему совместимости с устройствами печати.
PostScript и dvips
PostScript очень интересный и привлекательный универсальный язык программирования. Теоретически на нем можно решать любые алгоритмизируемые задачи, хотя обычно он воспринимается скорее как формат векторной графики. Использование постфиксной (польской обратной) записи, ассоциативных массивов и поддержка на базовом уровне работы со сложной графикой выгодно отличают его от многих других языков. К сожалению, в абсолютном большинстве случаев он используется как язык для взаимодействия непосредственно с печатающей аппаратурой (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
Это ориентированное на европейское языковое многообразие средство преимущественно служит для создания качественных электронных изданий. К нему прилагается руководство на шести языках: английском, немецком, итальянском, голландском, чешском и румынском. Более того, для перечисленных языков существует свой набор макросов — например, вместо английского названия макроса appendix чешский пользователь может использовать dodatek. Поддерживаются также, хотя и в меньшей степени, другие языки — в частности, вьетнамский. К сожалению, ситуация с кириллицей в этом макропакете даже хуже, чем в pdfTEX, хотя базовая поддержка имеется.
ConTEXt содержит весь необходимый инструментарий для создания документов со сколь угодно сложной структурой. Большое внимание уделено удобству работы со ссылками на различные компоненты документа, идентификации этих компонентов и способам размещения друг относительно друга. ConTEXt включает в себя:
почти все базовые возможности макропакета LaTEX;
полиграфические расширения PostScript/pdf;
интерактивные возможности pdf.
В отличие от обладающего сотнями стилевых настроек 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.
В статье использованы иллюстрации из книги «metafun» Ханса Хагенса (Hans Hagens). Автор изображения канала — Йохан Йонкер (Johan Jonker).
В качестве примера можно привести код простого законченного семистраничного документа 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