itemize

The bullet that LaTeX’s itemize puts at the head of each line used to lean over whenever it landed inside italic text, because the marker inherited whatever font was in force around it. The release of 2020-02-02 introduced a command called \labelitemfont and finally stopped it. The dot in a bulleted list, in other words, is not decoration but a character that gets typeset like any other. This page approaches itemize from three angles: where those markers are actually defined, what happens when you replace one with \item[...], and which two lengths decide the gap between entries.

Where the bullet is defined: \labelitemi through \labelitemiv

The markers do not live in the itemize environment at all — they live in the document class. Open article.cls and you find four commands in a row, \labelitemi through \labelitemiv, holding \textbullet (•), a bold \textendash (–), \textasteriskcentered (*) and \textperiodcentered (·). All itemize itself does is count how deep it currently is, assemble the name \labelitem plus a Roman numeral, and call whatever that name holds. So changing a marker never means touching the environment: you replace the command. And the reason there is nothing after the fourth is equally plain — no fifth name was ever defined.

CommandLevelMarkerContents in article.cls
\labelitemi1\labelitemfont \textbullet
\labelitemii2\labelitemfont \bfseries \textendash (bold)
\labelitemiii3*\labelitemfont \textasteriskcentered
\labelitemiv4·\labelitemfont \textperiodcentered
\labelitemfont\normalfont; insulates the marker from the surrounding font

The last row, \labelitemfont, is the 2020 fix mentioned at the top. All four markers are invoked with it in front, so a list dropped inside an italic or bold block now keeps its marker upright. You can also turn that to your advantage and set the markers in a different face entirely: \renewcommand{\labelitemfont}{\normalfont\sffamily} leaves the body text seriffed while the markers come out sans-serif. To replace the marker for a whole level, override the matching \labelitem… with \renewcommand. Put it in the preamble to affect the whole document, or inside an environment or group to affect only that part.

latex
% swap the first-level marker for the whole document
\renewcommand{\labelitemi}{$\diamond$}

\begin{itemize}
  \item this level now uses a diamond
  \item so does this one
\end{itemize}

Replacing the marker for one entry with \item[...]

Give \item an argument in square brackets and that entry alone gets the bracketed content as its marker. \item[$\star$] gives a star, \item[--] a dash, \item[Note] the literal word “Note” set where the bullet would be. One widespread misconception is worth correcting here: a bracketed label in itemize is not set in bold. Bold labels come from the description environment, whose \descriptionlabel does include \bfseries. The label formatter in itemize is nothing but \hss\llap{…} — it right-aligns the label and leaves the font alone.

latex
\begin{itemize}
  \item the default marker
  \item[$\star$] a star for this one entry
  \item[Note] a whole word in the marker slot
\end{itemize}

That \llap also creates a trap. The label is set right-aligned in a box \labelwidth wide, and \llap overflows silently. \item[Note] fits comfortably, but a long word like \item[Prerequisite] stretches leftwards past the text block and, in bad cases, off the printed area entirely. The leading does not break and no Overfull \hbox warning appears, so nothing tells you until you look at the PDF. If you want words as labels, that is description’s job rather than itemize’s; and with enumitem you can reserve room using labelwidth= and leftmargin=.

When the entries sit too far apart: \itemsep and \parsep

The gap between two entries is not one length but the sum of two. Before starting the next entry, \item inserts \itemsep; immediately afterwards a new paragraph begins, which contributes \parskip as well — and inside a list \parskip has been set to \parsep. The real gap, therefore, is \itemsep + \parsep. In a 10pt article both are 4pt at level 1, so 8pt in total; against a 12pt leading that is two thirds of a line of air between entries. This is usually what people are seeing when a list “looks stretched”, and it is why zeroing \itemsep alone only closes up half the distance.

LengthLevel-1 default (10pt article)What it controls
\itemsep4pt plus 2pt minus 1ptthe space \item adds before the next entry
\parsep4pt plus 2pt minus 1ptbetween paragraphs of one entry; also becomes \parskip, so it lands between entries too
\topsep8pt plus 2pt minus 4ptthe space above and below the whole list
\partopsep2pt plus 1pt minus 1ptadded on top of \topsep only when a blank line precedes the list

The last row describes behaviour that trips up everyone at least once. Whether or not you leave a blank line before \begin{itemize} changes the space above the list from 8pt to 10pt: a blank line makes the list start in vertical mode, which is exactly when \partopsep gets added. Reflowing a source file and finding the page layout has shifted is very often this. The numbers themselves have a twist too — they are rubber lengths with plus and minus components, so when the page is made up they may shrink to 6pt or stretch to 12pt. The figures are not what lands on paper. Deeper levels are also tightened automatically: at level 2 both \itemsep and \parsep are 2pt, and at level 3 \parsep drops to 0pt. Nested lists look more compact by design.

latex
% tighten one list by hand: inside the body it is \parskip,
% not \parsep, that still carries the second half of the gap
\begin{itemize}
  \setlength{\itemsep}{0pt}
  \setlength{\parskip}{0pt}
  \item first
  \item second
  \item third
\end{itemize}

Note that what gets zeroed there is \parskip, not \parsep. The copy from \parsep into \parskip has already happened by the time \begin{itemize} returns, so changing \parsep once you are inside the body leaves the second 4pt in place. Measured on the page, the default 19.93pt from one entry to the next comes down only to 15.94pt if you zero \parsep, and reaches 11.96pt — exactly one line — only when \parskip goes to zero. Rather than repeat that every time, load enumitem and pass [noitemsep] (zeroes \itemsep and \parsep) or [nosep] (zeroes \topsep and \partopsep on top of that); \setlist then makes either the document-wide default. A related complaint is that lists break across pages in awkward places. That is design, not accident: the article class sets \@itempenalty to −51. A negative penalty does not say “a break is permitted here” but “a break is wanted here”, so LaTeX actively treats the seam between two entries as a good place to end a page. A list that must not be split has to be pinned down explicitly — wrapped in a minipage, or held together with \samepage.

The two errors \item can raise

An itemize cannot be empty. Close \begin{itemize}\end{itemize} without a single \item and compilation halts with ! LaTeX Error: Something's wrong--perhaps a missing \item. In practice this fires less often because someone forgot an \item than because body text or an image was placed at the very top of the list. Treat the position right after the opening as reserved: only an \item, or settings for spacing and lengths, belong there. The mirror-image failure also exists. Use \item outside any list and you get ! LaTeX Error: Lonely \item--perhaps a missing list environment. — typically after one \end{itemize} too many, or after copying a block containing \item and leaving its \begin behind. In both cases the message names the cause outright, so it is enough to take the line number and check that the surrounding \begin and \end still pair up.

When a bulleted list earns its place, and when it does not

itemize is not prose with the connectives removed; it is a device for making entries comparable side by side. The absence of numbers is itself a statement to the reader: these four things have no order and no ranking. Line up entries that differ wildly in scope, register and length and the reader goes hunting for an axis of comparison that is not there. Conversely, the moment order or priority starts to matter the list should become an enumerate; a row of bullets that quietly encodes a sequence is the hardest kind to read. What follows is a checklist for re-reading your own draft.

  • Keep the grammar parallel. If the first entry is a noun phrase, make them all noun phrases; if one is imperative, make them all imperative.
  • Go back to paragraphs when the entries grow. If each one runs past three sentences, that is body text with subheadings, not a list.
  • Nest two levels at most. LaTeX allows four, but readers can usually follow only two.
  • Switch to enumerate the moment order matters. Wanting to write “first” and “then” is the signal for a numbered list.
  • Change a marker only when it means something. \item[$\star$] exists to single an entry out, not to decorate it.