hrule が“消えて”しまう理由はこれのようです。
\documentclass[a4paper]{article} \begin{document} \parindent=0pt No rule appesrs:\par \vbox{\hsize=20em \hrule} A rule with width 1em appears:\par \vbox{\hsize=20em \hrule \hbox to 1em{!\hfill}} A rule with width 20em appears:\par \vbox{\hsize=20em \hrule !} \end{document}
一般的に、vbox の横幅は「中に存在する物の横幅の最大値」(ただし width 無しの \hrule
のような横幅が未定のものを除く)となります。ここで、vbox 内で直接段落が開始された場合は、その段落は結果的に横幅 \hsize
の hbox を生じます。しかし、そういう段落がない場合は、vbox の横幅が \hsize
に満たないこともありえるわけです。