\chapter{列表}
若是帮领导起草并排版一份会议讲话稿,须知天下没有领导不偏爱含有列表的文章。大可以相信,\ConTeXt\ 列表绝对不会让领导失望。
\section{Todo List}
在偷偷使用 ChatGPT 给领导起草讲稿之前,先用 \ConTeXt\ 列表安排一下今日待办事项:
\startsample
2023 年 3 月 22 日
\startitemize
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals[2]
\stopitemize
\stopsample
\sample[option=TEX][todo-list]{待办事项}{\externalfigure[05/todo-list.pdf]}
现在你已经学会了列表的用法了,剩下的,仅仅是设定它的样式。此外,你也学到了如何写大写的罗马数字,至于小写的,将 \type{\Romannumerals} 换成 \type{\romannumerals} 即可。
\section{无序号列表}
示例 \in[todo-list] 已经展示了样式最为简单的无序号列表,列表项符号是实心圆点。该示例中的列表实际上省略了列表项符号的设定,其完整形式为
\starttyping[option=TEX]
\startitemize[1]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals[2]
\stopitemize
\stoptyping
将上述代码中的数字 1 换成 2~9 的任何一个数字,可更换另一种列表项符号。例如
\startsample
\startitemize[8]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals[2]
\stopitemize
\stopsample
\sample[option=TEX][]{改变列表项符号}{\externalfigure[05/todo-list-2.pdf]}
\section{有序号列表}
将无序号列表的数字参数换为 n,便可得到有序号列表。例如
\startsample
\startitemize[n]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals[2]
\stopitemize
\stopsample
\sample[option=TEX][]{有序号列表}{\externalfigure[05/todo-list-3.pdf]}
有时,需要序号形式是带括号的数字,可作以下设定:
\startsample
\startitemize[n][left=(,right=),stopper=]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals[2]
\stopitemize
\stopsample
\sample[option=TEX][]{数字带括号的有序号列表}{\externalfigure[05/todo-list-4.pdf]}
\noindent 其中「\type{stopper=}」是将参数 \type{stopper} 置空,达到的效果是消除列表项序号的西文句号后缀「\type{.}」。
若将列表项序号参数设定为 a,A,r,R,对应的序号形式分别为小写英文字母、大写英文字母、小写罗马数字、大写罗马数字。
\section[item-sym-diy]{自定义符号列表}
你可能会觉得 \ConTeXt\ 为无序号列表提供的列表项符号无法体现你的气质,\ConTeXt\ 说,Do it yourself! 下面我用 \METAPOST\ 代码绘制了一个小正方形,并令其边线略微受到随机扰动,然后将该图形定义为列表项符号:
\startsample
\startuseMPgraphic{foo}
path p;
p := fullsquare scaled 8pt randomized 1pt;
draw p withpen pencircle scaled 2pt
withcolor darkred;
\stopuseMPgraphic
\definesymbol
[10][{\lower.2ex\hbox{\useMPgraphic{foo}}}]
\startitemize[10]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals{2}
\stopitemize
\stopsample
\sample[option=TEX][rsquare]{自定义符号的无序号列表}{\externalfigure[05/todo-list-5.pdf]}
\noindent 现在你不懂上述代码的具体细节也无妨,观其大略即可,知道有一种可以画画的语言,叫 \METAPOST,它的代码可嵌入 \ConTeXt\ 环境作为插图使用,便已足够。
对于有序号列表,有时会需要使用带圈的数字作为序号。虽然 Unicode 有相应的带圈字符的码位,例如 \char"2460,\char"2461……对应的 \TeX\ 命令是
\starttyping[option=TEX]
\char"2460,\char"2461……
\stoptyping
\noindent 但是这些带圈数字都是文字,并非数字。带圈的数字,无非是数字外面画个圆圈。画圆圈,用 \METAPOST\ 做此事,完全是不费吹灰之力,然后借助 \ConTeXt\ 的 overlay 机制\cite[overlay],将圆圈作为 inframed\cite[framed] 的背景,再用 inframed 套住列表项序号即可,详见
\startsample
\startuseMPgraphic{foo}
path p;
p := fullcircle scaled 12pt;
draw p withpen pencircle scaled .4pt
withcolor darkred;
\stopuseMPgraphic
\defineoverlay[rsquare][\useMPgraphic{foo}]
\def\fooframe#1{%
\inframed[frame=off,background=rsquare]{#1}%
}
\defineconversion[foo][\fooframe]
\startitemize[foo][stopper=]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals{2}
\stopitemize
\stopsample
\sample[option=TEX][number-in-circle]{数字带圆圈的有序号列表}{\externalfigure[05/todo-list-6.pdf]}
\noindent 你可能依然不知道上述代码具体细节,不必着急,以后会经常和它们打交道,逐渐便可熟悉。
\section{间距调整}
消除列表项之间的空白,只需
\startsample
2023 年 3 月 22 日
\startitemize[1,packed]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals{2}
\stopitemize
\stopsample
\sample[option=TEX][]{消除列表项之间的空白}{\externalfigure[05/todo-list-7.pdf]}
消除列表前后以及列表项之间的空白,只需
\startsample
2023 年 3 月 22 日
\startitemize[1,nowhite]
\item 中午,晒十五分钟太阳
\item 晚上,看流浪地球 \Romannumerals{2}
\stopitemize
\stopsample
\sample[option=TEX][]{消除列表项之间的空白}{\externalfigure[05/todo-list-8.pdf]}
\section{小结}
真正让你的领导失望并抱怨的应该是,他想要一份 Microsoft Word 文件,而你提交给他的却是只能看不能随手改动的 PDF 文件。