我需要一个可用于以下用途的 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}