具有多列的表格

具有多列的表格

我想解决一个问题,需要用表格来说明。我已经设法用一种非常麻烦的方式解决了这个问题,但我认为也必须有一种“聪明”的方式。我目前的解决方案非常脆弱,因为它依赖于尺寸等。

我想要的(ASCII 样式):

-----------------------------
|       Concept 1           |   <--- bold heading
-----------------------------
| C11  |   C12   |   C13    |   <--- three items in this row
-----------------------------   <--- in current solution, bot tab 1 and top tab 2
|  C2   |   |     C4        |   <--- bold heading
--------| C3|----------------   <--- C3 takes two lines, since no subconcepts
|C21|C22|   |C41|C42|C43|C44|   <--- seven items in this row
-----------------------------   <--- in current solution, bot tab 2 and top tab 3
|       Concept 5           |   <--- bold heading
-----------------------------
| C51  |   C52   |   C53    |
-----------------------------

我已将上面的空间缩写。C2 => 概念 2,C11 => 概念 1 第 1 部分,等等。

上面的 ASCII 表是我所希望的。现在我已解决了这个问题,方法是创建一个table包含三个表格的环境,并尝试使用 parskips 使其看起来像一个表格。

概念 2、3 和 4 属于一起,所以我不想改变位置。

我猜想这可以在一个有 21 列的表格中实现(即 7*3 来表示可能的位置),并用于multicol所有内容。但肯定有更好的方法吧?

包裹等并不重要,但如果能将其编译成回忆录文档就更好了。

当前解决方案的伪代码:

begin{table}
  begin{tabularx}{*{3}{c}}
    multicol{3}{Concept 1} \\
    C11 & C12 & C13 \\
  end{tabularx}
  % Magic \par\vskip 
  begin{tabularx}{*{7}{c}}
    multicol{1}{Concept 2} & multirow{*}{2}{Concept 3} & multicol{4}{Concept 4} \\
    C21 & C21 & & C41 & C42 & C43 & C44 \\
  end{tabularx}
  % Magic \par\vskip
  begin{tabularx}{*{3}{c}}
    multicol{3}{Concept 5} \\
    C51 & C52 & C53 \\
  end{tabularx}
end{table}

答案1

应该有一些事情是 LaTeX 做不到的,这是其中之一。

在此处输入图片描述

\documentclass{article}
\let\xx\bfseries
\usepackage{array,tabulary,tabularx,multirow}
\newcolumntype{Y}{>{\arraybackslash\centering}X}
\renewcommand\arraystretch{1.4}
\begin{document}
\begin{tabulary}{\linewidth}{|c|c|c|}\hline
\multicolumn{3}{|c|}{\xx Concept 1}\\\hline
\multicolumn{3}{|c|}{\begin{tabularx}{\linewidth}{Y|Y|Y} 
C11 & C12 & C13 \end{tabularx}}\\\hline
\xx C2 & \multirow{2}{*}{\xx C3} & \xx C4 \\\cline{1-1}\cline{3-3}
\begin{tabularx}{.4\linewidth}{Y|Y} C21 & C22 \end{tabularx} 
& &
\begin{tabularx}{.5\linewidth}{Y|Y|Y|Y} 
C41 & C42 & C43 & C44 \end{tabularx} \\\hline
\multicolumn{3}{|c|}{\xx Concept 5}\\\hline
\multicolumn{3}{|c|}{\begin{tabularx}{\linewidth}{Y|Y|Y} 
C51 & C52 & C53 \end{tabularx}}\\\hline
\end{tabulary}
\end{document}

答案2

由于几乎每一行都使用不同的列宽,因此我使用了\makeboxes。关键是提前知道最宽行的宽度。

您可以在多个tabularx环境中执行此操作,它会同样繁忙。

\documentclass{article}
\usepackage{multirow}
\begin{document}
\begin{table}
  \sbox0{\begin{tabular}{*7c}% get widest line
    C21 & C21 & Concept 3 & C41 & C42 & C43 & C44 
    \end{tabular}}
  \begin{tabular}{|c|}% wrapper
    \makebox[\wd0]{Concept 1}\\
    \makebox[.333\wd0]{C11}\makebox[.333\wd0]{C12}\makebox[.333\wd0]{C13}\\
    % Magic \par\vskip 
     \begin{tabular}{*7c}
      \multicolumn{2}{c}{Concept 2} & \multirow{2}{*}{Concept 3} & \multicolumn{4}{c}{Concept 4} \\
      C21 & C21 & & C41 & C42 & C43 & C44 \\
     \end{tabular}\\
    \makebox[\wd0]{Concept 5}\\
    \makebox[.333\wd0]{C51}\makebox[.333\wd0]{C52}\makebox[.333\wd0]{C13}\\
  \end{tabular}
\end{table}
\end{document}

演示

相关内容