为了消除这个问题,我已经用零 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>]
,也可以使用两种全局方法解决此问题:
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}
结果如下: