lstlistings 环境中放错 Unicode 字符

lstlistings 环境中放错 Unicode 字符

我正在使用 XeLaTex 进行编译。

lstlistings(由列表包中),特殊的unicode字符似乎放错了位置。

这是一个最小的演示。代码:

\documentclass{article}

\usepackage[mathrm=sym]{unicode-math}

\usepackage{listings}

\lstset{
    inputencoding = utf8x
  , extendedchars = \true
  , mathescape = false
  , escapechar = {$}
  , basicstyle = \ttfamily
  , numbers = left
}

\setmonofont[Scale=0.85]{Courier New}

\begin{document}

\begin{lstlisting}
(ζ).
( ζ).
(ζ ).
ζ

(abcζ).
(abc ζ).
( abcζ).
\end{lstlisting}

\end{document}

输出(裁剪):

在此处输入图片描述

特殊的 unicode 字符是 zeta。看起来,zeta 打印在紧接其前的单词的左侧(单词由空格、换行符和一些字符分隔)。

在某些情况下(例如第 4 行和第 5 行),特殊的 Unicode 字符会向后移动到换行符之后。

另一个奇怪的行为(例如第 1 行)是,当特殊 unicode 字符之前没有换行符时,向后移位会干扰行号的位置(第 1 行缩进“1”)。

说实话,我不知道发生了什么。我想保留的是lstlisting无需特殊修饰或用空格填充即可将 unicode 字符输入到环境中的能力。

答案1

你的设置是错误的,你不需要inputencoding,并且extendedchars的值不应该true\true但主要问题是 listings 没有准备好处理超过 256 个字符。您需要将其添加到处理列表中。另请参阅https://tex.stackexchange.com/a/25396/2388

\documentclass{article}

\usepackage[mathrm=sym]{unicode-math}

\usepackage{listings}

\lstset{
  , mathescape = false
  , escapechar = {$}
  , basicstyle = \ttfamily
  , numbers = left
}

\setmonofont[Scale=0.85]{Courier New}

\makeatletter
\lst@InputCatcodes
\def\lst@DefEC{%
 \lst@CCECUse \lst@ProcessLetter
  ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
  ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
  ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
  ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
  ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
  ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
  ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
  ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
  ^^^^03b6% <--- for ζ
  ^^00}
\lst@RestoreCatcodes
\makeatother

\begin{document}

\begin{lstlisting}
(ζ).
( ζ).
(ζ ).
ζ

(abcζ).
(abc ζ).
( abcζ).
\end{lstlisting}

\end{document}

在此处输入图片描述

相关内容