列表:SPARQL 查询的语法突出显示?

列表:SPARQL 查询的语法突出显示?

我使用以下清单来显示 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}
    

Minted 中的 Sparql

答案3

其他答案提供了许多功能齐全的方法来实现这一点。为了完整起见,我想指出,您也可以只使用\lstdefinelanguagelistings 包中的命令来定义一种全新的语言。

以下是我过去使用过的 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文件中的定义更完整。

相关内容