enumitem(書式・カウンタ・行内)

enumitem は、itemizeenumeratedescription の体裁を キー=値(key=value)のオプション で自在に整えるための定番パッケージです。\renewcommand で内部命令を上書きする手作業に頼らず、\begin{enumerate}[label=(\alph*), leftmargin=*] のように環境の角括弧へ設定を書くだけ。ラベルの書式・項目間の空き・余白、番号の開始や継続、さらに行内(ランニング)リストや新しいリスト型の定義まで、リストにまつわる調整のほとんどをここで完結できます。

キー=値オプションの考え方

プリアンブルで \usepackage{enumitem} と読み込むと、3 つの基本リスト環境が オプション引数 を取れるようになります。\begin{itemize}[...] のように角括弧の中へ キー=値 をカンマ区切りで並べるだけで、その 1 つのリストの体裁が決まります。値が丸ごと波括弧で囲まれている場合は外側の波括弧が外される(keyval の既定動作)ので、波括弧そのものを残したいときは二重にします。

document.tex
\usepackage{enumitem}
% ...
\begin{itemize}[itemsep=1ex, leftmargin=1cm]
  \item 余白と項目間を調整した箇条書き
  \item 二つめの項目
\end{itemize}

同じキーは、文書全体・型ごと・個々のリストという階層で「上書き」できます(後述の \setlist)。最も具体的に与えた値が勝つので、まず全体の方針を決め、必要な所だけ局所的に変える、という整理が利きます。

ラベルと相互参照の書式(label・ref)

enumerate のラベルは label= で決めます。値の中では、\arabic\alph\Alph\roman\Roman末尾にアスタリスクを付けた星付き版\arabic* など)が、その階層の現在のカウンタを表します。たとえば label=(\arabic*) なら (1) (2) (3)、label=\alph*) なら a) b) c)、label=\Roman*. なら I. II. III. になります。星付き版は引数を取らず、ラベル中でカウンタの値に置き換わる特別な記法です。

document.tex
\begin{enumerate}[label=(\alph*)]
  \item りんご
  \item みかん
  \item ぶどう
\end{enumerate}

既定では label= の指定が相互参照(\ref)の見た目にもそのまま使われます。参照だけ別の書式にしたいときは ref= を併用します。たとえば本文中のラベルは括弧つきの (1) にしつつ、\ref では括弧なしの 1 を出す、といった使い分けです。

document.tex
\begin{enumerate}[label=(\arabic*), ref=\arabic*]
  \item \label{step:one} 下ごしらえ
  \item 加熱する
\end{enumerate}
手順~\ref{step:one} に戻る。

なお labelref の値は移動引数(moving argument)扱いで、壊れやすい命令は \protect が必要になることがあります(ただしカウンタの星付き版はそのまま使えます)。label= を変えると、各階層のカウンタ表示(\theenumi など)も連動して変わる点も覚えておくと混乱しません。

空きと余白(itemsep・leftmargin ほか)

LaTeX のリストが内部で使う長さは、enumitem ではそのままキー名になります。縦方向は topsep(リストの前後)、partopsep(段落の直後に来るときの追加分)、parsep(1 項目が複数段落のときの段落間)、itemsep(項目どうしの間)。横方向は leftmarginrightmargin(左右の余白)、labelsep(ラベルと本文の間)、labelwidth(ラベル箱の幅)、itemindent、そして enumitem が追加した labelindent(外側からラベル箱の左端までの空き)です。

キー意味向き
topsepリストの上下に入る空き
partopsepリストが段落直後に来るときの追加の空き
parsep1 つの項目内の段落間の空き
itemsep項目どうしの間の空き
leftmarginリスト本文の左余白
labelsepラベルと項目本文の間隔
labelwidthラベルを入れる箱の幅
labelindent外側からラベル箱の左端までの空き(enumitem 追加)
alignラベルの揃え方(leftright(既定)/parleft

これらは独立ではなく、\leftmargin + \itemindent = \labelindent + \labelwidth + \labelsep という関係で結ばれています。そのため一部のキーに *! を与えると、残りを自動計算させられます。特に **leftmargin=* はラベル幅に合わせて左余白を自動調整する常用パターン、labelsep=*** は本文の開始位置を一定にしたいときに便利です。align= はラベルを箱の中で左寄せ・右寄せ(既定)・左寄せパボックスのいずれにするかを決め、番号や記号の見え方を整えます。

詰めたリストと近道(nosep・noitemsep・wide)

空きを手早く調整する近道がいくつか用意されています。**nosep はリスト上下と項目間の 縦の空きをすべてゼロ** にし(topseppartopsepparsepitemsep をまとめて 0pt)、ぎゅっと詰まったリストを作ります。**noitemsep はそのうち 項目間と段落間だけ**(itemsep=0pt, parsep=0pt)を消し、リスト前後の空きは残します。

document.tex
\begin{itemize}[nosep]
  \item 詰まった項目その一
  \item 詰まった項目その二
  \item 詰まった項目その三
\end{itemize}

もう一つの便利キーが **wide** です。これは左余白をゼロにしてラベルを本文の一部のように見せ、項目をふつうの段落のように組みます(内部的には align=left, leftmargin=0pt, labelindent=\parindent, labelwidth=0pt, itemindent=! などに展開されます)。字下げ量を変えたいときは wide=\parindent のように値を与えます。

また、enumerate のラベルを enumerate パッケージ風の短い書き方で与えたいときは、パッケージ読み込み時に \usepackage[shortlabels]{enumitem} とします。すると角括弧の 最初の要素 として AaIi1 を書くだけで、それぞれ \Alph*\alph*\Roman*\roman*\arabic* を意味します(例:\begin{enumerate}[(1)])。

番号の開始・継続(start・resume)

番号を制御するキーもあります。**start=** は最初の項目の番号を指定します(start=5 なら 5 から)。いったん別の段落をはさんで列挙を再開し、**前の enumerate の続き番号 にしたいときは resume を使います。さらに前のリストの オプション設定ごと引き継ぎたい ときは resume*** を使います(この星付きは環境の角括弧でのみ意味があります)。

document.tex
\begin{enumerate}
  \item 最初の項目
  \item 二つめの項目
\end{enumerate}
途中に説明の段落が入る。
\begin{enumerate}[resume]
  \item 三つめの項目(番号が続く)
\end{enumerate}

resume は局所的な継続です。離れた複数のリストを 1 つのまとまりとして大域的に番号を通したいときは、開始リストに series=名前 を付け、続きのリストで resume=名前 または resume*=名前 を指定する「シリーズ」機能を使います。

全体設定と新しいリスト型(\setlist・\newlist)

同じ設定を毎回書くのは大変です。**\setlist** を使うと、リストの種類や階層を指定して設定を一括で適用できます。\setlist[enumerate,1]{...}enumerate の第 1 階層に、\setlist[itemize]{...}itemize の全階層に、\setlist{...}(角括弧なし)はすべてのリストのすべての階層に効きます。星付きの \setlist* は、それまでの設定を上書きせず 追加 します。

latex
% プリアンブルで一括設定
\setlist{nosep}                       % すべてのリストの空きを詰める
\setlist[itemize]{leftmargin=*}       % itemize の左余白を自動調整
\setlist[enumerate,1]{label=(\arabic*), ref=\arabic*}

さらに踏み込んで、自分専用のリスト型を定義することもできます。**\newlist{名前}{型}{最大の深さ}** で 3 基本リストのいずれか(enumerateitemizedescription)を複製した新環境を作り、続けて \setlist[名前]{...} で体裁を与えます(少なくともラベルは設定が必要です)。論理的な名前を付けられるので、原稿の意図が読みやすくなります。

latex
\newlist{steps}{enumerate}{1}
\setlist[steps]{label=\textbf{Step \arabic*.}, leftmargin=*}
% 本文では独自の環境として使える
\begin{steps}
  \item お湯を沸かす
  \item 麺を入れる
\end{steps}

行内(ランニング)リスト

段落の中に横並びで番号を振る「行内リスト」も作れます。パッケージを \usepackage[inline]{enumitem} と読み込むと、enumerate*itemize*description* という アスタリスク付きの環境 が追加されます。これらは対応する通常リストと同じラベル付けを共有し、label= などのキーもそのまま使えます。

document.tex
\usepackage[inline]{enumitem}
% ...
必要なものは
\begin{enumerate*}[label=(\arabic*)]
  \item 小麦粉
  \item 砂糖
  \item\end{enumerate*}
の三つです。

行内リストの区切りは itemjoin(項目間。既定は空白)や itemjoin*(最後の項目の前だけ別にしたいとき)、afterlabel(ラベル直後。既定は ~)といったキーで整えられます。ただし行内リストの項目は既定では箱に入るため、フロート・入れ子リスト・別行立て数式は置けません(必要なら mode=unboxed を指定)。短い語句を並べる用途に向いています。