如何检测水平盒子过满或不足而不触发警告?

如何检测水平盒子过满或不足而不触发警告?

我需要一个可用于以下用途的 LaTeX 宏:

\IfFull{TEXT}{THEN}{ELSE}

它会在 a 中排版 TEXT \vbox(它会丢弃它),并且如果存在过满的水平盒子或未满的水平盒子,它会运行 THEN,否则它会运行 ELSE。它不会在控制台或日志文件中报告Overfull \hbox或警告。Underfull \hbox

已经有这样的宏了吗?如果没有,如何定义它?

如果这太复杂,那么用一个段落来做就足够了。

最小工作示例,它给出了错误的结果,因为它总是执行#3,但在示例中它应该执行#2

\documentclass{article}
\def\IfFull#1#2#3{#3}
\begin{document}
\IfFull{\hsize1pt\noindent zzzzz xxxxx}{CORRECT}{BAD}
\end{document}

这应该创建包含该单词的文档CORRECT,因为它#1有一个过满的水平盒子。

答案1

与任何使用循环的代码一样,\lastbox如果被测量的垂直列表中存在任何意外的材料,这将严重失败。特殊、插入、写入、规则将“隐藏”不可移动项目上方的任何材料。

\documentclass{article}

\makeatletter
\def\IfFull#1{%
  \global\let\@IfFull\@secondoftwo
  \setbox\z@\vbox{%
\hbadness\maxdimen
\hfuzz\maxdimen
#1\par
  \loop
  \unskip\unpenalty\unskip\unpenalty
  \setbox\z@\lastbox
  \ifvoid\z@
  \else
     \setbox0\hbox to \hsize{\unhbox\z@}%
     \ifnum\badness>\tolerance
       \global\let\@IfFull\@firstoftwo
       \typeout{bad: \the\badness}% debug message only
     \fi
  \repeat}%
  \@IfFull}

\begin{document}
\IfFull{\hsize1pt\noindent zzzzz xxxxx}{CORRECT}{BAD}
\end{document}

相关内容