问题
我想创建一个具有精确宽度的表格。所以我想使用环境
tabular*
。然后我意识到,这可能比我最初想象的要困难一些。问题在于水平对齐/定位:\tabcolsep
并\arrayrulewidth
更改定位。
没有加载任何附加包
考虑以下:
\documentclass[varwidth=3.5cm,margin=2mm]{standalone}
\setlength{\arrayrulewidth}{.6pt}
\setlength{\tabcolsep}{0pt}
\begin{document}
\textbf{No packages}\par\vspace{5pt}
\begin{tabular*}{14mm}{ |@{} p{7mm} @{}|@{} p{7mm} @{}| } % 1: shifts---because of the vlines
\hline
\hspace{2pt}foo & \hspace{2pt}bar
\end{tabular*} (1)
\par\vspace{5pt}
\verb|\tabcolsep=0pt|\par
\begin{tabular*}{14mm}{ | p{7mm} | p{7mm} | } % 2: default, alignment is correct
\hline
\hspace{2pt}foo & \hspace{2pt}bar
\end{tabular*} (2) default
\begin{tabular*}{14mm}{% 3: manually corrected outer vertical line
@{\kern.5\arrayrulewidth}|@{\kern-\arrayrulewidth}%
p{7mm} | p{7mm}%
@{\kern-.5\arrayrulewidth}| }
\hline
\hspace{2pt}foo & \hspace{2pt}bar
\end{tabular*} (3) fixed1
\par\vspace{5pt}
\verb|\tabcolsep=2pt|\par
\setlength{\tabcolsep}{2pt}
\begin{tabular*}{14mm}{ | p{7mm} | p{7mm} | } % 4: default, alignment is NOT correct
\hline
foo & bar
\end{tabular*} (4) default
\begin{tabular*}{14mm}{% 5: manually corrected with tabcolsep active
@{\kern.5\arrayrulewidth}|%
p{\dimexpr 7mm-2\tabcolsep-.5\arrayrulewidth\relax}%
|%
p{\dimexpr 7mm-2\tabcolsep-.5\arrayrulewidth\relax}%
|}
\hline
foo & bar
\end{tabular*} (5) fixed2
\begin{tabular*}{14mm}{% 6: manually corrected(2) with tabcolsep active
p{\dimexpr 7mm-2\tabcolsep-0 \arrayrulewidth\relax}%
p{\dimexpr 7mm-2\tabcolsep-.5\arrayrulewidth\relax}%
|}
\hline
foo & bar
\end{tabular*} (6) fixed3
\end{document}
第一印象:左侧 vline 与表格边框不对齐。如你所见,我首先尝试手动删除所有
\tabcolsep
s (1)。但这仍然具有 vlines 的宽度。奇怪的是,默认行为\tabcolsep=0pt
确实管理了 vlines 引起的偏移 (2)。可以手动修复难看的外部 vlines(与表格边缘不匹配)(3)。但这仍然存在单元格水平间距的问题。可以在那里放置一个移位的 parbox。对于许多单元格来说,这需要大量工作。因此,最好使用\tabcolsep
。如果我这样做,默认行为如 (4) 所示。无法正常工作,因此必须重新开始修复。奇怪的是,这次必须在修复中考虑 vlines 的宽度 (5)。显然,与 (3) 相比,这是更好的解决方案。但这可能会导致对大表格进行许多手动调整,特别是如果每列之间没有 vlines,因为必须考虑到这一点 (6)。
带包装array
尝试使用其中一个可以改善表格行为的包,我尝试了该array
包:
\documentclass[varwidth=3.5cm,margin=2mm]{standalone}
\usepackage{array}
\setlength{\arrayrulewidth}{.6pt}
\setlength{\tabcolsep}{0pt}
\begin{document}
\textbf{array package}\par\vspace{5pt}
\begin{tabular*}{14mm}{ |@{} p{7mm} @{}|@{} p{7mm} @{}| } % 1: shifts---because of the vlines
\hline
\hspace{2pt}foo & \hspace{2pt}bar
\end{tabular*} (1)
\par\vspace{5pt}
\verb|\tabcolsep=0pt|\par
\begin{tabular*}{14mm}{ | p{7mm} | p{7mm} | } % 2: default, alignment is correct
\hline
\hspace{2pt}foo & \hspace{2pt}bar
\end{tabular*} (2) default
\begin{tabular*}{14mm}{% 3: manually corrected outer vertical line
|@{\kern-\arrayrulewidth}%
p{7mm}%
@{\kern-.5\arrayrulewidth}|@{\kern-.5\arrayrulewidth}%
p{7mm}%
@{\kern-\arrayrulewidth}| }
\hline
\hspace{2pt}foo & \hspace{2pt}bar
\end{tabular*} (3) fixed1
\par\vspace{5pt}
\verb|\tabcolsep=2pt|\par
\setlength{\tabcolsep}{2pt}
\begin{tabular*}{14mm}{ | p{7mm} | p{7mm} | } % 4: default, alignment is NOT correct
\hline
foo & bar
\end{tabular*} (4) default
\begin{tabular*}{14mm}{% 5: manually corrected with tabcolsep active
|%
p{\dimexpr 7mm-2\tabcolsep-1.5\arrayrulewidth\relax}%
|%
p{\dimexpr 7mm-2\tabcolsep-1.5\arrayrulewidth\relax}%
|}
\hline
foo & bar
\end{tabular*} (5) fixed2
\begin{tabular*}{14mm}{% 6: manually corrected(2) with tabcolsep active
p{\dimexpr 7mm-2\tabcolsep-0\arrayrulewidth\relax}%
p{\dimexpr 7mm-2\tabcolsep-1\arrayrulewidth\relax}%
|}
\hline
foo & bar
\end{tabular*} (6) fixed3
\end{document}
垂直线的左对齐似乎被自动纠正了,很好。遗憾的是,这并没有真正改善整体结果:在右侧,出现了同样的问题。(1)与之前相同,但左垂直线已纠正。(2)显示默认行为
\tabcolsep=0pt
。同样,需要手动修复(3)。\tabcolsep
但更好的是使用。默认行为显示在(4)中。这显然也必须修复(5)。这里的情况比没有该arrays
包时更糟糕。为了修复 parbox 宽度,必须考虑该列是否是外列。如果没有使用某些垂直线,情况也不会好转(6)。tabularx
结果看起来很相似。总是需要手动调整。
tabularx 包
\documentclass[varwidth=3.5cm,margin=2mm]{standalone}
\usepackage{tabularx}
\setlength{\arrayrulewidth}{1pt}
\setlength{\tabcolsep}{2pt}
\begin{document}
\textbf{tabularx package}\par\vspace{5pt}
\begin{tabular*}{14mm}{% 1: target layout
|%
p{\dimexpr 7mm-2\tabcolsep-1.5\arrayrulewidth\relax}%
|%
p{\dimexpr 7mm-2\tabcolsep-1.5\arrayrulewidth\relax}%
|}
\hline
foo & bar
\end{tabular*} (1) target
\begin{tabularx}{14mm}{ |X|X| }% default without manual sizing
\hline
foo & bar
\end{tabularx} (2) default1
\begin{tabularx}{14mm}{ |>{\hsize=7mm}X|X| }
\hline
foo & bar
\end{tabularx} (3) default2
\begin{tabularx}{14mm}{ |>{\hsize=\dimexpr7mm-2\tabcolsep-1.5\arrayrulewidth\relax}X|X| }
\hline
foo & bar
\end{tabularx} (4) fixed
\end{document}
这在某些方面做得更好(例如右 vline 始终对齐),但仍然必须根据之前或之后的 vlines 进行手动计算......
默认更正表格?
我想使用正常环境,无需手动调整。例如
\newlength{\mylength}
\def\mylength{-2\tabcolsep-.5\arrayrulewidth}
可以工作,如果我可以让它们对上下文 vlines 敏感。使用
array
,
\newcolumntype{P}[1]{>{\raggedright\arraybackslash}p{\dimexpr#1-2\tabcolsep-\arrayrulewidth\relax}}
如果它能看到周围的垂直线,它几乎可以自动工作。我不想创建大量的列类型并考虑采用哪种类型(外列、内列、被零、一、两条垂直线包围)。
如何无需手动交互即可获得预定义宽度的表格?
答案1
尝试这个简单的代码:
\documentclass[varwidth=3.5cm,margin=2mm]{standalone}
\usepackage{tabularx}
\setlength{\arrayrulewidth}{.6pt}
\setlength{\tabcolsep}{0pt}
\begin{document}
\textbf{tabularx package}\par\vspace{5pt}
\begin{tabularx}{14mm}{ |X|X| }
\hline
\hspace{2pt}foo & \hspace{2pt}bar \\
\hline
\end{tabularx} (1)
\par\vspace{5pt}
\end{document}
答案2
目前还不完全清楚要求是什么,但据我所知,你想要一个有两列相等、三条垂直线且总宽度为 14 毫米的表格,为此我会执行以下操作。
\documentclass{article}
\usepackage{lmodern}
\usepackage{array}
\newlength\zz
\begin{document}
\setlength\zz{\dimexpr 14mm - 4\tabcolsep-3\arrayrulewidth}
\setlength\tabcolsep{2pt}
\fontsize{3.5pt}{4pt}\selectfont
\begin{tabular}{|p{.5\zz}|p{.5\zz}|}
foo &bar\\
zz&zzz
\end{tabular}
\end{document}
答案3
您可以定义一个占用与标准规则相同空间的幻像 vrule。或者反过来定义一个不占用空间的 vrule:
\documentclass{article}
\usepackage{array}
\setlength\arrayrulewidth{4pt} %for better view
\newcolumntype\pvline{!{\hspace{\arrayrulewidth}}}
\newcolumntype\vline{!{\hspace{-0.5\arrayrulewidth}\vrule width \arrayrulewidth\hspace{-0.5\arrayrulewidth}}}
\begin{document}
\begin{tabular}{p{\dimexpr1cm-2\tabcolsep}|p{\dimexpr1cm-2\tabcolsep}}
\hline
blb& blb \\
blb&blbl
\end{tabular}
\begin{tabular}{p{\dimexpr1cm-2\tabcolsep}\pvline p{\dimexpr1cm-2\tabcolsep}}
\hline
blb& blb
\end{tabular}
\bigskip
\begin{tabular}{p{\dimexpr1cm-2\tabcolsep}\vline p{\dimexpr1cm-2\tabcolsep}}
\hline
blb& blb\\
blb&blbl
\end{tabular}
\begin{tabular}{p{\dimexpr1cm-2\tabcolsep} p{\dimexpr1cm-2\tabcolsep}}
\hline
blb& blb
\end{tabular}
\end{document}