Проблема с кодировкой вставленного .m-файла

Проблема с кодировкой вставленного .m-файла

Извините за некрасивый пост, это мой первый пост и у меня очень мало времени. У меня есть этот крошечный документ на обороте:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[polish]{babel}
\usepackage{polski}
\usepackage{listings}
\begin{document}
\lstinputlisting{Test.m}

где "Test.m" - это Matlab-файл, сохраненный в кодировке ANSI. В этом файле:

% Żółć  
% Ściąć  
% Źrebię 

И вот что я получаю на обороте:

% ????  
% ?ci??   
% ?rebi?  

Изменение кодировки файла Test.m на UTF-8 ничего не меняет. Изменение кодировки документа на cp1250 все ухудшает. Помогите, пожалуйста.

ПРАВКА: \usepackage{fontspec} добился некоторого прогресса: теперь у меня есть все нужные буквы в каждой строке, но проблемные идут первыми, а не остальными, например: «Źęrebi» вместо «Źrebię».

решение1

Вы можете использовать listingsutf8:

% Just for convenience of a self-contained example
\begin{filecontents*}{\jobname.m}
% àé
% Żółć
% Ściąć
% Źrebię
\end{filecontents*}

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[polish]{babel}
\usepackage{polski}
\usepackage{listingsutf8}

\begin{document}

\lstinputlisting[inputencoding=utf8/latin2,language=Matlab]{\jobname.m}

\end{document}

введите описание изображения здесь

решение2

(Overleaf преобразует все загруженные текстовые файлы в UTF-8.)

XeLaTeX здесь представляется наиболее надежным вариантом.

\documentclass{article}
\usepackage[polish]{babel}
\usepackage{polski}
\usepackage{listings}
\usepackage{fontspec}  %% <-- loads Latin Modern

\lstset{extendedchars}
\begingroup
  \catcode0=12 %
  \makeatletter
  \g@addto@macro\lst@DefEC{%
    \lst@CCECUse\lst@ProcessLetter
    łżąęć % *** add Unicode characters ***
    ^^00% end marker
  }%
\endgroup

\begin{document}
\lstinputlisting{Test.m}
\end{document}

fontspecзагрузит семейство шрифтов Latin Modern; в нем есть глифы для акцентированных символов. Или вы можете использовать \setmainfont, \setsansfontи \setmonofontдля загрузки других подходящих шрифтов.

Вы можете переключить движок на XeLaTeX на Overleaf, нажав на значок «Настройки» (значок шестеренки в правом верхнем углу), а затем выберите «XeLaTeX» из раскрывающегося списка «Движок LaTeX».

EDIT: Некоторые акцентированные символы "переставлены" местами в выводе листингов; но они будут отображаться правильно в обычном тексте (т.е. вне листингов). Это объясняется здесь:Проблема со специальными символами в листингах Поэтому вам придется добавить в extendedcharsсписок несколько символов Unicode (код добавлен выше).


Альтернатива: использованиеminted

Как вы можете себе представить, вышеприведенный подход может стать довольно громоздким. Вместо использования listings(или listingsutf8), вы можете рассмотреть возможность использования mintedпакета с xelatex:

\documentclass{article}
\usepackage[polish]{babel}
\usepackage{polski}
\usepackage{minted}
\usepackage{fontspec}

\begin{document}

\inputminted{matlab}{Test.m}

\end{document} 

Просто имейте в виду, что если вы компилируете это на своей машине, вам нужно будет запустить pdflatex --shell-latex(или, если вы используете MikTeX, --enable-write18) и установить Python для mintedработы.

Связанный контент