抱歉,这篇文章写得不好,这是我的第一篇帖子,我时间不多。我在背面有一份小文件:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[polish]{babel}
\usepackage{polski}
\usepackage{listings}
\begin{document}
\lstinputlisting{Test.m}
其中“Test.m”是以 ANSI 编码保存的 Matlab 文件。此文件的内容如下:
% Żółć
% Ściąć
% Źrebię
我从 overleaf 上得到的信息如下:
% ????
% ?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
加载其他合适的字体。
您可以通过单击设置图标(右上角的齿轮图标)在 Overleaf 上将引擎切换为 XeLaTeX,然后从“LaTeX 引擎”下拉列表中选择“XeLaTeX”。
编辑:一些重音字符在列表输出中被“交换”了;但它们将在普通文本中正确呈现(即在列表之外)。解释如下:列表中的特殊字符问题
因此您必须向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
工作。