请考虑以下 MWE:
\documentclass{article}
\usepackage{lipsum}
\usepackage[showframe,showcrop]{geometry}
\begin{document}
\section{Section 1}
aa
\fbox{\begin{minipage}{100pt}
Box 1
\end{minipage}}
\fbox{\begin{minipage}[t]{150pt}
\lipsum[11]
\end{minipage}}
\fbox{\begin{minipage}[b]{50pt}
..... Box 3
\end{minipage}}
zz
\end{document}
其输出结果如下:
所有小页面框均顶部对齐。
是否有可能让第一和第二个 minipage 顶部对齐(就像它们一样) - 然后让 minipage 3 底部对齐到 minipage 2(相应地,最后一个“zz”对齐到 minipage 3)?这是在图像编辑器中编写的所需输出:
我更喜欢一种解决方案,在这种解决方案中,我不需要将小页面包装在另一个小页面/环境中(或者加载另一个包,编辑:这是因为我最终想要挂接到一个宏,它可以排版一整行 [“aa”到“zz”] 部分 - 并允许我挂接到中间;我想在其中插入迷你框,并更改行对齐方式,如下所示) - 但缺少这一点,我有兴趣听听任何适用于此处的方法。
答案1
除了测量框高度和根据手动位置放置外,您还可以使用两个tabulars
。与嵌套相比minipages
,使用此方法您不必为外部环境指定任何宽度。不需要其他包;但是,如果需要,例如对于“aa”和“zz”文本部分,您可以使用高级表格功能,例如自动宽度X
列。
两个表格的正确底部对齐对于插入空格很敏感,例如[0pt]
,在换行符后(或者,可以使用规则)。
表格在当前设置中插入了一些额外的水平空间。但是,可以通过@{}
在列定义中将每个列放在前面/后面以及删除表格之间的换行符来删除这些空间。
\documentclass{article}
\usepackage{lipsum}
\usepackage[showframe,showcrop]{geometry}
\begin{document}
\section{Section 1}
\rule{\textwidth}{.5pt}
\begin{tabular}[b]{lll}
aa
& \fbox{\begin{minipage}[t]{100pt}Box 1\end{minipage}}
& \fbox{\begin{minipage}[t]{150pt}\lipsum[11]\end{minipage}}
\\[0pt]
\end{tabular}
\begin{tabular}[b]{ll}
\fbox{\begin{minipage}[b]{50pt}..... Box 3\end{minipage}}
& zz
\\[0pt]
\end{tabular}
\\\rule[\baselineskip]{\textwidth}{.5pt}
\end{document}
答案2
附注@dgs' 答案——请注意,将两个拳头框保持顶部对齐的是tabular
它们所包裹的公共部分;只要您尝试打破tabular
,前两个项目的顶部对齐就会停止(即使您保留相同的参数);也就是说,这是:
\rule{\textwidth}{.5pt}
\begin{tabular}[b]{ll}
aa
& \fbox{\begin{minipage}[t]{100pt}Box 1\end{minipage}}
\\[0pt]
\end{tabular}
\begin{tabular}[b]{l}
\fbox{\begin{minipage}[t]{150pt}\lipsum[11]\end{minipage}}
\\[0pt]
\end{tabular}
\begin{tabular}[b]{ll}
\fbox{\begin{minipage}[b]{50pt}..... Box 3\end{minipage}}
& zz
\\[0pt]
\end{tabular}
\\\rule[\baselineskip]{\textwidth}{.5pt}
...结果如下:
...即使三个tabular
s[b]
底部对齐(tabular
就像答案中的两个s); - 并且三个minipage
s 对齐[t]
, [t]
, [b]
(也喜欢答案)。
然而,偶然的机会,我也终于意识到我可以用什么来“提升”第一个中的物品tabular
;这并不一定是微不足道的,因为\vspace
,\vskip
或\rule
(负高度规则根本没有画出来!)无法应用;但是,正如此代码片段所示:
\rule{\textwidth}{.5pt}
\begin{tabular}[b]{ll}
% \vspace{-50pt} % pushes down, doesn't "lift"
% \vspace*{-50pt} % pushes down, doesn't "lift"
% \vskip -50pt % ! Missing } inserted.
% \vskip -50pt % ! Missing } inserted.
% \rule{4pt}{-60pt} % isn't drawn at all when negative
aa \raisebox{-50pt}{b} \rule{4pt}{60pt}
& \fbox{\begin{minipage}[t]{100pt}Box 1\end{minipage}}
\\[0pt]
\end{tabular}
\begin{tabular}[b]{l}
\fbox{\begin{minipage}[t]{150pt}\lipsum[11]\end{minipage}}
\\[0pt]
\end{tabular}
\begin{tabular}[b]{ll}
\fbox{\begin{minipage}[b]{50pt}..... Box 3\end{minipage}}
& zz
\\[0pt]
\end{tabular}
\\\rule[\baselineskip]{\textwidth}{.5pt}
...\raisebox
可以使用负“提升距离”来实现此目的(旁注:我查看了 latex.ltx 中的定义\raisebox
,它所做的似乎只是计算一些长度,然后将它们应用到“当前选择的”框?!)。请注意“ b
”现在如何充当底部锚点,占据相对于环境的“底部”空间:
因此,现在剩下的就是测量的高度minipage
,并以大约相同的量进行负“提升”,从而从环境底部“抬起”内容:
\documentclass{article}
\usepackage{lipsum}
\usepackage[showframe,showcrop]{geometry}
\usepackage{trace}
\usepackage{calc}
\begin{document}
\section{Section 1}
\newsavebox\mybox
\newlength{\miniheight}
% save long minipage for tabular 2 into a box,
% so we can measure its height:
\begin{lrbox}{\mybox} %
\begin{minipage}[t]{150pt}\lipsum[11]\end{minipage}
\end{lrbox} %
% note \baselineskip dissapears (is 0) in tabular!
% so save the default \baselineskip in
% another variable:
\typeout{\the\baselineskip} %
\newlength{\oldbaselineskip}
\setlength{\oldbaselineskip}{\baselineskip}
\rule{\textwidth}{.5pt}
\begin{tabular}[b]{ll}
% \vspace{-50pt} % pushes down, doesn't "lift"
% \vspace*{-50pt} % pushes down, doesn't "lift"
% \vskip -50pt % ! Missing } inserted.
% \vskip -50pt % ! Missing } inserted.
% \rule{4pt}{-60pt} % isn't drawn - is negative
% note: correct height is ht + dp; not just ht!
% +1em matches the {M} - 1.12\oldbaselineskip is manually tuned
\settoheight{\miniheight}{\usebox\mybox} %
\setlength{\miniheight}{\ht\mybox+\dp\mybox+1em-1.12\oldbaselineskip} %
\typeout{\the\miniheight, \the\baselineskip} %
aa \raisebox{-\miniheight}{M} \rule{4pt}{60pt}
& \fbox{\begin{minipage}[t]{100pt}Box 1\end{minipage}}
\\[0pt]
\end{tabular}
\begin{tabular}[b]{l}
\fbox{\usebox\mybox}
\\[0pt]
\end{tabular}
\begin{tabular}[b]{ll}
\fbox{\begin{minipage}[b]{50pt}..... Box 3\end{minipage}}
& zz
\\[0pt]
\end{tabular}
\\\rule[\baselineskip]{\textwidth}{.5pt}
\end{document}
请注意:
- 您必须将长小页保存在一个盒子里才能测量其高度
- 实际高度为
ht
+dp
(不只是ht
)已保存的框的高度 - 您必须使用包
calc
,才能在节中用作+
加法运算符\setlength{\miniheight}...
- 您必须保存默认值
\baselineskip
- 因为它会在tabular
环境中消失 - 我使用那里的角色
M
作为锚点,这样我就可以调整1em
位移高度;但是额外的-1.12\oldbaselineskip
,我手动找到了(通过反复试验) - 进行
\raisebox
移位的是在\tabular
- 内部,但在外部\minipage
...最后代码结果如下:
这对于其他类似情况有多么适用,我目前还无法说清楚:)
。干杯!