正如标题所述,该选项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
,则右括号会显示为红色。但我不知道是否会出现其他问题。