表格中的文字和行之间的间隙

表格中的文字和行之间的间隙

为了消除这个问题,我已经用零 fboxsep 对 shortstack 进行了 fboxed:

\documentclass[a4paper,11pt]{extarticle}
\usepackage{array}
\begin{document}

\newcommand{\mystr}{9:00\\10:30}

\setlength{\fboxsep}{0pt}

\begin{tabular}{m{5mm}|m{15mm}|m{5mm}}
  &&\\\hline
  &\fbox{\bf\shortstack{\mystr}}&\\\hline
  &&\\%
\end{tabular}
\end{document}

并得到结果: 在此处输入图片描述 那么问题是:短堆底部和行分隔线之间的间隙的本质是什么?以及如何避免这种间隙?

答案1

中间单元格只有一行带方框。也就是说,对于 LaTeX 来说,堆叠的文本就像一个巨大的字符。事实上,带有 的单元格的问题完全相同\huge X。请记住,任何字符都是一个方框,并且方框的管理方式与字符相同。

表格行始终具有最小的垂直空间,以确保任何普通字体都能完美适配,无论字符是否有升部(如“f”)、降部(如“g”)或无(如“m”),或者只是小点。如您所知,它们不像绘图程序中的矢量对象那样在行的顶部、底部或中间对齐,而是在基线(MWE 中的红线)上对齐,其中大多数字母“位于”此基线中,除了那些有降部的字母:

姆韦

仅具有总高度和宽度的 2D 框无法做到这一点,因此 TeX 框是具有宽度、高度(基线之上)和深度(基线之下的高度)的伪 3D 矩形。也就是说,高度 + 深度就是我们看到的总高度。

如果表格行中有一个框的高度或深度高于正常字体,那么 TeX 会腾出空间来容纳一个或两个尺寸,但不幸的是,空间不足以避免与顶部或底部线条或两者发生碰撞。请注意,在 MWE 中,中等大小的“p”可以接触到两条线,而巨大的“X”无论有多大都无法接触到底部线条,因为 X 的深度始终为0pt

在您的例子中,\shortstack框的高度只显著增加,就像一个巨大的“X”一样,因此触及顶线,但深度保持不变,因此您的底部间隙只是为下行保留的默认空间。如果您在同一个\shortstack框中添加最后一个“p”,则明显的间隙会大大减少。

因此,虽然视觉上不美观,但您的底部间隙是正确的。真正的问题是盒子上方缺少填充\shortstack。您可以使用本地方法解决此问题\\[<length>],也可以使用两种全局方法解决此问题:

mwe2

1)用 稍微增加行高\extrarowheight

2) 使用数组拉伸因子 ( \arraystretch) 更改最小垂直空间,默认情况下为 1,这意味着按比例增加高度和深度。在较低的值下可能会产生奇怪或类似的结果,\extrarowheight但这会产生底部对齐的效果,而\arraystretch当值小于 1 时,往往会实现平衡的垂直填充(或平衡的填充不足)。

上图完整代码:

\documentclass[a4paper,11pt]{extarticle}
\usepackage{array,xcolor}
\newcommand\mystr{\colorbox{cyan!50}{\bfseries\shortstack{9:00\\10:30}}}
\newcommand\mystrpm{\colorbox{orange!50}{\bfseries\shortstack{9:00pm\\10:30pm}}}
\newcommand\baseline{\leavevmode\rlap{\color{red!50}\rule{.3\textwidth}{.4pt}}}
\setlength{\parskip}{1em}
\setlength{\fboxsep}{0pt}

\newlength\myhe
\settoheight{\myhe}{X}
\newlength\myde
\settodepth{\myde}{p}
\newlength\myhede
\setlength{\myhede}{\dimexpr\myhe+\myde}

\begin{document}

\twocolumn[\centering
\begin{tabular}{m{3mm}||m{20mm}|m{3mm}}\hline
\baseline x & \fbox{x} x x x &  x \\\hline
\baseline . & \fbox{.} . . . &  . \\\hline
\baseline x & \fbox{h} h \fbox{g} g &  x \\\hline
\baseline x & \baseline h \fbox{\Huge X} &  x \\\hline
\baseline x & \baseline\fbox{h} h \fbox{\huge p} &  x \\\hline
\end{tabular}\bigskip]

{\Large\bfseries \verb|\extrarowheight|}

 +0pt (default) \par 

%\setlength{\extrarowheight}{0pt} % default
\begin{tabular}{m{3mm}||m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \baseline\hfil\mystr &  x \\\hline
\baseline x & \baseline\hfil\mystrpm &  x \\\hline
\end{tabular} 

-\the\numexpr\number\myde/65536\relax pt (-depth)\par

\setlength{\extrarowheight}{\dimexpr-\myde} 
\begin{tabular}{m{3mm}|m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \hfil\mystr &  x \\\hline
\baseline x & \hfil\mystrpm &  x \\\hline
\end{tabular} 

+\the\numexpr\number\myhe/65536\relax pt (heigth)\par

\setlength{\extrarowheight}{\myhe} 
\begin{tabular}{m{3mm}|m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \hfil\mystr &  x \\\hline
\baseline x & \hfil\mystrpm &  x \\\hline
\end{tabular} 

+\the\numexpr\number\myhede/65536\relax pt (heigth + depth)\par

\setlength{\extrarowheight}{\dimexpr\myhe+\myde} 
\begin{tabular}{m{3mm}|m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \hfil\mystr &  x \\\hline
\baseline x & \hfil\mystrpm &  x \\\hline
\end{tabular} 

\newpage
{\Large\bfseries \verb|\arraystretch|}

\setlength{\extrarowheight}{0pt} % return to default

0 (no default space)\par 
\renewcommand\arraystretch{0}
\begin{tabular}{m{3mm}|m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \hfil\mystr &  x \\\hline
\baseline x & \hfil\mystrpm &  x \\\hline
\end{tabular} 

$\times1$ (default)\par 
\renewcommand\arraystretch{1}
\begin{tabular}{m{3mm}|m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \hfil\mystr &  x \\\hline
\baseline x & \hfil\mystrpm &  x \\\hline
\end{tabular} 

$\times2$ \par 
\renewcommand\arraystretch{2}
\begin{tabular}{m{3mm}|m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \hfil\mystr &  x \\\hline
\baseline x & \hfil\mystrpm &  x \\\hline
\end{tabular} 

$\times2.5$ \par 
\renewcommand\arraystretch{2.5}
\begin{tabular}{m{3mm}|m{20mm}|m{3mm}}\hline
\baseline . & ... &  . \\\hline
\baseline x & \hfil\mystr &  x \\\hline
\baseline x & \hfil\mystrpm &  x \\\hline
\end{tabular} 


\end{document}

答案2

strut高度的表格通常有一个底部0.9ex。因此,您需要通过发布来补偿此高度\\[\dimexpr-.9ex+.4pt],而额外的部分0.4pt是厚度\fboxrule。我添加了第三行以查看删除该行的效果0.9ex

\documentclass[a4paper,11pt]{extarticle}
\usepackage{array}
\begin{document}

\newcommand{\mystr}{9:00\\10:30}
\setlength{\fboxsep}{0pt}

\begin{tabular}{m{5mm}|m{15mm}|m{5mm}}
  &&\\\hline
  &\fbox{\bf\shortstack{\mystr}}&\\[\dimexpr-.9ex+.4pt] \hline
  &here&\\[-.9ex]\hline%
\end{tabular}
\end{document}

在此处输入图片描述

但是,还有一种替代/更简单的解决方案,使用parbox

\documentclass[a4paper,11pt]{extarticle}
\usepackage{array}
\begin{document}

\setlength{\fboxsep}{0pt}

\begin{tabular}{m{5mm}|m{15mm}|m{5mm}}
  &&\\\hline
  &\fbox{\parbox{15mm}{\centering\bfseries9:00\\10:30}}& \\ \hline
  &&\\%
\end{tabular}
\end{document}

结果如下:

在此处输入图片描述

相关内容