Списки: itemize, enumerate, description

Урок про три вида списков LaTeX: маркированный, нумерованный и список-описание, плюс вложенность.

Окружение — это блок \begin{имя}...\end{имя}; списки строятся именно как окружения.

Списки — это уже знакомство с окружениями, главным строительным блоком LaTeX. Понять списки — значит понять, как устроены таблицы, формулы и рисунки.

Маркированный список

\begin{itemize}
  \item Первый пункт
  \item Второй пункт
  \item Третий пункт
\end{itemize}

Окружение itemize рисует маркеры-точки. Каждый пункт начинается с команды \item.

Нумерованный список

\begin{enumerate}
  \item Шаг один
  \item Шаг два
  \item Шаг три
\end{enumerate}

Окружение enumerate само проставляет номера 1, 2, 3. Вставите пункт в середину — нумерация пересчитается.

Список-описание

В description у каждого пункта есть «термин» в квадратных скобках:

\begin{description}
  \item[CPU] центральный процессор
  \item[RAM] оперативная память
  \item[SSD] твердотельный накопитель
\end{description}

Удобно для глоссариев и пояснений «термин — определение».

Вложенность

Списки можно вкладывать друг в друга до четырёх уровней; LaTeX сам меняет вид маркеров и номеров по уровням:

\begin{enumerate}
  \item Раздел
  \begin{itemize}
    \item подпункт
    \item подпункт
  \end{itemize}
  \item Следующий раздел
\end{enumerate}

На втором уровне enumerate номера станут «(a) (b)», маркеры itemize сменятся с точки на тире. Это часть автоматики — вы не настраиваете вид вручную.

Глубина вложенности не случайно ограничена четырьмя уровнями. У LaTeX заранее определены ровно четыре набора счётчиков и меток для каждого типа списка (например, enumi, enumii, enumiii, enumiv), и пятый уровень упрётся в ошибку Too deeply nested. Это не техническая мелочь, а намёк от системы: список глубже четырёх уровней почти всегда означает, что структуру стоит переосмыслить. Глубоко вложенные перечисления тяжело читаются, а правый край съезжает всё дальше из-за нарастающих отступов. Чаще такую информацию лучше разбить на разделы с заголовками или вынести в таблицу.

Маркеры и формат номеров на каждом уровне заданы не «жёстко», а через переопределяемые команды: за вид меток itemize отвечают \labelitemi\labelitemiv, а за формат номеров enumerate — связки \labelenumi и \theenumi. Поэтому стандартную последовательность «точка → тире → звёздочка → точка» или нумерацию «1 → a → i → A» можно переопределить, если требуется фирменный стиль. Но трогать эти внутренности руками громоздко — для настройки давно есть пакет, о котором ниже.

Как работает под капотом

Все три списка — это варианты одного общего механизма list. У каждого уровня вложенности есть свой счётчик (enumi, enumii, ...) и свой шаблон метки. Команда \item завершает предыдущий пункт, увеличивает счётчик (для нумерованных) и печатает метку. Пакет enumitem позволяет тонко настроить отступы, символы маркеров и нумерацию, если стандартного вида не хватает.

Пакет enumitem заслуживает отдельного слова, потому что закрывает почти все реальные потребности по оформлению списков. Параметры передают прямо в квадратных скобках при открытии окружения. Например, \begin{itemize}[noitemsep] убирает лишние вертикальные отступы между пунктами и делает список компактным; [label=\textbullet] задаёт свой символ маркера; а для нумерованных \begin{enumerate}[label=\arabic*)] печатает номера в виде «1) 2) 3)» вместо «1. 2. 3.». Доступны и продвинутые трюки: resume продолжает нумерацию прерванного списка после вставленного абзаца, а start=5 начинает отсчёт не с единицы. Всё это гораздо чище ручного переопределения внутренних команд.

Полезно понимать и пространство вокруг списка. Между \item разрешён обычный текст, дополнительные абзацы и даже вложенные окружения — пункт «тянется» до следующего \item или до \end. У enumerate есть удобная пара с командой \label и \ref: пометив пункт, можно потом сослаться на его номер из любого места документа, и при перенумерации ссылка обновится сама. А вот команду \item[...] с явной меткой в квадратных скобках стоит знать для всех трёх типов: в description она задаёт термин, а в itemize/enumerate разово подменяет маркер конкретного пункта — например, поставить «галочку» или прочерк у одного элемента, не трогая остальные.

Частые ошибки

  • Текст между \begin{itemize} и первым \item — ошибка «Something's wrong--perhaps a missing \item».
  • Незакрытое окружение (\begin без \end) — ошибка о незавершённом блоке.
  • Ручная нумерация пунктов вместо enumerate — теряется автопересчёт.

Итоги

  • Три списка-окружения: itemize (маркеры), enumerate (номера), description (термины).
  • Каждый пункт — \item; нумерация и вид маркеров автоматические.
  • Списки вкладываются; на разных уровнях метки меняются сами.
Проверьте себя
1. Какое окружение даёт автоматическую нумерацию пунктов?
Aitemize
Benumerate
Cdescription
Dlist*
2. Что произойдёт, если поставить текст до первого \item внутри itemize?
AТекст станет заголовком списка
BВозникнет ошибка о пропущенном \item
CТекст просто исчезнет
DНичего, это допустимо
3. Для чего удобен список description?
AДля нумерованных шагов
BДля пар «термин — определение», глоссариев
CТолько для вложенных списков
DДля таблиц