确定 \lastbox 是否可用

确定 \lastbox 是否可用

在水平模式下,是否有可靠的方法可以知道当前段落是属于主垂直列表还是属于框(vbox 或 vtop)。关键是要知道 、\lastbox\unskip是否\unpenalty可用。我发现的唯一方法是将

\newif\ifinsidebox
\everyvbox\expandafter{\the\everyvbox\insideboxtrue}

在文档开头进行测试\ifinsidebox。但只有当没有人更改时它才有效\everyvbox

更具体地说,我想通过\interlinepenalty在某些nopagebreak环境中临时增加 来避免一些糟糕的分页符。为此,我基本上打破了当前段落,用 取垂直列表的最后一个框\lastbox,设置\interlinepenalty=10000,调整一些段落参数,并通过取消最后一个框的水平装箱来开始一个新段落。在我的环境结束时nopagebreak,我做了同样的事情,恢复了 的值\interlinepenalty。这样做,它似乎没有发生换行。但要使它起作用,我需要在分段之前知道 、\lastbox\unskip是否\unpenalty有效。

答案1

我不认为您可以在 hmode 中真正了解,但您可以将\ifinner测试推迟到您计划执行的任何垂直列表\lastbox,无论是通过\par还是\vadjust通过任何方式进入 vmode。

以下文档删除了小页面段落的最后一行,但没有给出错误,只是在主垂直列表中输出了该段落。

\documentclass{article}
\tracingonline1
\showboxdepth=10
\showboxbreadth=10
\scrollmode
\def\x{one two three four five six }
\def\y{Red \x green \x yellow \x}

\def\lastboxifposible{%
\ifvmode\ifinner
\setbox0=\lastbox
\showbox0
\else
\typeout{no lastbox here}%
\fi\fi}

\begin{document}

\y\par\lastboxifposible

\noindent
\begin{minipage}{\textwidth}
\y\par\lastboxifposible
\end{minipage}

\end{document}

在此处输入图片描述

相关内容