问题

问题

问题

我想创建一个具有精确宽度的表格。所以我想使用环境 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}

结果1

第一印象:左侧 vline 与表格边框不对齐。如你所见,我首先尝试手动删除所有 \tabcolseps (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}

结果2

垂直线的左对齐似乎被自动纠正了,很好。遗憾的是,这并没有真正改善整体结果:在右侧,出现了同样的问题。(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}

结果3

这在某些方面做得更好(例如右 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}

在此处输入图片描述

相关内容