当 breaklines=true 时,右括号作为分隔符不匹配

当 breaklines=true 时,右括号作为分隔符不匹配

我希望括号和方括号中的代码以不同的颜色显示。在下面的文档中,再次括号按预期显示为绿色,并且再次出门正如预期的那样是黑色,但延伸到页面的边缘。

如果我取消注释该行,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}

相关内容