Disappearing \hrule in otherwise empty minipage

Disappearing \hrule in otherwise empty minipage

- aminophen の投稿
返信数: 6
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}

# 前にも面白いものがあった気がしたので。
aminophen への返信

Re: Disappearing \hrule in otherwise empty minipage

- aminophen の投稿
自己レスですが:
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}

どう思われますか?
aminophen への返信

Re: Disappearing \hrule in otherwise empty minipage

- Z. R. の投稿

えーと、イマイチ意図が判らないのですが……。

少なくとも

ちなみに、この変更を加えると当然ながら minipage 環境の最初にいままではなかった \parindent が入ります。

なのだったら、「この変更」はダメですよね。そもそも、仕様として、
「minipage 内では \parindent はゼロ」
のはずなので。

※例えば以下のように変えたのを試してみてください。

\def\HOGE{\hoge\hoge\hoge\hoge\par\hoge\hoge\hoge\hoge}
Z. R. への返信

Re: Disappearing \hrule in otherwise empty minipage

- aminophen の投稿
> そもそも、仕様として、「minipage 内では \parindent はゼロ」

やはりそうですよね。

> イマイチ意図が判らないのですが……。

変えたいと思っているのではなく、\hrule が食われるのが仕様なのかどうか
わからないので、食われないようにするには?と思って試してみたところでした。
aminophen への返信

Re: Disappearing \hrule in otherwise empty minipage

- Z. R. の投稿

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 に満たないこともありえるわけです。

Z. R. への返信

Re: Disappearing \hrule in otherwise empty minipage

- Z. R. の投稿

\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}
Z. R. への返信

Re: Disappearing \hrule in otherwise empty minipage

- aminophen の投稿
どうやら plain TeX でも同じようですね。
\hrule\bye
だと何も出ませんが
\hrule width 10em\bye
あるいは
\leavevmode\hrule\bye
だと線が出ます。minipage 環境もそれと同じということですね。
ありがとうございました。