如何像 \mbox 的垂直版本那样堆叠盒子?

如何像 \mbox 的垂直版本那样堆叠盒子?

我想要一个垂直等效物\mbox{},以某种方式将一系列的盒子放在一起并将它们堆叠在一起。

我希望最终的宽度是最宽框的宽度,并且我希望它具有以下选项:

  • 框之间没有垂直空间或标准行间距
  • 左对齐、右对齐或居中对齐
  • 结果框的基线经过下列之一:

    • top:第一个框的基线(如\vtop
    • middle:在盒子的中间
    • bottom:最后一个框的基线(如\vbox

例如:

surrounding text
\fbox{\stack[align=rt]{something}{something else}{foo}}
surrounding text

将产生:

                 +----------------+
surrounding text |      something | surrounding text
                 | something else |
                 |            foo |
                 +----------------+

类似的东西已经存在了吗?如果没有,有人能指点一下如何实现吗?

编辑: 我正在使用 LaTeX

答案1

adjustbox从 2011/11/14 开始的 v0.8现在有一个\stackbox[<hor>][<vert>]{<content>}宏(以及一个匹配的stackbox环境和stack键)。它接受垂直和水平对齐并varwidth在内部使用该包。要删除行之间的常见跳跃,您可以\baselineskip=0pt在开头和\par结尾处使用。我可能会在稍后为此添加一个选项。

\documentclass{article}

\usepackage{adjustbox}

\begin{document}

surrounding text
\fbox{\stackbox[r][t]{something\\something else\\foo}}
surrounding text

surrounding text
\fbox{\stackbox[l][b]{something\\something else\\foo}}
surrounding text

surrounding text
\adjustbox{stack=cc,fbox}{something\\something else\\foo}
surrounding text

% No interline skip:
surrounding text
\fbox{\stackbox[c][b]{\baselineskip=0pt something\\something else\\foo\par}}
surrounding text

\end{document}

结果

答案2

奇怪的是没有人提到tabular

\documentclass{article}
\usepackage{array}
\begin{document}
before
\begin{tabular}[t]{|c|}\firsthline
foo\\bar\\baz\\\lasthline
\end{tabular}
after

before
\begin{tabular}[b]{|c|}\firsthline
foo\\bar\\baz\\\lasthline
\end{tabular}
after
\end{document}

在此处输入图片描述

您可以轻松定义一个新的简短命令。

而且确实有很多表格工具包可以帮助您获得所需的内容。

答案3

这是一个老问题,但它有一个非常简单的去复杂化答案,我在这里提供答案以保证完整性。使用\valignTeX。

然后它就变成了两行:

\documentclass{article}
\begin{document}
Before text \lower 30pt\hbox{\valign{&\hbox to 1cm{\fbox{#}\hfil}\vfill\cr
one& two& three& four& five& six\cr}} after text.
\end{document}

TeX 命令在 (La)TeX 中可用,这些是 LaTeX 用来构建其自己的宏的命令。我曾\fbox在 LaTeX 中使用过,但使用 TeX 定义boxit命令同样容易。(另请参阅评论中 morbusg 提供的替代解决方案,使用ooalign)。

在此处输入图片描述

答案4

基本解决方案:

您可以使用nodewith tikz。下面我定义了一个宏,它接受可选的对齐方式,即topmiddlebottomalogn,并为各个文本字段提供 3 个参数。您可以轻松扩展它以处理更多内容。

\MyVBox[top|middle|bottom]{text1}{text2}{text3}

只需使用这些基本对齐位置,您就可以获得:

在此处输入图片描述

奇特选项:

但是,由于这是使用,\tikz您还可以变得更加花哨并调整对齐方式为中心,左侧,添加填充,为线条指定颜色,使用虚线等等:

在此处输入图片描述

进一步增强:

在这个解决方案中,我求助于魔法数字,yshift必须对其进行调整才能使top和对齐选项正常工作。但是,如果通过调整或线条粗细middle来改变边界框的垂直尺寸,则需要对其进行调整。我尝试使用该选项以及自动调整这些参数,但无法使其按预期工作。inner sepuse as bounding box

代码:

\documentclass[border=5pt]{standalone}
\usepackage{tikz}

\tikzset{top/.style={baseline={([yshift=-2.44ex]current bounding box.north)}}}
\tikzset{middle/.style={baseline={([yshift=-0.80ex]current bounding box.west)}}}
\tikzset{bottom/.style={baseline=(X.base)}}

\newcommand{\MyVBox}[4][middle, align=right]{\tikz [#1] \node [draw=black, align=right, #1] (X) {#2 \\ #3 \\ #4};}%
\begin{document}
surrounding text
    \MyVBox[top]{something}{something else}{foo}
surrounding text

surrounding text
    \MyVBox[middle]{something}{something else}{foo}
surrounding text

surrounding text
    \MyVBox[bottom]{something}{something else}{foo}
surrounding text

\bigskip\hrule\bigskip
surrounding text
    \MyVBox[middle,align=center,draw=blue,fill=yellow]{something}{longer something else}{foo}
surrounding text

surrounding text
    \MyVBox[middle,align=left,draw=red,fill=green, dashed]{something}{even longer something else}{foo}
surrounding text
\end{document}

相关内容