我想创建一个具有以下特定结构的表:
| b | c | d |
| f | g |
因此,基本上,表格中有一条线被切成两半,第二条线被切成三分之一。
我尝试将表格设为 6 列,并使用 \multicolumn 将 2 或 3 个较小的单元格合并为较大的单元格,但不起作用。原因似乎是没有包含全部 6 列的行,但我不知道如何解决这个问题。
另外,我希望表格的整体宽度能够灵活调整,以便适应单元格中的文本。
编辑:下面我提供了一个完全符合我要求的表格。我尝试将其简化为我面临的问题的核心,但显然这是一个错误,因为它产生的问题比解决的问题还多。对此深表歉意。注意:每个内容都应位于其单元格的中心。
| OSI-Schicht | Umsetzung |
----------------------------------------------------------------
----------------------------------------------------------------
| Anwendungsschicht | | | |
-------------------------- | | |
| Darstellungsschicht | SOME/IP | AVB/TSN | DoIP |
-------------------------- | | |
| Sitzungsschicht | | | |
----------------------------------------------------------------
| Transportschicht | TCP | UDP |
----------------------------------------------------------------
| Vermittlungsschicht | IPv4 | IPv6 |
----------------------------------------------------------------
| Sicherungsschicht | Ethernet |
----------------------------------------------------------------
| Bitübertragungsschicht | 100BASE-TX | 100BASE-T1 | 1000BASE-T |
----------------------------------------------------------------
答案1
我建议首先确定表格的列宽(最低要求):
实际上,最简单的方法是从 2 列单元格的宽度开始:此宽度必须等于最长字符串的宽度,而最长字符串恰好是“100BASE-TX”。(“1000BASE-T”字符串稍短一些。)将此宽度称为
\lenb
。(潜在的)单列单元格的宽度(称为
\lena
)是通过求解6\lena + 12\tabcolsep + 6\arrayrulewidth = 3\lenb + 6\tabcolsep + 3\arrayrulewidth
为了
\lena
:\lena=0.5\lenb-\tabcolsep-\arrayrulewidth/2
。类似地,三列单元格的宽度(称为
\lenc
)可以通过求解3\lenb + 6\tabcolsep + 3\arrayrulewidth = 2\lenc + 4\tabcolsep + 2\arrayrulewidth
为了
\lenc
:\lenc=1.5\lenb+\tabcolsep+\arrayrulewidth/2
。
一旦获得三个(最小)长度,就可以轻松设置整个tabular
环境。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{array,calc}
\newlength\lena \newlength\lenb \newlength\lenc
\settowidth{\lenb}{100BASE-TX}
\setlength{\lena}{\dimexpr0.5\lenb-\tabcolsep-\arrayrulewidth/2\relax}
\setlength{\lenc}{\dimexpr1.5\lenb+\tabcolsep+\arrayrulewidth/2\relax}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}} % centered "p" column
\newcommand\mcii[1]{\multicolumn{2}{P{\lenb}|}{#1}} % handy shortcut macros
\newcommand\mciii[1]{\multicolumn{3}{P{\lenc}|}{#1}}
\begin{document}
\begin{table}[ht!]
\setlength\extrarowheight{2pt}
\centering
\begin{tabular}{|l|*{6}{p{\lena}|}}
\hline
OSI-Schicht & \multicolumn{6}{c|}{Umsetzung}\\
\hline\hline
Anwendungsschicht & \mcii{} & \mcii{} & \mcii{} \\
\cline{1-1}
Darstellungsschicht & \mcii{SOME/I} & \mcii{AVB/TSN} & \mcii{DoIP} \\
\cline{1-1}
Sitzungsschicht & \mcii{} & \mcii{} & \mcii{} \\
\hline
Transportschicht & \mciii{TCP} & \mciii{UDP} \\
\hline
Vermittlungsschicht & \mciii{IPv4} & \mciii{IPv6} \\
\hline
Sicherungsschicht & \multicolumn{6}{c|}{Ethernet} \\
\hline
Bitübertragungsschicht & \mcii{100BASE-TX} & \mcii{100BASE-T} & \mcii{1000BASE-T} \\
\hline
\end{tabular}
\end{table}
\end{document}
答案2
\documentclass[a4paper]{article}
\usepackage{array}
\begin{document}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\begin{tabular}{|*6{C{2cm}|}} \hline
\multicolumn{2}{|C{4cm}}{b} & \multicolumn{2}{|C{4cm}}{c} & \multicolumn{2}{|C{4cm}|}{d} \\ \hline
\multicolumn{3}{|C{6cm}}{f} & \multicolumn{3}{|C{6cm}|}{g} \\ \hline
\end{tabular}
\end{document}
为方便起见,另一种灵活的方法是使用\tabularx
两个\newcommand
:
\newcommand{\row}[2]{%
\begin{tabularx}{\textwidth}{|X|X|}
#1
\end{tabularx}
}
\newcommand{\rrow}[3]{%
\begin{tabularx}{\textwidth}{|X|X|X|}
#1
\end{tabularx}
}
\begin{tabular}{@{}c@{}}\hline
\rrow{Long text here to test text wrapping in cells}{Long text here to test text wrapping in cells}{Long text here to test text wrapping in cells}\\\hline
\row{Long text here to test text wrapping in cells}{Long text here to test text wrapping in cells}\\\hline
\end{tabular}
基于上述内容,这里有一个完整的解决方案:
\documentclass[a4paper]{article}
\usepackage{tabularx,array,multirow}
\begin{document}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcommand{\xtab}[1]{%
\begin{tabularx}{.7\textwidth}{C}
#1
\end{tabularx}
}
\newcommand{\xxtab}[2]{%
\begin{tabularx}{.7\textwidth}{C|C}
#1
\end{tabularx}
}
\newcommand{\xxxtab}[3]{%
\begin{tabularx}{.7\textwidth}{C|C|C}
#1
\end{tabularx}
}
\begin{tabular}{|l|c|}
\hline
OSI-Schicht & \xtab{Umsetzung} \\ \hline
Anwendungsschicht & \\ \hline
Darstellungsschicht & \xxxtab{ SOME/IP }{ AVB/TSN}{ DoIP } \\ \hline
Sitzungsschicht & \\ \hline
Transportschicht & \xxtab{TCP} {UDP} \\ \hline
Vermittlungsschicht & \xxtab{IPv4} {IPv6} \\ \hline
Sicherungsschicht & \xtab{Ethernet} \\ \hline
Bitübertragungsschicht & \xxxtab{100BASE-TX} {100BASE-T1} {100BASE-T} \\ \hline
\end{tabular}
\end{document}