xelatex no muestra caracteres rusos en lslisting

xelatex no muestra caracteres rusos en lslisting

Estoy intentando componer el código fuente de un programa Perl que contiene caracteres rusos. Hasta donde aprendí, pdflatex no puede procesar caracteres que no sean ASCII en lslisting. Entonces tomé xelatex y usé el siguiente código:

\documentclass{article}
\usepackage[a4paper]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{listings}
\lstset{
  breaklines=true,
  extendedchars=true,
  inputencoding=utf8
}

\begin{document}
\begin{lstlisting}
my $excel = Spreadsheet::XLSX->new('Шаблон сделки.xlsx');
\end{lstlisting}
\end{document}

Generó un pdf, pero con espacios en blanco en lugar de caracteres rusos:

ingrese la descripción de la imagen aquí

y genera un error:

Package babel Warning: No Cyrillic font encoding has been loaded so far.
(babel)                A font encoding should be declared before babel.
(babel)                Default `EU1' encoding will be loaded  on input line
...
LaTeX Font Warning: Font shape `EU1/cmr/m/n' undefined
(Font)              using `EU1/lmr/m/n' instead on input line 12.

Respuesta1

Para xelatex puedes configurar los caracteres que faltan. ^^^^0428es para U+0428, etc. Pero debes usar una fuente que tenga glifos cirílicos.

\documentclass{article}
\usepackage{fontspec}
\setmonofont{Arial Unicode MS} % a font with cyrillic
\usepackage{listings}
\lstset{basicstyle=\ttfamily}
\makeatletter
\lst@InputCatcodes
\def\lst@DefEC{%
 \lst@CCECUse \lst@ProcessLetter
  ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
  ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
  ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
  ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
  ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
  ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
  ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
  ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
  ^^^^0428^^^^0429^^^^042a^^^^042b^^^^042c^^^^042d^^^^042e^^^^042f% new xetex
  ^^^^0430^^^^0431^^^^0432^^^^0433^^^^0434^^^^0435^^^^0436^^^^0437^^^^0438^^^^0439%
  ^^^^043a^^^^043b^^^^043c^^^^043d^^^^043e^^^^043e% new xetex
  ^^^^0440^^^^0441^^^^0442^^^^0444^^^^0444^^^^0445^^^^0446^^^^0447^^^^0448^^^^0449%
  ^^^^044a^^^^044b^^^^044c^^^^044d^^^^044e^^^^044e% new xetex
  %perhaps more
  ^^00}
\lst@RestoreCatcodes
\makeatother
\begin{document}
\begin{lstlisting}
my $excel = Spreadsheet::XLSX->new('Шаблон сделки.xlsx');
\end{lstlisting}

\end{document}

ingrese la descripción de la imagen aquí

Con pdflatex puedes usar literate para configurar todos los caracteres. Puede encontrar la correlación necesaria entre la posición Unicode y el nombre del comando en t2aenc.dfu.

\documentclass{article}
\usepackage[a4paper]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{listings}
\lstset{
  breaklines=true,
  extendedchars=true,
  literate={Ш}{\CYRSH}1
           {а}{\cyra}1
 }

\begin{document}
\begin{lstlisting}
my $excel = Spreadsheet::XLSX->new('Ша.xlsx');
\end{lstlisting}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada