\item 内の minipage 環境の上下余白について

\item 内の minipage 環境の上下余白について

- 佐藤 健治 の投稿
返信数: 6

こんにちは。初めて投稿します。

enumerate環境の各\itemの幅を詰めて,メインテキストの右側の空いたスペースに True / False のようなテキストを挿入するレイアウトを実現したいです。下のようなイメージです。

(1) Some text.      True / False
(2) Another text.   True / False

試みとして,\item の中にminipage環境を入れて下のように書いてみました。

メインテキストが1行のみのときは問題ないのですが,テキストが複数行に及ぶ項目があると,その項目と次の項目の行間が極端に小さくなってしまいます。


\documentclass[a4paper,lualatex,ja=standard]{bxjsarticle}

\usepackage{enumitem}

\newcommand\TorF{T / F}
\newcommand{\tfitem}[1]{\item \begin{minipage}[t]{10em}#1\end{minipage}\hfill\TorF}

\newlist{TFquiz}{enumerate}{1}
\setlist[TFquiz]{label=(\arabic*), align=left}

\begin{document}

\begin{TFquiz}
\tfitem{Some text.}
\tfitem{Some loooooooooooooooooong text.}
\tfitem{Another text.}
\end{TFquiz}

\end{document}

サンプルは bxjsarticlelualatex を使うことを想定していますが, jsarticleplatex でコンパイルしても同様でした。

articleクラスに変更して pdflatexでコンパイルすると,この余白問題は発生しませんでした。 なので,日本語ドキュメント用クラスファイル特有の問題あるいは仕様なのかな,と想像しています。

minipage環境を必ず使いたいというわけではないので他の方法でもよいのですが, 上記のようなレイアウトを(日本語文書で)実現できる方法はありますでしょうか。

PDFをチェックして場当たり的に\vspaceを書いたり消したりしない方法を希望しています。 よろしくお願いします。なお,当方,Mac で TexLive 2020 を利用しています。関係あるのか分かりませんが,細かいことを言えばTinyTex を入れたあとに,scheme-fullをインストールしています。

佐藤 健治 への返信

Re: \item 内の minipage 環境の上下余白について

- 和田 勇 の投稿
minipage で組版するとそれが一個のブロックと看做され、TorF はminipage 内の最下行の横に位置しているとみなされているとのこと。
(The LaTeX コンパニオン p547 より)

なので {\begin{minipage}...\end{minipage}\hfill TorF}\par\vspace*{0mm} と見えない空行を追加すると是正されるそうです。

この項目間の空白は一般的には itemsep として設定してあげる方法だと思い、
\setlist[TFquiz] のオプションで itemsep の値を設定しみました。

  \setlist[TFquizA]{
  label=(\arabic*),
  itemsep=4\p@ \@plus 2\p@ \@minus 1\p@,
align=left
  }

複数行のところは対応できるのですが、この itemsep が単一行でも有効になってしまい、空きすぎてしまう弊害が出てしまうようです。

なので、簡便な方法ですが、1行に収まっているか行長でチェックして見えない空行を発行するようにしてみました。

\makeatletter
\newlength{\myLen}
\newcommand{\tfitem}[1]{%
\item \begin{minipage}[t]{11em}#1\end{minipage}\hfill\TorF%
\settowidth{\myLen}{#1}
\ifdim\myLen>11em%
\par\vspace{8\p@ \@plus 4\p@ \@minus 2\p@}%
\fi%
}
\makeatother


当初 4\p@ \@plus 2\p@ \@minus 1\p@ で試してみましたが、やや狭いのでそれぞれ単純に二倍しています。
和田 勇 への返信

Re: \item 内の minipage 環境の上下余白について

- 佐藤 健治 の投稿

上手くいきました。ありがとうございます。

Koma-Script もよく使うので,JS* のときだけスペースが挿入できるよう以下のように改変してみました。これも大丈夫そうです。


\usepackage{etoolbox}

\makeatletter
\newlength{\myLen}
\newcommand{\tfitem}[1]{%
\item \begin{minipage}[t]{11em}#1\end{minipage}\hfill\TorF%
\ifdef\ifjsc@needsp@tch
  {\settowidth{\myLen}{#1}%
   \ifdim\myLen>11em%
   \par\vspace{8\p@ \@plus 4\p@ \@minus 2\p@}%
   \fi%
  }{}
}
\makeatother

ありがとうございました!

佐藤 健治 への返信

Re: \item 内の minipage 環境の上下余白について

- 北見 けん の投稿
> サンプルは bxjsarticle で lualatex を使うことを想定していますが, jsarticle で platex でコンパイルしても同様でした。

> articleクラスに変更して pdflatexでコンパイルすると,この余白問題は発生しませんでした。 なので,日本語ドキュメント用クラスファイル特有の問題あるいは仕様なのかな,と想像しています。

手元の古いバージョンを見てみたところ、js** は \@listi などで \parsep と \itemsep を 0pt にしているようです。article や jarticle ではどちらも 4pt plus 2pt minus 0pt にしているようです。これについて、jsclasses.dtx では、次のような説明がありますね。

%    元の値はかなり複雑ですが,ここでは簡素化してしまいました。
%    特に最初と最後に行送りの半分の空きが入るようにしてあります。
%    アスキーの標準スタイルでは
%    トップレベルの |itemize|,|enumerate| 環境でだけ
%    最初と最後に行送りの半分の空きが入るようになっていました。

\@listi の設定を article や jarticle のものを参考にして変えてみたら何かまずいことが起こるのかどうか、わかりません。article では、\@listi の定義は size10.clo に、jarticle では jsize10.clo にあります。
北見 けん への返信

Re: \item 内の minipage 環境の上下余白について

- ut の投稿

# jsarticle と platex でしか試していませんけれど…

\strut を立てて深さを確保するだけでもよさそうです:

%\documentclass[a4paper,lualatex,ja=standard]{bxjsarticle}
\documentclass{jsarticle}

\usepackage{enumitem}

\newcommand\TorF{T / F}
%\newcommand{\tfitem}[1]{\item \begin{minipage}[t]{10em}#1\end{minipage}\hfill\TorF}
\newcommand{\tfitem}[1]{\item \begin{minipage}[t]{10em}#1\strut\end{minipage}\hfill\TorF}

\newlist{TFquiz}{enumerate}{1}
\setlist[TFquiz]{label=(\arabic*), align=left}

\begin{document}

\begin{TFquiz}
\tfitem{Some text.}
\tfitem{Some loooooooooooooooooong text.}
\tfitem{Another text.}
\end{TFquiz}

\end{document}


# 私も最初、jsclasses が \itemsep や \parsep を 0pt にしてる
# せいかなと思ったのですけれど、\strut を立てないと article.cls
# とかでも \item の間隔が揃わないというのは既知の話みたいです:

from: LATEX2e: An unofficial reference manual
(October 2018: CTAN ver.: あれれ、コマンドインデックスがついてない…)
https://www.ctan.org/pkg/latex2e-help-texinfo

19.13 \strut

\documentclass{article}

\begin{document}

\setlength{\fboxsep}{0pt}

\noindent\begin{minipage}[t]{0.2\linewidth}
\begin{enumerate}
  \item \parbox[t]{15pt}{test \\ test}
  \item test
  \item test
\end{enumerate}
\end{minipage}%
\begin{minipage}[t]{0.2\linewidth}
\begin{enumerate}
  \item \parbox[t]{15pt}{test \\ test\strut}
  \item test
  \item test
\end{enumerate}
\end{minipage}%
\begin{minipage}[t]{0.2\linewidth}
\begin{enumerate}
  \item \fbox{\parbox[t]{15pt}{test \\ test}}
  \item \fbox{test}
  \item \fbox{test}
\end{enumerate}
\end{minipage}%
\begin{minipage}[t]{0.2\linewidth}
\begin{enumerate}
  \item \fbox{\parbox[t]{15pt}{test \\ test\strut}}
  \item \fbox{test}
  \item \fbox{test}
\end{enumerate}
\end{minipage}

\end{document}