XML 语法突出显示

XML 语法突出显示

我使用以下代码来包含一些 XML 代码:

\lstset{language=XML}
\begin{lstlisting}
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
   xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="points">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="point">
          <xs:complexType>
            <xs:attribute name="x" type="xs:unsignedShort" use="required" />
            <xs:attribute name="y" type="xs:unsignedShort" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
\end{lstlisting}

但只有?xml version突出显示。还有其他预定义的 XML 语法突出显示吗?

答案1

XML语言对关键字的支持非常有限,你可以自己定义更多的关键字:

\lstset{
  language=XML,
  morekeywords={encoding,
    xs:schema,xs:element,xs:complexType,xs:sequence,xs:attribute}
}

答案2

你可以定义自己的语言。到目前为止我能得到的最好的是:

\usepackage{listings}

\usepackage{color}
\definecolor{gray}{rgb}{0.4,0.4,0.4}
\definecolor{darkblue}{rgb}{0.0,0.0,0.6}
\definecolor{cyan}{rgb}{0.0,0.6,0.6}

\lstset{
  basicstyle=\ttfamily,
  columns=fullflexible,
  showstringspaces=false,
  commentstyle=\color{gray}\upshape
}

\lstdefinelanguage{XML}
{
  morestring=[b]",
  morestring=[s]{>}{<},
  morecomment=[s]{<?}{?>},
  stringstyle=\color{black},
  identifierstyle=\color{darkblue},
  keywordstyle=\color{cyan},
  morekeywords={xmlns,version,type}% list your attributes here
}

以下是使用上述设置的突出显示 XML 的示例:

XML 语法突出显示

我也想将语法位(例如<></=)设置:为灰色,因为它们不包含相关信息,但这会破坏突出显示的其他部分。也许其他人可以改进它并向 listings 包的维护者发送修复程序。

答案3

这是另一种风格,由于属性分隔符以空格开头,因此它相当粗糙并且很少使用额外的空格:

\definecolor{maroon}{rgb}{0.5,0,0}
\definecolor{darkgreen}{rgb}{0,0.5,0}
\lstdefinelanguage{XML}
{
  basicstyle=\ttfamily,
  morestring=[s]{"}{"},
  morecomment=[s]{?}{?},
  morecomment=[s]{!--}{--},
  commentstyle=\color{darkgreen},
  moredelim=[s][\color{black}]{>}{<},
  moredelim=[s][\color{red}]{\ }{=},
  stringstyle=\color{blue},
  identifierstyle=\color{maroon}
}

示例输出:

截屏

答案4

我一直在寻找一种解决方案,可以将颜色应用于<</和。我发现在 中应用解决了我的问题。>/>basicstylelstdefinelanguage

使用basicstyle,我定义了适用于所有代码内容的样式,而不考虑内容类型(identifiers,,keywords...),然后将应用其他样式。(添加basicstyle=\ttfamily\color{darkblue}\bfseries

\lstdefinelanguage{XML}
{
  basicstyle=\ttfamily\color{darkblue}\bfseries,
  morestring=[b]",
  morestring=[s]{>}{<},
  morecomment=[s]{<?}{?>},
  stringstyle=\color{black},
  identifierstyle=\color{darkblue},
  keywordstyle=\color{cyan},
  morekeywords={xmlns,version,type}% list your attributes here
}

相关内容