x-setups-basics.mkiv /size: 36 Kb    last modification: 2021-10-28 13:51
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    if structures then
419        local synonyms = structures.synonyms
420        if synonyms then
421            local collected = synonyms.collected
422            if collected then
423                local texcommand = collected.texcommand
424                if texcommand then
425                    local entries = texcommand.entries
426                    if entries then
427                        local t = { }
428                        local n = #entries
429                        for i=1,n do
430                            t[i] = entries[i].definition.tag
431                        end
432                        table.sort(t)
433                        for i=1,n do
434                            report_known(t[i])
435                        end
436                    end
437                end
438            end
439        end
440    end
441\stopluacode
442
443% <?xml version="1.0" encoding="UTF-8"?>
444%
445% <cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
446%
447%     <cd:interfacefile filename="i-document.xml"/>
448%     <cd:interfacefile filename="i-file.xml"/>
449%
450% </cd:interface>
451
452\startxmlsetups xml:setups:interfacefile
453    \loadsetups[\xmlatt{#1}{filename}]
454\stopxmlsetups
455
456\startxmlsetups xml:setups:basics
457    \xmlincludeoptions{#1}{interfacefile|include}{filename}{recurse,basename}
458    \xmlsetsetup{#1}{*}{xml:setups:*}
459    \xmlfunction{#1}{setups_define}
460\stopxmlsetups
461
462\xmlregisterdocumentsetup{setups}{xml:setups:basics}
463
464\let\loadedsetups\empty % we load more setups, setups:<name>
465
466\unexpanded\def\loadsetups
467  {\dosingleempty\cmd_load_setups}
468
469\def\cmd_load_setups[#1]%
470  {\edef\m_cmd_asked_setups{#1}%
471   \doifnotmode{no-setup-main}{\def\m_cmd_asked_setups{i-context.xml}}%
472   \ifx\m_cmd_asked_setups\empty \else
473     \doonlyonce{setups:#1}
474       {\doglobal\prependtocommalist{setups:#1}\loadedsetups
475        \edef\currentloadedsetup{#1}%
476        \doiffileexistselse{#1}
477           {\xmlloadonly{setups:#1}{#1}{setups}}%
478           {\xmlloadonly{setups:#1}{#1.xml}{setups}}%
479        % qualified path saves > 50% runtime
480        \xmlfilter{setups:#1}{/interface//command/command(xml:setups:register)}}%
481   \fi}
482
483\newconstant   \c_cmd_kind
484\newconditional\c_cmd_doing_line
485\newconditional\c_cmd_measuring
486\newconditional\c_cmd_show_setup
487\newcount      \c_cmd_current_argument
488\newcount      \c_cmd_maximum_argument
489\newdimen      \d_cmd_current_width
490\let           \m_cmd_current_hash      \empty
491\let           \m_cmd_current_file      \empty
492
493% todo: use different names (and a backward compatible extra module then)
494
495\unexpanded\def\basicsetup{\c_cmd_kind\zerocount\cmd_show_setup}
496\unexpanded\def\shortsetup{\c_cmd_kind\plusone  \cmd_show_setup}
497%unexpanded\def\setup     {\c_cmd_kind\plustwo  \cmd_show_setup}
498\unexpanded\def\showsetup {\c_cmd_kind\plustwo  \cmd_show_setup}
499
500\ifcase\contextlmtxmode \else
501    \pushoverloadmode
502        \unexpanded\def\setup{\c_cmd_kind\plustwo\cmd_show_setup}
503    \popoverloadmode
504\fi
505
506\unexpanded\def\showsetupinlist#1#2#3%
507  {%(#1)(#2)(#3)\par
508   \edef\m_cmd_instance{\secondoftwoarguments#3}%
509   \c_cmd_kind\plustwo
510   \xmlsetup{\firstoftwoarguments#3}{xml:setups:typeset}%
511   \let\m_cmd_instance\empty
512   \par}
513
514\unexpanded\def\showsetupnameonly#1#2#3%
515  {\edef\m_cmd_instance{\secondoftwoarguments#3}%
516   \c_cmd_kind\plustwo
517   \xmlsetup{\firstoftwoarguments#3}{xml:setups:assemblename}%
518   \let\m_cmd_instance\empty
519   \texescape\currentSETUPfullname}
520
521\installtextracker
522  {cmd.showsetup}
523  {\settrue\c_cmd_show_setup}
524  {\setfalse\c_cmd_show_setup}
525
526\unexpanded\def\cmd_show_setup
527  {\doifelsenextoptionalcs\cmd_show_setup_yes\cmd_show_setup_nop}
528
529\def\cmd_show_setup_yes[#1]%
530  {\cmd_show_setup_nop{#1}}
531
532\def\cmd_show_setup_nop#1% this will trigger 'used'
533  {\begingroup
534   \registersort[texcommand][#1]%
535   \ifconditional\c_cmd_show_setup
536     \writestatus{setup}{#1 / \rawsynonymname{texcommand}{#1}}%
537   \fi
538   \startelement[setup][name=#1]%
539     \startelement[noexport][comment={setup definition #1}]%
540       \edef\cmd_id{\rawsynonymname{texcommand}{#1}}%
541       \ifx\cmd_id\empty
542          missing: #1
543       \else
544         \ifx\m_cmd_instance\empty
545           \edef\m_cmd_instance{\expandafter\secondoftwoarguments\cmd_id}%
546         \fi
547         \xmlsetup{\expandafter\firstoftwoarguments\cmd_id}{xml:setups:typeset}
548         \let\m_cmd_instance\empty
549       \fi
550     \stopelement
551   \stopelement
552   \endgroup}
553
554\unexpanded\def\placesetup    {\placelistofsorts[texcommand][\c!criterium=\v!used]}
555\unexpanded\def\placeallsetups{\placelistofsorts[texcommand][\c!criterium=\v!all ]}
556
557% todo: grouped
558
559\let\placeeverysetup\placeallsetups
560
561\unexpanded\def\cmd_show_setup_list_basic#1#2#3%
562  {\NC\tttf#2\NC\basicsetup[#2]\NC\NR}
563
564\unexpanded\def\placeeverysetupname
565  {\placelistofsorts
566     [texcommand]
567     [\c!before={\starttabulate[|||]},
568      \c!after=\stoptabulate,
569      \c!criterium=\v!all,
570      \c!command=\cmd_show_setup_list_basic]}
571
572%D Typesetting:
573
574\startxmlsetups xml:setups:typeset
575    \doifelsenothing {#1} {
576        \xmlsetup{#1}{xml:setups:typeset:nop}
577    } {
578        \xmlsetup{#1}{xml:setups:typeset:yes}
579    }
580\stopxmlsetups
581
582\startxmlsetups xml:setups:typeset:nop
583    \blank
584    {\tttf MISSING SETUP}
585    \blank
586\stopxmlsetups
587
588\startxmlsetups xml:setups:make:string
589    \xmlatt{#1}{value}
590\stopxmlsetups
591
592\startxmlsetups xml:setups:make:instance
593    \ifx\m_cmd_instance\empty
594        \setupintfont{\xmlatt{#1}{value}}
595    \else
596        \m_cmd_instance
597    \fi
598\stopxmlsetups
599
600\startxmlsetups xml:setups:make:variable
601    \setupintfont{\xmlatt{#1}{value}}
602\stopxmlsetups
603
604\let\m_cmd_current_hash\empty
605\let\m_cmd_current_file\empty
606\let\m_cmd_font        \empty
607\let\m_cmd_name        \empty
608\let\m_cmd_start       \empty
609\let\m_cmd_stop        \empty
610\let\m_cmd_instance    \empty
611
612\startxmlsetups xml:setups:make:prepare
613    \edef\m_cmd_current_hash{\xmlatt{#1}{hash}}
614    \xdef\m_cmd_current_file{\xmlatt{#1}{file}}%
615    \xmldoifelseempty{#1}{/sequence} {
616        \edef\m_cmd_name{\xmlatt{#1}{name}}
617    } {
618        \edef\m_cmd_name{\xmlfilter{#1}{/sequence/(string|variable|instance)/command(xml:setups:make:*)}}
619    }
620    \doifelse {\xmlatt{#1}{type}} {environment} {
621        \doifsomethingelse {\xmlatt{#1}{begin}} {
622            \edef\m_cmd_start{\xmllastatt}
623        } {
624            \let\m_cmd_start\e!start
625        }
626        \doifsomethingelse {\xmlatt{#1}{end}} {
627            \edef\m_cmd_stop{\xmllastatt}
628        } {
629            \let\m_cmd_stop\e!stop
630        }
631    } {
632        \let\m_cmd_start\empty
633        \let\m_cmd_stop \empty
634    }
635    \doifelse {\xmlatt{#1}{generated}} {yes} {
636        \let\m_cmd_font\ttsl
637    } {
638        \let\m_cmd_font\relax
639    }
640\stopxmlsetups
641
642\startsetups xml:setups:make:start
643    \bgroup
644        \settrue\c_cmd_doing_line
645        \m_cmd_font
646        \letterbackslash
647        \m_cmd_start
648        \m_cmd_name
649        \ignorespaces
650    \egroup
651\stopsetups
652
653\startsetups xml:setups:make:stop
654    \ifx\m_cmd_stop\empty \else
655        \bgroup
656            \settrue\c_cmd_doing_line
657            \hskip.5em\unknown\hskip.5em
658            \m_cmd_font
659            \letterbackslash
660            \m_cmd_stop
661            \m_cmd_name
662            \ignorespaces
663        \egroup
664    \fi
665\stopsetups
666
667\startxmlsetups xml:setups:typeset:line
668    \ttbf
669    \nohyphens
670    \xmlsetup{#1}{xml:setups:make:prepare}
671    \directsetup{xml:setups:make:start}
672    \xmldoif{#1}{/arguments} {
673        \bgroup
674            \settrue\c_cmd_doing_line
675            \global\c_cmd_current_argument\zerocount
676            \ignorespaces
677            \xmlfilter{#1}{/arguments/text()}
678        \egroup
679    }
680    \directsetup{xml:setups:make:stop}
681\stopxmlsetups
682
683\startxmlsetups xml:setups:typeset:raw
684    \nohyphens
685    \veryraggedright
686    \global\c_cmd_current_argument\zerocount
687    \global\c_cmd_maximum_argument0\xmlfilter{#1}{/arguments/*/s_count()}\relax
688    \xmlsetup{#1}{xml:setups:make:prepare}
689    \ttbf
690    \directsetup{xml:setups:make:start}
691    \xmldoif{#1}{/arguments} {
692        \settrue\c_cmd_doing_line
693        \bgroup
694            \tttf
695            \global\c_cmd_current_argument\zerocount
696            \ignorespaces
697            \xmlfilter{#1}{/arguments/text()}
698        \egroup
699    }
700    \directsetup{xml:setups:make:stop}
701\stopxmlsetups
702
703\startxmlsetups xml:setups:typeset:detail
704    \xmldoif{#1}{/arguments} {
705        \bgroup
706            \setfalse\c_cmd_doing_line
707            \global\c_cmd_current_argument\zerocount
708           %\blank[\v!line] % packed mode (we could do \startunpacked ...)
709%             \godown[.75\lineheight]
710            \blank[\v!samepage,\v!medium]
711            \switchtobodyfont[\v!small]
712            \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf
713        \egroup
714    }
715\stopxmlsetups
716
717\startxmlsetups xml:setups:instance
718    \doifelse {\xmltag{#1}} {resolve} {
719        \ctxlua{lxml.command(moduledata.setups.definitions['\xmlatt{#1}{name}'],"constant","xml:setups:instance")}
720    } {
721        \xmlatt{#1}{value}\enskip % we need a break
722    }
723\stopxmlsetups
724
725\startxmlsetups xml:setups:typeset:instances
726    \ifx\m_cmd_instance\empty
727        \xmldoif{#1}{/instances} {
728%             \godown[.75\lineheight]
729            \blank[\v!samepage,\v!medium]
730            {\ttbf instances:}
731            \enspace
732            \xmlfilter{#1}{/instances/(constant|resolve)/command(xml:setups:instance)}
733            \removeunwantedspaces
734        }
735    \fi
736\stopxmlsetups
737
738\startsetups xml:setups:start
739    \csname\e!start setuptext\endcsname
740\stopsetups
741
742\startsetups xml:setups:stop
743    \csname\e!stop setuptext\endcsname
744\stopsetups
745
746\startxmlsetups xml:setups:typeset:yes
747    \forgetparskip
748    \glet\m_cmd_current_file\empty
749    \ifcase\c_cmd_kind
750        \xmlsetup{#1}{xml:setups:typeset:line}
751    \or
752        \directsetup{xml:setups:start}
753        \xmlsetup{#1}{xml:setups:typeset:raw}
754        \directsetup{xml:setups:stop}
755    \or
756        \directsetup{xml:setups:start}
757        \xmlsetup{#1}{xml:setups:typeset:raw}
758        \endgraf
759        \xmlsetup{#1}{xml:setups:typeset:detail}
760        \endgraf
761        \xmlsetup{#1}{xml:setups:typeset:instances}
762        \directsetup{xml:setups:stop}
763    \fi
764    \glet\m_cmd_current_file\empty
765\stopxmlsetups
766
767\startsetups xml:setups:overlay:file
768    \vbox to \overlayheight \bgroup
769        \infofont
770        \vfill
771        \scratchdimen.5\exheight
772        \hbox to \overlaywidth \bgroup
773            \strut
774            \hss
775            \m_cmd_current_file
776            \hskip\dimexpr\scratchdimen+\strutdp\relax
777        \egroup
778        \vskip\scratchdimen
779    \egroup
780\stopsetups
781
782\defineoverlay
783  [setupfilename]
784  [\directsetup{xml:setups:overlay:file}]
785
786\startxmlsetups xml:setups:resolve
787    \ignorespaces
788    \ctxlua{moduledata.setups.resolved('\xmlatt{#1}{name}')}
789\stopxmlsetups
790
791%D This is the first pass; here we generate the top line.
792
793\startxmlsetups xml:setups:define
794    \ignorespaces\xmlflush{#1}
795\stopxmlsetups
796
797\startxmlsetups xml:setups:sequence
798    \ignorespaces\xmlflush{#1}
799\stopxmlsetups
800
801\startxmlsetups xml:setups:string
802    \xmlatt{#1}{value}\ignorespaces
803\stopxmlsetups
804
805\startxmlsetups xml:setups:delimiter
806    \ifconditional\c_cmd_doing_line
807        \kern.5\emwidth
808        \letterbackslash\xmlatt{#1}{name}
809    \fi
810    \ignorespaces
811\stopxmlsetups
812
813\startxmlsetups xml:setups:csname      \show_setup_component{#1}{csname}     \stopxmlsetups
814\startxmlsetups xml:setups:content     \show_setup_component{#1}{content}    \stopxmlsetups
815\startxmlsetups xml:setups:position    \show_setup_component{#1}{position}   \stopxmlsetups
816\startxmlsetups xml:setups:index       \show_setup_component{#1}{index}      \stopxmlsetups
817\startxmlsetups xml:setups:text        \show_setup_component{#1}{text}       \stopxmlsetups
818\startxmlsetups xml:setups:apply       \show_setup_component{#1}{apply}      \stopxmlsetups
819\startxmlsetups xml:setups:template    \show_setup_component{#1}{template}   \stopxmlsetups
820\startxmlsetups xml:setups:triplet     \show_setup_component{#1}{triplet}    \stopxmlsetups
821\startxmlsetups xml:setups:angles      \show_setup_component{#1}{angles}     \stopxmlsetups
822
823%startxmlsetups xml:setups:displaymath \show_setup_component{#1}{displaymath}\stopxmlsetups
824%startxmlsetups xml:setups:math        \show_setup_component{#1}{math}       \stopxmlsetups
825%startxmlsetups xml:setups:nothing     \show_setup_component{#1}{nothing}    \stopxmlsetups
826%startxmlsetups xml:setups:file        \show_setup_component{#1}{file}       \stopxmlsetups
827%startxmlsetups xml:setups:reference   \show_setup_component{#1}{reference}  \stopxmlsetups
828%startxmlsetups xml:setups:destination \show_setup_component{#1}{destination}\stopxmlsetups
829%startxmlsetups xml:setups:word        \show_setup_component{#1}{word}       \stopxmlsetups
830%startxmlsetups xml:setups:twowords    \show_setup_component{#1}{twowords}   \stopxmlsetups
831%startxmlsetups xml:setups:threewords  \show_setup_component{#1}{threewords} \stopxmlsetups
832
833% todo: cd:par => \par
834% todo: cd:sep => \\
835
836\unexpanded\def\show_setup_component#1#2%
837  {\ifconditional\c_cmd_doing_line
838     \getvalue{show_setup_#2}{#1}%
839   \else
840     \simpleSETUPargument{#2}%
841   \fi}
842
843%D This is the second pass; here we generate the table.
844
845\unexpanded\def\cmd_column_one_start
846  {\bgroup
847   \scratchdimen2\emwidth
848   \advance\leftskip \scratchdimen
849   \noindent\llap{\hbox to \scratchdimen{\show_setup_number\hss}}%
850   \strut}
851
852\unexpanded\def\cmd_column_one_stop
853  {\endgraf
854   \egroup}
855
856\unexpanded\def\cmd_column_two_start#1#2%
857  {\bgroup
858   \scratchdimen2.5\emwidth
859   \advance\hangindent\dimexpr\d_cmd_current_width+\scratchdimen\relax
860   \noindent \hbox to \hangindent{#1\hss\hbox to \scratchdimen{\hss#2\hss}}%
861   \strut}
862
863\unexpanded\def\cmd_column_two_stop
864  {\endgraf
865   \egroup}
866
867\startxmlsetups xml:setups:assignments
868    \ifconditional\c_cmd_doing_line
869        \ifcase\c_cmd_kind
870            \expandafter\show_setup_line
871        \else
872            \expandafter\show_setup_any
873        \fi{#1}{assignment\xmlattdef{#1}{delimiters}{brackets}}
874    \else
875        \global\d_cmd_current_width\zeropoint
876        \setbox\scratchbox\vbox\bgroup
877            \settrue\c_cmd_measuring
878            \xmlall{#1}{/(parameter|resolve)}
879        \egroup
880        \global\d_cmd_current_width\themaxboxwidth\scratchbox\relax
881        \cmd_column_one_start
882            \ignorespaces
883            \xmldoifelse {#1} {/(parameter|inherit|resolve)} {
884               \xmlflush{#1}
885            } {
886               \unknown
887            }
888        \cmd_column_one_stop
889%         \godown[.75\lineheight]
890        \blank[\v!samepage,\v!medium]
891        \ignorespaces
892    \fi
893\stopxmlsetups
894
895\startxmlsetups xml:setups:keywords
896    \ifconditional\c_cmd_doing_line
897        \ifcase\c_cmd_kind
898            \expandafter\show_setup_line
899        \else
900            \expandafter\show_setup_any
901        \fi{#1}{\xmlattdef{#1}{delimiters}{brackets}}
902    \else
903        \cmd_column_one_start
904            \ignorespaces
905            \xmlflush{#1}
906        \cmd_column_one_stop
907%         \godown[.75\lineheight]
908        \blank[\v!samepage,\v!medium]
909        \ignorespaces
910    \fi
911\stopxmlsetups
912
913\startxmlsetups xml:setups:parameter
914    \ifconditional\c_cmd_measuring
915      \getsetupstring{\xmlatt{#1}{name}}\par
916    \else
917      \cmd_column_two_start{\getsetupstring{\xmlatt{#1}{name}}}{=}
918            \ignorespaces
919            \xmlflush{#1}
920            \doifmode{interface:setup:defaults} {
921                \ifx\m_cmd_current_hash\empty \else
922                    \begingroup
923                        % todo, make a one level expansion of parameter
924                        \let\emwidth \relax
925                        \let\exheight\relax
926                        \edef\temp{\csname named\m_cmd_current_hash parameter\endcsname\empty{\xmlatt{#1}{name}}}
927                        \ifx\temp\empty \else
928                            =\space
929                            \detokenize\expandafter{\temp}
930                        \fi
931                    \endgroup
932                \fi
933            }
934        \cmd_column_two_stop
935    \fi
936    \ignorespaces
937\stopxmlsetups
938
939%xmlmapvalue{setups:method}{class} {:}
940\xmlmapvalue{setups:method}{range} {:}
941\xmlmapvalue{setups:method}{apply} {->}
942\xmlmapvalue{setups:method}{factor}{*}
943\xmlmapvalue{setups:method}{none}  {}
944
945\startxmlsetups xml:setups:constant:value
946    \getsetupstring{\xmlatt{#1}{type}}
947\stopxmlsetups
948
949\definebar % in case we mess with underbar settings
950  [cmd_underbar]
951  [\v!underbar]
952  [\c!foregroundcolor=,
953   \c!foregroundstyle=,
954   \c!color=]
955
956\startxmlsetups xml:setups:constant
957    \doifelsemode {setups-pass-one} {
958    } {
959        \doifsomethingelse{\xmlatt{#1}{prefix}} {
960            \getsetupstring{\xmllastatt}
961            \xmlmappedvalue{setups:method}{\xmlatt{#1}{method}}{none}
962        } {
963            \doif {\xmlatt{#1}{default}} {yes} {
964                \cmd_underbar % next needs to be {braced}
965            }
966        }
967        {\getsetupstring{\xmlatt{#1}{type}}}
968        \space
969        \ignorespaces
970    }
971\stopxmlsetups
972
973\startxmlsetups xml:setups:variable
974    \doifelsemode {setups-pass-one} {
975        \expanded{\setupintfont{\xmlatt{#1}{value}}}\ignorespaces
976    } {
977        \getsetupstring{\xmlatt{#1}{value}}
978        \space
979        \ignorespaces
980    }
981\stopxmlsetups
982
983\startxmlsetups xml:setups:inherit
984  % \cmd_column_two_start{}{}
985        \rawsetupstring{cd:inherits}:
986        \enspace
987        \letterbackslash
988        \xmlatt{#1}{name}
989  % \cmd_column_two_stop
990    \ignorespaces
991\stopxmlsetups
992
993\unexpanded\def\simpleSETUPargument#1%
994  {\cmd_column_one_start
995      \cmd_internal_value{#1}%
996   \cmd_column_one_stop
997 % \godown[.75\lineheight]
998   \blank[\v!samepage,\v!medium]
999   \ignorespaces}
1000
1001%D Auxiliary.
1002
1003\unexpanded\def\show_setup_any#1#2%
1004  {\bgroup
1005   \global\advance\c_cmd_current_argument\plusone
1006   \doifelse{\xmlatt{#1}{optional}}{yes}\donetrue\donefalse
1007   \setbox0=\hbox
1008     {\ifdone\sl\fi
1009      \doifelse{\xmlatt{#1}{list}}{yes}
1010        {\getsetupstring{cd:#2-l}}%
1011        {\getsetupstring{cd:#2-s}}}%
1012   \setbox2=\hbox to \wd0
1013     {\hss
1014      \ifcase\c_cmd_kind\else
1015        \ifcase\c_cmd_maximum_argument \relax
1016        \or
1017          \raise1.25\exheight\hbox
1018            {\txx *}%
1019        \else
1020          \raise1.25\exheight\hbox
1021            {\txx\the\c_cmd_current_argument}%
1022         \fi
1023      \fi
1024      \hss}%
1025   \setbox4=\hbox to \wd0
1026     {\hss
1027      \ifdone
1028        \lower2\exheight\hbox
1029          \bgroup
1030            \txx
1031            \getsetupstring{cd:optional}%
1032          \egroup
1033        \hss
1034      \fi}%
1035   \ht2\ht\strutbox
1036   \dp4\dp\strutbox
1037   \hskip.5\emwidth
1038   \wd0\zeropoint
1039   \box0
1040   \wd2\zeropoint
1041   \box2
1042   \box4%
1043   \egroup
1044   \ignorespaces}
1045
1046\unexpanded\def\show_setup_line#1#2%
1047  {\kern.5\emwidth
1048   \getsetupstring{cd:#2-s}%
1049   \ignorespaces}
1050
1051\unexpanded\def\show_setup_number
1052  {\global\advance\c_cmd_current_argument\plusone
1053   \hbox to 2\emwidth
1054     {\ifcase\c_cmd_maximum_argument \relax
1055        \or*\else\the\c_cmd_current_argument
1056      \fi
1057      \hss}}
1058
1059% todo: replace = by lower
1060
1061\unexpanded\def\setupEQsymbol % we raise the number already
1062  {.\lower.25\exheight\hpack{=}.}
1063
1064\unexpanded\def\setupAPPLYsymbol % we raise the number already
1065  {..\lower.25\exheight\hpack{=>}..}
1066
1067% arguments
1068
1069\unexpanded\def\show_setup_csname     #1{\show_setup_any{#1}{noargument}}
1070\unexpanded\def\show_setup_content    #1{\show_setup_any{#1}{content}}
1071\unexpanded\def\show_setup_position   #1{\show_setup_any{#1}{position}}
1072\unexpanded\def\show_setup_index      #1{\show_setup_any{#1}{index}}
1073\unexpanded\def\show_setup_text       #1{\show_setup_any{#1}{textual}}
1074\unexpanded\def\show_setup_apply      #1{\show_setup_any{#1}{apply}}
1075\unexpanded\def\show_setup_template   #1{\show_setup_any{#1}{template}}
1076\unexpanded\def\show_setup_triplet    #1{\show_setup_any{#1}{triplet}}
1077\unexpanded\def\show_setup_angles     #1{\show_setup_any{#1}{angle}}
1078
1079%unexpanded\def\show_setup_displaymath#1{\show_setup_any{#1}{displaymath}}
1080%unexpanded\def\show_setup_math       #1{\show_setup_any{#1}{math}}
1081%unexpanded\def\show_setup_nothing    #1{\show_setup_any{#1}{nothing}}
1082%unexpanded\def\show_setup_file       #1{\show_setup_any{#1}{file}}
1083%unexpanded\def\show_setup_reference  #1{\show_setup_any{#1}{reference}}
1084%unexpanded\def\show_setup_destination#1{\show_setup_any{#1}{destination}}
1085%unexpanded\def\show_setup_word       #1{\show_setup_any{#1}{word}}
1086%unexpanded\def\show_setup_twowords   #1{\show_setup_any{#1}{twowords}}
1087%unexpanded\def\show_setup_threewords #1{\show_setup_any{#1}{threewords}}
1088
1089% A prelude to a rewrite and some more:
1090
1091% \definetype[parametercommand][\v!type]
1092% \definetype[parameterkey]    [\v!type]
1093% \definetype[parametervalue]  [\v!type][\c!space=\v!on]
1094
1095% todo: no list but hash ..
1096
1097\definetype[parametercommand]
1098\definetype[parameterkey]
1099\definetype[parametervalue]  [\c!space=\v!on]
1100
1101\setuptype [parametercommand] [\c!color=darkmagenta]
1102\setuptype [parametervalue]   [\c!color=darkyellow]
1103
1104\startxmlsetups xml:setups:parameters:value
1105    \edef\currentsetupparameterkey  {\xmlatt{#1}{name}}
1106    \edef\currentsetupparametervalue{\begincsname named\currentsetupparametercategory parameter\endcsname\currentsetupparameterinstance\currentsetupparameterkey}
1107    \ifx\currentsetupparameterinstance\empty
1108        \expanded {
1109            \NC \parameterkey  {\currentsetupparameterkey}
1110            \NC \parametervalue{\detokenize\expandafter{\currentsetupparametervalue}}
1111            \NC \NR
1112        }
1113    \else\ifx\currentsetupparametervalue\empty
1114    \else
1115        \edef\currentsetupparameterdefault{\begincsname named\currentsetupparametercategory parameter\endcsname\empty\currentsetupparameterkey}
1116        \ifx\currentsetupparametervalue\currentsetupparameterdefault
1117            % skip
1118        \else
1119            \expanded {
1120                \NC \parameterkey  {\currentsetupparameterkey}
1121                \NC \parametervalue{\detokenize\expandafter{\currentsetupparametervalue}}
1122                \NC \NR
1123            }
1124        \fi
1125    \fi\fi
1126\stopxmlsetups
1127
1128\startxmlsetups xml:setups:parameters:values
1129    \blank[\v!big,\v!samepage]
1130    \expanded {
1131        \parametercommand {
1132            \currentsetupparametercommand
1133            \space:\space
1134            \ifx\currentsetupparameterinstance\empty
1135                defaults
1136            \else
1137                \currentsetupparameterinstance
1138            \fi
1139        }
1140    }
1141    \blank[\v!big,\v!samepage]
1142    \starttabulate[|l|pl|]
1143        % no /interface here
1144        \xmlall
1145            {#1}
1146            {interface/command[@name=='\currentsetupparametercommand' or @handler=='\currentsetupparametercommand']/arguments/assignments/parameter/command(xml:setups:parameters:value)}
1147        \ifnum\noftabulaterows = \zerocount
1148            \NC \parameterkey{no specific settings} \NC \NC \NR
1149        \fi
1150    \stoptabulate
1151\stopxmlsetups
1152
1153\starttexdefinition showrootvalues [#1]
1154    \edef\currentsetupparametercategory{#1}
1155    \edef\currentsetupparametercommand{setup#1}
1156    \let\currentsetupparameterinstance\empty
1157    \xmlsetup{\loadedsetups}{xml:setups:parameters:values}
1158\stoptexdefinition
1159
1160\starttexdefinition showinstancevalues [#1]#2[#3]
1161    \edef\currentsetupparametercategory{#1}
1162    \edef\currentsetupparametercommand{setup#1}
1163    \edef\currentsetupparameterinstance{#3}
1164    \xmlsetup{\loadedsetups}{xml:setups:parameters:values}
1165\stoptexdefinition
1166
1167% official interface
1168
1169\unexpanded\def\cmdinternal#1%
1170  {{\tttf\getsetupstring{#1}}} % todo color .. highlight
1171
1172\let\cmdbasicsetup\basicsetup
1173\let\cmdshortsetup\shortsetup
1174\let\cmdfullsetup \showsetup
1175
1176\unexpanded\def\cmd_with_instance#1#2#3%
1177  {\edef\m_cmd_instance{#3}%
1178   #1{#2}%
1179   \let\m_cmd_instance\empty}
1180
1181\unexpanded\def\cmdbasicsetupinstance{\cmd_with_instance\cmdbasicsetup}
1182\unexpanded\def\cmdshortsetupinstance{\cmd_with_instance\cmdshortsetup}
1183\unexpanded\def\cmdfullsetupinstance {\cmd_with_instance\cmdfullsetup }
1184
1185% bonus
1186
1187\definefloat
1188  [definition]
1189
1190\setupcaption
1191  [definition]
1192  [align=flushright]
1193
1194\unexpanded\def\showdefinition
1195  {\doifelsenextoptional\cmd_show_definition_yes\cmd_show_definition_nop}
1196
1197\unexpanded\def\cmd_show_definition_nop#1%
1198  {\cmd_show_definition_yes[#1]}
1199
1200\unexpanded\def\cmd_show_definition_yes[#1]%
1201  {\placedefinition[here][definition:#1]{\tex{#1}}{\showsetup{#1}}}
1202
1203\unexpanded\def\definition[#1]%
1204  {\begingroup
1205   \getcommalistsize[#1]%
1206   \scratchcounter\zerocount
1207   \def\dodefinition##1%
1208     {\advance\scratchcounter\plusone
1209      \ifnum\scratchcounter=\commalistsize
1210        \in{and}[definition:##1]%
1211      \else\ifnum\scratchcounter=\plusone
1212        \in{definition}[definition:##1]\space
1213      \else
1214        \in{, }[definition:##1]\space
1215      \fi\fi}%
1216   \processcommalist[#1]\dodefinition
1217   \endgroup}
1218
1219\protect \endinput
1220