我希望括号和方括号中的代码以不同的颜色显示。在下面的文档中,再次括号按预期显示为绿色,并且再次出门正如预期的那样是黑色,但延伸到页面的边缘。
如果我取消注释该行,breaklines=true
,则该行在括号和再次但是,这些词和后面的部分都是红色的,也就是说,好像检测到了(
--分隔的部分,但是却忽略了)
结尾部分。)
这里发生了什么?
添加:如果没有换行符,也会出现此问题,例如,如果我将文本中的所有单词缩短为其首字母。如果我选择任何其他类型的分隔符代替()
,例如,此问题在任何情况下都会消失{}
。
\documentclass{article}
\usepackage{color}
\usepackage{listings}
\lstdefinelanguage{new}{
moredelim=*[s][\color{red}]{(}{)},
moredelim=*[s][\color{green}]{[}{]},
}
\lstset{
language=new
%,breaklines=true
}
\begin{document}
\begin{figure}
\begin{lstlisting}
outside(in paren) [in brackets (paren+brackets) brackets again] outside again
\end{lstlisting}
\end{figure}
\end{document}
答案1
您可能遇到过一个错误,该错误是由于换行算法对右括号的特殊处理而引起的listings
包。实际上,当执行包SelectCharTable
使用的钩子listings
并启用换行时,它)
被定义为一个宏,即
\lst@Def{`)}{\lst@breakProcessOther)}
在哪里
\lst@Def=macro:
#1->\lccode `\~=#1\lowercase {\def ~}.
不幸的是,这意味着)
不再被识别为分隔符,最终导致了您的观察结果。
我花了一些精力来寻找此错误的修复方法,但目前尚未成功。(我的 TeX 编程技能仍然有限。)因此,我现在唯一可以提供的是一种以补丁形式提供的解决方法,只需取消换行)
算法的特殊处理即可:
\documentclass{article}
\usepackage{color}
\usepackage{listings}
\lstdefinelanguage{new}{
moredelim=*[s][\color{red}]{(}{)},
moredelim=*[s][\color{green}]{[}{]},
}
\lstset{
language=new,
breaklines=true
}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\lsthk@SelectCharTable}{%
\lst@ifbreaklines\lst@Def{`)}{\lst@breakProcessOther)}\fi
}{%
}{
}{
}
\makeatother
\begin{document}
\begin{lstlisting}
outside (in paren) [in brackets (paren+brackets) brackets again] outside again
\end{lstlisting}
\end{document}
输出结果为:
答案2
一个简单的解决方法是,不要使用右括号“)”,而是可以使用另一个字符(例如“]”),并将其替换为右括号“)”。
\begin{lstlisting[literate={(}{{\textbf{(}}}1
{]}{{\textbf{)}}}1]
(In text I'm closing using]
\end{lstlisting}