2008年12月4日木曜日

enumerate環境のカスタマイズ

jsarticle.cls使用時のenumerate環境内で,複数行にわたる段落が
1.昔々ある処にお爺さんとお婆さんが住んでいました.お爺さ
んは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆
さんが川で洗濯していると・・・
のようになり,字下げされない.これはイヤだ.どうにも気に食わない.
1.昔々ある処にお爺さんとお婆さんが住んでいました.お爺さ 
んは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆さ 
んが川で洗濯していると・・・
のようにしたい.そこでカスタマイズすることに.

enumerate 環境のカスタマイズ例は以前「list環境前後の空白を調整する方法」でもやった.この環境のベースになっているのは list 環境なので,list 環境関連のパラメータを設定しなおす必要がある.list 環境のカスタマイズについては吉永徹美の LaTeX 研究室の例も参考になる.

list 環境で使用されるパラメータは下表の通りであるが,重要なのは,これらのパラメータを本文中で

\setlength{\itemsep}{1zw}

のように設定しても反映されないということ.プレアンブルで list 環境を再定義する必要がある(他にも方法があるのかどうか私は知らない).

パラメータ 説明
\itemindent ラベルの前に入るスペース。
\labelsep ラベル右端から項目までの長さ。負の値も可。
\labelwidth ラベルを含めたボックス幅。
\listparindent 一項目内の、第2段落以降で用いられるインデント量。
\leftmargin 左マージンから項目内容までの長さ。負の値は不可。
\rightmargin 右マージンから項目内容までの長さ。負の値は不可。
\parsep 各段落間のスペース。
\itemsep 新規項目の前に\parsepと共に入る行間スペース。
\parskip 段落の前に入る縦方向スペース。デフォルトは、ゼロ。
\topsep 前の段落と第一項目までの距離、次の段落と最後の項目までの距離。
\partopsep \parskip\topsepを加えた長さ。

いずれも \setlength\addtolength により値を設定する.
上表は以下の情報を参考に作成.pLaTeX2e handbook熊澤先生のページ


図にすると,こんな感じ↓になるんではなかろうか.なお,解釈が間違えているかも知れないので悪しからず.


それでは,実際のカスタマイズ結果.

jsarticle.cls ではlist 環境を次のように定義している.
\def\@listi{\leftmargin\leftmargini
  \parsep \z@
  \topsep 0.5\baselineskip
  \itemsep \z@ \relax}
\let\@listI\@listi
\@listi
ここには \itemindent\listparindent などが設定されていないので,それを追記した上で,プレアンブルに書いておけばよい.例を示す.

\def\@listi{\leftmargin\leftmargini
 \itemindent 1zw      % 追加
 \parindent\itemindent   % 追加
 \listparindent\parindent % 追加
 \parsep \z@
 \topsep 0.5\baselineskip
 \itemsep \z@ \relax}
\let\@listI\@listi
\@listi

なお,理由は不明だが \labelsep は本文中で設定した値がちゃんと反映されるので,上の例では list 環境の定義内では値を設定しなかった.

この定義を用いると
1.昔々ある処にお爺さんとお婆さんが住んでいました.お爺さ 
んは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆さ 
んが川で洗濯していると・・・
のようになり,目的が達せられる.

1.昔々あるところにお爺さんとお婆さんが住んでいました.お爺
さんは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆さ
んが川で洗濯していると・・・


しかし,これで話は終わらない.list環境をプレアンブルで再定義しても,それが small環境内のenumerate環境には反映されないことが発覚したのだ. jsarticle.cls を覗いて small 環境の定義を見てみて驚いた.

\newcommand{\small}{%
 \ifnarrowbaselines
  \@setfontsize\small\@ixpt{11}%
 \else
  \@setfontsize\small\@ixpt{13}%
 \fi
 \abovedisplayskip 9\p@ \@plus3\p@ \@minus4\p@
 \abovedisplayshortskip \z@ \@plus3\p@
 \belowdisplayskip \abovedisplayskip
 \belowdisplayshortskip \belowdisplayskip
 \def\@listi{\leftmargin\leftmargini
       \topsep \z@
       \parsep \z@
       \itemsep \parsep}}

となっているのだ.なんと,smallの定義内で list環境が独自に定義されているではないか.これにはやられた.footnotesizeについても同様だった.何ゆえ一々定義するのか不明だが,そうなっている以上, small 環境内の list 環境をカスタマイズしたければ small 環境も再定義するしかない.先と同様に

 \itemindent 1zw      % 追加
 \parindent\itemindent   % 追加
 \listparindent\parindent % 追加

の三行を追加することにより,問題が解決した.
それにしても何故,jsarticle では文字サイズを変えるたびに list 環境を再定義してあるのだろうか(jarticle.cls の場合どうなっているのかは面倒だから確認していない).謎である.

0 件のコメント: