背景
我想在同一页面上独立地改变多个项目列表的样式。
代码
一个简短的例子:
\setuppapersize[A5]
\setupcolors[state=start]
% Itemized in a bullet list by default.
\definestartstop[RegularList][
before={\startitemize[joinedup]},
after={\stopitemize},
]
\defineframed[StyleBulletFramed][
frame=off,
height=0.5em,
width=0.5em,
background=color,
backgroundcolor=red,
]
% First level of indenting (regular bullets) use the bullet style.
\setupitemize[1][broad][
stopper=,
width=\zeropoint,
symbol=,
command=\StyleBulletFramed{},
]
\define[3]\regularlist{\item #1 #2 #3}
\startnotmode[ModeCompactInstructions]
\definestartstop[Instructions][
before={\startitemize[n,joinedup]},
after={\stopitemize},
]
% First level of indenting (regular bullets) use the bullet style.
\setupitemize[1][][
stopper=,
width=\zeropoint,
% ???
%command={\StyleBulletFramed[width=1em,height=1em]{}\hskip0.5em},
]
\define[1]\instruction{\item #1.}
\starttext
\startbodymatter
Chemicals
\startRegularList
\regularlist{80}{ml}{water}
\regularlist{20}{ml}{sodium}
\stopRegularList
Instructions
\startInstructions
\instruction{Drop sodium into water}
\instruction{Run away}
\stopInstructions
\stopbodymatter
\stoptext
得出的结果为:
问题
第一个列表中的红色项目符号非常适合第一个列表。但是,第二个列表中的红色项目符号存在问题:
- 项目符号大小应该更大(足够容纳两位数)
- 项目符号应该位于数字后面
问题
第一个问题让我困惑,第二个问题也许可以帮我\defineitemlist
解答。你会怎么做:
- 确保数字画在项目符号的上方吗?
- 独立格式化列表(即第二个列表中的项目符号更大)?
缺少资源
我以为我可以定义一个命名组,但是\defineitemgroup
不存在相关文档。
答案1
定义列表
定义\itemize
像商品组是通过
\defineitemgroup
和相应的设置来完成的。由于历史原因,它们具有非标准的重复接口,需要将一些选项指定为键值设置,将其他选项指定为参数列表。例如
\defineitemgroup [myitems]
\setupitemgroup [myitems] [each] [joinedup]
\setupitemgroup [myitems] [each] [itemalign=flushright]
第二个参数决定设置适用的项目级别。第三个参数有两种。与空白(垂直和水平)有关的参数属于参数列表:joinedup
、、packed
等等nowhite
。
更多选项
是设置的一部分。两种类型都可以组合使用:
\setupitemgroup [myitems] [each] [joinedup] [itemalign=flushright]
自定义项目符号
子弹非常灵活。它们会钩住
\symbol
机制。这里的宏生成器是
\definesymbol
。基本上,它允许所有有效的上下文代码出现在定义中,包括列表项计数器。可以通过以下方式访问此计数器
\currentitemnumber
。为了实现“盒子里的物品编号”效果,我们必须将这个数字画成盒子的内容,如下所示:
\definesymbol [instruction_symbol_numbered]
[{\framed{\currentitemnumber}}]
当然,需要根据代码中的命令\framed
等具体要求进行调整。\StyleBulletFramed
把它放在一起
下面的列表将上述所有内容合并为一个工作示例。(当然,某些设置(例如框大小)需要进一步调整。)
\unprotect
%% the bullet: a red square
\defineframed [instruction_symbol_frame] [
background=color,
backgroundcolor=red,
frame=off,
width=1em,
height=\framedparameter{width}, %% -> let height = width
]
%% bare bullet
\definesymbol [instruction_symbol]
[{\instruction_symbol_frame{\strut}}]
%% same bullet, with item number inside
\definesymbol [instruction_symbol_numbered]
[{\instruction_symbol_frame{\currentitemnumber}}]
%% define the “regular“ itemization with a red box as bullet indicator
\defineitemgroup [RegularList]
\setupitemgroup [RegularList] [each] [joinedup]
\setupitemgroup [RegularList] [symbol=instruction_symbol]
%% define the “Instructions” type itemization that includes the item
%% number inside the box
\defineitemgroup [Instructions]
\setupitemgroup [Instructions] [each] [joinedup]
\setupitemgroup [Instructions] [symbol=instruction_symbol_numbered]
\protect
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% demo
\starttext
Chemicals
\startRegularList
\startitem \input knuth \stopitem
\startitem \input ward \stopitem
\stopRegularList
\blank [2*big]
Instructions
\startInstructions
\startitem \input knuth \stopitem
\startitem \input ward \stopitem
\stopInstructions
\stoptext