我如何指示 listings 包正确处理外部源文件中的 SQL 注释?

我如何指示 listings 包正确处理外部源文件中的 SQL 注释?

SQL 中包含样式注释的列表--看起来像是−−从 PDF 粘贴的(如果lmodern使用,则为??)。我查看了这些答案,但不知道如何将它们与列表一起使用(我主要从外部文件加载(如果这很重要):如何防止 LaTeX 创建 en-dash 和 em-dash?

\documentclass[11pt,letterpaper]{memoir}
\usepackage{lmodern}
\usepackage{listings}
\lstloadlanguages{SQL}

\lstset {
    frameround=fttt
    ,language=SQL
    ,numbers=left
    ,breaklines=true
    ,showstringspaces=false
    ,columns=flexible
    ,keepspaces=true
}

\begin{document}

\begin{lstlisting}
select 1
-- This is just a comment
select 2
\end{lstlisting}

\end{document}

从 PDF 粘贴后,结果在 Sql Studio 中显示如下(第三行是它们应有的样子):

在此处输入图片描述

编辑:

我尝试使用listings 包将连字符改为减号并且它对于常见的 SQL 注释行(例如-- This is a comment:)工作得很好,但它对输出列表有副作用,其中字段名称与数据之间用包含多个破折号的行分隔:

field1
--------------
1.33333333

它们在前两个破折号后有一个额外的空格,如下所示:

在此处输入图片描述

实施了链接建议的 MWE:

\documentclass[11pt,letterpaper]{memoir}
\usepackage{listings}

\makeatletter
\lst@CCPutMacro\lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{-{}}}
\@empty\z@\@empty
\makeatother

\lstset {
    frameround=fttt
    ,language=SQL
    ,breaklines=true
    ,columns=flexible
}

\begin{document}

\begin{lstlisting}[caption={extra spaces},label={lst:sp},nolol=true,numbers=none]
field1
--------------
1.3333333

field1    field2
--------- --------------
9.66667   9.66667
\end{lstlisting}

\end{document}

答案1

间距不均匀的问题根源在于columns=flexible选项:使用此选项,listings 会尝试在每个输入“块”后重新插入缺失的空格,在您的情况下,--由于注释定义,它们由一个块组成,因此在两个输入“块”后重新插入缺失的空格。由于连字符比默认列宽 0.45em 略小,因此您会得到一个空格。

有多种方法可以解决这个问题:

使灵活列的默认宽度更小:

\begin{lstlisting}[caption={extra spaces},label={lst:sp},nolol=true,numbers=none,%
                   basewidth={0.6em,0.37em}
                   ]

使连字符变大一些:

\lst@CCPutMacro\lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{{\Large-}{}}}
\@empty\z@\@empty

或者将其放入更大的盒子中:

\lst@CCPutMacro\lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{\makebox[0.45em]{-}{}}}
\@empty\z@\@empty

相关内容