仅包含多列的表格的列宽

仅包含多列的表格的列宽

我想创建一个具有以下特定结构的表:

| 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&#2 
\end{tabularx}
}

\newcommand{\rrow}[3]{%
\begin{tabularx}{\textwidth}{|X|X|X|} 
#1&#2&#3 
\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&#2 
\end{tabularx}
}

\newcommand{\xxxtab}[3]{%
\begin{tabularx}{.7\textwidth}{C|C|C} 
#1&#2&#3 
\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}

在此处输入图片描述

答案3

在具有 Natural Tables 的 ConTeXt MKIV 中这非常容易。

\starttext

\startTABLE
  \NC[nx=2] b \NC[nx=2] c \NC[nx=2] d \NC\NR
  \NC[nx=3] f \NC[nx=3] g \NC\NR
\stopTABLE

\stoptext

在此处输入图片描述

相关内容