在下面的例子中,我曾经用mdframed
一个框来包围我的文本。问题是上面的垂直空间与框下面的空间不同。我找到了一种解决方法,\vspace*{}
但我不知道这是否是正确的方法。
有没有更好的方法?还有为什么盒子下面的空间比上面的空间大?
(mdframed的版本是1.9b)
\documentclass[12pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage[framemethod=TikZ]{mdframed}
\parindent0mm
\begin{document}
test1
\begin{mdframed}[skipabove=0pt,skipbelow=0pt]
Das ist ein toller satz
\end{mdframed}
%\vspace*{-16pt}
test2 test test
\end{document}
答案1
\unskip
通过在环境后放置一个 可以解决部分问题。但这仍然会留下一个小间隙(见后续解释)。还请注意\vspace
,当下一行出现高字母时,您采用的“修复”将起作用;但是,一行短字母aaaa
仍然会显示间隙,并且像 一样高的东西\strut
会与框架环境的底部重叠。也就是说,\vspace
修复不是通用的,而是取决于框架后面的内容。
但是,为了从根本上自动化您已经在做的事情,我重新定义了环境的结束mdframed
以添加一个\unskip
后跟 6pt 负数的\vspace
。
\documentclass[12pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage[framemethod=TikZ]{mdframed}
\parindent0mm
\let\svendmdframed\endmdframed
\makeatletter
\def\endmdframed{\svendmdframed\unskip\vspace{-6pt}}
\makeatother
\begin{document}
test1
\begin{mdframed}[skipabove=0pt,skipbelow=0pt]
Das ist ein toller satz
\end{mdframed}
test2 test test
\end{document}
在下面的“进一步解释”中,我认为 的数量需要\vspace
取决于框架后面的高度。所以在这里,我创建了一个 MWE 来执行此操作,其中后面的线被传递给\adjustframe
,以便\vspace
进行适当的调整。但请注意,这只有在后面的线小于支柱高度时才会起作用,因为在该点之后,各种线间粘合都会发挥作用。
\documentclass[12pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage[framemethod=TikZ]{mdframed}
\parindent0mm
\let\svendmdframed\endmdframed
\def\endmdframed{\svendmdframed\unskip}
\newcommand\adjustframe[1]{\setbox0=\hbox{#1}%
\vspace{\dimexpr-\baselineskip+\ht0}#1}
\begin{document}
\fboxsep=0pt
\fboxrule=.2pt
test1g
\begin{mdframed}[skipabove=0pt,skipbelow=0pt]
Das ist ein toller satz
\end{mdframed}
\adjustframe{test2 test test}
\begin{mdframed}[skipabove=0pt,skipbelow=0pt]
Das ist ein toller satz
\end{mdframed}
\adjustframe{aaaaaa}
\begin{mdframed}[skipabove=0pt,skipbelow=0pt]
Das ist ein toller satz
\end{mdframed}
\adjustframe{\rule{1ex}{2.7ex}xyz}
\end{document}
进一步解释:
为了更仔细地观察事物,请考虑带有\unskip
但不带有 的解决方案\vspace
,并在末尾添加一个额外的段落:
框架下方的空白与段落之间的空白相同。这与您所期望的一样,没有添加“额外”空间。框架上方的间隙可以缩小到零,因为框架可以“知道”前一行的下限。另一方面,当框架结束并且必须设置新的基线时,LaTeX 还不知道下一行中的文本/对象有多高。我认为是\vspace
唯一可行的选择,尽管正如我所说,它必须根据后续行中出现的内容进行定制。
如果下一行出现的内容实际上足够高,那么行间距就不是影响因素,间隙会缩小为零(+/- 一些胶水),如此图所示,我在\rule
框架后面的行首添加了一个高:
最后,实际的正确数量是\vspace
加上-\baselineskip
下一行中出现的最高项的高度(但必须保持非正数)。如果我将其硬连线,知道“2”是下一行中最高的项,通过
\def\endmdframed{\svendmdframed\unskip\setbox0=\hbox{2}%
\vspace{\dimexpr-\baselineskip+\ht0}}
结果就是你想要的:
底线:框架下方间隙的调整将不可避免地需要对该行内容的高度做出某种假设。