我有一张表格,其中有两列,宽度不同。我想将表格放置在页面中,使两列之间的线位于页面的中心。
如果列的大小相同,那么这将是微不足道的,但事实并非如此。
答案1
您可以测量列宽(可能需要两次连续的编译),将整个表放入保存箱中进行计算,并在相应的移动后使用它。
注意:我添加了一个0.5\textwidth
长rule
示例以供演示。
\documentclass{article}
\usepackage{environ}
\makeatletter
\NewEnviron{mtabular}[3][c]{%
\begingroup
\renewcommand{\multicolumn}[3]{\multispan{##1}##3}%
\let\\\cr
\setbox\tw@=\vbox{
\ialign{&##\unskip\hfil\cr\BODY\crcr}%
\get@widths{#3}%
}%
\endgroup
\begin{tabular}[#1]{#2}\BODY\end{tabular}}
\def\get@widths#1{%
\def\@temp{\else\@latex@warning{No such column}\fi}
\setbox\z@=\lastbox
\get@next@width
\xdef#1##1{%
\noexpand\ifcase##1\relax\unexpanded\expandafter{\@temp}%
}%
}
\def\get@next@width{%
\setbox\z@=\hbox{\unhbox\z@\unskip\global\setbox\@ne=\lastbox}%
\ifvoid\@ne
\else
\edef\@temp{\noexpand\or\the\wd\@ne\unexpanded\expandafter{\@temp}}%
\expandafter\get@next@width
\fi
}
\makeatother
\newsavebox{\mybox}
\begin{document}
\noindent\rule{0.5\textwidth}{1pt} % demo only
\begin{lrbox}{\mybox}%
\begin{mtabular}{|l|c|r|}{\foo}%
alma bagoly & alma & bagoly \\\hline
BAGOLY & \multicolumn{2}{|c|}{alma bagoly alma} \\\hline
bagoly & bagoly & bagoly
\end{mtabular}%
\end{lrbox}
\noindent%
\hspace*{0.5\textwidth}%
\hspace*{-\foo{1}}%
\hspace*{-2\tabcolsep}%
\usebox{\mybox}
\end{document}
移动说明:向中间移动,向后移动第一列内容宽度,向后移动2个列分隔长度。
与测量列宽相关的内容: 测量表格的列宽
答案2
我不确定如何做到tabular
这一点,但使用普通的 TeX 并不太难halign
。
$$\vbox{\halign{\hbox to 1in{\hss #}\ &\ \hbox to 1in{#\hss}\cr
Items on the left&Something on the right\cr
More on the left&With very long lines on the right too.\cr
}}$$
这个想法是使用两个固定宽度的框进行对齐,然后\hss
分别使用忽略左侧和右侧的宽度。 \hss
产生根据需要拉伸或收缩的粘合。您可以将框设置为任何合理的宽度,因为我们忽略了内容的宽度。如果它们的宽度相同,则间距将位于中间。如果您想以不同的比例拆分列,可以调整框的宽度。
一旦我们有了它,halign
我们就将它包装在一个中vbox
,然后在一个数学显示中,使它很好地位于页面的中心。