typo-itm.mkxl /size: 8845 b    last modification: 2025-02-21 11:03
1%D \module
2%D   [       file=typo-itm, % comes from core-mis
3%D        version=2012.06.28,
4%D          title=\CONTEXT\ Typesetting Macros,
5%D       subtitle=Item Lists,
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 Node Macros / Item Lists}
15
16\unprotect
17
18%D This is a real old mechanism that we once used for questionaries. As it is documented
19%D we keep it around. A more modern implementation would probably use another approach
20%D but I don't want to spend too much time on it now. There are a couple of changes:
21%D
22%D \startitemize
23%D \startitem textwidth sets the combined width \stopitem
24%D \startitem width sets the symbolwidth \stopitem
25%D \startitem alternative is used instead of location \stopitem
26%D \stopitemize
27%D
28%D \startbuffer
29%D \items[alternative=left]{a,b,c}
30%D \items[alternative=left,align=middle,textalign=flushright,distance=1em]{a,b,c}
31%D \items[alternative=right]{a,b,c}
32%D \items[alternative=inmargin]{a,b,c}
33%D \items[alternative=top]{a,b,c}
34%D \items[alternative=bottom]{a,b,c}
35%D \items[alternative=bottom,align=flushleft,textstyle=bold,color=red,textcolor=green]{a,b,c}
36%D \stopbuffer
37%D
38%D \typebuffer
39%D
40%D This renders as:
41%D
42%D \getbuffer
43
44\installcorenamespace{items}
45\installcorenamespace{itemsalternatives}
46\installcorenamespace{itemshorizontal}
47\installcorenamespace{itemsvertical}
48
49\installcommandhandler \??items {items} \??items
50
51\setupitems
52  [\c!alternative=\v!left,
53   \c!symbol=5,
54   \c!textwidth=\availablehsize,
55   \c!align=\v!middle,
56   \c!textalign=\v!flushleft,
57   \c!distance=\zeropoint,
58  %\c!n=,
59   \c!before=\blank,
60   \c!inbetween={\blank[\v!medium]},
61   \c!after=\blank]
62
63% todo: define
64
65\newinteger  \c_typo_items_n
66\newinteger  \c_typo_items_m
67\newdimension\d_typo_items_text_width
68\newdimension\d_typo_items_symbol_width
69\newdimension\d_typo_items_distance
70\newbox      \b_typo_items_symbols
71\newbox      \b_typo_items_texts
72
73\permanent\tolerant\protected\def\items[#S#1]#:#2%
74  {\bgroup
75   \setupitems[#1]%
76   \edef\p_typo_items_alternative{\itemsparameter\c!alternative}%
77   \ifcsname\??itemsalternatives\p_typo_items_alternative\endcsname \else
78     \let\p_typo_items_alternative\v!left
79   \fi
80   \let\currentitems\p_typo_items_alternative
81   \setupcurrentitems[#1]%
82   %
83   \d_typo_items_text_width  \ifchkdimexpr\itemsparameter\c!textwidth\or\lastchkdimension\else\availablehsize\fi
84   \d_typo_items_symbol_width\ifchkdimexpr\itemsparameter\c!width    \or\lastchkdimension\else1.5\emwidth    \fi
85   \d_typo_items_distance    \ifchkdimexpr\itemsparameter\c!distance \or\lastchkdimension\else\zeropoint     \fi
86   %
87   \edef\p_typo_items_symbol{\itemsparameter\c!symbol}%
88   \ifempty\p_typo_items_symbol
89     \let\m_typo_items_symbol\firstofoneargument
90   \orelse\ifx\p_typo_items_symbol\v!none
91     \lettonothing\p_typo_items_symbol
92     \let\m_typo_items_symbol\firstofoneargument
93   \else
94     \doifelseconversiondefined\p_typo_items_symbol
95       {\def\m_typo_items_symbol{\convertnumber\p_typo_items_symbol}}
96       {\doifelsesymboldefined\p_typo_items_symbol
97          {\def\m_typo_items_symbol{\symbol[\p_typo_items_symbol]\gobbleoneargument}}
98          {\let\m_typo_items_symbol\firstofoneargument}}%
99   \fi
100   %
101   \edef\p_typo_items_align{\itemsparameter\c!align}%
102   \edef\p_typo_items_textalign{\itemsparameter\c!textalign}%
103   %
104   \edef\p_typo_items_n{\itemsparameter\c!n}%
105   \ifempty\p_typo_items_n
106     \getcommalistsize[#2]%
107     \c_typo_items_n\commalistsize\relax % \commalistcounter
108   \else
109     \c_typo_items_n\p_typo_items_n\relax
110   \fi
111   %
112   \parindent\zeropoint
113   \dontcomplain
114   %
115   \itemsparameter\c!before
116   \dostarttagged\t!items\currentitems % currently alternative
117   \csname\??itemsalternatives\p_typo_items_alternative\endcsname{#2}%
118   \dostoptagged
119   \itemsparameter\c!after
120   \egroup}
121
122% rendering
123
124\let\typo_items_item\relax
125\let\typo_items_make\relax
126
127\def\typo_items_item_horizontal
128  {\advanceby\c_typo_items_m\plusone
129   \csname\??itemshorizontal
130     \ifcsname\??itemshorizontal\p_typo_items_align\endcsname
131       \p_typo_items_align
132     \else
133       \s!unknown
134     \fi
135   \endcsname}
136
137\def\typo_items_item_vertical
138  {\advanceby\c_typo_items_m\plusone
139   \csname\??itemsvertical
140     \ifcsname\??itemsvertical\p_typo_items_align\endcsname
141       \p_typo_items_align
142     \else
143       \s!unknown
144     \fi
145   \endcsname}
146
147\defcsname\??itemshorizontal\v!margin\endcsname#1%
148  {\ifnum\c_typo_items_m=\plusone\hss\else\hfill\fi
149   \strut#1%
150   \ifnum\c_typo_items_m=\c_typo_items_n\hss\else\hfill\fi}
151
152\defcsname\??itemshorizontal\s!unknown\endcsname
153  {\simplealignedbox\scratchwidth\m_typo_items_align}
154
155\defcsname\??itemsvertical\s!unknown\endcsname
156  {\simplealignedbox\scratchwidth\m_typo_items_align}
157
158\def\typo_items_make_horizontal#1%
159  {\divideby\scratchwidth\c_typo_items_n
160   \hbox{#1}}
161
162\def\typo_items_make_vertical#1%
163  {\vbox{#1}}
164
165\def\typo_items_item_text#1%
166  {\dostarttaggednodetail\t!itemtext
167   \typo_items_item{#1}%
168   \dostoptagged}
169
170\def\typo_items_item_symbol#1%
171  {\dostarttaggednodetail\t!itemsymbol
172   \typo_items_item{\strut\m_typo_items_symbol{#1}}%
173   \dostoptagged}
174
175\def\typo_items_construct_items_boxes#1%
176  {\dostarttaggednodetail\t!itemtexts
177   \setbox\b_typo_items_texts\hbox\bgroup
178     \c_typo_items_m\zerocount
179     \let\m_typo_items_align\p_typo_items_textalign
180     \scratchwidth\d_typo_items_text_width
181     \useitemsstyleandcolor\c!textstyle\c!textcolor
182     \typo_items_make{\processcommalist[#1]\typo_items_item_text}%
183   \egroup
184   \dostoptagged
185   \dostarttaggednodetail\t!itemsymbols
186   \setbox\b_typo_items_symbols
187     \ifempty\p_typo_items_symbol
188       \emptyhbox
189     \else
190       \hbox\bgroup
191         \c_typo_items_m\zerocount
192         \let\m_typo_items_align\p_typo_items_align
193         \scratchwidth\d_typo_items_symbol_width
194         \useitemsstyleandcolor\c!style\c!color
195         \typo_items_make{\dorecurse\c_typo_items_n{\typo_items_item_symbol{##1}}}%
196       \egroup
197     \fi
198   \dostoptagged}
199
200% alternatives:
201
202\defineitems[\v!top][\c!width=\d_typo_items_text_width,\c!textalign=\itemsparameter\c!align]
203
204\defcsname\??itemsalternatives\v!top\endcsname#1%
205  {\let\typo_items_make\typo_items_make_horizontal
206   \let\typo_items_item\typo_items_item_horizontal
207   \typo_items_construct_items_boxes{#1}%
208   \noindent\vbox\bgroup
209     \forgetall
210     \ifvoid\b_typo_items_symbols \else
211       \box\b_typo_items_symbols
212       \itemsparameter\c!inbetween
213       \nointerlineskip
214     \fi
215     \box\b_typo_items_texts\
216   \egroup}
217
218\defineitems[\v!bottom][\c!width=\d_typo_items_text_width,\c!textalign=\itemsparameter\c!align]
219
220\defcsname\??itemsalternatives\v!bottom\endcsname#1%
221  {\let\typo_items_make\typo_items_make_horizontal
222   \let\typo_items_item\typo_items_item_horizontal
223   \typo_items_construct_items_boxes{#1}%
224   \noindent\vbox\bgroup
225     \forgetall
226     \box\b_typo_items_texts
227     \ifvoid\b_typo_items_symbols \else
228       \itemsparameter\c!inbetween
229       \nointerlineskip
230       \box\b_typo_items_symbols
231     \fi
232   \egroup}
233
234\defineitems[\v!inmargin][\c!width=1.5\emwidth,\c!align=\v!flushright,\c!distance=\leftmargindistance]
235
236\defcsname\??itemsalternatives\v!inmargin\endcsname#1%
237  {\let\typo_items_make\typo_items_make_vertical
238   \let\typo_items_item\typo_items_item_vertical
239   \typo_items_construct_items_boxes{#1}%
240   \noindent\hbox\bgroup
241     \ifvoid\b_typo_items_symbols \else
242       \llap{\box\b_typo_items_symbols\kern\d_typo_items_distance}%
243     \fi
244     \box\b_typo_items_texts
245   \egroup}
246
247\defineitems[\v!left][\c!width=1.5\emwidth,\c!align=\v!flushleft]
248
249\defcsname\??itemsalternatives\v!left\endcsname#1%
250  {\let\typo_items_make\typo_items_make_vertical
251   \let\typo_items_item\typo_items_item_vertical
252   \advanceby\d_typo_items_text_width{-\d_typo_items_symbol_width-\d_typo_items_distance}%
253   \typo_items_construct_items_boxes{#1}%
254   \noindent\hbox\bgroup
255     \ifvoid\b_typo_items_symbols \else
256       \box\b_typo_items_symbols
257       \kern\d_typo_items_distance
258     \fi
259     \box\b_typo_items_texts
260   \egroup}
261
262\defineitems[\v!right][\c!width=1.5\emwidth,\c!align=\v!flushright]
263
264\defcsname\??itemsalternatives\v!right\endcsname#1%
265  {\let\typo_items_make\typo_items_make_vertical
266   \let\typo_items_item\typo_items_item_vertical
267   \advanceby\d_typo_items_text_width-\dimexpr\d_typo_items_symbol_width+\d_typo_items_distance\relax
268   \typo_items_construct_items_boxes{#1}%
269   \noindent\hbox\bgroup
270     \box\b_typo_items_texts
271     \ifvoid\b_typo_items_symbols \else
272       \kern\d_typo_items_distance
273       \box\b_typo_items_symbols
274     \fi
275   \egroup}
276
277\protect \endinput
278