当 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
环境似乎不尊重这一点。我怎样才能得到我想要的?
需要注意的是,有钥匙aboveskip
和belowskip
,我认为这是实现这一目标的有希望的途径。它们似乎需要采用常数,但(受到启发这)也可以使用宏。我尝试了类似以下方法:
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
我希望这个咒语是如此的强大,以至于比我更了解的人可以告诉我如何正确地做到这一点。目前,这将直接投入生产。