easylist

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.

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}

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}.

OptionMarker
(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.

KeyWhat it does
Numbers / NumbersnNumber style. a=arabic (default), r/R=lower/upper roman, l/L=lower/upper letters, z=Zapf DingbatsPer-level styles are allowed
Mark / FinalMarkPunctuation between counters (default period). FinalMark is the mark after the last countere.g. \ListProperties(Mark=.,FinalMark=)
Style / StylenTypeface of number and text. * targets the number only, ** the text onlyPass \bfseries, \color{blue}, etc.
Hide / HidenHide the first n counters; lets you make unnumbered listsHide=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 levelNegative 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.

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}

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.