介绍

介绍

如果类型为 的表格列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 变成水平框而不是垂直框,因此我得到的是零宽度水平空间而不是非零高度垂直空间,但我不确定。我想了解发生了什么。所以我有几个密切相关的问题:

  1. 我对 whatsis 框的方向的解释正确吗?
  2. 为什么这个盒子的高度似乎不为零?是什么决定了高度,或者如果虚假的垂直空间不是由盒子引起的,那么是什么导致了它?
  3. 为什么array包装会有区别?
  4. 这里有一个正确的解决方案吗leavevmode\write在 LaTeX 表格单元格的开头)?

答案1

因此,扩展@GustavoMezzetti(我感谢他)的建议,这里有一个解释。我将在这篇文章中引用和解释 TeX Book。

介绍

让我们开始了解没有 会发生什么array,即在基本的 TeX/LaTeX 级别。正如 Gustavo 所建议的,该p列是使用 创建的vtop

首先我们必须考虑vtop的兄弟vbox。请注意vbox是一个垂直框(包含其他框),其基线与最后一个盒子里面vtop有一个类似的结构,但基线与第一个盒子在它里面。

TeX 必须对垂直材质进行某种计算,因为它具有该方向的尺寸(高度和深度),与水平框时的单一宽度相反。

垂直盒

因此,TeX 在构建时vbox主要关注的是确定其深度,以便使其基线与其内部的最后一个(从顶部开始)框相同。以下是 TeX 在确定这一点时采取的步骤:

  1. 如果里面没有盒子那么vbox它的深度d0pt
  2. 如果至少有一个框,但其后跟有字距调整或粘连,“中间可能有惩罚或其他东西”(原文如此),则深度d0pt
  3. 如果至少有一个框和最后的其中没有紧跟或粘连,则深度d设置为等于该框的深度

笔记:存在最大深度值boxmaxdepth(其默认值为 16384pt),深度不能超过该vbox值。如果上面计算的深度大于该量,\boxmaxdepth则深度设置为,高度相应增加(实际上这相当于将基线向下移动以遵守深度规则)。

最高速度

现在,当 TeX 关注时vtops,它会搜索如何将垂直框基线与其内部的第一个框对齐,因此它将关注高度框。它进行以下步骤:

  1. vbox按照上述规则制作一个。设dh为其深度和高度
  2. 最终高度x计算如下:
    1. 如果第一个元素vbox不是盒子,那么高度是0pt
    2. 否则高度将是第一个框的高度

现在vtop通过移动vbox参考点来构建,以便最终高度x在点 2 中计算,并且最终的盒子深度将是h+d-x

我们的案例

现在问题已经很明显了:当\writethis在列的开头使用 时pvtop步骤 2 中的构造会将heightvbox设置为0pt,因此其参考点将位于其最顶部,从而打乱对齐。从概念上讲,所有内容都在其深度中,低于基线。

大批

array包将一个支柱放置在表格单元格内。它的高度约为8.4pt,没有设置深度。hbox包含字符的法线的高度约为6.9pt,深度约为3.6pt。因此,虽然在上一个(无支柱)示例中,(由于 而进行的预重新排列)的h+是 ~ ,但当支柱发挥作用时,它会增加到 ~ (支柱高度加上深度)。但是,重新排列后,生成的框的总高度仍然为 ,因为它的第一个元素不是框:这为您提供了额外的空间。dvboxvtop10.5pt12pthboxvtop0pt

相关内容