Lstinputlisting、范围和 Unicode 字符

Lstinputlisting、范围和 Unicode 字符

我在一些代码示例中使用了unicode字符。

如果我完全设置列表,当字体支持字符时,一切都会按预期工作。但是一旦我想用 lsitings 的选项省略行linerange,事情就会变得混乱。当我用 lualatex 运行这个最小示例时:

\documentclass{standalone}

% allow unicode characters in listings
\RequirePackage{fontspec} 
\setmonofont[Scale=MatchLowercase]{DejaVu Sans Mono} 

\usepackage{listings}

\lstset{language=[Objective]Caml,
  showspaces=false,
  showtabs=false,
  breaklines=true,
  showstringspaces=false,
  breakatwhitespace=true,
  escapeinside={(*@}{@*)},
  basicstyle=\ttfamily,
  columns=fullflexible,keepspaces=true
  inputencoding=utf8
}

\begin{document}
  \begin{lstlisting}[linerange=2-2]
(* This line should be ignored λx.x *)
let f x = x
  \end{lstlisting}
\end{document}

lambda unicode 字符不会被跳过而是被添加到前面,同时该行的其余部分会被跳过:

问题

这是列表中的错误还是我错过了一些神秘的选项?

答案1

如果要使用 xelatex + luatex 和 256 位置以上的 unicode 字符,则必须将它们添加到进程字母列表中。请参阅'listings' 包和 UTF-8. 对于 lambda 你应该添加^^^^03bb

\documentclass{standalone}
%\usepackage{luatex85} %needed with newer luatex
% allow unicode characters in listings
\RequirePackage{fontspec}
\setmonofont[Scale=MatchLowercase]{DejaVu Sans Mono}

\usepackage{listings}

\lstset{language=[Objective]Caml,
  showspaces=false,
  showtabs=false,
  breaklines=true,
  showstringspaces=false,
  breakatwhitespace=true,
  escapeinside={(*@}{@*)},
  basicstyle=\ttfamily,
  columns=fullflexible,keepspaces=true
  %inputencoding=utf8
}

\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%
  ^^^^20ac^^^^0153^^^^0152^^^^03bb%<----
  ^^00}
\lst@RestoreCatcodes
\makeatother
\begin{document}
  \begin{lstlisting}[linerange=2-2]
(* This line should be ignored λx.x *)
let f x = x
  \end{lstlisting}
\end{document}

在此处输入图片描述

相关内容