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}