symb-ini.mkxl /size: 9841 b    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=symb-ini,
3%D        version=1998.07.20,
4%D          title=\CONTEXT\ Symbol Libraries,
5%D       subtitle=Basic Symbols Commands,
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%D The macros described here used to be part of the \type {core-con} module. I
15%D decided to move them here when symbolsets saw the light. Let their light shine.
16
17\writestatus{loading}{ConTeXt Symbol Libraries / Initialization}
18
19\registerctxluafile{symb-ini}{autosuffix}
20
21\unprotect
22
23%D \macros
24%D   {definesymbol, symbol}
25%D
26%D Converting numbers or levels into a character, romannumeral, symbol or something
27%D else, is supported by many \CONTEXT\ commands. Therefore we need a mechanism for
28%D linking such numbers to their counterparts.
29%D
30%D First we take care of symbols. These are for instance used in enumerations and
31%D itemizations. We have:
32%D
33%D \showsetup{definesymbol}
34%D \showsetup{symbol}
35%D
36%D Symbols are simply linked to a tag. Such tags can be numbers or strings.
37%D
38%D \starttyping
39%D \definesymbol [1]       [$\bullet$]
40%D \definesymbol [level 5] [$\star$]
41%D \stoptyping
42
43\installcorenamespace{symbol}
44\installcorenamespace{symbols}
45\installcorenamespace{symbolset}
46\installcorenamespace{symboldefault}
47
48%D For now we only have one option.
49
50\installparameterhandler\??symbols {symbols}
51\installsetuphandler    \??symbols {symbols}
52
53\appendtoks
54    \ifcstok{\symbolsparameter\c!stylealternative}\v!math
55      \prefermathovertextchar\conditionaltrue
56    \else
57      \prefermathovertextchar\conditionalfalse
58    \fi
59\to \everysetupsymbols
60
61\setupsymbols
62  [\c!stylealternative=\v!text]
63
64\mutable\lettonothing\currentsymbol
65\mutable\lettonothing\currentsymbolset
66
67\newtoks\t_symb_setups
68
69\lettonothing\m_symb_current_set
70
71\newconditional\c_symb_found
72
73\newtoks\everysymbol
74
75%D We don't use the commandhandler as symbols have their own subsystem for resolving
76%D values.
77
78\permanent\tolerant\protected\def\definesymbol[#1]#*[#2]#*[#3]%
79  {\ifparameter#3\or
80     \defcsname\??symbol#1:#2\endcsname{#3}%
81     \ifempty{#1}\else\addvalue{\??symbolset#1}{#2}\fi
82   \else
83     \defcsname\??symbol\m_symb_current_set:#1\endcsname{#2}%
84     \addvalue{\??symbolset\m_symb_current_set}{#1}%
85   \fi}
86
87\permanent\protected\def\doifelseinsymbolset#1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
88\permanent\protected\def\doifinsymbolset    #1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument   \fi}
89\permanent\protected\def\doifelsesymbolset    #1{\ifcsname\??symbolset#1\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
90
91\aliased\let\doifinsymbolsetelse\doifelseinsymbolset
92\aliased\let\doifsymbolsetelse  \doifelsesymbolset
93
94\letvalue\??symbolset\empty
95
96%def\symbolset#1{\csname\??symbolset\ifcsname\??symbolset#1\endcsname#1\fi\endcsname} % no [#1], to be used in commalists etc
97
98\permanent\def\symbolset#1{\begincsname\??symbolset#1\endcsname} % no [#1], to be used in commalists etc
99
100%D Since symbols are used frequently in interactive documents, we speed up this one.
101%D Well, that was history, since now we simplified things a bit, because the low
102%D level macros have been sped up every now and then.
103
104% We support both:
105%
106% Test test \symbol[whatever]\ test \symbol[whatever].
107% Test test \symbol{whatever}  test \symbol{whatever}.
108
109\permanent\tolerant\protected\def\symbol[#1]#*[#2]%
110  {\ifarguments
111     \expandafter\symb_place_argument
112   \or
113     \symb_place_argument{#1}%
114   \or
115     \dontleavehmode
116     \edef\currentsymbol{#2}%
117     \ifcsname\??symbol#1:#2\endcsname
118       \symb_place_indeed{#1:#2}% maybe use \lastnamescs
119     \orelse\ifcsname\??symboldefault#1\endcsname
120       \symb_place_named{#1}% maybe use \lastnamescs
121     \else
122       \symb_place_normal
123     \fi
124   \fi}
125
126\def\symb_place_argument#1%
127  {\dontleavehmode
128   \edef\currentsymbol{#1}%
129   \ifcsname\??symbol\currentsymbolset:#1\endcsname
130     \symb_place_indeed{\currentsymbolset:#1}%
131   \else
132    \symb_place_normal
133   \fi}
134
135\def\symb_place_normal
136  {\c_symb_found\conditionalfalse
137   \expand\t_symb_setups
138   \ifconditional\c_symb_found \else
139     \symb_place_retry\currentsymbol % hm, isn't this redundant?
140   \fi}
141
142\def\symb_place_indeed#1% \relax's prevent lookahead problems
143  {\c_symb_found\conditionaltrue
144   \begingroup
145   \expand\everysymbol
146   \csname\??symbol#1\endcsname\relax
147   \endgroup}
148
149\letcsname\??symbol\endcsname\firstofoneargument
150
151\permanent\def\directsymbol#1#2% no \relax, there can be an argument, see lists
152  {\begincsname\??symbol#1:#2\endcsname}
153
154\protected\def\symb_fetch
155  {\ifconditional\c_symb_found
156     \expandafter\gobbleoneargument
157   \else
158     \expandafter\symb_fetch_indeed
159   \fi}
160
161\def\symb_fetch_indeed#1%
162  {\ifcsname\??symbol#1:\currentsymbol\endcsname
163     \symb_place_indeed{#1:\currentsymbol}%
164   \orelse\ifcsname\??symboldefault#1\endcsname
165     \symb_place_named{#1}%
166   \fi}
167
168\def\symb_place_named#1% \relax's prevent lookahead problems
169  {\begingroup
170   \setbox\scratchbox\hbox\bgroup
171     \expand\everysymbol
172     \getglyphstyled
173       {\csname\??symboldefault#1\endcsname}%
174       {\tochar{n:\currentsymbol}}%
175     \relax
176   \egroup
177   \ifdim\wd\scratchbox>\zeropoint
178     \unhbox\scratchbox
179     \endgroup
180     \xdefcsname\??symbol#1:\currentsymbol\endcsname{\symb_place_named_indeed{#1}{\currentsymbol}}%
181     \c_symb_found\conditionaltrue
182   \else
183     \endgroup
184   \fi}
185
186\protected\def\symb_place_named_indeed#1#2% \relax's prevent lookahead problems
187  {\c_symb_found\conditionaltrue
188   \begingroup
189   \expand\everysymbol
190   \getglyphstyled
191     {\csname\??symboldefault#1\endcsname}%
192     {\tochar{n:#2}}%
193   \relax
194   \endgroup}
195
196\def\symb_place_retry#1%
197  {\ifcsname\??symbol:#1\endcsname
198     \symb_place_indeed{:#1}%
199   \else
200     #1%
201   \fi}
202
203%D \macros
204%D   {definefiguresymbol}
205%D
206%D To simplify defining figure symbols, we offer:
207%D
208%D \showsetup{definefiguresymbol}
209%D
210%D By default, such symbols scale along the current bodyfont size or running font
211%D size (which is better).
212
213\ifdefined\externalfigure \else \def\externalfigure[#1][#2]{#1} \fi
214
215\mutable\def\defaultsymbolfactor{10}
216\mutable\def\defaultsymbolheight{1.25ex}
217
218\permanent\tolerant\protected\def\figuresymbol[#1]#,[#S#2]%
219  {\externalfigure[#1][\c!reset=\v!yes,\c!symbol=\v!yes,\c!height=\defaultsymbolheight,#2]}
220
221\permanent\tolerant\protected\def\definefiguresymbol[#1]#*[#2]#*[#S#3]%
222  {\ifarguments\or\else
223     \definesymbol[#1][{\figuresymbol[#2][#3]}]%
224   \fi}
225
226%D \macros
227%D   {doifsymboldefinedelse}
228%D
229%D A handy private one:
230
231\def\symb_fetch_first
232  {\ifconditional\c_symb_found
233     \expandafter\gobbleoneargument
234   \else
235     \expandafter\symb_fetch_first_indeed
236   \fi}
237
238\def\symb_fetch_first_indeed#1%
239  {\doifinsymbolset{#1}\currentsymbol{\c_symb_found\conditionaltrue}}
240
241\def\symb_fetch_second#1%
242  {\doifinsymbolset\empty\currentsymbol{\c_symb_found\conditionaltrue}}
243
244\permanent\protected\def\doifelsesymboldefined#1%
245  {\begingroup
246   \edef\currentsymbol{#1}%
247   \let\symb_fetch\symb_fetch_first
248   \c_symb_found\conditionalfalse
249   \expand\t_symb_setups
250   \ifconditional\c_symb_found
251     \endgroup\expandafter\firstoftwoarguments
252   \else
253     \symb_fetch_second\currentsymbol
254     \ifconditional\c_symb_found
255       \endgroup\doubleexpandafter\firstoftwoarguments
256     \else
257       \endgroup\doubleexpandafter\secondoftwoarguments
258     \fi
259   \fi}
260
261\aliased\let\doifsymboldefinedelse\doifelsesymboldefined
262
263%D \macros
264%D   {setupsymbolset,startsymbolset}
265%D
266%D From these macro definitions one can deduce that symbols can be grouped in
267%D symbol sets:
268%D
269%D \starttyping
270%D \startsymbolset [navigation 1]
271%D   \definefiguresymbol [Next] [mp-symb.1]
272%D   \definefiguresymbol [Prev] [mp-symb.2]
273%D \stopsymbolset
274%D \stoptyping
275%D
276%D Such a symbol can be typeset with:
277%D
278%D \starttyping
279%D \setupsymbolset[navigation 1]\symbol[Next]
280%D \stoptyping
281%D
282%D or simply:
283%D
284%D \starttyping
285%D \symbol[navigation 1][Next]
286%D \stoptyping
287%D
288%D Formally:
289%D
290%D \showsetup{setupsymbolset}
291%D \showsetup{startsymbolset}
292
293\installcorenamespace{symbolsets}
294
295\permanent\tolerant\protected\def\startsymbolset[#1]#*[#S#2]%
296  {\pushmacro\m_symb_current_set
297   \def\m_symb_current_set{#1}%
298   \ifarguments\or\or
299     \getdummyparameters[\s!font=,#2]%
300     \edef\p_font{\dummyparameter\s!font}%
301     \ifempty\p_font\else
302       \letcsname\??symboldefault#1\endcsname\p_font
303     \fi
304   \fi}
305
306\permanent\protected\def\stopsymbolset
307  {\popmacro\m_symb_current_set}
308
309\permanent\protected\def\setupsymbolset[#1]% should have been \setsymbolset
310  {\cdef\currentsymbolset{#1}%
311   \ifcsname\??symbolsets\currentsymbolset\endcsname \else
312     \symb_setup_symbol_set
313   \fi}
314
315\def\symb_setup_symbol_set
316  {\normalexpanded{\t_symb_setups{\symb_fetch{\currentsymbolset}\expand\t_symb_setups}}%
317   \letcsname\??symbolsets\currentsymbolset\endcsname\empty} % speedup
318
319\permanent\protected\def\resetsymbolset
320  {\t_symb_setups\emptytoks}
321
322\permanent\protected\def\forcesymbolset[#1]% still needed? why not just usesymbolset
323  {\normalexpanded{\t_symb_setups{\symb_fetch{#1}}}}
324
325%D \macros
326%D   {showsymbolset}
327%D
328%D \showsetup{showsymbolset}
329
330\fetchmodulecommand \showsymbolset \f!symb_run
331
332%D \macros
333%D   {usesymbols}
334%D
335%D \showsetup{usesymbols}
336
337\permanent\protected\def\usesymbols[#1]{\clf_usesymbols{#1}}
338
339%D As longs as symbols are linked to levels or numbers, we can also use the
340%D conversion mechanism, but in for instance the itemization macros, we prefer
341%D symbols because they can more easier be (partially) redefined.
342
343\protect \endinput
344