Кириллица в листингах LaTeX

19.05.2011 10:17:20

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

Например, есть шикарный пакет listings, который прекрасно оформляет вставки кода, примеры выполнения команд и тому подобное. Всё в этом пакете хорошо, кроме одного, он даже в 2011 году ни разу не умеет работать с UTF8. Как такое может быть, для меня загадка, но вот такой факт жизни. То есть, проблема известная, с ней народ веселится ещё с 2006—2007 годов. Даже баг в Debian на эту тему есть.

Там же есть и ссылка на StackOverflow, где хитрые европейцы придумали как прикрутить костыль, чтобы получить в листингах умляуты. Всё бы неплохо, но нам в листингах нужны не умляуты, а кириллица.

В принципе, из костыля для умляутов вполне ясно направление возможного решения проблемы. Однако ж, насколько мне известно, каких-то нормальных сокращений для кириллицы нет (так чтобы написал «\Zh» и получил «Ж»), то есть, есть cyracc, но заставить его работать в LaTeX у меня не получилось. Зато обнаружился другой, ещё более злостный подход — прямая выборка символов из шрифта. После получасовой медитации у меня получился следующий рецепт:

\lstset{
  literate={а}{{\selectfont\char224}}1
           {б}{{\selectfont\char225}}1
           {в}{{\selectfont\char226}}1
           {г}{{\selectfont\char227}}1
           {д}{{\selectfont\char228}}1
           {е}{{\selectfont\char229}}1
           {ё}{{\"e}}1
           {ж}{{\selectfont\char230}}1
           {з}{{\selectfont\char231}}1
           {и}{{\selectfont\char232}}1
           {й}{{\selectfont\char233}}1
           {к}{{\selectfont\char234}}1
           {л}{{\selectfont\char235}}1
           {м}{{\selectfont\char236}}1
           {н}{{\selectfont\char237}}1
           {о}{{\selectfont\char238}}1
           {п}{{\selectfont\char239}}1
           {р}{{\selectfont\char240}}1
           {с}{{\selectfont\char241}}1
           {т}{{\selectfont\char242}}1
           {у}{{\selectfont\char243}}1
           {ф}{{\selectfont\char244}}1
           {х}{{\selectfont\char245}}1
           {ц}{{\selectfont\char246}}1
           {ч}{{\selectfont\char247}}1
           {ш}{{\selectfont\char248}}1
           {щ}{{\selectfont\char249}}1
           {ъ}{{\selectfont\char250}}1
           {ы}{{\selectfont\char251}}1
           {ь}{{\selectfont\char252}}1
           {э}{{\selectfont\char253}}1
           {ю}{{\selectfont\char254}}1
           {я}{{\selectfont\char255}}1
           {А}{{\selectfont\char192}}1
           {Б}{{\selectfont\char193}}1
           {В}{{\selectfont\char194}}1
           {Г}{{\selectfont\char195}}1
           {Д}{{\selectfont\char196}}1
           {Е}{{\selectfont\char197}}1
           {Ё}{{\"E}}1
           {Ж}{{\selectfont\char198}}1
           {З}{{\selectfont\char199}}1
           {И}{{\selectfont\char200}}1
           {Й}{{\selectfont\char201}}1
           {К}{{\selectfont\char202}}1
           {Л}{{\selectfont\char203}}1
           {М}{{\selectfont\char204}}1
           {Н}{{\selectfont\char205}}1
           {О}{{\selectfont\char206}}1
           {П}{{\selectfont\char207}}1
           {Р}{{\selectfont\char208}}1
           {С}{{\selectfont\char209}}1
           {Т}{{\selectfont\char210}}1
           {У}{{\selectfont\char211}}1
           {Ф}{{\selectfont\char212}}1
           {Х}{{\selectfont\char213}}1
           {Ц}{{\selectfont\char214}}1
           {Ч}{{\selectfont\char215}}1
           {Ш}{{\selectfont\char216}}1
           {Щ}{{\selectfont\char217}}1
           {Ъ}{{\selectfont\char218}}1
           {Ы}{{\selectfont\char219}}1
           {Ь}{{\selectfont\char220}}1
           {Э}{{\selectfont\char221}}1
           {Ю}{{\selectfont\char222}}1
           {Я}{{\selectfont\char223}}1
}

Это — злостный мега-костыль. Но он работает и реально позволяет иметь кириллицу в листингах. Единственный важный момент, используемое окружение:

\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\usepackage[T2A]{fontenc}

С другими вариациями наверняка работать не будет.

Один комментарий к заметке “Кириллица в листингах LaTeX”

  1. google.com/accounts/o8…:

    Как насчет дополнения для братской кирилицы?
    Для UA набросал так:
    {і}{{\selectfont\char105}}1
    {ї}{{\selectfont\char168}}1
    {є}{{\selectfont\char185}}1
    {ґ}{{\selectfont\char160}}1
    {І}{{\selectfont\char73}}1
    {Ї}{{\selectfont\char136}}1
    {Є}{{\selectfont\char153}}1
    {Ґ}{{\selectfont\char128}}1

    но «і» фактически латинское и смотрится криво (пробел после немного больше)

Закомментировать

Вам бы, по-хорошему, зарегистрироваться сначала надобно, прежде чем комментарии оставлять. Но, в порядке исключения, можете попробовать с OpenID проскочить, вдруг.