如何让 mdframed 忽略最后一行的下降部分

如何让 mdframed 忽略最后一行的下降部分

我们怎样才能mdframed在计算时忽略最后一行的下行部分呢innerbottomsep?在我看来,有两个理由可以实现这一点:

内边距
与没有下降部分的行相比,包含下降部分的行中的光学底部分隔符太大。

边距

线网格
保持在线网格中是不可能的,否则可以通过调整上下的跳过来实现。

网格

如图所示,没有下降部的框架可以将以下线条保持在网格中,并且跳过调整良好的跳跃,但如果我们有下降部,调整就会被破坏。

代码
这是我用来生成图像的代码(在线注释掉以获取第一张图像)。

\documentclass{scrartcl}

\usepackage{tikz}
\usepackage{mdframed}

\newmdenv[%
   skipabove=12.6pt,
   skipbelow=12.6pt,
]{myframe}

\usepackage{lipsum}
\begin{document}
% draw a line grid
\noindent
\begin{tikzpicture}[overlay]
   \foreach \y in {0,...,-42}
      \draw [magenta] (0,\y*\baselineskip) -- ++(\textwidth,0);
\end{tikzpicture}%
\lipsum[1]
\begin{myframe}
   Without descender it works.
\end{myframe}
\lipsum[2]
\begin{myframe}
   But with descenders the skip is a little too much.
\end{myframe}
\lipsum
\end{document}

答案1

您可以通过强制插入基线跳过来获得线下方的一致空间,如下所示:

\par\strut\par
\unskip\unskip\setbox0=\lastbox

这样,就会插入一条“伪线”,然后将其移除,留下刚好填满基线距离的空间量。当然,这取决于是否有下降部分。

不幸的是,它似乎mdframed删除了尾随垂直空间,因此正常情况下,额外的空间会再次消失。此外,您总是会得到后一个示例的间距,这似乎不是您想要的。您可以通过添加来抵消两者

\vspace*{\dimexpr\ht\strutbox-\baselineskip\relax}

添加消极的垂直空间对应于基线和下一行开头之间的距离。

当然,这可以组合成一个新的环境,从而得到解决方案

\newmdenv[%
   skipabove=12.6pt,
   skipbelow=12.6pt,
]{@myframe}

\newenvironment{myframe}
{%
  \begin{@myframe}
}
{ 
  \par\strut\par
  \unskip\unskip\setbox0=\lastbox
  \vspace*{\dimexpr\ht\strutbox-\baselineskip\relax}
  \end{@myframe}
}

答案2

您可以将文本括在内,vbox并根据您的喜好进行调整。

\begin{myframe}
   \vbox to 0pt {But with descenders the skip is a little too much.}
\end{myframe}

您可以将 更改vbox to 0pt为其他长度以适应(对我来说 5.5pt 看起来合适)。为了更好地控制,您甚至可以在 中封闭一个支柱\vbox。使用:

vrule height..pt width0pt depth..pt

以获得更多控制。

相关内容