XML 语法高亮:无法识别注释

XML 语法高亮:无法识别注释

考虑一下这个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)

xml 格式化结果

这里的问题是注释应该是灰色的,但它却无法与其他标记区分开来。有什么方法可以让文本“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}

在此处输入图片描述

相关内容