这个让我很困惑。这个想法是将盒子(在本例中为\rule
)紧密地打包在一起,同时允许它们在一条线的末端断开。它没有几何图形也能工作,但有几何图形就不行。
另一个包裹(我还没有隔离)导致盒子之间出现缝隙。
\documentclass{article}
\usepackage{geometry}% works when commented out
\newcommand{\block}{\rule{0.5\textwidth}{1pt}\allowbreak}
\parindent=0pt
\begin{document}
\block
\block
\block
\block
\end{document}
答案1
geometry
更改页面大小,除非您使用选项来阻止这种情况,
\documentclass{article}
\showthe\textwidth
\usepackage{geometry}% works when commented out
\showthe\textwidth
\newcommand{\block}{\rule{0.5\textwidth}{1pt}\allowbreak}
\parindent=0pt
\begin{document}
\block
\block
\block
\block
\end{document}
你会看到相同的内容,geometry
但页面宽度相同
\documentclass{article}
\textwidth=430.00462pt
\newcommand{\block}{\rule{0.5\textwidth}{1pt}\allowbreak}
\parindent=0pt
\begin{document}
\block
\block
\block
\block
\end{document}
无论哪种情况,由于舍入误差,您都无法将两个块准确地填充一行.....
答案2
根据 TeX,0.5\textwidth+0.5\textwidth
可能不等于\textwidth
。
当geometry
将文本宽度设置为 430.00462pt 时,就会发生这种情况。两个规则的宽度之和比文本宽度少 1sp,并且 TeX 会尝试在第一行粘贴另一条规则,因为没有可用的可拉伸性。
但是,您可以进行更精确的计算:
\documentclass{article}
\usepackage{geometry}% works when commented out
\usepackage{xfp}
\newcommand{\block}{\rule{\fpeval{0.5\textwidth}pt}{1pt}\allowbreak}
\parindent=0pt
\begin{document}
\block
\block
\block
\block\unpenalty % to avoid the spurious underfull box message
\bigskip
\begin{tabular}[t]{llll}
Method & half & half + half & text width\\
\hline
\TeX & \the\dimexpr 0.5\textwidth\relax & \the\dimexpr 0.5\textwidth + 0.5\textwidth\relax &
\the\textwidth \\
l3fp & \fpeval{0.5\textwidth}pt & \fpeval{0.5\textwidth+0.5\textwidth}pt
\end{tabular}
\end{document}
0.5\textwidth
根据 TeX,长度为 14090391sp,而文本宽度为 28180783。
您可以通过以不同的方式定义规则来解决这个问题:
\documentclass{article}
\usepackage{geometry}% works when commented out
\newcommand{\block}{\rule{0.5\textwidth}{1pt}\allowbreak\hspace{0pt plus 1sp}}
\parindent=0pt
\begin{document}
\block
\block
\block
\block
\end{document}
另一个著名的案例:如果你尝试
\setbox0=\hbox to 2in{\hskip 1in \hskip 1in}
您会得到,Underfull \hbox (badness 10000)
因为两个一英寸跳过比两英寸少 1sp。