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.