列表包中的 literate 和 breaklines=true 存在问题

列表包中的 literate 和 breaklines=true 存在问题

正如标题所述,该选项breaklines=true在使用时似乎存在不良交互literate;在下面的示例中,右括号没有被着色

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}

\lstset{
  literate=
    {)}{{\textcolor{red}{)}}}{1}
    {(}{{\textcolor{red}{(}}}{1},
  breaklines=true,
}

\begin{document}

\begin{lstlisting}
()
\end{lstlisting}

\end{document}

在此处输入图片描述

注释掉该breaklines=true选项可产生所需的结果。是什么导致了这种奇怪的行为?如何防止这种情况发生?

答案1

breaklines=true给出选项时,执行完后执行的代码\lst@literate(为定义的字符分配特殊含义)是

\lst@ifbreaklines \lst@Def {`)}{\lst@breakProcessOther )}\fi

并扩展为

\lccode `\~=#1\lowercase {\def ~}{\lst@breakProcessOther )}

这使得活动)扩展为

\lst@breakProcessOther )

哪里)不是激活。所有这些都会在\lsthk@SelectCharTable执行时发生。

如果只是为了尝试,我应用了一个补丁etoolbox

\makeatletter
\patchcmd{\lsthk@SelectCharTable}{`)}{`]}{}{}
\makeatother

那么右括号将以红色打印,但是如果出现类似的问题],例如,

literate=
  {[}{{\textcolor{red}{[}}}{1}
  {]}{{\textcolor{red}{]}}}{1},

已指定(右括号将变成黑色右括号,这是我所期望的)。

我认为这与正确处理括号表达式的预防措施有关listings。我怀疑对此无能为力。

如果我尝试修补删除该条件部分的定义\lsthk@SelectCharTable,则右括号会显示为红色。但我不知道是否会出现其他问题。

相关内容