无论断线是否设置为 true,如何让我的关键字仍然突出显示?

无论断线是否设置为 true,如何让我的关键字仍然突出显示?

我在使用 listings 包时遇到了一些麻烦。我尝试使用 突出显示自定义语言,lstdefinelanguage但由于一些我无法理解的原因,当我启用 时,我的)关键字(而且只有关键字)的突出显示就会中断。)breaklineslstset

我希望关键字)能够像 一样突出显示(+等等,即使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}

我用过字符串进行替换。

相关内容