我正在使用 listings 包来格式化一些代码。该语言不是开箱即用的语言之一,因此我按照\lstdefinelanguage
包文档中所述提供了自己的语言定义。问题是我想要突出显示的大多数东西都是非字母符号,我想将它们突出显示为几个类。这是我的定义:
\lstdefinelanguage{mylang}{%
keywordsprefix={\#},%
alsoletter={\#},%
otherkeywords={[,],<,>,<!,!>,.\,},
otherkeywords={[2]:=,:+},%
morecomment=[l]\%,
morestring=[b]",%
morestring=[d]',%
sensitive=true%
}
您可以看到,我试图突出显示标有 # 和一些基于标点符号的符号的单词。问题是,由于我的“关键字”基于标点符号,因此我必须使用 otherkeywords 而不是 morekeywords。使用第二个 otherkeywords 列表似乎不起作用---我没有收到任何错误,但在尝试应用样式时没有看到任何结果。我定义了一些颜色,然后尝试将它们分配给关键字和关键字[2],但无济于事:
% Define Colors
\usepackage{color}
\definecolor{blue}{RGB}{42,0.0,255}
\definecolor{green}{RGB}{63,127,95}
\definecolor{purple}{RGB}{127,0,85}
\definecolor{orange}{RGB}{225,100,0}
\lstset{
language={mylang}, %
commentstyle=\color{green}, % style of comments
stringstyle=\color{blue}, % style of strings
keywordstyle=\color{purple}, % style of keywords
keywordstyle={[2]\color{orange}} % style of 2nd keywords
}
我考虑过尝试将这些标点符号添加到 alsoletter 中,然后使用 morekeywords 而不是 otherkeywords。这部分解决了问题,因为我可以使用[2]
morekeywords 上的索引获得多种样式,但现在的问题是,将它们变成字母后,当它们位于没有空格分隔的单词旁边时,解析器将找不到它们。将它们变成字母意味着将blah].
找不到]
或.
。
有什么想法或主意吗?我开始浏览开发人员指南,但也许更好的想法是查看源代码并查看是否可以将功能扩展[index]
到其他关键字。
如果有帮助的话,该语言有如下语句:
a := b & c &
[ D #e,
F #e & g,
H [ I <! k, l !> ]].
我希望能够用与分隔符不同的颜色显示带有“主题标签”的项目,并且理想情况下操作员喜欢用:=
第三种&
.
颜色。
我一直在使用 xelatex 但我想这无关紧要。
编辑:
评论要求提供一个可编译的示例,这是有道理的,如下所示:
\documentclass{article}
\usepackage{listings}
% Define Colors
\usepackage{color}
\definecolor{blue}{RGB}{42,0.0,255}
\definecolor{green}{RGB}{63,127,95}
\definecolor{purple}{RGB}{127,0,85}
\definecolor{orange}{RGB}{225,100,0}
\definecolor{gray}{RGB}{150,150,150}
\lstdefinelanguage{mylang}{%
keywordsprefix={\#},%
alsoletter={\#},%
otherkeywords={[2]<,>,[,],<!,!>,.\,},
otherkeywords={[3]:=,:+},%
morecomment=[l]\%,
morestring=[b]",%
morestring=[d]',%
sensitive=true%
}
\begin{document}
\lstset{
language={mylang},
basicstyle=\ttfamily,
commentstyle=\color{green}, % style of comments
stringstyle=\color{blue}, % style of strings
keywordstyle=\color{purple}, % style of keywords
keywordstyle={[2]\color{orange}}, % style of 2nd keywords
keywordstyle={[3]\color{gray}}, % style of 3nd keywords
morekeywords={}
}
\begin{lstlisting}
% this is a comment
a := b & c &
[ D #e,
F #e & g,
H [ I <! k, l !>,
M "nop" ]].
\end{lstlisting}
\end{document}
:=
:+
希望该示例能够清楚地表明,这里的意图是根据使用的习惯用法,以两种不同的样式突出显示括号和运算符[i]
,以对项目进行分组和设置样式——如包文档中所述。
当我编译这个简单的例子时,我在注释、字符串和 上看到了样式,但在[2] 或 [3]#e
上什么都没有。像这样:otherkeywords
我尝试过的一些解决方法是将标点符号添加到 alsoletter,但这实际上会导致其他不必要的行为(无法解析]].
为一系列三个keywords
)。
在旁边:
\lstset 中的行表示morekeywords={}
需要编译。我认为这与分配给关键字的前缀有关,然后没有任何关键字(关键字和其他关键字之间的某种交互)。
乐于听到任何想法。
编辑2:
我一直在查看列表源,特别是在中lstmisc.sty
,我发现了以下几行:
\lst@Key{otherkeywords}{}{%
\let\lst@otherkeywords\@empty
\lst@for{#1}\do{%
\lst@MakeActive{##1}%
\lst@lExtend\lst@otherkeywords{%
\expandafter\lst@CArg\lst@temp\relax\lst@CDef
{}\lst@PrintOtherKeyword\@empty}}}
我仍在查看开发人员指南以了解这里发生的情况,但看起来可能有机会将第二个参数传递给 \lst@Key,然后使用它对其他关键字进行分组。