为什么 tabular 中的 \nobreak 会断行?

为什么 tabular 中的 \nobreak 会断行?

我有一张这样的桌子:

\documentclass{article}
\begin{document}

\begin{tabular}{rp{1cm}}%
  1&\nobreak\hfill\rlap{9}\\
  1&a\nobreak\hfill\rlap{9}
\end{tabular}

\end{document}

编译后的结果如下:

在此处输入图片描述

如果我明确添加,为什么会发生这种情况\nobreak

我的第一个想法是,也许当启动表格单元格时,TeX 处于垂直模式,然后会\nobreak产生不同的效果,但后来我尝试了这个:

\documentclass{article}
\begin{document}

\begin{tabular}{rp{1cm}}%
  1&\ifvmode v\else h\fi\nobreak\hfill\rlap{9}\\
  1&a\nobreak\hfill\rlap{9}
\end{tabular}

\end{document}

编译结果为:

在此处输入图片描述

这表明 TeX水平模式。或者是排版触发了水平模式h(我知道这没有意义)。或者 TeX 处于薛定谔模式 :)

答案1

在列的开头,ptex 处于垂直模式,因此\nobreak(这实际上是普通的 tex,不能在 latex 中使用)将向垂直列表添加惩罚,以防止中断(如果您使用了,\nolinebreak行为会有所不同)

在单元格开头进行的测试\ifvmode不会按预期执行,因为您会获得相同的值,l或者p单元格或数组数学单元格,因为扩展发生在 tex 正在寻找\omit\multicolumn)时,因此它会为所有单元格提供相同的答案tex 决定为列插入隐式 parbox p。(将其&\ifvmode与触发列模板插入的&\relax\ifvmode位置进行比较,然后您就可以区分 h 模式列和 v 模式列。)relaxcp

您看到的垂直偏移是因为在列的开始p处有一个\everypar添加的设置\strut(具有正常表格支柱的高度但没有深度),所以如果段落是通过正常段落材料开始的,那么这种方法很有效,但是a如果您使用 tex 原始框(例如\rlap不开始段落的框),则效果会更差。

相关内容