![介绍](https://linux22.com/image/335072/%E4%BB%8B%E7%BB%8D.png)
如果类型为 的表格列p
(或一些其他类型,如 tabularx 的X
)以 开头write
(例如因为它以 开头\index
),则会插入一些垂直空间。MWE:
\documentclass{article}
%\usepackage{array}
\newcommand{\writethis}{\write 1{}}
\begin{document}
\begin{tabular}{lp{4em}}
\hline
middle &o\writethis k\\ \hline
start &\writethis foo\\ \hline
end &foo\writethis \\ \hline
alone &\writethis \\ \hline
\end{tabular}
\end{document}
“start” 行在“foo” 上方有一些额外的垂直空间。如果array
包已加载,“alone” 框也具有额外的垂直空间。
我理解部分情况,但不是全部。该\write
命令插入一个 whatsis,这是一种框;当该框由输出例程“排版”时,它会导致数据写入文件,没有任何视觉效果。没有视觉效果——除非不知何故这会导致排版一个高度非零的框。
我有一个针对我的用例的解决方案:\leavevmode
在 之前添加\write
。我思考这导致 whatsis 变成水平框而不是垂直框,因此我得到的是零宽度水平空间而不是非零高度垂直空间,但我不确定。我想了解发生了什么。所以我有几个密切相关的问题:
- 我对 whatsis 框的方向的解释正确吗?
- 为什么这个盒子的高度似乎不为零?是什么决定了高度,或者如果虚假的垂直空间不是由盒子引起的,那么是什么导致了它?
- 为什么
array
包装会有区别? - 这里有一个正确的解决方案吗
leavevmode
(\write
在 LaTeX 表格单元格的开头)?
答案1
因此,扩展@GustavoMezzetti(我感谢他)的建议,这里有一个解释。我将在这篇文章中引用和解释 TeX Book。
介绍
让我们开始了解没有 会发生什么array
,即在基本的 TeX/LaTeX 级别。正如 Gustavo 所建议的,该p
列是使用 创建的vtop
。
首先我们必须考虑vtop
的兄弟vbox
。请注意vbox
是一个垂直框(包含其他框),其基线与最后一个盒子里面vtop
有一个类似的结构,但基线与第一个盒子在它里面。
TeX 必须对垂直材质进行某种计算,因为它具有二该方向的尺寸(高度和深度),与水平框时的单一宽度相反。
垂直盒
因此,TeX 在构建时vbox
主要关注的是确定其深度,以便使其基线与其内部的最后一个(从顶部开始)框相同。以下是 TeX 在确定这一点时采取的步骤:
- 如果里面没有盒子那么
vbox
它的深度d
是0pt
- 如果至少有一个框,但其后跟有字距调整或粘连,“中间可能有惩罚或其他东西”(原文如此),则深度
d
为0pt
- 如果至少有一个框和最后的其中没有紧跟或粘连,则深度
d
设置为等于该框的深度
笔记:存在最大深度值boxmaxdepth
(其默认值为 16384pt
),深度不能超过该vbox
值。如果上面计算的深度大于该量,\boxmaxdepth
则深度设置为,高度相应增加(实际上这相当于将基线向下移动以遵守深度规则)。
最高速度
现在,当 TeX 关注时vtops
,它会搜索如何将垂直框基线与其内部的第一个框对齐,因此它将关注高度框。它进行以下步骤:
vbox
按照上述规则制作一个。设d
和h
为其深度和高度- 最终高度
x
计算如下:- 如果第一个元素
vbox
不是盒子,那么高度是0pt
- 否则高度将是第一个框的高度
- 如果第一个元素
现在vtop
通过移动vbox
参考点来构建,以便最终高度x
在点 2 中计算,并且最终的盒子深度将是h+d-x
我们的案例
现在问题已经很明显了:当\writethis
在列的开头使用 时p
,vtop
步骤 2 中的构造会将height
的vbox
设置为0pt
,因此其参考点将位于其最顶部,从而打乱对齐。从概念上讲,所有内容都在其深度中,低于基线。
大批
该array
包将一个支柱放置在表格单元格内。它的高度约为8.4pt
,没有设置深度。hbox
包含字符的法线的高度约为6.9pt
,深度约为3.6pt
。因此,虽然在上一个(无支柱)示例中,(由于 而进行的预重新排列)的h
+是 ~ ,但当支柱发挥作用时,它会增加到 ~ (支柱高度加上深度)。但是,重新排列后,生成的框的总高度仍然为 ,因为它的第一个元素不是框:这为您提供了额外的空间。d
vbox
vtop
10.5pt
12pt
hbox
vtop
0pt