typo-itm.mkxl /size: 8675 b    last modification: 2023-12-21 09:44
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\newinteger  \c_typo_items_n
64\newinteger  \c_typo_items_m
65\newdimension\d_typo_items_text_width
66\newdimension\d_typo_items_symbol_width
67\newdimension\d_typo_items_distance
68\newbox      \b_typo_items_symbols
69\newbox      \b_typo_items_texts
70
71\permanent\tolerant\protected\def\items[#S#1]#:#2%
72  {\bgroup
73   \setupitems[#1]%
74   \edef\p_typo_items_alternative{\itemsparameter\c!alternative}%
75   \ifcsname\??itemsalternatives\p_typo_items_alternative\endcsname \else
76     \let\p_typo_items_alternative\v!left
77   \fi
78   \let\currentitems\p_typo_items_alternative
79   \setupcurrentitems[#1]%
80   %
81   \edef\p_typo_items_textwidth{\itemsparameter\c!textwidth}%
82   \ifempty\p_typo_items_textwidth
83     \d_typo_items_text_width\availablehsize
84   \else
85     \d_typo_items_text_width\p_typo_items_textwidth\relax
86   \fi
87   %
88   \edef\p_typo_items_width{\itemsparameter\c!width}%
89   \ifempty\p_typo_items_width
90     \d_typo_items_symbol_width1.5\emwidth
91   \else
92     \d_typo_items_symbol_width\p_typo_items_width\relax
93   \fi
94   %
95   \edef\p_typo_items_distance{\itemsparameter\c!distance}%
96   \ifempty\p_typo_items_distance
97     \d_typo_items_distance\zeropoint
98   \else
99     \d_typo_items_distance\p_typo_items_distance\relax
100   \fi
101   %
102   \edef\p_typo_items_symbol{\itemsparameter\c!symbol}%
103   \ifempty\p_typo_items_symbol
104     \let\m_typo_items_symbol\firstofoneargument
105   \orelse\ifx\p_typo_items_symbol\v!none
106     \lettonothing\p_typo_items_symbol
107     \let\m_typo_items_symbol\firstofoneargument
108   \else
109     \doifelseconversiondefined\p_typo_items_symbol
110       {\def\m_typo_items_symbol{\convertnumber\p_typo_items_symbol}}
111       {\doifelsesymboldefined\p_typo_items_symbol
112          {\def\m_typo_items_symbol{\symbol[\p_typo_items_symbol]\gobbleoneargument}}
113          {\let\m_typo_items_symbol\firstofoneargument}}%
114   \fi
115   %
116   \edef\p_typo_items_align{\itemsparameter\c!align}%
117   \edef\p_typo_items_textalign{\itemsparameter\c!textalign}%
118   %
119   \edef\p_typo_items_n{\itemsparameter\c!n}%
120   \ifempty\p_typo_items_n
121     \getcommalistsize[#2]%
122     \c_typo_items_n\commalistsize\relax % \commalistcounter
123   \else
124     \c_typo_items_n\p_typo_items_n\relax
125   \fi
126   %
127   \parindent\zeropoint
128   \dontcomplain
129   %
130   \itemsparameter\c!before
131   \csname\??itemsalternatives\p_typo_items_alternative\endcsname{#2}%
132   \itemsparameter\c!after
133   \egroup}
134
135% rendering
136
137\let\typo_items_item\relax
138\let\typo_items_make\relax
139
140\def\typo_items_item_horizontal
141  {\advanceby\c_typo_items_m\plusone
142   \csname\??itemshorizontal
143     \ifcsname\??itemshorizontal\p_typo_items_align\endcsname
144       \p_typo_items_align
145     \else
146       \s!unknown
147     \fi
148   \endcsname}
149
150\def\typo_items_item_vertical
151  {\advanceby\c_typo_items_m\plusone
152   \csname\??itemsvertical
153     \ifcsname\??itemsvertical\p_typo_items_align\endcsname
154       \p_typo_items_align
155     \else
156       \s!unknown
157     \fi
158   \endcsname}
159
160\defcsname\??itemshorizontal\v!margin\endcsname#1%
161  {\ifnum\c_typo_items_m=\plusone\hss\else\hfill\fi
162   \strut#1%
163   \ifnum\c_typo_items_m=\c_typo_items_n\hss\else\hfill\fi}
164
165\defcsname\??itemshorizontal\s!unknown\endcsname
166  {\simplealignedbox\scratchwidth\m_typo_items_align}
167
168\defcsname\??itemsvertical\s!unknown\endcsname
169  {\simplealignedbox\scratchwidth\m_typo_items_align}
170
171\def\typo_items_make_horizontal#1%
172  {\divideby\scratchwidth\c_typo_items_n
173   \hbox{#1}}
174
175\def\typo_items_make_vertical#1%
176  {\vbox{#1}}
177
178\def\typo_items_construct_items_boxes#1%
179  {\setbox\b_typo_items_texts\hbox
180     {\c_typo_items_m\zerocount
181      \let\m_typo_items_align\p_typo_items_textalign
182      \scratchwidth\d_typo_items_text_width
183      \useitemsstyleandcolor\c!textstyle\c!textcolor
184      \typo_items_make{\processcommalist[#1]\typo_items_item}}%
185   \setbox\b_typo_items_symbols
186     \ifempty\p_typo_items_symbol
187       \emptyhbox
188     \else
189       \hbox
190         {\c_typo_items_m\zerocount
191          \let\m_typo_items_align\p_typo_items_align
192          \scratchwidth\d_typo_items_symbol_width
193          \useitemsstyleandcolor\c!style\c!color
194          \typo_items_make{\dorecurse\c_typo_items_n{\typo_items_item{\strut\m_typo_items_symbol{##1}}}}}%
195   \fi}
196
197% alternatives:
198
199\defineitems[\v!top][\c!width=\d_typo_items_text_width,\c!textalign=\itemsparameter\c!align]
200
201\defcsname\??itemsalternatives\v!top\endcsname#1%
202  {\let\typo_items_make\typo_items_make_horizontal
203   \let\typo_items_item\typo_items_item_horizontal
204   \typo_items_construct_items_boxes{#1}%
205   \noindent\vbox\bgroup
206     \forgetall
207     \ifvoid\b_typo_items_symbols \else
208       \box\b_typo_items_symbols
209       \itemsparameter\c!inbetween
210       \nointerlineskip
211     \fi
212     \box\b_typo_items_texts\
213   \egroup}
214
215\defineitems[\v!bottom][\c!width=\d_typo_items_text_width,\c!textalign=\itemsparameter\c!align]
216
217\defcsname\??itemsalternatives\v!bottom\endcsname#1%
218  {\let\typo_items_make\typo_items_make_horizontal
219   \let\typo_items_item\typo_items_item_horizontal
220   \typo_items_construct_items_boxes{#1}%
221   \noindent\vbox\bgroup
222     \forgetall
223     \box\b_typo_items_texts
224     \ifvoid\b_typo_items_symbols \else
225       \itemsparameter\c!inbetween
226       \nointerlineskip
227       \box\b_typo_items_symbols
228     \fi
229   \egroup}
230
231\defineitems[\v!inmargin][\c!width=1.5\emwidth,\c!align=\v!flushright,\c!distance=\leftmargindistance]
232
233\defcsname\??itemsalternatives\v!inmargin\endcsname#1%
234  {\let\typo_items_make\typo_items_make_vertical
235   \let\typo_items_item\typo_items_item_vertical
236   \typo_items_construct_items_boxes{#1}%
237   \noindent\hbox\bgroup
238     \ifvoid\b_typo_items_symbols \else
239       \llap{\box\b_typo_items_symbols\kern\d_typo_items_distance}%
240     \fi
241     \box\b_typo_items_texts
242   \egroup}
243
244\defineitems[\v!left][\c!width=1.5\emwidth,\c!align=\v!flushleft]
245
246\defcsname\??itemsalternatives\v!left\endcsname#1%
247  {\let\typo_items_make\typo_items_make_vertical
248   \let\typo_items_item\typo_items_item_vertical
249   \advanceby\d_typo_items_text_width-\dimexpr\d_typo_items_symbol_width+\d_typo_items_distance\relax
250   \typo_items_construct_items_boxes{#1}%
251   \noindent\hbox\bgroup
252     \ifvoid\b_typo_items_symbols \else
253       \box\b_typo_items_symbols
254       \kern\d_typo_items_distance
255     \fi
256     \box\b_typo_items_texts
257   \egroup}
258
259\defineitems[\v!right][\c!width=1.5\emwidth,\c!align=\v!flushright]
260
261\defcsname\??itemsalternatives\v!right\endcsname#1%
262  {\let\typo_items_make\typo_items_make_vertical
263   \let\typo_items_item\typo_items_item_vertical
264   \advanceby\d_typo_items_text_width-\dimexpr\d_typo_items_symbol_width+\d_typo_items_distance\relax
265   \typo_items_construct_items_boxes{#1}%
266   \noindent\hbox\bgroup
267     \box\b_typo_items_texts
268     \ifvoid\b_typo_items_symbols \else
269       \kern\d_typo_items_distance
270       \box\b_typo_items_symbols
271     \fi
272   \egroup}
273
274\protect \endinput
275