![无论断线是否设置为 true,如何让我的关键字仍然突出显示?](https://linux22.com/image/237503/%E6%97%A0%E8%AE%BA%E6%96%AD%E7%BA%BF%E6%98%AF%E5%90%A6%E8%AE%BE%E7%BD%AE%E4%B8%BA%20true%EF%BC%8C%E5%A6%82%E4%BD%95%E8%AE%A9%E6%88%91%E7%9A%84%E5%85%B3%E9%94%AE%E5%AD%97%E4%BB%8D%E7%84%B6%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%EF%BC%9F.png)
我在使用 listings 包时遇到了一些麻烦。我尝试使用 突出显示自定义语言,lstdefinelanguage
但由于一些我无法理解的原因,当我启用 时,我的)
关键字(而且只有关键字)的突出显示就会中断。)
breaklines
lstset
我希望关键字)
能够像 一样突出显示(
,+
等等,即使breaklines
设置为true
。
以下是重现该问题的一个最小示例:
\documentclass[10pt, leqno]{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}
\lstdefinelanguage{Test}
{
morekeywords = {), +, (},
alsoletter={), +, (},
}
\lstset{
keywordstyle=\color{red},
breaklines=true % As soon as this is true highlighting for ) breaks
}
\begin{document}
\begin{lstlisting}[language=Test]
)
+
(
A very long line that will get broken A very long line that will get broken A very long line that will get broken A very long line that will get broken
\end{lstlisting}
\end{document}
是我操作错误还是包裹存在问题?
答案1
这里有两个解决方案。第一个使用 beta 包清单 2 版本并且开箱即用。第二个补丁listings
可以避免此问题。两者都采用了 Marco 的建议,即使用literate
。
listings2 的解决方案
\documentclass{article}
\usepackage{listings2}
\usepackage{xcolor}
\lstset{
literate={)}{{{\color{red})}}}1 {(}{{{\color{red}(}}}1 {+}{{{\color{red}+}}}1,
keywordstyle=\color{red},
breaklines=true
}
\begin{document}
\begin{lstlisting}
)
+
(
A very long line that (will) get broken A very long line that will get broken A very long line that will get broken A very long line that will get broken
\end{lstlisting}
\end{document}
listings
但请注意,和之间存在一些语法变化listings2
,因此您必须调整部分代码。
通过修补列表解决
\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi
通过从列表的钩子中删除SelectCharTable
,问题就消失了(它不应该有任何副作用):
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{xstring}
\makeatletter
\noexpandarg % to not expand arguments of \StrSubstitute
\expandafter\StrSubstitute\expandafter{\lsthk@SelectCharTable}{\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi}{}[\lsthk@SelectCharTable]
\makeatother
\lstset{
literate={)}{{{\color{red})}}}1 {(}{{{\color{red}(}}}1 {+}{{{\color{red}+}}}1,
keywordstyle=\color{red},
breaklines=true
}
\begin{document}
\begin{lstlisting}
)
+
(
A very long line that (will) get broken A very long line that will get broken A very long line that will get broken A very long line that will get broken
\end{lstlisting}
\end{document}
我用过字符串进行替换。