Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

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

19 коммент.:

virens комментирует...

Спасибо за интересную заметку, а то я всё думал - чего людям ЛаТеХа не хватает :-) Но есть вопрос:

>> На мой взгляд, использование макропакета LaTEX
>>совместно с pdfTEX-ом — наиболее
>> предпочтительный вариант для набора научно-
>>технических статей и документации.
А как тогда эту документацию экспортировать в Word\OpenOffice? Вариант с latex2rtf в таком случае не проходит.

Sergey Kishchenko комментирует...

Я уже множество раз слышал про XeTeX и о том, что он добавляет поддержку Unicode. Но что имеется под этим в виду? Я поставил себе Texlive 2007, набираю русские тексты в UTF-8, получаю на выходе обычные DVI и PDF файлы, но при этом ни разу "осознанно" не использовал XeTeX. Получается, XeTeX уже входит в состав Texlive? Или это пресловутый LuaTeX так незаметно выполняет свою работу?

Vladimir комментирует...

Спасибо, давно искал подобный обзор :)
Если не секрет, можно поподробнее как Вы к ConTEXt кириллицу прикрутили

atom_child комментирует...

В ТеХе "ни в зуб ногой", а теперь хоть понятно стало, что да как. ОГРОМЕННОЕ СПС.

m.edoshin комментирует...

To Sergey Kishchenko: Вы не обязательно пользовались XeTeX, только если запускали XeLaTeX или ConTeXt через XeTeX. В принципе, разница там в том, что XeTeX как бы уже содержит системные шрифты, как если бы они были встроены в TeX (ну и подключает шрифты с диска тоже куда проще, чем обычный  TeX, просто по имени файла). Если вы набирали стандартными Computer Modern шрифтами или коллекцией Gyre, они и без XeTeX работают.

В LaTeX признаком использования XeTeX служат пакеты fontspec, xunicode и xltextra. Если у вас пример из wiki работает, http://en.wikipedia.org/wiki/XeTeX (он для Windows, как я понимаю, в смысле, испольует одинн из Win-шрифтов: Lucida Sans Unicode), то  XeTeX тоже работает.

m.edoshin комментирует...

XeTeX входит в TeX Live и даже в маленький BasicTeX пакет, хотя там проблемы с русскими переносами (на Маке, во всяком случае) — сначала они работают, но после установки пакетов и (видимо) перегенерации форматов, перестают. Приходится лазить соображать, где их обратно включить и не скажу, что я понял, как они все-таки заработали по-новой; создалось впечатление, что просто надо много-много раз форматы перегенерировать :)

Sergey Kishchenko комментирует...

@m.edoshin:
Я шрифт вообще не устанавливал, так что не могу сказать, что у меня за шрифт :) Мне нравится и большего я не требую :)
fontspec, xunicode и xltextra также не использую.
Просто все авторы, которые пишут о TeX, говорят, что только XeTeX поддерживает Unicode, что может отпугнуть некоторых пользователей. В этом нужно разобраться - по моим ощущениям с юникодом в мире TeX вообще никаких проблем нет.

jetxee комментирует...

virens-у:

Конвертацией из ЛаТэХ в RTF/Word я не занимался. Так что тут у тебя опыта больше. Думаю, хорошего результата всё равно нельзя получить: насколько я знаю, ни Word, ни OpenOffice толком не умеют работать с кернингом, имеют существенно другой алгоритм выключки строк. Так что даже при использовании одного и того же шрифта, строки (а соответственно и страницы) будут ехать. Для качественной печати и просмотра — всё равно лучше PDF. Для правки можно давать текстовый файл в кодировке CP1251. А в формате Word всё равно будет страшненько.

Как писал Дональд Кнут, «…TeX is primarily concerned with high-quality technical manuscripts: Its emphasis is on art and technology, as in the underlying Greek word. If you merely want to produce a passably good document—something acceptable and basically readable but not really beautifyl—a simpler system will usually suffice.»

Вариант же с latex2rtf, мне кажется, должен всё равно пройти. Есть маленькая хитрость, как сделать исходники совместимыми и с pdflatex, и с latex. Достаточно в \includegraphics{imagefile} не писать расширения файла. Тогда latex будет искать imagefile.eps, а pdflatex — imagefile.pdf. В этом случае достаточно в преамбуле изменить \usepackage[pdftex]{graphicx} на \usepackage[dvips]{graphicx} и документ будет компилироваться обычным latex. А картинки легко конвертируются c epstopdf. Всё остальное обычно без изменений. Разница лишь в команде:

latex myfile.tex

или

pdflatex myfile.tex

и в получаемом на выходе файле (myfile.dvi или myfile.pdf). Я просто даю всем файлы PDF, и ни у кого пока не было проблем с их чтением и печатью.

m.edoshin комментирует...

@Sergey Kishchenko
Это да, в смысле, можно и без XeTeX в Юникоде набирать, просто с XeTeX это, как я понимаю, естественный путь. А так основное в нем — это легкий прозрачный доступ к шрифтам в распространенных форматах и доступ к специальным свойствам, вроде лигатур (хотя для русских текстов это мало актуально, у нас и лигатур-то нет, хотя рукописные шрифты могли бы их иметь, а русская вязь без них и невозможна :) ).

Кстати, в ConTeXt минимальный русский пример может выглядеть еще проще:

\definefontsynonym[MyFont][name:System Font]
\definefontsynonym[MyOtherFont][file:PRG56__C]
{\definedfont[MyFont at 20 pt] Я системный шрифт.}
{\definedfont[MyOtherFont at 20 pt] А я шрифт с диска.}

Хотя это, скорее, низкоуровневый шрифтовой пример :) Если файл в Unicode и со шрифтами все в порядке, должен выводить русский текст двумя разными шрифтами. Причем даже Type 1-файл в формате для PC на Маке нормально подгружает (а TrueType для PC нет — отказывается выводить русские буквы). Переносов не будет, конечно, для них нужно \language[ru] (или \mainlanguage[ru]), и, возможно, перегенерить форматы. (Править type-one.tex, видимо, пришлось как раз чтобы поддерживать t2a-кодировку. Хотя надо посмотреть унутрь.)

jetxee комментирует...

Сергею Кишченко:

В TeXLive входит очень много всего. В том числе и обычный e-TeX, и pdfTeX, и XeTeX. У меня сейчас стоят (это имена линуксовых пакетов, части TeXLive): texlive, texlive-base, texlive-base-bin, texlive-bibtex-extra, texlive-common, texlive-doc-base, texlive-extra-utils, texlive-font-utils, texlive-fonts-recommended, texlive-generic-extra, texlive-lang-cyrillic, texlive-latex-base, texlive-latex-extra, texlive-latex-extra-doc, texlive-latex-recommended, texlive-metapost, texlive-metapost-doc, texlive-pictures, texlive-pictures-doc, texlive-science, texlive-xetex.

Что вы используете — зависит от того, какую команду запускаете. Посмотрите на первую строчку того, что вам пишется при запуске латэх. У меня, например, это

This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)

Т.е. запускается pdfTeX. Однако система настроена так, что если я запускаю его как latex myfile.tex, то он ведёт себя как обычный latex (и создаёт myfile.dvi). Если я запускаю его как pdflatex myfile.tex, он создаёт myfile.pdf.

Чтобы запустить XeLaTeX я пишу:

$ xelatex myfile.tex

и в первой строке вывода вижу сообщение

This is XeTeXk, Version 3.141592-2.2-0.996-patch2 (Web2C 7.5.6)

LuaTeX ещё нельзя использовать с ЛаТэХ. Только в качестве экспериментального движка с ConTeXt. В этом случае ConTeXt запускается так:

$ texexec --engine=luatex mycontextfile.tex

Теперь о кодировке уникода. Хотя команда

\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}

и позволяет набрать русский текст в UTF-8 и он потом нормально обработается pdfLaTeX-ом, это совсем не значит, что можно набирать любые символы уникода. Практически — только те, которые входят в кириллическую таблицу T2A. Потому что, как я понимаю, внутри всё равно используется однобайтная кодировка и соответствующие шрифты. В случае XeLaTeX можно же делать так:

\documentclass{article}
\usepackage{xltxtra}
\setmainfont{DejaVu Sans}
\begin{document}
Hello, страна родная!

α—β—γ—δ


\end{document}

Т.е. если в шрифте есть соответствующие глифы, то и в исходнике документа можно писать их напрямую. Например, «à» вместо «\`a».

jetxee комментирует...

Владимиру:

Я описал рецепт для ConTeXt здесь; мне кажется, М. Едошин говорит правильно, что исправление файла type-one.tex просто включает шрифты «по-умолчанию» CM с кодировкой T2A, они и используются. Правда дальше этого примера я ещё не экспериментировал.

jetxee комментирует...

Ещё раз Сергею Кищенко:

Я шрифт вообще не устанавливал, так что не могу сказать, что у меня за шрифт :) Мне нравится и большего я не требую :)

Можно посмотреть в свойствах PDF документа, что в него встроено. Скорее всего, Computer Modern. См. также pdffonts myfile.pdf.

fontspec, xunicode и xltextra также не использую.

Значит, xelatex не используется.

Просто все авторы, которые пишут о TeX, говорят, что только XeTeX поддерживает Unicode, что может отпугнуть некоторых пользователей. В этом нужно разобраться - по моим ощущениям с юникодом в мире TeX вообще никаких проблем нет.

Поддержка уникода в pdfTeX есть, но, насколько я знаю, неполная. inputenc позволяет конвертировать текст в UTF-8 во внутренние кодировки TeX (в T2A, в частности), однако о поддержке более сложных возможностей уникода (например, модифицирующих знаков) речь, по-моему, не идёт. Впрочем, набору кириллически-латинских текстов это никак не мешает.

Я не хочу никого отпугивать от TeX, и к переходу на XeTeX не агитирую (pdfTeX-а действительно многим вполне достаточно). Просто рассказываю, что такая возможность есть. Преимущество, которая она даёт — лёгкость использования нестандартных гарнитур.

m.edoshin комментирует...

Да, я же читал же специально краткое введение в XeTeX, но совсем забыл — там есть еще более интересные моменты, но они относятся к языкам вроде арабского, хинди и т. п. Во-первых, насчет Unicode — jetxee правильно пишет, что юникод юникодом, но реально писать документ на нескольких языках просто из юникодного исходника было нельзя или же во всяком случае очень нетривиально пришлось бы помучится. Сейчас же, можно писать на английском, арабском, иврите, японском и т. п. В документе к пакету BasicTeX в конце есть пример: http://www.uoregon.edu/~koch/BasicTeX.pdf.

А второе — XeTeX верстает совсем не как TeX, он верстает не буквами, а целыми словами. Для нас это, возможно, не очень актуально, но для языков типа арабского или хинди это необходимо, потому что у них обычное дело писать букву принципиально по-разному или даже переставлять ее в зависимости от соседних букв. Это также нужно при использовании сложных шрифтов с множественными лигатурами или вариантами написания, как, например, Zapfino. То есть там внешний вид и размер буквы может очень сильно разнится в в зависимости от того, где эта буква в слове и кто рядом с ней. Так вот XeTeX берет слово, запрашивает его конкретную графическую форму у шрифтовой подсистемы, а потом отдает TeX'у уже не набор букв, а все слово как целый сплошной блок, написанный в соответствии с правилами языка или замыслом дизайнера шрифта. А TeX уже занимается непосредственно версткой: выключкой, вертикальным позиционированием и т. п.

Читал тут: http://cern.ch/XML/lgc2/xetexmain.pdf

jetxee комментирует...

Про вёрстку словами — это действительно интересно. Не знал про это. Спасибо.

Джус комментирует...

fontconfig обеспечивает лишь выбор шрифта, интерпретацию и рендеринг OpenType у нас делает библиотека ICU.

Клёвый обзор!

Мечтаю о LuaTeX-овском протружене в XeTeX.

Sergey Kishchenko комментирует...

@m.edoshin
@jetxee

Спасибо за разъяснения!

@jetxee
Моя фамилия всё же читается как "Кищенко". ;)
pdffonts возвращает малопонятный мне набор строк:

name type emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
ULAFHH+SFRM1200 Type 1 yes yes no 171 0
SBMOUJ+SFRM1440 Type 1 yes yes no 172 0
QACVOR+SFXC1440 Type 1 yes yes no 173 0
UXDEIT+SFBX1440 Type 1 yes yes no 200 0
PNYSAT+SFBX1728 Type 1 yes yes no 230 0
GFAWRG+CMSY10 Type 1 yes yes no 287 0
NMRWUZ+SFTT1440 Type 1 yes yes no 288 0
LYEMUF+SFTI1440 Type 1 yes yes no 320 0
WBAVXM+SFRM1095 Type 1 yes yes no 374 0
MIQIMQ+SFBX1095 Type 1 yes yes no 443 0

P.S. Offtopic. Как у вас получается менять slugs у записей в блоге? Поделитесь знаниями :)

jetxee комментирует...

Джусу: Спасибо! Заметку уточнил.

Сергею Кищенко:

Прошу прощения, что первый раз неправильно детранслитерировал. Потом уже увидел в профиле, как правильно, но было поздно.

SFRM1200 — означает, что используется шрифт Type 1 из пакета CM-Super («Super Font»), прямой с засечками («rm») 12-го кегля (1200). То, что это шрифт типа Type 1 подтверждается и второй колонкой. Он встроен в файл (emb=yes), но лишь использованные в документе глифы (uni=yes). Первые символы в имени шрифта — это код использованного подмножества.

Двухбуквенные обозначения для шрифтов из CM-Super даны в его README. А вообще, эти короткие (8-символьные) имена шрифтовых файлов в TeX берут своё происхождение в схеме именования Карла Берри, введёной для обратной совместимости со старыми системами вроде DOS.

PS. По поводу slug-ов в блоге. Blogspot их создаёт в момент первой публикации поста. Поэтому я вначале даю название по-английски, публикую и сразу же меняю заголовок на русский. При этом URL поста уже не меняется, и в нём остаются осмысленные слова.

Sergey Kishchenko комментирует...

@jetxee
Спасибо за пояснения, ссылки и отличный блог! Так держать! :)

gdg комментирует...

Доброго ночера!
Года три назад я решал проблему прикручивания русских букв к ConTeXt-у. Решил наполовину: буквы появились, но как я это сделал - сейчас не понимаю, точно помню, что не редактировал файлы из поставки.
Удалось даже использовать в документе Микрософтовские шрифты из комплекта Corefonts.
Документ и все настройки у меня сохранились, если есть желание разбираться вместе - напиши мне:
d.g.golub[гав]gmail.com. Блога я не завёл :)

Отправить комментарий