x-setups-basics.mkiv /size: 37 Kb    last modification: 2025-02-21 11:03
1%D \module
2%D   [       file=setups-basics, % x-set-11,
3%D        version=2016.04.05, % 2004.10.31,
4%D         remark=setupx.tex: 1998.07.20 and later,
5%D          title=\CONTEXT\ Setup Definitions,
6%D       subtitle=Macro Definitions,
7%D         author={Hans Hagen & Wolfgang Schuster},
8%D           date=\currentdate,
9%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
10%C
11%C This module is part of the \CONTEXT\ macro||package and is
12%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
13%C details.
14
15%D We can make this module a bit cleaner using more recent features or we go \LUA\
16%D completely but as this style evolved over 15 years it's a waste of time.
17%D
18%D Thanks to Wolfgang these descriptions have become quite complete! In the process
19%D of covering more commands and expecially different instances of the same command,
20%D either or not generated, the supporting macros became more complex. I must admit
21%D that it's not the nicest code base and whenever I have to add or patch something
22%D I have to suppress the urge to rewrite this file. It needs watching a few
23%D energetic videos (for instance with Simon Phillips drumming) to get going.
24%D
25%D As we also have a help server we can make a common framework for this \unknown\
26%D but even then, this file is also a test for the the \XML\ processor.
27%D
28%D Traditionally we used the sorter to generate the lists while nowadays we can
29%D as well use the \XML\ mechanisms directly. We cannot change too much because
30%D manuals depend on it.
31%D
32%D Currently we load the \XML\ file and when not in the english interface we just
33%D remap the relevant words to their translation.
34%D
35%D If you notice something that needs fixing, you can send a message to the mailing
36%D list.
37
38%D \startbuffer
39%D \usemodule[x-setups-basics]
40%D
41%D \loadsetups[context-en]
42%D
43%D \starttext
44%D
45%D     \showsetup[starttyping:instance:LUA]
46%D
47%D     \showsetup[starttyping:instance:typing]
48%D
49%D     \showsetup[starttyping:instance:argument]
50%D
51%D     \showsetup [completelistoffloats:instance:chemicals] \blank
52%D     \shortsetup[completelistoffloats:instance:chemicals] \blank
53%D     \basicsetup[completelistoffloats:instance:chemicals] \blank
54%D
55%D     \cmdfullsetup [completelistoffloats:instance:chemicals] \blank
56%D     \cmdshortsetup[completelistoffloats:instance:chemicals] \blank
57%D     \cmdbasicsetup[completelistoffloats:instance:chemicals] \blank
58%D
59%D   % \cmdinternal{...}
60%D
61%D     \page \placeeverysetup     \page
62%D     \page \placeeverysetupname \page
63%D
64%D \stoptext
65%D \stopbuffer
66
67% Todo: use lua instead of synonyms
68
69\unprotect
70
71% We might apply this locally!
72
73\setupxml
74  [\c!entities=\v!yes]
75
76% So far.
77
78\defineregister
79  [texmacro]
80
81\definesorting
82  [texcommand]
83  [texcommands]
84  [\v!none]
85
86\setupsorting
87  [texcommand]
88  [\c!command=\showsetupinlist,
89   \c!criterium=\setupparameter\c!criterium]
90
91\pushmacro\setuptext
92
93\ifcase\contextlmtxmode \else \pushoverloadmode \let\setuptext\setuptext \popoverloadmode \fi
94
95\defineframedtext % todo commands=no
96  [setuptext]
97  [\c!width=\hsize,
98   \c!height=\v!fit,
99   \c!align=\v!right,
100   \c!offset=0.75\emwidth] % \exheight
101
102\popmacro\setuptext
103
104\installcorenamespace{interfacesetup}
105
106\installsetuponlycommandhandler \??interfacesetup {setup} % \??interfacesetup
107
108\setupsetup
109  [\c!before=,
110   \c!after=,
111   \c!command=\setup,
112   \c!criterium=\v!used]
113
114%D General:
115
116\unexpanded\def\setupnumfont {}
117\unexpanded\def\setuptxtfont {}
118\unexpanded\def\setupintfont {\WORD}
119\unexpanded\def\setupvarfont {\sl}
120\unexpanded\def\setupoptfont {\sl}
121\unexpanded\def\setupalwcolor{}
122\unexpanded\def\setupoptcolor{darkgray}
123
124\unexpanded\def\setupvarword#1{\detokenize{#1}}
125\unexpanded\def\setupintword#1{\WORD{\detokenize{#1}}}
126\unexpanded\def\setuptxtword#1{\detokenize{#1}}
127
128\unexpanded\def\cmd_internal_value#1%
129  {\dontleavehmode
130   \begingroup
131   \setupintfont{#1}%
132   \endgroup}
133
134\unexpanded\def\cmd_text_value#1%
135  {\dontleavehmode
136   \begingroup
137   \setupvarfont{#1}%
138   \endgroup}
139
140\unexpanded\def\cmd_command_value#1%
141  {\begingroup
142   \setupvarfont{#1}%
143   \endgroup}
144
145%D Loading:
146
147\let\currentSETUPfullname\s!unknown
148
149\startxmlsetups xml:setups:assemblename
150    \doifelse {\xmlatt{#1}{type}} {environment} {
151        \doifsomethingelse {\xmlatt{#1}{begin}} {
152            \edef\currentSETUPprefix{\xmllastatt}%
153        } {
154            \let\currentSETUPprefix\e!start
155        }
156    } {
157        \let\currentSETUPprefix\empty
158    }
159    \edef\currentSETUPname{\xmlatt{#1}{name}}
160    \doifelsenothing {\xmlatt{#1}{variant}} {
161        \let\currentSETUPvariant\empty
162    } {
163        \def\currentSETUPvariant{:\xmllastatt}
164    }
165    \edef\currentSETUPfullname {
166        \currentSETUPprefix
167        \currentSETUPname
168        \currentSETUPvariant
169    }
170\stopxmlsetups
171
172\startxmlsetups xml:setups:assemblename:instance
173    \doifelse {\xmlatt{#1}{type}} {environment} {
174        \doifsomethingelse {\xmlatt{#1}{begin}} {
175            \edef\currentSETUPprefix{\xmllastatt}%
176        } {
177            \let\currentSETUPprefix\e!start
178        }
179    } {
180        \let\currentSETUPprefix\empty
181    }
182    \edef\currentSETUPname{\xmlatt{#1}{name}}
183    \doifelsenothing {\xmlatt{#1}{variant}} {
184        \let\currentSETUPvariant\empty
185    } {
186        \def\currentSETUPvariant{:\xmllastatt}
187    }
188    \edef\currentSETUPfullname {
189        \currentSETUPprefix
190        \currentSETUPname
191        \currentSETUPvariant
192    }
193\stopxmlsetups
194
195\startxmlsetups xml:setups:register
196    \doifcommon {\xmlatt{#1}{variant}} {instance,instance:assignment,instance:ownnumber,instance:argument} {
197        \def\docommand##1{
198            \xmlsetup{#1}{xml:setups:assemblename:instance}
199            \expanded{\texcommand[\currentSETUPfullname:##1]{{#1}{##1}}}
200        }%
201        \processcommacommand[\clf_getinstances{#1}]\docommand
202    }
203    \xmlsetup{#1}{xml:setups:assemblename}
204    \expanded{\texcommand[\currentSETUPfullname]{{#1}{}}}
205\stopxmlsetups
206
207\startluacode
208
209    local find, gsub = string.find, string.gsub
210
211    local xmlcollected   = xml.collected
212    local xmlcount       = xml.count
213    local xmlfirst       = xml.first
214
215    local lxmlgetid      = lxml.getid
216    local lxmlflush      = lxml.flush
217
218    local context        = context
219
220    local setupvarword   = context.formatted.setupvarword
221    local setupintword   = context.formatted.setupintword
222    local setuptxtword   = context.formatted.setuptxtword
223
224    local getsetupstring = interfaces.getsetupstring
225
226    -- normally a lookup is fast enough but here we can have many setups
227    -- spread over many files so we do a little speedup here
228
229    local setups       = moduledata.setups or { }
230    moduledata.setups  = setups
231    local definitions  = { }
232    setups.definitions = definitions
233
234    local report       = logs.reporter("command setup")
235    local report_known = logs.reporter("command setup","known")
236
237    function xml.functions.setups_define(id)
238        local x = lxmlgetid(id)
239        for c in xmlcollected(x,"cd:interface/cd:define") do
240            definitions[c.at.name] = c
241        end
242        for c in xmlcollected(x,"cd:interface/cd:interface") do
243            c.at.file = c.__f__
244            c.at["xmlns:cd"] = nil
245         -- c.dt[#c.dt+1] = "    "
246        end
247
248        local interface = interfaces.currentinterface or "en"
249
250        if interface ~= "en" then
251
252            local constants  = interfaces.complete.constants
253            local variables  = interfaces.complete.variables
254            local commands   = interfaces.complete.commands
255            local elements   = interfaces.complete.elements
256
257            local function replace(pattern,attribute,one,two,three)
258                for e in xmlcollected(x,pattern) do
259                    local a = e.at
260                    local t = a[attribute]
261                    if t then
262                        local c = one[t] or (two and two[t]) or (three and three[t])
263                        if c then
264                            local v = c[interface]
265                            if v then
266                                a[attribute] = v
267                            end
268                        end
269                    end
270                end
271            end
272
273            replace('cd:command',   'name',    commands, elements, variables)
274            replace('cd:string',    'value',   commands, elements)
275            replace('cd:variable' , 'value',   variables)
276
277            replace('cd:parameter', 'name',    constants)
278            replace('cd:constant',  'type',    variables)
279            replace('cd:constant',  'default', variables)
280            replace('cd:variable',  'type',    variables)
281            replace('cd:inherit',   'name',    commands, elements)
282
283            replace('cd:instances/cd:constant', 'value', variables)
284        end
285
286        if tex.modes["setups:save"] and environment.currentrun == 1 then
287            --
288            -- the reload is a hack .. we could make a handler instead
289            --
290            local filename = "context-" .. interface .. ".xml"
291            local xmlroot  = x
292            local xmlblob  = tostring(xmlroot)
293            io.savedata(filename,xmlblob)
294            xmlroot = xml.load(filename)
295            --
296            local definitions = { }
297            for e in xml.collected(xmlroot,"cd:interface/cd:define") do
298                definitions[e.at.name] = e.dt
299            end
300            local function resolve(root)
301                for e in xmlcollected(root,"*") do
302                    if e.tg == "resolve" then
303                        local name = e.at.name or ""
304                        local resolved = definitions[name]
305                        if resolved then
306                            e.__p__.dt[e.ni] = resolved
307                            resolve(resolved)
308                         -- report("resolved: %a",name)
309                        else
310                            report("unable to resolve: %a",name)
311                        end
312                    end
313                end
314            end
315            resolve(xmlroot)
316            for e in xml.collected(xmlroot,"cd:interface/cd:define") do
317                e.__p__.dt[e.ni] = ""
318            end
319            --
320            xml.delete(xmlroot,"/cd:interface/cd:interface[@file='i-common-definitions.xml']")
321            --
322            xmlblob = xml.tostring(xmlroot)
323            io.savedata(filename,xmlblob)
324            xmlroot = xml.load(filename)
325            --
326            local spacer = utilities.strings.newrepeater(" ")
327            local function simplify(dt,n)
328                local nt, nn = { }, 0
329                for i=1,#dt do
330                    local d = dt[i]
331                    if d.special then
332                        --
333                    elseif type(d) ~= "string" then
334                        d.dt = simplify(d.dt,n+1)
335                        nn = nn + 1 nt[nn] = "\n" .. spacer[n]
336                        nn = nn + 1 nt[nn] = d
337                        nn = nn + 1 nt[nn] = "\n" .. spacer[n-1]
338                    end
339                end
340                return nn == 0 and "" or nt
341            end
342            xmlroot.dt = simplify(xmlroot.dt,0)
343            --
344            xmlblob = "<?xml version='1.0'?>\n<!-- expanded and compacted i-context.xml -->\n" .. xml.tostring(xmlroot)
345            xmlblob = gsub(xmlblob,"\n *\n","\n")
346            io.savedata(filename,xmlblob)
347        end
348    end
349
350    function moduledata.setups.resolved(name)
351        lxmlflush(definitions[name])
352    end
353
354    function xml.finalizers.s_count(collected)
355        local n = 0
356        for i=1,#collected do
357            local c = collected[i]
358            local tg = c.tg
359            if tg == "resolve" then
360                local d = definitions[c.at.name]
361                n = n + xmlcount(d,"/*")
362            elseif tg == "delimiter" then
363                -- skip
364            else
365                n = n + 1
366            end
367        end
368        context(n)
369    end
370
371    local function getinstances(id)
372        local t = { }
373        local x = lxmlgetid(id)
374        local r = xmlfirst(x,"/instances/resolve")
375        if r then
376            local x = setups.definitions[r.at.name]
377            for c in xmlcollected(x,"constant") do
378                t[#t+1] = c.at.value
379            end
380        else
381            for c in xmlcollected(x,"/instances/constant") do
382                t[#t+1] = c.at.value
383            end
384        end
385        return t
386    end
387
388    interfaces.implement {
389        name      = "getsetupstring",
390        actions   = function(s)
391            local g = getsetupstring(s)
392            if not find(s,"^cd:") then
393                setuptxtword(g)
394            elseif find(s,"%-.$") then -- singular | plural
395                setupvarword(g)
396            else
397                setupintword(g) -- cap
398            end
399        end,
400        overload  = true,
401        arguments = "string",
402    }
403
404    interfaces.implement {
405        name      = "rawsetupstring",
406        actions   = { getsetupstring, context },
407        overload  = true,
408        arguments = "string",
409    }
410
411    interfaces.implement {
412        name      = "getinstances",
413        actions   = { getinstances, function(t) context("%,t",t) end },
414        overload  = true,
415        arguments = { "string" },
416    }
417
418    local trace  = false  trackers.register("setups.trace", function(v) trace = v end)
419
420    if trace and structures then
421        local synonyms = structures.synonyms
422        if synonyms then
423            local collected = synonyms.collected
424            if collected then
425                local texcommand = collected.texcommand
426                if texcommand then
427                    local entries = texcommand.entries
428                    if entries then
429                        local t = { }
430                        local n = #entries
431                        for i=1,n do
432                            t[i] = entries[i].definition.tag
433                        end
434                        table.sort(t)
435                        for i=1,n do
436                            report_known(t[i])
437                        end
438                    end
439                end
440            end
441        end
442    end
443\stopluacode
444
445% <?xml version="1.0" encoding="UTF-8"?>
446%
447% <cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
448%
449%     <cd:interfacefile filename="i-document.xml"/>
450%     <cd:interfacefile filename="i-file.xml"/>
451%
452% </cd:interface>
453
454\startxmlsetups xml:setups:interfacefile
455    \loadsetups[\xmlatt{#1}{filename}]
456\stopxmlsetups
457
458\startxmlsetups xml:setups:basics
459    \xmlincludeoptions{#1}{interfacefile|include}{filename}{recurse,basename}
460    \xmlsetsetup{#1}{*}{xml:setups:*}
461    \xmlfunction{#1}{setups_define}
462\stopxmlsetups
463
464\xmlregisterdocumentsetup{setups}{xml:setups:basics}
465
466\let\loadedsetups\empty % we load more setups, setups:<name>
467
468\unexpanded\def\loadsetups
469  {\dosingleempty\cmd_load_setups}
470
471\def\cmd_load_setups[#1]%
472  {\edef\m_cmd_asked_setups{#1}%
473   \doifnotmode{no-setup-main}{\def\m_cmd_asked_setups{i-context.xml}}%
474   \ifx\m_cmd_asked_setups\empty \else
475     \doonlyonce{setups:#1}
476       {\doglobal\prependtocommalist{setups:#1}\loadedsetups
477        \edef\currentloadedsetup{#1}%
478        \doiffileexistselse{#1}
479           {\xmlloadonly{setups:#1}{#1}{setups}}%
480           {\xmlloadonly{setups:#1}{#1.xml}{setups}}%
481        % qualified path saves > 50% runtime
482        \xmlfilter{setups:#1}{/interface//command/command(xml:setups:register)}}%
483   \fi}
484
485\newconstant   \c_cmd_kind
486\newconditional\c_cmd_doing_line
487\newconditional\c_cmd_measuring
488\newconditional\c_cmd_show_setup
489\newcount      \c_cmd_current_argument
490\newcount      \c_cmd_maximum_argument
491\newdimen      \d_cmd_current_width
492\let           \m_cmd_current_hash      \empty
493\let           \m_cmd_current_file      \empty
494
495% todo: use different names (and a backward compatible extra module then)
496
497\unexpanded\def\basicsetup{\c_cmd_kind\zerocount\cmd_show_setup}
498\unexpanded\def\shortsetup{\c_cmd_kind\plusone  \cmd_show_setup}
499%unexpanded\def\setup     {\c_cmd_kind\plustwo  \cmd_show_setup}
500\unexpanded\def\showsetup {\c_cmd_kind\plustwo  \cmd_show_setup}
501
502\ifcase\contextlmtxmode \else
503    \pushoverloadmode
504        \unexpanded\def\setup{\c_cmd_kind\plustwo\cmd_show_setup}
505    \popoverloadmode
506\fi
507
508\unexpanded\def\showsetupinlist#1#2#3%
509  {%(#1)(#2)(#3)\par
510   \edef\m_cmd_instance{\secondoftwoarguments#3}%
511   \c_cmd_kind\plustwo
512   \xmlsetup{\firstoftwoarguments#3}{xml:setups:typeset}%
513   \let\m_cmd_instance\empty
514   \par}
515
516\unexpanded\def\showsetupnameonly#1#2#3%
517  {\edef\m_cmd_instance{\secondoftwoarguments#3}%
518   \c_cmd_kind\plustwo
519   \xmlsetup{\firstoftwoarguments#3}{xml:setups:assemblename}%
520   \let\m_cmd_instance\empty
521   \texescape\currentSETUPfullname}
522
523\installtextracker
524  {cmd.showsetup}
525  {\settrue\c_cmd_show_setup}
526  {\setfalse\c_cmd_show_setup}
527
528\unexpanded\def\cmd_show_setup
529  {\doifelsenextoptionalcs\cmd_show_setup_yes\cmd_show_setup_nop}
530
531\def\cmd_show_setup_yes[#1]%
532  {\cmd_show_setup_nop{#1}}
533
534\def\cmd_show_setup_nop#1% this will trigger 'used'
535  {\begingroup
536   \registersort[texcommand][#1]%
537   \ifconditional\c_cmd_show_setup
538     \writestatus{setup}{#1 / \rawsynonymname{texcommand}{#1}}%
539   \fi
540   \startelement[setup][name=#1]%
541     \startelement[noexport][comment={setup definition #1}]%
542       \edef\cmd_id{\rawsynonymname{texcommand}{#1}}%
543       \ifx\cmd_id\empty
544          missing: #1
545       \else
546         \ifx\m_cmd_instance\empty
547           \edef\m_cmd_instance{\expandafter\secondoftwoarguments\cmd_id}%
548         \fi
549         \xmlsetup{\expandafter\firstoftwoarguments\cmd_id}{xml:setups:typeset}
550         \let\m_cmd_instance\empty
551       \fi
552     \stopelement
553   \stopelement
554   \endgroup}
555
556\unexpanded\def\placesetup    {\placelistofsorts[texcommand][\c!criterium=\v!used]}
557\unexpanded\def\placeallsetups{\placelistofsorts[texcommand][\c!criterium=\v!all ]}
558
559% todo: grouped
560
561\let\placeeverysetup\placeallsetups
562
563\unexpanded\def\cmd_show_setup_list_basic#1#2#3%
564  {\NC\tttf#2\NC\basicsetup[#2]\NC\NR}
565
566\unexpanded\def\placeeverysetupname
567  {\placelistofsorts
568     [texcommand]
569     [\c!before={\starttabulate[|||]},
570      \c!after=\stoptabulate,
571      \c!criterium=\v!all,
572      \c!command=\cmd_show_setup_list_basic]}
573
574%D Typesetting:
575
576\startxmlsetups xml:setups:typeset
577    \doifelsenothing {#1} {
578        \xmlsetup{#1}{xml:setups:typeset:nop}
579    } {
580        \xmlsetup{#1}{xml:setups:typeset:yes}
581    }
582\stopxmlsetups
583
584\startxmlsetups xml:setups:typeset:nop
585    \blank
586    {\tttf MISSING SETUP}
587    \blank
588\stopxmlsetups
589
590\startxmlsetups xml:setups:make:string
591    \xmlatt{#1}{value}
592\stopxmlsetups
593
594\startxmlsetups xml:setups:make:instance
595    \ifx\m_cmd_instance\empty
596        \setupintfont{\xmlatt{#1}{value}}
597    \else
598        \m_cmd_instance
599    \fi
600\stopxmlsetups
601
602\startxmlsetups xml:setups:make:variable
603    \setupintfont{\xmlatt{#1}{value}}
604\stopxmlsetups
605
606\let\m_cmd_current_hash\empty
607\let\m_cmd_current_file\empty
608\let\m_cmd_font        \empty
609\let\m_cmd_name        \empty
610\let\m_cmd_start       \empty
611\let\m_cmd_stop        \empty
612\let\m_cmd_instance    \empty
613
614\startxmlsetups xml:setups:make:prepare
615    \edef\m_cmd_current_hash{\xmlatt{#1}{hash}}
616    \xdef\m_cmd_current_file{\xmlatt{#1}{file}}%
617    \xmldoifelseempty{#1}{/sequence} {
618        \edef\m_cmd_name{\xmlatt{#1}{name}}
619    } {
620        \edef\m_cmd_name{\xmlfilter{#1}{/sequence/(string|variable|instance)/command(xml:setups:make:*)}}
621    }
622    \doifelse {\xmlatt{#1}{type}} {environment} {
623        \doifsomethingelse {\xmlatt{#1}{begin}} {
624            \edef\m_cmd_start{\xmllastatt}
625        } {
626            \let\m_cmd_start\e!start
627        }
628        \doifsomethingelse {\xmlatt{#1}{end}} {
629            \edef\m_cmd_stop{\xmllastatt}
630        } {
631            \let\m_cmd_stop\e!stop
632        }
633    } {
634        \let\m_cmd_start\empty
635        \let\m_cmd_stop \empty
636    }
637    \doifelse {\xmlatt{#1}{generated}} {yes} {
638        \let\m_cmd_font\ttsl
639    } {
640        \let\m_cmd_font\relax
641    }
642\stopxmlsetups
643
644\startsetups xml:setups:make:start
645    \bgroup
646        \settrue\c_cmd_doing_line
647        \m_cmd_font
648        \letterbackslash
649        \m_cmd_start
650        \m_cmd_name
651        \ignorespaces
652    \egroup
653\stopsetups
654
655\startsetups xml:setups:make:stop
656    \ifx\m_cmd_stop\empty \else
657        \bgroup
658            \settrue\c_cmd_doing_line
659            \hskip.5em\unknown\hskip.5em
660            \m_cmd_font
661            \letterbackslash
662            \m_cmd_stop
663            \m_cmd_name
664            \ignorespaces
665        \egroup
666    \fi
667\stopsetups
668
669\startxmlsetups xml:setups:typeset:line
670    \ttbf
671    \nohyphens
672    \xmlsetup{#1}{xml:setups:make:prepare}
673    \directsetup{xml:setups:make:start}
674    \xmldoif{#1}{/arguments} {
675        \bgroup
676            \settrue\c_cmd_doing_line
677            \global\c_cmd_current_argument\zerocount
678            \ignorespaces
679            \xmlfilter{#1}{/arguments/text()}
680        \egroup
681    }
682    \directsetup{xml:setups:make:stop}
683\stopxmlsetups
684
685\startxmlsetups xml:setups:typeset:raw
686    \nohyphens
687    \veryraggedright
688    \global\c_cmd_current_argument\zerocount
689    \global\c_cmd_maximum_argument0\xmlfilter{#1}{/arguments/*/s_count()}\relax
690    \xmlsetup{#1}{xml:setups:make:prepare}
691    \ttbf
692    \directsetup{xml:setups:make:start}
693    \xmldoif{#1}{/arguments} {
694        \settrue\c_cmd_doing_line
695        \bgroup
696            \tttf
697            \global\c_cmd_current_argument\zerocount
698            \ignorespaces
699            \xmlfilter{#1}{/arguments/text()}
700        \egroup
701    }
702    \directsetup{xml:setups:make:stop}
703\stopxmlsetups
704
705\startxmlsetups xml:setups:typeset:detail
706    \xmldoif{#1}{/arguments} {
707        \bgroup
708            \setfalse\c_cmd_doing_line
709            \global\c_cmd_current_argument\zerocount
710           %\blank[\v!line] % packed mode (we could do \startunpacked ...)
711%             \godown[.75\lineheight]
712            \blank[\v!samepage,\v!medium]
713            \switchtobodyfont[\v!small]
714            \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf
715        \egroup
716    }
717\stopxmlsetups
718
719\startxmlsetups xml:setups:instance
720    \doifelse {\xmltag{#1}} {resolve} {
721        \ctxlua{lxml.command(moduledata.setups.definitions['\xmlatt{#1}{name}'],"constant","xml:setups:instance")}
722    } {
723        \xmlatt{#1}{value}\enskip % we need a break
724    }
725\stopxmlsetups
726
727\startxmlsetups xml:setups:typeset:instances
728    \ifx\m_cmd_instance\empty
729        \xmldoif{#1}{/instances} {
730%             \godown[.75\lineheight]
731            \blank[\v!samepage,\v!medium]
732            {\ttbf instances:}
733            \enspace
734            \xmlfilter{#1}{/instances/(constant|resolve)/command(xml:setups:instance)}
735            \removeunwantedspaces
736        }
737    \fi
738\stopxmlsetups
739
740\startsetups xml:setups:start
741    \csname\e!start setuptext\endcsname
742\stopsetups
743
744\startsetups xml:setups:stop
745    \csname\e!stop setuptext\endcsname
746\stopsetups
747
748\startxmlsetups xml:setups:typeset:yes
749    \forgetparskip
750    \glet\m_cmd_current_file\empty
751    \ifcase\c_cmd_kind
752        \xmlsetup{#1}{xml:setups:typeset:line}
753    \or
754        \directsetup{xml:setups:start}
755        \xmlsetup{#1}{xml:setups:typeset:raw}
756        \directsetup{xml:setups:stop}
757    \or
758        \directsetup{xml:setups:start}
759        \xmlsetup{#1}{xml:setups:typeset:raw}
760        \endgraf
761        \xmlsetup{#1}{xml:setups:typeset:detail}
762        \endgraf
763        \xmlsetup{#1}{xml:setups:typeset:instances}
764        \directsetup{xml:setups:stop}
765    \fi
766    \glet\m_cmd_current_file\empty
767\stopxmlsetups
768
769\startsetups xml:setups:overlay:file
770    \vbox to \overlayheight \bgroup
771        \infofont
772        \vfill
773        \scratchdimen.5\exheight
774        \hbox to \overlaywidth \bgroup
775            \strut
776            \hss
777            \m_cmd_current_file
778            \hskip\dimexpr\scratchdimen+\strutdp\relax
779        \egroup
780        \vskip\scratchdimen
781    \egroup
782\stopsetups
783
784\defineoverlay
785  [setupfilename]
786  [\directsetup{xml:setups:overlay:file}]
787
788\startxmlsetups xml:setups:resolve
789    \ignorespaces
790    \ctxlua{moduledata.setups.resolved('\xmlatt{#1}{name}')}
791\stopxmlsetups
792
793%D This is the first pass; here we generate the top line.
794
795\startxmlsetups xml:setups:define
796    \ignorespaces\xmlflush{#1}
797\stopxmlsetups
798
799\startxmlsetups xml:setups:sequence
800    \ignorespaces\xmlflush{#1}
801\stopxmlsetups
802
803\startxmlsetups xml:setups:string
804    \xmlatt{#1}{value}\ignorespaces
805\stopxmlsetups
806
807\startxmlsetups xml:setups:delimiter
808    \ifconditional\c_cmd_doing_line
809        \kern.5\emwidth
810        \letterbackslash\xmlatt{#1}{name}
811    \fi
812    \ignorespaces
813\stopxmlsetups
814
815\startxmlsetups xml:setups:csname      \show_setup_component{#1}{csname}     \stopxmlsetups
816\startxmlsetups xml:setups:content     \show_setup_component{#1}{content}    \stopxmlsetups
817\startxmlsetups xml:setups:position    \show_setup_component{#1}{position}   \stopxmlsetups
818\startxmlsetups xml:setups:index       \show_setup_component{#1}{index}      \stopxmlsetups
819\startxmlsetups xml:setups:text        \show_setup_component{#1}{text}       \stopxmlsetups
820\startxmlsetups xml:setups:apply       \show_setup_component{#1}{apply}      \stopxmlsetups
821\startxmlsetups xml:setups:template    \show_setup_component{#1}{template}   \stopxmlsetups
822\startxmlsetups xml:setups:triplet     \show_setup_component{#1}{triplet}    \stopxmlsetups
823\startxmlsetups xml:setups:angles      \show_setup_component{#1}{angles}     \stopxmlsetups
824
825%startxmlsetups xml:setups:displaymath \show_setup_component{#1}{displaymath}\stopxmlsetups
826%startxmlsetups xml:setups:math        \show_setup_component{#1}{math}       \stopxmlsetups
827%startxmlsetups xml:setups:nothing     \show_setup_component{#1}{nothing}    \stopxmlsetups
828%startxmlsetups xml:setups:file        \show_setup_component{#1}{file}       \stopxmlsetups
829%startxmlsetups xml:setups:reference   \show_setup_component{#1}{reference}  \stopxmlsetups
830%startxmlsetups xml:setups:destination \show_setup_component{#1}{destination}\stopxmlsetups
831%startxmlsetups xml:setups:word        \show_setup_component{#1}{word}       \stopxmlsetups
832%startxmlsetups xml:setups:twowords    \show_setup_component{#1}{twowords}   \stopxmlsetups
833%startxmlsetups xml:setups:threewords  \show_setup_component{#1}{threewords} \stopxmlsetups
834
835% todo: cd:par => \par
836% todo: cd:sep => \\
837
838\unexpanded\def\show_setup_component#1#2%
839  {\ifconditional\c_cmd_doing_line
840     \getvalue{show_setup_#2}{#1}%
841   \else
842     \simpleSETUPargument{#2}%
843   \fi}
844
845%D This is the second pass; here we generate the table.
846
847\unexpanded\def\cmd_column_one_start
848  {\bgroup
849   \scratchdimen2\emwidth
850   \advance\leftskip \scratchdimen
851   \noindent\llap{\hbox to \scratchdimen{\show_setup_number\hss}}%
852   \strut}
853
854\unexpanded\def\cmd_column_one_stop
855  {\endgraf
856   \egroup}
857
858\unexpanded\def\cmd_column_two_start#1#2%
859  {\bgroup
860   \scratchdimen2.5\emwidth
861   \advance\hangindent\dimexpr\d_cmd_current_width+\scratchdimen\relax
862   \noindent \hbox to \hangindent{#1\hss\hbox to \scratchdimen{\hss#2\hss}}%
863   \strut}
864
865\unexpanded\def\cmd_column_two_stop
866  {\endgraf
867   \egroup}
868
869\startxmlsetups xml:setups:assignments
870    \ifconditional\c_cmd_doing_line
871        \ifcase\c_cmd_kind
872            \expandafter\show_setup_line
873        \else
874            \expandafter\show_setup_any
875        \fi{#1}{assignment\xmlattdef{#1}{delimiters}{brackets}}
876    \else
877        \global\d_cmd_current_width\zeropoint
878        \setbox\scratchbox\vbox\bgroup
879            \settrue\c_cmd_measuring
880            \xmlall{#1}{/(parameter|resolve)}
881        \egroup
882        \global\d_cmd_current_width\themaxboxwidth\scratchbox\relax
883        \cmd_column_one_start
884            \ignorespaces
885            \xmldoifelse {#1} {/(parameter|inherit|resolve)} {
886               \xmlflush{#1}
887            } {
888               \unknown
889            }
890        \cmd_column_one_stop
891%         \godown[.75\lineheight]
892        \blank[\v!samepage,\v!medium]
893        \ignorespaces
894    \fi
895\stopxmlsetups
896
897\startxmlsetups xml:setups:keywords
898    \ifconditional\c_cmd_doing_line
899        \ifcase\c_cmd_kind
900            \expandafter\show_setup_line
901        \else
902            \expandafter\show_setup_any
903        \fi{#1}{\xmlattdef{#1}{delimiters}{brackets}}
904    \else
905        \cmd_column_one_start
906            \ignorespaces
907            \xmlflush{#1}
908        \cmd_column_one_stop
909%         \godown[.75\lineheight]
910        \blank[\v!samepage,\v!medium]
911        \ignorespaces
912    \fi
913\stopxmlsetups
914
915\startxmlsetups xml:setups:parameter
916    \ifconditional\c_cmd_measuring
917      \getsetupstring{\xmlatt{#1}{name}}\par
918    \else
919      \cmd_column_two_start{\getsetupstring{\xmlatt{#1}{name}}}{=}
920            \ignorespaces
921            \xmlflush{#1}
922            \doifmode{interface:setup:defaults} {
923                \ifx\m_cmd_current_hash\empty \else
924                    \begingroup
925                        % todo, make a one level expansion of parameter
926                        \let\emwidth \relax
927                        \let\exheight\relax
928                        \edef\temp{\csname named\m_cmd_current_hash parameter\endcsname\empty{\xmlatt{#1}{name}}}
929                        \ifx\temp\empty \else
930                            =\space
931                            \detokenize\expandafter{\temp}
932                        \fi
933                    \endgroup
934                \fi
935            }
936        \cmd_column_two_stop
937    \fi
938    \ignorespaces
939\stopxmlsetups
940
941%xmlmapvalue{setups:method}{class} {:}
942\xmlmapvalue{setups:method}{range} {:}
943\xmlmapvalue{setups:method}{apply} {->}
944\xmlmapvalue{setups:method}{factor}{*}
945\xmlmapvalue{setups:method}{none}  {}
946
947\startxmlsetups xml:setups:constant:value
948    \getsetupstring{\xmlatt{#1}{type}}
949\stopxmlsetups
950
951\definebar % in case we mess with underbar settings
952  [cmd_underbar]
953  [\v!underbar]
954  [\c!foregroundcolor=,
955   \c!foregroundstyle=,
956   \c!color=]
957
958\startxmlsetups xml:setups:constant
959    \doifelsemode {setups-pass-one} {
960    } {
961        \doifsomethingelse{\xmlatt{#1}{prefix}} {
962            \getsetupstring{\xmllastatt}
963            \xmlmappedvalue{setups:method}{\xmlatt{#1}{method}}{none}
964        } {
965            \doif {\xmlatt{#1}{default}} {yes} {
966                \cmd_underbar % next needs to be {braced}
967            }
968        }
969        {\getsetupstring{\xmlatt{#1}{type}}}
970        \space
971        \ignorespaces
972    }
973\stopxmlsetups
974
975\startxmlsetups xml:setups:variable
976    \doifelsemode {setups-pass-one} {
977        \expanded{\setupintfont{\xmlatt{#1}{value}}}\ignorespaces
978    } {
979        \getsetupstring{\xmlatt{#1}{value}}
980        \space
981        \ignorespaces
982    }
983\stopxmlsetups
984
985\startxmlsetups xml:setups:inherit
986  % \cmd_column_two_start{}{}
987        \rawsetupstring{cd:inherits}:
988        \enspace
989        \letterbackslash
990        \xmlatt{#1}{name}
991  % \cmd_column_two_stop
992    \ignorespaces
993\stopxmlsetups
994
995\unexpanded\def\simpleSETUPargument#1%
996  {\cmd_column_one_start
997      \cmd_internal_value{#1}%
998   \cmd_column_one_stop
999 % \godown[.75\lineheight]
1000   \blank[\v!samepage,\v!medium]
1001   \ignorespaces}
1002
1003%D Auxiliary.
1004
1005\unexpanded\def\show_setup_any#1#2%
1006  {\bgroup
1007   \global\advance\c_cmd_current_argument\plusone
1008   \doifelse{\xmlatt{#1}{optional}}{yes}\donetrue\donefalse
1009   \setbox0=\hbox
1010     {\ifdone\sl\fi
1011      \doifelse{\xmlatt{#1}{list}}{yes}
1012        {\getsetupstring{cd:#2-l}}%
1013        {\getsetupstring{cd:#2-s}}}%
1014   \setbox2=\hbox to \wd0
1015     {\hss
1016      \ifcase\c_cmd_kind\else
1017        \ifcase\c_cmd_maximum_argument \relax
1018        \or
1019          \raise1.25\exheight\hbox
1020            {\txx *}%
1021        \else
1022          \raise1.25\exheight\hbox
1023            {\txx\the\c_cmd_current_argument}%
1024         \fi
1025      \fi
1026      \hss}%
1027   \setbox4=\hbox to \wd0
1028     {\hss
1029      \ifdone
1030        \lower2\exheight\hbox
1031          \bgroup
1032            \txx
1033            \getsetupstring{cd:optional}%
1034          \egroup
1035        \hss
1036      \fi}%
1037   \ht2\ht\strutbox
1038   \dp4\dp\strutbox
1039   \hskip.5\emwidth
1040   \wd0\zeropoint
1041   \box0
1042   \wd2\zeropoint
1043   \box2
1044   \box4%
1045   \egroup
1046   \ignorespaces}
1047
1048\unexpanded\def\show_setup_line#1#2%
1049  {\kern.5\emwidth
1050   \getsetupstring{cd:#2-s}%
1051   \ignorespaces}
1052
1053\unexpanded\def\show_setup_number
1054  {\global\advance\c_cmd_current_argument\plusone
1055   \hbox to 2\emwidth
1056     {\ifcase\c_cmd_maximum_argument \relax
1057        \or*\else\the\c_cmd_current_argument
1058      \fi
1059      \hss}}
1060
1061% todo: replace = by lower
1062
1063\unexpanded\def\setupEQsymbol % we raise the number already
1064  {.\lower.25\exheight\hpack{=}.}
1065
1066\unexpanded\def\setupAPPLYsymbol % we raise the number already
1067  {..\lower.25\exheight\hpack{=>}..}
1068
1069% arguments
1070
1071\unexpanded\def\show_setup_csname     #1{\show_setup_any{#1}{noargument}}
1072\unexpanded\def\show_setup_content    #1{\show_setup_any{#1}{content}}
1073\unexpanded\def\show_setup_position   #1{\show_setup_any{#1}{position}}
1074\unexpanded\def\show_setup_index      #1{\show_setup_any{#1}{index}}
1075\unexpanded\def\show_setup_text       #1{\show_setup_any{#1}{textual}}
1076\unexpanded\def\show_setup_apply      #1{\show_setup_any{#1}{apply}}
1077\unexpanded\def\show_setup_template   #1{\show_setup_any{#1}{template}}
1078\unexpanded\def\show_setup_triplet    #1{\show_setup_any{#1}{triplet}}
1079\unexpanded\def\show_setup_angles     #1{\show_setup_any{#1}{angle}}
1080
1081%unexpanded\def\show_setup_displaymath#1{\show_setup_any{#1}{displaymath}}
1082%unexpanded\def\show_setup_math       #1{\show_setup_any{#1}{math}}
1083%unexpanded\def\show_setup_nothing    #1{\show_setup_any{#1}{nothing}}
1084%unexpanded\def\show_setup_file       #1{\show_setup_any{#1}{file}}
1085%unexpanded\def\show_setup_reference  #1{\show_setup_any{#1}{reference}}
1086%unexpanded\def\show_setup_destination#1{\show_setup_any{#1}{destination}}
1087%unexpanded\def\show_setup_word       #1{\show_setup_any{#1}{word}}
1088%unexpanded\def\show_setup_twowords   #1{\show_setup_any{#1}{twowords}}
1089%unexpanded\def\show_setup_threewords #1{\show_setup_any{#1}{threewords}}
1090
1091% A prelude to a rewrite and some more:
1092
1093% \definetype[parametercommand][\v!type]
1094% \definetype[parameterkey]    [\v!type]
1095% \definetype[parametervalue]  [\v!type][\c!space=\v!on]
1096
1097% todo: no list but hash ..
1098
1099\definetype[parametercommand]
1100\definetype[parameterkey]
1101\definetype[parametervalue]  [\c!space=\v!on]
1102
1103\setuptype [parametercommand] [\c!color=darkmagenta]
1104\setuptype [parametervalue]   [\c!color=darkyellow]
1105
1106\startxmlsetups xml:setups:parameters:value
1107    \edef\currentsetupparameterkey  {\xmlatt{#1}{name}}
1108    \edef\currentsetupparametervalue{\begincsname named\currentsetupparametercategory parameter\endcsname\currentsetupparameterinstance\currentsetupparameterkey}
1109    \ifx\currentsetupparameterinstance\empty
1110        \expanded {
1111            \NC \parameterkey  {\currentsetupparameterkey}
1112            \NC \parametervalue{\detokenize\expandafter{\currentsetupparametervalue}}
1113            \NC \NR
1114        }
1115    \else\ifx\currentsetupparametervalue\empty
1116    \else
1117        \edef\currentsetupparameterdefault{\begincsname named\currentsetupparametercategory parameter\endcsname\empty\currentsetupparameterkey}
1118        \ifx\currentsetupparametervalue\currentsetupparameterdefault
1119            % skip
1120        \else
1121            \expanded {
1122                \NC \parameterkey  {\currentsetupparameterkey}
1123                \NC \parametervalue{\detokenize\expandafter{\currentsetupparametervalue}}
1124                \NC \NR
1125            }
1126        \fi
1127    \fi\fi
1128\stopxmlsetups
1129
1130\startxmlsetups xml:setups:parameters:values
1131    \blank[\v!big,\v!samepage]
1132    \expanded {
1133        \parametercommand {
1134            \currentsetupparametercommand
1135            \space:\space
1136            \ifx\currentsetupparameterinstance\empty
1137                defaults
1138            \else
1139                \currentsetupparameterinstance
1140            \fi
1141        }
1142    }
1143    \blank[\v!big,\v!samepage]
1144    \starttabulate[|l|pl|]
1145        % no /interface here
1146        \xmlall
1147            {#1}
1148            {interface/command[@name=='\currentsetupparametercommand' or @handler=='\currentsetupparametercommand']/arguments/assignments/parameter/command(xml:setups:parameters:value)}
1149        \ifnum\noftabulaterows = \zerocount
1150            \NC \parameterkey{no specific settings} \NC \NC \NR
1151        \fi
1152    \stoptabulate
1153\stopxmlsetups
1154
1155\starttexdefinition showrootvalues [#1]
1156    \edef\currentsetupparametercategory{#1}
1157    \edef\currentsetupparametercommand{setup#1}
1158    \let\currentsetupparameterinstance\empty
1159    \xmlsetup{\loadedsetups}{xml:setups:parameters:values}
1160\stoptexdefinition
1161
1162\starttexdefinition showinstancevalues [#1]#2[#3]
1163    \edef\currentsetupparametercategory{#1}
1164    \edef\currentsetupparametercommand{setup#1}
1165    \edef\currentsetupparameterinstance{#3}
1166    \xmlsetup{\loadedsetups}{xml:setups:parameters:values}
1167\stoptexdefinition
1168
1169% official interface
1170
1171\unexpanded\def\cmdinternal#1%
1172  {{\tttf\getsetupstring{#1}}} % todo color .. highlight
1173
1174\let\cmdbasicsetup\basicsetup
1175\let\cmdshortsetup\shortsetup
1176\let\cmdfullsetup \showsetup
1177
1178\unexpanded\def\cmd_with_instance#1#2#3%
1179  {\edef\m_cmd_instance{#3}%
1180   #1{#2}%
1181   \let\m_cmd_instance\empty}
1182
1183\unexpanded\def\cmdbasicsetupinstance{\cmd_with_instance\cmdbasicsetup}
1184\unexpanded\def\cmdshortsetupinstance{\cmd_with_instance\cmdshortsetup}
1185\unexpanded\def\cmdfullsetupinstance {\cmd_with_instance\cmdfullsetup }
1186
1187% bonus
1188
1189\definefloat
1190  [definition]
1191
1192\setupcaption
1193  [definition]
1194  [align=flushright]
1195
1196\unexpanded\def\showdefinition
1197  {\doifelsenextoptional\cmd_show_definition_yes\cmd_show_definition_nop}
1198
1199\unexpanded\def\cmd_show_definition_nop#1%
1200  {\cmd_show_definition_yes[#1]}
1201
1202\unexpanded\def\cmd_show_definition_yes[#1]%
1203  {\placedefinition[here][definition:#1]{\tex{#1}}{\showsetup{#1}}}
1204
1205\unexpanded\def\definition[#1]%
1206  {\begingroup
1207   \getcommalistsize[#1]%
1208   \scratchcounter\zerocount
1209   \def\dodefinition##1%
1210     {\advance\scratchcounter\plusone
1211      \ifnum\scratchcounter=\commalistsize
1212        \in{and}[definition:##1]%
1213      \else\ifnum\scratchcounter=\plusone
1214        \in{definition}[definition:##1]\space
1215      \else
1216        \in{, }[definition:##1]\space
1217      \fi\fi}%
1218   \processcommalist[#1]\dodefinition
1219   \endgroup}
1220
1221\protect \endinput
1222