使用段落分隔符控制列表“lstlisting”垂直间距(“aboveskip”、“belowskip”?)

使用段落分隔符控制列表“lstlisting”垂直间距(“aboveskip”、“belowskip”?)

当 LaTeX 源中的文本之间有一个空行时,就会出现段落分隔符。

段落中断本身似乎与lstlisting环境有关。具体来说,如果环境末尾和文本之间有一个空行,我们将获得新的段落缩进。否则,不会。

\end{lstlisting}
There is no paragraph start indent here; all good!
\end{lstlisting}

There \emph{is} a paragraph start indent here; all good!

但是,现在我已经设置了实际差距:

\setlength{\parskip}{1em}

这是不是环境尊重这一点lstlisting,尽管其他环境似乎暂时尊重这一点。具体来说,虽然可以用空行开始新段落,但列表下方没有额外的空间。环境顶部也存在类似的问题,无论是否有空行,都没有额外的空间。

Vertical space \emph{after} this paragraph is the same,
regardless of whether there is a blank line :(

\begin{lstlisting}
\end{lstlisting}

Vertical space \emph{before} this paragraph is the same,
regardless of whether there is a blank line :(

我真的希望间距可以这样配置。有时列表本身就是一个独立的东西,应该与文本区分开来,但有时它只是一行简短的代码,从语义上来说不应该打断段落甚至句子的流程。

可以通过行距来消除这些选择的歧义,但lstlisting环境似乎不尊重这一点。我怎样才能得到我想要的?


需要注意的是,有钥匙aboveskipbelowskip,我认为这是实现这一目标的有希望的途径。它们似乎需要采用常数,但(受到启发)也可以使用宏。我尝试了类似以下方法:

aboveskip={\ifvmode 1em \else 0em \fi},
belowskip={\ifvmode 1em \else 0em \fi},

。。。但这并没有达到预期的效果;零情况从未发生过。我不知道该尝试什么其他方法。

答案1

看吧:我为了改善垂直间距而对 进行了可怕的、脆弱的、货物崇拜的、不好的、非常邪恶的重新定义lstlisting。它基本上尊重 的不同值\parskip,至少在我的测试中是这样(从 0 到 4em)。它还添加了一个键值break=false/break=true来控制环境是否在页面边界处中断:

\usepackage{ifthen}

\makeatletter
\let\lstlisting\@undefined
\let\lstlisting@\@undefined
\define@key{lst}{break}{\def\lstbreak{#1}}
\lstnewenvironment{lstlisting}[1][]{
    \csname\@lst @SetFirstNumber\endcsname
    \def\lstbreak{true}
    \lstset{aboveskip={0pt},belowskip={0pt},#1}
    \ifthenelse{\equal{\lstbreak}{true}}{
        \ifhmode\\\vspace{-0.7\baselineskip}\else\addvspace{\parskip}\addvspace{0.3\baselineskip}\fi
    }{
        \ifhmode\endgraf\vspace{-\parskip}\else\fi
        \vspace{\baselineskip}
        \noindent
        \minipage{\linewidth}
    }
}{
    \ifthenelse{\equal{\lstbreak}{true}}{
        \vspace{-\parskip}\vspace{0.3\baselineskip}\noindent
    }{
        \vspace{0.4\baselineskip}\endminipage\vphantom{(p}
    }%
    \csname\@lst @SaveFirstNumber\endcsname%
}
\makeatother

我希望这个咒语是如此的强大,以至于比我更了解的人可以告诉我如何正确地做到这一点。目前,这将直接投入生产。

相关内容