xelatex が lslisting でロシア語の文字を表示しない

xelatex が lslisting でロシア語の文字を表示しない

ロシア語の文字を含む Perl プログラムのソース コードをタイプセットしようとしています。私が知る限り、pdflatex は lslisting で非 ASCII 文字を処理できません。そこで、xelatex を使用して次のコードを使用しました。

\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}

PDF が生成されましたが、ロシア語の文字の代わりに空白が入っています。

ここに画像の説明を入力してください

エラーを出力します:

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.

答え1

xelatex の場合、不足している文字を設定できます。U ^^^^0428+0428 などです。ただし、キリル文字のグリフを含むフォントを使用する必要があります。

\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}

ここに画像の説明を入力してください

pdflatex では、literate を使用してすべての文字を設定できます。Unicode の位置とコマンド名の間の必要な相関関係は、 で確認できます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}

ここに画像の説明を入力してください

関連情報