summaryrefslogtreecommitdiff
path: root/tex/context/modules/mkiv/x-setups-basics.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/modules/mkiv/x-setups-basics.mkiv')
-rw-r--r--tex/context/modules/mkiv/x-setups-basics.mkiv927
1 files changed, 927 insertions, 0 deletions
diff --git a/tex/context/modules/mkiv/x-setups-basics.mkiv b/tex/context/modules/mkiv/x-setups-basics.mkiv
new file mode 100644
index 000000000..02376deea
--- /dev/null
+++ b/tex/context/modules/mkiv/x-setups-basics.mkiv
@@ -0,0 +1,927 @@
+%D \module
+%D [ file=setups-basics, % x-set-11,
+%D version=2016.04.05, % 2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Definitions,
+%D subtitle=Macro Definitions,
+%D author={Hans Hagen & Wolfgang Schuster},
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We can make this module a bit cleaner using more recent features or we go \LUA\
+%D completely but as this style evolved over 15 years it's a waste of time.
+%D
+%D As we also have a help server we can make a common framework for this \unknown\
+%D but even then, this file is also a test for the the \XML\ processor.
+%D
+%D Traditionally we used the sorter to generate the lists while nowadays we can
+%D as well use the \XML\ mechanisms directly. We cannot change too much because
+%D manuals depend on it.
+%D
+%D Currently we load the \XML\ file and when not in the english interface we just
+%D remap the relevant words to their translation.
+
+\unprotect
+
+\defineregister
+ [texmacro]
+
+\definesorting
+ [texcommand]
+
+\setupsorting
+ [texcommand]
+ [\c!command=\showsetupinlist,
+ \c!criterium=\setupparameter\c!criterium]
+
+\pushmacro\setuptext
+
+\defineframedtext
+ [setuptext]
+ [\c!width=\hsize,
+ \c!height=\v!fit,
+ \c!align=\v!right,
+ \c!offset=0.75\emwidth]
+
+\popmacro\setuptext
+
+\installcorenamespace{interfacesetup}
+
+\installsetuponlycommandhandler \??interfacesetup {setup} % \??interfacesetup
+
+\setupsetup
+ [\c!before=,
+ \c!after=,
+ \c!command=\setup,
+ \c!criterium=\v!used]
+
+%D General:
+
+\unexpanded\def\setupnumfont {}
+\unexpanded\def\setuptxtfont {}
+\unexpanded\def\setupintfont {\WORD}
+\unexpanded\def\setupvarfont {\sl}
+\unexpanded\def\setupoptfont {\sl}
+\unexpanded\def\setupalwcolor{}
+\unexpanded\def\setupoptcolor{darkgray}
+
+\unexpanded\def\setupvarword#1{{\sl\detokenize{#1}}}
+\unexpanded\def\setupintword#1{\WORD{\detokenize{#1}}}
+\unexpanded\def\setuptxtword#1{\detokenize{#1}}
+
+\unexpanded\def\cmd_internal_value#1%
+ {\dontleavehmode
+ \begingroup
+ \setupintfont{#1}%
+ \endgroup}
+
+\unexpanded\def\cmd_text_value#1%
+ {\dontleavehmode
+ \begingroup
+ \setupvarfont{#1}%
+ \endgroup}
+
+\unexpanded\def\cmd_command_value#1%
+ {\begingroup
+ \setupvarfont{#1}%
+ \endgroup}
+
+%D Loading:
+
+\let\currentSETUPfullname\s!unknown
+
+\startxmlsetups xml:setups:assemblename
+ \doifelse {\xmlatt{#1}{type}} {environment} {
+ \doifsomethingelse {\xmlatt{#1}{begin}} {
+ \edef\currentSETUPprefix{\xmllastatt}%
+ } {
+ \let\currentSETUPprefix\e!start
+ }
+ } {
+ \let\currentSETUPprefix\empty
+ }
+ \edef\currentSETUPname{\xmlatt{#1}{name}}
+ \let\currentSETUPgenerated\empty
+ \doifelsenothing {\xmlatt{#1}{variant}} {
+ \let\currentSETUPvariant\empty
+ } {
+ \def\currentSETUPvariant{:\xmllastatt}
+ }
+ \edef\currentSETUPfullname {
+ \currentSETUPprefix
+ \currentSETUPname
+ \currentSETUPvariant
+ \currentSETUPgenerated
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:register
+ \xmlsetup{#1}{xml:setups:assemblename}
+ % not really needed if we just use setups
+ \expanded{\texcommand[stp:x:\currentSETUPfullname]{#1}}
+\stopxmlsetups
+
+\startluacode
+
+ local find, gsub = string.find, string.gsub
+
+ local context = context
+
+ local setupvarword = context.formatted.setupvarword
+ local setupintword = context.formatted.setupintword
+ local setuptxtword = context.formatted.setuptxtword
+
+ local getsetupstring = interfaces.getsetupstring
+
+ -- normally a lookup is fast enough but here we can have many setups
+ -- spread over many files so we do a little speedup here
+
+ local setups = moduledata.setups or { }
+ moduledata.setups = setups
+ local definitions = { }
+ setups.definitions = definitions
+
+ function xml.functions.setups_define(id)
+ local x = lxml.getid(id)
+ for c in xml.collected(x,"cd:interface/cd:define") do
+ definitions[c.at.name] = c
+ end
+
+ for c in xml.collected(x,"cd:interface/cd:interface") do
+ c.at.file = c.__f__
+ c.at["xmlns:cd"] = nil
+ -- c.dt[#c.dt+1] = " "
+ end
+
+ local interface = interfaces.currentinterface or "en"
+
+ if interface ~= "en" then
+
+ local constants = interfaces.complete.constants
+ local variables = interfaces.complete.variables
+ local commands = interfaces.complete.commands
+ local elements = interfaces.complete.elements
+
+ local function replace(pattern,attribute,one,two)
+ for e in xml.collected(x,pattern) do
+ local t = e.at[attribute]
+ if t then
+ local c = one[t] or (two and two[t])
+ if c then
+ local v = c[interface]
+ if v then
+ e.at[attribute] = v
+ end
+ end
+ end
+ end
+ end
+
+ replace('cd:command', 'name', commands, elements)
+ replace('cd:string', 'value', commands, elements)
+ replace('cd:variable' , 'value', variables)
+
+ replace('cd:parameter', 'name', constants)
+ replace('cd:constant', 'type', variables)
+ replace('cd:constant', 'default', variables)
+ replace('cd:variable', 'type', variables)
+ replace('cd:inherit', 'name', commands, elements)
+
+ end
+
+ if tex.modes["setups:save"] and environment.currentrun == 1 then
+ local s = tostring(x)
+ s = gsub(s,"\n*%s*(</cd:interface>)%s+(<cd:interface)", "\n\n %1\n\n %2")
+ s = gsub(s,"\n*%s*(</cd:interface>)%s+(</cd:interface>)","\n\n %1\n\n %2")
+ io.savedata("context-"..interface..".xml",s)
+ end
+
+ end
+
+ function moduledata.setups.resolved(name)
+ lxml.flush(definitions[name])
+ end
+
+ function xml.finalizers.s_count(collected)
+ local n = 0
+ for i=1,#collected do
+ local c = collected[i]
+ local tg = c.tg
+ if tg == "resolve" then
+ local d = definitions[c.at.name]
+ n = n + xml.count(d,"/*")
+ elseif tg == "delimiter" then
+ -- skip
+ else
+ n = n + 1
+ end
+ end
+ context(n)
+ end
+
+ interfaces.implement {
+ name = "getsetupstring",
+ actions = function(s)
+ local g = getsetupstring(s)
+ if not find(s,"^cd:") then
+ setuptxtword(g)
+ elseif find(s,"%-.$") then
+ setupvarword(g)
+ else
+ setupintword(g) -- cap
+ end
+ end,
+ overload = true,
+ arguments = "string",
+ }
+
+ interfaces.implement {
+ name = "rawsetupstring",
+ actions = { getsetupstring, context },
+ overload = true,
+ arguments = "string",
+ }
+
+\stopluacode
+
+% <?xml version="1.0" encoding="UTF-8"?>
+%
+% <cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
+%
+% <cd:interfacefile filename="i-document.xml"/>
+% <cd:interfacefile filename="i-file.xml"/>
+%
+% </cd:interface>
+
+\startxmlsetups xml:setups:interfacefile
+ \loadsetups[\xmlatt{#1}{filename}]
+\stopxmlsetups
+
+\startxmlsetups xml:setups:basics
+ \xmlincludeoptions{#1}{interfacefile|include}{filename}{recurse,basename}
+ \xmlsetsetup{#1}{*}{xml:setups:*}
+ \xmlfunction{#1}{setups_define}
+\stopxmlsetups
+
+\xmlregisterdocumentsetup{setups}{xml:setups:basics}
+
+\let\loadedsetups\empty % we load more setups, setups:<name>
+
+\unexpanded\def\loadsetups
+ {\dosingleempty\cmd_load_setups}
+
+\def\cmd_load_setups[#1]%
+ {\edef\m_cmd_asked_setups{#1}%
+ \doifnotmode{no-setup-main}{\def\m_cmd_asked_setups{i-context.xml}}%
+ \ifx\m_cmd_asked_setups\empty \else
+ \doonlyonce{setups:#1}
+ {\doglobal\prependtocommalist{setups:#1}\loadedsetups
+ \doiffileexistselse{#1}
+ {\xmlloadonly{setups:#1}{#1}{setups}}%
+ {\xmlloadonly{setups:#1}{#1.xml}{setups}}%
+ % qualified path saves > 50% runtime
+ \xmlfilter{setups:#1}{/interface//command/command(xml:setups:register)}}%
+ \fi}
+
+\newconstant \c_cmd_kind
+\newconditional\c_cmd_doing_line
+\newconditional\c_cmd_measuring
+\newconditional\c_cmd_show_setup
+\newcount \c_cmd_current_argument
+\newcount \c_cmd_maximum_argument
+\newdimen \d_cmd_current_width
+\let \m_cmd_current_hash \empty
+\let \m_cmd_current_file \empty
+
+\unexpanded\def\basicsetup{\c_cmd_kind\zerocount\cmd_show_setup}
+\unexpanded\def\shortsetup{\c_cmd_kind\plusone \cmd_show_setup}
+\unexpanded\def\setup {\c_cmd_kind\plustwo \cmd_show_setup}
+\unexpanded\def\showsetup {\c_cmd_kind\plustwo \cmd_show_setup}
+
+\unexpanded\def\showsetupinlist#1#2#3%
+ {\c_cmd_kind\plustwo\xmlsetup{#3}{xml:setups:typeset}\par}
+
+\installtextracker
+ {cmd.showsetup}
+ {\settrue\c_cmd_show_setup}
+ {\setfalse\c_cmd_show_setup}
+
+\unexpanded\def\cmd_show_setup
+ {\doifelsenextoptionalcs\cmd_show_setup_yes\cmd_show_setup_nop}
+
+\def\cmd_show_setup_yes[#1]%
+ {\iffirstargument
+ \cmd_show_setup_nop{#1}%
+ \else
+ \expandafter\cmd_show_setup_nop
+ \fi}
+
+\def\cmd_show_setup_nop#1% this will trigger 'used'
+ {\registersort[texcommand][stp:x:#1]%
+ \ifconditional\c_cmd_show_setup
+ \writestatus{setup}{#1 / \rawsynonymname{texcommand}{stp:x:#1}}%
+ \fi
+ \startelement[setup][name=#1]%
+ \startelement[noexport][comment={setup definition #1}]%
+ \xmlsetup{\rawsynonymname{texcommand}{stp:x:#1}}{xml:setups:typeset}
+ \stopelement
+ \stopelement}
+
+\unexpanded\def\placesetup {\placelistofsorts[texcommand][\c!criterium=\v!used]}
+\unexpanded\def\placeallsetups{\placelistofsorts[texcommand][\c!criterium=\v!all ]}
+
+% todo: grouped
+
+\let\placeeverysetup\placeallsetups
+
+%D Typesetting:
+
+\startxmlsetups xml:setups:typeset
+ \doifelsenothing {#1} {
+ \xmlsetup{#1}{xml:setups:typeset:nop}
+ } {
+ \xmlsetup{#1}{xml:setups:typeset:yes}
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:typeset:nop
+ \blank
+ {\tttf MISSING SETUP}
+ \blank
+\stopxmlsetups
+
+\startxmlsetups xml:setups:make:string
+ \xmlatt{#1}{value}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:make:variable
+ \xmlatt{#1}{value}
+\stopxmlsetups
+
+\let\m_cmd_current_hash\empty
+\let\m_cmd_current_file\empty
+\let\m_cmd_font \empty
+\let\m_cmd_name \empty
+\let\m_cmd_start \empty
+\let\m_cmd_stop \empty
+
+\startxmlsetups xml:setups:make:prepare
+ \edef\m_cmd_current_hash{\xmlatt{#1}{hash}}
+ \xdef\m_cmd_current_file{\xmlatt{#1}{file}}%
+ \xmldoifelseempty{#1}{/sequence} {
+ \edef\m_cmd_name{\xmlatt{#1}{name}}
+ } {
+ \edef\m_cmd_name{\xmlfilter{#1}{/sequence/(string|variable)/command(xml:setups:make:*)}}
+ }
+ \doifelse {\xmlatt{#1}{type}} {environment} {
+ \doifsomethingelse {\xmlatt{#1}{begin}} {
+ \edef\m_cmd_start{\xmllastatt}
+ } {
+ \let\m_cmd_start\e!start
+ }
+ \doifsomethingelse {\xmlatt{#1}{end}} {
+ \edef\m_cmd_stop{\xmllastatt}
+ } {
+ \let\m_cmd_stop\e!stop
+ }
+ } {
+ \let\m_cmd_start\empty
+ \let\m_cmd_stop \empty
+ }
+ \doifelse {\xmlatt{#1}{generated}} {yes} {
+ \let\m_cmd_font\ttsl
+ } {
+ \let\m_cmd_font\relax
+ }
+\stopxmlsetups
+
+\startsetups xml:setups:make:start
+ \bgroup
+ \settrue\c_cmd_doing_line
+ \m_cmd_font
+ \letterbackslash
+ \m_cmd_start
+ \m_cmd_name
+ \ignorespaces
+ \egroup
+\stopsetups
+
+\startsetups xml:setups:make:stop
+ \ifx\m_cmd_stop\empty \else
+ \bgroup
+ \settrue\c_cmd_doing_line
+ \hskip.5em\unknown\hskip.5em
+ \m_cmd_font
+ \letterbackslash
+ \m_cmd_stop
+ \m_cmd_name
+ \ignorespaces
+ \egroup
+ \fi
+\stopsetups
+
+\startxmlsetups xml:setups:typeset:line
+ \ttbf
+ \nohyphens
+ \xmlsetup{#1}{xml:setups:make:prepare}
+ \directsetup{xml:setups:make:start}
+ \xmldoif{#1}{/arguments} {
+ \bgroup
+ \settrue\c_cmd_doing_line
+ \global\c_cmd_current_argument\zerocount
+ \ignorespaces
+ \xmlfilter{#1}{/arguments/text()}
+ \egroup
+ }
+ \directsetup{xml:setups:make:stop}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:typeset:raw
+ \nohyphens
+ \veryraggedright
+ \global\c_cmd_current_argument\zerocount
+ \global\c_cmd_maximum_argument0\xmlfilter{#1}{/arguments/*/s_count()}\relax
+ \xmlsetup{#1}{xml:setups:make:prepare}
+ \ttbf
+ \directsetup{xml:setups:make:start}
+ \xmldoif{#1}{/arguments} {
+ \settrue\c_cmd_doing_line
+ \bgroup
+ \tttf
+ \global\c_cmd_current_argument\zerocount
+ \ignorespaces
+ \xmlfilter{#1}{/arguments/text()}
+ \egroup
+ }
+ \directsetup{xml:setups:make:stop}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:typeset:detail
+ \xmldoif{#1}{/arguments} {
+ \bgroup
+ \setfalse\c_cmd_doing_line
+ \global\c_cmd_current_argument\zerocount
+ %\blank[\v!line] % packed mode (we could do \startunpacked ...)
+ \godown[.75\lineheight]
+ \switchtobodyfont[\v!small]
+ \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf
+ \egroup
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:instance
+ \xmlatt{#1}{value}\enspace
+\stopxmlsetups
+
+\startxmlsetups xml:setups:typeset:instances
+ \xmldoif{#1}{/instances} {
+ \godown[.75\lineheight]
+ {\ttbf instances:}
+ \enspace
+ \xmlfilter{#1}{/instances/constant/command(xml:setups:instance)}
+ \removeunwantedspaces
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:typeset:yes
+ \glet\m_cmd_current_file\empty
+ \ifcase\c_cmd_kind
+ \xmlsetup{#1}{xml:setups:typeset:line}
+ \or
+ \getvalue{\e!start setuptext}
+ \xmlsetup{#1}{xml:setups:typeset:raw}
+ \getvalue{\e!stop setuptext}
+ \or
+ \getvalue{\e!start setuptext}
+ \xmlsetup{#1}{xml:setups:typeset:raw}
+ \endgraf
+ \xmlsetup{#1}{xml:setups:typeset:detail}
+ \endgraf
+ \xmlsetup{#1}{xml:setups:typeset:instances}
+ \getvalue{\e!stop setuptext}
+ \fi
+ \glet\m_cmd_current_file\empty
+\stopxmlsetups
+
+\startsetups xml:setups:overlay:file
+ \vbox to \overlayheight \bgroup
+ \infofont
+ \vfill
+ \scratchdimen.5\exheight
+ \hbox to \overlaywidth \bgroup
+ \strut
+ \hss
+ \m_cmd_current_file
+ \hskip\dimexpr\scratchdimen+\strutdp\relax
+ \egroup
+ \vskip\scratchdimen
+ \egroup
+\stopsetups
+
+\defineoverlay
+ [setupfilename]
+ [\directsetup{xml:setups:overlay:file}]
+
+\startxmlsetups xml:setups:resolve
+ \ignorespaces
+ \ctxlua{moduledata.setups.resolved('\xmlatt{#1}{name}')}
+\stopxmlsetups
+
+%D This is the first pass; here we generate the top line.
+
+\startxmlsetups xml:setups:define
+ \ignorespaces\xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:sequence
+ \ignorespaces\xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:string
+ \xmlatt{#1}{value}\ignorespaces
+\stopxmlsetups
+
+\startxmlsetups xml:setups:delimiter
+ \ifconditional\c_cmd_doing_line
+ \kern.5\emwidth
+ \letterbackslash\xmlatt{#1}{name}
+ \fi
+ \ignorespaces
+\stopxmlsetups
+
+\startxmlsetups xml:setups:content \show_setup_component{#1}{content} \stopxmlsetups
+\startxmlsetups xml:setups:displaymath \show_setup_component{#1}{displaymath}\stopxmlsetups
+\startxmlsetups xml:setups:index \show_setup_component{#1}{index} \stopxmlsetups
+\startxmlsetups xml:setups:math \show_setup_component{#1}{math} \stopxmlsetups
+\startxmlsetups xml:setups:nothing \show_setup_component{#1}{nothing} \stopxmlsetups
+\startxmlsetups xml:setups:file \show_setup_component{#1}{file} \stopxmlsetups
+\startxmlsetups xml:setups:position \show_setup_component{#1}{position} \stopxmlsetups
+\startxmlsetups xml:setups:reference \show_setup_component{#1}{reference} \stopxmlsetups
+\startxmlsetups xml:setups:csname \show_setup_component{#1}{csname} \stopxmlsetups
+\startxmlsetups xml:setups:destination \show_setup_component{#1}{destination}\stopxmlsetups
+\startxmlsetups xml:setups:triplet \show_setup_component{#1}{triplet} \stopxmlsetups
+\startxmlsetups xml:setups:word \show_setup_component{#1}{word} \stopxmlsetups
+\startxmlsetups xml:setups:template \show_setup_component{#1}{template} \stopxmlsetups
+\startxmlsetups xml:setups:angles \show_setup_component{#1}{angles} \stopxmlsetups
+\startxmlsetups xml:setups:apply \show_setup_component{#1}{apply} \stopxmlsetups
+\startxmlsetups xml:setups:twowords \show_setup_component{#1}{twowords} \stopxmlsetups
+\startxmlsetups xml:setups:threewords \show_setup_component{#1}{threewords} \stopxmlsetups
+\startxmlsetups xml:setups:text \show_setup_component{#1}{text} \stopxmlsetups
+
+% todo: cd:par => \par
+% todo: cd:sep => \\
+
+\unexpanded\def\show_setup_component#1#2%
+ {\ifconditional\c_cmd_doing_line
+ \getvalue{show_setup_#2}{#1}%
+ \else
+ \simpleSETUPargument{#2}%
+ \fi}
+
+%D This is the second pass; here we generate the table.
+
+\unexpanded\def\cmd_column_one_start
+ {\bgroup
+ \scratchdimen2\emwidth
+ \advance\leftskip \scratchdimen
+ \noindent\llap{\hbox to \scratchdimen{\show_setup_number\hss}}%
+ \strut}
+
+\unexpanded\def\cmd_column_one_stop
+ {\endgraf
+ \egroup}
+
+\unexpanded\def\cmd_column_two_start#1#2%
+ {\bgroup
+ \scratchdimen2.5\emwidth
+ \advance\hangindent\dimexpr\d_cmd_current_width+\scratchdimen\relax
+ \noindent \hbox to \hangindent{#1\hss\hbox to \scratchdimen{\hss#2\hss}}%
+ \strut}
+
+\unexpanded\def\cmd_column_two_stop
+ {\endgraf
+ \egroup}
+
+\startxmlsetups xml:setups:assignments
+ \ifconditional\c_cmd_doing_line
+ \ifcase\c_cmd_kind
+ \expandafter\show_setup_line
+ \else
+ \expandafter\show_setup_any
+ \fi{#1}{assignment\xmlattdef{#1}{delimiters}{brackets}}
+ \else
+ \global\d_cmd_current_width\zeropoint
+ \setbox\scratchbox\vbox\bgroup
+ \settrue\c_cmd_measuring
+ \xmlall{#1}{/(parameter|resolve)}
+ \egroup
+ \global\d_cmd_current_width\themaxboxwidth\scratchbox\relax
+ \cmd_column_one_start
+ \ignorespaces
+ \xmldoifelse {#1} {/(parameter|inherit|resolve)} {
+ \xmlflush{#1}
+ } {
+ \unknown
+ }
+ \cmd_column_one_stop
+ \godown[.75\lineheight]
+ \ignorespaces
+ \fi
+\stopxmlsetups
+
+\startxmlsetups xml:setups:keywords
+ \ifconditional\c_cmd_doing_line
+ \ifcase\c_cmd_kind
+ \expandafter\show_setup_line
+ \else
+ \expandafter\show_setup_any
+ \fi{#1}{\xmlattdef{#1}{delimiters}{brackets}}
+ \else
+ \cmd_column_one_start
+ \ignorespaces
+ \xmlflush{#1}
+ \cmd_column_one_stop
+ \godown[.75\lineheight]
+ \ignorespaces
+ \fi
+\stopxmlsetups
+
+\startxmlsetups xml:setups:parameter
+ \ifconditional\c_cmd_measuring
+ \getsetupstring{\xmlatt{#1}{name}}\par
+ \else
+ \cmd_column_two_start{\getsetupstring{\xmlatt{#1}{name}}}{=}
+ \ignorespaces
+ \xmlflush{#1}
+ \doifmode{interface:setup:defaults} {
+ \ifx\m_cmd_current_hash\empty \else
+ \begingroup
+ % todo, make a one level expansion of parameter
+ \let\emwidth \relax
+ \let\exheight\relax
+ \edef\temp{\csname named\m_cmd_current_hash parameter\endcsname\empty{\xmlatt{#1}{name}}}
+ \ifx\temp\empty \else
+ =\space
+ \detokenize\expandafter{\temp}
+ \fi
+ \endgroup
+ \fi
+ }
+ \cmd_column_two_stop
+ \fi
+ \ignorespaces
+\stopxmlsetups
+
+%xmlmapvalue{setups:method}{class} {:}
+\xmlmapvalue{setups:method}{range} {:}
+\xmlmapvalue{setups:method}{apply} {->}
+\xmlmapvalue{setups:method}{factor}{*}
+\xmlmapvalue{setups:method}{none} {}
+
+\startxmlsetups xml:setups:constant:value
+ \getsetupstring{\xmlatt{#1}{type}}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:constant
+ \doifelsemode {setups-pass-one} {
+ } {
+ \doifsomethingelse{\xmlatt{#1}{prefix}} {
+ \getsetupstring{\xmllastatt}
+ \xmlmappedvalue{setups:method}{\xmlatt{#1}{method}}{none}
+ } {
+ \doif {\xmlatt{#1}{default}} {yes} {
+ \underbar % next needs to be {braced}
+ }
+ }
+ {\getsetupstring{\xmlatt{#1}{type}}}
+ \space
+ \ignorespaces
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:variable
+ \doifelsemode {setups-pass-one} {
+ \expanded{\setupintfont{\xmlatt{#1}{value}}}\ignorespaces
+ } {
+ \getsetupstring{\xmlatt{#1}{value}}
+ \space
+ \ignorespaces
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:inherit
+% \cmd_column_two_start{}{}
+ \rawsetupstring{cd:inherits}:
+ \enspace
+ \letterbackslash
+ \xmlatt{#1}{name}
+% \cmd_column_two_stop
+ \ignorespaces
+\stopxmlsetups
+
+\unexpanded\def\simpleSETUPargument#1%
+ {\cmd_column_one_start
+ \cmd_internal_value{#1}%
+ \cmd_column_one_stop
+ \godown[.75\lineheight]
+ \ignorespaces}
+
+%D Auxiliary.
+
+\unexpanded\def\show_setup_any#1#2%
+ {\bgroup
+ \global\advance\c_cmd_current_argument\plusone
+ \setbox0=\hbox
+ {\doifelse{\xmlatt{#1}{list}}{yes}
+ {\getsetupstring{cd:#2-l}}%
+ {\getsetupstring{cd:#2-s}}}%
+ \setbox2=\hbox to \wd0
+ {\hss
+ \raise1.25\exheight\hbox
+ {\txx\ifcase\c_cmd_maximum_argument \relax
+ \or*\else\the\c_cmd_current_argument
+ \fi}%
+ \hss}%
+ \setbox4=\hbox to \wd0
+ {\hss
+ \lower2\exheight\hbox
+ \bgroup
+ \txx
+ \doif {\xmlatt{#1}{optional}} {yes}
+ {\getsetupstring{cd:optional}}%
+ \egroup
+ \hss}%
+ \ht2\ht\strutbox
+ \dp4\dp\strutbox
+ \hskip.5\emwidth
+ \wd0\zeropoint
+ \box0
+ \wd2\zeropoint
+ \box2
+ \box4%
+ \egroup
+ \ignorespaces}
+
+\unexpanded\def\show_setup_line#1#2%
+ {\kern.5\emwidth
+ \getsetupstring{cd:#2-s}%
+ \ignorespaces}
+
+\unexpanded\def\show_setup_number
+ {\global\advance\c_cmd_current_argument\plusone
+ \hbox to 2\emwidth
+ {\ifcase\c_cmd_maximum_argument \relax
+ \or*\else\the\c_cmd_current_argument
+ \fi
+ \hss}}
+
+% todo: replace = by lower
+
+\unexpanded\def\setupEQsymbol % we raise the number already
+ {.\lower.25\exheight\hpack{=}.}
+
+\unexpanded\def\setupAPPLYsymbol % we raise the number already
+ {..\lower.25\exheight\hpack{=>}..}
+
+% arguments
+
+\unexpanded\def\show_setup_displaymath#1{\show_setup_any {#1}{displaymath}}
+\unexpanded\def\show_setup_index #1{\show_setup_any {#1}{index}}
+\unexpanded\def\show_setup_math #1{\show_setup_any {#1}{math}}
+\unexpanded\def\show_setup_nothing #1{\show_setup_any {#1}{nothing}}
+\unexpanded\def\show_setup_file #1{\show_setup_any {#1}{file}}
+\unexpanded\def\show_setup_position #1{\show_setup_any {#1}{position}}
+\unexpanded\def\show_setup_template #1{\show_setup_any {#1}{template}}
+\unexpanded\def\show_setup_angles #1{\show_setup_any {#1}{angle}}
+\unexpanded\def\show_setup_reference #1{\show_setup_any {#1}{reference}}
+\unexpanded\def\show_setup_apply #1{\show_setup_any {#1}{apply}}
+\unexpanded\def\show_setup_twowords #1{\show_setup_any {#1}{twowords}}
+\unexpanded\def\show_setup_threewords #1{\show_setup_any {#1}{threewords}}
+\unexpanded\def\show_setup_csname #1{\show_setup_any {#1}{noargument}}
+\unexpanded\def\show_setup_destination#1{\show_setup_any {#1}{destination}}
+\unexpanded\def\show_setup_triplet #1{\show_setup_any {#1}{triplet}}
+\unexpanded\def\show_setup_word #1{\show_setup_any {#1}{word}}
+\unexpanded\def\show_setup_content #1{\show_setup_any {#1}{content}}
+\unexpanded\def\show_setup_text #1{\show_setup_any {#1}{textual}}
+\unexpanded\def\show_setup_to #1{\show_setup_line{#1}{to}}
+\unexpanded\def\show_setup_macro #1{\show_setup_any {#1}{macro}}
+
+% A prelude to a rewrite and some more:
+
+% \definetype[parametercommand][\v!type]
+% \definetype[parameterkey] [\v!type]
+% \definetype[parametervalue] [\v!type][\c!space=\v!on]
+
+% todo: no list but hash ..
+
+\definetype[parametercommand]
+\definetype[parameterkey]
+\definetype[parametervalue] [\c!space=\v!on]
+
+\setuptype [parametercommand] [\c!color=darkmagenta]
+\setuptype [parametervalue] [\c!color=darkyellow]
+
+\startxmlsetups xml:setups:parameters:value
+ \edef\currentsetupparameterkey {\xmlatt{#1}{name}}
+ \edef\currentsetupparametervalue{\begincsname named\currentsetupparametercategory parameter\endcsname\currentsetupparameterinstance\currentsetupparameterkey}
+ \ifx\currentsetupparameterinstance\empty
+ \expanded {
+ \NC \parameterkey {\currentsetupparameterkey}
+ \NC \parametervalue{\detokenize\expandafter{\currentsetupparametervalue}}
+ \NC \NR
+ }
+ \else\ifx\currentsetupparametervalue\empty
+ \else
+ \edef\currentsetupparameterdefault{\begincsname named\currentsetupparametercategory parameter\endcsname\empty\currentsetupparameterkey}
+ \ifx\currentsetupparametervalue\currentsetupparameterdefault
+ % skip
+ \else
+ \expanded {
+ \NC \parameterkey {\currentsetupparameterkey}
+ \NC \parametervalue{\detokenize\expandafter{\currentsetupparametervalue}}
+ \NC \NR
+ }
+ \fi
+ \fi\fi
+\stopxmlsetups
+
+\startxmlsetups xml:setups:parameters:values
+ \blank[\v!big]
+ \expanded {
+ \parametercommand {
+ \currentsetupparametercommand
+ \space:\space
+ \ifx\currentsetupparameterinstance\empty
+ defaults
+ \else
+ \currentsetupparameterinstance
+ \fi
+ }
+ }
+ \blank[\v!big,\v!samepage]
+ \starttabulate[|l|p|]
+ \xmlall
+ {#1}
+ {/interface/command[@name=='\currentsetupparametercommand' or @handler=='\currentsetupparametercommand']/arguments/assignments/parameter/command(xml:setups:parameters:value)}
+ \ifnum\noftabulaterows = \zerocount
+ \NC \parameterkey{no specific settings} \NC \NC \NR
+ \fi
+ \stoptabulate
+\stopxmlsetups
+
+\starttexdefinition showrootvalues [#1]
+ \edef\currentsetupparametercategory{#1}
+ \edef\currentsetupparametercommand{setup#1}
+ \let\currentsetupparameterinstance\empty
+ \xmlsetup{\loadedsetups}{xml:setups:parameters:values}
+\stoptexdefinition
+
+\starttexdefinition showinstancevalues [#1]#2[#3]
+ \edef\currentsetupparametercategory{#1}
+ \edef\currentsetupparametercommand{setup#1}
+ \edef\currentsetupparameterinstance{#3}
+ \xmlsetup{\loadedsetups}{xml:setups:parameters:values}
+\stoptexdefinition
+
+% official interface
+
+\unexpanded\def\cmdinternal#1%
+ {{\tttf\getsetupstring{#1}}} % todo color .. highlight
+
+\let\cmdbasicsetup\basicsetup
+\let\cmdshortsetup\shortsetup
+\let\cmdfullsetup \showsetup
+
+% bonus
+
+\definefloat
+ [definition]
+
+\setupcaption
+ [definition]
+ [align=flushright]
+
+\unexpanded\def\showdefinition#1%
+ {\placedefinition[here][definition:#1]{\tex{#1}}{\showsetup{#1}}}
+
+\unexpanded\def\definition[#1]%
+ {\begingroup
+ \getcommalistsize[#1]%
+ \scratchcounter\zerocount
+ \def\dodefinition##1%
+ {\advance\scratchcounter\plusone
+ \ifnum\scratchcounter=\commalistsize
+ \in{and}[definition:##1]%
+ \else\ifnum\scratchcounter=\plusone
+ \in{definition}[definition:##1]\space
+ \else
+ \in{, }[definition:##1]\space
+ \fi\fi}%
+ \processcommalist[#1]\dodefinition
+ \endgroup}
+
+\protect \endinput