我尝试格式化 SQL 代码以至少实现与此图类似的结果:
但我不能这样做。我为边距、填充和编号苦苦挣扎了很长时间,我已经感到绝望了,所以寻求帮助。在我看来,framesep 和 framextopmargin 根本不起作用。如果我的代码令人困惑或太复杂,我很抱歉,我还没有使用过这样的包。
\documentclass[9pt]{article}
\usepackage[paperwidth=841pt,paperheight=595pt,top=28pt,right=28pt,bottom=28pt,left=28pt, includefoot, includehead]{geometry}
\usepackage{xcolor,listings}
\usepackage{textcomp}
\usepackage{color}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{HTML}{C42043}
\definecolor{backcolour}{HTML}{F2F2F2}
\definecolor{bookColor}{cmyk}{0,0,0,0.90}
\color{bookColor}
\lstset{upquote=true}
\lstdefinestyle{mystyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{codepurple},
numberstyle=\footnotesize\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=-10pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
}
\lstset{style=mystyle}
\begin{document}
\begin{lstlisting}[language=SQL,
deletekeywords={IDENTITY,INT},
morekeywords={clustered},
framesep=10pt,
framextopmargin=10pt]
CREATE TABLE [dbo].[CisDuvodNezajmu] (
[OID] [ INT ] IDENTITY(1,1) NOT NULL INT,
[Nazev] [NVARCHAR](100) COLLATE Czech_CI_AS NULL,
[Cre] [DATETIME] NULL,
[CreBy] [INT] NULL,
[Mod] [DATETIME] NULL,
[ModBy] [INT] NULL,
[OptimisticLockField] [INT] NULL,
[GCRecord] [INT] NULL,
CONSTRAINT[PK_CisDuvodNezajmu] PRIMARY KEY CLUSTERED ([OID])
);
\end{lstlisting}
\end{document}
答案1
以下是有关如何更接近预期结果的一些注意事项。
缩进:首先,不要缩进文档的所有代码。如果你缩进所有内容,你可能会遇到麻烦,从而得到缩进过多的代码列表,因为所有缩进空间都被保留listings
(除非你使用gobble
选项删除第一个n字符)。由于没有提供其他自动代码缩进,因此您必须根据期望的输出来缩进代码。
字体类型:代码列表的常用字体类型是等宽字体。因此,您可能需要添加\ttfamily
该basicstyle
选项。请查看LaTeX 字体目录如果您能找到与示例图像中更接近的字体。
行号:由于行号的样式更加广泛,我们可以将其移至新命令中\numberstyle
,其中当前行号是第一个参数。示例中的行号也是在\ttfamily
字体中设置的。此外,还有一个前导零和尾随管道,这可以通过取消标记轻松实现\ifnum#1<10 0\fi#1 |
(至少如果数字保持在 100 以下)。
边距:由于行号现在在左侧太宽,我们必须调整列表的边距。首先,我们通过设置 将整个列表向右移动一点xleftmargin
。接下来,我们使用 将背景向左扩展framexleftmargin
。最后,numbersep
对行号的位置进行精细控制。
framesep
可以通过设置和/或来实现顶部和底部缺失的额外边距framex(top|bottom)margin
。由于listings
只有在指定了实际框架时才会渲染这些边距,我们可以使用 添加不可见的顶部/底部框架frame=tb, framerule=0pt
。
关键字:语言SQL
风格定义了两组关键字,1 组为语言关键字,2 组为类型名称(这在驱动程序文件)。deletekeywords={IDENTITY,INT}
这意味着应从默认关键字集(即集 1)中删除关键字。但此集不包含关键字INT
,该关键字在集 2 中。因此,要继续删除它,您必须使用另一个选项,并在参数中添加适当的集号:deletekeywords={[2]INT},
。此语法也用于其他*keywords*
选项。
所有东西放在一起看起来是这样的:
\documentclass{article}
\usepackage[paperwidth=841pt,paperheight=595pt,top=28pt,right=28pt,bottom=28pt,left=28pt, includefoot, includehead]{geometry}
\usepackage{xcolor,listings}
\usepackage{textcomp}
\usepackage{color}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{HTML}{C42043}
\definecolor{backcolour}{HTML}{F2F2F2}
\definecolor{bookColor}{cmyk}{0,0,0,0.90}
\color{bookColor}
\lstset{upquote=true}
\lstdefinestyle{mystyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{codepurple},
numberstyle=\numberstyle,
stringstyle=\color{codepurple},
basicstyle=\footnotesize\ttfamily,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=10pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
}
\lstset{style=mystyle}
\newcommand\numberstyle[1]{%
\footnotesize
\color{codegray}%
\ttfamily
\ifnum#1<10 0\fi#1 |%
}
\begin{document}
\begin{lstlisting}[ language=SQL,
deletekeywords={IDENTITY},
deletekeywords={[2]INT},
morekeywords={clustered},
framesep=8pt,
xleftmargin=40pt,
framexleftmargin=40pt,
frame=tb,
framerule=0pt ]
CREATE TABLE [dbo].[CisDuvodNezajmu] (
[OID] [ INT ] IDENTITY(1,1) NOT NULL INT,
[Nazev] [NVARCHAR](100) COLLATE Czech_CI_AS NULL,
[Cre] [DATETIME] NULL,
[CreBy] [INT] NULL,
[Mod] [DATETIME] NULL,
[ModBy] [INT] NULL,
[OptimisticLockField] [INT] NULL,
[GCRecord] [INT] NULL,
CONSTRAINT[PK_CisDuvodNezajmu] PRIMARY KEY CLUSTERED ([OID])
);
\end{lstlisting}
\end{document}