
Извините за некрасивый пост, это мой первый пост и у меня очень мало времени. У меня есть этот крошечный документ на обороте:
\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
работы.