easylist

LaTeX의 목록은 네 단계에서 길이 끊깁니다. easylist는 중첩 환경 자체를 포기하는 방식으로 그 벽을 넘습니다. \begin{easylist} 안에서는 # 문자의 개수가 곧 깊이여서, ###이면 3단, #####이면 5단입니다. \item도, 중첩된 \begin도 필요 없습니다. 게다가 이 패키지에는 tractatus라는 이름의 기성 스타일이 있는데, 비트겐슈타인 『논리철학논고』의 번호 매김을 그대로 재현합니다. 이 페이지에서는 easylist를 쓰는 법, 실제 상한선(열 단계와 그때 나오는 오류), 그리고 enumitem을 이기는 경우와 그렇지 못한 경우를 TeX Live 2024에서 직접 조판해 확인하며 살펴봅니다.

easylist 사용법 — #의 개수가 곧 단계

\usepackage[sharp]{easylist}로 불러온 뒤 easylist 환경 안에서 각 줄을 # 묶음으로 시작하면 됩니다. # 하나면 1단, ##이면 2단입니다. 마커 묶음 바로 뒤에는 반드시 공백을 하나 둡니다. \item은 쓰지 않습니다. 쓸 자리 자체가 없습니다. easylist는 중첩 환경을 만들지 않으므로 깊이는 열려 있는 \begin의 개수가 아니라 그 줄이 지닌 #의 개수만으로 정해집니다. 깊이에 제한이 없다고 말하는 이유가 여기에 있고, 목록 중간 어디서든 단계를 자유롭게 오르내릴 수 있는 이유도 같습니다.

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}

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로 시작하는 세 줄이 나왔고, 요지는 패키지를 불러올 때 지정하지 않는 한 마커를 열 개까지만 쓸 수 있다는 것이었습니다. 게다가 그래도 생성된 PDF에는 11단 이후의 모든 항목이 번호 자리에 !!!라는 글자를 달고 나타났습니다. 로그에서 이 오류를 놓치면 느낌표 세 개가 박힌 목록이 인쇄됩니다.

해결책은 오류가 스스로 알려 줍니다. 단계 수를 숫자 옵션으로 넘기면 됩니다. \usepackage[sharp,14]{easylist}로 같은 원고를 통과시키니 오류 없이 1.1.1.1.1.1.1.1.1.1.1.1.1.1.까지 찍혔습니다. 숫자는 얼마든 가능하지만 카운터는 불러올 때 확보되므로 필요한 만큼만 요청하는 편이 좋습니다. 그리고 정말로 열 단계가 넘는 목록을 쓰고 있다면, 뻔하지만 이런 조언도 덧붙입니다. 의심해야 할 것은 아마 문서의 구조 쪽입니다.

tractatus부터 itemize까지 — 여섯 가지 기성 스타일

easylist에는 여섯 가지 기성 스타일이 있고, \begin{easylist}[tractatus]처럼 환경의 선택 인수로 지정합니다. 이름은 tractatus, checklist, booktoc, articletoc, enumerate, itemize이며 easylist.sty의 820행 부근에 정의되어 있습니다. 이 가운데 첫 번째는 이름 그대로 비트겐슈타인 『논리철학논고』의 번호 체계입니다. 실제로 조판하면 1. 1.1 1.11 1.2 2.로 나옵니다. 1단 뒤에만 마침표가 붙고, 그보다 깊은 단은 숫자가 그대로 이어집니다. 1921년에 나온 그 책의 차례가 옵션 한 단어로 되돌아옵니다.

스타일 이름출력되는 번호와 기호쓰임새
tractatus1. 1.1 1.11 1.2 2.명제를 계층으로 늘어놓는 철학・논리 문헌
checklist번호를 숨기고 항목마다 빈 네모를 놓습니다손으로 표시하는 점검표
booktoc1단은 크고 굵은 글씨에 대문자 로마 숫자, 이하는 단마다 들여쓰기손으로 짜는 목차
articletocbooktoc의 가벼운 판. 1단은 굵게, 번호 뒤에 마침표를 붙이지 않습니다논문 규모의 목차
enumerate1. (a) i. A.표준 enumerate와 같은 모습 그대로 더 깊이
itemize ·번호 없는 글머리표. 표준 기호를 흉내 냅니다

이 가운데 enumerateitemize표준 목록의 모습을 일부러 흉내 낸 것입니다. 실측하면 앞의 것은 1. (a) i. A.를, 뒤의 것은 ·를 출력했습니다. 다만 itemize 프리셋이 쓰는 것은 \labelitemi 같은 진짜 라벨 명령이 아니라 \textbullet, --, $\ast$, $\cdot$로 손수 만든 근사치입니다(easylist.sty 858~864행). 표준 기호가 실제로 어떻게 정의되어 있는지는 custom-labels 페이지가 실측해 두었으니, 기호 자체를 손보려면 그쪽이 본줄기입니다. easylist의 값어치는 그 모습 그대로 5단, 6단으로 나아갈 수 있다는 데 있습니다.

\ListProperties로 번호와 들여쓰기 정하기

기성 스타일로 모자란 부분은 \ListProperties(...)로 손봅니다. 소괄호 안에 key=value를 쉼표로 구분해 늘어놓는 방식이며, 그 뒤의 모든 항목과 목록에 적용됩니다. 많은 키에는 단계별 형태가 있어 키 이름 뒤에 단계 번호를 붙이면 됩니다. Numbers는 전 단계, Numbers3은 3단에만 적용됩니다. \NewList를 부르면 기본값으로 되돌아갑니다. 참고로 \ListProperties필수가 아닙니다. 아무것도 쓰지 않아도 easylist는 동작합니다. 이 페이지의 첫 예제가 그렇습니다. 설정은 어디까지나 모습을 바꾸고 싶을 때의 이야기입니다.

기능작성 예
Numbers번호 종류. a 아라비아 숫자(기본), r/R 소・대문자 로마 숫자, l/L 소・대문자 알파벳, z Zapf DingbatsNumbers2=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
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}

이 예에서는 1단 번호만 굵은 아라비아 숫자, 2단은 대문자 로마 숫자, 3단은 소문자 알파벳이 되어 1.I.a.처럼 합성됩니다. 4단과 5단은 #### , ##### 라고만 쓰면 되고, Progressive가 지정한 1.5em씩 더 깊이 들여쓰여 나옵니다. 세부 조정용 키로는 Hang(번호에서 본문을 늘어뜨림), Align(같은 단 항목의 머리를 맞춤), MarginIndent(왼쪽 여백과 문단 들여쓰기), FinalSpace(번호와 본문 사이 간격, 기본 .3em), CtrCom(번호 전체를 \fbox 등으로 감쌈)이 있습니다. 값 안에 쉼표나 닫는 괄호 자체를 넣고 싶으면 \ListProperties(FinalMark={)})처럼 중괄호로 감쌉니다.

# @ & — 어떤 마커를 고를까, 표를 망가뜨리는 것은 어느 쪽인가

마커는 패키지 옵션으로 고릅니다. 지정하지 않으면 절 기호 §, [pilcrow], [sharp]#, [at]@, [ampersand]&입니다. 고른 한 글자는 \begin{easylist}\end{easylist} 사이에서만 활성 문자가 되고 밖에서는 원래 문자로 돌아갑니다. 여기서 널리 퍼진 조언, 곧 #은 LaTeX의 인수 기호라 표 안에서 충돌하니 &로 바꾸는 편이 안전하다는 말은 실측해 보니 정반대였습니다.

TeX Live 2024에서 tabular를 easylist 환경 안에 넣어 시험한 결과 [sharp]아무 문제 없이 통과했습니다. 환경 밖에서 정의해 둔 매크로를 목록 안에서 호출하는 것도 평소대로 동작합니다. 그런데 [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.와, 매크로 인수 문자를 내부 수직 모드에서 쓸 수 없다는 취지의 ! You can't use ...를 뱉고 항목이 한 줄로 뭉갰습니다. 더 성가신 쪽은 [at]입니다. 종료 코드는 0, 오류는 하나도 없는데 PDF에는 @ One. @@ Two.라고 마커가 그대로 인쇄되어 있었습니다. 조용히 망가지는 쪽이 나중에 곤란합니다.

beamer
\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과의 궁합입니다. 충돌하지 않습니다. TeX Live 2024에서는 enumitem을 먼저 읽든 나중에 읽든 오류 없이 통과했고, 같은 문서 안에서 easylist 목록과 \begin{itemize}[label=\textbullet]이 나란히 공존했습니다. 역할이 겹치지 않기 때문입니다. enumitemitemizeenumerate의 모습을 키와 값으로 바꾸는 패키지이고, easylist는 그와 별개의 환경을 새로 더하는 패키지입니다. 함께 두어 곤란할 일은 적어도 불러오는 단계에서는 없습니다.

easylist와 enumitem 중 무엇을 쓸까

판단은 거의 한 물음으로 갈립니다. 깊이 자체가 문서의 구조인가, 아니면 겉모습의 문제인가. 계약서 조항, 규격서, 법령, 잘게 갈라지는 개요처럼 5단・6단의 계층이 의미를 지니는 글이라면 easylist입니다. #을 하나 더할 뿐 한 단 깊어지고, 쓰는 동안 \begin\end의 짝을 세지 않아도 되는 가벼움은 긴 조문을 실제로 쳐 보면 확실히 느껴집니다. 반대로 목록이 2~3단에서 끝나고 번호 서식・행간・인라인화・라벨 교체를 세밀히 제어하고 싶다면 enumitem이 본줄기입니다. 키와 값으로 조립하는 설계 사상은 그쪽이 주인이고, easylist의 \ListProperties가 그것을 대신하지는 못합니다.

마지막으로 한 가지. 표준 itemizeenumerate별개의 깊이 카운터를 지니므로 둘을 번갈아 중첩하면 6단까지 팔 수 있습니다. 이 사실은 custom-labels 페이지가 실측했습니다. 즉 그 유명한 “4단의 벽”은 보이는 것만큼 높지 않습니다. 그래도 easylist에 손을 뻗을 값어치가 있는 것은 6단을 넘길 때, 또는 환경의 짝을 세는 데 지친 날입니다. easylist는 Paul Isambert가 만들었고, TeX Live 2024 동봉판은 v1.4(2014년 1월 11일), 라이선스는 LPPL입니다. 10년째 움직임이 없는 패키지지만, 하는 일이 적은 만큼 망가질 자리도 적은 채로 남아 있습니다.