格式化 SQL 代码

格式化 SQL 代码

我尝试格式化 SQL 代码以至少实现与此图类似的结果:

MS Word 的理想结果

我的结果: 在此处输入图片描述

但我不能这样做。我为边距、填充和编号苦苦挣扎了很长时间,我已经感到绝望了,所以寻求帮助。在我看来,framesep 和 framextopmargin 根本不起作用。如果我的代码令人困惑或太复杂,我很抱歉,我还没有使用过这样的包。

你也可以在 Overleaf 上打开它

\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字符)。由于没有提供其他自动代码缩进,因此您必须根据期望的输出来缩进代码。

字体类型:代码列表的常用字体类型是等宽字体。因此,您可能需要添加\ttfamilybasicstyle选项。请查看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}

在此处输入图片描述

相关内容