多个类无法与 listings 包中的 otherkeywords 协同工作

多个类无法与 listings 包中的 otherkeywords 协同工作

我正在使用 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,然后使用它对其他关键字进行分组。

相关内容