Русский язык в листингах кода (minted/listings) без ошибок компиляции

Почему возникает ошибка кириллицы в listings LaTeX

Каждый студент или разработчик при подготовке дипломного проекта сталкивается с неприятным сбоем: при попытке скомпилировать исходный код с русскими комментариями или строковыми литералами компилятор выдает сообщение вида ! Package inputenc Error: Unicode character... или превращает слова в нечитаемые кракозябры. Это классическая ошибка кириллицы в listings latex.

Причина кроется в архитектуре классического движка pdfLaTeX: пакет listings обрабатывает текст побайтово как 8-битный поток ASCII, тогда как русские символы в кодировке UTF-8 состоят из двух байтов. В результате парсер кода разрывает двухбайтовую последовательность, что приводит к фатальной ошибке компиляции. Если в вашей работе код описывает сложные структуры, рекомендуем также ознакомиться с версткой псевдокода алгоритмов в algorithm2e.

Русский язык в листингах кода LaTeX: правильная настройка listings

Чтобы корректно включить русский язык в листингах кода latex при использовании стандартного пакета listings, необходимо задать правильные параметры в преамбуле документа:

LaTeX Преамбула
\usepackage{listings}
\usepackage{xcolor}

\lstset{
    inputencoding=utf8,
    extendedchars=true,
    basicstyle=\ttfamily\small,
    breaklines=true,
    numbers=left,
    numberstyle=\tiny\color{gray},
    frame=single,
    captionpos=b,
    keepspaces=true,
    showstringspaces=false
}

Если вы хотите экранировать русские фрагменты или формулы прямо внутри кода, добавьте директиву escapeinside:

LaTeX Исходник
\lstset{escapeinside={(*@}{@*)}}

\begin{lstlisting}[language=Python]
def calculate_sum(a, b):
    # (*@\textbf{Вычисление суммы двух чисел}@*)
    return a + b
\end{lstlisting}

Символьная таблица literate для полного охвата русского алфавита

Наиболее надежный способ заставить listings в pdfLaTeX понимать русский текст без экранирования — передать маппинг кириллических букв через свойство literate:

LaTeX Конфигурация
\lstset{
    literate=
        {а}{{\cyra}}1 {б}{{\cyrb}}1 {в}{{\cyrv}}1 {г}{{\cyrg}}1
        {д}{{\cyrd}}1 {е}{{\cyre}}1 {ж}{{\cyrzh}}1 {з}{{\cyrz}}1
        {и}{{\cyri}}1 {й}{{\cyrishrt}}1 {к}{{\cyrk}}1 {л}{{\cyrl}}1
        {м}{{\cyrm}}1 {н}{{\cyrn}}1 {о}{{\cyro}}1 {п}{{\cyrp}}1
        {р}{{\cyrr}}1 {с}{{\cyrs}}1 {т}{{\cyrt}}1 {у}{{\cyru}}1
        {ф}{{\cyrf}}1 {х}{{\cyrh}}1 {ц}{{\cyrc}}1 {ч}{{\cyrch}}1
        {ш}{{\cyrsh}}1 {щ}{{\cyrshch}}1 {ъ}{{\cyrhrdsn}}1 {ы}{{\cyrery}}1
        {ь}{{\cyrsftsn}}1 {э}{{\cyrerev}}1 {ю}{{\cyryu}}1 {я}{{\cyrya}}1
        {А}{{\CYRA}}1 {Б}{{\CYRB}}1 {В}{{\CYRV}}1 {Г}{{\CYRG}}1
        {Д}{{\CYRD}}1 {Е}{{\CYRE}}1 {Ж}{{\CYRZH}}1 {З}{{\CYRZ}}1
        {И}{{\CYRI}}1 {Й}{{\CYRISHRT}}1 {К}{{\CYRK}}1 {Л}{{\CYRL}}1
        {М}{{\CYRM}}1 {Н}{{\CYRN}}1 {О}{{\CYRO}}1 {П}{{\CYRP}}1
        {Р}{{\CYRR}}1 {С}{{\CYRS}}1 {Т}{{\CYRT}}1 {У}{{\CYRU}}1
        {Ф}{{\CYRF}}1 {Х}{{\CYRH}}1 {Ц}{{\CYRC}}1 {Ч}{{\CYRCH}}1
        {Ш}{{\CYRSH}}1 {Щ}{{\CYRSHCH}}1 {Ъ}{{\CYRHRDSN}}1 {Ы}{{\CYRERY}}1
        {Ь}{{\CYRSFTSN}}1 {Э}{{\CYREREV}}1 {Ю}{{\CYRYU}}1 {Я}{{\CYRYA}}1
}

После включения этой таблицы вы сможете свободно писать русские комментарии в любых языках программирования без малейших ошибок.

Подключение современного пакета minted с поддержкой UTF-8

Более современная альтернатива listings — пакет minted. Он использует мощный лексер Pygments, нативно поддерживает Unicode и оформляет код так же красиво, как современные IDE:

LaTeX Minted
\usepackage{minted}
\usemintedstyle{friendly}

\begin{minted}[
    frame=lines,
    framesep=2mm,
    linenos,
    fontsize=\small
]{python}
# Функция расчета факториала на русском языке
def factorial(n: int) -> int:
    if n <= 1:
        return 1
    return n * factorial(n - 1)

print("Результат вычисления:", factorial(5))
\end{minted}

Обратите внимание: для локального запуска minted требуется установленный Python с библиотекой Pygments и флаг компиляции -shell-escape. В облачном редакторе Labkeeper всё настроено «из коробки» без необходимости конфигурировать окружение.

Решение проблемы через современные движки XeLaTeX и LuaLaTeX

Если у вас есть возможность переключить компилятор с pdfLaTeX на XeLaTeX или LuaLaTeX, проблема с кодировками исчезает полностью. Благодаря пакету fontspec движок нативно работает с кодировкой UTF-8 и системными шрифтами OpenType/TrueType:

XeLaTeX Преамбула
\usepackage{fontspec}
\setmainfont{Times New Roman}
\setmonofont{Courier New} % или Fira Code
\usepackage{listings}

\lstset{
    basicstyle=\ttfamily\small,
    breaklines=true
}

Для интерактивного перехода к нужным листингам из текста работы не забудьте ознакомиться с настройкой кликабельных ссылок hyperref.

Частые вопросы и рекомендации по ГОСТ

Согласно ГОСТ 7.0.100 и рекомендациям к ВКР, листинги кода в дипломе должны соответствовать следующим правилам:

  • Шрифт моноширинный: используйте Courier New или PT Mono кеглем 10–12 pt;
  • Подпись к листингу: размещается снизу или сверху с единообразным выравниванием («Листинг 3.1 — Метод авторизации пользователя»);
  • Перенос строк: обязательно включите breaklines=true, чтобы длинные строки кода не вылезали за границы правого поля.

Практические советы

1

Компактные листинги в приложении

Длинные портянки кода объемом более 1 страницы по ГОСТу выносят в «Приложения», оставляя в основном тексте только фрагменты ключевых алгоритмов на 15–30 строк.

2

Готовые стили в Labkeeper

В шаблонах Labkeeper уже встроены настроенные стили для листингов с автоматической нумерацией строк и поддержкой кириллицы в комментариях.

Попробуйте прямо сейчас

Компилируйте чистые листинги в Labkeeper

Онлайн-редактор с мгновенной подсветкой кода по ГОСТу, поддержкой кириллицы и экспортом в идеальный PDF.

LaTeX editor screenshot
  • Полновесная компиляция: Получайте PDF профессионального качества с помощью встроенного LaTeX-компилятора.
  • 60 секунд на выполнение: Работайте со сложными документами без ограничений — лимит времени компиляции в разы выше, чем в аналогичных сервисах.
  • Умная конвертация: Любые вычислительные формулы автоматически преобразовываются в красивый LaTeX
  • Гибридный синтаксис: Используйте легковесные вставки Markdown прямо в сложном LaTeX-коде для ускорения работы.
bg

Другие статьи