strc-itm.mklx /size: 70 Kb    last modification: 2020-07-01 14:35
1
%D \module
2
%D [ file=strc-itm,
3
%D version=2008.10.20,
4
%D title=\CONTEXT\ Structure Macros,
5
%D subtitle=Itemgroups,
6
%D author=Hans Hagen,
7
%D date=\currentdate,
8
%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9
%C
10
%C This module is part of the \CONTEXT\ macro||package and is
11
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12
%C details.
13 14
\writestatus
{
loading
}{
ConTeXt
Structure
Macros
/
Itemgroups
}
15 16
\registerctxluafile
{
strc
-
itm
}{}
17 18
%D As we analyze/register widths and such we could as well push and pop the numbers
19
%D at the \LUA\ end (which saves a few calls).
20
%D
21
%D Cleaning up this module happened around the time when Kate Bush came up with the
22
%D nicest numbered list of words: 50 Words For Snow. It's therefore no surprise that
23
%D I had that cd running several times when updating this code. One of the
24
%D highlights of 2011.
25
%D
26
%D This module needs to be rewritten but that is tricky with respect to
27
%D compatibilitity. Basically each major variant (regular, text, columns,
28
%D horizontal, etc) needs to be on its own.
29 30
% todo: check breaks
31
% todo: check grouping
32
% todo: fixedconversion
33 34
% \startitemize[n,packed]
35
% \item test \item test \item test
36
% \stopitemize
37
%
38
% \startitemize[n,packed,reverse]
39
% \item test \item test \item test
40
% \stopitemize
41
%
42
% \startitemize[n,packed,reverse] \item test \item test \stopitemize
43
% \startitemize[continue]
44
% \item test \startitemize[n,packed] \item test \item test \stopitemize
45
% \item test
46
% \item test
47
% \stopitemize
48
% \startitemize[continue] \item test \stopitemize
49
%
50
% \startitemize[n,packed] \item test \item test \stopitemize
51
% \startitemize[continue] \item test \stopitemize
52
% \startitemize[continue] \item test \stopitemize
53
%
54
% \setupwhitespace[big]
55
% \starttext
56
% test \startitemize[joinedup] \item test \item test \stopitemize test \par
57
% test \startitemize[joinedup,nowhite] \item test \item test \stopitemize test \par
58
% test \startitemize[joinedup,nowhite,before] \item test \item test \stopitemize test \par
59
% test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par
60
% \stoptext
61
%
62
% test / example
63
%
64
% \startnarrower[left] \startcolumns[n=3] \startitemize
65
% \item \input ward \item \input ward \item \input ward
66
% \stopitemize \stopcolumns\stopnarrower \blank
67
%
68
% \startnarrower[left] \startitemize[columns,three]
69
% \item \input ward \item \input ward \item \input ward
70
% \stopitemize \stopnarrower \blank
71
%
72
% \setupitemize[leftmargin=1.5em] \startitemize[columns,three]
73
% \item \input ward \item \input ward \item \input ward
74
% \stopitemize \blank
75
%
76
% beware, we don't group (yet) as we want to keep the left/right skip
77
%
78
% \startitemize
79
% \startitem \stopitem
80
% some intermediate text that will properly indent
81
% \startitem \stopitem
82
% \stopitem
83
%
84
% so we need to keep that property
85
%
86
% \startitemize
87
% \starthead {xx} test \stophead
88
% \startitem test \stopitem
89
% \startitem test \stopitem
90
% \stopitemize
91
%
92
% Sometimes the user demands get pretty weird:
93
%
94
% \startitemize
95
% \item test
96
% \item test
97
% \headsym{xx} test \par test
98
% \stopitemize
99
%
100
% aligned items
101
%
102
% \startitemize[n,fit,broad][itemalign=flushright]
103
% \dorecurse{100}{\item The first item.}
104
% \stopitemize
105
%
106
% \setupitemgroup[itemize][each][fit]
107
% \setupitemgroup[itemize][each][distance=.5em,factor=1,itemalign=flushright]
108
%
109
% \startitemize[n]
110
% \dorecurse{100}{\item The first item.}
111
% \stopitemize
112
%
113
% \defineitemgroup[gbitemize]
114
% \setupitemgroup[gbitemize][each][headstyle=bold]
115
%
116
% \startgbitemize
117
% \txt{italian} some italians like this kind of cross||breed between
118
% an itemize and a description
119
% \txt{sicilians} i wonder how many sicilian mathematicians do a thesis
120
% on the math involved in predicting the next big bang of the vulcano
121
% \stopgbitemize
122
%
123
% \startitemize[n,repeat]
124
% \noitem \startitemize[a] \item Item 1.a. \item Item 1.b. \stopitemize
125
% \noitem \startitemize[a] \item Item 2.a. \item Item 2.b. \stopitemize
126
% \stopitemize
127
%
128
% \startitemize[n,repeat][width=0pt]
129
% \noitem \startitemize[a][width=2em] \item Item 1.a. \item Item 1.b. \stopitemize
130
% \noitem \startitemize[a][width=2em] \item Item 2.a. \item Item 2.b. \stopitemize
131
% \stopitemize
132
%
133
% \startbuffer
134
% \item
135
% \startitemize[n]
136
% \item item 1.1
137
% \item item 1.2
138
% \startitemize[n] \item item 1.2.1 \item item 1.2.2 \stopitemize
139
% \item item 1.3
140
% \stopitemize
141
% \item
142
% \startitemize[n] \item item 2.1 \item item 2.2 \stopitemize
143
% \item item 3
144
% \startitemize[n] \item item 3.1 \item item 3.2 \stopitemize
145
% \item
146
% \startitemize[n] \item item 4.1 \item item 4.2 \stopitemize
147
% \stopbuffer
148
%
149
% \startitemize[n,repeat,6*broad,packed] \getbuffer \stopitemize \blank[3*big]
150
% \startitemize[n,repeat,packed] \getbuffer \stopitemize \blank[3*big]
151
% \setupitemize[each][atmargin][width=3em]
152
% \startitemize[n,repeat,packed] \getbuffer \stopitemize
153
%
154
% todo: assume startitem ... stopitem and do an autostopitem .. cleaner for
155
% elements
156
%
157
% \startitemize[text][space=medium]
158
% \item one \item two \item three
159
% \stopitemize
160
%
161
% For Giuseppe "Oblomov" Bilotta, inspired on a suggestion by Taco
162
% Hoekwater.
163
%
164
% \def\MyItemCommand#1{{\bf#1}\quad}
165
% \setupitemgroup[itemize][command=\MyItemCommand]
166
%
167
% \startitemize
168
% \item {test} is this okay?
169
% \item {test} is this okay?
170
% \item {test} is this okay?
171
% \stopitemize
172 173
\unprotect
174 175
\newconditional
\c_strc_itemgroups_sub
176
\newconditional
\c_strc_itemgroups_head
177
\newconditional
\c_strc_itemgroups_intro
178
\newconditional
\c_strc_itemgroups_randomize
179
\newconditional
\c_strc_itemgroups_horizontal
180
\newconditional
\c_strc_itemgroups_collecting
181
\newconditional
\c_strc_itemgroups_auto_intro
182
\newconditional
\c_strc_itemgroups_pack
183
\newconditional
\c_strc_itemgroups_paragraph
184
\newconditional
\c_strc_itemgroups_text
185
\newconditional
\c_strc_itemgroups_text_saved
186
\newconditional
\c_strc_itemgroups_first
187
\newconditional
\c_strc_itemgroups_before
188
\newconditional
\c_strc_itemgroups_after
189
\newconditional
\c_strc_itemgroups_nowhite
190
\newconditional
\c_strc_itemgroups_joined
191
\newconditional
\c_strc_itemgroups_reverse
192
\newconditional
\c_strc_itemgroups_continue
193
\newconditional
\c_strc_itemgroups_fitting
194
\newconditional
\c_strc_itemgroups_indented_first
195
\newconditional
\c_strc_itemgroups_inline
196
\newconditional
\c_strc_itemgroups_columns
197
\newconditional
\c_strc_itemgroups_concat
198
\newconditional
\c_strc_itemgroups_txt
199
\newconditional
\c_strc_itemgroups_extra
200
\newconditional
\c_strc_itemgroups_repeat
201
\newconditional
\c_strc_itemgroups_inline_head
202 203
% 0 = before/after
204
% 1 = between unless before
205
% 2 = between
206 207
\newconstant
\c_strc_itemgroups_spacing_mode
\c_strc_itemgroups_spacing_mode
\plustwo
208
\newconditional
\c_strc_itemgroups_optimize
\settrue
\c_strc_itemgroups_optimize
209
\newconditional
\c_strc_itemgroups_auto_concat
\settrue
\c_strc_itemgroups_auto_concat
210 211
\newsignal
\d_strc_itemgroups_signal
212 213
\newbox
\b_strc_itemgroups
214 215
\newdimen
\d_strc_itemgroups_list_width
216
\newdimen
\d_strc_itemgroups_asked_width
217 218
\newdimen
\d_strc_itemgroups_max_width
% multipass
219
\newcount
\c_strc_itemgroups_max_items
% multipass
220 221
\newcount
\c_strc_itemgroups_n_of_items
222
\newcount
\c_strc_itemgroups_nesting
223
\newcount
\c_strc_itemgroups_column_depth
224 225
\def
\v_strc_itemgroups_counter
{
itemgroup
:
\currentparentitemgroup
}
226
\let
\m_strc_itemgroups_repeat_start
\empty
227
\def
\v_strc_itemgroups_unknown_symbol
{
?
}
228
\let
\m_strc_itemgroups_indenting
\empty
229
\let
\m_strc_itemgroups_destination
\empty
230 231
\let
\currentitemlevel
\!!zerocount
% public
232
\def
\currentnofitems
{
\the
\c_strc_itemgroups_max_items
}
233
\def
\currentitemnumber
{
\strc_counters_raw_sub
\v_strc_itemgroups_counter
\currentitemlevel
}
% public
234 235
\newtoks
\itemgroupcommands
% maybe public
236 237
\def
\currentitemgroupsymbol
{
n
}
% here we cannot use a _ in the name
238
\let
\currentitemgroupconversionset
\empty
% here we cannot use a _ in the name
239
\let
\currentitemgroupsegments
\empty
240 241
\def
\strc_itemgroups_register_status
242
{
\clf_registeritemgroup
{
\currentparentitemgroup
}
\c_strc_itemgroups_nesting
\c_strc_itemgroups_n_of_items
\dimexpr
\itemgroupparameter
\c!maxwidth
\relax
}
243 244
\def
\strc_itemgroups_check_n_of_items
% we could do this at the lua end and save a call (i.e. will be dimen and counter)
245
{
\clf_analyzeitemgroup
{
\currentparentitemgroup
}
\c_strc_itemgroups_nesting
\relax
246
\edef
\currentnofitems
{
\the
\c_strc_itemgroups_max_items
}}
247 248
% todo: \dodosetreference -> \strc_counters_register_component (to be checked)
249 250
\def
\strc_itemgroups_insert_reference
% we will make a decent number helper
251
{
\iftrialtypesetting
\orelse
\ifempty
\currentitemreference
\else
252
\strc_itemgroups_insert_reference_indeed
253
\fi
}
254 255
\def
\strc_itemgroups_insert_extra_reference
256
{
\iftrialtypesetting
\orelse
\ifempty
\currentitemreference
\else
257
\normalexpanded
{
\textreference
[
\currentitemreference
]
{
\strc_itemgroups_extra_symbol
}}
%
258
\fi
}
259 260
\def
\strc_itemgroups_insert_reference_indeed
% maybe we need a 'frozen counter' numberdata blob / quick hack .. .mive this to strc-ref
261
{
% needs testing, gave problems:
262
\setnextinternalreference
263
% no need to collect nodes in \b_strc_destination_nodes here ... maybe at some point
264
\strc_references_start_destination_nodes
265
% this is somewhat over the top ... we should use the counter's reference
266
\clf_setdestinationattribute
267
{
%
268
metadata
{
%
269
kind
{
item
}
% was item, why?
270
\ifx
\currentreferencecoding
\s!xml
271
xmlroot
{
\xmldocument
}
% only useful when text
272
\fi
273
catcodes
\catcodetable
274
}
%
275
references
{
%
276
internal
\locationcount
% no: this spoils references
277
% block {\currentsectionblock}%
278
view
{
\interactionparameter
\c!focus
}
%
279
prefix
{
\referenceprefix
}
%
280
reference
{
\currentitemreference
}
%
281
}
%
282
prefixdata
{
%
283
prefix
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!prefix
}
%
284
separatorset
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!prefixseparatorset
}
%
285
conversion
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!prefixconversion
}
%
286
conversionset
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!prefixconversionset
}
%
287
set
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!prefixset
}
%
288
segments
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!prefixsegments
}
%
289
% segments {\askedprefixsegments}%
290
connector
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!prefixconnector
}
%
291
}
%
292
numberdata
{
%
293
numbers
{
\v_strc_itemgroups_counter
}
%
294
separatorset
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!numberseparatorset
}
%
295
% conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion}%
296
% conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset}%
297
% fixedconversion {\currentitemgroupconversionset}%
298
conversionset
{
fixed
:
:
\currentitemgroupconversionset
}
% temp hack
299
%
300
% for the moment no stopper, we need to make references configurable first
301
% stopper {\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper}%
302
segments
{
\namedcounterparameter
\v_strc_itemgroups_counter
\c!numbersegments
}
%
303
}
%
304
}
%
305
\relax
306
\strc_references_stop_destination_nodes
307
\xdef
\currentdestinationattribute
{
\number
\lastdestinationattribute
}
%
308
% will become an option:
309
\ifnum
\lastdestinationattribute
>
\zerocount
310
\dontleavehmode
\hbox
attr
\destinationattribute
\lastdestinationattribute
\bgroup
311
\strc_references_flush_destination_nodes
312
\egroup
313
\fi
}
314 315
%D Defining and setup:
316 317
\installcorenamespace
{
itemgroup
}
318
\installcorenamespace
{
itemgroupoption
}
319
\installcorenamespace
{
itemgroupsetting
}
320
\installcorenamespace
{
itemgroupkeyword
}
321
\installcorenamespace
{
itemgroupalign
}
322
\installcorenamespace
{
itemgrouplocal
}
323
\installcorenamespace
{
itemgroupglobal
}
324
\installcorenamespace
{
itemgroupdistance
}
325
\installcorenamespace
{
itemgroupstack
}
326
\installcorenamespace
{
itemgroupfirst
}
327
\installcorenamespace
{
itemgroupstart
}
328 329
\installcommandhandler
\??itemgroup
{
itemgroup
}
\??itemgroup
330 331
\let
\setupitemgroups
\setupitemgroup
332 333
\appendtoks
334
\setuevalue
{
\e!start
\currentitemgroup
}{
\startitemgroup
[
\currentitemgroup
]
}
%
335
\setuevalue
{
\e!stop
\currentitemgroup
}{
\stopitemgroup
}
%
336
\setuevalue
{
\e!setup
\currentitemgroup
\e!endsetup
}{
\setupitemgroup
[
\currentitemgroup
]
}
% obsolete
337
\let
\currentparentitemgroup
\currentitemgroup
338
\definecounter
[
\v_strc_itemgroups_counter
]
%
339
% beware ... we cannot use _ as the conversion set is not expanded
340
% \defineconversionset[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]%
341
\to
\everydefineitemgroup
342 343
%D Global states
344 345
\def
\strc_itemgroups_store_continue_state
#
options
#
settings
%
346
{
\setxvalue
{
\??itemgroupoption
\currentitemgroup
}{
\strc_itemgroups_process_options
{
#
options
}}
%
347
\setgvalue
{
\??itemgroupsetting
\currentitemgroup
}{
\setupcurrentitemgroup
[#
settings
]
}}
348 349
\def
\strc_itemgroups_fetch_continue_state
350
{
\csname
\??itemgroupoption
\currentitemgroup
\endcsname
351
\csname
\??itemgroupsetting
\currentitemgroup
\endcsname
}
352 353
\def
\strc_itemgroups_reset_continue_state
354
{
\expandafter
\glet
\csname
\??itemgroupoption
\currentitemgroup
\endcsname\relax
355
\expandafter
\glet
\csname
\??itemgroupsetting
\currentitemgroup
\endcsname\relax
}
356 357
% These will become keywords. We will also add a feature to keep the while set
358
% together.
359 360
\definevspacing
[
\v!item
@
0
]
[
penalty
:
0
]
% allow
361
\definevspacing
[
\v!item
@
1
0
0
0
0
]
[
penalty
:
1
0
0
0
0
]
% no
362
\definevspacing
[
\v!item
@
-
5
]
[
penalty
:
-
5
]
363
\definevspacing
[
\v!item
@
5
]
[
penalty
:
5
]
364
\definevspacing
[
\v!item
@
5
0
0
]
[
penalty
:
5
0
0
]
% discourage .. too low, 5000 is better
365 366
\def
\strc_itemgroups_insert_break_when_needed
#
break
%
367
{
\ifconditional
\c_strc_itemgroups_optimize
368
\ifconditional
\c_strc_itemgroups_text
\else
369
#
break
\relax
370
\fi
371
\fi
}
372 373
\def
\strc_itemgroups_insert_breakallow
{
\strc_itemgroups_insert_break_when_needed
\strc_itemgroups_insert_breakallow_indeed
}
374
\def
\strc_itemgroups_insert_breakno
{
\strc_itemgroups_insert_break_when_needed
\strc_itemgroups_insert_breakno_indeed
}
375
\def
\strc_itemgroups_insert_break
{
\strc_itemgroups_insert_break_when_needed
\strc_itemgroups_insert_break_indeed
}
376
\def
\strc_itemgroups_insert_nobreak
{
\strc_itemgroups_insert_break_when_needed
\strc_itemgroups_insert_nobreak_indeed
}
377 378
\def
\strc_itemgroups_insert_breakallow_indeed
{
\vspacing
[
\v!item
@
0
]
}
379
\def
\strc_itemgroups_insert_breakno_indeed
{
\vspacing
[
\v!item
@
1
0
0
0
0
]
}
380
\def
\strc_itemgroups_insert_break_indeed
{
\flushnotes
381
\vspacing
[
\v!item
@
-
5
]
}
382
\def
\strc_itemgroups_insert_nobreak_indeed
{
\flushnotes
383
\ifinsidecolumns
% todo
384
\vspacing
[
\v!item
@
5
]
%
385
\else
386
\vspacing
[
\v!item
@
5
0
0
]
%
387
\fi
}
388 389
\unexpanded
\def
\strc_itemgroups_process_options
#
options
%
390
{
\processcommacommand
[#
options
]
\strc_itemgroups_process_option
}
% expansion of options is handy for xml
391 392
% \installcommalistprocessorcommand \strc_itemgroups_process_option_list \strc_itemgroups_process_option
393
%
394
% \unexpanded\def\strc_itemgroups_process_options#options%
395
% {\normalexpanded{\strc_itemgroups_process_option_list[#options]}} % expansion of options is handy for xml
396 397
\def
\strc_itemgroups_process_option
#
option
%
398
{
\edef
\itemgroupconstantvalue
{
#
option
}
%
399
\ifempty
\itemgroupconstantvalue
\else
400
\splitatasterisk
\itemgroupconstantvalue
\itemgroupfirst
\itemgroupsecond
401
\ifempty
\itemgroupsecond
402
\let
\itemgroupsecond
\itemgroupfirst
403
\let
\itemgroupfirst
\!!plusone
404
\fi
405
\ifcsname
\??itemgroupkeyword
\itemgroupsecond
\endcsname
406
\lastnamedcs
407
\else
408
\strc_itemgroups_set_symbol
\itemgroupconstantvalue
409
\fi
410
\fi
}
411 412
\def
\strc_itemgroups_process_set_option_pack
413
{
\ifcase
\c_strc_itemgroups_nesting
\else
414
\settrue
\c_strc_itemgroups_pack
415
\fi
}
416 417
\def
\strc_itemgroups_process_set_option_unpack
418
{
\ifcase
\c_strc_itemgroups_nesting
\else
419
\setfalse
\c_strc_itemgroups_pack
420
\fi
}
421 422
\setvalue
{
\??itemgroupkeyword
\!!zerocount
}{}
% ignore 0
423
\setvalue
{
\??itemgroupkeyword\v!packed
}{
\strc_itemgroups_process_set_option_pack
}
424
\setvalue
{
\??itemgroupkeyword\v!unpacked
}{
\strc_itemgroups_process_set_option_unpack
}
425
\setvalue
{
\??itemgroupkeyword\v!intro
}{
\settrue
\c_strc_itemgroups_intro
}
% here? not set to false
426
\setvalue
{
\??itemgroupkeyword\v!autointro
}{
\settrue
\c_strc_itemgroups_auto_intro
}
427
\setvalue
{
\??itemgroupkeyword\v!broad
}{
\ifempty
\itemgroupfirst
428
\let
\itemgroupfirst
\!!plusone
429
\fi
430
\letitemgroupparameter
\c!factor
\itemgroupfirst
}
431
\setvalue
{
\??itemgroupkeyword\v!text
}{
\settrue
\c_strc_itemgroups_text
432
\settrue
\c_strc_itemgroups_inline
433
\settrue
\c_strc_itemgroups_joined
434
\strc_itemgroups_process_set_option_pack
}
435
\setvalue
{
\??itemgroupkeyword\v!before
}{
\settrue
\c_strc_itemgroups_before
}
436
\setvalue
{
\??itemgroupkeyword\v!after
}{
\settrue
\c_strc_itemgroups_after
}
437
\setvalue
{
\??itemgroupkeyword\v!nowhite
}{
\settrue
\c_strc_itemgroups_nowhite
}
438
\setvalue
{
\??itemgroupkeyword\v!margin
}{
\setitemgroupparameter
\c!width
{
-
2
em
}}
% signal
439
\setvalue
{
\??itemgroupkeyword\v!inmargin
}{
\setitemgroupparameter
\c!width
{
-
2
em
}}
% signal
440
\setvalue
{
\??itemgroupkeyword\v!atmargin
}{
\ifnum
\c_strc_itemgroups_nesting
>
\plusone
441
\setitemgroupparameter
\c!width
{
0
em
}
%
442
\fi
}
% signal
443
\setvalue
{
\??itemgroupkeyword\v!intext
}{
\settrue
\c_strc_itemgroups_inline
}
444
\setvalue
{
\??itemgroupkeyword\v!headintext
}{
\settrue
\c_strc_itemgroups_inline_head
}
445
\setvalue
{
\??itemgroupkeyword\v!loose
}{
\setfalse
\c_strc_itemgroups_optimize
}
446
\setvalue
{
\??itemgroupkeyword\v!fit
}{
\settrue
\c_strc_itemgroups_fitting
}
447
\setvalue
{
\??itemgroupkeyword\v!nofit
}{
\setfalse
\c_strc_itemgroups_fitting
}
448
\setvalue
{
\??itemgroupkeyword\v!paragraph
}{
\settrue
\c_strc_itemgroups_paragraph
449
\strc_itemgroups_process_set_option_pack
}
450
\setvalue
{
\??itemgroupkeyword\v!joinedup
}{
\settrue
\c_strc_itemgroups_joined
451
\strc_itemgroups_process_set_option_pack
}
452
\setvalue
{
\??itemgroupkeyword\v!notjoinedup
}{
\setfalse
\c_strc_itemgroups_joined
}
453
\setvalue
{
\??itemgroupkeyword\v!serried
}{
\edef
\itemgroupfirst
{
-
\ifempty
\itemgroupfirst
1
\else
\itemgroupfirst
\fi
}
%
454
\letitemgroupparameter
\c!factor
\itemgroupfirst
}
455
\setvalue
{
\??itemgroupkeyword\v!stopper
}{
\letitemgroupparameter
\c!placestopper\v!yes
}
% keep {}
456
\setvalue
{
\??itemgroupkeyword\v!nostopper
}{
\letitemgroupparameter
\c!placestopper\v!no
}
% keep {}
457
\setvalue
{
\??itemgroupkeyword\v!repeat
}{
\settrue
\c_strc_itemgroups_repeat
}
458
\setvalue
{
\??itemgroupkeyword\v!norepeat
}{
\setfalse
\c_strc_itemgroups_repeat
}
459
\setvalue
{
\??itemgroupkeyword\v!reverse
}{
\settrue
\c_strc_itemgroups_reverse
}
460
\setvalue
{
\??itemgroupkeyword\v!columns
}{
\settrue
\c_strc_itemgroups_columns
}
461
\setvalue
{
\??itemgroupkeyword\v!one
}{
\letitemgroupparameter
\c!n
\plusone
}
462
\setvalue
{
\??itemgroupkeyword\v!two
}{
\letitemgroupparameter
\c!n
\plustwo
}
463
\setvalue
{
\??itemgroupkeyword\v!three
}{
\letitemgroupparameter
\c!n
\plusthree
}
464
\setvalue
{
\??itemgroupkeyword\v!four
}{
\letitemgroupparameter
\c!n
\plusfour
}
465
\setvalue
{
\??itemgroupkeyword\v!five
}{
\letitemgroupparameter
\c!n
\plusfive
}
466
\setvalue
{
\??itemgroupkeyword\v!six
}{
\letitemgroupparameter
\c!n
\plussix
}
467
\setvalue
{
\??itemgroupkeyword\v!seven
}{
\letitemgroupparameter
\c!n
\plusseven
}
468
\setvalue
{
\??itemgroupkeyword\v!eight
}{
\letitemgroupparameter
\c!n
\pluseight
}
469
\setvalue
{
\??itemgroupkeyword\v!nine
}{
\letitemgroupparameter
\c!n
\plusnine
}
470
\setvalue
{
\??itemgroupkeyword\v!standard
}{
\setitemgroupparameter
\c!width
{
1
.
5
\emwidth
}
%
471
\setitemgroupparameter
\c!distance
{
.
5
\emwidth
}
%
472
%\letitemgroupparameter\c!factor \!!zerocount
473
\letitemgroupparameter
\c!factor
{
\zerocount
}
%
474
\setitemgroupparameter
\c!packcriterium
{
\zerocount
}
%
475
\letitemgroupparameter
\c!inner
\empty
476
\letitemgroupparameter
\c!beforehead
\empty
477
\letitemgroupparameter
\c!afterhead
\blank
478
\letitemgroupparameter
\c!before
\blank
479
\letitemgroupparameter
\c!inbetween
\blank
480
\letitemgroupparameter
\c!after
\blank
}
481 482
\def
\strc_itemgroups_initialize_local
483
{
\setfalse
\c_strc_itemgroups_inline
484
\setfalse
\c_strc_itemgroups_concat
485
\setfalse
\c_strc_itemgroups_txt
486
%
487
\setfalse
\c_strc_itemgroups_reverse
488
\setfalse
\c_strc_itemgroups_intro
489
\setfalse
\c_strc_itemgroups_auto_intro
490
\setfalse
\c_strc_itemgroups_before
491
\setfalse
\c_strc_itemgroups_after
492
\setfalse
\c_strc_itemgroups_nowhite
493
\setfalse
\c_strc_itemgroups_randomize
494
\setfalse
\c_strc_itemgroups_horizontal
495
\setfalse
\c_strc_itemgroups_collecting
496
\setfalse
\c_strc_itemgroups_intro
497
\setfalse
\c_strc_itemgroups_continue
498
% this will be a constant
499
\setfalse
\c_strc_itemgroups_head
500
\setfalse
\c_strc_itemgroups_sub
501
\setfalse
\c_strc_itemgroups_symbol
502
\setfalse
\c_strc_itemgroups_columns
503
% to be checked
504
\let
\m_strc_itemgroups_destination
\empty
505
\let
\strc_itemgroups_used_symbol
\empty
% ** start value
506
\let
\strc_itemgroups_margin_symbol
\empty
507
\let
\strc_itemgroups_extra_symbol
\empty
508
%
509
\global
\letitemgroupparameter
\c!maxwidth
\!!zeropoint
510
}
511 512
\setvalue
{
\??itemgroupfirst\v!intro
}{
\settrue
\c_strc_itemgroups_intro
}
513
\setvalue
{
\??itemgroupfirst\v!continue
}{
\settrue
\c_strc_itemgroups_continue
}
514
\setvalue
{
\??itemgroupfirst\v!random
}{
\settrue
\c_strc_itemgroups_randomize
515
\settrue
\c_strc_itemgroups_collecting
}
516
\setvalue
{
\??itemgroupkeyword\v!horizontal
}{
\settrue
\c_strc_itemgroups_horizontal
517
\settrue
\c_strc_itemgroups_collecting
518
\settrue
\c_strc_itemgroups_inline
519
\settrue
\c_strc_itemgroups_joined
520
\strc_itemgroups_process_set_option_pack
}
521 522
\def
\strc_itemgroups_preset_stage_one
#
options
%
523
{
\processcommacommand
[#
options
]
\strc_itemgroups_preset_stage_one_indeed
}
524 525
% \installcommalistprocessorcommand \strc_itemgroups_preset_stage_one_list \strc_itemgroups_preset_stage_one_indeed
526
%
527
% \def\strc_itemgroups_preset_stage_one#options%
528
% {\normalexpanded{\strc_itemgroups_preset_stage_one_list[#options]}}
529 530
\def
\strc_itemgroups_preset_stage_one_indeed
#
option
%
531
{
\ifcsname
\??itemgroupfirst
#
option
\endcsname
532
\lastnamedcs
533
\fi
}
534 535
\ifdefined
\dotagsetitemgroup
\else
\let
\dotagsetitemgroup
\relax
\fi
536
\ifdefined
\dotagsetitem
\else
\let
\dotagsetitem
\gobbleoneargument
\fi
537 538
\def
\strc_itemgroups_tag_start_group
539
{
\dostarttaggedchained
\t!itemgroup
\currentparentitemgroup
\??itemgroup
540
\dotagsetitemgroup
}
541 542
\def
\strc_itemgroups_tag_stop_group
543
{
\dostoptagged
}
544 545
\def
\strc_itemgroups_before_command
546
{
\ifconditional
\c_strc_itemgroups_nowhite
547
\ifconditional
\c_strc_itemgroups_before
548
\ifcase
\c_strc_itemgroups_nesting
\or
\itemgroupparameter
\c!before
\fi
549
\else
550
\nowhitespace
551
\fi
552
\orelse
\ifconditional
\c_strc_itemgroups_joined
553
% \empty
554
\else
555
\itemgroupparameter
\c!before
556
\fi
}
557 558
\def
\strc_itemgroups_after_command
559
{
\ifconditional
\c_strc_itemgroups_nowhite
560
\ifconditional
\c_strc_itemgroups_after
561
\ifcase
\c_strc_itemgroups_nesting
\or
\itemgroupparameter
\c!after
\fi
562
\else
563
\nowhitespace
564
\fi
565
\orelse
\ifconditional
\c_strc_itemgroups_joined
566
% \empty
567
\else
568
\itemgroupparameter
\c!after
569
\fi
}
570 571
\def
\strc_itemgroups_between_command
572
{
\ifconditional
\c_strc_itemgroups_nowhite
573
\nowhitespace
574
\orelse
\ifconditional
\c_strc_itemgroups_joined
575
% \empty
576
\else
577
\itemgroupparameter
\c!inbetween
578
\fi
}
579 580
\def
\strc_itemgroups_before_head_command
581
{
\ifconditional
\c_strc_itemgroups_nowhite
582
\nowhitespace
583
\orelse
\ifconditional
\c_strc_itemgroups_joined
584
% \empty
585
\else
586
\itemgroupparameter
\c!beforehead
587
\fi
}
588 589
\def
\strc_itemgroups_after_head_command
590
{
\ifconditional
\c_strc_itemgroups_nowhite
591
\nowhitespace
592
\orelse
\ifconditional
\c_strc_itemgroups_joined
593
% \empty
594
\else
595
\itemgroupparameter
\c!afterhead
596
\fi
}
597 598
% compatible setup command:
599 600
\let
\strc_itemgroups_normal_setup
\setupitemgroup
601 602
\unexpanded
\def
\setupitemgroup
603
{
\doquadrupleempty
\strc_itemgroups_setup
}
604 605
\def
\strc_itemgroups_setup
[#
category
][#
levels
][#
options
][#
settings
]
% category level|each options|settings settings|options
606
{
\edef
\strc_itemgroups_setup_what
{
#
levels
}
%
607
\iffourthargument
608
\ifx
\strc_itemgroups_setup_what
\v!each
609
\strc_itemgroups_setup_each
{
#
category
}{
#
options
}
%
610
\strc_itemgroups_setup_each
{
#
category
}{
#
settings
}
%
611
\else
612
\strc_itemgroups_setup_list
{
#
levels
}{
#
category
}{
#
options
}
%
613
\strc_itemgroups_setup_list
{
#
levels
}{
#
category
}{
#
settings
}
%
614
\fi
615
\orelse
\ifthirdargument
616
\ifx
\strc_itemgroups_setup_what
\v!each
617
\strc_itemgroups_setup_each
{
#
category
}{
#
options
}
%
618
\else
619
\strc_itemgroups_setup_list
{
#
levels
}{
#
category
}{
#
options
}
%
620
\fi
621
\orelse
\ifsecondargument
622
\strc_itemgroups_setup_each
{
#
category
}{
#
levels
}
%
623
\else
624
\strc_itemgroups_normal_setup
[#
category
]
% == settings
625
\fi
}
626 627
% can be made a bit faster
628 629
% \def\strc_itemgroups_setup_each#category#whatever%
630
% {\doifelseassignment{#whatever}
631
% {\strc_itemgroups_normal_setup[#category][#whatever]}
632
% {\strc_itemgroups_normal_setup[#category][\c!option={#whatever}]}}
633 634
\def
\strc_itemgroups_setup_each
#
category
#
whatever
%
635
{
\ifcondition
\validassignment
{
#
whatever
}
%
636
\strc_itemgroups_normal_setup
[#
category
][#
whatever
]
%
637
\else
638
\strc_itemgroups_normal_setup
[#
category
][
\c!option
=
{
#
whatever
}
]
%
639
\fi
}
640 641
\def
\strc_itemgroups_setup_list_level_a
#
category
#
whatever
#
level
%
642
{
\strc_itemgroups_normal_setup
[#
category
:
#
level
][#
whatever
]
}
643 644
\def
\strc_itemgroups_setup_list_level_b
#
category
#
whatever
#
level
%
645
{
\strc_itemgroups_normal_setup
[#
category
:
#
level
][
\c!option
=
{
#
whatever
}
]
}
646 647
% \def\strc_itemgroups_setup_list#subcategories#category#whatever%
648
% {\doifelseassignment{#whatever}
649
% {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}}
650
% {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}}}
651 652
\def
\strc_itemgroups_setup_list
#
subcategories
#
category
#
whatever
%
653
{
\ifcondition
\validassignment
{
#
whatever
}
%
654
\processcommalist
[#
subcategories
]
{
\strc_itemgroups_setup_list_level_a
{
#
category
}{
#
whatever
}}
%
655
\else
656
\processcommalist
[#
subcategories
]
{
\strc_itemgroups_setup_list_level_b
{
#
category
}{
#
whatever
}}
%
657
\fi
}
658 659
\def
\strc_itemgroups_increment_item_counter
660
{
\ifconditional
\c_strc_itemgroups_sub
\else
661
\ifconditional
\c_strc_itemgroups_symbol
\else
% \ifempty\strc_itemgroups_extra_symbol
662
\strc_counters_increment_sub
\v_strc_itemgroups_counter
\currentitemlevel
663
\fi
664
\fi
}
665 666
\unexpanded
\def
\strc_itemgroups_insert_item_counter
667
{
\ifconditional
\c_strc_itemgroups_repeat
668
\ifcase
\c_strc_itemgroups_nesting
669
% skip
670
\or
671
\strc_itemgroups_insert_item_counter_indeed
% this could become an option
672
\else
673
\strc_itemgroups_insert_item_counter_indeed
674
\fi
675
\else
676
\strc_itemgroups_insert_item_counter_indeed
677
\fi
}
678 679
\def
\strc_itemgroups_insert_item_counter_indeed
% quite slow ... every time this setup .. but it
680
{
\begingroup
% can be optimized ... best move some to strc-num
681
\setupcounter
682
[
\v_strc_itemgroups_counter
]
%
683
[
\c!prefix
=
\itemgroupparameter
\c!prefix
,
684
\c!prefixstopper
=
\itemgroupparameter
\c!prefixstopper
,
685
\c!prefixseparatorset
=
\itemgroupparameter
\c!prefixseparatorset
,
686
\c!prefixconversion
=
\itemgroupparameter
\c!prefixconversion
,
687
\c!prefixconversionset
=
\itemgroupparameter
\c!prefixseparatorset
,
688
\c!prefixset
=
\itemgroupparameter
\c!prefixset
,
689
\c!prefixsegments
=
\itemgroupparameter
\c!prefixsegments
,
690
\c!prefixconnector
=
\itemgroupparameter
\c!prefixconnector
,
691
\c!criterium
=
\itemgroupparameter
\c!criterium
,
692
\c!numberorder
=
\ifconditional
\c_strc_itemgroups_reverse
\v!reverse
\else
\v!normal
\fi
,
693
\c!numberstopper
=
\expdoif
{
\itemgroupparameter
\c!placestopper
}
\v!yes
{
\itemgroupparameter
\c!stopper
}
,
694
\c!numberconversionset
=
\v_strc_itemgroups_counter
,
695
\c!numbersegments
=
\currentitemgroupsegments
]
%
696
% there will be a fixedconversion key
697
%\normalexpanded{\defineconversionset[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]}%
698
\normalexpanded
{
\strc_sets_define_conversion_set
[
\v_strc_itemgroups_counter
][
\currentitemgroupconversionset
][
\currentitemgroupsymbol
]
}
%
699
%
700
\convertedcounter
[
\v_strc_itemgroups_counter
]
% [\number\currentitemlevel]%
701
\strc_itemgroups_insert_reference
702
\endgroup
}
703 704
% needs testing (maybe it need to happen later)
705
%
706
% \appendtoks
707
% \setupcounter
708
% [\v_strc_itemgroups_counter]%
709
% [\c!prefix=\itemgroupparameter\c!prefix,
710
% \c!prefixstopper=\itemgroupparameter\c!prefixstopper,
711
% \c!prefixseparatorset=\itemgroupparameter\c!prefixseparatorset,
712
% \c!prefixconversion=\itemgroupparameter\c!prefixconversion,
713
% \c!prefixconversionset=\itemgroupparameter\c!prefixseparatorset,
714
% \c!prefixset=\itemgroupparameter\c!prefixset,
715
% \c!prefixsegments=\itemgroupparameter\c!prefixsegments,
716
% \c!prefixconnector=\itemgroupparameter\c!prefixconnector,
717
% \c!criterium=\itemgroupparameter\c!criterium,
718
% \c!numberorder=\ifconditional\c_strc_itemgroups_reverse\v!reverse\else\v!normal\fi,
719
% \c!numberstopper=\expdoif{\itemgroupparameter\c!placestopper}\v!yes{\itemgroupparameter\c!stopper},
720
% \c!numberconversionset=\v_strc_itemgroups_counter,
721
% \c!numbersegments=\currentitemgroupsegments]%
722
% \to\itemgroupcommands
723
%
724
% \def\strc_itemgroups_insert_item_counter_indeed % quite slow ... every time this setup .. but it
725
% {\begingroup % can be optimized ... best move some to strc-num
726
% % there will be a fixedconversion key
727
% %\normalexpanded{\defineconversionset[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]}%
728
% \normalexpanded{\strc_sets_define_conversion_set[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]}%
729
% %
730
% \convertedcounter[\v_strc_itemgroups_counter]% [\number\currentitemlevel]%
731
% \strc_itemgroups_insert_reference
732
% \endgroup}
733 734
\def
\strc_itemgroups_set_symbol
#
symbol
%
735
{
\edef
\strc_itemgroups_tmp_symbol
{
#
symbol
}
%
736
\ifempty
\strc_itemgroups_tmp_symbol
\else
737
\doifelsesymboldefined
\strc_itemgroups_tmp_symbol
738
\strc_itemgroups_set_symbol_symbol
739
{
\doifelseconversiondefined
\strc_itemgroups_tmp_symbol
740
\strc_itemgroups_set_symbol_conversion
741
\donothing
}
%
742
\fi
}
743 744
\def
\strc_itemgroups_set_symbol_symbol
745
{
\let
\currentitemgroupsymbol
\strc_itemgroups_tmp_symbol
746
\strc_itemgroups_store_global_symbol
\currentitemgroupsymbol
747
\strc_itemgroups_store_local_symbol
\v_strc_itemgroups_unknown_symbol
748
\let
\strc_itemgroups_used_symbol
\strc_itemgroups_set_symbol_symbol_item
749
\let
\strc_itemgroups_asked_symbol
\empty
}
750 751
\def
\strc_itemgroups_set_symbol_conversion
752
{
\let
\currentitemgroupsymbol
\strc_itemgroups_tmp_symbol
753
\strc_itemgroups_store_global_symbol
\currentitemgroupsymbol
754
\strc_itemgroups_store_local_symbol
\strc_itemgroups_insert_item_counter
755
\let
\strc_itemgroups_used_symbol
\strc_itemgroups_set_symbol_conversion_item
756
\let
\strc_itemgroups_asked_symbol
\empty
}
757 758
\def
\strc_itemgroups_set_symbol_symbol_item
759
{
\symbol
[
\currentitemgroupsymbol
]
}
760 761
\def
\strc_itemgroups_set_symbol_conversion_item
762
{
\ifconditional
\c_strc_itemgroups_text
763
% maybe block stopper here, but one can as well clone an itemgroup then
764
\itemgroupparameter
\c!lefttext
765
\strc_itemgroups_fetch_local_symbol
766
\itemgroupparameter
\c!righttext
767
\else
768
\itemgroupparameter
\c!left
769
\strc_itemgroups_fetch_local_symbol
770
\itemgroupparameter
\c!right
771
\fi
}
772 773
\def
\strc_itemgroups_calculate_list_width
#
level
%
774
{
\let
\savedcurrentitemgroup
\currentitemgroup
775
\edef
\currentitemgroup
{
\currentparentitemgroup
:
\number
#
level
}
%
776
\ifdim
\d_strc_itemgroups_max_width
>
\zeropoint
777
\d_strc_itemgroups_list_width
\d_strc_itemgroups_max_width
778
\orelse\ifnum
\itemgroupparameter
\c!factor
>
\zerocount
779
\d_strc_itemgroups_list_width
\itemgroupparameter
\c!step
\relax
780
\ifzeropt
\d_strc_itemgroups_list_width
\d_strc_itemgroups_list_width
=
.
5
em
\fi
781
\multiply
\d_strc_itemgroups_list_width
\itemgroupparameter
\c!factor
782
\advance
\d_strc_itemgroups_list_width
\itemgroupparameter
\c!width
\relax
783
\else
784
\d_strc_itemgroups_list_width
\itemgroupparameter
\c!width
\relax
785
\fi
786
\advance
\d_strc_itemgroups_list_width
\itemgroupparameter
\c!distance
\relax
787
\let
\currentitemgroup
\savedcurrentitemgroup
}
788 789
\unexpanded
\def
\startitemgroup
790
{
\dotripleempty
\strc_itemgroups_start
}
791 792
\def
\strc_itemgroups_start
[#
category
][#
options
][#
settings
]
%
793
{
\begingroup
% (1)
794
\def
\currentitemgroup
{
#
category
}
% no nested mixing of itemgroups
795
\let
\currentparentitemgroup
\currentitemgroup
796
\global\advance
\c_strc_itemgroups_nesting
\plusone
797
\def
\currentitemlevel
{
\number
\c_strc_itemgroups_nesting
}
%
798
\normalexpanded
{
\chaintocurrentitemgroup
{
\currentparentitemgroup
:
\currentitemlevel
}}
%
799
\edef
\currentitemgroup
{
\currentparentitemgroup
:
\currentitemlevel
}
%
800
%
801
\ifthirdargument
802
\strc_itemgroups_start_indeed
[#
options
][#
settings
]
%
803
\orelse
\ifsecondargument
804
\ifcondition
\validassignment
{
#
options
}
%
805
\strc_itemgroups_start_indeed
[][#
options
]
%
806
\else
807
\strc_itemgroups_start_indeed
[#
options
][]
%
808
\fi
809
\else
810
\strc_itemgroups_start_indeed
[][]
%
811
\fi
}
812 813
\def
\strc_itemgroups_start_indeed
[#
options
][#
settings
]
%
814
{
\edef
\itemgroupoptions
{
\itemgroupparameter
\c!option
}
%
815
\edef
\itemgroupextraoptions
{
#
options
}
%
816
\ifempty
\itemgroupoptions
817
\let
\itemgroupoptions
\itemgroupextraoptions
818
\orelse\ifempty
\itemgroupextraoptions
819
% ok
820
\else
821
\edef
\itemgroupoptions
{
\itemgroupoptions
,
\itemgroupextraoptions
}
%
822
\fi
823
\begingroup
% (2)
824
\the
\itemgroupcommands
825
\let
\c_strc_itemgroups_text_saved
\c_strc_itemgroups_text
826
\strc_itemgroups_initialize_local
827
\strc_itemgroups_preset_stage_one
\itemgroupoptions
828
%
829
% \ifhmode
830
% \ifconditional\c_strc_itemgroups_auto_concat
831
% \ifdim\lastskip=\d_strc_itemgroups_signal
832
% \settrue\c_strc_itemgroups_concat
833
% \fi
834
% \fi
835
% \ifconditional\c_strc_itemgroups_text_saved \else
836
% \ifconditional\c_strc_itemgroups_text \else
837
% \par
838
% \fi
839
% \fi
840
% \fi
841
%
842
\iftrialtypesetting
843
\strc_counters_save
\v_strc_itemgroups_counter
844
\fi
845
\c_strc_itemgroups_n_of_items
\zerocount
846
\strc_itemgroups_check_n_of_items
847
\ifempty
\itemgroupoptions
848
\strc_itemgroups_setup_symbol_default
849
\strc_itemgroups_reset_continue_state
850
\setupcurrentitemgroup
[#
settings
]
%
851
\else
852
\strc_itemgroups_process_options
\itemgroupoptions
853
\setupcurrentitemgroup
[#
settings
]
%
854
\ifconditional
\c_strc_itemgroups_continue
855
\strc_itemgroups_setup_symbol_continue
856
\strc_itemgroups_fetch_continue_state
857
\else
858
\strc_itemgroups_setup_symbol_asked
859
\strc_itemgroups_store_continue_state
\itemgroupoptions
{
#
settings
}
%
860
\fi
861
\fi
862
%
863
\ifhmode
864
\ifconditional
\c_strc_itemgroups_auto_concat
865
\ifdim
\lastskip
=
\d_strc_itemgroups_signal
866
\settrue
\c_strc_itemgroups_concat
867
\fi
868
\fi
869
\ifconditional
\c_strc_itemgroups_text_saved
\else
870
\ifconditional
\c_strc_itemgroups_text
\else
871
\par
872
\fi
873
\fi
874
\fi
875
%
876
\ifconditional
\c_strc_itemgroups_pack
877
\ifnum
\currentnofitems
>
\itemgroupparameter
\c!packcriterium
\relax\else
878
\setfalse
\c_strc_itemgroups_pack
879
\fi
880
\fi
881
%
882
\ifnum
\c_strc_itemgroups_nesting
=
\plusone
% NIEUW
883
\doadaptleftskip
{
\itemgroupparameter
\c!margin
}
%
884
\doadaptleftskip
{
\itemgroupparameter
\c!leftmargin
}
%
885
\doadaptrightskip
{
\itemgroupparameter
\c!rightmargin
}
%
886
\fi
887
%
888
\doadaptleftskip
{
\itemgroupparameter
\c!leftmargindistance
}
%
889
\doadaptrightskip
{
\itemgroupparameter
\c!rightmargindistance
}
%
890
%
891
\usealignparameter
\itemgroupparameter
892
\edef
\m_strc_itemgroups_indenting
{
\itemgroupparameter
\c!indenting
}
%
893
\ifnum
\c_strc_itemgroups_nesting
>
\zerocount
894
\settrue
\c_strc_itemgroups_first
895
\ifconditional
\c_strc_itemgroups_continue
\else
896
\strc_counters_restart_sub
\v_strc_itemgroups_counter
\currentitemlevel
{
\numexpr
\itemgroupparameter
\c!start
-
\plusone
\relax
}
%
897
\fi
898
\fi
899
\ifempty
\strc_itemgroups_used_symbol
900
\strc_itemgroups_set_symbol
\strc_itemgroups_asked_symbol
% ** default value
901
\ifempty
\strc_itemgroups_used_symbol
902
\let
\currentitemgroupsymbol
\currentitemlevel
% ** fall back
903
\fi
904
\fi
905
\ifconditional
\c_strc_itemgroups_auto_intro
\ifnum
\prevgraf
<
\plusthree
906
\settrue
\c_strc_itemgroups_intro
907
\fi\fi
908
\ifconditional
\c_strc_itemgroups_paragraph
909
\ifnum
\c_strc_itemgroups_nesting
>
\plusone
910
\letitemgroupparameter
\c!inbetween
\empty
911
\fi
912
\fi
913
\ifconditional
\c_strc_itemgroups_pack
914
\letitemgroupparameter
\c!inbetween
\empty
915
\fi
916
\ifconditional
\c_strc_itemgroups_columns
917
\ifinsidecolumns
\else\ifcase
\c_strc_itemgroups_column_depth
918
\global
\c_strc_itemgroups_column_depth
\c_strc_itemgroups_nesting
% global ?
919
\strc_itemgroups_before_command
920
\strc_itemgroups_tag_start_group
921
\strc_itemgroups_start_columns
922
\fi\fi
923
\fi
924
\ifconditional
\c_strc_itemgroups_fitting
925
\ifdim
\d_strc_itemgroups_max_width
>
\zeropoint
926
\letitemgroupparameter
\c!width
\d_strc_itemgroups_max_width
927
\fi
928
\fi
929
\strc_itemgroups_calculate_list_width
\c_strc_itemgroups_nesting
930
\ifdim
\d_strc_itemgroups_list_width
>
\zeropoint
\relax
931
\ifconditional
\c_strc_itemgroups_inline
\else
932
\advance\leftskip
\d_strc_itemgroups_list_width
\relax
933
\fi
934
\fi
935
\ifempty
\m_strc_itemgroups_repeat_start
936
\let
\currentitemgroupconversionset
\currentitemgroupsymbol
937
\edef
\currentitemgroupsegments
{
\currentitemlevel
}
%
938
\else
939
\edef
\currentitemgroupconversionset
{
\currentitemgroupconversionset
,
\currentitemgroupsymbol
}
%
940
\edef
\currentitemgroupsegments
{
\m_strc_itemgroups_repeat_start
:
\currentitemlevel
}
%
941
\fi
942
\d_strc_itemgroups_asked_width
\itemgroupparameter
\c!width
\relax
943
\startcollectitems
}
944 945
\let
\startcollectitems
\relax
946
\let
\stopcollectitems
\relax
947 948
\letvalue
{
\??itemgroupalign\v!flushleft
}
\relax
949
\letvalue
{
\??itemgroupalign\v!right
}
\relax
950
\letvalue
{
\??itemgroupalign\v!flushright
}
\hfill
951
\letvalue
{
\??itemgroupalign\v!left
}
\hfill
952
\letvalue
{
\??itemgroupalign\v!middle
}
\hfil
953
\letvalue
{
\??itemgroupalign\v!center
}
\hfil
954 955
\def
\strc_itemgroups_left_sym_filler
956
{
\csname
\??itemgroupalign
\itemgroupparameter
\c!symalign
\endcsname
}
957 958
% symbols + states
959 960
\def
\strc_itemgroups_store_global_symbol
#
symbol
%
961
{
\letgvalue
{
\??itemgroupglobal
\currentitemgroup
:
\currentitemlevel
}
#
symbol
}
962 963
\def
\strc_itemgroups_store_local_symbol
#
symbol
%
964
{
\letgvalue
{
\??itemgrouplocal
\currentitemgroup
:
\currentitemlevel
}
#
symbol
}
965 966
\def
\strc_itemgroups_fetch_global_symbol
967
{
\csname
\??itemgroupglobal
\currentitemgroup
:
\currentitemlevel
\endcsname
}
968 969
\def
\strc_itemgroups_fetch_local_symbol
970
{
\csname
\??itemgrouplocal
\currentitemgroup
:
\currentitemlevel
\endcsname
}
971 972
\def
\strc_itemgroups_setup_symbol_default
973
{
\edef
\strc_itemgroups_asked_symbol
{
\itemgroupparameter
\c!symbol
}
%
974
\strc_itemgroups_store_global_symbol
\empty
}
975 976
\def
\strc_itemgroups_setup_symbol_continue
977
{
\ifcsname
\??itemgroupglobal
\currentitemgroup
:
\currentitemlevel
\endcsname
978
\let
\strc_itemgroups_asked_symbol
\strc_itemgroups_fetch_global_symbol
979
\else
980
\let
\strc_itemgroups_asked_symbol
\currentitemlevel
981
\fi
}
982 983
\def
\strc_itemgroups_setup_symbol_asked
984
{
\edef
\strc_itemgroups_asked_symbol
{
\itemgroupparameter
\c!symbol
}}
985 986
\ifdefined
\strc_itemgroups_start_columns
987 988
% already defined in page-mix
989 990
\else
991 992
% will be redefined in page-mix
993 994
\ifdefined
\startcolumns
\else
995
\unexpanded
\def
\startcolumns
[#
settings
]
{}
996
\unexpanded
\def
\stopcolumns
{}
997
\fi
998 999
\def
\strc_itemgroups_start_columns
1000
{
\startcolumns
1001
[
\c!n
=
\itemgroupparameter
\c!n
,
1002
\c!height
=
,
1003
\c!rule
=
\v!off
,
1004
\c!balance
=
\v!yes
,
1005
\c!align
=
\v!no
]
}
1006 1007
\def
\strc_itemgroups_stop_columns
1008
{
\stopcolumns
}
1009 1010
\fi
1011 1012
\unexpanded
\def
\stopitemgroup
1013
{
\stopcollectitems
1014
\ifconditional
\c_strc_itemgroups_text
1015
\removeunwantedspaces
1016
\space
1017
\ignorespaces
1018
\else
1019
\par
1020
\fi
1021
\strc_itemgroups_register_status
1022
\ifconditional
\c_strc_itemgroups_first
\else
1023
\dostoptagged
1024
\dostoptagged
1025
% \endgroup % (3)
1026
\fi
1027
\ifnum
\c_strc_itemgroups_column_depth
=
\c_strc_itemgroups_nesting
\relax
1028
\strc_itemgroups_stop_columns
1029
\global
\c_strc_itemgroups_column_depth
\zerocount
% global ?
1030
\strc_itemgroups_tag_stop_group
1031
\strc_itemgroups_after_command
1032
\dontrechecknextindentation
1033
\orelse\ifnum
\c_strc_itemgroups_nesting
=
\plusone
1034
\strc_itemgroups_insert_breakallow
1035
\strc_itemgroups_tag_stop_group
1036
\strc_itemgroups_after_command
1037
\useindentnextparameter
\itemgroupparameter
1038
\else
1039
% nieuw, not yet nobreak handling
1040
\strc_itemgroups_tag_stop_group
1041
\ifcase
\c_strc_itemgroups_spacing_mode
1042
\strc_itemgroups_after_command
1043
\or
1044
\strc_itemgroups_after_command
1045
\fi
1046
\dontrechecknextindentation
1047
\fi
1048
% new test, needed in sidefloats (surfaced in volker's proceedings)
1049
\iftrialtypesetting
1050
\strc_counters_restore
\v_strc_itemgroups_counter
% could happen in LUA
1051
\fi
1052
\global\advance
\c_strc_itemgroups_nesting
\minusone
1053
\xdef
\currentitemlevel
{
\number
\c_strc_itemgroups_nesting
}
%
1054
%\ifconditional\c_strc_itemgroups_text
1055
\endgroup
% (2)
1056
\endgroup
% (1)
1057
%\else
1058
% \endgroup % (2)
1059
% \endgroup % (1)
1060
% \par % hm, already done, and dangerous as \c_strc_itemgroups_text is already forgotten
1061
%\fi
1062
\dorechecknextindentation
}
1063 1064
% The items.
1065 1066
\unexpanded
\def
\startitemgroupitem
1067
{
\dosingleempty
\strc_itemgroups_start_item
}
1068 1069
\def
\strc_itemgroups_start_item_first
1070
{
\setfalse
\c_strc_itemgroups_first
1071
% \begingroup % (3)
1072
\ifcase
\c_strc_itemgroups_nesting
1073
% 0
1074
\or
1075
\strc_itemgroups_start_item_first_one
% 1
1076
\else
1077
\strc_itemgroups_start_item_first_two
% 2+
1078
\fi
}
1079 1080
\def
\strc_itemgroups_start_item_first_one
1081
{
\ifcase
\c_strc_itemgroups_column_depth
1082
\ifconditional
\c_strc_itemgroups_intro
\strc_itemgroups_insert_breakno
\fi
1083
\strc_itemgroups_before_command
1084
\strc_itemgroups_tag_start_group
1085
\ifconditional
\c_strc_itemgroups_intro
\strc_itemgroups_insert_breakno
\fi
1086
\fi
}
1087 1088
\def
\strc_itemgroups_start_item_first_two
1089
{
\ifconditional
\c_strc_itemgroups_paragraph
\else
1090
\edef
\previtemlevel
{
\the\numexpr
\c_strc_itemgroups_nesting
-
\plusone
}
%
1091
\ifcase
\c_strc_itemgroups_spacing_mode
1092
\strc_itemgroups_before_command
1093
\or
1094
\doifelsenothing
\strc_itemgroups_before_command
% should possibly expand to empty
1095
{
\nameditemgroupparameter
{
\currentparentitemgroup
:
\previtemlevel
}
\c!inbetween
}
%
1096
\strc_itemgroups_before_command
1097
\else
1098
\nameditemgroupparameter
{
\currentparentitemgroup
:
\previtemlevel
}
\c!inbetween
1099
\fi
1100
\strc_itemgroups_tag_start_group
1101
\fi
}
1102 1103
\def
\strc_itemgroups_start_item_next
1104
{
\dostoptagged
% ok? what do we stop here?
1105
\dostoptagged
% ok? what do we stop here?
1106
\ifconditional
\c_strc_itemgroups_text
1107
\ifhmode
1108
% WS: make the distance between items customizable, think about better default values -> see itemize-1.tex
1109
\strc_itemgroups_set_text_item_distance
% HH: moved out and made configurable (sort of)
1110
\removeunwantedspaces
1111
\hskip
\m_strc_itemgroups_text_distance
\relax
1112
\fi
1113
\else
1114
\strc_itemgroups_between_command
1115
\fi
}
1116 1117
% c_strc_itemgroups_concat:
1118
%
1119
% the problem is that we use leftskip so concat cannot reliable take the height into
1120
% account; it's .. rather tricky when white space in there anyway (due to \par) .. so
1121
% we rely on a special blank method
1122
%
1123
% \startitemize[n]
1124
% \item bla
1125
% \item \startitemize[a]
1126
% \item bla $\displaystyle\int^{x^{y^4}}$ \item bla
1127
% \stopitemize
1128
% \stopitemize
1129 1130
\unexpanded
\def
\strc_itemgroups_start_item
[#
reference
]
% we can reuse more
1131
{
\def
\currentitemreference
{
#
reference
}
%
1132
\ifconditional
\c_strc_itemgroups_text
1133
% begin of item
1134
\else
1135
\par
1136
\fi
1137
\ifconditional
\c_strc_itemgroups_concat
1138
\strc_itemgroups_insert_breakno
1139
\fi
1140
\strc_itemgroups_increment_item_counter
1141
\ifconditional
\c_strc_itemgroups_first
1142
\strc_itemgroups_start_item_first
1143
\else
1144
\strc_itemgroups_start_item_next
1145
\fi
1146
\ifconditional
\c_strc_itemgroups_concat
1147
\spac_overlay_lines
% see spac-ver.mkvi ... a typical potential problem
1148
\setfalse
\c_strc_itemgroups_concat
1149
\fi
1150
\dostarttagged
\t!item
\empty
1151
% \dotagsetitem\empty
1152
\dostarttagged
\t!itemtag
\empty
1153
\strc_itemgroups_insert_item
1154
\dostoptagged
1155
\ifconditional
\c_strc_itemgroups_pack
1156
\setupwhitespace
[
\v!none
]
%
1157
\fi
1158
\itemgroupparameter
\c!inner
% will become obsolete (better use setups)
1159
\strc_itemgroups_margin_symbol
1160
\let
\strc_itemgroups_margin_symbol
\relax
1161
\dostarttagged
\t!itemcontent
\empty
1162
\begstrut
% \strut
1163
\nobreak
% else problems with intext items
1164
\seteffectivehsize
% NEW !
1165
\hskip
\d_strc_itemgroups_signal
% concat
1166
\itemgroupparameter
\c!command
}
1167 1168
\unexpanded
\def
\stopitemgroupitem
1169
{
\ifhmode
1170
\endstrut
% new per 2017-12-15
1171
\fi
1172
\ifconditional
\c_strc_itemgroups_text
1173
% nothing
1174
\else
1175
\endgraf
1176
\fi
}
1177
\unexpanded
\def
\startitemgrouphead
1178
{
\dosingleempty
\strc_itemgroups_start_head
}
1179 1180
\unexpanded
\def
\strc_itemgroups_start_head
[#
reference
]
%
1181
{
\ifconditional
\c_strc_itemgroups_first
\else
1182
\strc_itemgroups_insert_breakallow
1183
\fi
1184
\ifconditional
\c_strc_itemgroups_pack
\else
1185
\strc_itemgroups_before_head_command
1186
\fi
1187
\ifconditional
\c_strc_itemgroups_first
1188
\ifconditional
\c_strc_itemgroups_intro
\else
1189
\ifcase
\c_strc_itemgroups_nesting
1190
\strc_itemgroups_insert_breakallow
1191
\fi
1192
\fi
1193
\fi
1194
\strc_itemgroups_start_item
[#
reference
]
%
1195
\pickupgroupedcommand
1196
\strc_itemgroups_start_head_indeed
1197
\strc_itemgroups_stop_head_indeed
1198
\strc_itemgroups_head_body_indeed
}
1199 1200
\unexpanded
\def
\stopitemgrouphead
1201
{
\dostoptagged
1202
\stopitemgroupitem
}
1203 1204
\unexpanded
\def
\strc_itemgroups_start_head_indeed
1205
{
\settrue
\c_strc_itemgroups_head
1206
\dotagsetitem
\s!head
% % weird place
1207
\dostarttagged
\t!itemhead
\empty
1208
\useitemgroupstyleandcolor
\c!headstyle\c!headcolor
\ignorespaces
}
1209 1210
\unexpanded
\def
\strc_itemgroups_stop_head_indeed
1211
{
\removeunwantedspaces
1212
\dostoptagged
1213
\ifconditional
\c_strc_itemgroups_inline_head
1214
\space
1215
\ignorespaces
1216
\else
1217
\ifconditional
\c_strc_itemgroups_text
1218
\space
1219
\ignorespaces
1220
\else
1221
\par
1222
\fi
1223
\strc_itemgroups_insert_breakno
1224
\ifconditional
\c_strc_itemgroups_pack
\else
\strc_itemgroups_after_head_command
\fi
1225
\strc_itemgroups_insert_breakno
1226
\fi
}
1227 1228
\unexpanded
\def
\strc_itemgroups_head_body_indeed
1229
{
\dostarttagged
\t!itembody
\empty
1230
\noindentation
1231
\ignorespaces
}
1232 1233
% Simple commands.
1234 1235
\unexpanded
\def
\strc_itemgroups_start_do_item
1236
{
\startitemgroupitem
}
1237 1238
\unexpanded
\def
\strc_itemgroups_start_no_item
1239
{
\let
\currentitemreference
\empty
1240
\strc_itemgroups_increment_item_counter
1241
%\advance\c_strc_itemgroups_n_of_items\plusone
1242
\setbox
\b_strc_itemgroups
\emptyhbox
1243
\strc_itemgroups_check_for_repeated
1244
\ignorespaces
}
1245 1246
\unexpanded
\def
\strc_itemgroups_start_button
[#
destination
]
%
1247
{
\edef
\m_strc_itemgroups_destination
{
#
destination
}
%
1248
\startitemgroupitem
}
1249 1250
\unexpanded
\def
\strc_itemgroups_start_symbol
#
text
%
1251
{
\def
\strc_itemgroups_extra_symbol
{
#
text
}
%
1252
\settrue
\c_strc_itemgroups_symbol
1253
\startitemgroupitem
1254
\dotagsetitem
\s!symbol
}
1255 1256
\unexpanded
\def
\strc_itemgroups_start_dummy
1257
{
\strc_itemgroups_start_symbol
1258
%\strut\strut} % two ?
1259
\begstrut
}
1260 1261
\unexpanded
\def
\strc_itemgroups_start_subitem
1262
{
\settrue
\c_strc_itemgroups_sub
1263
\startitemgroupitem
1264
\dotagsetitem
\s!sub
}
1265 1266
\unexpanded
\def
\strc_itemgroups_start_edge
#
text
%
1267
{
\strc_itemgroups_start_symbol
1268
{
\strc_itemgroups_calculate_list_width
\c_strc_itemgroups_nesting
1269
\dostarttagged
\t!ignore
\empty
% for the moment, maybe an attribute
1270
\hbox
to
\d_strc_itemgroups_list_width
1271
{
#
text
\hskip
\itemgroupparameter
\c!distance
}
%
1272
\dostoptagged
}}
1273 1274
\unexpanded
\def
\strc_itemgroups_start_margin
#
text
%
1275
{
\def
\strc_itemgroups_margin_symbol
% brrr
1276
{
\dostarttagged
\t!ignore
\empty
% for the moment, maybe an attribute
1277
\llap
1278
{
\begingroup
1279
\useitemgroupstyleandcolor
\c!marstyle\c!marcolor
1280
#
text
% keep em/ex local
1281
\endgroup
1282
\hskip\dimexpr\leftskip
+
\leftmargindistance
\relax
}
%
1283
\dostoptagged
}
%
1284
\startitemgroupitem
1285
\dotagsetitem
\s!margin
}
1286 1287
\unexpanded
\def
\strc_itemgroups_start_text
#
text
%
1288
{
\def
\strc_itemgroups_extra_symbol
{
#
text
}
%
1289
\settrue
\c_strc_itemgroups_symbol
1290
\settrue
\c_strc_itemgroups_txt
1291
\startitemgroupitem
}
1292 1293
% \unexpanded\def\strc_itemgroups_start_head
1294
% {\settrue\c_strc_itemgroups_head
1295
% \startitemgrouphead}
1296 1297
\unexpanded
\def
\strc_itemgroups_start_items
1298
{
\dosingleempty
\strc_itemgroups_start_items_indeed
}
1299 1300
\unexpanded
\def
\strc_itemgroups_start_items_indeed
[#
whatever
]
% something got lost
1301
{
\strc_itemgroups_start_edge
1302
{
\dorecurse
{
0
\itemgroupparameter
\c!items
}{
\strc_itemgroups_used_symbol
\hss
}
%
1303
\unskip
}}
1304 1305
% \unexpanded\def\startspecialitemgroupitem[#name]%
1306
% {\csname\??itemgroupstart\ifcsname\??itemgroupstart#name\endcsname#name\else\v!item\fi\endcsname}
1307 1308
\unexpanded
\def
\startspecialitemgroupitem
[#
name
]
%
1309
{
\ifcsname
\??itemgroupstart
#
name
\endcsname
1310
\expandafter\lastnamedcs
1311
\else
1312
\expandafter
\strc_itemgroups_start_do_item
1313
\fi
}
1314 1315
\unexpanded
\def
\stopspecialitemgroupitem
1316
{
\stopitemgroupitem
}
1317 1318
\letvalue
{
\??itemgroupstart\v!item
}
\strc_itemgroups_start_do_item
1319
\letvalue
{
\??itemgroupstart\v!sub
}
\strc_itemgroups_start_subitem
1320
\letvalue
{
\??itemgroupstart\v!sym
}
\strc_itemgroups_start_symbol
1321
\letvalue
{
\??itemgroupstart\v!ran
}
\strc_itemgroups_start_edge
1322
\letvalue
{
\??itemgroupstart\v!its
}
\strc_itemgroups_start_items
1323
\letvalue
{
\??itemgroupstart\v!mar
}
\strc_itemgroups_start_margin
1324
\letvalue
{
\??itemgroupstart\v!txt
}
\strc_itemgroups_start_text
1325 1326
\def
\optimizelistitemsbreak
1327
{
\ifcase
\c_strc_itemgroups_column_depth
1328
\ifconditional
\c_strc_itemgroups_optimize
1329
\ifcase
\c_strc_itemgroups_max_items
1330
\orelse\ifnum
\c_strc_itemgroups_max_items
=
\plusthree
1331
\ifnum
\c_strc_itemgroups_n_of_items
>
\plusone
1332
\strc_itemgroups_insert_nobreak
1333
\fi
1334
\orelse\ifnum
\c_strc_itemgroups_max_items
>
\plusthree
1335
\ifnum
\c_strc_itemgroups_n_of_items
=
\plustwo
1336
\ifconditional
\c_strc_itemgroups_intro
1337
\strc_itemgroups_insert_breakno
1338
\else
1339
\strc_itemgroups_insert_nobreak
1340
\fi
1341
\orelse\ifnum
\c_strc_itemgroups_max_items
=
\c_strc_itemgroups_n_of_items
\relax
1342
\strc_itemgroups_insert_nobreak
1343
\orelse\ifnum
\c_strc_itemgroups_n_of_items
>
\plustwo
1344
\strc_itemgroups_insert_break
1345
\else
1346
\ifconditional
\c_strc_itemgroups_intro
\else
\strc_itemgroups_insert_break
\fi
1347
\fi
1348
\fi
1349
\fi
1350
\fi
}
1351 1352
\def
\strc_itemgroups_handle_text_item
1353
{
\scratchdimen
\wd
\b_strc_itemgroups
1354
\advance
\scratchdimen
\itemgroupparameter
\c!distance
\relax
1355
\ifdim
\scratchdimen
>
\d_strc_itemgroups_list_width
1356
\advance
\scratchdimen
-
\d_strc_itemgroups_list_width
1357
\else
1358
\scratchdimen
\zeropoint
1359
\fi
1360
\llap
{
\hbox
to
\d_strc_itemgroups_list_width
{
\ifconditional
\c_strc_itemgroups_sub
\llap
{
+
\enspace
}
\fi\box
\b_strc_itemgroups
\hss
}}
% was: \hfill
1361
\hskip
\scratchdimen
}
1362 1363
\def
\strc_itemgroups_handle_lapped_item_positive
1364
{
\llap
1365
{
\dontcomplain
1366
\hbox
to
\d_strc_itemgroups_list_width
1367
{
\ifconditional
\c_strc_itemgroups_sub
1368
\dostarttagged
\t!ignore
\empty
1369
\llap
{
+
\enspace
}
%
1370
\dostoptagged
1371
\fi
1372
\strc_itemgroups_left_sym_filler
1373
\box
\b_strc_itemgroups
% can already have a forced widt, only factor handled here
1374
\hfil
1375
\hskip
\itemgroupparameter
\c!distance
}}}
1376 1377
\def
\strc_itemgroups_handle_lapped_item_negative
1378
{
\llap
1379
{
\ifconditional
\c_strc_itemgroups_sub
1380
\dostarttagged
\t!ignore
\empty
1381
\llap
{
+
\enspace
}
%
1382
\dostoptagged
1383
\fi
1384
\box
\b_strc_itemgroups
1385
\hskip
\leftmargindistance
}}
1386 1387
\def
\strc_itemgroups_handle_groups_text_item
1388
{
\hbox
1389
{
\ifconditional
\c_strc_itemgroups_sub
1390
\dostarttagged
\t!ignore
\empty
1391
+
\enspace
1392
\dostoptagged
1393
\fi
1394
\box
\b_strc_itemgroups
1395
\hskip
\interwordspace
}
%
1396
\nobreak
}
1397 1398
\def
\strc_itemgroups_handle_groups_inline_item
1399
{
\hbox
to
\d_strc_itemgroups_list_width
1400
{
\ifconditional
\c_strc_itemgroups_sub
1401
\dostarttagged
\t!ignore
\empty
1402
\llap
{
+
\enspace
}
%
1403
\dostoptagged
1404
\fi
1405
\box
\b_strc_itemgroups
1406
\hss
}}
% was: \hfill
1407 1408
\unexpanded
\def
\strc_itemgroups_start_head_sym
#
text
%
1409
{
\def
\strc_itemgroups_extra_symbol
{
#
text
}
%
1410
\settrue
\c_strc_itemgroups_symbol
1411
\settrue
\c_strc_itemgroups_head
1412
\strc_itemgroups_start_head
}
1413 1414
\def
\strc_itemgroups_make_symbol_box
1415
{
\setbox
\b_strc_itemgroups
\autodirhbox
1416
{
\ifconditional
\c_strc_itemgroups_head
1417
\ifconditional
\c_strc_itemgroups_symbol
1418
\strc_itemgroups_insert_extra_reference
1419
\useitemgroupstyleandcolor
\c!symstyle\c!symcolor
1420
\strc_itemgroups_extra_symbol
1421
\else
1422
\useitemgroupstyleandcolor
\c!headstyle\c!headcolor
1423
\strc_itemgroups_used_symbol
1424
\fi
1425
\else
1426
\ifconditional
\c_strc_itemgroups_symbol
1427
\strc_itemgroups_insert_extra_reference
1428
\useitemgroupstyleandcolor
\c!symstyle\c!symcolor
1429
\strc_itemgroups_extra_symbol
1430
\else
1431
\useitemgroupstyleandcolor
\c!style\c!color
1432
\strc_itemgroups_used_symbol
1433
\fi
1434
\fi
}
%
1435
\let
\strc_itemgroups_extra_symbol
\empty
1436
\setfalse
\c_strc_itemgroups_symbol
}
1437 1438
\def
\strc_itemgroups_make_fitting_box
1439
{
\ifdim
\wd
\b_strc_itemgroups
>
\itemgroupparameter
\c!maxwidth
\relax
1440
\normalexpanded
{
\global
\setitemgroupparameter
{
\c!maxwidth
}{
\the\wd
\b_strc_itemgroups
}}
%
1441
\fi
1442
\ifdim
\d_strc_itemgroups_max_width
>
\zeropoint
1443
\setbox
\b_strc_itemgroups
\simplealignedbox
1444
{
\dimexpr
\d_strc_itemgroups_max_width
+
\itemgroupparameter
\c!distance
\relax
}
1445
{
\itemgroupparameter
\c!itemalign
}
1446
{
\box
\b_strc_itemgroups
\hskip
\itemgroupparameter
\c!distance
}
%
1447
\fi
}
1448 1449
\def
\strc_itemgroups_make_aligned_box
1450
{
\doifsomething
{
\itemgroupparameter
\c!itemalign
}
1451
{
\setbox
\b_strc_itemgroups
\simplealignedbox
1452
{
\dimexpr
\d_strc_itemgroups_asked_width
+
\itemgroupparameter
\c!distance
\relax
}
1453
{
\itemgroupparameter
\c!itemalign
}
1454
{
\box
\b_strc_itemgroups
\hskip
\itemgroupparameter
\c!distance
}}}
1455 1456
\def
\strc_itemgroups_make_destination_box
1457
{
\iftrialtypesetting
\orelse
\ifempty
\m_strc_itemgroups_destination
\else
1458
\setbox
\b_strc_itemgroups
\hbox
{
\directgotobox
{
\box
\b_strc_itemgroups
}
[
\m_strc_itemgroups_destination
]
}
%
1459
\fi
}
1460 1461
\def
\strc_itemgroups_check_indenting
1462
{
\setfalse
\c_strc_itemgroups_indented_first
1463
\ifempty
\m_strc_itemgroups_indenting
\else
1464
\normalexpanded
{
\setupindenting
[
\v!reset
,
\v!yes
,
\m_strc_itemgroups_indenting
]
}
%
1465
\ifconditional
\c_spac_indentation_indent_first
% better is to have a mode
1466
\doifnot
{
\itemgroupparameter
\c!alignsymbol
}
\v!yes
1467
{
\settrue
\c_strc_itemgroups_indented_first
}
%
1468
\fi
1469
\fi
}
1470 1471
\def
\strc_itemgroups_check_for_repeated
1472
{
\ifconditional
\c_strc_itemgroups_repeat
1473
\ifempty
\m_strc_itemgroups_repeat_start
1474
\edef
\m_strc_itemgroups_repeat_start
{
\currentitemlevel
}
%
1475
\fi
1476
\else
1477
\let
\m_strc_itemgroups_repeat_start
\empty
1478
\fi
}
1479 1480
\def
\strc_itemgroups_insert_item
1481
{
\ifconditional
\c_strc_itemgroups_text
% again?
1482
% begin of item
1483
\else
1484
\par
% done twice?
1485
\fi
1486
\advance
\c_strc_itemgroups_n_of_items
\plusone
1487
\optimizelistitemsbreak
1488
\strc_itemgroups_check_indenting
1489
\dontleavehmode
1490
\ifconditional
\c_strc_itemgroups_indented_first
1491
\hskip
-
\parindent
1492
\fi
1493
\strc_itemgroups_make_symbol_box
1494
\strc_itemgroups_make_destination_box
1495
\ifconditional
\c_strc_itemgroups_fitting
1496
\strc_itemgroups_make_fitting_box
1497
\else\ifdim
\d_strc_itemgroups_asked_width
>
\zeropoint
1498
\strc_itemgroups_make_aligned_box
1499
\fi\fi
1500
\let
\m_strc_itemgroups_destination
\empty
1501
\ht
\b_strc_itemgroups
\strutheight
% just in case a symbols is not yet available in
1502
\dp
\b_strc_itemgroups
\strutdepth
% the current run (more a mkii mp side artifact)
1503
\strc_itemgroups_check_for_repeated
1504
\ifdim
\d_strc_itemgroups_asked_width
<
\zeropoint
\relax
1505
\strc_itemgroups_handle_lapped_item_negative
1506
\else
1507
\ifzeropt
\d_strc_itemgroups_asked_width
1508
\strc_itemgroups_calculate_list_width
\plusone
1509
\else
1510
\strc_itemgroups_calculate_list_width
\c_strc_itemgroups_nesting
1511
\fi
1512
\ifconditional
\c_strc_itemgroups_text
1513
\strc_itemgroups_handle_groups_text_item
1514
\orelse
\ifconditional
\c_strc_itemgroups_inline
1515
\strc_itemgroups_handle_groups_inline_item
1516
\orelse
\ifconditional
\c_strc_itemgroups_txt
1517
\strc_itemgroups_handle_text_item
1518
\else
1519
\strc_itemgroups_handle_lapped_item_positive
1520
\fi
1521
\fi
1522
\setfalse
\c_strc_itemgroups_head
1523
\setfalse
\c_strc_itemgroups_sub
1524
\ifconditional
\c_strc_itemgroups_indented_first
1525
\hskip\parindent
1526
\fi
1527
\ignorespaces
}
1528 1529
\def
\strc_itemgroups_start_item_nop
1530
{
\let
\currentitemreference
\empty
1531
\strc_itemgroups_increment_item_counter
1532
\advance
\c_strc_itemgroups_n_of_items
\plusone
1533
\setbox
\b_strc_itemgroups
\hbox
1534
{
\useitemgroupstyleandcolor
\c!style\c!color
1535
\strc_itemgroups_used_symbol
}
%
1536
\strc_itemgroups_check_for_repeated
1537
\ignorespaces
}
1538 1539
\setvalue
{
\??itemgroupdistance\v!none
}
%
1540
{
\let
\m_strc_itemgroups_text_distance
\zeropoint
}
1541 1542
\setvalue
{
\??itemgroupdistance\v!space
}
%
1543
{
\def
\m_strc_itemgroups_text_distance
{
\interwordspace
\!!plus
\interwordstretch
\!!minus
\interwordshrink
}}
1544 1545
\setvalue
\??itemgroupdistance
% catches empty value
1546
{
\let
\m_strc_itemgroups_text_distance
\zeropoint
}
1547 1548
\unexpanded
\def
\strc_itemgroups_set_text_item_distance
1549
{
\edef
\m_strc_itemgroups_text_distance
{
\itemgroupparameter
\c!textdistance
}
%
1550
\ifempty
\m_strc_itemgroups_text_distance
1551
%
1552
\orelse\ifcsname
\??itemgroupdistance
\m_strc_itemgroups_text_distance
\endcsname
1553
\lastnamedcs
1554
\else
1555
\strc_itemgroups_set_text_item_distance_indeed
1556
\fi
}
1557 1558
\def
\strc_itemgroups_set_text_item_distance_indeed
1559
{
\assignvalue
1560
\m_strc_itemgroups_text_distance
1561
\m_strc_itemgroups_text_distance
1562
{
.
5
\interwordspace
\!!plus
.
5
\emwidth
}
%
1563
{
\interwordspace
\!!plus
\emwidth
}
%
1564
{
\emwidth
\!!plus
\interwordstretch
\!!minus
\interwordshrink
}}
1565 1566
% \unexpanded\def\strc_itemgroups_default_command
1567
% {\EveryPar{\ignorespaces}% needed ?
1568
% \ignorespaces}
1569 1570
\unexpanded
\def
\strc_itemgroups_default_command
1571
{
\ignorespaces
}
1572 1573
%D Special case:
1574 1575
\unexpanded
\def
\strc_itemgroups_head
#
text
\par
1576
{
\startitemgrouphead
{
#
text
}}
1577 1578
%D The local commands:
1579 1580
\appendtoks
1581
\let
\item
\strc_itemgroups_start_do_item
1582
\let
\sub
\strc_itemgroups_start_subitem
1583
\let
\sym
\strc_itemgroups_start_symbol
1584
\let
\ran
\strc_itemgroups_start_edge
1585
\let
\its
\strc_itemgroups_start_items
1586
\let
\mar
\strc_itemgroups_start_margin
1587
\let
\noitem
\strc_itemgroups_start_no_item
1588
\let
\itm
\strc_itemgroups_start_do_item
1589
\let
\but
\strc_itemgroups_start_button
1590
\let
\nop
\strc_itemgroups_start_dummy
1591
\let
\txt
\strc_itemgroups_start_text
1592
\let
\head
\strc_itemgroups_head
1593
\let
\headsym
\strc_itemgroups_start_head_sym
1594
\let
\startitem
\startitemgroupitem
1595
\let
\stopitem
\stopitemgroupitem
1596
\let
\starthead
\startitemgrouphead
1597
\let
\stophead
\stopitemgrouphead
1598
\let
\startspecialitem
\startspecialitemgroupitem
1599
\let
\stopspecialitem
\stopspecialitemgroupitem
1600
\to
\itemgroupcommands
1601 1602
\ifx
\currentinterface
\s!english
\else
1603 1604
\def
\next
#
1
#
2
{
\ifcsname
#
1
\endcsname\else\let\csname
#
1
\endcsname
#
2
\fi
}
1605 1606
\etoksapp
\itemgroupcommands
{
%
1607
\next
{
\v!item
}
\strc_itemgroups_start_do_item
1608
\next
{
\v!sub
}
\strc_itemgroups_start_subitem
1609
\next
{
\v!sym
}
\strc_itemgroups_start_symbol
1610
\next
{
\v!ran
}
\strc_itemgroups_start_edge
1611
\next
{
\v!head
}
\strc_itemgroups_head
1612
\next
{
\v!its
}
\strc_itemgroups_start_items
1613
\next
{
\v!mar
}
\strc_itemgroups_start_margin
1614
\next
{
\v!txt
}
\strc_itemgroups_start_text
1615
\next
{
\e!start\v!item
}
\startitemgroupitem
1616
\next
{
\e!stop
\v!item
}
\stopitemgroupitem
1617
\next
{
\e!start\v!head
}
\startitemgrouphead
1618
\next
{
\e!stop
\v!head
}
\stopitemgrouphead
1619
}
1620 1621
\fi
1622 1623
\relaxvalueifundefined
\v!item
1624
\relaxvalueifundefined
\v!sub
1625
\relaxvalueifundefined
\v!sym
1626
\relaxvalueifundefined
\v!ran
1627
\relaxvalueifundefined
\v!head
1628
\relaxvalueifundefined
\v!its
1629
\relaxvalueifundefined
\v!mar
1630
\relaxvalueifundefined
\v!txt
1631
\relaxvalueifundefined
{
\e!start\v!item
}
1632
\relaxvalueifundefined
{
\e!stop
\v!item
}
1633
\relaxvalueifundefined
{
\e!start\v!head
}
1634
\relaxvalueifundefined
{
\e!stop
\v!head
}
1635 1636
%D A nice example of a plugin:
1637
%D
1638
%D \startbuffer
1639
%D \startitemize[a,random,packed]
1640
%D \startitem first \stopitem \startitem second \stopitem
1641
%D \startitem third \stopitem \startitem fourth \stopitem
1642
%D \stopitemize
1643
%D
1644
%D \startitemize[a,random,packed]
1645
%D \startitem first \stopitem \startitem second \stopitem
1646
%D \startitem third \stopitem \startitem fourth \stopitem
1647
%D \stopitemize
1648
%D
1649
%D \startitemize[a,packed]
1650
%D \startitem first \stopitem \startitem second \stopitem
1651
%D \startitem third \stopitem \startitem fourth \stopitem
1652
%D \stopitemize
1653
%D \stopbuffer
1654
%D
1655
%D \typebuffer \getbuffer
1656 1657
% better collectitems als conditional and a real plugin mechanism (some day)
1658 1659
\newcount
\c_strc_itemgroups_collected_stored
1660
\newcount
\c_strc_itemgroups_collected_done
1661
\newcount
\c_strc_itemgroups_collected_current
1662 1663
% \expandafter\def\expandafter\strc_itemgroups_collected_store\expandafter#\expandafter1\csname\e!stop\v!item\endcsname % use grabuntil
1664
% {\advance\c_strc_itemgroups_collected_stored\plusone
1665
% \setvalue{\??itemgroupstack\number\c_strc_itemgroups_collected_stored}{\startitemgroupitem#1\stopitemgroupitem}}
1666 1667
\let
\strc_itemgroups_collected_store
\relax
1668 1669
\normalexpanded
{
\def
\strc_itemgroups_collected_store
#
1
\csname
\e!stop\v!item
\endcsname
}
%
1670
{
\advance
\c_strc_itemgroups_collected_stored
\plusone
1671
\setvalue
{
\??itemgroupstack
\number
\c_strc_itemgroups_collected_stored
}{
\startitemgroupitem
#
1
\stopitemgroupitem
}}
1672 1673
\def
\strc_itemgroups_collected_flush_randomize
1674
{
\collecteditemgroupitem
}
1675 1676
\def
\strc_itemgroups_collected_flush_horizontal
1677
{
\begingroup
1678
\scratchcounter
\itemgroupparameter
\c!n
\relax
1679
\ifnum
\c_strc_itemgroups_collected_done
>
\plusone
1680
\ifcase
\modulonumber\scratchcounter
\c_strc_itemgroups_collected_done
\relax
1681
% compensate for rounding errors
1682
\hfill
% \hskip\zeropoint plus \scaledpoint minus \scaledpoint
1683
\allowbreak
1684
\fi
1685
\fi
1686
\noindent
% no \dontleavehmode
1687
\hbox
to
\dimexpr
\availablehsize
/
\scratchcounter
\relax
{
\collecteditemgroupitem
\hss
}
%
1688
\endgroup
}
1689 1690
% \def\strc_itemgroups_collected_flush_indeed
1691
% {\collecteditemgroupitem
1692
% \iftrialtypesetting
1693
% \undefinevalue{\??itemgroupstack\number\c_strc_itemgroups_collected_current}%
1694
% \fi}
1695 1696
\def
\strc_itemgroups_collected_flush_indeed
1697
{
\collecteditemgroupitem
1698
\undefinevalue
{
\??itemgroupstack
\number
\c_strc_itemgroups_collected_current
}}
1699 1700
\def
\strc_itemgroups_collected_flush
1701
{
\ifconditional
\c_strc_itemgroups_randomize
1702
\getrandomcount
\c_strc_itemgroups_collected_current
\plusone
\c_strc_itemgroups_collected_stored
1703
\else
1704
\advance
\c_strc_itemgroups_collected_current
\plusone
1705
\fi
1706
\ifcsname
\??itemgroupstack
\number
\c_strc_itemgroups_collected_current
\endcsname
1707
\edef
\collecteditemgroupitem
{
\lastnamedcs
}
%
1708
\ifconditional
\c_strc_itemgroups_horizontal
1709
\strc_itemgroups_collected_flush_horizontal
1710
\else
1711
\strc_itemgroups_collected_flush_indeed
1712
\fi
1713
\advance
\c_strc_itemgroups_collected_done
\plusone
1714
\fi
1715
\ifnum
\c_strc_itemgroups_collected_done
<
\c_strc_itemgroups_collected_stored
1716
\expandafter
\strc_itemgroups_collected_flush
1717
\fi
}
1718 1719
\unexpanded
\def
\stopcollectitems
1720
{
\ifconditional
\c_strc_itemgroups_collecting
1721
\c_strc_itemgroups_collected_done
\zerocount
1722
\c_strc_itemgroups_collected_current
\zerocount
1723
\ifnum
\c_strc_itemgroups_collected_stored
>
\zerocount
1724
\ifconditional
\c_strc_itemgroups_horizontal
1725
\strc_itemgroups_before_command
1726
\setfalse
\c_strc_itemgroups_first
1727
\strc_itemgroups_collected_flush
1728
%\strc_itemgroups_after_command % triggered elsewhere
1729
\else
1730
\strc_itemgroups_collected_flush
1731
\fi
1732
\fi
1733
\fi
}
1734 1735
\unexpanded
\def
\startcollectitems
1736
{
\ifconditional
\c_strc_itemgroups_collecting
1737
\c_strc_itemgroups_collected_stored
\zerocount
1738
\letvalue
{
\e!start\v!item
}
\strc_itemgroups_collected_store
1739
\fi
}
1740 1741
%D Left-overs:
1742 1743
\unexpanded
\def
\item
1744
{
\strc_itemgroups_item_alone
}
1745 1746
\def
\strc_itemgroups_item_alone
[#
category
]#
text
\par
1747
{
\doifelsesomething
{
#
category
}{
\startitemgroup
[#
category
]
}{
\startitemgroup
[
\v!itemize
]
}
%
1748
\startitem
#
text
\stopitem
1749
\stopitemgroup
}
1750 1751
\unexpanded
\def
\head
1752
{
\strc_itemgroups_head_alone
}
1753 1754
\def
\strc_itemgroups_head_alone
[#
category
]#
head
\par
#
body
\par
1755
{
\doifelsesomething
{
#
category
}{
\startitemgroup
[#
category
]
}{
\startitemgroup
[
\v!itemize
]
}
%
1756
\starthead
{
#
head
}
#
body
\stophead
1757
\stopitemgroup
}
1758 1759
\setuvalue
{
\e!start\v!item
}
%
1760
{
\startitemgroup
[
\v!itemize
]
%
1761
\startitemgroupitem
1762
\setuvalue
{
\e!stop\v!item
}{
\stopitemgroupitem
\stopitemgroup
}}
1763 1764
% \def\sym#text%
1765
% {\noindent
1766
% \begingroup
1767
% \setbox\scratchbox\hbox{\settrialtypesetting#text}%
1768
% \setbox\scratchbox\hbox\ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#text\hfil}%
1769
% \normalexpanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}%
1770
% \ignorespaces}
1771 1772
%D End of plugin.
1773 1774
%D Something for tables:
1775 1776
\unexpanded
\def
\itemtag
1777
{
\dosingleempty
\strc_itemgroups_item_tag
}
1778 1779
\unexpanded
\def
\strc_itemgroups_item_tag
[#
reference
]
% we can reuse more
1780
{
\def
\currentitemreference
{
#
reference
}
%
1781
\iftrialtypesetting
1782
\strc_counters_save
\v_strc_itemgroups_counter
1783
\strc_itemgroups_increment_item_counter
1784
\strc_itemgroups_insert_item_tag_indeed
1785
\strc_counters_restore
\v_strc_itemgroups_counter
1786
\else
1787
\strc_itemgroups_increment_item_counter
1788
\strc_itemgroups_insert_item_tag_indeed
1789
\fi
}
1790 1791
\def
\strc_itemgroups_insert_item_tag_indeed
1792
{
\letitemgroupparameter
\c!distance
\zeropoint
1793
%letitemgroupparameter\c!width\zeropoint
1794
\strc_itemgroups_make_symbol_box
1795
\strc_itemgroups_make_destination_box
1796
\let
\m_strc_itemgroups_destination
\empty
1797
\ht
\b_strc_itemgroups
\strutheight
1798
\dp
\b_strc_itemgroups
\strutdepth
1799
\box
\b_strc_itemgroups
1800
\ignorespaces
}
1801 1802
%D Done again.
1803 1804
\setupitemgroup
1805
[
\c!margin
=
\zeropoint
,
1806
\c!leftmargin
=
\zeropoint
,
1807
\c!rightmargin
=
\zeropoint
,
1808
\c!leftmargindistance
=
\zeropoint
,
1809
\c!rightmargindistance
=
\zeropoint
,
1810
\c!indentnext
=
\v!yes
,
1811
\c!width
=
1
.
5
\emwidth
,
1812
\c!factor
=
0
,
1813
%\c!distance=.5em, % is now:
1814
\c!step
=
.
5
\emwidth
,
% deals with broad
1815
\c!distance
=
\zeropoint
,
1816
%\c!align=\v!normal, % definitely not \v!normal !
1817
%\c!symalign=,
1818
%\c!color=,
1819
%\c!indenting=, % untouched if empty
1820
%\c!style=,
1821
\c!marstyle
=
\v!type
,
1822
%\c!symstyle=,
1823
%\c!headstyle=,
1824
%\c!marcolor=,
1825
%\c!symcolor=,
1826
%\c!headcolor=,
1827
%\c!beforehead=,
1828
\c!symcolor
=
\itemgroupparameter
\c!color
,
% new per 2012.01.17
1829
\c!symstyle
=
\itemgroupparameter
\c!style
,
% new per 2012.01.17
1830
\c!afterhead
=
\blank
,
1831
\c!before
=
\blank
,
1832
\c!inbetween
=
\blank
,
1833
\c!after
=
\blank
,
1834
%\c!stopper=.,
1835
\c!placestopper
=
\v!yes
,
1836
\c!stopper
=
.
,
1837
%\c!inner=,
1838
\c!n
=
2
,
1839
\c!items
=
4
,
1840
\c!levels
=
1
0
,
1841
\c!lefttext
=(
,
1842
\c!righttext
=)
,
1843
\c!start
=
1
,
1844
\c!packcriterium
=
\zerocount
,
1845
\c!criterium
=
\v!all
,
% permits 0 and negative numbers
1846
%\c!option=,
1847
\c!textdistance
=
\v!space
,
% none big medium small <dimension>
1848
\c!command
=
\strc_itemgroups_default_command
,
1849
\c!indenting
=
\v!next
,
1850
%\c!alignsymbol=v!no,
1851
\c!symbol
=
\currentitemlevel
,
1852
\c!prefix
=
\v!no
,
1853
%\c!prefixstopper=.,
1854
%\c!prefixseparatorset=,
1855
%\c!prefixconversion=,
1856
%\c!prefixconversionset=,
1857
%\c!prefixset=,
1858
%\c!prefixsegments=1:100,
1859
\c!prefixconnector
=
.
,
1860
\c!numberseparatorset
=
,
1861
\c!numberconversionset
=
,
1862
\c!numberstopper
=
.
,
1863
\c!numbersegments
=
1
]
1864 1865
\defineitemgroup
1866
[
\v!itemize
]
1867 1868
%D This is really ugly I should get rid of the global mess, whuch is a side
1869
%D effect of the simple \type {\item} interface that we're stuck with for
1870
%D compatibility reasons. See footnotes for usage. It's probablynot robust
1871
%D for mixed itemgroups so in the end I need to get rid of the globals. One
1872
%D problem is that counters are set.
1873 1874
\defineitemgroup
1875
[
\v!itemize
:
\v!note
]
1876 1877
\def
\strc_itemgroups_push
1878
{
\edef
\strc_itemgroups_pop
1879
{
\xdef\noexpand
\currentitemlevel
{
\currentitemlevel
}
%
1880
\global
\c_strc_itemgroups_nesting
\the
\c_strc_itemgroups_nesting
\relax
1881
\global
\c_strc_itemgroups_column_depth
\the
\c_strc_itemgroups_column_depth
\relax
}
%
1882
\global
\c_strc_itemgroups_column_depth
\zerocount
1883
\global
\c_strc_itemgroups_nesting
\zerocount
1884
\glet
\currentitemlevel
\!!zerocount
1885
\unexpanded
\def
\startitemize
{
\startitemgroup
[
\v!itemize
:
\v!note
]
}
%
1886
\unexpanded
\def
\stopitemize
{
\stopitemgroup
}}
1887 1888
\let
\strc_itemgroups_pop
\relax
1889 1890
\protect
\endinput
1891