當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}

相關內容