Журнал «Компьютерра» № 14 от 11 апреля 2006 года - Компьютерра. Страница 24
Все перечисленные и некоторые другие недостатки TEX обусловлены примитивностью формата dvi – передового для 80-х, но явно устаревшего уже в 90-х. Наращивание возможностей этого формата или даже поддержание его «на плаву» – чрезвычайно трудоемкая задача. По идее, для каждого нового устройства вывода нужно писать свой dvi-драйвер. Понятно, что в современных условиях это практически невозможно. Вместо постоянного сопровождения dvi сообществом пользователей TEX был выбран другой путь – путь разработки универсального драйвера, конвертирующего dvi в стандартный для полиграфических систем язык PostScript. Параллельно с развитием GNU-системы Ghostscript, которая обеспечивает трансляцию текстов PostScript в форму, непосредственно воспринимаемую устройствами вывода, это решило проблему совместимости с устройствами печати.
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-коды удобнее начинать именно с него.