如何为 Latex Listings 包中的 SQL 查询的列着色?

如何为 Latex Listings 包中的 SQL 查询的列着色?

我正在尝试找出如何以与 listings 包中的关键字样式相同的方式在 SQL 查询的列上定义样式(或至少只是颜色)。代码示例可在此链接下找到https://github.com/davidstutz/latex-resources/blob/master/listings-sql/sql.tex

listing 包的当前输出是:

在此处输入图片描述

我想自动为查询中的列(上例中的“firstname”)着色,就像任何其他 SQL 编辑器一样。以下是 DataGrip 的一个示例:

在此处输入图片描述

答案1

以下方法基于 SQL 查询中的模式匹配。如果遇到预定义的语言关键字之一,则调用宏来检查此关键字。如果关键字是select或 ,where则所有后续标识符都以紫色​​打印。如果关键字是 ,from则后续标识符将为黑色。

这是通过在关键字样式的宏中设置布尔开关,并在标识符样式的宏中检查此开关来实现的。关键字样式宏\color{blue}最后还可以设置关键字的颜色。

请注意,这种简单的模式匹配方法可能不适用于更复杂的 SQL 查询。此外,它区分大小写,因此SELECT firstname不起作用。

平均能量损失

\documentclass[a4paper,12pt]{article}

\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{xstring}

\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{ltgray}{rgb}{0.5,0.5,0.5}

\makeatletter
\newif\ifcolname
\colnamefalse

\def\keywordcheck{%
\IfStrEq*{\the\lst@token}{select}{\global\colnametrue}{}%
\IfStrEq*{\the\lst@token}{where}{\global\colnametrue}{}%
\IfStrEq*{\the\lst@token}{from}{\global\colnamefalse}{}%
\color{blue}%
}
\def\setidcolor{%
\ifcolname\color{purple}\else\color{black}\fi%
}
\makeatother

\lstset{%
    backgroundcolor=\color{white},
    basicstyle=\footnotesize,
    breakatwhitespace=false,
    breaklines=true,
    captionpos=b,
    commentstyle=\color{dkgreen},
    deletekeywords={...},
    escapeinside={\%*}{*)},
    extendedchars=true,
    frame=single,
    keepspaces=true,
    language=SQL,
    otherkeywords={is},
    morekeywords={*,modify,MODIFY,...},
    keywordstyle=\keywordcheck,
    identifierstyle=\setidcolor,
    numbers=left,
    numbersep=15pt,
    numberstyle=\tiny,
    rulecolor=\color{ltgray},
    showspaces=false,
    showstringspaces=false, 
    showtabs=false,
    stepnumber=1,
    tabsize=4,
    title=\lstname
}

\begin{document}

\begin{lstlisting}[language=sql]
select firstname, char_length(firstname), lastname from person
where firstnamew is null and lastname LIKE '%son';
\end{lstlisting}

\end{document}

结果:

在此处输入图片描述

答案2

该包piton直接区分表名和字段名。但是piton需要 LuaLaTeX。

\documentclass{report}
\usepackage{xcolor}
\usepackage{piton}

\begin{document}

\begin{Piton}[language=SQL]
select firstname from person
where firstnamew is null;
\end{Piton}

\end{document}

上述代码的输出

相关内容