我正在尝试找出如何以与 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}
结果: