在水平模式下,是否有可靠的方法可以知道当前段落是属于主垂直列表还是属于框(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}