20081201

XeLaTeX и шрифты OpenType в LaTeX

Использовать нестандартные гарнитуры в традиционном LaTeX не так-то просто. Практически, необходимо иметь отдельный пакет LaTeX для каждой новой гарнитуры. Для ряда распространённых гарнитур такие пакеты есть. А если хочется нестандартную гарнитуру, для которой нет стандартного пакета?

Легко использовать любые современные шрифты TrueType и OpenType позволяет XeLaTeX.

Вначале нужно установить XeLaTeX. В Debian/Ubuntu для этого достаточно поставить пакет texlive-xetex.

Помимо этого, нужно определиться собственно с используемыми шрифтами. XeLaTeX может использовать любые шрифты, которые может использовать Fontconfig. Просмотреть список установленных в системе шрифтов и их имена можно с помощью команды fc-list:
$ fc-list | grep Inconsolata
Inconsolata:style=Medium
Ещё можно поставить программу FontMatrix для просмотра и сравнения шрифтов. Установку дополнительных шрифтов я здесь описывать подробно не буду, скажу лишь, что в большинстве случаев для этого достаточно поместить файлы шрифта в ~/.fonts/.

Далее создаём документ LaTeX, как обычно. В преамбулу добавляем:
\usepackage[cm-default]{fontspec}
\usepackage{xunicode}
\usepackage{xltxtra}
Главный пакет тут — fontspec. Опция cm-default необходима, чтобы он не пытался использовать шрифты lmodern (которые в Debian/Ubuntu надо ставить отдельно, а русских глифов в них всё равно нет).

Как я понял, xunicode изменяет традиционнее латэховские макросы вроде \" таким образом, что немецкую «о умляют» (ö) в XeLaTeX можно ввести не только напрямую с клавиатуры как ö, но и как обычно, \"o. Вообще, все уникодные символы можно вводить непосредственно с клавиатуры (например, с помощью клавиши Compose). Это удобно. Пакет xltxtra добавляет чудесный макрос \XeLaTeX.

Затем можно задать стандартные шрифты документа:
\setromanfont{Charis SIL}
\setsansfont{Liberation Sans}
\setmonofont{Inconsolata}
В общем-то, названия этих команд говорит сами за себя. Они меняют шрифт всего документа в целом. Есть ещё команда \setmainfont{Имя шрифта}.
Дополнение 20081226: поскольку рост строчных букв у разных гарнитур одного кегля разнится, то при совместном использовании в пределах одного абзацах их необходимо соответствующим образом масштабировать. Для того, чтобы обеспечить одинаковый росит строчных букв, можно задать глобальную опцию:
\defaultfontfeatures{Scale=MatchLowercase}
Можно, конечно, задавать опцию Scale для каждой гарнитуры отдельно. Аналогичная опция Scale=MatchUppercase позволяет обеспечить единый рост заглавных букв разных гарнитур.
Временное переключение гарнитуры делается командой \fontspec{Имя шрифта} в теле документа.

Компилировать нужно с помощью xelatex вместо latex. А так — как обычно. Получается PDF. Всё на удивление просто. Примеры по ссылкам. Инструкции в примерах немного более подробные, чем в этой заметке.

пример использования (исходник, UTF-8)
пример использования (PDF)

Да, очень рекомендую посмотреть на что способен XeLaTeX, если ему дать хороший шрифт. Вот только где бы ещё лицензионных (свободно распространяемых) русских шрифтов найти…

Дополнение: XeLaTeX не совместим с пакетом babel. Можно или пользоваться дополнительным пакетом xecyr, переопределяющий кириллический символы LaTeX в соответствии с уникодом, или пользоваться пакетом polyglossia, заменяющим babel. Спасибо Shender-у за подсказанные решения.

Дополнение 20081226: выкладываю также примеры использования BibTeX совместно с XeLaTeX для написания русскоязычных текстов. Рассмотрены оба способа: и с babel+xecyr, и с polyglossia.