2019年12月18日

クラスファイルを作ろう(7)

「リスト系」の環境の設定と定義をします.

list環境

LaTeX内で定義されているlist環境は,箇条書きをはじめとした様々な書式の出力を行うための汎用的な環境です.enumerate環境などは通常これを使い定義されます.list環境は

\list{<デフォルトラベル>}{<初期化命令群>}%
\item ....
\item ...
...
\endlist
の形で使われます.もちろん\begin{list}...\end{list}の形でもよいのですが,内部で使う際には\list...\endlistの方が多いようです.list環境の出力はenumerate環境のようなものを想像してもらえればよいです.つまり,enumerate環境の場合の番号(list環境下では「ラベル」と呼びます)とそれに続く本文,という塊が連なっているようなものが出力されます.

<初期化命令群>にこの環境の振る舞いを定義します.殆どが空きの調整になります.

縦方向
\topsep
最初の項目と前の段落との間の空き.
\partopsep
\par直後(TeXの意味での垂直モード)でlist環境が開始された時に,追加で\topsepに加えられる空白の長さ.
\itemsep
項目間の縦方向空き.
\parsep
一つの項目における段落間の距離(\parskip.)
横方向
\leftmargin
全体の字下げ.この環境自身が字下げされている場合は,そこからさらにこの値だけ字下げされる.0以上でなければならない.
\rightmargin
字上げ.
\listparindent
各項目内での段落の字下げ量.負でもよい.ただし\itemに続く段落では,この値ではなく以下の\itemindentが参照される.
\itemindent
各項目の一行目の字下げ量.ラベルの前の空き.
\labelwidth
ラベルの最低長さ.デフォルトでは,ラベル自身の長さが\labelwidth以下ならば,長さ\labelwidthの範囲に右寄せでラベルが配置される.もし\labelwidth以上の長さをラベル自身が持つならば,その分続く本文が右寄せされる.ただしこれらの挙動は以下に出てくる\makelabelの定義による.
\labelsep
ラベルとそれに続く項目の空き.

場合によっては,以下のような処理も必要になります.

  • \makelabelの再定義.\itemによりラベルが出力される際に,ラベル自身を引数として\makelabelが呼び出される.デフォルトは\def\makelabel#1{\hfil #1}.渡される引数はデフォルトでは\listの第一引数に渡した<デフォルトラベル>.ただし\item\item[<オプション>]のようにオプション付きで使われた場合は<オプション>になる.
  • \usecounterにより使用するカウンタを宣言する.使い方は\usecounter{<LaTeXの意味でのカウンタ名>}で,ここで指定されたカウンタは\itemのたびに増加される.

\usecounter\makelabelの再定義の一例をあげます.

\newcounter{mycounter}% カウンタを宣言
\renewcommand{\themycounter}{[\arabic{mycounter}]}% mycounteroカウンタを出力する\themycounterをちょっと再定義
\list
  {\themycounter}% デフォルトラベルとしてはmycounterの値を使う.
  {%
    \usecounter{mycounter}%
    \def\makelabel#1{#1\hfil}% 左寄せにする
  }%
... % 実際の中身
\endlist

これで,ラベルは[1],[2]となります.

trivlist環境

簡略化されたlist環境です.以下のように値が固定されています.

  • \parsep = \parskip
  • \leftmargin = 0pt
  • \rightmargin = 0pt
  • \listparindent = 0pt
  • \itemindent = \parindent
  • \labelwidth = 0pt

\@listi

list環境は上記の<初期化命令群>が実行される前に\@listiを実行します.list環境下のlist環境では\@listiiが実行されます.以下ネストされていくに連れ,\@listiii\@listiv\@listv\@listviとなります.(これ以上はlist環境がネストできない.)この中では各種パラメータの変更のみができ,例えば\makelabelを定義するということはできません.

このデフォルト値を定義します.enumerate環境やitemize環境を意識します.\leftmarginに関してはLaTeXの用意しているレジスタ\leftmargini等を参照することにします.これでこのレジスタの値を変更することでenumerate環境などの設定を行うことができるようになります.

\def\@listi{%
  \setlength{\leftmargin}{\leftmargini}%
  \setlength{\parsep}{0pt}%
  \setlength{\topsep}{0.5\baselineskip}%
  \setlength{\itemsep}{0pt}%
}
\def\@listii{%
  \setlength{\leftmargin}{\leftmarginii}%
  \setlength{\labelwidth}{\dimexpr\leftmarginii - \labelsep\relax}%
  \setlength{\topsep}{0pt}%
  \setlength{\parsep}{0pt}%
  \setlength{\itemsep}{\parsep}%
}
\def\@listiii{%
  \setlength{\leftmargin}{\leftmarginiii}%
  \setlength{\labelwidth}{\dimexpr\leftmarginiii - \labelsep\relax}%
  \setlength{\topsep}{0pt}%
  \setlength{\parsep}{0pt}%
  \setlength{\itemsep}{\parsep}%
}
\def\@listiv{%
  \setlength{\leftmargin}{\leftmarginiv}%
  \setlength{\labelwidth}{\dimexpr\leftmarginiv - \labelsep\relax}%
}
\def\@listv{%
  \setlength{\leftmargin}{\leftmarginv}%
  \setlength{\labelwidth}{\dimexpr\leftmarginv - \labelsep}%
}
\def\@listvi{%
  \setlength{\leftmargin}{\leftmarginvi}%
  \setlength{\labelwidth}{\dimexpr\leftmarginvi - \labelsep}%
}
% デフォルトの\@listiを保存
\let\@listI\@listi

いくつかのフォントサイズ変更命令では,トップレベルの\@listi\@listIを代入するようにしていました.そこで参照されているのがここで保存されたものです.

\leftmargini等のデフォルト値も設定しておきます.

\setlength\leftmargini{3zw}
\setlength\leftmarginii{2zw}
\setlength\leftmarginiii{2zw}
\setlength\leftmarginiv{2zw}
\setlength\leftmarginv{1zw}
\setlength\leftmarginvi{1zw}

なお,現在の環境名は\@currenvirに格納されているため,環境ごとに値を変更したい場合は次のようにすることができます.

\def\@listi{%
  \setlength{\leftmargin}{\leftmargini}%
  \setlength{\parsep}{0pt}%
  \setlength{\topsep}{0.5\baselineskip}%
  \ifthenelse{\equal{\@currenvir}{enumerate}}{%
    \setlength{\itemsep}{10pt}% enumerate環境でのみ\itemsepを10ptとする.
  }{%
    \setlength{\itemsep}{0pt}%
  }%
}

description環境

description環境を定義します.

\newenvironment{description}{%
  \list{}{%
    \setlength{\labelsep}{1zw}%
    \setlength{\labelwidth}{\dimexpr\leftmargin - \labelsep\relax}%
    % ラベルの出力は\descriptionlabelに追い出しておく.
    \let\makelabel=\descriptionlabel
  }%
}{\endlist}
% \descriptionlabelの定義.左寄せ.
\newcommand*{\descriptionlabel}[1]{\normalfont\bfseries\gtfamily #1\hfil}

引用系環境

引用をする際に使う環境であるquote,quotation,verse環境を定義します.これは\itemの現れないlist環境として定義します.

\newenvironment{quote}{%
  \list{}{\setlength{\rightmargin}{0pt}}%
  % この\itemがこの環境内唯一の\itemとなる.\begin{quote}[...]という場合でも問題無く動くように\relaxを入れておく.これがないと\itemのオプションとして誤認されてしまう.
  \item\relax
}{\endlist}
\newenvironment{quotation}{%
  \list{}{%
    % 段落頭を一文字インデント
    \setlength{\listparindent}{\parindent}%
    \setlength{\itemindent}{\listparindent}%
    \setlength{\rightmargin}{0pt}%
  }%
  \item\relax 
}{\endlist}
\newenvironment{verse}{%
  \let\\=\@centercr % \\で改段落できるようにする.
  \list{}{%
   % \leftmarginに2zwを加え,\itemindentと\listparindentを-2zwに設定することで,段落頭を除き二文字分インデントされる.
    \setlength{\itemsep}{0pt}%
    \setlength{\itemindent}{-2zw}%
    \setlength{\listparindent}{\itemindent}%
    \setlength{\rightmargin}{0pt}%
    \addtolength{\leftmargin}{2zw}%
  }%
  \item\relax
}{\endlist}

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です