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 は入れ子の環境を作らないので、深さは環境の重なりではなく、その行の # の個数だけで決まります。これが「段数に上限がない」と言われる理由であり、同時に、リストの途中で好きなだけ段を上下できる理由でもあります。
\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] のように環境の省略可能引数で指名します。名前は tractatus・checklist・booktoc・articletoc・enumerate・itemize の 6 つで、easylist.sty の 820 行目付近に定義されています。うち tractatus は、その名のとおり ヴィトゲンシュタイン『論理哲学論考』の番号体系です。実際に組んでみると 1. 1.1 1.11 1.2 2. と出ます——第 1 段のあとだけピリオドが入り、それより深い段は数字が繋がって伸びていく。1921 年に出たあの本の目次そのものが、オプション一語で手に入るわけです。
| スタイル名 | 出る番号・記号 | 使いどころ |
|---|---|---|
tractatus | 1. 1.1 1.11 1.2 2. | 命題を階層で並べる哲学・論理の文章 |
checklist | 番号を隠し、各項目の頭に空の四角枠を置く | 手で印を付ける確認表 |
booktoc | 第 1 段が大きな太字と大文字ローマ数字、以降は段ごとに字下げ | 手で目次を組む |
articletoc | booktoc の軽い版。第 1 段が太字で、番号の末尾にピリオドを付けない | 論文規模の目次 |
enumerate | 1. (a) i. A. の順 | 標準の enumerate と同じ見た目のまま深く掘る |
itemize | • – ∗ · の順 | 番号を出さない箇条書き。標準の記号を模している |
enumerate と itemize の 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 Dingbats | Numbers2=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 |
\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(同じ段の項目の頭をそろえる)、Margin と Indent(左マージンと段落字下げ)、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. とマーカーがそのまま刷られていました。静かに壊れるほうが後で困ります。
\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] が並存しました。役割が重なっていないからで、enumitem は itemize と enumerate の見た目をキーと値で作り替えるパッケージ、easylist はそれらとは別の環境を新しく足すパッケージです。同居させて困ることは、少なくとも読み込みの段階ではありません。
easylist と enumitem、どちらを使うか
判断はほぼひとつの問いで決まります——深さそのものが文書の構造か、それとも見た目の問題か。契約書の条項、規格書、法令、細かく枝分かれするアウトラインのように、5 段・6 段の階層が意味を持つ文章なら easylist です。# を一つ足すだけで一段深くなり、書いているあいだ \begin と \end の対応を数えずに済む軽さは、実際に長い条文を打ってみると効きます。逆に、リストは 2〜3 段までで、番号の書式・行間・インライン化・ラベルの差し替えを細かく制御したいのなら enumitem が本筋です。キーと値で組み立てる設計思想はそちらが持ち主で、easylist の \ListProperties はその代わりにはなりません。
最後にもう一点。標準の itemize と enumerate は 別々の深さカウンタを持つので、二つを交互に入れ子にすれば 6 段まで掘れます——この事実は custom-labels のページが実測しています。つまり「4 段の壁」は思っているより高くありません。それでも easylist に手を伸ばす価値があるのは、6 段を超えるとき、あるいは環境の対応を数えるのに疲れたときです。easylist は Paul Isambert 作、TeX Live 2024 同梱版は v1.4(2014 年 1 月 11 日)、ライセンスは LPPL。10 年動きのないパッケージですが、やることが少ないぶん、壊れる場所も少ないままです。