我希望括號和中括號中的程式碼以不同的顏色顯示。在下面的文檔中,這句話再次括號按預期顯示為綠色,並且再次到外面按預期為黑色,但延伸到頁面邊緣。
如果我取消註解該行,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}