\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 文件。