我尝试输入包含 Unicode 字符的代码列表,除了某些 Unicode 字符显示顺序错误外,其他一切似乎都正常(或多或少)。例如,
作弊
我明白了
łżąsuca do łobsugi
我该如何修复它?
编辑:有人要求我提供一些代码,但不幸的是,我怀疑它是否有用。基本上代码如下:
\documentclass[11pt,polish]{article}
\usepackage{fontspec}
\usepackage{listings}
\usepackage{xunicode}
\usepackage{xltxtra}
\usepackage{babel}
\setmainfont{Charis SIL} % Some font with good unicode support
\begin{document}
\begin{lstlisting}
służący
\end{lstlisting}
\end{document}
将输出:
łżą
苏西
(是的,有一个换行符,我不知道它是从哪里来的,当我以文件形式输入代码时,字符顺序混乱,但没有换行符)。
答案1
软件包listings
无法识别字符代码大于 8 位的字符。软件包内部将每个字符重新定义为活动字符。以下示例通过将其他 Unicode 字符添加到扩展字符列表中来支持这些字符。
以这种方式支持所有 Unicode 字符很困难:
- 内存使用率高。
- 运行时行为不良。
- 有不同类别的字符(
\lst@ProcessLetter
,\lst@ProcessOther,...)
示例文件:
\documentclass[11pt,polish]{article}
\usepackage{fontspec}
\usepackage{listings}
\lstset{extendedchars}
\begingroup
\catcode0=12 %
\makeatletter
\g@addto@macro\lst@DefEC{%
\lst@CCECUse\lst@ProcessLetter
łżą% *** add Unicode characters ***
^^00% end marker
}%
\endgroup
\begin{document}
\begin{lstlisting}
służący
\end{lstlisting}
\end{document}
答案2
如果列表不是必需的,这是另一种解决方案。我的PythonTeX该包通过 Python 高亮库为大多数语言提供语法高亮皮格门特斯。该软件包在 pdflatex、lualatex 和 xelatex 下提供完整的 Unicode 支持。它适用于 Windows、Linux 和 OS X。
PythonTeX 提供了pygments
用于排版代码块的环境、\pygment
用于内联使用的命令以及\inputpygments
用于引入外部文件的命令。所有这些都带有可选fancyvrb
命令,因此您可以轻松获得行号等功能。
以下是对您的最小示例的轻微修改:
\documentclass[11pt,polish]{article}
\usepackage{fontspec}
\usepackage{pythontex}
\usepackage{xunicode}
\usepackage{xltxtra}
\usepackage{babel}
\setmainfont{Charis SIL} % Some font with good unicode support
\begin{document}
% Just change `text' to the correct language for your code
\begin{pygments}{text}
służący
służąca do obsługi
łżąsuca do łobsugi
\end{pygments}
\end{document}
如果你的源代码使用了制表符,那么你应该使用带有-8bit
选项的 xelatex,这样制表符才能被 xelatex 正确地写入文件(参见这了解详情)。