20090105

TeX и его варианты

Мои читатели ещё в прошлом году могли заметить, что я стал интересоваться «альтернативными» вариантами TEX-а, а именно XTEX-ом (см. XLaTEX и шрифты OpenType, Русский BibTEX и XLaTEX) и ConTEXt-ом. Предлагаю вам небольшой обзор, рассказывающий, что это за звери, и чем они отличаются от обычного TEX-а.

Начнём с того, что когда кто-то говорит «я набираю статьи в „тэхе“», чаще всего подразумевается, что тексты набираются с использованием разметки и команд макропакета LaTEX («латэх»), а затем документы компилируется в файлы формата PDF или DVI. При этом основную работу по вёрстке текста выполняет программа TEX («тэх»). Это означает, что большинство пользователей не использует TEX напрямую, а пользуется более высокоуровневыми наборами команд для разметки. А вот макропакет в свою очередь полностью полагается на TEX.

Теперь мы можем взглянуть на существующий зоопарк TEXнологий. Оказывается, царь зверей TEX в нём не одинок. И макропакет LaTEX — не единственный возможный выбор пользователя.

Начнём с основ. Простой TEX, созданный Дональдом Кнутом, практически заморожен и меняться не будет. Большинство же использует его расширенный вариант ε-TEX Питера Брайтенлонера. Букву «ε» можно понимать как обозначение для «улучшенный», «расширенный», «эволюционный» или даже «европейский» TEX. При этом ε-TEX настолько близок к своему предку, насколько это возможно, хотя и умеет, в отличие от него, например, писать справа налево.

Оба этих зверя выдают на выходе документ формата DVI, что, конечно, замечательно, но требует ещё дополнительной конвертации в PostScript или PDF. Да и не все возможности PDF доступны в DVI. Это привело к широкому распространению ещё одного варианта TEX: pdfTEX-a Хан Тэ Таня, который умеет верстать сразу PDF.
На мой взгляд, использование макропакета LaTEX совместно с pdfTEX-ом — наиболее предпочтительный вариант для набора научно-технических статей и документации. Этот тандем часто назвают одним словом: pdfLaTEX.
Использование pdfTEX-a даёт сразу несколько преимуществ по сравнению с традиционным TEX-ом:
  • можно использовать шрифты Adobe Type 1 и TrueType,
  • доступны микротипографические возможности полевого кернинга (аналог висящей пунктуации, распространяемый на все символы) и «раздвижки шрифта» («font expansion», затрудняюсь правильно по-русски назвать), улучшающей межсловные пробелы,
  • можно использовать такие возможности формата PDF как гиперссылки, таблицы оглавлений, метаданные документа,
  • можно использовать растровую графику,
  • можно сразу получать документ в формате пригодном для обмена с другими людьми.
Казалось бы, чего ещё желать?

А пожелать можно ещё две важных вещи:
  1. Поддержки Unicode. Времена однобайтных национальных кодировок прошли. И достаточно взглянуть на википедию, чтобы понять, что многоязыковые документы — это реальность.
  2. И поддержки OpenType. OpenType — это современная шрифтовая технология, которая должна постепенно заменить и Type 1, и TrueType. Она позволяет создавать единые уникодные шрифты с большим количеством глифов (до 65535), позволяет программировать на уровне шрифтового файла типографические «опции», такие как выбор альтернативных начертаний и стилистических особенностей, автоматических лигатур и замен, поддержку сложных систем писменности, облегчает разработку шрифтов за счёт, например, групп кернинга, а шрифтовые файлы OpenType, наконец, кроссплатформенны.
И оба эти желания довольно «трудные». Было уже несколько попыток их исполнить.

Исторически первая попытка подружить TEX и уникод — это, наверное, проект Omega. Никогда очень активным он не был, и, видимо, окончательно заглох. Его форк, проект Aleph, тоже больше не разрабатываетя.

Однако основная часть функционала Aleph была использована в проекте LuaTEX. Его основные особенности:
  • встроенный в TEX язык программирования Lua,
  • поддержка уникода,
  • поддержка OpenType независимо от ОС (используется код редактора FontForge)
Проект стартовал в 2006 году, и к августу 2009 планируется сделать первый официально-стабильный выпуск. Однако уже сейчас LuaTEX входит в дистрибутив TeXLive 2008 и может быть использован вместе с макропакетом ConTEXt. Ожидается, что именно LuaTEX станет pdfTEX-ом 2.0. Однако использовать LuaTEX совместно с LaTEX пока ещё нельзя.

Ещё один проект добавляющий поддержку и уникода, и OpenType в TEX — XTEX (читается как «зитэх»). И он уже сейчас работает, и уже сейчас может быть использован совместно с LaTEX.

Отличие XTEX от LuaTEX-а в том, что он полагается на поддержку OpenType на уровне операционной системы. В случае GNU/Linux — на библиотеки fontconfig и ICU. Большим достоинством XTEX является заметно упрощённая система работы со шрифтами. Совершенно единообразно можно использовать и старые шрифты Type 1, и новые OpenType.
Таким образом, можно подытожить: если хочется использовать уникод или шрифты OpenType в LaTEX, то сейчас это возможно с помощью XLaTEX. В ближайшем будущем, возможно, можно будет пользоваться и LuaTEX-ом. Однако в остальных случаях можно по-прежнему пользоваться pdfLaTEX. Этот вариант, пожалуй, также надёжнее, если планируется отдавать исходники документа в издательство или другим пользователям. Однако будущее, по моему, за уникодом и OpenType.


На последок несколько слов о макропакетах. Не считая «простого TEX», их два: LaTEX и ConTEXt. И если латэх хорошо известен, то о ConTEXt-е знают меньше. Основная разница между ними — в идеологии.

LaTEX старается дать пользователю средства описания структуры документа, а заботы о вёрстке взять на себя (возложить на разработчика класса документа). Однако некоторые средства управления вёрсткой пользователю всё же даёт (например, выбор начертаний и размеров шрифта). В результате получается более-менее пристойно свёрстанный документ практически без усилий со стороны пользователя (а пользователь может сосредоточится на содержании документа). На практике пользователи часто хотят так или иначе управлять вёрсткой. Хотя возможности самого LaTEX ограничены, нужных эффектов можно добиваться с помощью дополнительных макропакетов, которых существует очень много. К сожалению, активное использование этих макропакетов нарушает переносимость исходников между машинами, между пакетами могут быть конфликты, функциональность пакетов часто дублируется, а нужного результата достичь не всегда легко. Зато LaTEX — это практически «стандарт» для математических и физических статей.

Создатели ConTEXt избрали другой подход: изначально дать пользователю контроль над вёрсткой документа. В результате, требуется немного больше усилий, чтобы сверстать маленький документ «с нуля» (всё таки над макетом документа надо подумать), зато сразу есть все средства для сложной вёрстки. Особенно радует многоколоночная вёрстка. Большое внимание было уделено возможности создания больших и сложных коллекций документов в едином стиле.

Мне лишь недавно удалось набрать в ConTEXt русский текст (потребовалось исправление), но думаю, это проблемы роста. Вообще, надо отметить, что сообщество разработчиков и пользователей ConTEXt кажется очень активным и открытым. Да, ConTEXt поддерживает все вышеперечисленные варианты TEX.

Надеюсь, эта заметка поможет лучше ориентироваться в мире TEX-а. Если что-то упустил или в чём-то ошибся, просьба сообщить об этом в комментариях. На случай, если вы читаете эту заметку где-то в ином месте, комментарии можно оставить в блоге «советы.блогспот.ком». Там же доступна последняя версия этой статьи.