我使用p
列类型来强制表格列的宽度。但是,表格的总宽度变得大于文本宽度。以下是 MWE:
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1-5]
\begin{tabular}{|p{.3\textwidth}|p{.45\textwidth}|p{.125\textwidth}|p{.125\textwidth}|}
\hline
a & b & c & d\\ \hline
\end{tabular}
\end{document}
问题的根源在于p
设置内容宽度而没有考虑列之间的空间?
答案1
有三个因素你没有考虑到。
段落缩进
柱间空间
规则宽度(如果您使用
array
)
或许
\usepackage{calc}
进而
\noindent
\begin{tabular}{
|p{.3\textwidth-2\tabcolsep}|
p{.45\textwidth-2\tabcolsep}|
p{.125\textwidth-2\tabcolsep}|
p{.125\textwidth-2\tabcolsep}|
}
可以。或者您可能希望进一步缩小较宽的列。请记住,\tabcolsep
每列的两侧都有宽阔的空间。
请注意,如果你正在使用该array
包,则上述代码应变为
\noindent
\begin{tabular}{
|p{.3\textwidth-2\tabcolsep-2\arrayrulewidth}|
p{.45\textwidth-2\tabcolsep-\arrayrulewidth}|
p{.125\textwidth-2\tabcolsep-\arrayrulewidth}|
p{.125\textwidth-2\tabcolsep-\arrayrulewidth}|
}
有五条规则需要注意;根据 LaTeX 手册,最左边的规则在逻辑上属于第一列;其他规则属于它们前面的列。
答案2
您无需自己计算列宽,只要加载包tabularx
并使用该包的X
列类型,就可以让 LaTeX 来处理该工作。
如果列宽与文本块宽度的比率为0.45
、0.3
、0.125
和0.125
,则以下设置将实现您的目的。要记住的唯一“规则”是\hsize
s 的总和必须等于列数——4
在您给出的示例中。要设置相对列宽,只需将上面给出的比率乘以4
。
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\noindent
\begin{tabularx}{\textwidth}{|%
>{\hsize=1.8\hsize}X|
>{\hsize=1.2\hsize}X|
>{\hsize=0.5\hsize}X|
>{\hsize=0.5\hsize}X|}
\hline
a & b & c & d \\
\hline
\end{tabularx}
\end{document}
如果你对细节感到好奇:如果表格应该占据文本块的宽度(即,如果它的宽度为\textwidth
),有n
列(此处:n=4
),并且列由垂直规则分隔,则表格的可用的宽度为\textwidth-2n\tabcolsep-(n+1)\arrayrulewidth
。tabularx
然后环境根据0.45
、0.3
、0.125
和 的比例分配可用宽度0.125
。(为了获得实际的列宽,添加2\tabcolsep
到列的可用的宽度。)