Кириллица в листингах 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}
С другими вариациями наверняка работать не будет.
29.03.2012 16:14:41
Как насчет дополнения для братской кирилицы?
Для 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
но «і» фактически латинское и смотрится криво (пробел после немного больше)