listings 包的高级用法

listings 包的高级用法

我是一名人工智能博士生,正在使用 listings 包来呈现其代码片段。

我正在尝试为 Drools(一个非常著名的生产规则系统)定义一个语言环境,旨在显示类似于用于编辑规则的 Eclipse 视角的片段。

尽管我付出了所有努力,但仍然有一些问题/疑问无法自己解决。你能帮我一下吗?首先,一个带有 Drools 代码片段的 MWE:

\documentclass{article}

\usepackage{listings}
\lstset{morekeywords={},
    showstringspaces=false}
\usepackage[dvipsnames,svgnames,x11names]{xcolor}

\definecolor{commentGreen}{RGB}{128,127,41}
\definecolor{stringGreen}{RGB}{0,127,38}
\definecolor{keywordRed}{RGB}{151,0,11}
\definecolor{typePurple}{RGB}{128,3,82}
\definecolor{variableBlue}{RGB}{0,0,255}
\definecolor{annotationRed}{RGB}{198,4,38}
\definecolor{annotationBlue}{RGB}{32,21,223}

\lstdefinelanguage[drl]{Drools}{
    sensitive=true,
    keywordsprefix=\$,
    alsoletter={:, },
    morekeywords=[2]{long,int,boolean,double,float,enum},
    morekeywords=[3]{declare,end,extends,from,insert,modify,not,new,no loop,query,retract,rule,salience,then,this,when, eval},
    morekeywords=[4]{after,before,during,over window:length,over window:time,overlaps},
    morekeywords=[5]{{no loop},over window:length,over window:time},
    morecomment=[l]{//},
    morecomment=[s]{/*}{*/},
    moredelim=[s][\color{annotationRed}\itshape]{@}{)},
    moredelim=[s][\color{annotationBlue}\itshape]{@[}{]},
    morestring=[b]",
    morestring=[d]',
%%% default style
    basicstyle=\normalfont\ttfamily,
    % identifierstyle=\normalfont,
    commentstyle=\color{commentGreen}\itshape,
    keywordstyle=\color{keywordRed}\bfseries,
    keywordstyle=[1]\color{variableBlue}\itshape,
    keywordstyle=[2]\color{typePurple}\bfseries,
    keywordstyle=[3]\color{keywordRed}\bfseries,
    keywordstyle=[4]\color{keywordRed}\bfseries,
    keywordstyle=[5]\color{stringGreen}\bfseries,
    stringstyle=\color{stringGreen}
}[comments,keywords,strings]



\begin{document}

\begin{lstlisting}[language={[drl]Drools}]
declare MyEvent
  @role(event)
  @timestamp(time)
  @duration(length)
  length  : long = 0 @[2]
  time    : long     @[1]
end 

rule "Transformation rule for 'Initiates' objects"
no loop
when
  Initiates(
    $e: event, $ep: eventPtrn, 
    $f: fluent, $fp: fluentPtrn, 
    $c: context )
then
  Helper h = Helper.getInstance(); 
  // 'h' is a wrapper to ease conversion with $*
  String r = h.transform($e, $ep, $f, $fp, $c);
  h.insertRule(r);
end

/*
rule "Resulting rule"
when
  $e: TurnOn( $t: time )
  $f: lightOn() // a query returning this fluent instance
  holdsAt( powerAvail(), $t )
then
  insert(new Declip($e, $f, $t));
end
*/
\end{lstlisting}

\end{document}

最后的问题是:

  1. 为什么我必须\lstset{morekeywords={}}在之后添加一条语句\usepackage{listings}以避免$在列表中的每个符号上编译时出现警告?
  2. 如何引入由两个或更多单词组成的关键字?我试图通过使用来实现这一点,alsoletter={:, }但它不适用于空格。我也尝试了使用,\但没有成功。万一你打算建议我将其定义length,loop,no,over,time,window为单词关键字,请考虑这是不可能的,因为否则有效标识符length(参见declare代码片段)将获得关键字的格式。
  3. 如何格式化整数和实数?除了本网站上已有的两种方法之外,还有其他更优雅(或更简单)的方法吗?当我确实更改某些内容时,这些解决方法非常麻烦且难以维护...
  4. 我如何正确地突出显示变量(它们由$Drools 中的符号引入)?在 MWE 中,我试图利用它,keywordsprefix=\$,但我也在注释中突出显示了那些特殊关键字:有什么办法可以告诉listings不要查看注释,因为可以使用moredelim?这是一个错误吗?我应该向包的维护者报告吗?只是为了在讨论中添加更多细节:我也尝试使用,moredelim=[l][\color{variableBlue}\itshape]\$,但其余行也突出显示了。最后,我也尝试了moredelim=[s][\color{variableBlue}\itshape]{\$}{:},moredelim=[s][\color{variableBlue}\itshape]{\$}{\ },etc.但似乎我不能有更多具有相同起始符号的分隔符;此外,终止符号也会突出显示,而它不应该(如果我在模式前面引入一个星号,起始和终止符号都会被隐藏,这也不是我所期望的)。
  5. 我没有找到任何关于如何为语言指定默认格式的提及(记住,我计划获得一个与 Drools 编辑器看起来相同的环境):通常它是完全解耦的,因此用户可以使用块引入自己的样式\lstset{...}。但是,我通过向块添加格式是否做了一件完全愚蠢的事情\lstdefinelanguage{...}?有没有最佳实践可以遵循?

在此先感谢您的时间。

相关内容