core-env.mkxl /size: 31 Kb    last modification: 2025-02-21 11:03
1%D \module
2%D   [       file=core-env, % was core-new
3%D        version=1995.01.01, % wrong
4%D          title=\CONTEXT\ Core Macros,
5%D       subtitle=New ones,
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 Core Macros / Environments}
15
16\installcorenamespace{setup} % is referenced in the lmt file:
17
18\registerctxluafile{core-env}{autosuffix}
19
20\unprotect
21
22%D Modes:
23%D
24%D \starttyping
25%D \enablemode[screen,paper,bound]
26%D
27%D \doifmodeelse {paper}        {this} {that}
28%D \doifmode     {paper,screen} {this}
29%D \doifnotmode  {paper,bound}  {that}
30%D
31%D \startmode [list]
32%D \stopmode
33%D
34%D \startnotmode [list]
35%D \stopnotmode
36%D \stoptyping
37%D
38%D system modes have a * as prefix
39%D
40%D Sometimes, we want to prevent a mode for being set. Think of situations where a
41%D style enables a mode, but an outer level style does not want that. Preventing can
42%D be considered a permanent disabling on forehand.
43
44\aliased\let\systemmodeprefix\wildcardsymbol
45
46% we will have \installcorenamespace{mode} but need some hackery at the lua end then
47
48% TODO: make them mutable, also at the lua end
49
50\installcorenamespace{modestack}
51
52\immutable\def\??mode{mode>} % special namespace, also used at lua end
53
54\permanent\protected\def\newmode              #1{\ifcsname                            \??mode#1\endcsname\else\resetmode{#1}\fi}
55\permanent\protected\def\setmode              #1{\expandafter       \integerdef\csname\??mode#1\endcsname\plusone}
56\permanent\protected\def\resetmode            #1{\expandafter       \integerdef\csname\??mode#1\endcsname\zerocount}
57\permanent\protected\def\globalsetmode        #1{\global\expandafter\integerdef\csname\??mode#1\endcsname\plusone}
58\permanent\protected\def\globalresetmode      #1{\global\expandafter\integerdef\csname\??mode#1\endcsname\zerocount}
59
60\permanent\protected\def\newsystemmode        #1{\ifcsname                            \??mode\systemmodeprefix#1\endcsname\else\resetsystemmode{#1}\fi}
61\permanent\protected\def\setsystemmode        #1{\expandafter       \integerdef\csname\??mode\systemmodeprefix#1\endcsname\plusone}
62\permanent\protected\def\resetsystemmode      #1{\expandafter       \integerdef\csname\??mode\systemmodeprefix#1\endcsname\zerocount}
63\permanent\protected\def\globalsetsystemmode  #1{\global\expandafter\integerdef\csname\??mode\systemmodeprefix#1\endcsname\plusone}
64\permanent\protected\def\globalresetsystemmode#1{\global\expandafter\integerdef\csname\??mode\systemmodeprefix#1\endcsname\zerocount}
65
66\expandafter \appendtoks
67    \expandafter\integerdef\csname\??mode\systemmodeprefix trialtypesetting\endcsname\plusone
68    \luacopyinputnodes\plusone
69\to \everysettrialtypesetting
70
71\expandafter \appendtoks
72    \expandafter\integerdef\csname\??mode\systemmodeprefix trialtypesetting\endcsname\zerocount
73    \luacopyinputnodes\zerocount
74\to \everyresettrialtypesetting
75
76\pushoverloadmode \newsystemmode{trialtypesetting} \popoverloadmode
77
78\the\everyresettrialtypesetting
79
80% user ones
81
82\mutable\let\syst_mode_prefix\relax
83
84\permanent\protected\def\preventmode{\unprotect\syst_modes_prevent}
85\permanent\protected\def\enablemode {\unprotect\syst_modes_enable }
86\permanent\protected\def\disablemode{\unprotect\syst_modes_disable}
87
88\permanent\protected\def\globalpreventmode{\let\syst_mode_prefix\global\unprotect\syst_modes_prevent}
89\permanent\protected\def\globalenablemode {\let\syst_mode_prefix\global\unprotect\syst_modes_enable }
90\permanent\protected\def\globaldisablemode{\let\syst_mode_prefix\global\unprotect\syst_modes_disable}
91
92\def\syst_modes_prevent[#1]{\protect\fastprocesscommacommand[#1]\syst_modes_prevent_indeed\let\syst_mode_prefix\relax}
93\def\syst_modes_enable [#1]{\protect\fastprocesscommacommand[#1]\syst_modes_enable_indeed \let\syst_mode_prefix\relax}
94\def\syst_modes_disable[#1]{\protect\fastprocesscommacommand[#1]\syst_modes_disable_indeed\let\syst_mode_prefix\relax}
95
96\def\syst_modes_prevent_indeed#1%
97  {\ifcsname\??mode#1\endcsname\else\setmode{#1}\fi
98   \syst_mode_prefix\expandafter\integerdef\lastnamedcs\plustwo}
99
100\def\syst_modes_enable_indeed#1% we can speed it up by moving the new outside
101  {\ifcsname\??mode#1\endcsname\else\setmode{#1}\fi
102   \ifnum\lastnamedcs=\plustwo\else
103     \syst_mode_prefix\expandafter\integerdef\lastnamedcs\plusone
104   \fi}
105
106\def\syst_modes_disable_indeed#1%
107  {\ifcsname\??mode#1\endcsname\else\setmode{#1}\fi
108   \ifnum\lastnamedcs=\plustwo\else
109     \syst_mode_prefix\expandafter\integerdef\lastnamedcs\zerocount
110   \fi}
111
112%D If you do a lot of mode testing, it makes sense to define modes (or disable them
113%D explicitly if unset. This makes testing twice as fast. Often one enables modes
114%D beforehand, in which case \type {\definemode} would reset the mode. The optional
115%D second argument \type {keep} will prevent changing the already set mode but defines
116%D it when undefined.
117
118\permanent\protected\def\definemode
119  {\unprotect
120   \syst_modes_define}
121
122\tolerant\def\syst_modes_define[#1]#*[#2]%
123  {\protect
124   \edef\m_modes_asked{#2}%
125   \fastprocesscommacommand[#1]\syst_modes_define_indeed}
126
127\def\syst_modes_define_indeed#1%
128  {\ifcsname\??mode#1\endcsname
129     % already set
130   \else
131     \newmode{#1}%
132   \fi
133   \ifx\m_modes_asked\v!keep
134     % not changes, disabled when undefined
135   \orelse\ifx\m_modes_asked\v!yes
136     \setmode{#1}%
137   \else
138     \resetmode{#1}%
139   \fi}
140
141% handy for mp
142
143\permanent\def\booleanmodevalue#1%
144  {\ifcsname\??mode#1\endcsname
145     \ifcase\lastnamedcs
146       \s!false
147     \or
148       \s!true
149     \else
150       \s!false
151     \fi
152   \else
153     \s!false
154   \fi}
155
156% check macros
157
158\newconditional\c_checked_mode
159
160% one
161
162\def\syst_modes_check_indeed#1%
163  {\ifcsname\??mode#1\endcsname
164     \ifcase\lastnamedcs\else
165       \let\syst_modes_check_step\gobbleoneargument
166     \fi
167   \fi}
168
169\def\syst_modes_check_nop#1#2#3%
170  {\let\syst_modes_check_step\syst_modes_check_indeed
171   \fastprocesscommacommand[#3]\syst_modes_check_step
172   \ifx\syst_modes_check_step\gobbleoneargument
173     \expandafter#1%
174   \else
175     \expandafter#2%
176   \fi}
177
178\def\syst_modes_check_yes#1#2#3%
179  {\ifcase\lastnamedcs
180     \expandafter#2%
181   \or
182     \expandafter#1%
183   \else
184     \expandafter#2%
185   \fi}
186
187\def\syst_modes_check_lr#1#2#3%
188  {\ifcsname\??mode#3\endcsname
189     \expandafter\syst_modes_check_yes
190   \else
191     \expandafter\syst_modes_check_nop
192   \fi#1#2{#3}}
193
194% \def\syst_modes_check_ss#1#2[#3]%
195%   {\ifcsname\??mode#3\endcsname
196%      \expandafter\syst_modes_check_yes
197%    \else
198%      \expandafter\syst_modes_check_nop
199%    \fi#1#2{#3}}
200
201% all
202
203\let\syst_modes_check_all_step\gobbleoneargument
204
205\def\syst_modes_check_all_indeed#1%
206  {\ifcsname\??mode#1\endcsname
207     \ifcase\lastnamedcs
208       \let\syst_modes_check_all_step\gobbleoneargument
209     \or
210       % enabled
211     \else
212       \let\syst_modes_check_all_step\gobbleoneargument
213     \fi
214   \else
215     \let\syst_modes_check_all_step\gobbleoneargument
216   \fi}
217
218% \def\syst_modes_check_all_lr#1#2#3%
219%   {\let\syst_modes_check_all_step\syst_modes_check_all_indeed
220%    \fastprocesscommacommand[#3]\syst_modes_check_all_step
221%    \ifx\syst_modes_check_all_step\gobbleoneargument
222%      \expandafter#2%
223%    \else
224%      \expandafter#1%
225%    \fi}
226
227% \def\syst_modes_check_all_ss#1#2[#3]%
228%   {\let\syst_modes_check_all_step\syst_modes_check_all_indeed
229%    \fastprocesscommacommand[#3]\syst_modes_check_all_step
230%    \ifx\syst_modes_check_all_step\gobbleoneargument
231%      \expandafter#2%
232%    \else
233%      \expandafter#1%
234%    \fi}
235
236% \enablemode[foomode]
237% \enablemode[oofmode]
238%
239% \ifmode          {foomode}          YES  \else  NOP \fi \par
240% \ifmodes         {oofmode,foomode}  YES  \else  NOP \fi \par
241% \ifallmodes      {oofmode,foomode}  YES  \else  NOP \fi \par
242% \doifelsemode    {foomode}         {YES}       {NOP}    \par
243% \doifelsemode    {oofmode,foomode} {YES}       {NOP}    \par
244% \doifelseallmodes{oofmode,foomode} {YES}       {NOP}    \par
245
246% \permanent\protected\def\doifelsemode    {\syst_modes_check_lr    \firstoftwoarguments    \secondoftwoarguments}
247% \permanent\protected\def\doifmode        {\syst_modes_check_lr    \firstofoneargument     \gobbleoneargument}
248% \permanent\protected\def\doifnotmode     {\syst_modes_check_lr    \gobbleoneargument      \firstofoneargument}
249% \permanent\protected\def\startmode       {\syst_modes_check_ss    \donothing              \syst_modes_stop_yes}
250% \permanent\protected\def\startnotmode    {\syst_modes_check_ss    \syst_modes_stop_nop    \donothing}
251% \permanent\protected\def\doifelseallmodes{\syst_modes_check_all_lr\firstoftwoarguments    \secondoftwoarguments}
252% \permanent\protected\def\doifallmodes    {\syst_modes_check_all_lr\firstofoneargument     \gobbleoneargument}
253% \permanent\protected\def\doifnotallmodes {\syst_modes_check_all_lr\gobbleoneargument      \firstofoneargument}
254% \permanent\protected\def\startallmodes   {\syst_modes_check_all_ss\donothing              \syst_modes_stop_all_yes}
255% \permanent\protected\def\startnotallmodes{\syst_modes_check_all_ss\syst_modes_stop_all_nop\donothing}
256%
257% \aliased\let\doifmodeelse    \doifelsemode
258% \aliased\let\doifallmodeselse\doifelseallmodes
259%
260% \permanent\protected\def\stopmode       {} % no relax
261% \permanent\protected\def\stopnotmode    {} % no relax
262% \permanent\protected\def\stopallmodes   {} % no relax
263% \permanent\protected\def\stopnotallmodes{} % no relax
264%
265% \def\syst_modes_stop_yes    #-\stopmode       {}
266% \def\syst_modes_stop_nop    #-\stopnotmode    {}
267% \def\syst_modes_stop_all_yes#-\stopallmodes   {}
268% \def\syst_modes_stop_all_nop#-\stopnotallmodes{}
269
270\permanent\protected\def\doifelsemode    #1{\ifmodes   {#1}\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
271\permanent\protected\def\doifmode        #1{\ifmodes   {#1}\expandafter\firstofoneargument \else\expandafter\gobbleoneargument   \fi}
272\permanent\protected\def\doifnotmode     #1{\ifmodes   {#1}\expandafter\gobbleoneargument  \else\expandafter\firstofoneargument  \fi}
273\permanent\protected\def\doifelseallmodes#1{\ifallmodes{#1}\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
274\permanent\protected\def\doifallmodes    #1{\ifallmodes{#1}\expandafter\firstofoneargument \else\expandafter\gobbleoneargument   \fi}
275\permanent\protected\def\doifnotallmodes #1{\ifallmodes{#1}\expandafter\gobbleoneargument  \else\expandafter\firstofoneargument  \fi}
276
277% \permanent\protected\def\startmode       [#1]{\ifmodes   {#1}\else\expandafter\ignoreupto\expandafter\stopmode       \fi}
278% \permanent\protected\def\startallmodes   [#1]{\ifallmodes{#1}\else\expandafter\ignoreupto\expandafter\stopallmodes   \fi}
279% \permanent\protected\def\startnotmode    [#1]{\ifmodes   {#1}\expandafter     \ignoreupto\expandafter\stopnotmode    \fi}
280% \permanent\protected\def\startnotallmodes[#1]{\ifallmodes{#1}\expandafter     \ignoreupto\expandafter\stopnotallmodes\fi}
281
282\permanent\protected\def\startmode       [#1]{\ifmodes   {#1}\else\expandafter\ignorenestedupto\expandafter\startmode       \expandafter\stopmode       \fi}
283\permanent\protected\def\startallmodes   [#1]{\ifallmodes{#1}\else\expandafter\ignorenestedupto\expandafter\startallmodes   \expandafter\stopallmodes   \fi}
284\permanent\protected\def\startnotmode    [#1]{\ifmodes   {#1}\expandafter     \ignorenestedupto\expandafter\startnotmode    \expandafter\stopnotmode    \fi}
285\permanent\protected\def\startnotallmodes[#1]{\ifallmodes{#1}\expandafter     \ignorenestedupto\expandafter\startnotallmodes\expandafter\stopnotallmodes\fi}
286
287\permanent\protected\def\stopmode       {} % no relax
288\permanent\protected\def\stopnotmode    {} % no relax
289\permanent\protected\def\stopallmodes   {} % no relax
290\permanent\protected\def\stopnotallmodes{} % no relax
291
292\aliased\let\doifmodeelse    \doifelsemode
293\aliased\let\doifallmodeselse\doifelseallmodes
294
295%D Pushing/popping:
296
297\permanent\protected\def\pushmode[#1]{\expandafter\pushmacro\csname\??mode#1\endcsname}
298\permanent\protected\def\popmode [#1]{\expandafter\popmacro \csname\??mode#1\endcsname}
299
300\permanent\protected\def\pushsystemmode#1{\expandafter\pushmacro\csname\??mode\systemmodeprefix#1\endcsname}
301\permanent\protected\def\popsystemmode #1{\expandafter\popmacro \csname\??mode\systemmodeprefix#1\endcsname}
302
303%D Here is a relatively new variant of mode checking:
304%D
305%D \starttyping
306%D \enablemode[two]
307%D
308%D \startmodeset
309%D     [one]     {1}
310%D     [two]     {2}
311%D     [two]     {2}
312%D     [three]   {3}
313%D     [default] {?}
314%D \stopmodeset
315%D
316%D \startmodeset
317%D     [one]     {1}
318%D     [three]   {3}
319%D     [default] {?}
320%D \stopmodeset
321%D
322%D \startmodeset
323%D     [one] {
324%D         \input tufte
325%D     }
326%D     [two] {
327%D         \startmodeset
328%D             [one]     {1}
329%D             [two]     {2}
330%D             [two]     {2}
331%D             [three]   {3}
332%D             [default] {?}
333%D         \stopmodeset
334%D     }
335%D     [three] {
336%D         \input zapf
337%D     }
338%D     [default] {
339%D         \input ward
340%D     }
341%D \stopmodeset
342%D \stoptyping
343
344\newconditional\c_syst_modes_set_done % conditionals can be pushed/popped
345
346\installmacrostack\c_syst_modes_set_done
347
348\permanent\protected\def\startmodeset
349  {\push_macro_c_syst_modes_set_done
350   \c_syst_modes_set_done\conditionalfalse
351   \syst_modes_set_start}
352
353\permanent\protected\lettonothing\stopmodeset
354
355\tolerant\def\syst_modes_set_start#.[#1]% skip spaces and pars
356  {\edef\m_mode_case{#1}%
357   \ifempty\m_mode_case
358     \expandafter\syst_modes_set_quit
359   \orunless\ifx\m_mode_case\s!default
360     \expandafter\syst_modes_set_check
361   \orelse\ifconditional\c_syst_modes_set_done
362     \expandafter\syst_modes_set_quit
363   \else
364     \expandafter\syst_modes_set_yes
365   \fi}
366
367\def\syst_modes_set_check
368  {\syst_modes_check_lr\syst_modes_set_yes\syst_modes_set_nop\m_mode_case}
369
370\tolerant\def\syst_modes_set_yes#1%
371  {\c_syst_modes_set_done\conditionaltrue
372   #1%
373   \syst_modes_set_start}
374
375\tolerant\def\syst_modes_set_nop#1%
376  {\syst_modes_set_start}
377
378\def\syst_modes_set_quit#-\stopmodeset
379  {\pop_macro_c_syst_modes_set_done}
380
381%D Lets now set a few modes:
382
383\enablemode[mkiv] \newsystemmode{mkiv} \setsystemmode{mkiv} % also mkxl
384\enablemode[lmtx] \newsystemmode{lmtx} \setsystemmode{lmtx}
385
386%D Setups:
387
388% \installcorenamespace{setup} % we can probably get rid of some :'s later on
389
390% \protected\def\startsetups{} % to please dep checker
391% \protected\def\stopsetups {} % to please dep checker
392%
393% \protected\def\setups{\doifelsenextbgroup\syst_setups_a\syst_setups_b} % {..} or [..]
394% \protected\def\setup {\doifelsenextbgroup\syst_setups  \syst_setups_c} % {..} or [..]
395%
396% \def\syst_setups_a  #1{\processcommacommand[#1]\syst_setups} % {..}
397% \def\syst_setups_b[#1]{\processcommacommand[#1]\syst_setups} % [..]
398% \def\syst_setups_c[#1]{\syst_setups{#1}} % [..]
399
400\permanent\protected\tolerant\def\setups[#1]#;#2{\processcommacommand[#1#2]\syst_setups} % {..} or [..]
401\permanent\protected\tolerant\def\setup [#1]#;#2{\syst_setups{#1#2}} % {..} or [..]
402
403% \letcsname\??setup:\??empty\endcsname\gobbleoneargument
404%
405% \permanent\def\syst_setups#1% the grid option will be extended to other main modes
406%   {\begincsname\??setup
407%      \ifgridsnapping
408%        \ifcsname\??setup\v!grid:#1\endcsname\v!grid:#1\else:\ifcsname\??setup:#1\endcsname#1\else\??empty\fi\fi
409%      \else
410%                                                            :\ifcsname\??setup:#1\endcsname#1\else\??empty\fi
411%      \fi
412%    \endcsname\empty} % takes one argument
413
414% We drop the grid option here:
415
416\letcsname\??setup\endcsname\gobbleoneargument
417
418\permanent\def\syst_setups#1% takes one argument
419 %{\begincsname\ifcsname\??setup:#1\endcsname\csnamestring\else\??setup:\??empty\fi\endcsname\empty}
420  {\begincsname\ifcsname\??setup:#1\endcsname\csnamestring\else\??setup\fi\endcsname\empty}
421
422% no checking and we assume it being defined:
423
424\permanent\def\fastsetup                     #1{\begincsname\??setup:#1\endcsname\empty}
425\permanent\def\fastsetupwithargument         #1{\begincsname\??setup:#1\endcsname}    % swapped per 2015-08-30
426\permanent\def\fastsetupwithargumentswapped#1#2{\begincsname\??setup:#2\endcsname{#1}}% swapped per 2015-09-05
427
428%D The next one is meant for \c!setups situations, hence the check for a
429%D shortcut.
430
431\lettonothing\m_syst_setups_asked
432
433\permanent\protected\def\doprocesslocalsetups#1% sort of public, fast local variant
434  {\edef\m_syst_setups_asked{#1}%
435   \ifempty\m_syst_setups_asked\else
436     \expandafter\syst_setups_process_local
437   \fi}
438
439\permanent\protected\def\usesetupsparameter#1%
440  {\edef\m_syst_setups_asked{#1\c!setups}%
441   \ifempty\m_syst_setups_asked\else
442     \expandafter\syst_setups_process_local
443   \fi}
444
445% setups=S1
446% setups=lua(S2)
447% setups=S3
448% setups={S1,lua(S2),xml(test{123}),S3}
449
450\def\syst_setups_process_local
451  {\clf_autosetups{\m_syst_setups_asked}%
452   \relax} % let's prevent lookahead
453
454\permanent\def\autosetups#1{\clf_autosetups{#1}} % todo: public implementor
455
456%% \permanent\edef\setupwithargument#1% saves a few expansions and is faster
457%%   {\noexpand\csname\??setup:\noexpand\ifcsname\??setup:#1\endcsname#1\noexpand\else\??empty\noexpand\fi\endcsname}
458%%
459%% \permanent\edef\setupwithargumentswapped#1#2% saves a few expansions (can be \let)
460%%   {\noexpand\csname\??setup:\noexpand\ifcsname\??setup:#2\endcsname#2\noexpand\else\??empty\noexpand\fi\endcsname{#1}}
461
462%D We can gain a bit more but as usual it's not noticeable at all in production runs. We use
463%D this one a lot in the \XML\ code.
464
465% \permanent\def\setupwithargument          #1{\futurecsname\gobbleoneargument\??setup:#1\endcsname}
466% \permanent\def\setupwithargumentswapped #1#2{\futurecsname\gobbleoneargument\??setup:#2\endcsname{#1}}
467
468\permanent\edef\setupwithargument         #1{\noexpand\futurecsname\noexpand\gobbleoneargument\??setup:#1\endcsname}
469\permanent\edef\setupwithargumentswapped#1#2{\noexpand\futurecsname\noexpand\gobbleoneargument\??setup:#2\endcsname{#1}}
470
471\aliased\let\directsetup\syst_setups
472\aliased\let\texsetup   \syst_setups % nicer than \directsetup and more en par with xmlsetup and luasetup
473
474\permanent\protected\def\doifelsesetups#1%
475  {\ifcsname\??setup:#1\endcsname
476     \expandafter\firstoftwoarguments
477   \else
478     \expandafter\secondoftwoarguments
479   \fi}
480
481\aliased\let\doifsetupselse\doifelsesetups
482
483\permanent\protected\def\doifsetups#1%
484  {\ifcsname\??setup:#1\endcsname
485     \expandafter\firstofoneargument
486   \else
487     \expandafter\gobbleoneargument
488   \fi}
489
490\permanent\protected\def\doifnotsetups#1%
491  {\ifcsname\??setup:#1\endcsname
492     \expandafter\gobbleoneargument
493   \else
494     \expandafter\firstofoneargument
495   \fi}
496
497% maybe some day:
498%
499% \protected\def\fastsetupfallback#1#2%
500%   {\ifcsname\??setup:#1\endcsname
501%      \expandafter\lastnamedcs
502%    \else
503%      \csname\??setup:#2\expandafter\endcsname
504%    \fi}
505%
506% or
507%
508% \protected\def\fastsetupfallback#1#2#3% prefix preferred fallback
509%   {\ifcsname\??setup:#1#2\endcsname
510%      \expandafter\lastnamedcs
511%    \else
512%      \csname\??setup:#1#3\expandafter\endcsname
513%    \fi}
514
515% \startluasetups oeps
516%     context("DONE")
517%     a = 1
518%     b = 1
519% \stopluasetups
520%
521% \luasetup{oeps}
522%
523% \startsetups xxx
524%     ziezo
525% \stopsetups
526%
527% \directsetup{xxx}
528%
529% \startxmlsetups zzz
530%     [[#1]]
531% \stopxmlsetups
532%
533% \xmlsetup{123}{zzz}
534%
535% \startbuffer[what]
536%     context("DONE")
537% \stopbuffer
538%
539% \startbuffer
540%     context("MORE")
541% \stopbuffer
542%
543% \ctxluabuffer[what]
544%
545% \ctxluabuffer
546
547\newtoks\t_syst_setups_tex \appendtoks
548    \catcode\endoflineasciicode \ignorecatcode
549\to \t_syst_setups_tex
550
551\newtoks\t_syst_setups_loc \appendtoks
552    \catcode\endoflineasciicode \ignorecatcode
553\to \t_syst_setups_loc
554
555\newtoks\t_syst_setups_raw \appendtoks
556    % nothing
557\to \t_syst_setups_raw
558
559\newtoks\t_syst_setups_xml \appendtoks
560    \catcode\endoflineasciicode\ignorecatcode
561    \catcode\barasciicode      \othercatcode
562\to \t_syst_setups_xml
563
564\newtoks\t_syst_setups_lua \appendtoks
565    \obeyluatokens
566\to \t_syst_setups_lua
567
568% Is doglobal still relevant? Maybe always global? Or never? Anyway, it will become obsolete.
569
570\permanent\protected\def\startluasetups  {\begingroup\doifelsenextoptionalcs\syst_setups_start_lua_yes\syst_setups_start_lua_nop} \permanent\protected\lettonothing\stopluasetups
571\permanent\protected\def\startxmlsetups  {\begingroup\doifelsenextoptionalcs\syst_setups_start_xml_yes\syst_setups_start_xml_nop} \permanent\protected\lettonothing\stopxmlsetups
572\permanent\protected\def\startrawsetups  {\begingroup\doifelsenextoptionalcs\syst_setups_start_raw_yes\syst_setups_start_raw_nop} \permanent\protected\lettonothing\stoprawsetups
573\permanent\protected\def\startlocalsetups{\begingroup\doifelsenextoptionalcs\syst_setups_start_loc_yes\syst_setups_start_loc_nop} \permanent\protected\lettonothing\stoplocalsetups
574\permanent\protected\def\startsetups     {\begingroup\doifelsenextoptionalcs\syst_setups_start_tex_yes\syst_setups_start_tex_nop} \permanent\protected\lettonothing\stopsetups
575
576% \def\syst_setups_start_lua_two#1#2#+\stopluasetups  {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
577% \def\syst_setups_start_xml_two#1#2#+\stopxmlsetups  {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
578% \def\syst_setups_start_raw_two#1#2#+\stoprawsetups  {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
579% \def\syst_setups_start_loc_two#1#2#+\stoplocalsetups{\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
580% \def\syst_setups_start_tex_two#1#2#+\stopsetups     {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
581
582% \def\syst_setups_start_lua_two#1#2#+\stopluasetups  {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}} % + keep braces
583% \def\syst_setups_start_xml_two#1#2#+\stopxmlsetups  {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
584% \def\syst_setups_start_raw_two#1#2#+\stoprawsetups  {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
585% \def\syst_setups_start_loc_two#1#2#+\stoplocalsetups{\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
586% \def\syst_setups_start_tex_two#1#2#+\stopsetups     {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
587
588\let\syst_setups_defcsname\defcsname
589
590\permanent\protected\def\pushglobalsetups{\let\syst_setups_defcsname\gdefcsname}
591\permanent\protected\def\popglobalsetups {\let\syst_setups_defcsname\defcsname }
592
593\def\syst_setups_start_lua_two#1#2#L\startluasetups  #R\stopluasetups  #+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}} % + keep braces
594\def\syst_setups_start_xml_two#1#2#L\startxmlsetups  #R\stopxmlsetups  #+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
595\def\syst_setups_start_raw_two#1#2#L\startrawsetups  #R\stoprawsetups  #+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
596\def\syst_setups_start_loc_two#1#2#L\startlocalsetups#R\stoplocalsetups#+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
597\def\syst_setups_start_tex_two#1#2#L\startsetups     #R\stopsetups     #+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
598
599\tolerant\def\syst_setups_start_lua_yes[#1]#*[#2]%
600  {\expand\t_syst_setups_lua
601   \ifarguments\expandafter\syst_setups_start_lua_one
602   \or         \expandafter\syst_setups_start_lua_one
603   \else       \expandafter\syst_setups_start_lua_two
604   \fi{#1}{#2}}
605
606\tolerant\def\syst_setups_start_xml_yes[#1]#*[#2]%
607  {\expand\t_syst_setups_xml
608   \ifarguments\expandafter\syst_setups_start_xml_one
609   \or         \expandafter\syst_setups_start_xml_one
610   \else       \expandafter\syst_setups_start_xml_two
611   \fi{#1}{#2}}
612
613\tolerant\def\syst_setups_start_raw_yes[#1]#*[#2]%
614  {\expand\t_syst_setups_raw
615   \ifarguments\expandafter\syst_setups_start_raw_one
616   \or         \expandafter\syst_setups_start_raw_one
617   \else       \expandafter\syst_setups_start_raw_two
618   \fi{#1}{#2}}
619
620\tolerant\def\syst_setups_start_loc_yes[#1]#*[#2]%
621  {\expand\t_syst_setups_loc
622   \ifarguments\expandafter\syst_setups_start_loc_one
623   \or         \expandafter\syst_setups_start_loc_one
624   \else       \expandafter\syst_setups_start_loc_two
625   \fi{#1}{#2}}
626
627\tolerant\def\syst_setups_start_tex_yes[#1]#*[#2]%
628  {\expand\t_syst_setups_tex
629   \ifarguments\expandafter\syst_setups_start_tex_one
630   \or         \expandafter\syst_setups_start_tex_one
631   \else       \expandafter\syst_setups_start_tex_two
632   \fi{#1}{#2}}
633
634\def\syst_setups_start_lua_nop#1 {\expand\t_syst_setups_lua\syst_setups_start_lua_two{}{#1}} % space delimited
635\def\syst_setups_start_xml_nop#1 {\expand\t_syst_setups_xml\syst_setups_start_xml_two{}{#1}} % space delimited
636\def\syst_setups_start_raw_nop#1 {\expand\t_syst_setups_raw\syst_setups_start_raw_two{}{#1}} % space delimited
637\def\syst_setups_start_loc_nop#1 {\expand\t_syst_setups_loc\syst_setups_start_loc_two{}{#1}} % space delimited
638\def\syst_setups_start_tex_nop#1 {\expand\t_syst_setups_tex\syst_setups_start_tex_two{}{#1}} % space delimited
639
640\def\syst_setups_start_lua_one#1#2{\syst_setups_start_lua_two{}{#1}} % [..]
641\def\syst_setups_start_xml_one#1#2{\syst_setups_start_xml_two{}{#1}} % [..]
642\def\syst_setups_start_raw_one#1#2{\syst_setups_start_raw_two{}{#1}} % [..]
643\def\syst_setups_start_loc_one#1#2{\syst_setups_start_loc_two{}{#1}} % [..]
644\def\syst_setups_start_tex_one#1#2{\syst_setups_start_tex_two{}{#1}} % [..]
645
646\permanent\def\luasetup#1{\ctxlua{\syst_setups{#1}}}
647
648%D System setups:
649
650\aliased\let\systemsetupsprefix\wildcardsymbol
651
652\permanent\def\systemsetups#1{\syst_setups{\systemsetupsprefix#1}}
653
654% \permanent\tolerant\protected\def\resetsetups[#1]#;#2%
655%   {\ifcsname\??setup\ifgridsnapping\v!grid\fi:#1#2\endcsname
656%      \dodoglobal\undefinevalue{\??setup\ifgridsnapping\v!grid\fi:#1#2}%
657%    \else
658%      \dodoglobal\undefinevalue{\??setup:#1#2}%
659%    \fi}
660
661\permanent\tolerant\protected\def\resetsetups[#1]#;#2%
662  {\dodoglobal\undefinevalue{\??setup:#1#2}}
663
664\permanent\tolerant\protected\def\copysetups[#1]#*[#2]%
665  {\ifcsname\??setup:#2\endcsname
666      \letcsname\??setup:#1\expandafter\endcsname\lastnamedcs
667   \fi}
668
669\permanent\protected\def\showsetupsdefinition[#1]%
670  {\showvalue{\??setup:#1}} % temp hack for debugging
671
672%D \macros
673%D   {setvariables,getvariable,getvariabledefault}
674%D
675%D \starttyping
676%D \setvariables[xx][title=]
677%D \setvariables[xx][title=test test]
678%D \setvariables[xx][title=test $x=1$ test]   % fatal error reported
679%D \setvariables[xx][title=test {$x=1$} test]
680%D \setvariables[xx][title]                   % fatal error reported
681%D \setvariables[xx][titletitel=e]
682%D \stoptyping
683
684\installcorenamespace{variables}
685
686\permanent\protected\def\setvariables {\syst_variables_set\getparameters }
687\permanent\protected\def\setevariables{\syst_variables_set\geteparameters}
688\permanent\protected\def\setgvariables{\syst_variables_set\getgparameters}
689\permanent\protected\def\setxvariables{\syst_variables_set\getxparameters}
690
691\mutable\lettonothing\currentvariableclass
692
693\tolerant\def\syst_variables_set#1#*[#2]#*[#S#3]% tricky, test on s-pre-60
694  {\ifcstok{#2}\currentvariableclass
695     #1[\??variables#2:][#3]%
696   \else
697     \pushmacro\currentvariableclass
698     \cdef\currentvariableclass{#2}%
699     \getvariable{#2}\s!reset
700     #1[\??variables#2:][#3]%
701     \getvariable{#2}\s!set
702     \popmacro\currentvariableclass
703   \fi}
704
705\permanent\protected\def\setvariable #1#2#3{\defcsname \??variables#1:#2\endcsname{#3}}
706\permanent\protected\def\setevariable#1#2#3{\edefcsname\??variables#1:#2\endcsname{#3}}
707\permanent\protected\def\setgvariable#1#2#3{\defcsname \??variables#1:#2\endcsname{#3}}
708\permanent\protected\def\setxvariable#1#2#3{\xdefcsname\??variables#1:#2\endcsname{#3}}
709
710\permanent          \def\getvariable #1#2{\begincsname\??variables#1:#2\endcsname}
711\permanent\protected\def\showvariable#1#2{\showvalue{\begincsname\??variables#1:#2\endcsname}}
712
713%D \macros
714%D   {checkvariables}
715%D
716%D I'll probably forget that this on exists.
717
718% \lettonothing\m_syst_variables_temp
719%
720% \permanent\tolerant\def\checkvariables[#1]#*[#2]%
721%   {\dogetparameters\syst_variables_check_value[#1][#2]}
722%
723% \def\syst_variables_check_value#1#2#3%
724%   {\ifcsname\??variables#1:#2\endcsname
725%      \edef\m_syst_variables_temp{\lastnamedcs}%
726%      \ifempty\m_syst_variables_temp
727%        \defcsname\??variables#1:#2\endcsname{#3}%
728%      \fi
729%    \else
730%      \defcsname\??variables#1:#2\endcsname{#3}%
731%    \fi}
732
733\permanent\protected\def\checkvariables[#1]#*[#S#2]%
734  {\cdef\m_syst_parameter{#1}%
735   \syst_variables_check_value#2\ignorearguments\ignorearguments}
736
737\tolerant\def\syst_variables_check_value#*#1=#S#2,#M,%
738  {\ifarguments
739     \expandafter\gobbleoneargument
740   \or
741     \mult_interfaces_get_parameters_error_indeed\m_syst_parameter{#1}%
742   \orunless\ifcsname\??variables\m_syst_parameter:#1\endcsname
743     \defcsname\??variables\m_syst_parameter:#1\endcsname{#2}%
744   \orelse\ifempty{\lastnamedcs}%
745     \defcsname\??variables\m_syst_parameter:#1\endcsname{#2}%
746   \fi
747   \syst_variables_check_value}
748
749%D \macros
750%D   {doifelsevariable,doifvariable,doifnotvariable}
751%D
752%D A few trivial macros:
753
754\permanent\protected\def\doifelsevariable#1#2%
755  {\ifcsname\??variables#1:#2\endcsname
756     \expandafter\firstoftwoarguments
757   \else
758     \expandafter\secondoftwoarguments
759   \fi}
760
761\aliased\let\doifvariableelse\doifelsevariable
762
763\permanent\protected\def\doifvariable#1#2%
764  {\ifcsname\??variables#1:#2\endcsname
765     \expandafter\firstofoneargument
766   \else
767     \expandafter\gobbleoneargument
768   \fi}
769
770\permanent\protected\def\doifnotvariable#1#2%
771  {\ifcsname\??variables#1:#2\endcsname
772     \expandafter\gobbleoneargument
773   \else
774     \expandafter\firstofoneargument
775   \fi}
776
777%D A few more (we could use a public test variable so that we only need to expand
778%D once, assuming expandable variables):
779
780\letcsname\??variables:\endcsname\empty
781
782\permanent\protected\def\doifelseemptyvariable#1#2%
783  {\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
784   \ifempty\m_syst_string_one
785     \expandafter\firstoftwoarguments
786   \else
787     \expandafter\secondoftwoarguments
788   \fi}
789
790\aliased\let\doifemptyvariableelse\doifelseemptyvariable
791
792\permanent\protected\def\doifemptyvariable#1#2%
793  {\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
794   \ifempty\m_syst_string_one
795     \expandafter\firstofoneargument
796   \else
797     \expandafter\gobbleoneargument
798   \fi}
799
800\permanent\protected\def\doifnotemptyvariable#1#2%
801  {\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
802   \ifempty\m_syst_string_one
803     \expandafter\gobbleoneargument
804   \else
805     \expandafter\firstofoneargument
806   \fi}
807
808\permanent\def\getvariabledefault#1#2% #3% can be command
809  {\ifcsname\??variables#1:#2\endcsname
810     \expandafter\expandafter\expandafter\lastnamedcs\expandafter\gobbleoneargument
811   \else
812     \expandafter\firstofoneargument
813   \fi}
814
815\permanent\tolerant\protected\def\setupenv
816  {\syst_variables_set\getparameters[\s!environment]}
817
818\permanent\protected\def\doifelseenv{\doifelsevariable  \s!environment}
819\permanent\protected\def\doifenv    {\doifvariable      \s!environment}
820\permanent\protected\def\doifnotenv {\doifnotvariable   \s!environment}
821\permanent          \def\env        {\getvariable       \s!environment}
822\permanent          \def\envvar     {\getvariabledefault\s!environment}
823
824\aliased\let\doifenvelse\doifelseenv
825
826%D \macros
827%D   {defineselector,setupselector,select,directselect}
828%D
829%D \starttyping
830%D \defineselector[caption][max=2,n=2]
831%D
832%D \start
833%D     \setupselector[caption][n=1]
834%D     \placelist[figure][criterium=all]
835%D \stop
836%D
837%D \starttext
838%D     \placefigure
839%D       {\select{caption}{zapf}{\input zapf \relax}}
840%D       {}
841%D \stoptext
842%D \stoptyping
843
844\installcorenamespace{selector}
845
846\permanent\tolerant\protected\def\defineselector[#1]#*[#2]{\getparameters[\??selector#1][\c!max=\plusone,\c!n=\plusone,#2]}
847\permanent\tolerant\protected\def\setupselector [#1]#*[#2]{\getparameters[\??selector#1][#2]}
848
849\permanent\def\directselect#1% expandable
850  {\expandafter\filterfromnext
851     \csname\??selector\ifcsname\??selector#1\c!max\endcsname#1\fi\c!max\expandafter\endcsname
852     \csname\??selector\ifcsname\??selector#1\c!n  \endcsname#1\fi\c!n  \endcsname}
853
854\permanent\protected\let\select\directselect % we promote to protected
855
856\letcsname\??selector\c!max\endcsname\plusone
857\letcsname\??selector\c!n  \endcsname\plusone
858
859\protect \endinput
860