easylist

LaTeX のリストは 4 段で行き止まりになります。easylist はその壁を、環境を入れ子にするのをやめることで越えました。\begin{easylist} の中では #個数がそのまま段の深さになり、### と書けば第 3 段、##### と書けば第 5 段です。\item も入れ子の \begin も要りません。しかもこのパッケージには tractatus という名前の既製スタイルがあり、それはヴィトゲンシュタイン『論理哲学論考』の番号の振り方をそのまま再現します。ここでは easylist の使い方と、10 段で止まる本当の上限、そして enumitem に勝てる場面と勝てない場面を、すべて TeX Live 2024 で実際に組んで確かめながら見ていきます。

easylist の使い方 — # の個数が段になる

\usepackage[sharp]{easylist} と読み込み、easylist 環境の中で行頭に # を並べるだけです。# が 1 個なら第 1 段、## なら第 2 段。マーカーの直後には 必ず空白を 1 つ置きます\item は書きません——というより、書く場所がありません。easylist は入れ子の環境を作らないので、深さは環境の重なりではなく、その行の # の個数だけで決まります。これが「段数に上限がない」と言われる理由であり、同時に、リストの途中で好きなだけ段を上下できる理由でもあります。

document.tex
\documentclass{article}
\usepackage[sharp]{easylist}
\begin{document}
\begin{easylist}
# First proposition.
## Interesting comment.
### A note on the comment.
### Another note.
#### By the way...
# Let's start something new.
\end{easylist}
\end{document}

TeX Live 2024 でこれを組むと、番号は 1. 1.1. 1.1.1. 1.1.2. 1.1.2.1. 2. の順に出ます。段の数字がピリオドで連結され、末尾にもピリオドが付く——この末尾のピリオドが FinalMark で、後で消せます。段を飛ばすと飛ばした段は 0 として数えられ、第 1 段の直後に ### を置けば番号は 1.0.1. になります。エラーにはなりません。逆に、マーカーの後の空白を忘れると静かに壊れます#With no space. と書くとその項目には番号が付かず、しかも続く ## の行が 0.0.1. になりました——番号が消えるだけでなく、以降のカウンタまでずれます。

本当の上限は 10 段 — Too many のエラーが出たら

「段数に上限がない」は正確ではありません。既定で用意されるカウンタは 10 段ぶんで、11 段目を書くとコンパイルが止まります。TeX Live 2024 で 14 段のリストを流したところ、実際に出たエラーは ! Package easylist Error: に続いて ==> Too many から始まる 3 行で、要旨は「パッケージ読み込み時に指定しないかぎり、マーカーは 10 個までしか使えない」というものでした。しかも生成された PDF には、11 段目以降の項目が番号の代わりに !!! という文字を持って現れました。エラーを見落とすと、感嘆符が三つ並んだ箇条書きが刷り上がることになります。

直し方はエラー文が言うとおりで、読み込み時に段数を数値オプションで渡します。\usepackage[sharp,14]{easylist} とすれば 14 段まで通り、同じ原稿がエラーなしで 1.1.1.1.1.1.1.1.1.1.1.1.1.1. まで刷れました。数値はいくつでも構いませんが、カウンタは読み込み時に確保されるので、必要な段数だけを指定するのが行儀の良いやり方です。10 段を超えるリストを本気で書いているなら、そもそも文書の構造を疑うべきだ、という当たり前の忠告も付け加えておきます。

tractatus から itemize まで — 6 つの既製スタイル

easylist には 6 つの既製スタイルがあり、\begin{easylist}[tractatus] のように環境の省略可能引数で指名します。名前は tractatuschecklistbooktocarticletocenumerateitemize の 6 つで、easylist.sty の 820 行目付近に定義されています。うち tractatus は、その名のとおり ヴィトゲンシュタイン『論理哲学論考』の番号体系です。実際に組んでみると 1. 1.1 1.11 1.2 2. と出ます——第 1 段のあとだけピリオドが入り、それより深い段は数字が繋がって伸びていく。1921 年に出たあの本の目次そのものが、オプション一語で手に入るわけです。

スタイル名出る番号・記号使いどころ
tractatus1. 1.1 1.11 1.2 2.命題を階層で並べる哲学・論理の文章
checklist番号を隠し、各項目の頭に空の四角枠を置く手で印を付ける確認表
booktoc第 1 段が大きな太字と大文字ローマ数字、以降は段ごとに字下げ手で目次を組む
articletocbooktoc の軽い版。第 1 段が太字で、番号の末尾にピリオドを付けない論文規模の目次
enumerate1. (a) i. A. の順標準の enumerate と同じ見た目のまま深く掘る
itemize · の順番号を出さない箇条書き。標準の記号を模している

enumerateitemize の 2 つは、標準リストの見た目をわざと真似たものです。実測すると前者は 1. (a) i. A.、後者は · を出しました。ただし itemize プリセットが使っているのは \labelitemi などの本物のラベル命令ではなく、\textbullet--$\ast$$\cdot$ という手書きの近似です(easylist.sty 858〜864 行)。標準の記号が実際どう定義されているかは custom-labels のページが実測しているので、記号そのものを弄りたいならそちらが本筋です。easylist 側の値打ちは、その見た目のまま 5 段目・6 段目へ進めることにあります。

\ListProperties で番号と字下げを決める

既製スタイルで足りないところは \ListProperties(...) で直します。丸括弧の中に キー=値 をカンマ区切りで並べる書き方で、それ以降のすべての項目とリストに効きます。多くのキーには段ごとの版があり、キー名に段数を付けるだけ——Numbers は全段、Numbers3 は第 3 段だけ。既定に戻したいときは \NewList を呼びます。なお \ListProperties必須ではありません。何も書かなくても easylist は動きます(このページの最初の例がそうです)。設定はあくまで見た目を変えたいときの話です。

キー働き書き方の例
Numbers番号の種類。a 算用数字(既定)/r R 小・大ローマ数字/l L 小・大英字/z Zapf DingbatsNumbers2=R, Numbers3=l
Mark / FinalMarkカウンタどうしの区切り文字(既定はピリオド)と、番号の末尾に付く記号FinalMark= で末尾のピリオドを消す
Style書体。* を付けると番号だけ、** を付けると本文だけに効くStyle1*=\bfseries は第 1 段の番号だけ太字。\color{blue} なども渡せる
Hide先頭から n 個のカウンタを隠す。番号なしの箇条書きが作れるHide=10000 で全段の番号を消す
Startカウンタの開始値。* 付きは外部カウンタに連動させるStart1*=\thesection で節番号に追従
Progressive段の深さに比例して左マージンを取る。* 付きは第 1 段を現在位置に置くProgressive=1.5em
Space項目間の縦アキ。* 付きは同じ段どうしの間隔。負の値で詰められるSpace*=2pt
document.tex
\documentclass{article}
\usepackage[sharp]{easylist}
\begin{document}
\ListProperties(Style1*=\bfseries, Numbers2=R, Numbers3=l,
  Progressive=1.5em, Space*=2pt)
\begin{easylist}
# Agreement.
## Definitions.
### Party means a signatory hereto.
### Effective Date means the date of last signature.
## Term and termination.
### This Agreement begins on the Effective Date.
#### Either party may terminate on 30 days notice.
##### Notice must be given in writing.
# Miscellaneous.
\end{easylist}
\end{document}

この例では第 1 段の番号だけが太字の算用数字、第 2 段が大文字ローマ数字、第 3 段が英小文字になり、1.I.a. のように合成されます。第 4 段・第 5 段は #### ##### と書くだけで、Progressive が指定した 1.5em ずつ深く字下げされて出ます。細かい調整用のキーはほかにもあり、Hang(番号から本文をぶら下げる)、Align(同じ段の項目の頭をそろえる)、MarginIndent(左マージンと段落字下げ)、FinalSpace(番号と本文の間隔、既定 .3em)、CtrCom(番号全体を \fbox などで包む)が使えます。値の中にカンマや閉じ括弧そのものを書きたいときは、\ListProperties(FinalMark={)}) のように波括弧で囲みます。

# @ & — どのマーカーを選ぶか(表を壊すのはどれか)

マーカーはパッケージオプションで選びます。無指定なら節記号 §[pilcrow][sharp]#[at]@[ampersand]&。選んだ 1 文字が \begin{easylist}\end{easylist} のあいだだけ アクティブ文字 になり、外では元の文字に戻ります。ここでよく流布している助言——「# は LaTeX の引数記号だから表の中で衝突する。& に替えれば安全」——は、実測すると逆でした

TeX Live 2024 で tabular を easylist 環境の中に入れて試したところ、[sharp]問題なく通りました\newcommand を外で定義しておけば、その呼び出しもリスト内で普通に動きます。ところが [ampersand] で同じことをすると、& が列区切りではなく項目マーカーとして食われ、! Missing } inserted. ! Missing \cr inserted. ! Missing { inserted. が連鎖して、表のセルがそのまま第 2・第 3・第 4 項目に化けました。表を含むリストで & を選ぶのは、最悪の選択です。逆に # が本当に壊れるのは、環境の中で新しいマクロを定義したときでした。# \inside{boom} の直前に \newcommand\inside[1]{[#1]} を置くと、#1 がマーカーとして解釈されて定義が成立せず、! Undefined control sequence. になります。マクロは環境の外で定義するか、リスト内で \Activate\Deactivate を使ってマーカーを一時的に切ってください。

オプションマーカー実測した挙動
(none)§(節記号・既定)キーボードから打ちにくいのが唯一の難点
pilcrow(段落記号)§ と同じ扱い。打ちにくさも同じ
sharp#tabular の中でも通る。ただし環境内でのマクロ定義は不可。\# と書けば文字としても出せる
at@beamer の frame では番号が付かず @ がそのまま刷られた。地の文に @ を含む文書では避ける
ampersand&tabular を含むリストでは壊滅する。! Missing \cr inserted. が出て表がリスト項目に化ける

beamer で番号が消える — [fragile] を忘れたとき

beamer のスライドで easylist を使うなら、フレームに [fragile] を付けます。付ければ [sharp][at] も期待どおりに番号を振ってくれました。付けないと、二つのマーカーで症状がまったく違います。[sharp] は派手に失敗し、! Illegal parameter number in definition of \iterate. と、macro parameter character を内部垂直モードでは使えないという旨の ! You can't use ... を吐いて、項目が 1 行に潰れました。[at] のほうが厄介で、終了コードは 0、エラーはゼロ、それでいて PDF には @ One. @@ Two. とマーカーがそのまま刷られていました。静かに壊れるほうが後で困ります。

beamer
\documentclass{beamer}
\usepackage[sharp]{easylist}
\begin{document}
% [fragile] is required: without it the markers are tokenised before
% easylist has a chance to make them active.
\begin{frame}[fragile]{Nested points}
\begin{easylist}
# First point.
## Supporting detail.
\end{easylist}
\end{frame}
\end{document}

もうひとつ、よく心配されるのが enumitem との相性です。衝突しません。 enumitem を先に読んでも後に読んでも、TeX Live 2024 では両方ともエラーなしで通り、同じ文書の中で easylist のリストと \begin{itemize}[label=\textbullet] が並存しました。役割が重なっていないからで、enumitemitemizeenumerate の見た目をキーと値で作り替えるパッケージ、easylist はそれらとは別の環境を新しく足すパッケージです。同居させて困ることは、少なくとも読み込みの段階ではありません。

easylist と enumitem、どちらを使うか

判断はほぼひとつの問いで決まります——深さそのものが文書の構造か、それとも見た目の問題か。契約書の条項、規格書、法令、細かく枝分かれするアウトラインのように、5 段・6 段の階層が意味を持つ文章なら easylist です。# を一つ足すだけで一段深くなり、書いているあいだ \begin\end の対応を数えずに済む軽さは、実際に長い条文を打ってみると効きます。逆に、リストは 2〜3 段までで、番号の書式・行間・インライン化・ラベルの差し替えを細かく制御したいのなら enumitem が本筋です。キーと値で組み立てる設計思想はそちらが持ち主で、easylist の \ListProperties はその代わりにはなりません。

最後にもう一点。標準の itemizeenumerate別々の深さカウンタを持つので、二つを交互に入れ子にすれば 6 段まで掘れます——この事実は custom-labels のページが実測しています。つまり「4 段の壁」は思っているより高くありません。それでも easylist に手を伸ばす価値があるのは、6 段を超えるとき、あるいは環境の対応を数えるのに疲れたときです。easylist は Paul Isambert 作、TeX Live 2024 同梱版は v1.4(2014 年 1 月 11 日)、ライセンスは LPPL。10 年動きのないパッケージですが、やることが少ないぶん、壊れる場所も少ないままです。