我使用以下清单来显示 SPARQL 查询:
\begin{lstlisting}[captionpos=b, caption=SPARQL query, label=lst:sparql]
PREFIX java: <http://evolizer.org/ontologies/seon/2009/06/java.owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?url ?name
WHERE {
?url rdf:type java:Package .
?url rdfs:label ?name
}
但是现在我不知道应该设置哪种语言标签,因为 SPARQL 不是内置的。我也尝试过定义自己的突出显示,但无法获得良好的效果。是否有可用于突出显示 SPARQL 查询的宏?
答案1
加载已定义的语言 SQL 并定义更多关键字(如果需要)。或者编写一个SPARQL.sty
具有完整语言定义的包。从SQL
文件中的模板中选择lstlang1.sty
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[scaled=0.85]{beramono}
\usepackage{listings}
\lstset{language=SQL,morekeywords={PREFIX,java,rdf,rdfs,url}}
\begin{document}
\begin{lstlisting}[captionpos=b, caption=SPARQL query, label=lst:sparql,
basicstyle=\ttfamily,frame=single]
PREFIX java: <http://evolizer.org/ontologies/seon/2009/06/java.owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?url ?name
WHERE {
?url rdf:type java:Package .
?url rdfs:label ?name
}
\end{lstlisting}
\end{document}
答案2
如果你使用该minted
包,你可以通过为 Pygments 编写一个 Python 模块来轻松编写自己的词法分析器。我写了一个小例子在我的博客上。
编辑:实际上有一个适用于 Pygments 的 SPARQL 词法分析器在此存储库中, 所以你可以
下载 sw.py 文件
$ mkdir -p swlexers/swlexers $ cd swlexers $ wget http://www.openvest.com/trac/browser/tools/trunk/pygments/lexers/sw.py?format=txt -O swlexers/__init__.py
为其编写一个setup.py文件
$ cat setup.py """ Sparql syntax highlightin for Pygments. """ from setuptools import setup entry_points = """ [pygments.lexers] sparql = swlexers:SparqlLexer """ setup( name = 'swlexers', version = '0.1', description = __doc__, packages = ['swlexers'], entry_points = entry_points )
安装模块:
$ sudo python setup.py install
检查模块是否已安装:
$ pygmentize -L | grep -i sparql
在您的代码中使用它
minted
:\documentclass{article} \usepackage{minted} \begin{document} \begin{minted}{sparql} PREFIX java: <http://evolizer.org/ontologies/seon/2009/06/java.owl#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?url ?name WHERE { ?url rdf:type java:Package . ?url rdfs:label ?name } \end{minted} \end{document}
答案3
其他答案提供了许多功能齐全的方法来实现这一点。为了完整起见,我想指出,您也可以只使用\lstdefinelanguage
listings 包中的命令来定义一种全新的语言。
以下是我过去使用过的 SPARQL 的粗略定义。
% Language Definitions for SPARQL
\lstdefinelanguage{sparql}{
morecomment=[l][\color{olivegreen}]{\#},
morestring=[b][\color{blue}]\",
morekeywords={SELECT,CONSTRUCT,DESCRIBE,ASK,WHERE,FROM,NAMED,PREFIX,BASE,OPTIONAL,FILTER,GRAPH,LIMIT,OFFSET,SERVICE,UNION,EXISTS,NOT,BINDINGS,MINUS,a},
sensitive=true
}
你会注意到我没有填写内置函数的所有关键字
答案4
我是 StackExchange 的新手,对论坛不太了解;但我认为这个页面应该更新。
我首先按照SQL
解决方案进行操作,然后\lstdefinelanguage
:这两个解决方案都失败并出现注释。
/usr/share/texlive/texmf-dist/tex/latex/listings/lstlang3.sty
但是,我发现(安装在 Ubuntu 18.04 上)中有一个 SPARQL 定义:
.../usr/share/texlive/texmf-dist/tex/latex/listings$ grep -i sparql *
lstlang3.sty:%% SPARQL definition (c) 2006 Christoph Kiefer
lstlang3.sty:\lst@definelanguage{SPARQL}%
如您所见,它写于 2006 年(但可能不在 2011 年或 2013 年的列表包中,当时此页面上的答案已发布?)。
以下是用于比较解决方案的示例代码:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{color}
\lstset{
morecomment=[l]{\#},
frame = single,
basicstyle = \ttfamily\footnotesize,
commentstyle=\color{blue},
}
\lstdefinelanguage{sparqlB}{
morecomment=[l]{\#},
language=SQL,
morekeywords={SELECT},
commentstyle=\itshape\color{blue},
sensitive=true,
}
\begin{document}
-- SPARQL in lstlang3.sty :
\begin{lstlisting}[language=sparql]
# comment with 'single quotes' = OK
SELECT * WHERE { ?s ?p ?o }
\end{lstlisting}
-- SQL solution :
\begin{lstlisting}[language=SQL]
# comment with 'single quotes' = NOT RECOGNIZED
SELECT * WHERE { ?s ?p ?o }
\end{lstlisting}
-- \\lstdefinelanguage solution
\begin{lstlisting}[language=sparqlB]
# comment with 'single quotes' = NOT RECOGNIZED
SELECT * WHERE { ?s ?p ?o }
\end{lstlisting}
\end{document}
编辑:实际上,\lstdefinelanguage
如果我改变选项的顺序,评论就会起作用
\lstdefinelanguage{
language=SQL, % <-- has to be before morecomment
morecomment=[l]{\#},
[...]
或删除language=SQL
但当然,.sty文件中的定义更完整。