list 環境の \item のボックスの位置と \itemindent について

Hack & Learn のページで、

つまり、\itemindent は、箇条書きのラベル付き項目本文の字下げ量というよりは、“\labelwidth + \labelsep” をまとめて左右にズラす量です。

と言った点について、もう少しだけ順序立てて考えてみようと思います (間違いが含まれているかも知れませんが…)

以下では、

それで、list 環境の項目本文は、\parshape のお蔭で、左を \leftmargin (= \@totalleftmargin 分空けて、\linewidth の幅で折り返す形のパラグラフです:


 \leftmargin あいうえおかきくけこさしすせそ
       たちつてもなにぬねのはひふへほ

\item で始まるパラグラフは、labelbox を置いて、\hskip\labelsep して、項目本文の出力、と続くので、labelbox の位置を調整しなければ、


       ■■■[  ]あいうえおかきくけこ
       さしすせそたちつてとなにぬねの
       はひふへほ

という風になると考えられます。

ここで labelbox と \labelsep を左にはみ出させるには、左に \labelwidth + \labelsep だけ移動してから labelbox を置くようにすればいいわけで、つまり \hskip -(\labelwidth + \labelsep) としてから labelbox を置いて、次に \hskip\labelsep して、そして項目本文を出力すれば、


  ←←←←←
  ■■■[  ]あいうえおかきくけこさしすせそ
       たちつてとなにぬねのはひふへほ

となります。

単純にはこれで目出度しめでたしなのですが、ここで予め、移動する量に \itemindent を忍ばせておくと、\itemindent の値を変化させることで、“\labelwidth + \labelsep” をまとめて左右に動かすことが出来ることになります (動かす必要がないときには \itemindent を 0pt にすればいいわけですし)

\itemindent に正の値を設定した場合、\hskip (\itemindent - (\labelwidth + \labelsep)) と考えると、まず右に \itemindent だけ移動してから “\labelwidth + \labelsep” 分左に戻って、そして labelbox を置く、ということになり、

同じことですが、\hskip (-(\labelwidth + \labelsep) + \itemindent) と考えると、左に “\labelwidth + \labelsep” 戻ってから、右に \itemindent だけ移動して、そして labelbox を置く、ということになります “extra indentation added right BEFORE an item label” ということですね)


       △△△△
       →→→→
      ←←←←←
  □□□[  ]
  ←←←←←
  →→→→
  △△△△■■■[  ]あいうえおかきくけこさ
       しすせそたちつてとなにぬねのは
              ひふへほ

ただ、これだと、ラベルが項目本文に食い込んでしまっていますし、ラベルと項目本文の距離も元の \labelsep のままですので、ここで \labelsep の量を \itemindent 分増やせば、


  ■■■[  △△△△]あいうえおかきくけこさ
       しすせそたちつてとなにぬねのは
              ひふへほ

という風になり、ラベルの位置を変えずに、項目本文が \iteminednt 分インデントされるようになります。

ちなみに \iteminent に負の値を設定すると、左に “\iteminednt + (\labelwidth + \labelsep) ” だけ移動してから labelbox を置いて、\hskip\labelsep して、そして項目本文が続くことになります。

例えば、description 環境では、\itemindent の値を -\leftmargin にしているので、環境の左端から更に左に “\labelwidth + \labelsep” 移動してから labelbox が置かれます description 環境では \labelwidth の値を 0pt にしているので、実際は、環境の左端から左に \labelsep だけはみ出したしたところからスタートとなります.そのため、\descriptionlabel の定義は “\hspace\labelsep\normalfont\bfseries #1” となっていて、右に \labelsep 移動してからラベルを出力するようになっています)

jsclasses の場合には、「本来の description 環境では,項目名が短いと,説明部分の頭がそれに引きずられて左に出てしまいます。これを解決した新しい description の実装です。」 として、description 環境は次のように定義されていて、\itemindent は使われていません:


\newenvironment{description}{%
  \list{}{%
    \labelwidth=\leftmargin
    \labelsep=1zw
    \advance \labelwidth by -\labelsep
    \let \makelabel=\descriptionlabel}}{\endlist}
\newcommand*\descriptionlabel[1]{\normalfont\headfont #1\hfil}

ltlists.dtx から関係する部分のコードも一応見ておきますと:

\def\@item[#1]{%
  …中略…
  \sbox\@tempboxa{\makelabel{#1}}%
  \global\setbox\@labels\hbox{%
    \unhbox\@labels
    \hskip \itemindent
    \hskip -\labelwidth
    \hskip -\labelsep
    \ifdim \wd\@tempboxa >\labelwidth
      \box\@tempboxa
    \else
      \hbox to\labelwidth {\unhbox\@tempboxa}%
    \fi
    \hskip \labelsep}%
  \ignorespaces}
のようになっています。

Since: November 12, 2012.


home