easylist 是一个包(由 Paul Isambert 开发,在 LPPL 下的 CTAN 上分发),您可以在其中通过每行开头的*标记字符数*来表达深度嵌套的列表。嵌套标准itemize 或enumerate 在四层停止,但easylist 没有深度限制。它的优势在于可以简洁地编写 5 层、6 层深度的列表,非常适合法律文档和结构精细的大纲。
标记数就是级别
普通的嵌套列表在每个级别更深地堆叠 \begin{itemize} … \item … \end{itemize}。 easylist采取了完全不同的策略。在 \begin{easylist} … \end{easylist} 内,行开头的标记字符数 *是* 该项目的级别。一个标记表示第 1 级,两个表示第 2 级,三个表示第 3 级,依此类推 — 没有 \item,没有嵌套环境。
标记是单个 活动字符 — 它仅在 easylist 环境内具有特殊含义,并在外部恢复为普通自身。默认标记是节号 §,但由于键入起来很麻烦,\usepackage 选项可让您切换到更简单的字符(见下文)。在此页面上,我们使用 # 作为标记,如全文所假设的那样。要获取#,请将包加载为\usepackage[sharp]{easylist}。
这是使用# 作为标记的最小示例。带有一个 # 的行是级别 1,## 是级别 2,### 是级别 3。 始终在标记运行之后放置一个空格 — 如果没有它,则不会打印任何数字。每个标记还会自动开始一个新行,因此在一行上一起运行项目会得到相同的结果。
\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}处理此项目时会自动按深度对项目进行编号,并使用句点分隔符:1 / 1.1 / 1.1.1 / 1.1.2 / 1.1.2.1 / 2。如果您跳过某个级别,则跳过的级别将计为 0(例如,紧随第 1 级项目之后的第 3 级项目将变为 1.0.1)。
选择标记 — 为什么 [at] 存在
您可以使用封装选项来选择标记。如果没有,则为§; [pilcrow] 给出¶,[sharp] 给出#,[at] 给出@,[ampersand] 给出&。无论您选择什么,用法都是相同的:所选字符仅在 \begin{easylist} 和 \end{easylist} 之间有效。
| 选项 | 标记 | |
|---|---|---|
(none) | §(部分符号,默认) | 默认 |
pilcrow | ¶ (pilcrow) | \usepackage[pilcrow]{easylist} |
sharp | #(数字符号) | \usepackage[sharp]{easylist} |
at | @(符号处) | \usepackage[at]{easylist} |
ampersand | &(与号) | \usepackage[ampersand]{easylist} |
值得一问的是为什么要提供[at] (@)。 # 是LaTeX 在宏定义(#1、#2、...)中的参数字符,在tabular 和其他地方具有特殊含义。因此,选择 # 作为标记会导致 宏定义和表内部发生冲突。活跃角色一开始就很棘手,而且在盒子里行为不端。在这些情况下,最安全的做法是切换到不易发生冲突的标记,例如[at] (@) 或[ampersand] (&)。
如果必须将简单标记与环境内部使用的命令结合起来,请在 easylist 环境外部定义这些命令,或者在列表中使用 \Activate 和 \Deactivate(将标记变为活动/非活动状态)。默认创建十级计数器;要深入了解,请使用 \usepackage[50]{easylist} 等数字选项来增加计数。
使用\ListProperties 进行样式设置
编号、标记、缩进和布局的其余部分由\ListProperties(...) 一起控制。您在括号内编写以逗号分隔的 key=value 对,\ListProperties 会影响所有后续项目和列表。许多键都有按级别编号的形式:Numbers 适用于每个级别,Numbers3 仅适用于级别 3(一般来说,key + 级别编号)。使用\NewList重置为默认值。
| 密钥 | 它的作用 | |
|---|---|---|
Numbers / Numbersn | 数字样式。 a=阿拉伯语(默认)、r/R=小写/大写罗马字符、l/L=小写/大写字母、z=Zapf Dingbats | 允许每级样式 |
Mark / FinalMark | 计数器之间的标点符号(默认句点)。 FinalMark 是最后一个计数器之后的标记 | 例如\ListProperties(Mark=.,FinalMark=) |
Style / Stylen | 数字和文本的字体。 * 仅针对数字,** 仅针对文本 | 通过\bfseries、\color{blue} 等。 |
Hide / Hiden | 隐藏前n个计数器;让您可以制作未编号的列表 | Hide=10000 隐藏每个级别 |
Start / Startn* | 计数器起始值; * 形式将其与外部计数器联系起来(例如\thesection) | \ListProperties(Start1*=\thesection) |
Progressive / Progressive* | 左边距随深度增加; * 表单将级别 1 保持在当前边距 | \ListProperties(Progressive*=.5cm) |
Space / Space* | 项目之间的垂直空间; *形式位于同一级别的项目之间 | 负值会压缩列表 |
例如,\ListProperties(Numbers3=l, FinalMark=) 使级别 3 使用字母编号 a, b, c… 并删除尾随句点。要在值中使用原义逗号或右括号,请将其括在大括号中,如 \ListProperties(FinalMark={)}) 中。其他键允许微调:Hang(让文本悬挂在数字上),Align(在同一级别排列项目),Margin/Indent(左边距和段落缩进),FinalSpace(数字和文本之间的间隙,默认.3em)和CtrCom(将整个数字包装在\fbox等命令中)。
一个深度嵌套的例子
无深度限制,可以直接编写合同条款等五级更深的结构。下面的示例将 1 级设为粗体,将 2 级设为罗马数字,将 3 级设为小写字母,并按深度逐渐缩进。请注意,添加单个标记字符会使您更深一层。
\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 级数字为 1 和 2(粗体、阿拉伯语),第 2 级为大写罗马字母,第 3 级为小写字母,组成为 1.I.a、1.II.a。 4 级和 5 级进一步缩进,只需写#### 和##### 即可出现。使用嵌套的 enumerate 编写相同的结构会在四个级别上堵塞,并且需要额外的设置(例如使用 enumitem)才能更深入 - 使用 easylist 您只需添加一个标记。
什么时候去拿它
easylist 是小众的,但当您达到标准列表的四级限制时,这是一个受欢迎的替代方案。当您想要列出既编号又深入的项目(法律文件、术语、规范和多层次的大纲)时,它就会发挥作用。对于普通的浅列表、样式丰富的级别或内联列表,itemize/enumerate 或 enumitem 更为自然。因为 # 标记可能与宏和表冲突,所以它在独立的散文级列表中是最安全的。