更改中间行的小页面垂直对齐方式?

更改中间行的小页面垂直对齐方式?

请考虑以下 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}

其输出结果如下:

a1

所有小页面框均顶部对齐。

是否有可能让第一和第二个 minipage 顶部对齐(就像它们一样) - 然后让 minipage 3 底部对齐到 minipage 2(相应地,最后一个“zz”对齐到 minipage 3)?这是在图像编辑器中编写的所需输出:

a2

我更喜欢一种解决方案,在这种解决方案中,我不需要将小页面包装在另一个小页面/环境中(或者加载另一个包,编辑:这是因为我最终想要挂接到一个宏,它可以排版一整行 [“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}

...结果如下:

1.png

...即使三个tabulars[b]底部对齐(tabular就像答案中的两个s); - 并且三个minipages 对齐[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”现在如何充当底部锚点,占据相对于环境的“底部”空间:

2.png

因此,现在剩下的就是测量的高度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

...最后代码结果如下:

3.png

这对于其他类似情况有多么适用,我目前还无法说清楚:)。干杯!

相关内容