tabular
将列宽设置为所有行中最宽的元素。
是否可以设置两个或多个单独的tabular
s 来考虑彼此的列宽并选择其中最大的一个?
例如,如果我tabular
用附加段落文本断开连接并希望继续表格,就好像它是longtable
交叉到下一页一样(相同的列宽,可能重复标题),这可能吗?
答案1
这个想法是创建一组特殊的列类型,这样每次这种列类型出现在表格中时,它的宽度总是相同的。这需要运行 2 次文档,其中第一次运行计算出的宽度保存在辅助文件中。
注意:如果您想使列变窄,则需要删除辅助文件或至少注释掉 \AtEndDocument。
\documentclass{article}
\usepackage{array}
\newsavebox{\tempbox}% \box0 etc. used
\makeatletter
\newcommand{\saveWidth}[1]% #1=column name (A,B,...)
{\immediate\write\@auxout{\string\initWidth{#1}{\the\csname Width#1\endcsname}}}
\newcommand{\initWidth}[2]% #1=column name (A,B,...), #2=the width
{\@ifundefined{Width#1}{}{\global\csname Width#1\endcsname=#2\relax}}
\makeatother
\newlength{\WidthA}% one for each column type
\newlength{\WidthB}
\newlength{\WidthC}
\AtEndDocument{\saveWidth{A}\saveWidth{B}\saveWidth{C}}
\newcolumntype{A}{>{\savebox{\tempbox}\bgroup}{l}<{\egroup%
\ifdim\wd\tempbox>\WidthA \global\WidthA=\wd\tempbox\fi%
\makebox[\WidthA][l]{\usebox\tempbox}}}
\newcolumntype{B}{>{\savebox{\tempbox}\bgroup}{c}<{\egroup%
\ifdim\wd\tempbox>\WidthB \global\WidthB=\wd\tempbox\fi%
\makebox[\WidthB][c]{\usebox\tempbox}}}
\newcolumntype{C}{>{\savebox{\tempbox}\bgroup}{r}<{\egroup%
\ifdim\wd\tempbox>\WidthC \global\WidthC=\wd\tempbox\fi%
\makebox[\WidthC][r]{\usebox\tempbox}}}
\begin{document}
\noindent\begin{tabular}{ABC}
left & center & right\\
wide left & wide center & wide right
\end{tabular}
\medskip
Some text here.
\medskip
\noindent\begin{tabular}{ABC}
left & center & right\\
\end{tabular}
\medskip
Some text here.
\medskip
\noindent\begin{tabular}{ABC}
very wide left & very wide center & very wide right\\
\end{tabular}
\end{document}
为了更容易地创建新列,我添加了\newcolumnwidth{<name>}{l/c/r}
(它本身相当丑陋)。
\newcommand{\newcolumnwidth}[2]% #1=new column type, #2=l/c/r
{\expandafter\newlength\csname Width#1\endcsname%
\AtEndDocument{\saveWidth{#1}}%
\newcolumntype{#1}{>{\savebox{\tempbox}\bgroup}{#2}<{\egroup%
\ifdim\wd\tempbox>\csname Width#1\endcsname \global\csname Width#1\endcsname=\wd\tempbox\fi%
\makebox[\csname Width#1\endcsname][#2]{\usebox\tempbox}}}}
\newcolumnwidth{A}{l}
\newcolumnwidth{B}{c}
\newcolumnwidth{C}{r}
答案2
我要采用的方法与在环境中执行的方法类似tabbing
。设置第一行来定义制表位,然后设置\kill
该行以使其不显示。后续行将使用这些制表位,而无需第一行。
\documentclass{article}
\begin{document}
\noindent
\begin{tabular}{l c r}
left & center & right \\
wide left & wide center & wide right
\end{tabular}
\medskip
Some text here.
\medskip
\noindent
\begin{tabular}{l c r}
\phantom{wide left} &
\phantom{wide center} &
\phantom{wide right} \\[-\normalbaselineskip]% Similar to \kill
left & center & right
\end{tabular}
\end{document}
上例中的“\kill
行”将两个表格中最宽的元素放置在 内\phantom
,而行的高度则使用 形式的换行符删除\\[-\normalbaselineskip]
。
如果要隐藏的内容很高,请使用\hphantom
。如果你担心垂直线的过度打印,请不要使用它们(正如 awesome 所建议的那样booktabs
)或使用以下方法将每个列元素插入“\kill
行”中\multicolumn{1}{l}{...}
没有垂直规则。