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