考虑一下这个MWE:
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstdefinelanguage{XML}{
commentstyle=\color{gray},
breaklines=true,
morestring=[b]",
morestring=[s]{>}{<},
morecomment=[s]{<!--}{-->},
stringstyle=\color{black},
identifierstyle=\color{red},
keywordstyle=\color{cyan},
}
\begin{document}
\begin{lstlisting}[language=xml]
<baz>foo <b>foo</b> foo
<!-- a comment -->
bar bar bar.</baz>
\end{lstlisting}
\end{document}
得出这个结果(TL2016)
这里的问题是注释应该是灰色的,但它却无法与其他标记区分开来。有什么方法可以让文本“foo”保持黑色,同时让注释变成灰色?当我删除第 8 行(第二行morestrings
)时,我得到了我想要的注释,但文本是红色的。
答案1
我认为将标签中没有的所有内容都定义为字符串不太明智。最好将标签颜色设置为红色。这种方法的问题在于,列表会以内容样式为分隔符着色。如果您想要黑色分隔符,可以尝试此补丁(我在测试中使用了 XMLnew 语言来避免现有 xml 的副作用,但我不知道这是否真的有必要):
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\makeatletter
\def\lst@DelimPrint#1#2{%
#1%
\begingroup
\lst@mode\lst@nomode \lst@modetrue
#2\delimstyle\lst@XPrintToken%
\endgroup
\lst@ResetToken
\fi}
\makeatother
\newcommand\delimstyle{}
\lstdefinelanguage{XMLnew}{
tag=**[s][\color{red}\renewcommand\delimstyle{\color{black}}]<>,
commentstyle=\color{gray},
breaklines=true,
morestring=[b]",
morecomment=[s]{<!--}{-->},
keywordstyle=\color{cyan},
}[keywords,comments,strings,html]%
\begin{document}
\begin{lstlisting}[language=XMLnew]
<baz>foo <b>foo</b> foo
<!-- a comment -->
bar bar bar.</baz>
\end{lstlisting}
\end{document}