我希望创建一个始终横跨整个页面宽度的表格。列需要分别占页面宽度的 20% 和 80%。它们需要独立于\arrayrulewidth
和\tabcolsep
,即它们的宽度需要动态计算。第一行应该是使用命令创建的标题行\multicolumn
。除了看起来不错之外,这还为我提供了“硬编码”的全页宽度,因为如果没有它,表格会缩小以适应其内容。
此代码是更大模板的一部分,该模板包含一个自定义命令,该命令通过可选参数用键值对填充表。我将自定义命令剥离到以下 MWE。长度\twocoltablewidth
是几个小时摆弄\linewidth
和\textwidth
其他计算的结果。
\documentclass{book}
\usepackage[table]{xcolor}
\usepackage{parskip}
\usepackage[a4paper,showframe]{geometry}
\begin{document}
Textwidth: \the\textwidth
Linewidth: \the\linewidth
Helper lines:
\rule{\textwidth}{0.4pt}
\rule{\linewidth}{0.4pt}
\begin{table}[htb]
\newlength{\twocoltablewidth}
\setlength{\twocoltablewidth}{\dimexpr\linewidth-2\tabcolsep-2\arrayrulewidth\relax}
\begin{tabular}{|p{0.20\dimexpr\twocoltablewidth-\tabcolsep\relax}|p{0.80\twocoltablewidth}|}
\hline
\multicolumn{2}{|p{\twocoltablewidth}|}{\cellcolor{yellow}{Title}\hfill{ID}} \\
\hline
\cellcolor{gray}\textit{\hfill \textit{Linewidth}} & \the\linewidth \\
\cellcolor{gray}\textit{\hfill \textit{Textwidth}} & \the\textwidth \\
\cellcolor{gray}\textit{\hfill \textit{Twocoltablewidth}} & \the\twocoltablewidth \\
\hline
\end{tabular}
\end{table}
\end{document}
该表如下所示(showframe
用于视觉辅助)。
当我现在添加@{}
垂直中心线来抑制边距时,表格不再溢出,但看起来不太吸引人,因为第一列现在溢出到第二列。
解决方法
\begin{tabular}{|p{0.20\dimexpr\twocoltablewidth-\tabcolsep\relax}@{}|@{}p{0.80\twocoltablewidth}|}
我尝试过省略\twocoltablewidth
、减去\tabcolsep
和的数量\arrayrulewidth
,以及在其他环境中包装整个表格以强制其在页面范围内。我还没有找到适合我的解决方案。我做错了什么?tabularx
不幸的是,我没有选择切换到其他软件包;我唯一的选择是longtable
。
答案1
当使用 2 列时,表格环境的总宽度为1\linewidth
加上4\tabcolsep
,其中\tabcolsep
是在列前后插入的空间(默认值:6pt),加上 ,3\arrayrulewidth
因为有 3 个垂直条。
表格的标题作为单列,具有
\linewidth-2\tabcolsep-2\arrayrulewidth
您已设置的可用宽度。
请参阅代码后的两个示例。
\documentclass{book}
\usepackage[table]{xcolor}
\usepackage{parskip}
\usepackage[a4paper,showframe]{geometry}
\newlength{\twocoltablewidth}
\begin{document}
Textwidth: \the\textwidth
Linewidth: \the\linewidth
Helper lines:
\rule{\textwidth}{0.4pt}
\rule{\linewidth}{0.4pt}
\begin{table}[htb]
\setlength{\twocoltablewidth}{\dimexpr\linewidth-2\tabcolsep-2\arrayrulewidth\relax}
\begin{tabular}{|p{0.20\dimexpr\twocoltablewidth-\tabcolsep\relax}|p{0.80\twocoltablewidth}|}
\hline
\multicolumn{2}{|p{\twocoltablewidth}|}{\cellcolor{yellow}{Title}\hfill{ID}} \\
\hline
\cellcolor{gray}\textit{\hfill \textit{Linewidth}} & \the\linewidth \\
\cellcolor{gray}\textit{\hfill \textit{Textwidth}} & \the\textwidth \\
\cellcolor{gray}\textit{\hfill \textit{Twocoltablewidth}} & \the\twocoltablewidth \\
\hline
\end{tabular}
\end{table}
\bigskip
\begin{table}[htb]
\setlength{\twocoltablewidth}{\dimexpr\linewidth-2\tabcolsep-2\arrayrulewidth\relax}
\begin{tabular}{|p{\dimexpr0.3\linewidth-2\tabcolsep-1.5\arrayrulewidth\relax}|p{\dimexpr0.70\linewidth-2\tabcolsep-1.5\arrayrulewidth\relax}|}
\hline
\multicolumn{2}{|p{\twocoltablewidth}|}{\cellcolor{blue!20}{Title}\hfill{ID}} \\
\hline
\cellcolor{gray}\hfill \textit{Linewidth} & \the\linewidth \\
\cellcolor{gray}\hfill \textit{Textwidth} & \the\textwidth \\
\cellcolor{gray}\hfill \textit{Twocoltablewidth} & \the\twocoltablewidth \\
\cellcolor{gray}\hfill \textit{tabcolsep} & \the\tabcolsep \\
\cellcolor{gray}\hfill \textit{arrayrulewidth} & \the\arrayrulewidth \\
\hline
\end{tabular}
\end{table}
\bigskip
\begin{table}[htb]
\setlength{\arrayrulewidth}{3pt}
\setlength{\tabcolsep}{12pt}
\setlength{\twocoltablewidth}{\dimexpr\linewidth-2\tabcolsep-2\arrayrulewidth\relax}
\begin{tabular}{|p{\dimexpr0.25\linewidth-2\tabcolsep-1.5\arrayrulewidth\relax}|p{\dimexpr0.75\linewidth-2\tabcolsep-1.5\arrayrulewidth\relax}|}
\hline
\multicolumn{2}{|p{\twocoltablewidth}|}{\cellcolor{green!10}{Title}\hfill{ID}} \\
\hline
\cellcolor{gray}\hfill \textit{Linewidth} & \the\linewidth \\
\cellcolor{gray}\hfill \textit{Textwidth} & \the\textwidth \\
\cellcolor{gray}\hfill \textit{Twocoltablewidth} & \the\twocoltablewidth \\
\cellcolor{gray}\hfill \textit{tabcolsep} & \the\tabcolsep \\
\cellcolor{gray}\hfill \textit{arrayrulewidth} & \the\arrayrulewidth \\
\hline
\end{tabular}
\end{table}
\end{document}