LaTeX bugs database で LaTeX の面白い挙動を見つけたので、載せてみます。
https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=latex/4463
\documentclass{article}
\begin{document}
no rule:
\noindent\begin{minipage}{\linewidth}
\hrule
\end{minipage}
a rule:
\noindent\begin{minipage}{\linewidth}
\hrule width \linewidth
\end{minipage}
again a rule:
\noindent\begin{minipage}{\linewidth}
\hrule
X
\end{minipage}
\end{document}
minipage 環境で \hrule を単独で使うと、\hrule が消えます。
しかし、前または後に別のモノがあると \hrule が現れます。
もう少し例を増やすと、\hbox{} と \mbox{} でも差が出ます。
no rule:
\noindent\begin{minipage}{\linewidth}
\hbox{}\hrule
\end{minipage}
a rule:
\noindent\begin{minipage}{\linewidth}
\mbox{}\hrule
\end{minipage}
no rule:
\noindent\begin{minipage}{\linewidth}
\hrule\hbox{}
\end{minipage}
a rule:
\noindent\begin{minipage}{\linewidth}
\hrule\mbox{}
\end{minipage}
# 前にも面白いものがあった気がしたので。
自己レスですが:
ltboxes.dtx の中の \@iiiminipage の \leavevmode が早すぎて
意味をなしていないのではないでしょうか。
ちなみに、この変更を加えると当然ながら minipage 環境の最初に
いままではなかった \parindent が入ります。
\documentclass{article}
\makeatletter
\def\@iiiminipage#1#2[#3]#4{%
% \leavevmode % from here ...
\@pboxswfalse
\setlength\@tempdima{#4}%
\def\@mpargs{{#1}{#2}[#3]{#4}}%
\setbox\@tempboxa\vbox\bgroup
\leavevmode % to here!
\color@begingroup
\hsize\@tempdima
\textwidth\hsize \columnwidth\hsize
\@parboxrestore
\def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@
\let\@footnotetext\@mpfootnotetext
\let\@listdepth\@mplistdepth \@mplistdepth\z@
\@minipagerestore
\@setminipage}
\makeatother
\def\hoge{The quick brown fox jumps over the lazy dog. }
\def\HOGE{\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge}
\begin{document}
Begin
\begin{minipage}{0.5\linewidth}
\HOGE
\end{minipage}
End.
\end{document}
どう思われますか?
ltboxes.dtx の中の \@iiiminipage の \leavevmode が早すぎて
意味をなしていないのではないでしょうか。
ちなみに、この変更を加えると当然ながら minipage 環境の最初に
いままではなかった \parindent が入ります。
\documentclass{article}
\makeatletter
\def\@iiiminipage#1#2[#3]#4{%
% \leavevmode % from here ...
\@pboxswfalse
\setlength\@tempdima{#4}%
\def\@mpargs{{#1}{#2}[#3]{#4}}%
\setbox\@tempboxa\vbox\bgroup
\leavevmode % to here!
\color@begingroup
\hsize\@tempdima
\textwidth\hsize \columnwidth\hsize
\@parboxrestore
\def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@
\let\@footnotetext\@mpfootnotetext
\let\@listdepth\@mplistdepth \@mplistdepth\z@
\@minipagerestore
\@setminipage}
\makeatother
\def\hoge{The quick brown fox jumps over the lazy dog. }
\def\HOGE{\hoge\hoge\hoge\hoge\hoge\hoge\hoge\hoge}
\begin{document}
Begin
\begin{minipage}{0.5\linewidth}
\HOGE
\end{minipage}
End.
\end{document}
どう思われますか?
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 に満たないこともありえるわけです。
\parindent の値はともかくとして、そもそも「minipage に入ってすぐに常に \leavevmode してよいか」というと、次のようなパターンがあるので、やっぱり不適当だと思います。
\documentclass{article}
\begin{document}
Lorem ipsum
\begin{minipage}[t]{0.5\linewidth}
\begin{itemize}
\item dolor sit amet,
\item consectetuer adipiscing elit,
\item ut purus elit,
\end{itemize}
\end{minipage}
vestibulum ut.
\end{document}