我想要一个垂直等效物\mbox{}
,以某种方式将一系列的盒子放在一起并将它们堆叠在一起。
我希望最终的宽度是最宽框的宽度,并且我希望它具有以下选项:
- 框之间没有垂直空间或标准行间距
- 左对齐、右对齐或居中对齐
结果框的基线经过下列之一:
- top:第一个框的基线(如
\vtop
) - middle:在盒子的中间
- bottom:最后一个框的基线(如
\vbox
)
- top:第一个框的基线(如
例如:
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
这是一个老问题,但它有一个非常简单的去复杂化答案,我在这里提供答案以保证完整性。使用\valign
TeX。
然后它就变成了两行:
\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
基本解决方案:
您可以使用node
with tikz
。下面我定义了一个宏,它接受可选的对齐方式,即top
、middle
或bottom
alogn,并为各个文本字段提供 3 个参数。您可以轻松扩展它以处理更多内容。
\MyVBox[top|middle|bottom]{text1}{text2}{text3}
只需使用这些基本对齐位置,您就可以获得:
奇特选项:
但是,由于这是使用,\tikz
您还可以变得更加花哨并调整对齐方式为中心,左侧,添加填充,为线条指定颜色,使用虚线等等:
进一步增强:
在这个解决方案中,我求助于魔法数字,yshift
必须对其进行调整才能使top
和对齐选项正常工作。但是,如果通过调整或线条粗细middle
来改变边界框的垂直尺寸,则需要对其进行调整。我尝试使用该选项以及自动调整这些参数,但无法使其按预期工作。inner sep
use 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}