core-env.mkxl /size: 31 Kb    last modification: 2024-01-16 09:02
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% no checking and we assume it being defined:
415
416\permanent\def\fastsetup                     #1{\begincsname\??setup:#1\endcsname\empty}
417\permanent\def\fastsetupwithargument         #1{\begincsname\??setup:#1\endcsname}    % swapped per 2015-08-30
418\permanent\def\fastsetupwithargumentswapped#1#2{\begincsname\??setup:#2\endcsname{#1}}% swapped per 2015-09-05
419
420%D The next one is meant for \c!setups situations, hence the check for a
421%D shortcut.
422
423\lettonothing\m_syst_setups_asked
424
425\permanent\protected\def\doprocesslocalsetups#1% sort of public, fast local variant
426  {\edef\m_syst_setups_asked{#1}%
427   \ifempty\m_syst_setups_asked\else
428     \expandafter\syst_setups_process_local
429   \fi}
430
431\permanent\protected\def\usesetupsparameter#1%
432  {\edef\m_syst_setups_asked{#1\c!setups}%
433   \ifempty\m_syst_setups_asked\else
434     \expandafter\syst_setups_process_local
435   \fi}
436
437% setups=S1
438% setups=lua(S2)
439% setups=S3
440% setups={S1,lua(S2),xml(test{123}),S3}
441
442\def\syst_setups_process_local
443  {\clf_autosetups{\m_syst_setups_asked}%
444   \relax} % let's prevent lookahead
445
446\permanent\def\autosetups#1{\clf_autosetups{#1}} % todo: public implementor
447
448%% \permanent\edef\setupwithargument#1% saves a few expansions and is faster
449%%   {\noexpand\csname\??setup:\noexpand\ifcsname\??setup:#1\endcsname#1\noexpand\else\??empty\noexpand\fi\endcsname}
450%%
451%% \permanent\edef\setupwithargumentswapped#1#2% saves a few expansions (can be \let)
452%%   {\noexpand\csname\??setup:\noexpand\ifcsname\??setup:#2\endcsname#2\noexpand\else\??empty\noexpand\fi\endcsname{#1}}
453
454%D We can gain a bit more but as usual it's not noticeable at all in production runs. We use
455%D this one a lot in the \XML\ code.
456
457% \permanent\def\setupwithargument          #1{\futurecsname\gobbleoneargument\??setup:#1\endcsname}
458% \permanent\def\setupwithargumentswapped #1#2{\futurecsname\gobbleoneargument\??setup:#2\endcsname{#1}}
459
460\permanent\edef\setupwithargument         #1{\noexpand\futurecsname\noexpand\gobbleoneargument\??setup:#1\endcsname}
461\permanent\edef\setupwithargumentswapped#1#2{\noexpand\futurecsname\noexpand\gobbleoneargument\??setup:#2\endcsname{#1}}
462
463\aliased\let\directsetup\syst_setups
464\aliased\let\texsetup   \syst_setups % nicer than \directsetup and more en par with xmlsetup and luasetup
465
466\permanent\protected\def\doifelsesetups#1% to be done: grid
467  {\ifcsname\??setup:#1\endcsname
468     \expandafter\firstoftwoarguments
469   \else
470     \expandafter\secondoftwoarguments
471   \fi}
472
473\aliased\let\doifsetupselse\doifelsesetups
474
475\permanent\protected\def\doifsetups#1% to be done: grid
476  {\ifcsname\??setup:#1\endcsname
477     \expandafter\firstofoneargument
478   \else
479     \expandafter\gobbleoneargument
480   \fi}
481
482\permanent\protected\def\doifnotsetups#1% to be done: grid
483  {\ifcsname\??setup:#1\endcsname
484     \expandafter\gobbleoneargument
485   \else
486     \expandafter\firstofoneargument
487   \fi}
488
489% maybe some day:
490%
491% \protected\def\fastsetupfallback#1#2%
492%   {\ifcsname\??setup:#1\endcsname
493%      \expandafter\lastnamedcs
494%    \else
495%      \csname\??setup:#2\expandafter\endcsname
496%    \fi}
497%
498% or
499%
500% \protected\def\fastsetupfallback#1#2#3% prefix preferred fallback
501%   {\ifcsname\??setup:#1#2\endcsname
502%      \expandafter\lastnamedcs
503%    \else
504%      \csname\??setup:#1#3\expandafter\endcsname
505%    \fi}
506
507% \startluasetups oeps
508%     context("DONE")
509%     a = 1
510%     b = 1
511% \stopluasetups
512%
513% \luasetup{oeps}
514%
515% \startsetups xxx
516%     ziezo
517% \stopsetups
518%
519% \directsetup{xxx}
520%
521% \startxmlsetups zzz
522%     [[#1]]
523% \stopxmlsetups
524%
525% \xmlsetup{123}{zzz}
526%
527% \startbuffer[what]
528%     context("DONE")
529% \stopbuffer
530%
531% \startbuffer
532%     context("MORE")
533% \stopbuffer
534%
535% \ctxluabuffer[what]
536%
537% \ctxluabuffer
538
539\newtoks\t_syst_setups_tex \appendtoks
540    \catcode\endoflineasciicode \ignorecatcode
541\to \t_syst_setups_tex
542
543\newtoks\t_syst_setups_loc \appendtoks
544    \catcode\endoflineasciicode \ignorecatcode
545\to \t_syst_setups_loc
546
547\newtoks\t_syst_setups_raw \appendtoks
548    % nothing
549\to \t_syst_setups_raw
550
551\newtoks\t_syst_setups_xml \appendtoks
552    \catcode\endoflineasciicode\ignorecatcode
553    \catcode\barasciicode      \othercatcode
554\to \t_syst_setups_xml
555
556\newtoks\t_syst_setups_lua \appendtoks
557    \obeyluatokens
558\to \t_syst_setups_lua
559
560% Is doglobal still relevant? Maybe always global? Or never? Anyway, it will become obsolete.
561
562\permanent\protected\def\startluasetups  {\begingroup\doifelsenextoptionalcs\syst_setups_start_lua_yes\syst_setups_start_lua_nop} \permanent\protected\lettonothing\stopluasetups
563\permanent\protected\def\startxmlsetups  {\begingroup\doifelsenextoptionalcs\syst_setups_start_xml_yes\syst_setups_start_xml_nop} \permanent\protected\lettonothing\stopxmlsetups
564\permanent\protected\def\startrawsetups  {\begingroup\doifelsenextoptionalcs\syst_setups_start_raw_yes\syst_setups_start_raw_nop} \permanent\protected\lettonothing\stoprawsetups
565\permanent\protected\def\startlocalsetups{\begingroup\doifelsenextoptionalcs\syst_setups_start_loc_yes\syst_setups_start_loc_nop} \permanent\protected\lettonothing\stoplocalsetups
566\permanent\protected\def\startsetups     {\begingroup\doifelsenextoptionalcs\syst_setups_start_tex_yes\syst_setups_start_tex_nop} \permanent\protected\lettonothing\stopsetups
567
568% \def\syst_setups_start_lua_two#1#2#+\stopluasetups  {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
569% \def\syst_setups_start_xml_two#1#2#+\stopxmlsetups  {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
570% \def\syst_setups_start_raw_two#1#2#+\stoprawsetups  {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
571% \def\syst_setups_start_loc_two#1#2#+\stoplocalsetups{\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
572% \def\syst_setups_start_tex_two#1#2#+\stopsetups     {\endgroup\dodoglobal\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
573
574% \def\syst_setups_start_lua_two#1#2#+\stopluasetups  {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}} % + keep braces
575% \def\syst_setups_start_xml_two#1#2#+\stopxmlsetups  {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
576% \def\syst_setups_start_raw_two#1#2#+\stoprawsetups  {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
577% \def\syst_setups_start_loc_two#1#2#+\stoplocalsetups{\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
578% \def\syst_setups_start_tex_two#1#2#+\stopsetups     {\endgroup\instance\defcsname\??setup#1:#2\endcsname##1{#3}}
579
580\let\syst_setups_defcsname\defcsname
581
582\permanent\protected\def\pushglobalsetups{\let\syst_setups_defcsname\gdefcsname}
583\permanent\protected\def\popglobalsetups {\let\syst_setups_defcsname\defcsname }
584
585\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
586\def\syst_setups_start_xml_two#1#2#L\startxmlsetups  #R\stopxmlsetups  #+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
587\def\syst_setups_start_raw_two#1#2#L\startrawsetups  #R\stoprawsetups  #+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
588\def\syst_setups_start_loc_two#1#2#L\startlocalsetups#R\stoplocalsetups#+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
589\def\syst_setups_start_tex_two#1#2#L\startsetups     #R\stopsetups     #+{\endgroup\instance\syst_setups_defcsname\??setup#1:#2\endcsname##1{#3}}
590
591\tolerant\def\syst_setups_start_lua_yes[#1]#*[#2]%
592  {\expand\t_syst_setups_lua
593   \ifarguments\expandafter\syst_setups_start_lua_one
594   \or         \expandafter\syst_setups_start_lua_one
595   \else       \expandafter\syst_setups_start_lua_two
596   \fi{#1}{#2}}
597
598\tolerant\def\syst_setups_start_xml_yes[#1]#*[#2]%
599  {\expand\t_syst_setups_xml
600   \ifarguments\expandafter\syst_setups_start_xml_one
601   \or         \expandafter\syst_setups_start_xml_one
602   \else       \expandafter\syst_setups_start_xml_two
603   \fi{#1}{#2}}
604
605\tolerant\def\syst_setups_start_raw_yes[#1]#*[#2]%
606  {\expand\t_syst_setups_raw
607   \ifarguments\expandafter\syst_setups_start_raw_one
608   \or         \expandafter\syst_setups_start_raw_one
609   \else       \expandafter\syst_setups_start_raw_two
610   \fi{#1}{#2}}
611
612\tolerant\def\syst_setups_start_loc_yes[#1]#*[#2]%
613  {\expand\t_syst_setups_loc
614   \ifarguments\expandafter\syst_setups_start_loc_one
615   \or         \expandafter\syst_setups_start_loc_one
616   \else       \expandafter\syst_setups_start_loc_two
617   \fi{#1}{#2}}
618
619\tolerant\def\syst_setups_start_tex_yes[#1]#*[#2]%
620  {\expand\t_syst_setups_tex
621   \ifarguments\expandafter\syst_setups_start_tex_one
622   \or         \expandafter\syst_setups_start_tex_one
623   \else       \expandafter\syst_setups_start_tex_two
624   \fi{#1}{#2}}
625
626\def\syst_setups_start_lua_nop#1 {\expand\t_syst_setups_lua\syst_setups_start_lua_two{}{#1}} % space delimited
627\def\syst_setups_start_xml_nop#1 {\expand\t_syst_setups_xml\syst_setups_start_xml_two{}{#1}} % space delimited
628\def\syst_setups_start_raw_nop#1 {\expand\t_syst_setups_raw\syst_setups_start_raw_two{}{#1}} % space delimited
629\def\syst_setups_start_loc_nop#1 {\expand\t_syst_setups_loc\syst_setups_start_loc_two{}{#1}} % space delimited
630\def\syst_setups_start_tex_nop#1 {\expand\t_syst_setups_tex\syst_setups_start_tex_two{}{#1}} % space delimited
631
632\def\syst_setups_start_lua_one#1#2{\syst_setups_start_lua_two{}{#1}} % [..]
633\def\syst_setups_start_xml_one#1#2{\syst_setups_start_xml_two{}{#1}} % [..]
634\def\syst_setups_start_raw_one#1#2{\syst_setups_start_raw_two{}{#1}} % [..]
635\def\syst_setups_start_loc_one#1#2{\syst_setups_start_loc_two{}{#1}} % [..]
636\def\syst_setups_start_tex_one#1#2{\syst_setups_start_tex_two{}{#1}} % [..]
637
638\permanent\def\luasetup#1{\ctxlua{\syst_setups{#1}}}
639
640%D System setups:
641
642\aliased\let\systemsetupsprefix\wildcardsymbol
643
644\permanent\def\systemsetups#1{\syst_setups{\systemsetupsprefix#1}}
645
646\permanent\tolerant\protected\def\resetsetups[#1]#;#2%
647  {\ifcsname\??setup\ifgridsnapping\v!grid\fi:#1#2\endcsname
648     \dodoglobal\undefinevalue{\??setup\ifgridsnapping\v!grid\fi:#1#2}%
649   \else
650     \dodoglobal\undefinevalue{\??setup:#1#2}%
651   \fi}
652
653\permanent\tolerant\protected\def\copysetups[#1]#*[#2]%
654  {\ifcsname\??setup:#2\endcsname
655      \letcsname\??setup:#1\expandafter\endcsname\lastnamedcs
656   \fi}
657
658\permanent\protected\def\showsetupsdefinition[#1]%
659  {\showvalue{\??setup:#1}} % temp hack for debugging
660
661%D \macros
662%D   {setvariables,getvariable,getvariabledefault}
663%D
664%D \starttyping
665%D \setvariables[xx][title=]
666%D \setvariables[xx][title=test test]
667%D \setvariables[xx][title=test $x=1$ test]   % fatal error reported
668%D \setvariables[xx][title=test {$x=1$} test]
669%D \setvariables[xx][title]                   % fatal error reported
670%D \setvariables[xx][titletitel=e]
671%D \stoptyping
672
673\installcorenamespace{variables}
674
675\permanent\protected\def\setvariables {\syst_variables_set\getparameters }
676\permanent\protected\def\setevariables{\syst_variables_set\geteparameters}
677\permanent\protected\def\setgvariables{\syst_variables_set\getgparameters}
678\permanent\protected\def\setxvariables{\syst_variables_set\getxparameters}
679
680\mutable\lettonothing\currentvariableclass
681
682\tolerant\def\syst_variables_set#1#*[#2]#*[#S#3]% tricky, test on s-pre-60
683  {\ifcstok{#2}\currentvariableclass
684     #1[\??variables#2:][#3]%
685   \else
686     \pushmacro\currentvariableclass
687     \cdef\currentvariableclass{#2}%
688     \getvariable{#2}\s!reset
689     #1[\??variables#2:][#3]%
690     \getvariable{#2}\s!set
691     \popmacro\currentvariableclass
692   \fi}
693
694\permanent\protected\def\setvariable #1#2#3{\defcsname \??variables#1:#2\endcsname{#3}}
695\permanent\protected\def\setevariable#1#2#3{\edefcsname\??variables#1:#2\endcsname{#3}}
696\permanent\protected\def\setgvariable#1#2#3{\defcsname \??variables#1:#2\endcsname{#3}}
697\permanent\protected\def\setxvariable#1#2#3{\xdefcsname\??variables#1:#2\endcsname{#3}}
698
699\permanent          \def\getvariable #1#2{\begincsname\??variables#1:#2\endcsname}
700\permanent\protected\def\showvariable#1#2{\showvalue{\begincsname\??variables#1:#2\endcsname}}
701
702%D \macros
703%D   {checkvariables}
704%D
705%D I'll probably forget that this on exists.
706
707% \lettonothing\m_syst_variables_temp
708%
709% \permanent\tolerant\def\checkvariables[#1]#*[#2]%
710%   {\dogetparameters\syst_variables_check_value[#1][#2]}
711%
712% \def\syst_variables_check_value#1#2#3%
713%   {\ifcsname\??variables#1:#2\endcsname
714%      \edef\m_syst_variables_temp{\lastnamedcs}%
715%      \ifempty\m_syst_variables_temp
716%        \defcsname\??variables#1:#2\endcsname{#3}%
717%      \fi
718%    \else
719%      \defcsname\??variables#1:#2\endcsname{#3}%
720%    \fi}
721
722\permanent\protected\def\checkvariables[#1]#*[#S#2]%
723  {\cdef\m_syst_parameter{#1}%
724   \syst_variables_check_value#2\ignorearguments\ignorearguments}
725
726\tolerant\def\syst_variables_check_value#*#1=#S#2,#M,%
727  {\ifarguments
728     \expandafter\gobbleoneargument
729   \or
730     \mult_interfaces_get_parameters_error_indeed\m_syst_parameter{#1}%
731   \orunless\ifcsname\??variables\m_syst_parameter:#1\endcsname
732     \defcsname\??variables\m_syst_parameter:#1\endcsname{#2}%
733   \orelse\ifempty{\lastnamedcs}%
734     \defcsname\??variables\m_syst_parameter:#1\endcsname{#2}%
735   \fi
736   \syst_variables_check_value}
737
738%D \macros
739%D   {doifelsevariable,doifvariable,doifnotvariable}
740%D
741%D A few trivial macros:
742
743\permanent\protected\def\doifelsevariable#1#2%
744  {\ifcsname\??variables#1:#2\endcsname
745     \expandafter\firstoftwoarguments
746   \else
747     \expandafter\secondoftwoarguments
748   \fi}
749
750\aliased\let\doifvariableelse\doifelsevariable
751
752\permanent\protected\def\doifvariable#1#2%
753  {\ifcsname\??variables#1:#2\endcsname
754     \expandafter\firstofoneargument
755   \else
756     \expandafter\gobbleoneargument
757   \fi}
758
759\permanent\protected\def\doifnotvariable#1#2%
760  {\ifcsname\??variables#1:#2\endcsname
761     \expandafter\gobbleoneargument
762   \else
763     \expandafter\firstofoneargument
764   \fi}
765
766%D A few more (we could use a public test variable so that we only need to expand
767%D once, assuming expandable variables):
768
769\letcsname\??variables:\endcsname\empty
770
771\permanent\protected\def\doifelseemptyvariable#1#2%
772  {\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
773   \ifempty\m_syst_string_one
774     \expandafter\firstoftwoarguments
775   \else
776     \expandafter\secondoftwoarguments
777   \fi}
778
779\aliased\let\doifemptyvariableelse\doifelseemptyvariable
780
781\permanent\protected\def\doifemptyvariable#1#2%
782  {\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
783   \ifempty\m_syst_string_one
784     \expandafter\firstofoneargument
785   \else
786     \expandafter\gobbleoneargument
787   \fi}
788
789\permanent\protected\def\doifnotemptyvariable#1#2%
790  {\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
791   \ifempty\m_syst_string_one
792     \expandafter\gobbleoneargument
793   \else
794     \expandafter\firstofoneargument
795   \fi}
796
797\permanent\def\getvariabledefault#1#2% #3% can be command
798  {\ifcsname\??variables#1:#2\endcsname
799     \expandafter\expandafter\expandafter\lastnamedcs\expandafter\gobbleoneargument
800   \else
801     \expandafter\firstofoneargument
802   \fi}
803
804\permanent\tolerant\protected\def\setupenv
805  {\syst_variables_set\getparameters[\s!environment]}
806
807\permanent\protected\def\doifelseenv{\doifelsevariable  \s!environment}
808\permanent\protected\def\doifenv    {\doifvariable      \s!environment}
809\permanent\protected\def\doifnotenv {\doifnotvariable   \s!environment}
810\permanent          \def\env        {\getvariable       \s!environment}
811\permanent          \def\envvar     {\getvariabledefault\s!environment}
812
813\aliased\let\doifenvelse\doifelseenv
814
815%D \macros
816%D   {defineselector,setupselector,select,directselect}
817%D
818%D \starttyping
819%D \defineselector[caption][max=2,n=2]
820%D
821%D \start
822%D     \setupselector[caption][n=1]
823%D     \placelist[figure][criterium=all]
824%D \stop
825%D
826%D \starttext
827%D     \placefigure
828%D       {\select{caption}{zapf}{\input zapf \relax}}
829%D       {}
830%D \stoptext
831%D \stoptyping
832
833\installcorenamespace{selector}
834
835\permanent\tolerant\protected\def\defineselector[#1]#*[#2]{\getparameters[\??selector#1][\c!max=\plusone,\c!n=\plusone,#2]}
836\permanent\tolerant\protected\def\setupselector [#1]#*[#2]{\getparameters[\??selector#1][#2]}
837
838\permanent\def\directselect#1% expandable
839  {\expandafter\filterfromnext
840     \csname\??selector\ifcsname\??selector#1\c!max\endcsname#1\fi\c!max\expandafter\endcsname
841     \csname\??selector\ifcsname\??selector#1\c!n  \endcsname#1\fi\c!n  \endcsname}
842
843\permanent\protected\let\select\directselect % we promote to protected
844
845\letcsname\??selector\c!max\endcsname\plusone
846\letcsname\??selector\c!n  \endcsname\plusone
847
848\protect \endinput
849