symb-ini.mkxl /size: 10 Kb    last modification: 2025-02-21 11:03
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\tolerant\protected\def\definesymbol[#1]#*[#2]#*[#3]%
88  {\ifparameter#3\or
89     \defcsname\??symbol#1:#2\endcsname{#3}%
90     \ifempty{#1}\else\symb_register{#1}{#2}\fi
91   \else
92     \defcsname\??symbol\m_symb_current_set:#1\endcsname{#2}%
93     \symb_register{\m_symb_current_set}{#1}%
94   \fi}
95
96\permanent\tolerant\protected\def\symb_register#1#2%
97  {\ifcsname\??symbolset#1\endcsname
98     \normalexpanded{\addtocommalist{#2}\expandafter\noexpand\lastnamedcs}%
99   \else
100     \edefcsname\??symbolset#1\endcsname{#2}%
101   \fi}
102
103\permanent\protected\def\doifelseinsymbolset#1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
104\permanent\protected\def\doifinsymbolset    #1#2{\ifcsname\??symbol#1:#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument   \fi}
105\permanent\protected\def\doifelsesymbolset    #1{\ifcsname\??symbolset#1\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
106
107\aliased\let\doifinsymbolsetelse\doifelseinsymbolset
108\aliased\let\doifsymbolsetelse  \doifelsesymbolset
109
110\letvalue\??symbolset\empty
111
112%def\symbolset#1{\csname\??symbolset\ifcsname\??symbolset#1\endcsname#1\fi\endcsname} % no [#1], to be used in commalists etc
113
114\permanent\def\symbolset#1{\begincsname\??symbolset#1\endcsname} % no [#1], to be used in commalists etc
115
116%D Since symbols are used frequently in interactive documents, we speed up this one.
117%D Well, that was history, since now we simplified things a bit, because the low
118%D level macros have been sped up every now and then.
119
120% We support both:
121%
122% Test test \symbol[whatever]\ test \symbol[whatever].
123% Test test \symbol{whatever}  test \symbol{whatever}.
124
125\permanent\tolerant\protected\def\symbol[#1]#*[#2]%
126  {\ifarguments
127     \expandafter\symb_place_argument
128   \or
129     \symb_place_argument{#1}%
130   \or
131     \dontleavehmode
132     \edef\currentsymbol{#2}%
133     \ifcsname\??symbol#1:#2\endcsname
134       \symb_place_indeed{#1:#2}% maybe use \lastnamescs
135     \orelse\ifcsname\??symboldefault#1\endcsname
136       \symb_place_named{#1}% maybe use \lastnamescs
137     \else
138       \symb_place_normal
139     \fi
140   \fi}
141
142\def\symb_place_argument#1%
143  {\dontleavehmode
144   \edef\currentsymbol{#1}%
145   \ifcsname\??symbol\currentsymbolset:#1\endcsname
146     \symb_place_indeed{\currentsymbolset:#1}%
147   \else
148    \symb_place_normal
149   \fi}
150
151\def\symb_place_normal
152  {\c_symb_found\conditionalfalse
153   \expand\t_symb_setups
154   \ifconditional\c_symb_found \else
155     \symb_place_retry\currentsymbol % hm, isn't this redundant?
156   \fi}
157
158\def\symb_place_indeed#1% \relax's prevent lookahead problems
159  {\c_symb_found\conditionaltrue
160   \begingroup
161   \expand\everysymbol
162   \csname\??symbol#1\endcsname\relax
163   \endgroup}
164
165\letcsname\??symbol\endcsname\firstofoneargument
166
167\permanent\def\directsymbol#1#2% no \relax, there can be an argument, see lists
168  {\begincsname\??symbol#1:#2\endcsname}
169
170\protected\def\symb_fetch
171  {\ifconditional\c_symb_found
172     \expandafter\gobbleoneargument
173   \else
174     \expandafter\symb_fetch_indeed
175   \fi}
176
177\def\symb_fetch_indeed#1%
178  {\ifcsname\??symbol#1:\currentsymbol\endcsname
179     \symb_place_indeed{#1:\currentsymbol}%
180   \orelse\ifcsname\??symboldefault#1\endcsname
181     \symb_place_named{#1}%
182   \fi}
183
184\def\symb_place_named#1% \relax's prevent lookahead problems
185  {\begingroup
186   \setbox\scratchbox\hbox\bgroup
187     \expand\everysymbol
188     \getglyphstyled
189       {\csname\??symboldefault#1\endcsname}%
190       {\tochar{n:\currentsymbol}}%
191     \relax
192   \egroup
193   \ifdim\wd\scratchbox>\zeropoint
194     \unhbox\scratchbox
195     \endgroup
196     \xdefcsname\??symbol#1:\currentsymbol\endcsname{\symb_place_named_indeed{#1}{\currentsymbol}}%
197     \c_symb_found\conditionaltrue
198   \else
199     \endgroup
200   \fi}
201
202\protected\def\symb_place_named_indeed#1#2% \relax's prevent lookahead problems
203  {\c_symb_found\conditionaltrue
204   \begingroup
205   \expand\everysymbol
206   \getglyphstyled
207     {\csname\??symboldefault#1\endcsname}%
208     {\tochar{n:#2}}%
209   \relax
210   \endgroup}
211
212\def\symb_place_retry#1%
213  {\ifcsname\??symbol:#1\endcsname
214     \symb_place_indeed{:#1}%
215   \else
216     #1%
217   \fi}
218
219%D \macros
220%D   {definefiguresymbol}
221%D
222%D To simplify defining figure symbols, we offer:
223%D
224%D \showsetup{definefiguresymbol}
225%D
226%D By default, such symbols scale along the current bodyfont size or running font
227%D size (which is better).
228
229\ifdefined\externalfigure \else \def\externalfigure[#1][#2]{#1} \fi
230
231\mutable\def\defaultsymbolfactor{10}
232\mutable\def\defaultsymbolheight{1.25ex}
233
234\permanent\tolerant\protected\def\figuresymbol[#1]#,[#S#2]%
235  {\externalfigure[#1][\c!reset=\v!yes,\c!symbol=\v!yes,\c!height=\defaultsymbolheight,#2]}
236
237\permanent\tolerant\protected\def\definefiguresymbol[#1]#*[#2]#*[#S#3]%
238  {\ifarguments\or\else
239     \definesymbol[#1][{\figuresymbol[#2][#3]}]%
240   \fi}
241
242%D \macros
243%D   {doifsymboldefinedelse}
244%D
245%D A handy private one:
246
247\def\symb_fetch_first
248  {\ifconditional\c_symb_found
249     \expandafter\gobbleoneargument
250   \else
251     \expandafter\symb_fetch_first_indeed
252   \fi}
253
254\def\symb_fetch_first_indeed#1%
255  {\doifinsymbolset{#1}\currentsymbol{\c_symb_found\conditionaltrue}}
256
257\def\symb_fetch_second#1%
258  {\doifinsymbolset\empty\currentsymbol{\c_symb_found\conditionaltrue}}
259
260\permanent\protected\def\doifelsesymboldefined#1%
261  {\begingroup
262   \edef\currentsymbol{#1}%
263   \let\symb_fetch\symb_fetch_first
264   \c_symb_found\conditionalfalse
265   \expand\t_symb_setups
266   \ifconditional\c_symb_found
267     \endgroup\expandafter\firstoftwoarguments
268   \else
269     \symb_fetch_second\currentsymbol
270     \ifconditional\c_symb_found
271       \endgroup\doubleexpandafter\firstoftwoarguments
272     \else
273       \endgroup\doubleexpandafter\secondoftwoarguments
274     \fi
275   \fi}
276
277\aliased\let\doifsymboldefinedelse\doifelsesymboldefined
278
279%D \macros
280%D   {setupsymbolset,startsymbolset}
281%D
282%D From these macro definitions one can deduce that symbols can be grouped in
283%D symbol sets:
284%D
285%D \starttyping
286%D \startsymbolset [navigation 1]
287%D   \definefiguresymbol [Next] [mp-symb.1]
288%D   \definefiguresymbol [Prev] [mp-symb.2]
289%D \stopsymbolset
290%D \stoptyping
291%D
292%D Such a symbol can be typeset with:
293%D
294%D \starttyping
295%D \setupsymbolset[navigation 1]\symbol[Next]
296%D \stoptyping
297%D
298%D or simply:
299%D
300%D \starttyping
301%D \symbol[navigation 1][Next]
302%D \stoptyping
303%D
304%D Formally:
305%D
306%D \showsetup{setupsymbolset}
307%D \showsetup{startsymbolset}
308
309\installcorenamespace{symbolsets}
310
311\permanent\tolerant\protected\def\startsymbolset[#1]#*[#S#2]%
312  {\pushmacro\m_symb_current_set
313   \def\m_symb_current_set{#1}%
314   \ifarguments\or\or
315     \getdummyparameters[\s!font=,#2]%
316     \edef\p_font{\dummyparameter\s!font}%
317     \ifempty\p_font\else
318       \letcsname\??symboldefault#1\endcsname\p_font
319     \fi
320   \fi}
321
322\permanent\protected\def\stopsymbolset
323  {\popmacro\m_symb_current_set}
324
325\permanent\protected\def\setupsymbolset[#1]% should have been \setsymbolset
326  {\cdef\currentsymbolset{#1}%
327   \ifcsname\??symbolsets\currentsymbolset\endcsname \else
328     \symb_setup_symbol_set
329   \fi}
330
331\def\symb_setup_symbol_set
332  {\normalexpanded{\t_symb_setups{\symb_fetch{\currentsymbolset}\expand\t_symb_setups}}%
333   \letcsname\??symbolsets\currentsymbolset\endcsname\empty} % speedup
334
335\permanent\protected\def\resetsymbolset
336  {\t_symb_setups\emptytoks}
337
338\permanent\protected\def\forcesymbolset[#1]% still needed? why not just usesymbolset
339  {\normalexpanded{\t_symb_setups{\symb_fetch{#1}}}}
340
341%D \macros
342%D   {showsymbolset}
343%D
344%D \showsetup{showsymbolset}
345
346\fetchmodulecommand \showsymbolset \f!symb_run
347
348%D \macros
349%D   {usesymbols}
350%D
351%D \showsetup{usesymbols}
352
353\permanent\protected\def\usesymbols[#1]{\clf_usesymbols{#1}}
354
355%D As longs as symbols are linked to levels or numbers, we can also use the
356%D conversion mechanism, but in for instance the itemization macros, we prefer
357%D symbols because they can more easier be (partially) redefined.
358
359\protect \endinput
360