easylist is a package (by Paul Isambert) where you express deeply nested lists by the *number of marker characters* at the start of each line. Nesting standard itemize or enumerate stops at four levels, but easylist has no depth limit. Its strength is writing 5-, 6-level-deep lists tersely — ideal for legal documents and finely structured outlines.
The marker count is the level
A normal nested list stacks \begin{itemize} … \item … \end{itemize} deeper at each level. easylist takes a completely different tack. Inside \begin{easylist} … \end{easylist}, **the number of marker characters at the start of a line *is* the level of that item**. One marker means level 1, two means level 2, three means level 3, and so on — no \item, no nested environments.
The marker is a single active character — it has special meaning only inside the easylist environment and reverts to its ordinary self outside. The default marker is the section sign **§**, but because that is awkward to type, a \usepackage option lets you switch to an easier character (see below). On this page we use **#** as the marker, as assumed throughout. To get #, load the package as \usepackage[sharp]{easylist}.
Here is a minimal example using # as the marker. A line with one # is level 1, ## is level 2, ### is level 3. Always put a space right after the run of markers — without it, no number is printed. Each marker also starts a new line automatically, so running items together on one line gives the same result.
\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}Processing this numbers the items automatically by depth, with period separators: 1 / 1.1 / 1.1.1 / 1.1.2 / 1.1.2.1 / 2. If you skip a level, the skipped level counts as 0 (for instance, a level-3 item right after a level-1 item becomes 1.0.1).
Choosing the marker — why `[at]` exists
You pick the marker with a package option. With none, it is §; [pilcrow] gives ¶, [sharp] gives #, [at] gives @, and [ampersand] gives &. Usage is identical whichever you choose: the selected character becomes active only between \begin{easylist} and \end{easylist}.
| Option | Marker | |
|---|---|---|
(none) | § (section sign, default) | default |
pilcrow | ¶ (pilcrow) | \usepackage[pilcrow]{easylist} |
sharp | # (number sign) | \usepackage[sharp]{easylist} |
at | @ (at sign) | \usepackage[at]{easylist} |
ampersand | & (ampersand) | \usepackage[ampersand]{easylist} |
It is worth asking why [at] (@) is provided at all. # is LaTeX’s parameter character in macro definitions (#1, #2, …) and carries special meaning in tabular and elsewhere. So choosing # as the marker invites clashes inside macro definitions and tables. Active characters are tricky to begin with and misbehave inside boxes. In those situations it is safest to switch to a less conflict-prone marker such as [at] (@) or [ampersand] (&).
If you must combine an easy marker with commands used inside the environment, either define those commands outside the easylist environment, or use \Activate and \Deactivate (which turn the marker active/inactive) within the list. By default ten levels of counters are created; to go deeper, raise the count with a numeric option like \usepackage[50]{easylist}.
Styling with `\ListProperties`
Numbering, marks, indentation and the rest of the layout are controlled together by \ListProperties(...). You write key=value pairs separated by commas inside the parentheses, and \ListProperties affects all subsequent items and lists. Many keys have a per-level numbered form: Numbers applies to every level, Numbers3 to level 3 only (in general, key + level number). Reset to defaults with \NewList.
| Key | What it does | |
|---|---|---|
Numbers / Numbersn | Number style. a=arabic (default), r/R=lower/upper roman, l/L=lower/upper letters, z=Zapf Dingbats | Per-level styles are allowed |
Mark / FinalMark | Punctuation between counters (default period). FinalMark is the mark after the last counter | e.g. \ListProperties(Mark=.,FinalMark=) |
Style / Stylen | Typeface of number and text. * targets the number only, ** the text only | Pass \bfseries, \color{blue}, etc. |
Hide / Hiden | Hide the first n counters; lets you make unnumbered lists | Hide=10000 hides every level |
Start / Startn* | Counter start value; the * form ties it to an external counter (e.g. \thesection) | \ListProperties(Start1*=\thesection) |
Progressive / Progressive* | Left margin grows with depth; the * form keeps level 1 at the current margin | \ListProperties(Progressive*=.5cm) |
Space / Space* | Vertical space between items; the * form is between items of the same level | Negative values compact the list |
For instance, \ListProperties(Numbers3=l, FinalMark=) makes level 3 use letter numbering a, b, c… and drops the trailing period. To use a literal comma or closing parenthesis in a value, wrap it in braces, as in \ListProperties(FinalMark={)}). Other keys allow fine tuning: Hang (let text hang from the number), Align (line up items at the same level), Margin/Indent (left margin and paragraph indent), FinalSpace (gap between number and text, default .3em), and CtrCom (wrap the whole number in a command such as \fbox).
A deeply nested example
With no depth limit, you can write five-level-and-deeper structures such as contract clauses directly. The example below makes level 1 bold, level 2 roman numerals, and level 3 lowercase letters, indenting progressively by depth. Note that adding a single marker character drops you one level deeper.
\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}In this example, level 1 numbers are 1 and 2 (bold, arabic), level 2 are uppercase roman, and level 3 are lowercase letters, composed as 1.I.a, 1.II.a. Levels 4 and 5 indent further and appear simply by writing #### and ##### . Writing the same structure with nested enumerate would jam at four levels and need extra setup (e.g. with enumitem) to go deeper — with easylist you just add a marker.
When to reach for it
easylist is niche, but a welcome alternative when you hit the four-level limit of standard lists. It shines when you want list items that are both numbered and deep — legal documents, terms, specifications, and outlines with many levels. For ordinary shallow lists, heavily styled levels, or inline lists, itemize/enumerate or enumitem are more natural. Because the # marker can clash with macros and tables, it is safest in a self-contained, prose-level list.