Unicode 字符在列表中的顺序改变(XeTeX)

Unicode 字符在列表中的顺序改变(XeTeX)

我尝试输入包含 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 正确地写入文件(参见了解详情)。

相关内容