我想解决一个问题,需要用表格来说明。我已经设法用一种非常麻烦的方式解决了这个问题,但我认为也必须有一种“聪明”的方式。我目前的解决方案非常脆弱,因为它依赖于尺寸等。
我想要的(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
由于几乎每一行都使用不同的列宽,因此我使用了\makebox
es。关键是提前知道最宽行的宽度。
您可以在多个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}