diff options
Diffstat (limited to 'tex')
30 files changed, 1489 insertions, 1429 deletions
diff --git a/tex/context/base/back-ini.lua b/tex/context/base/back-ini.lua index 10d10c253..0c02e201a 100644 --- a/tex/context/base/back-ini.lua +++ b/tex/context/base/back-ini.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['back-ini'] = { local next, type = next, type local format = string.format +local sind, cosd = math.sind, math.cosd backends = backends or { } local backends = backends @@ -91,3 +92,11 @@ tables.vfspecials = allocate { startslant = comment, stopslant = comment, } + +-- -- experimental code -- + +function commands.pdfrotation(a) + local s, c = sind(a), cosd(a) + context("%s %s %s %s",c,s,-s,c) +end + diff --git a/tex/context/base/back-pdf.mkiv b/tex/context/base/back-pdf.mkiv index 0bd256241..db42a85dd 100644 --- a/tex/context/base/back-pdf.mkiv +++ b/tex/context/base/back-pdf.mkiv @@ -124,20 +124,44 @@ %D Transformations. Some day we will use primitives (once they're fixed). +% \def\dostartscaling#1#2% the test is needed because acrobat is bugged! +% {\forcecolorhack % maybe use signal instead +% \pdfliteral{q \ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0 +% \ifdim#2\points=\zeropoint.0001\else#2\fi\space 0 0 cm}} +% +% \def\dostopscaling +% {\pdfliteral{Q}} +% +% \def\dostartrotation#1% grouped +% {\forcecolorhack % maybe use signal instead +% \pdfliteral{q \cldcontext{lpdf.rotationcm(#1)}}} +% +% \def\dostoprotation +% {\pdfliteral{Q}} + +% function lpdf.rotationcm(a) +% local s, c = sind(a), cosd(a) +% return format("%s %s %s %s 0 0 cm",c,s,-s,c) +% end + +% todo: inject at the lua end + \def\dostartrotation#1% grouped {\forcecolorhack % maybe use signal instead - \pdfliteral{q \cldcontext{lpdf.rotationcm(#1)}}} + \pdfsave \pdfsetmatrix + {\ctxcommand{pdfrotation(#1)}}} \def\dostoprotation - {\pdfliteral{Q}} + {\pdfrestore} \def\dostartscaling#1#2% the test is needed because acrobat is bugged! {\forcecolorhack % maybe use signal instead - \pdfliteral{q \ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0 - \ifdim#2\points=\zeropoint.0001\else#2\fi\space 0 0 cm}} + \pdfsave \pdfsetmatrix + {\ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0 + \ifdim#2\points=\zeropoint.0001\else#2\fi\space}}% 0 0 \def\dostopscaling - {\pdfliteral{Q}} + {\pdfrestore} \def\dostartmirroring{\pdfliteral{-1 0 0 1 0 0 cm}} \def\dostopmirroring {\pdfliteral{-1 0 0 1 0 0 cm}} diff --git a/tex/context/base/chem-str.lua b/tex/context/base/chem-str.lua index 043cff039..7a63c2efb 100644 --- a/tex/context/base/chem-str.lua +++ b/tex/context/base/chem-str.lua @@ -230,9 +230,9 @@ local function process(spec,text,n,rulethickness,rulecolor,offset) m = m + 1 ; metacode[m] = syntax.pb.direct if keys[special] == "text" and index then if keys["c"..special] == "text" then -- can be option: auto ... - metacode[#metacode+1] = format('chem_c%s(%s,%s,"");',special,bonds,index) + m = m + 1 ; metacode[m] = format('chem_c%s(%s,%s,"");',special,bonds,index) else - metacode[#metacode+1] = format('chem_%s(%s,%s,"");',special,bonds,index) + m = m + 1 ; metacode[m] = format('chem_%s(%s,%s,"");',special,bonds,index) end end elseif operation == "save" then diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf Binary files differindex ab813a18b..2356199fe 100644 --- a/tex/context/base/context-version.pdf +++ b/tex/context/base/context-version.pdf diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png Binary files differindex 259d4f188..db19cead5 100644 --- a/tex/context/base/context-version.png +++ b/tex/context/base/context-version.png diff --git a/tex/context/base/core-env.mkiv b/tex/context/base/core-env.mkiv index dbf2b5944..5b23ec121 100644 --- a/tex/context/base/core-env.mkiv +++ b/tex/context/base/core-env.mkiv @@ -414,15 +414,15 @@ \def\??vars{@@vars} -\def\setvariables {\dotripleargument\dosetvariables[\getrawparameters ]} -\def\setevariables{\dotripleargument\dosetvariables[\getraweparameters]} -\def\setgvariables{\dotripleargument\dosetvariables[\getrawgparameters]} -\def\setxvariables{\dotripleargument\dosetvariables[\getrawxparameters]} +\unexpanded\def\setvariables {\dotripleargument\dosetvariables[\getrawparameters ]} +\unexpanded\def\setevariables{\dotripleargument\dosetvariables[\getraweparameters]} +\unexpanded\def\setgvariables{\dotripleargument\dosetvariables[\getrawgparameters]} +\unexpanded\def\setxvariables{\dotripleargument\dosetvariables[\getrawxparameters]} -\def\globalsetvariables % obsolete +\unexpanded\def\globalsetvariables % obsolete {\dotripleargument\dosetvariables[\globalgetrawparameters]} -\long\def\dosetvariables[#1][#2][#3]% tricky, test on s-pre-60 +\def\dosetvariables[#1][#2][#3]% tricky, test on s-pre-60 {\errorisfataltrue \doifelse{#2}\currentvariableclass {#1[\??vars:#2:][#3]}% @@ -434,10 +434,10 @@ \popmacro\currentvariableclass}% \errorisfatalfalse} -\long\def\setvariable #1#2#3{\long\expandafter\def \csname\??vars:#1:#2\endcsname{#3}} -\long\def\setevariable#1#2#3{\long\expandafter\edef\csname\??vars:#1:#2\endcsname{#3}} -\long\def\setgvariable#1#2#3{\long\expandafter\gdef\csname\??vars:#1:#2\endcsname{#3}} -\long\def\setxvariable#1#2#3{\long\expandafter\xdef\csname\??vars:#1:#2\endcsname{#3}} +\unexpanded\def\setvariable #1#2#3{\long\expandafter\def \csname\??vars:#1:#2\endcsname{#3}} +\unexpanded\def\setevariable#1#2#3{\long\expandafter\edef\csname\??vars:#1:#2\endcsname{#3}} +\unexpanded\def\setgvariable#1#2#3{\long\expandafter\gdef\csname\??vars:#1:#2\endcsname{#3}} +\unexpanded\def\setxvariable#1#2#3{\long\expandafter\xdef\csname\??vars:#1:#2\endcsname{#3}} \def\getvariable#1#2% {\csname diff --git a/tex/context/base/file-job.mkvi b/tex/context/base/file-job.mkvi index 0213ff910..3270d9511 100644 --- a/tex/context/base/file-job.mkvi +++ b/tex/context/base/file-job.mkvi @@ -175,7 +175,8 @@ %D Handy for modules that have a test/demo appended. -\def\continueifinputfile#1{\doifnot\inputfilename{#1}{\endinput}} +\def\continueifinputfile#name{\doifnot\inputfilename{#name}\endinput} +%def\processifinputfile #name{\doif \inputfilename{#name}} % \startproject test % 1: \startmode[*project] project \stopmode \endgraf diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua index 533d1ec3c..e3f564f24 100644 --- a/tex/context/base/font-def.lua +++ b/tex/context/base/font-def.lua @@ -299,7 +299,7 @@ function definers.loadfont(specification) local embedding if directive_embedall then embedding = "full" - elseif properties.filename and constructors.dontembed[properties.filename] then + elseif properties and properties.filename and constructors.dontembed[properties.filename] then embedding = "no" else embedding = "subset" diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 319cae65b..83b961e28 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -114,15 +114,21 @@ local function showfeatureorder(rawdata,filename) if features then for feature, scripts in next, features do local tt = { } - for script, languages in next, scripts do - local ttt = { } - for language, _ in next, languages do - ttt[#ttt+1] = language + if type(scripts) == "table" then + for script, languages in next, scripts do + local ttt = { } + for language, _ in next, languages do + ttt[#ttt+1] = language + end + tt[#tt+1] = format("[%s: %s]",script,concat(ttt," ")) + end + if trace_loading then + report_otf(" %s: %s",feature,concat(tt," ")) + end + else + if trace_loading then + report_otf(" %s: %s",feature,tostring(scripts)) end - tt[#tt+1] = format("[%s: %s]",script,concat(ttt," ")) - end - if trace_loading then - report_otf(" %s: %s",feature,concat(tt," ")) end end end diff --git a/tex/context/base/font-ott.lua b/tex/context/base/font-ott.lua index 800fd3c65..c13a20246 100644 --- a/tex/context/base/font-ott.lua +++ b/tex/context/base/font-ott.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['font-otf'] = { license = "see context related readme files" } -local type, next, tonumber, tostring, rawget = type, next, tonumber, tostring, rawget +local type, next, tonumber, tostring, rawget, rawset = type, next, tonumber, tostring, rawget, rawset local gsub, lower, format, match = string.gsub, string.lower, string.format, string.match local is_boolean = string.is_boolean @@ -635,11 +635,18 @@ local baselines = allocate { ['romn'] = 'roman baseline' } +local acceptscripts = true directives.register("otf.acceptscripts", function(v) acceptscripts = v end) +local acceptlanguages = true directives.register("otf.acceptlanguages", function(v) acceptlanguages = v end) + +local report_checks = logs.reporter("fonts","checks") + tables.scripts = scripts tables.languages = languages tables.features = features tables.baselines = baselines +-- hm, we overload the metatables + if otffeatures.features then for k, v in next, otffeatures.features do features[k] = v @@ -670,7 +677,6 @@ local function resolve(t,k) return v end end - return "dflt" end setmetatableindex(verbosescripts, resolve) @@ -678,20 +684,51 @@ setmetatableindex(verboselanguages, resolve) setmetatableindex(verbosefeatures, resolve) setmetatableindex(verbosebaselines, resolve) -local function resolve(t,k) +setmetatableindex(scripts, function(t,k) if k then k = lower(k) - local v = rawget(t,k) or rawget(t,gsub(k," ","")) + if k == "dflt" then + return k + end + local v = rawget(t,k) if v then return v end + k = gsub(k," ","") + v = rawget(t,v) + if v then + return v + elseif acceptscripts then + report_checks("registering extra script: %s",k) + rawset(t,k,k) + return k + end end return "dflt" -end +end) -setmetatableindex(scripts, resolve) -setmetatableindex(scripts, resolve) -setmetatableindex(languages, resolve) +setmetatableindex(languages, function(t,k) + if k then + k = lower(k) + if k == "dflt" then + return k + end + local v = rawget(t,k) + if v then + return v + end + k = gsub(k," ","") + v = rawget(t,v) + if v then + return v + elseif acceptlanguages then + report_checks("registering extra languages: %s",k) + rawset(t,k,k) + return k + end + end + return "dflt" +end) setmetatablenewindex(languages, "ignore") setmetatablenewindex(baselines, "ignore") @@ -745,18 +782,10 @@ function otf.features.normalize(features) -- no longer 'lang' k = lower(k) if k == "language" then v = gsub(lower(v),"[^a-z0-9]","") - if rawget(languages,v) then - h.language = v - else - h.language = rawget(verboselanguages,v) or "dflt" - end + h.language = rawget(verboselanguages,v) or languages[v] or "dflt" -- auto adds elseif k == "script" then v = gsub(lower(v),"[^a-z0-9]","") - if rawget(scripts,v) then - h.script = v - else - h.script = rawget(verbosescripts,v) or "dflt" - end + h.script = rawget(verbosescripts,v) or scripts[v] or "dflt" -- auto adds else if type(v) == "string" then local b = is_boolean(v) diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua index eb85c3dea..fe48613a9 100644 --- a/tex/context/base/lpdf-ano.lua +++ b/tex/context/base/lpdf-ano.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['lpdf-ano'] = { license = "see context related readme files" } +-- when using rotation: \disabledirectives[refences.sharelinks] (maybe flag links) + local next, tostring = next, tostring local rep, format = string.rep, string.format local texcount = tex.count @@ -254,7 +256,7 @@ local function use_shared_annotations() local h, v = pdf.h, pdf.v local llx, lly = h*factor, (v - depth)*factor local urx, ury = (h + width)*factor, (v + height)*factor - local annot = format("<< /Type /Annot %s /Rect [%0.2f %0.2f %0.2f %0.2f] >>",prerolled,llx,lly,urx,ury) + local annot = format("<< /Type /Annot %s /Rect [%0.3f %0.3f %0.3f %0.3f] >>",prerolled,llx,lly,urx,ury) local n = hashed[annot] if not n then n = pdfdelayedobject(annot) diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua index 8c6cbbb06..0dd85a808 100644 --- a/tex/context/base/lxml-tex.lua +++ b/tex/context/base/lxml-tex.lua @@ -48,6 +48,8 @@ local trace_comments = false trackers.register("lxml.comments", function(v) tra local report_lxml = logs.reporter("xml","tex") +local forceraw, rawroot = false, nil + -- tex entities -- -- todo: unprivatize attributes @@ -70,36 +72,40 @@ function lxml.registerentity(key,value) end function lxml.resolvedentity(str) - local e = texentities[str] - if e then - local te = type(e) - if te == "function" then - e(str) - elseif e then - context(e) - end - return - end - local e = xmlentities[str] - if e then - local te = type(e) - if te == "function" then - e = e(str) + if forceraw then + context("&%s;",str) + else + local e = texentities[str] + if e then + local te = type(e) + if te == "function" then + e(str) + elseif e then + context(e) + end + return end + local e = xmlentities[str] if e then - contextsprint(notcatcodes,e) + local te = type(e) + if te == "function" then + e = e(str) + end + if e then + contextsprint(notcatcodes,e) + end + return + end + -- resolve hex and dec, todo: escape # & etc for ctxcatcodes + -- normally this is already solved while loading the file + local chr, err = lpegmatch(parsedentity,str) + if chr then + context(chr) + elseif err then + context(err) + else + context.xmle(str,utfupper(str)) -- we need to use our own upper end - return - end - -- resolve hex and dec, todo: escape # & etc for ctxcatcodes - -- normally this is already solved while loading the file - local chr, err = lpegmatch(parsedentity,str) - if chr then - context(chr) - elseif err then - context(err) - else - context.xmle(str,utfupper(str)) -- we need to use our own upper end end @@ -153,8 +159,6 @@ lxml.toverbatim = context.newverbosehandler { -- raw flushing -local forceraw, rawroot = false, nil - function lxml.startraw() forceraw = true end @@ -575,17 +579,19 @@ function lxml.setaction(id,pattern,action) end end -local function sprint(root) +local function sprint(root) -- check rawroot usage if root then local tr = type(root) if tr == "string" then -- can also be result of lpath - -- rawroot = false + -- rawroot = false -- ? root = xmlunprivatized(root) lpegmatch(xmltextcapture,root) elseif tr == "table" then if forceraw then rawroot = root - contextsprint(ctxcatcodes,xmltostring(root)) + -- contextsprint(ctxcatcodes,xmltostring(root)) -- goe wrong with % etc + root = xmlunprivatized(xmltostring(root)) + lpegmatch(xmltextcapture,root) -- goes to toc else xmlserialize(root,xmltexhandler) end @@ -622,7 +628,9 @@ local function cprint(root) -- content local rootdt = root.dt if forceraw then rawroot = root - contextsprint(ctxcatcodes,xmltostring(rootdt or root)) + -- contextsprint(ctxcatcodes,xmltostring(rootdt or root)) + root = xmlunprivatized(xmltostring(root)) + lpegmatch(xmltextcapture,root) -- goes to toc else xmlserialize(rootdt or root,xmltexhandler) end diff --git a/tex/context/base/m-chart.mkiv b/tex/context/base/m-chart.mkiv index 3850adf32..165cb1720 100644 --- a/tex/context/base/m-chart.mkiv +++ b/tex/context/base/m-chart.mkiv @@ -14,1278 +14,6 @@ %D This module will be reimplemented as it can be done much more %D simple now in mkiv,. - -% todo: \localpushmacro/\localpopmacro (dohandleflowchart etc) -% todo: make mkiv variant -% todo: use dimexpr/numspr - -% will be redone with layers and dimexpr or even better, by just using -% textext .. a nice example of old code - -%D This is an experimental module. Pieces of code will be moved -%D to other modules. More features are possible but will be -%D interfaces later. -%D -%D When finished this module will be documented. The main macro -%D is still a rather big one and there is some redundant and -%D slow code that needs a clean up. - -% arrow, dash -% crossing -% \goto -> \normalgoto -% class -> class:name (ref prefix) -% c, automatisch geen overlap zoeken -% eind eerder chart connecties -% relateren aan korps -% check op bestaan naam, bestaan shape -% auto als extern figuur -% subchart -% pijlen -% focus -% ook nog \MPmessage -% areapath -> krappe vlak -% clippath -> gehele vlak -% -% offset : clip offset -% breedte : breedte cel -% hoogte : hoogte cel -% dx : halve afstand in breedte (grid breedte = breedte + 2dx) -% dy : halve afstand in hoogte (grid hoogte = hoogte + 2dy) -% x : x offset (clipping) -% y : y offset (clipping) -% nx : minimaal aantal cellen horizontaal -% ny : minimaal aantal cellen vertikaal -% -% shape none en geen equivalent maken -% -% kaderkleur achtergrondkleur -% lijnkleur lijndikte -% focus focuskaderkleur focusachtergrondkleur -% richting -% -% focus koppelen aan kleur - -\unprotect - -\definesorting [flowchart] [flowcharts] [\v!none] % no access -\setupsorting [flowchart] [\c!state=\v!stop] % off by default - -\def\@FLOW@{@FLOW@} -\def\@FLOC@{@FLOC@} -\def\@FLOX@{@FLOX@} - -\def\@@FLOW{@@FLOW} -\def\@@FLOL{@@FLOL} -\def\@@FLOS{@@FLOS} -\def\@@FLOF{@@FLOF} -\def\@@FLOT{@@FLOT} -\def\@@FLOX{@@FLOX} - -\def\@@MPx {@@MPx} -\def\@@MPy {@@MPy} - -\def\FLOWbufferprefix{flw-} - -\def\processFLOWbuffer#1{\getbuffer[\FLOWbufferprefix#1]} -\def\typeFLOWbuffer #1{\typebuffer[\FLOWbufferprefix#1]} - -\def\setFLOWname#1#2% funny hack that makes sure that we get - {\bgroup % names that are acceptable for METAPOST - \lccode`0=`a\lccode`1=`b\lccode`2=`c\lccode`3=`d\lccode`4=`e% - \lccode`5=`f\lccode`6=`g\lccode`7=`h\lccode`8=`i\lccode`9=`j% - \lccode` =`\_\lccode`-=`\_\lccode`_=`\_% - \lowercase{\gdef#1{#2}}% todo: make a ctxlua call of this - \egroup} - -% een gobble als default is sneller, en dan alleen setten als -% nodig - -\def\resetFLOWcell - {% variables - \global\let\FLOWname \empty - \global\let\FLOWalign \empty - \global\let\FLOWshape \empty - \global\let\FLOWlocation \empty - \global\let\FLOWtext \empty - \global\let\FLOWhelp \empty - \global\let\FLOWdestination\empty - \global\let\FLOWoverlay \empty - \global\let\FLOWfocus \empty - \global\let\tFLOWlabel \empty - \global\let\bFLOWlabel \empty - \global\let\lFLOWlabel \empty - \global\let\rFLOWlabel \empty - \global\let\bcFLOWlabel \empty - \global\let\tcFLOWlabel \empty - \global\let\lcFLOWlabel \empty - \global\let\rcFLOWlabel \empty - \global\let\tFLOWexit \empty - \global\let\bFLOWexit \empty - \global\let\lFLOWexit \empty - \global\let\rFLOWexit \empty - % commands - \let\name \doFLOWname - \let\shape \doFLOWshape - \let\destination\doFLOWdestination - \let\location \doFLOWlocation - \let\focus \doFLOWfocus - \let\overlay \doFLOWoverlay - \let\figure \doFLOWfigure - \let\text \doFLOWtext - \let\comment \doFLOWcomment - \let\label \doFLOWlabel - \let\help \doFLOWhelp - \let\connection \doFLOWconnection - \let\exit \doFLOWexit - % convenience commands - \let\locate \doFLOWlocate - \let\connect \doFLOWconnect} - -\let\FLOWcell \s!unknown -\let\FLOWshape \s!unknown -\let\FLOWdestination\s!unknown -\let\FLOWfocus \s!unknown -\let\FLOWoverlay \empty -\let\FLOWtext \empty - -\def\doFLOWname#1% - {\def\FLOWcell{#1}\setFLOWname\FLOWname{name_#1}\ignorespaces} - -\def\doFLOWshape#1% - {\gdef\FLOWshape{#1}\ignorespaces} - -\def\doFLOWdestination#1% - {\gdef\FLOWdestination{#1}\ignorespaces} - -\def\doFLOWlocation#1% - {\setFLOWlocation#1\end\ignorespaces} - -\def\doFLOWfocus#1% - {\gdef\FLOWfocus{#1}\ignorespaces} - -\def\doFLOWoverlay#1% - {\gdef\FLOWoverlay{#1}\ignorespaces} - -\def\doFLOWfigure#1% - {\defineoverlay[\s!dummy][\overlayfigure{#1}]% - \overlay\s!dummy} - -\def\doFLOWtext - {\dosingleempty\dodoFLOWtext} - -\def\dodoFLOWtext[#1]% % #2% - {\gdef\FLOWalign{#1}\gdef\FLOWtext}% {#2}} - -\def\doFLOWcomment[#1]#2% - {\ignorespaces\dogobblesingleempty} - -\def\doFLOWlabel[#1]#2% wordt dit gebruikt ? - {\setgvalue{#1FLOWlabel}{#2}\ignorespaces} - -\def\doFLOWhelp#1% - {\gdef\FLOWhelp{#1}\ignorespaces} - -\def\doFLOWconnection - {\dodoubleempty\dodoFLOWconnection} - -\def\dodoFLOWconnection[#1][#2]#3% - {\ignorespaces} - -\def\doFLOWconnect - {\connection} - -\def\doFLOWlocate - {\location} - -\def\doFLOWexit[#1]#2% - {\setgvalue{#1FLOWexit}{#2}\ignorespaces} - -\def\startFLOWchart - {\bgroup - \let\stopFLOWchart\egroup - \obeylines % lelijk, buffers nog eens fatsoeneren - \dodoubleempty\dostartFLOWchart} - -\def\dostartFLOWchart[#1][#2]% - {\preparenextFLOWchart{#1}{#2}% - \dostartbuffer[\FLOWbufferprefix\nofFLOWcharts][startFLOWchart][stopFLOWchart]} - -\def\defineFLOWchart% - {\dodoubleempty\dodefineFLOWchart} - -\long\def\dodefineFLOWchart[#1][#2]#3% - {\preparenextFLOWchart{#1}{#2}% - \setbuffer[\FLOWbufferprefix\nofFLOWcharts]#3\endbuffer} - -\def\preparenextFLOWchart#1#2% - {\doglobal\increment\nofFLOWcharts - \flowchart{#1}% - \setxvalue{\@FLOW@-#1}{\noexpand\dohandleflowchart[\nofFLOWcharts][#2]}} - -\def\setupFLOWcharts{\dodoubleargument\getparameters[\@@FLOW]} -\def\setupFLOWlines {\dodoubleargument\getparameters[\@@FLOL]} -\def\setupFLOWshapes{\dodoubleargument\getparameters[\@@FLOS]} -\def\setupFLOWfocus {\dodoubleargument\getparameters[\@@FLOF]} -\def\setupFLOWsets {\dodoubleargument\getparameters[\@@FLOX]} - -\setupFLOWcharts - [\c!option=, - \c!bodyfont=, - \c!dot=, % private option - \c!width=12\bodyfontsize, - \c!height=7\bodyfontsize, - \c!maxwidth=, - \c!maxheight=, - \c!offset=\v!standard, % == auto offset - \c!dx=2\bodyfontsize, - \c!dy=2\bodyfontsize, - \c!nx=0, % 1, - \c!ny=0, % 1, - \c!x=1, - \c!y=1, - \c!autofocus=, - \c!focus=, - \c!background=, % \v!color, - \c!backgroundcolor=\s!white, - \c!rulethickness=\linewidth, - \c!frame=\v!off, - \c!framecolor=] - -\setupFLOWlines - [\c!corner=\v!round, - \c!arrow=\v!yes, - \c!dash=\v!no, - \c!radius=.375\bodyfontsize, % 2.5\c!rulethickness - \c!color=FLOWlinecolor, - \c!rulethickness=.15\bodyfontsize, % 2pt, - \c!offset=\v!none] - -\setupFLOWshapes - [\c!default=action, - \c!framecolor=FLOWframecolor, - \c!background=\v!color, - \c!backgroundcolor=FLOWbackgroundcolor, - \c!backgroundscreen=\@@rsscreen, - \c!rulethickness=.15\bodyfontsize, % 2pt, - \c!offset=.5\bodyfontsize] - -\setupFLOWfocus - [\c!framecolor=FLOWfocuscolor, - \c!background=\@@FLOSbackground, - \c!backgroundcolor=\@@FLOSbackgroundcolor, - \c!backgroundscreen=\@@FLOSbackgroundscreen, - \c!rulethickness=\@@FLOSrulethickness, - \c!offset=\@@FLOSoffset] - -\definecolor [FLOWfocuscolor] [s=.2] -\definecolor [FLOWlinecolor] [s=.5] -\definecolor [FLOWframecolor] [s=.7] -\definecolor [FLOWbackgroundcolor] [s=.9] - -\newcounter\includeFLOWx -\newcounter\includeFLOWy - -\def\includeFLOWchart - {\dodoubleempty\doincludeFLOWchart} - -\def\doincludeFLOWchart[#1][#2]% - {\pushmacro\includeFLOWx - \pushmacro\includeFLOWy - \getparameters[FLOWi][x=1,y=1,#2]% - \increment(\includeFLOWx,0\FLOWix)\decrement\includeFLOWx - \increment(\includeFLOWy,0\FLOWiy)\decrement\includeFLOWy - \def\dodoincludeFLOWchart##1% - {\doifdefined{\@FLOW@-##1} - {\globalpushmacro\dohandleflowchart % was local - \gdef\dohandleflowchart[####1][####2]% - {\globalpopmacro\dohandleflowchart % was local - \resetFLOWlocation - \processFLOWbuffer{####1}}% - \getvalue{\@FLOW@-##1}}}% - \processcommalist[#1]\dodoincludeFLOWchart - \popmacro\includeFLOWx - \popmacro\includeFLOWy} - -\def\resetFLOWlocation - {\globallet\lastFLOWx\!!zerocount - \globallet\lastFLOWy\!!zerocount} - -\def\dosetFLOWlocation[#1#2]#3#4% - {\processaction - [#1#2] - [ +=>\scratchcounter\numexpr#4+ 1+#3\relax, - -=>\scratchcounter\numexpr#4- 1+#3\relax, - +#2=>\scratchcounter\numexpr#4+#2+#3\relax, - -#2=>\scratchcounter\numexpr#4-#2+#3\relax, - \s!default=>\scratchcounter\numexpr#4 +#3\relax, - \s!unknown=>\scratchcounter\numexpr0#1#2+#3\relax]% - \xdef#4{\the\scratchcounter}} - -\def\setFLOWlocation#1,#2\end - {\dosetFLOWlocation[#1\empty]\includeFLOWx\lastFLOWx - \dosetFLOWlocation[#2\empty]\includeFLOWy\lastFLOWy - \xdef\FLOWlocation{\lastFLOWx,\lastFLOWy}} - -\def\FLOWshapes - {node, action, procedure, product, decision, archive, - loop, wait, subprocedure, singledocument, multidocument, - sub procedure, single document, multi document, up, down, - left, right} - -\def\FLOWlines - {up, down, left, right} - -\def\FLOWsetconnect#1% - {\donefalse - \let\cFLOWfrom\empty - \let\cFLOWto\empty - \let\zFLOWfrom\!!zerocount - \let\zFLOWto\!!zerocount - \handletokens#1\with\doFLOWsetconnect - \ifx\cFLOWto\empty\let\cFLOWfrom\empty\fi} - -\def\doFLOWsetconnect#1% - {\ifx #1p% - \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi - \else\ifx#1+% - \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi - \else\ifx#1n% - \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi - \else\ifx#1-% - \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi - \else\ifdone - \edef\cFLOWto{\FLOWconnector#1}% - \else - \edef\cFLOWfrom{\FLOWconnector#1}% - \donetrue - \fi\fi\fi\fi\fi} - -\def\FLOWconnector#1% - {\if#1bbottom\else\if#1ttop\else\if#1lleft\else\if#1rright\fi\fi\fi\fi} - -\newif\ifFLOWscaling \FLOWscalingtrue - -\def\@@FLOW@@offset{\@@FLOWoffset} - -\def\getFLOWchart - {\dodoubleempty\dogetFLOWchart} - -\def\dogetFLOWchart[#1][#2]% - {\doifundefinedelse{\@FLOW@-#1} - {\writestatus{FLOW}{unknown chart #1}% - \framed - [\c!width=12\bodyfontsize,\c!height=8\bodyfontsize] - {\tttf [chart #1]}} - {\dodogetFLOWchart[#1][#2]}} - -\def\dodogetFLOWchart[#1][#2]% to be split a bit more - {\vbox\bgroup - \insidefloattrue - \forgetall - \dontcomplain - % \offinterlineskip % we now explicitly use \nointerlineskip later on - \def\dohandleflowchart[##1][##2]% - {\def\currentFLOWnumber{##1}% - \getparameters[\@@FLOW][##2]}% - \getvalue{\@FLOW@-#1}% - \getparameters[\@@FLOW][#2]% dubbelop ? - \doifsomething{\@@FLOWautofocus} - {\checkFLOWautofocus}% - %\message{AUTOSHAPE 3: (\@@FLOWx,\@@FLOWy)->(\@@FLOWnx,\@@FLOWny)}\wait - \global\let\FLOWwidth \@@FLOWnx - \global\let\FLOWheight\@@FLOWny - \let\startFLOWcell\startFLOWcellA - \resetFLOWlocation - \processFLOWbuffer\currentFLOWnumber - \ifcase\@@FLOWnx\relax \let\@@FLOWnx\FLOWwidth \fi - \ifcase\@@FLOWny\relax \let\@@FLOWny\FLOWheight \fi - \doifnothing{\@@FLOWmaxwidth\@@FLOWmaxheight}{\FLOWscalingfalse}% - \ifFLOWscaling - \doifnothing{\@@FLOWmaxwidth }{\let\@@FLOWmaxwidth \maxdimen}% - \doifnothing{\@@FLOWmaxheight}{\let\@@FLOWmaxheight\maxdimen}% - \scratchcounter\bodyfontpoints - \doloop % NOG FONTSWITCH OM EX EN EM TE LATEN WERKEN - {\ifnum\scratchcounter>1 % NU DIMENSIONS IN TERMS OF BODYFONTSIZE - \bodyfontsize=\the\scratchcounter pt - \dimen0=\@@FLOWmaxwidth - \dimen2=\@@FLOWwidth - \dimen4=\@@FLOWdx - \advance\dimen2 2\dimen4 - \dimen2=\@@FLOWnx\dimen2 - \advance\dimen2 2\dimen4 - \ifdim\dimen2>\dimen0 - \advance\scratchcounter \minusone - \else - \dimen0=\@@FLOWmaxheight - \dimen2=\@@FLOWheight - \dimen4=\@@FLOWdy - \advance\dimen2 2\dimen4 - \dimen2=\@@FLOWny\dimen2 - \advance\dimen2 2\dimen4 - \ifdim\dimen2>\dimen0 - \advance\scratchcounter \minusone - \else - \exitloop - \fi - \fi - \else - \exitloop - \fi}% - \expanded{\switchtobodyfont[\the\scratchcounter pt]}% - \forgetall - % \offinterlineskip % needed ? - \else\ifx\@@FLOWbodyfont\empty\else - \expanded{\switchtobodyfont[\@@FLOWbodyfont]}% \expanded ? - \fi\fi - \global\let\FLOWcells\empty - \dimen0=\@@FLOWwidth - \edef\FLOWshapewidth{\the\dimen0}% - \dimen2=\@@FLOWdx - \advance\dimen0 2\dimen2 - \edef\FLOWgridwidth{\the\dimen0}% - \dimen0=\@@FLOWheight - \edef\FLOWshapeheight{\the\dimen0}% - \dimen2=\@@FLOWdy - \advance\dimen0 2\dimen2 - \edef\FLOWgridheight{\the\dimen0}% - \scratchdimen=\@@FLOSrulethickness - \edef\@@FLOSrulethickness{\the\scratchdimen}% - \scratchdimen=\@@FLOFrulethickness - \edef\@@FLOFrulethickness{\the\scratchdimen}% - \scratchdimen=\@@FLOLrulethickness - \edef\@@FLOLrulethickness{\the\scratchdimen}% - \ifdim\@@FLOLradius<2.5\scratchdimen - \scratchdimen=2.5\scratchdimen - \edef\@@FLOLradius{\the\scratchdimen}% - \ifdim\@@FLOLradius>\@@FLOWdx - \scratchdimen=\@@FLOWdx - \edef\@@FLOLradius{\the\scratchdimen}% - \fi - \ifdim\@@FLOLradius>\@@FLOWdy - \scratchdimen=\@@FLOWdy - \edef\@@FLOLradius{\the\scratchdimen}% - \fi - \else - \scratchdimen=\@@FLOLradius - \edef\@@FLOLradius{\the\scratchdimen}% - \fi - \processaction % magic 2.5 - [\@@FLOWoffset] - [ \v!none=>\scratchdimen=-2.5\scratchdimen, - \v!overlay=>\scratchdimen=-2.5\scratchdimen, - \v!standard=>\scratchdimen=\scratchdimen, - \s!unknown=>\scratchdimen=\@@FLOWoffset, - \s!default=>\scratchdimen=-2.5\scratchdimen]% - \edef\@@FLOW@@offset{\the\scratchdimen}% - \forgetall - \offinterlineskip - \resetMPdrawing - \doglobal\newcounter\FLOWcomment - \startMPdrawing - if unknown context_char : input mp-char.mp ; fi ; - grid_width := \FLOWgridwidth ; - grid_height := \FLOWgridheight ; - shape_width := \FLOWshapewidth ; - shape_height := \FLOWshapeheight ; - connection_line_width := \@@FLOLrulethickness ; - connection_smooth_size := \@@FLOLradius ; - connection_arrow_size := \@@FLOLradius ; - connection_dash_size := \@@FLOLradius ; - currentpicture := nullpicture ; - begin_chart(0,\FLOWwidth,\FLOWheight); - reverse_y := true ; - chart_offset := \@@FLOW@@offset ; - \stopMPdrawing - \doifelsenothing\@@FLOWbackgroundcolor - {\startMPdrawing - chart_background_color := white ; - \stopMPdrawing} - {\startMPdrawing - chart_background_color := \MPcolor{\@@FLOWbackgroundcolor} ; - \stopMPdrawing}% - \doif\@@FLOWoption\v!test - {\startMPdrawing - show_con_points := true ; - show_mid_points := true ; - show_all_points := true ; - \stopMPdrawing}% - \processaction % private - [\@@FLOWdot] - [ \v!yes=>\startMPdrawing - show_con_points := true ; - show_mid_points := true ; - show_all_points := true ; - \stopMPdrawing, - \s!unknown=>\startMPdrawing - show_\@@FLOWdot _points := true ; - \stopMPdrawing]% -\doglobal\newcounter\FLOWcomment - \let\startFLOWcell\startFLOWcellB - \resetFLOWlocation - \processFLOWbuffer\currentFLOWnumber -\doglobal\newcounter\FLOWcomment - \let\startFLOWcell\startFLOWcellC - \resetFLOWlocation - \processFLOWbuffer\currentFLOWnumber - \startMPdrawing - clip_chart(\@@FLOWx,\@@FLOWy,\@@FLOWnx,\@@FLOWny) ; - end_chart ; - \stopMPdrawing - \MPdrawingdonetrue - \setbox0\hbox - {\MPstaticgraphictrue - \MPshiftdrawingfalse - \getMPdrawing}% - \def\MPmessage##1% - {\writestatus{MP charts}{##1}}% - \def\MPposition##1##2##3% - {\setvalue{\@@MPx##1}{##2}\setvalue{\@@MPy##1}{##3}}% - \def\MPclippath##1##2##3##4% - {\def\clipMPllx{##1bp}\def\clipMPlly{##2bp}% - \def\clipMPurx{##3bp}\def\clipMPury{##4bp}}% - \def\MPareapath##1##2##3##4% - {\def\areaMPllx{##1bp}\def\areaMPlly{##2bp}% - \def\areaMPurx{##3bp}\def\areaMPury{##4bp}}% - \getMPdata - \doglobal\newcounter\FLOWcomment - \let\startFLOWcell\startFLOWcellD - \setbox2\vbox to \ht0 - {\forgetall % \offinterlineskip - \resetFLOWlocation - \processFLOWbuffer\currentFLOWnumber\vss}% - \setbox2\hbox - {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box2}% - \wd2\wd0\ht2\ht0\dp2\dp0 - \let\startFLOWcell\startFLOWcellE - \setbox4\vbox to \ht0 - {\forgetall % \offinterlineskip - \resetFLOWlocation - \processFLOWbuffer\currentFLOWnumber\vss}% - \setbox4\hbox - {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box4}% - \wd4\wd0\ht4\ht0\dp4\dp0 - \doifelse\@@FLOWoption\v!test - {\setbox6\vbox - {\forgetall - \vskip\@@FLOW@@offset - \hskip\@@FLOW@@offset - \basegrid - [\c!x=\@@FLOWx,\c!nx=\@@FLOWnx,\c!dx=\withoutpt\FLOWgridwidth, - \c!y=\@@FLOWy,\c!ny=\@@FLOWny,\c!dy=\withoutpt\FLOWgridheight, - \c!xstep=1,\c!ystep=1, - \c!unit=pt,\c!location=\v!middle]}% - \wd6\wd0\ht6\ht0\dp6\dp0 - \setbox8\vbox - {\forgetall - \offinterlineskip - \vskip\@@FLOW@@offset - \dostepwiserecurse\@@FLOWy\@@FLOWny\plusone - {\vbox to \FLOWgridheight - {\vfill - \hskip\@@FLOW@@offset - \hbox - {\dostepwiserecurse\@@FLOWx\@@FLOWnx\plusone - {\hbox to \FLOWgridwidth - {\hfill - \framed - [\c!framecolor=red, - \c!width=\FLOWshapewidth, - \c!height=\FLOWshapeheight] - {}% - \hfill}}} - \vfill}}}% - \wd8\wd0\ht8\ht0\dp8\dp0 - \framed - [\c!offset=\v!overlay,\c!framecolor=green] - {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2\hskip-\wd6\box6\hskip-\wd8\box8}}} - {\framed - [\c!offset=\v!overlay, - \c!frame=\@@FLOWframe, - \c!rulethickness=\@@FLOWrulethickness, - \c!framecolor=\@@FLOWframecolor, - \c!background=\@@FLOWbackground, - \c!backgroundcolor=\@@FLOWbackgroundcolor] - {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2}}}% - %\message{[\FLOWcells]}\wait - \egroup} - -% Pass A - -\long\def\startFLOWcellA#1\stopFLOWcell% - {\resetFLOWcell - \ignorespaces#1\unskip - \expandafter\getFLOWlocationA\FLOWlocation\end - \ignorespaces} - -\def\getFLOWlocationA#1,#2\end - {\ifnum0#1>\FLOWwidth \xdef\FLOWwidth {#1}\fi - \ifnum0#2>\FLOWheight\xdef\FLOWheight{#2}\fi} - -% Pass B -% -% beware: the - after \@FLOC@ is needed since name can be -% empty and we don't want to redefine \@FLOC@ itself by -% mistake - -\long\def\startFLOWcellB#1\stopFLOWcell - {\resetFLOWcell\ignorespaces#1\unskip - \setxvalue{\@FLOC@-\FLOWname}{\FLOWlocation}% kost veel cs's - \ifx\FLOWshape\empty - \global\let\FLOWshape\@@FLOSdefault - \fi - \doifnot\FLOWshape{none} % {\v!none} - {\doifinsetelse\FLOWshape\FLOWshapes - {\edef\FLOWshapetag{shape_ \FLOWshape}% beter \expanded - \@EA\setFLOWname\@EA\FLOWshapetag\@EA{\FLOWshapetag}} - {\doifnumberelse\FLOWshape - {\let\FLOWshapetag\FLOWshape} - {\let\FLOWshapetag\empty}}% - \ifx\FLOWshapetag\empty \else - \doifinsetelse\FLOWshape\FLOWlines - {\chardef\FLOWstate0 } - {\doifcommonelse{\FLOWcell,\FLOWfocus}\@@FLOWfocus - {\chardef\FLOWstate1 } - {\chardef\FLOWstate2 }}% - \startMPdrawing - begin_sub_chart ; - \ifcase\FLOWstate - shape_line_color := \MPcolor{\@@FLOLcolor} ; - shape_fill_color := \MPcolor{\@@FLOLcolor} ; - shape_line_width := \@@FLOLrulethickness ; - \or - shape_line_color := \MPcolor{\@@FLOFframecolor} ; - shape_fill_color := \MPcolor{\@@FLOFbackgroundcolor} ; - shape_line_width := \@@FLOFrulethickness ; - \or - shape_line_color := \MPcolor{\@@FLOSframecolor} ; - shape_fill_color := \MPcolor{\@@FLOSbackgroundcolor} ; - shape_line_width := \@@FLOSrulethickness ; - \fi - %\ifx\FLOWoverlay\empty - % peepshape := false ; - %\else - % peepshape := true ; - %\fi - peepshape := \ifx\FLOWoverlay\empty false \else true \fi ; - new_shape(\FLOWlocation,\FLOWshapetag) ; - end_sub_chart ; - \stopMPdrawing - \fi}% - \ignorespaces} - -% Pass C - -\long\def\startFLOWcellC#1\stopFLOWcell% - {\resetFLOWcell -\pushmacro\lastFLOWx -\pushmacro\lastFLOWy - \ignorespaces#1\unskip % makes sure that vars are set -\popmacro\lastFLOWy -\popmacro\lastFLOWx - \let\connection\doFLOWconnectionC - \ignorespaces#1\unskip} - -\def\FLOWorigin{0,0} - -\def\doFLOWdisplace[#1,#2,#3]% experiment - {dsp_x := #1 ; dsp_y := #2 ;} - -\def\doFLOWconnectionC - {\dodoubleempty\dodoFLOWconnectionC} - -\def\dodoFLOWconnectionC[#1][#2]#3% - {\doglobal\increment\FLOWcomment - \setFLOWname\otherFLOWname{name_#3}% - \doifdefinedelse{\@FLOC@-\FLOWname} - {\edef\FLOWfrom{\getvalue{\@FLOC@-\FLOWname}}} - {\let \FLOWfrom \FLOWorigin}% - \ifx\FLOWfrom\FLOWorigin \else - \doifdefinedelse{\@FLOC@-\otherFLOWname} - {\edef\FLOWto {\getvalue{\@FLOC@-\otherFLOWname}}} - {\let \FLOWto \FLOWorigin}% - \ifx\FLOWto\FLOWorigin \else - \FLOWsetconnect{#1}% - \ifx\cFLOWfrom\empty \else - \doifelse\@@FLOLcorner\v!round - {\startMPdrawing smooth := true ; \stopMPdrawing} - {\startMPdrawing smooth := false ; \stopMPdrawing}% - \doifelse\@@FLOLdash\v!yes - {\startMPdrawing dashline := true ; \stopMPdrawing} - {\startMPdrawing dashline := false ; \stopMPdrawing}% - \doifelse\@@FLOLarrow\v!yes - {\startMPdrawing arrowtip := true ; \stopMPdrawing} - {\startMPdrawing arrowtip := false ; \stopMPdrawing}% - \doifelse\@@FLOLoffset\v!none - {\startMPdrawing touchshape := true ; \stopMPdrawing} - {\startMPdrawing touchshape := false ; \stopMPdrawing}% -%\doifsomething{#2} -% {\startMPdrawing -% \doFLOWdisplace[0#2,0,0]% -% \stopMPdrawing}% - \startMPdrawing -\doFLOWdisplace[0#2,0,0]% - connection_line_color := \MPcolor{\@@FLOLcolor} ; - connection_line_width := \@@FLOLrulethickness ; - connect_\cFLOWfrom _\cFLOWto (\FLOWfrom,\zFLOWfrom) (\FLOWto,\zFLOWto) ; -\doFLOWdisplace[0,0,0]% - \stopMPdrawing - \fi - \fi - \fi - \ignorespaces} - -% Pass D - -\long\def\startFLOWcellD#1\stopFLOWcell - {\resetFLOWcell -\pushmacro\lastFLOWx -\pushmacro\lastFLOWy - \ignorespaces#1\unskip % presets vars -\popmacro\lastFLOWy -\popmacro\lastFLOWx - \let\doprocessFLOWcell\doprocessFLOWcellD - \expandafter\doprocessFLOWcellD\FLOWlocation\end - \let\connection\doFLOWconnectionD - \let\comment\doFLOWcommentD - \ignorespaces#1\unskip\ignorespaces} - -\def\doFLOWconnectionD - {\dodoubleempty\dodoFLOWconnectionD} - -\def\dodoFLOWconnectionD[#1][#2]#3% - {\doglobal\increment\FLOWcomment - \ignorespaces} - -\def\doFLOWcommentD[#1]#2% - {\bgroup - \let\FLOW \middlebox - \let\FLOWb \bottombox - \let\FLOWbl\bottomleftbox - \let\FLOWbr\bottomrightbox - \let\FLOWt \topbox - \let\FLOWtl\topleftbox - \let\FLOWtr\toprightbox - \let\FLOWl \leftbox - \let\FLOWlt\lefttopbox - \let\FLOWlb\leftbottombox - \let\FLOWr \rightbox - \let\FLOWrt\righttopbox - \let\FLOWrb\rightbottombox - \let\FLOWc \middlebox -%\ifdefined{FLOW#1}% - \ifcase0\getvalue{\@@MPx\FLOWcomment}\getvalue{\@@MPy\FLOWcomment}\relax - \else - \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp<\areaMPllx\relax\else - \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp>\areaMPurx\relax\else - \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp<\areaMPlly\relax\else - \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp>\areaMPury\relax\else - \dimen0=\getvalue{\@@MPx\FLOWcomment}\s!bp - \advance\dimen0 -\@@FLOW@@offset - \advance\dimen0 -\clipMPllx - \dimen2=\clipMPury - \advance\dimen2 -\@@FLOW@@offset - \advance\dimen2 -\getvalue{\@@MPy\FLOWcomment}\s!bp - \setbox\scratchbox\hbox{\strut#2}% - \boxoffset.5\bodyfontsize - \setbox\scratchbox\hbox{\hskip\dimen0\lower\dimen2\getvalue{FLOW#1}{\box\scratchbox}}% - \smashbox\scratchbox - \box\scratchbox - \boxoffset\zeropoint - \nointerlineskip % really needed - \fi - \fi - \fi - \fi - \fi -%\fi - \egroup - \ignorespaces} - -% pass D - -\def\dophaseoneFLOWcellX#1#2% - {\!!counta#1\relax - \!!countb#2\relax - \!!countc\@@FLOWx - \!!countd\@@FLOWy - \advance\!!countc \@@FLOWnx - \advance\!!countd \@@FLOWny - \advance\!!countc \minusone - \advance\!!countd \minusone - \ifnum\!!counta<\@@FLOWx\relax \donefalse - \else\ifnum\!!counta>\!!countc \donefalse - \else\ifnum\!!countb<\@@FLOWy\relax \donefalse - \else\ifnum\!!countb>\!!countd \donefalse - \else \donetrue - \fi\fi\fi\fi} - -\def\dophasetwoFLOWcellX - {\advance\!!counta -\@@FLOWx - \advance\!!counta \plusone - \advance\!!countb -\@@FLOWy - \advance\!!countb \plusone - \dimen0=\FLOWgridwidth - \dimen0=\!!counta\dimen0 - \advance\dimen0 -\FLOWgridwidth - \dimen4=\FLOWgridwidth - \advance\dimen4 -\FLOWshapewidth - \advance\dimen0 .5\dimen4 - \dimen2=\FLOWgridheight - \dimen2=\!!countb\dimen2 - \dimen4=\FLOWgridheight - \advance\dimen4 -\FLOWshapeheight - \advance\dimen2 -.5\dimen4 - \edef\FLOWdx{\the\dimen0}% - \edef\FLOWdy{\the\dimen2}} - -\def\positionFLOWzero% assumes \FLOWdx and \FLOWdy are set - {\setbox0\hbox{\hskip\FLOWdx\lower\FLOWdy\box0}% - \smashbox0\box0 - \nointerlineskip} % new, needed since we somehow reset that - -\def\doFLOWtlabel#1#2#3% - {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi - \setbox0\hbox{\hskip\dimen2\raise\scratchdimen - \hbox{\raise\dimen4\hbox{#1{\strut#3}}}}% - \positionFLOWzero}% - -\def\doFLOWblabel#1#2#3% - {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi - \setbox0\hbox{\hskip\dimen2\raise-\scratchdimen - \hbox{#1{\strut#3}}}% - \positionFLOWzero}% - -\def\doFLOWllabel#1#2#3% - {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi - \setbox0\hbox{\hskip-\scratchdimen\raise\dimen6 - \hbox{#1{\strut#3}}}% - \positionFLOWzero}% - -\def\doFLOWrlabel#1#2#3% - {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi - \setbox0\hbox{\hskip\dimen0\hskip\scratchdimen - \hbox{\raise\dimen6\hbox{#1{\strut#3}}}}% - \positionFLOWzero} - -\def\doprocessFLOWcellD#1,#2\end - {\dophaseoneFLOWcellX{#1}{#2}% - \ifdone - \dophasetwoFLOWcellX - \doglobal\addtocommalist\FLOWcell\FLOWcells - \def\FLOWx{#1}% - \def\FLOWy{#2}% - \directsetup{flowcell}% - \setbox0\hbox - {\ifx\FLOWalign\empty\else - \setupframed - [\c!align=\v!normal,\c!bottom=\vfill,\c!top=\vfill]% - \@EA\processallactionsinset\@EA - [\FLOWalign] - [t=>{\setupframed[\c!bottom=\vfill,\c!top=]}, - b=>{\setupframed[\c!bottom=,\c!top=\vfill]}, - l=>{\setupframed[\c!align=\v!right]}, - r=>{\setupframed[\c!align=\v!left]}, - m=>{\setupframed[\c!align=\v!middle]}, - c=>{\setupframed[\c!align=\v!middle]}]% - \fi - \doifelse\FLOWshape{none} % {\v!none} - {\setupframed[\c!offset=\v!overlay]} - {\setupframed[\c!offset=\@@FLOSoffset]}% - \framed - [\c!frame=\v!off,\c!background=flowcell, - \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight] - {\FLOWtext}}% - \showFLOWhelp0 - \ifx\FLOWdestination\empty\else - \setbox0\hbox - {\setupinteraction[\c!color=,\c!contrastcolor=]% - \gotobox{\box0}[\FLOWdestination]}% - \fi - \positionFLOWzero - \dimen0=\FLOWshapewidth \dimen2=.5\dimen0 - \dimen4=\FLOWshapeheight\dimen6=.5\dimen4 - \boxoffset.5\bodyfontsize - \doFLOWtlabel \righttopbox0\tFLOWlabel - \doFLOWblabel\rightbottombox0\bFLOWlabel - \doFLOWllabel \lefttopbox0\lFLOWlabel - \doFLOWrlabel \righttopbox0\rFLOWlabel - \doFLOWtlabel \topbox0\tcFLOWlabel % for me only - \doFLOWblabel \bottombox0\bcFLOWlabel % for me only - \doFLOWllabel \leftbox0\lcFLOWlabel % for me only - \doFLOWrlabel \rightbox0\rcFLOWlabel % for me only - \ifnum#1=\@@FLOWx\relax \doFLOWllabel \leftbox1\lFLOWexit \fi - \ifnum#1=\!!countc \doFLOWrlabel \rightbox1\rFLOWexit \fi - \ifnum#2=\@@FLOWy\relax \doFLOWtlabel \topbox1\tFLOWexit \fi - \ifnum#2=\!!countd \doFLOWblabel \bottombox1\bFLOWexit \fi - \boxoffset\zeropoint - \fi} - -% For Willy Egger: -% -% \startsetups flowcell -% \definelayer -% [flowcell] -% [width=\FLOWshapewidth, -% height=\FLOWshapeheight] -% \setlayerframed -% [flowcell] -% [preset=rightbottom,offset=1ex] -% [frame=off] -% {\tx(\FLOWx,\FLOWy)} -% \stopsetups - -% Pass E - -\long\def\startFLOWcellE#1\stopFLOWcell - {\resetFLOWcell - \ignorespaces#1\unskip - \let\doprocessFLOWcell\doprocessFLOWcellE - \expandafter\doprocessFLOWcell\FLOWlocation\end} - -\def\doprocessFLOWcellE#1,#2\end % redundant - {\ifx\FLOWoverlay\empty \else - \dophaseoneFLOWcellX{#1}{#2}% - \ifdone - \dophasetwoFLOWcellX - \edef\FLOWdx{\the\dimen0}% - \edef\FLOWdy{\the\dimen2}% - \setbox0\hbox - {\framed - [%\c!frame=\v!off, - \c!background={\@@FLOWbackground,\FLOWoverlay}, - \c!backgroundcolor=\@@FLOSbackgroundcolor, - \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight] - {}}% - \positionFLOWzero - \fi - \fi} - -% Pass F - -\def\checkFLOWautofocus - {\def\@@FLOWminx{100}\let\@@FLOWminy\@@FLOWminx - \def\@@FLOWmaxx {0}\let\@@FLOWmaxy\@@FLOWmaxx - \def\@@FLOWabsx {0}\let\@@FLOWabsy\@@FLOWabsx - \let\startFLOWcell\startFLOWcellF - \resetFLOWlocation - \processFLOWbuffer\currentFLOWnumber - %\message{AUTOSHAPE 1: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}% - \ifnum\@@FLOWabsx<\@@FLOWmaxx\let\@@FLOWmaxx\@@FLOWabsx\fi - \ifnum\@@FLOWabsy<\@@FLOWmaxy\let\@@FLOWmaxy\@@FLOWabsy\fi - %\message{AUTOSHAPE 2: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}% - \donetrue - \ifnum\@@FLOWminx=100 \donefalse\fi - \ifnum\@@FLOWminy=100 \donefalse\fi - \ifnum\@@FLOWmaxx=0 \donefalse\fi - \ifnum\@@FLOWmaxy=0 \donefalse\fi - \doFLOWcheckF\@@FLOWx\@@FLOWminx\@@FLOWmaxx\@@FLOWnx - \doFLOWcheckF\@@FLOWy\@@FLOWminy\@@FLOWmaxy\@@FLOWny} - -\def\startFLOWcellF#1\stopFLOWcell% - {\resetFLOWcell - \ignorespaces#1\unskip - \expandafter\doFLOWlocationF\FLOWlocation\end}% - -\def\doFLOWlocationF#1,#2\end% - {\ifnum#1>\@@FLOWabsx\def\@@FLOWabsx{#1}\fi - \ifnum#2>\@@FLOWabsy\def\@@FLOWabsy{#2}\fi - \doifinset\FLOWcell\@@FLOWautofocus - {\dodoFLOWlocationF{#1}<-\@@FLOWminx - \dodoFLOWlocationF{#1}>+\@@FLOWmaxx - \dodoFLOWlocationF{#2}<-\@@FLOWminy - \dodoFLOWlocationF{#2}>+\@@FLOWmaxy}} - -\def\dodoFLOWlocationF#1#2#3#4% - {\ifnum#1#2#4\relax - \!!counta=#1\advance\!!counta #31\relax - \edef#4{\ifnum\!!counta<1 1\else\the\!!counta\fi}% - \fi} - -\def\doFLOWcheckF#1#2#3#4% - {\ifdone - \let#1=#2% - \!!counta=#3% - \advance\!!counta \plusone\advance\!!counta -#2\relax - \ifnum\!!counta<1 \!!counta=1 \fi - \edef#4{\the\!!counta}% - \else - \let#1\!!plusone - \let#4\!!zerocount % no {1} - \fi} - -% \useFLOWchart[name][parent][setting,setting][additional settings] -% \useFLOWchart[name][parent][additional settings] - -\let\currentFLOWchart\empty - -\def\useFLOWchart - {\doquadrupleempty\douseFLOWchart} - -\def\douseFLOWchart[#1][#2][#3][#4]% name parent sets mainsettings - {\iffourthargument - \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][#4,##1]}% - \else - \checkparameters[#3]% - \ifparameters - \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][][#3,##1]}% - \else - \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][##1]}% - \fi - \fi} - -\def\setgetFLOWchart[#1][#2][#3]% - {\def\docommand##1{}% cell line focus ? - \processcommalist[#2]\docommand - \getFLOWchart[#1][#3]} - -\def\doFLOWchart[#1][#2]% - {\hbox\bgroup\vbox\bgroup % vmode suppresses spaces -\def\currentFLOWchart{#1}% - \doifundefinedelse{\@FLOW@--#1} - {\getFLOWchart[#1][#2]} - {\getvalue{\@FLOW@--#1}[#2]}% - \egroup\egroup} - -\def\FLOWchart% - {\dodoubleempty\doFLOWchart} - -%D A hook into the help system. - -% \def\showFLOWhelp#1% -% {\doifhelpinfo\FLOWhelp -% {\setbox#1=\hbox -% {\setbox\scratchbox=\hbox{\lower\@@FLOWdy\hbox -% {\helpbutton -% [\c!width=\wd0,\c!color=,\c!height=\@@FLOWdy,\c!frame=\v!no]% -% [\FLOWhelp]}}% -% \smashbox\scratchbox -% \setbox#1=\vbox -% {\forgetall\offinterlineskip\box#1\box\scratchbox}% -% \box#1}}} - -\def\showFLOWhelp#1% - {} - -%D The next section is dedicated to splitting up charts. - -\def\getFLOWsize[#1]% - {\bgroup\let\dodogetFLOWchart\dogetFLOWsize\FLOWchart[#1]\egroup} - -\def\dogetFLOWsize[#1][#2]% - {\setbox\scratchbox=\vbox - {\globallet\FLOWmaxwidth \!!zerocount - \globallet\FLOWmaxheight\!!zerocount - \def\getFLOWlocation##1,##2\end - {\ifnum0##1>\FLOWmaxwidth \xdef\FLOWmaxwidth {##1}\fi - \ifnum0##2>\FLOWmaxheight\xdef\FLOWmaxheight{##2}\fi}% - \resetFLOWcell - \long\def\startFLOWcell##1\stopFLOWcell - {{##1\expandafter\getFLOWlocation\FLOWlocation\end}}% - \def\dohandleflowchart[##1][##2]% - {\resetFLOWlocation - \processFLOWbuffer{##1}}% - \getvalue{\@FLOW@-#1}}} - -\def\setupFLOWsplit% - {\dodoubleargument\getparameters[\@@FLOT]} - -\setupFLOWsplit% - [\c!nx=3,\c!ny=3, - \c!dx=1,\c!dy=1, - \c!command=, - \c!marking=\v!on, - \c!before=,\c!after=] - -\def\FLOWsplitx {1} -\def\FLOWsplity {1} -\def\FLOWsplitnx{1} -\def\FLOWsplitny{1} - -\def\FLOWcharts% - {\dodoubleempty\doFLOWcharts} - -%D While splitting, the following variables are available: -%D -%D \starttyping -%D \FLOWsplitnx \FLOWsplitny \FLOWsplitx \FLOWsplity -%D \stoptyping - -\def\doFLOWcharts[#1][#2]% - {\bgroup - \getFLOWsize[#1]% - \dodoFLOWcharts\relax - \global\let\FLOWsplitnx\FLOWsplitx - \global\let\FLOWsplitny\FLOWsplity - \dodoFLOWcharts{\dododoFLOWcharts[#1][#2]}% - \egroup} - -\def\dodoFLOWcharts#1% - {\def\@@FLOTx{1}% - \global\let\FLOWsplitx\@@FLOTx - \doloop - {\def\@@FLOTy{1}% - \global\let\FLOWsplity\@@FLOTy - \doloop - {\bgroup - \scratchcounter\FLOWmaxwidth - \advance\scratchcounter -\@@FLOTx - \advance\scratchcounter \plusone - \ifnum\scratchcounter<\@@FLOTnx\edef\@@FLOTnx{\the\scratchcounter}\fi - \scratchcounter\FLOWmaxheight - \advance\scratchcounter -\@@FLOTy - \advance\scratchcounter \plusone - \ifnum\scratchcounter<\@@FLOTny\edef\@@FLOTny{\the\scratchcounter}\fi - #1% does something with the float, or not - \egroup - \increment(\@@FLOTy,\@@FLOTny)% - \ifnum\@@FLOTy>\FLOWmaxheight - \exitloop - \else - \doglobal\increment\FLOWsplity - \decrement(\@@FLOTy,\@@FLOTdy)% - \fi}% - \increment(\@@FLOTx,\@@FLOTnx)% - \ifnum\@@FLOTx>\FLOWmaxwidth - \exitloop - \else - \doglobal\increment\FLOWsplitx - \decrement(\@@FLOTx,\@@FLOTdx)% - \fi}} - -\def\dododoFLOWcharts[#1][#2]% - {\bgroup - \@@FLOTbefore - \doifnot\@@FLOTmarking\v!on{\let\cuthbox\hbox}% - \cuthbox - {\@@FLOTcommand - {\FLOWchart[#1][#2, - \c!x=\@@FLOTx,\c!nx=\@@FLOTnx, - \c!y=\@@FLOTy,\c!ny=\@@FLOTny]}}% - \@@FLOTafter - \egroup} - -%D An example of splitting is given below: -%D -%D \starttyping -%D \setupFLOWsplit -%D [nx=5,ny=10, -%D dx=0,dy=0, -%D before=, -%D after=\page] -%D -%D \FLOWcharts[mybigflow] -%D \stoptyping -%D -%D Or, one can say: -%D -%D \starttyping -%D \splitfloat -%D {\placefigure{What a big flowchart this is!}} -%D {\FLOWcharts[mybigflow]} -%D \stoptyping - -%D \macros -%D {typeFLOWchart} -%D -%D For documentation purposes the following macro is -%D provided. Watch the use of the first and last line hooks, -%D which is needed because the start and stop commands are -%D not part of the buffer. - -\def\typeFLOWchart[#1]% - {\bgroup - \def\dohandleflowchart[##1][##2]{\typeFLOWbuffer{##1}}% - \defconvertedargument\firstverbatimfileline{\startFLOWchart[#1]}% - \defconvertedargument\lastverbatimfileline {\stopFLOWchart}% - \getvalue{\@FLOW@-#1} - \egroup} - -%D New: -%D -%D \starttyping -%D \setupFLOWcharts[command=\Whow] -%D -%D \startFLOWset[convert-en] % [tag][convert-en] -%D \subFLOWchart[a][x=1,y=1,nx=3,ny=3] -%D \subFLOWchart[b][x=1,y=2,nx=3,ny=3] -%D \subFLOWchart[c][x=2,y=1,nx=3,ny=3] -%D \stopFLOWset -%D -%D \def\Whow#1% -%D {\ifnum\currentFLOWset=1 \framed{Some Chart}\fi} -%D -%D \FLOWset[convert-en] % [tag] -%D -%D \def\Whow#1% -%D {\setuphead[state=high] -%D \startstandardmakeup -%D \centerbox{#1} -%D \stopstandardmakeup} -%D -%D \FLOWset[convert-en] % [tag] -%D \stoptyping - -\def\startFLOWset - {\dodoubleempty\dostartFLOWset} - -\def\dostartFLOWset[#1][#2]#3\stopFLOWset % tag name data - {\ifsecondargument - \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#2}{#3}}% - \else - \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#1}{#3}}% - \fi} - -\long\def\dohandleFLOWset#1#2#3% tag name data - {\bgroup - \def\subFLOWchart - {\dodoubleempty\dosubFLOWchart}% - \def\dosubFLOWchart[##1][##2]% subtag settings - {\ifsecondargument - \dodohandleFLOWset{#1}{##1}{#2}{##2}% - \else - \subFLOWchart[][##1]% - \fi}% - #3% - \egroup} - -\def\dodohandleFLOWset#1#2#3#4% tag subtag name settings - {\increment\currentFLOWset - \bgroup - \@@FLOXcommand - {\ifnum\currentFLOWset=1 \pagereference[#1]\fi - \doifsomething{#2} - {\setupreferencing[\c!prefix=]% - \pagereference[#1:#2]% -:#1:#2 - \setupreferencing[\c!prefix=#1:#2]}% - \FLOWchart[#3][#4]}% - \egroup} - -\def\FLOWset[#1]% - {\newcounter\currentFLOWset - \doifdefinedelse{\@FLOX@#1} - {\getvalue{\@FLOX@#1}} - {\dodohandleFLOWset{#1}{}{#1}{}}} - -\newcounter\currentFLOWset - -\setupFLOWsets - [\c!command=] - -%D This will be an option: - -% \def\startFLOWchart% -% {\dodoubleempty\dostartFLOWchart} -% -% \long\def\dostartFLOWchart[#1][#2]#3\stopFLOWchart -% {\preparenextFLOWchart{#1}{#2}% -% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}} -% -% \long\def\dodefineFLOWchart[#1][#2]#3% -% {\preparenextFLOWchart{#1}{#2}% -% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}} -% -% \def\processFLOWbuffer#1{\getvalue{\FLOWbufferprefix#1}} -% \def\typeFLOWbuffer #1{[Sorry, no verbatim chart #1 available.]} % todo: \localpushmacro/\localpopmacro (dohandleflowchart etc) % todo: make mkiv variant % todo: use dimexpr/numspr @@ -1762,9 +490,9 @@ connection_smooth_size := \@@FLOLradius ; connection_arrow_size := \@@FLOLradius ; connection_dash_size := \@@FLOLradius ; - currentpicture := nullpicture ; + currentpicture := nullpicture ; begin_chart(0,\FLOWwidth,\FLOWheight); - reverse_y := true ; + reverse_y := true ; chart_offset := \@@FLOW@@offset ; \stopMPdrawing \doifelsenothing\@@FLOWbackgroundcolor @@ -1790,11 +518,11 @@ \s!unknown=>\startMPdrawing show_\@@FLOWdot _points := true ; \stopMPdrawing]% -\doglobal\newcounter\FLOWcomment + \doglobal\newcounter\FLOWcomment \let\startFLOWcell\startFLOWcellB \resetFLOWlocation \processFLOWbuffer\currentFLOWnumber -\doglobal\newcounter\FLOWcomment + \doglobal\newcounter\FLOWcomment \let\startFLOWcell\startFLOWcellC \resetFLOWlocation \processFLOWbuffer\currentFLOWnumber @@ -2009,11 +737,11 @@ \long\def\startFLOWcellD#1\stopFLOWcell {\resetFLOWcell -\pushmacro\lastFLOWx -\pushmacro\lastFLOWy + \pushmacro\lastFLOWx + \pushmacro\lastFLOWy \ignorespaces#1\unskip % presets vars -\popmacro\lastFLOWy -\popmacro\lastFLOWx + \popmacro\lastFLOWy + \popmacro\lastFLOWx \let\doprocessFLOWcell\doprocessFLOWcellD \expandafter\doprocessFLOWcellD\FLOWlocation\end \let\connection\doFLOWconnectionD @@ -2166,7 +894,7 @@ [\c!frame=\v!off,\c!background=flowcell, \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight] {\FLOWtext}}% - \showFLOWhelp0 + %\showFLOWhelp0 \ifx\FLOWdestination\empty\else \setbox0\hbox {\setupinteraction[\c!color=,\c!contrastcolor=]% @@ -2184,10 +912,10 @@ \doFLOWblabel \bottombox0\bcFLOWlabel % for me only \doFLOWllabel \leftbox0\lcFLOWlabel % for me only \doFLOWrlabel \rightbox0\rcFLOWlabel % for me only - \ifnum#1=\@@FLOWx\relax \doFLOWllabel \leftbox1\lFLOWexit \fi - \ifnum#1=\!!countc \doFLOWrlabel \rightbox1\rFLOWexit \fi - \ifnum#2=\@@FLOWy\relax \doFLOWtlabel \topbox1\tFLOWexit \fi - \ifnum#2=\!!countd \doFLOWblabel \bottombox1\bFLOWexit \fi + \relax\ifnum#1=\@@FLOWx \relax \doFLOWllabel \leftbox1\lFLOWexit \fi + \relax\ifnum#1=\!!countc\relax \doFLOWrlabel \rightbox1\rFLOWexit \fi + \relax\ifnum#2=\@@FLOWy \relax \doFLOWtlabel \topbox1\tFLOWexit \fi + \relax\ifnum#2=\!!countd\relax \doFLOWblabel\bottombox1\bFLOWexit \fi \boxoffset\zeropoint \fi} @@ -2340,10 +1068,10 @@ \processFLOWbuffer{##1}}% \getvalue{\@FLOW@-#1}}} -\def\setupFLOWsplit% +\def\setupFLOWsplit {\dodoubleargument\getparameters[\@@FLOT]} -\setupFLOWsplit% +\setupFLOWsplit [\c!nx=3,\c!ny=3, \c!dx=1,\c!dy=1, \c!command=, @@ -2543,4 +1271,58 @@ \writestatus\m!system{The chart mkiv xml interface is not yet defined!} -\protect \endinput +\protect + +\continueifinputfile{m-chart.mkiv} + +\input chrt-xml.tex + +\usemodule[abr-01] + +% \setupFLOWcharts[option=test] +\setupinteraction[state=start] +% \setupFLOWcharts[dx=30pt,dy=30pt] + +\startFLOWchart[demo] + \startFLOWcell + \name {one} +% \destination{CloseDocument} + \location {2,2} +% \shape {action} +% \text {first} +% \label [b] {\bfx bottom} +% \exit [l] {exit l} +% \exit [r] {exit r} +% \exit [t] {exit t} +% \exit [b] {exit b} +\comment[t]{comment t} +\comment[b]{comment t} + \connection [rt] {two} + \stopFLOWcell + \startFLOWcell + \name {two} + \destination{CloseDocument} + \location {3,3} + \shape {action} + \text {second} + \figure {cow.pdf} +% \label [l] {\bfx left} + \stopFLOWcell +\stopFLOWchart + +\starttext + +\startTEXpage +% \FLOWchart[convert-en] +% \FLOWchart[conversion 1] +% \FLOWchart[conversion 7] +% \FLOWchart[conversion 9] +% \FLOWchart[conversion 10] + \FLOWchart[demo] +\stopTEXpage + +\startTEXpage + \FLOWchart[conversion 10] +\stopTEXpage + +\stoptext diff --git a/tex/context/base/m-chart.tex b/tex/context/base/m-chart.tex deleted file mode 100644 index 9f36004f5..000000000 --- a/tex/context/base/m-chart.tex +++ /dev/null @@ -1,18 +0,0 @@ -%D \module -%D [ file=m-chart, -%D version=1998.10.10, -%D title=\CONTEXT\ Modules, -%D subtitle=Flow Charts, -%D author={Hans Hagen \& Ton Otten}, -%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 This file will become obsolete. - -\loadmarkfile{m-chart} - -\protect \endinput diff --git a/tex/context/base/m-flow.lua b/tex/context/base/m-flow.lua new file mode 100644 index 000000000..ea04eef17 --- /dev/null +++ b/tex/context/base/m-flow.lua @@ -0,0 +1,631 @@ +if not modules then modules = { } end modules ['x-flow'] = { + version = 1.001, + comment = "companion to m-flow.mkvi", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- when we can resolve mpcolor at the lua end we will use metapost.graphic(....) directly + +moduledata.charts = moduledata.charts or { } + +local gsub, match, find, format, lower = string.gsub, string.match, string.find, string.format, string.lower +local lpegmatch = lpeg.match + +local points = number.points +local variables = interfaces.variables + +local defaults = { + chart = { + name = "", + option = "", + backgroundcolor = "", + width = 0, + height = 0, + dx = 0, + dy = 0, + offset = 0, + bodyfont = "", + dot = "", + }, + shape = { -- FLOS + rulethickness = 65435, + default = "", + framecolor = "green", + backgroundcolor = "yellow", + }, + focus = { -- FLOF + rulethickness = 65435, + framecolor = "red", + backgroundcolor = "yellow", + }, + line = { -- FLOL + rulethickness = 65435, + radius = 65435, + color = "blue", + corner = "", + dash = "", + arrow = "", + offset = "", + }, + set = { -- FLOX + }, + split = { + nx = 3, + ny = 3, + command = "", + marking = "", + before = "", + after = "", + } +} + +local validshapes = { + ["node"] = { kind = "shape", number = 0 }, + ["action"] = { kind = "shape", number = 24 }, + ["procedure"] = { kind = "shape", number = 5 }, + ["product"] = { kind = "shape", number = 12 }, + ["decision"] = { kind = "shape", number = 14 }, + ["archive"] = { kind = "shape", number = 19 }, + ["loop"] = { kind = "shape", number = 35 }, + ["wait"] = { kind = "shape", number = 6 }, + ["subprocedure"] = { kind = "shape", number = 20 }, + ["singledocument"] = { kind = "shape", number = 32 }, + ["multidocument"] = { kind = "shape", number = 33 }, + + ["right"] = { kind = "line", number = 66 }, + ["left"] = { kind = "line", number = 67 }, + ["up"] = { kind = "line", number = 68 }, + ["down"] = { kind = "line", number = 69 }, +} + +local validlabellocations = { + l = "l", left = "l", + r = "r", right = "r", + t = "t", top = "t", + b = "b", bottom = "b", +} + +table.setmetatableindex(validshapes,function(t,k) + local l = gsub(lower(k)," ","") + local v = rawget(t,l) + if not v then + local n = tonumber(k) + if n then + v = { "shape", n } + else + v = rawget(t,"action") + end + end + t[k] = v + return v +end) + +local replacements = { + ["0"] = "a", ["1"] = "b", ["2"] = "c", ["3"] = "d", ["4"] = "e", + ["5"] = "f", ["6"] = "g", ["7"] = "h", ["8"] = "i", ["9"] = "j", +} + +local function cleanname(str) + str = gsub(str,"[0-9]",replacements) + str = gsub(str,"[^a-zA-Z]","_") + return str +end + +local charts = { } + +local data, hash, temp, last_x, last_y, name + +function commands.flow_start_chart(chartname) + data = { } + hash = { } + last_x, last_y = 0, 0 + name = chartname +end + +function commands.flow_stop_chart() + charts[name] = { + data = data, + hash = hash, + last_x = last_x, + last_y = last_y, + } + data, hash, temp = nil, nil, nil +end + +function commands.flow_set_current_cell(n) + temp = data[tonumber(n)] or { } +end + +function commands.flow_start_cell(settings) + temp = { + labels = { }, + comments = { }, + exits = { }, + connections = { }, + settings = settings, + } +end + +function commands.flow_stop_cell() + data[#data+1] = temp + hash[temp.name or #data] = temp +end + +function commands.flow_set_name(str) + temp.name = str +end + +function commands.flow_set_shape(str) + temp.shape = str +end + +function commands.flow_set_destination(str) + temp.destination = str +end + +function commands.flow_set_text(align,str) + temp.align = align + temp.text = str +end + +function commands.flow_set_overlay(str) + temp.overlay = str +end + +function commands.flow_set_focus(str) + temp.focus = str +end + +function commands.flow_set_figure(str) + temp.figure = str +end + +function commands.flow_set_label(location,text) + temp.labels[#temp.labels+1] = { + location = location, + text = text, + } +end + +function commands.flow_set_comment(name,str) + temp.comments[#temp.comments+1] = { + location = location, + text = text, + } +end + +function commands.flow_set_exit(location,text) + temp.exits[#temp.exits+1] = { + location = location, + text = text, + } +end + +function commands.flow_set_include(name,x,y,settings) + data[#data+1] = { + include = name, + x = x, + y = y, + -- settings = settings, + } +end + +local function inject(includedata,data,hash) + local subchart = charts[includedata.include] + if not subchart then + return + end + local subdata = subchart.data + if not subdata then + return + end + local xoffset = (includedata.x or 1) - 1 + local yoffset = (includedata.y or 1) - 1 + local settings = includedata.settings + for i=1,#subdata do + local si = subdata[i] + local t = { + x = si.x + xoffset, + y = si.y + yoffset, + settings = settings, + } + table.setmetatableindex(t,si) + data[#data+1] = t + hash[si.name or #data] = t + end +end + +local function expanded(chart) + local expandeddata = { } + local expandedhash = { } + local expandedchart = { + data = expandeddata, + hash = expandedhash, + } + table.setmetatableindex(expandedchart,chart) + local data = chart.data + local hash = chart.hash + for i=1,#data do + local di = data[i] + if di.include then + inject(di,expandeddata,expandedhash) + else + expandeddata[#expandeddata+1] = di + expandedhash[di.name or #expandeddata] = di + end + end + for i=1,#expandeddata do + local cell = expandeddata[i] + local settings = cell.settings + if not settings then + cell.settings = chart.settings + else + table.setmetatableindex(settings,chart.settings) + end + end + return expandedchart +end + + +local splitter = lpeg.splitat(",") + +function commands.flow_set_location(str) -- handle include differently + -- wrong: delay real x,y, only store relative + local x, y = lpegmatch(splitter,str) + if not x or x == "" then + x = last_x + elseif x == "+" then + x = last_x + 1 + elseif x == "-" then + x = last_x - 1 + elseif find(x,"^[%+%-]") then + x = last_x + (tonumber(x) or 0) + else + x = tonumber(x) + end + if not y or y == "" then + y = last_y + elseif y == "+" then + y = last_y + 1 + elseif x == "-" then + y = last_y - 1 + elseif find(y,"^[%+%-]") then + y = last_y + (tonumber(y) or 0) + else + y = tonumber(y) + end + temp.x = x + temp.y = y + last_x = x + last_y = 0 +end + +function commands.flow_set_connection(location,displacement,name) + local dx, dy = lpegmatch(splitter,displacement) + dx = tonumber(dx) or 1 + dy = tonumber(dy) or 1 + temp.connections[#temp.connections+1] = { + location = location, + dx = dx - 1, + dy = dy - 1, + name = name, + } +end + +local where = { + l = "left", + r = "right", + t = "top", + b = "bottom", +} + +local what = { + ["p"] = 1, + ["m"] = -1, + ["+"] = 1, + ["-"] = -1, +} + +local function visible(chart,cell) + local x, y = cell.x, cell.y + return + x >= chart.from_x and x <= chart.to_x and + y >= chart.from_y and y <= chart.to_y and cell +end + +local function check_cells(chart,xoffset,yoffset,min_x,min_y,max_x,max_y) + local data = chart.data + if not data then + return + end + for i=1,#data do + local cell = data[i] + local x, y = cell.x + xoffset, cell.y + yoffset + if min_x == 0 then + min_x, max_x = x, x + min_y, max_y = y, y + else + if x < min_x then min_x = x end + if y < min_y then min_y = y end + if x > max_x then max_x = x end + if y > max_y then max_y = y end + end + end + return min_x, min_y, max_x, max_y +end + +local function process_cells(chart,xoffset,yoffset) + local data = chart.data + if not data then + return + end + for i=1,#data do + local cell = visible(chart,data[i]) + if cell then + local shape = cell.shape + if not shape or shape == "" then + shape = settings.shape.default or "none" + end + if shape ~= variables.none then + local settings = cell.settings + local shapedata = validshapes[shape] + context("flow_begin_sub_chart ;") + if shapedata.kind == "line" then + context("flow_shape_line_color := \\MPcolor{%s} ;", settings.line.color) + context("flow_shape_fill_color := \\MPcolor{%s} ;", settings.line.color) + context("flow_shape_line_width := %s ; ", points(settings.line.rulethickness)) + elseif hasfocus then -- doifcommonelse{FLOWcell,FLOWfocus}@@FLOWfocus + context("flow_shape_line_color := \\MPcolor{%s} ;", settings.focus.framecolor) + context("flow_shape_fill_color := \\MPcolor{%s} ;", settings.focus.backgroundcolor) + context("flow_shape_line_width := %s ; ", points(settings.focus.rulethickness)) + else + context("flow_shape_line_color := \\MPcolor{%s} ;", settings.shape.framecolor) + context("flow_shape_fill_color := \\MPcolor{%s} ;", settings.shape.backgroundcolor) + context("flow_shape_line_width := %s ; " , points(settings.shape.rulethickness)) + end + context("bodyfontsize := 10pt ;") -- todo + context("flow_peepshape := false ;") -- todo + context("flow_new_shape(%s,%s,%s) ;",cell.x+xoffset,cell.y+yoffset,shapedata.number) + context("flow_end_sub_chart ;") + end + end + end +end + +-- todo : make lpeg for splitter + +local function process_connections(chart,xoffset,yoffset) + local data = chart.data + local hash = chart.hash + if not data then + return + end + local settings = chart.settings + for i=1,#data do + local cell = visible(chart,data[i]) + if cell then + local connections = cell.connections + for j=1,#connections do + local connection = connections[j] + local othername = connection.name + local othercell = hash[othername] + if othercell then + local cellx, celly = cell.x, cell.y + local otherx, othery, location = othercell.x, othercell.y, connection.location + if otherx > 0 and othery > 0 and cellx > 0 and celly > 0 and connection.location then + -- move to setter + local what_cell, where_cell, what_other, where_other = match(location,"([%+%-pm]-)([lrtb])([%+%-pm]-)([lrtb])") + local what_cell = what [what_cell] or 0 + local what_other = what [what_other] or 0 + local where_cell = where[where_cell] or "left" + local where_other = where[where_other] or "right" + context("flow_smooth := %s ;", settings.line.corner == variables.round and "true" or "false") + context("flow_dashline := %s ;", settings.line.dash == variables.yes and "true" or "false") + context("flow_arrowtip := %s ;", settings.line.arrow == variables.yes and "true" or "false") + context("flow_touchshape := %s ;", settings.line.offset == variables.none and "true" or "false") + context("flow_dsp_x := %s ; flow_dsp_y := %s ;",connection.dx or 0, connection.dy or 0) + context("flow_connection_line_color := green ;",chart.settings.line.color) + context("flow_connection_line_width := 2pt ;",points(chart.settings.line.rulethickness)) + context("flow_connect_%s_%s(%s,%s,%s) (%s,%s,%s) ;",where_cell,where_other,cellx,celly,what_cell,otherx,othery,what_other) + context("flow_dsp_x := 0 ; flow_dsp_y := 0 ;") + end + end + end + end + end +end + +local texttemplate = "\\setvariables[flowcell:text][x=%s,y=%s,text={%s},align={%s},figure={%s},destination={%s}]" + +local function process_texts(chart,xoffset,yoffset) + local data = chart.data + local hash = chart.hash + if not data then + return + end + for i=1,#data do + local cell = visible(chart,data[i]) + if cell then + local x = cell.x or 1 + local y = cell.y or 1 + local text = cell.text + if text and text ~= "" then + local a = cell.align or "" + local f = cell.figure or "" + local d = cell.destination or "" + context('flow_chart_draw_text(%s,%s,textext("%s")) ;',x,y,format(texttemplate,x,y,text,a,f,d)) + end + local labels = cell.labels + for i=1,#labels do + local label = labels[i] + local text = label.text + local location = validlabellocations[label.location or ""] + if text and location then + context('flow_chart_draw_label_%s(%s,%s,textext("%s")) ;',location,x,y,text) + end + end + local exits = cell.exits + for i=1,#exits do + local exit = exits[i] + local text = exit.text + local location = validlabellocations[exit.location or ""] + if text and location then + -- maybe make autoexit an option + if location == "l" and x == chart.from_x + 1 or + location == "r" and x == chart.to_x - 1 or + location == "t" and y == chart.to_y - 1 or + location == "b" and y == chart.from_y + 1 then + context('flow_chart_draw_exit_%s(%s,%s,textext("%s")) ;',location,x,y,text) + end + end + end + local comments = cell.comments + for i=1,#comments do + -- invisible + end + end + end +end + +local function getchart(settings) + local chartname = settings.chart.name + if not chartname then + print("no name given") + return + end + local chart = charts[chartname] + if not chart then + print("no such chart",chartname) + return + end + chart.settings = settings + table.setmetatableindex(settings,defaults) + chart = expanded(chart) + local _, _, nx, ny = check_cells(chart,0,0,0,0,0,0) + chart.from_x = chart.settings.chart.x or 1 + chart.from_y = chart.settings.chart.y or 1 + chart.to_x = chart.settings.chart.nx or nx + chart.to_y = chart.settings.chart.ny or ny + chart.nx = chart.to_x - chart.from_x + 1 + chart.ny = chart.to_y - chart.from_y + 1 + return chart +end + +local function makechart(chart) + local settings = chart.settings + context.begingroup() + context.forgetall() + -- + local bodyfont = settings.chart.bodyfont + if bodyfont ~= "" then + context.switchtobodyfont { bodyfont } + end + -- + context.resetMPdrawing() + context.startMPdrawing() + context("if unknown context_flow : input mp-flow.mpiv ; fi ;") + context("flow_begin_chart(0,%s,%s);",chart.nx,chart.ny) + -- + if settings.chart.option == variables.test or settings.chart.dot == variables.yes then + context("flow_show_con_points := true ;") + context("flow_show_mid_points := true ;") + context("flow_show_all_points := true ;") + elseif settings.chart.dot ~= "" then -- no checking done, private option + context("flow_show_%s_points := true ;",settings.chart.dot) + end + -- + local backgroundcolor = settings.chart.backgroundcolor + if backgroundcolor and backgroundcolor ~= "" then + context("flow_chart_background_color := \\MPcolor{%s} ;",backgroundcolor) + end + -- + local shapewidth = settings.chart.width + local gridwidth = shapewidth + 2*settings.chart.dx + local shapeheight = settings.chart.height + local gridheight = shapeheight + 2*settings.chart.dy + context("flow_grid_width := %s ;", points(gridwidth)) + context("flow_grid_height := %s ;", points(gridheight)) + context("flow_shape_width := %s ;", points(shapewidth)) + context("flow_shape_height := %s ;", points(shapeheight)) + -- + local radius = settings.line.radius + local rulethickness = settings.line.rulethickness + local dx = settings.chart.dx + local dy = settings.chart.dy + if radius < rulethickness then + radius = 2.5*rulethickness + if radius > dx then + radius = dx + end + if radius > dy then + radius = dy + end + end + context("flow_connection_line_width := %s ;", points(rulethickness)) + context("flow_connection_smooth_size := %s ;", points(radius)) + context("flow_connection_arrow_size := %s ;", points(radius)) + context("flow_connection_dash_size := %s ;", points(radius)) + -- + local offset = settings.chart.offset -- todo: pass string + if offset == variables.none or offset == variables.overlay or offset == "" then + offset = -2.5 * radius -- or rulethickness? + elseif offset == variables.standard then + offset = radius -- or rulethickness? + end + context("flow_chart_offset := %s ;",points(offset)) + -- + context("flow_reverse_y := true ;") + process_cells(chart,0,0) + process_connections(chart,0,0) + process_texts(chart,0,0) + -- context("clip_chart(%s,%s,%s,%s) ;",x,y,nx,ny) -- todo: draw lines but not shapes + context("flow_end_chart ;") + context.stopMPdrawing() + context.MPdrawingdonetrue() -- brrr +-- context.MPstaticgraphictrue() +-- context.MPshiftdrawingfalse() + context.getMPdrawing() + context.endgroup() +end + +function commands.flow_make_chart(settings) + local chart = getchart(settings) + if chart then + local settings = chart.settings + if settings.split.state == variables.start then + local nx = chart.settings.split.nx + local ny = chart.settings.split.ny + local x = 1 + while true do + local y = 1 + while true do + -- FLOTbefore + -- doif @@FLOTmarking on -> cuthbox + -- @@FLOTcommand + chart.from_x = x + chart.from_y = y + chart.to_x = math.min(x + nx - 1,chart.nx) + chart.to_y = math.min(x + ny - 1,chart.ny) + makechart(chart) + -- FLOTafter + y = y + ny + if y > chart.max_y then + break + else + y = y - dy + end + end + x = x + nx + if x > chart.max_x then + break + else + x = x - dx + end + end + else + makechart(chart) + end + end +end diff --git a/tex/context/base/m-flow.mkvi b/tex/context/base/m-flow.mkvi new file mode 100644 index 000000000..62b70bdaa --- /dev/null +++ b/tex/context/base/m-flow.mkvi @@ -0,0 +1,482 @@ +%D \module +%D [ file=m-flow, -- m-chart +%D version=2011.10.1, -- 1998.10.10, +%D title=\CONTEXT\ Modules, +%D subtitle=Flow Charts, +%D author=Hans Hagen, +%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. + +% todo (if used): +% autofocus={name,name,name} -> min/max +% flowsets +% autoscaling (bodyfontsteps) +% comment +% overlay +% +% todo: +% \useFLOWchart[name][parent][setting,setting][additional settings] +% \useFLOWchart[name][parent][additional settings] +% setups +% mp instance with less files + +\registerctxluafile{m-flow}{} + +\unprotect + +\ifdefined \installsimplecommandhandler \else + + \unexpanded\def\installsimplecommandhandler#1#2#3% no define + {\installparameterhandler {#1}{#2}% + \installparameterhashhandler{#1}{#2}% + \installparametersethandler {#1}{#2}% + \installrootparameterhandler{#1}{#2}% + \installsetuphandler {#1}{#2}% + \installattributehandler {#1}{#2}} + +\fi + +% todo: figure out a nice way to define the lot: share current and +% support current as name (nb: we need to set parent then) + +\def\??flch{@@flch} % chart +\def\??flln{@@flln} % line +\def\??flsh{@@flsh} % shape +\def\??flfc{@@flfc} % focus +\def\??flst{@@flst} % sets +\def\??flsp{@@flsp} % split + +\installsimplecommandhandler \??flch {FLOWchart} \??flch +\installsimplecommandhandler \??flln {FLOWline} \??flln +\installsimplecommandhandler \??flsh {FLOWshape} \??flsh +\installsimplecommandhandler \??flfc {FLOWfocus} \??flfc +\installsimplecommandhandler \??flst {FLOWsets} \??flst +\installsimplecommandhandler \??flsp {FLOWsplit} \??flsp + +\let\setupFLOWcharts\setupFLOWchart +\let\setupFLOWlines \setupFLOWline +\let\setupFLOWshapes\setupFLOWshape +\let\setupFLOWsets \setupFLOWset + +\setupFLOWcharts + [\c!width=12\bodyfontsize, + \c!height=7\bodyfontsize, + \c!offset=0pt, % \v!standard, % == auto offset + \c!dx=2\bodyfontsize, + \c!dy=2\bodyfontsize, + \c!nx=0, + \c!ny=0, + \c!x=1, + \c!y=1, + % \c!maxwidth=, + % \c!maxheight=, + % \c!option=, + % \c!bodyfont=, + % \c!dot=, % private option + % \c!autofocus=, + % \c!focus=, + % \c!background=, + % \c!framecolor= + % \c!backgroundcolor=, % \s!white + \c!rulethickness=\linewidth, + \c!frame=\v!off] + +\setupFLOWlines + [\c!corner=\v!round, + \c!arrow=\v!yes, + \c!dash=\v!no, + \c!radius=.375\bodyfontsize, + \c!color=FLOWlinecolor, + \c!rulethickness=.15\bodyfontsize, + \c!offset=\v!none] + +\setupFLOWshapes + [\c!default=action, + \c!framecolor=FLOWframecolor, + \c!background=\v!color, + \c!backgroundcolor=FLOWbackgroundcolor, + \c!rulethickness=.15\bodyfontsize, + \c!offset=.5\bodyfontsize] + +\setupFLOWfocus + [\c!framecolor=FLOWfocuscolor, + \c!background=\FLOWshapeparameter\c!background, + \c!backgroundcolor=\FLOWshapeparameter\c!backgroundcolor, + \c!backgroundscreen=\FLOWshapeparameter\c!backgroundscreen, + \c!rulethickness=\FLOWshapeparameter\c!rulethickness, + \c!offset=\FLOWshapeparameter\c!offset] + +\setupFLOWsplit + [\c!state=\v!stop, + \c!marking=\v!on, + % \c!command=, + % \c!before=, + % \c!after=, + \c!nx=3, + \c!ny=3] + +\definecolor [FLOWfocuscolor] [s=.2] +\definecolor [FLOWlinecolor] [s=.5] +\definecolor [FLOWframecolor] [s=.7] +\definecolor [FLOWbackgroundcolor] [s=.9] + +\newtoks\everyFLOWchart + +\unexpanded\def\startFLOWchart + {\startnointerference + \the\everyFLOWchart + \dosingleempty\start_FLOW_chart} + +\unexpanded\def\start_FLOW_chart[#name]% + {\ctxcommand{flow_start_chart("#name")}} + +\unexpanded\def\stopFLOWchart + {\ctxcommand{flow_stop_chart()}% + \stopnointerference} + +\unexpanded\def\defineFLOWchart % for old times sake + {\dodoubleempty\define_FLOW_chart} + +\unexpanded\def\define_FLOW_chart[#name][#settings]#cells% todo: save settings + {\startnointerference + \the\everyFLOWchart + \ctxcommand{flow_start_chart("#name")}% + #cells% + \ctxcommand{flow_stop_chart()}% + \stopnointerference} + +\unexpanded\def\startFLOWcell + {\dodoubleempty\start_FLOW_cell} + +\unexpanded\def\start_FLOW_cell[#1][#2]% + {\begingroup + \iffirstargument + \setupFLOWshape[#1]% + \fi + \ifsecondargument + \setupFLOWline[#2]% + \fi + \ctxcommand{flow_start_cell { + shape = { + rulethickness = \number\dimexpr\FLOWshapeparameter\c!rulethickness, + default = "\FLOWshapeparameter\c!default", + framecolor = "\FLOWshapeparameter\c!framecolor", + backgroundcolor = "\FLOWshapeparameter\c!backgroundcolor", + }, + focus = { + rulethickness = \number\dimexpr\FLOWfocusparameter\c!rulethickness, + framecolor = "\FLOWfocusparameter\c!framecolor", + backgroundcolor = "\FLOWfocusparameter\c!backgroundcolor", + }, + line = { + rulethickness = \number\dimexpr\FLOWlineparameter\c!rulethickness, + radius = \number\dimexpr\FLOWlineparameter\c!radius, + corner = "\FLOWlineparameter\c!corner", + dash = "\FLOWlineparameter\c!dash", + arrow = "\FLOWlineparameter\c!arrow", + offset = "\FLOWlineparameter\c!offset", + }, + } }% + \endgroup} + +\unexpanded\def\stopFLOWcell + {\ctxcommand{flow_stop_cell()}} + +\unexpanded\def\FLOWchart + {\dodoubleempty\FLOW_chart} + +\def\FLOW_chart[#name][#settings]% + {\vbox\bgroup + \insidefloattrue + \dontcomplain + \setupFLOWchart[#settings]% + \ctxcommand{flow_make_chart { + chart = { + name = "#name", + option = "\FLOWchartparameter\c!option", + backgroundcolor = "\FLOWchartparameter\c!backgroundcolor", + width = \number\dimexpr\FLOWchartparameter\c!width, + height = \number\dimexpr\FLOWchartparameter\c!height, + dx = \number\dimexpr\FLOWchartparameter\c!dx, + dy = \number\dimexpr\FLOWchartparameter\c!dy, + offset = \number\dimexpr\FLOWchartparameter\c!offset, + bodyfont = "\FLOWchartparameter\c!bodyfont", + dot = "\FLOWchartparameter\c!dot", % private option + }, + shape = { + rulethickness = \number\dimexpr\FLOWshapeparameter\c!rulethickness, + default = "\FLOWshapeparameter\c!default", + framecolor = "\FLOWshapeparameter\c!framecolor", + backgroundcolor = "\FLOWshapeparameter\c!backgroundcolor", + }, + focus = { + rulethickness = \number\dimexpr\FLOWfocusparameter\c!rulethickness, + framecolor = "\FLOWfocusparameter\c!framecolor", + backgroundcolor = "\FLOWfocusparameter\c!backgroundcolor", + }, + line = { + rulethickness = \number\dimexpr\FLOWlineparameter\c!rulethickness, + radius = \number\dimexpr\FLOWlineparameter\c!radius, + corner = "\FLOWlineparameter\c!corner", + dash = "\FLOWlineparameter\c!dash", + arrow = "\FLOWlineparameter\c!arrow", + offset = "\FLOWlineparameter\c!offset", + }, + set = { + }, + split = { + state = "\FLOWsplitparameter\c!state", + nx = \number\FLOWsplitparameter\c!nx, + ny = \number\FLOWsplitparameter\c!ny, + command = "", + marking = "\FLOWsplitparameter\c!marking", + before = "", + after = "", + } + } }% + \egroup} + +\unexpanded\def\FLOWcharts + {\dodoubleempty\FLOW_charts} + +\def\FLOW_charts[#name][#settings] + {\begingroup + \setupFLOWsplit[\c!state=\v!start,#settings]% + \FLOW_chart[#name][]% + \endgroup} + +\appendtoks + \let\name \FLOW_name + \let\shape \FLOW_shape + \let\destination\FLOW_destination + \let\focus \FLOW_focus + \let\overlay \FLOW_overlay + \let\location \FLOW_location + \let\text \FLOW_text + \let\label \FLOW_label + \let\comment \FLOW_comment + \let\exit \FLOW_exit + \let\connection \FLOW_connection + \let\include \FLOW_include + \let\figure \FLOW_figure + % + \let\connect \FLOW_connection + \let\locate \FLOW_location + % + \let\includeFLOWchart\include +\to \everyFLOWchart + +\unexpanded\def\FLOW_name #name{\ctxcommand{flow_set_name("#name")}\ignorespaces} +\unexpanded\def\FLOW_shape #shape{\ctxcommand{flow_set_shape("#shape")}\ignorespaces} +\unexpanded\def\FLOW_destination #destination{\ctxcommand{flow_set_destination("#destination")}\ignorespaces} +\unexpanded\def\FLOW_focus #focus{\ctxcommand{flow_set_focus("#focus")}\ignorespaces} +\unexpanded\def\FLOW_overlay #overlay{\ctxcommand{flow_set_overlay("#overlay")}\ignorespaces} +\unexpanded\def\FLOW_location #location{\ctxcommand{flow_set_location("#location")}\ignorespaces} +\unexpanded\def\FLOW_figure #figure{\ctxcommand{flow_set_figure("#figure")}\ignorespaces} + +\unexpanded\def\FLOW_text {\dosingleempty\do_FLOW_text} +\unexpanded\def\FLOW_label {\dosingleempty\do_FLOW_label} +\unexpanded\def\FLOW_comment {\dosingleempty\do_FLOW_commment} +\unexpanded\def\FLOW_exit {\dosingleempty\do_FLOW_exit} +\unexpanded\def\FLOW_connection {\dodoubleempty\do_FLOW_connection} +\unexpanded\def\FLOW_include {\dodoubleempty\do_FLOW_include} + +\unexpanded\def\do_FLOW_text [#align]#text{\ctxcommand{flow_set_text("#align",\!!bs\detokenize{#text}\!!es)}\ignorespaces} +\unexpanded\def\do_FLOW_label [#location]#text{\ctxcommand{flow_set_label("#location",\!!bs\detokenize{#text}\!!es)}\ignorespaces} +\unexpanded\def\do_FLOW_comment [#location]#text{\ctxcommand{flow_set_comment("#location",\!!bs\detokenize{#text}\!!es)}\ignorespaces} +\unexpanded\def\do_FLOW_exit [#location]#text{\ctxcommand{flow_set_exit("#location",\!!bs\detokenize{#text}\!!es)}\ignorespaces} +\unexpanded\def\do_FLOW_connection[#location][#offset]#name{\ctxcommand{flow_set_connection("#location","#offset","#name")}\ignorespaces} + +\unexpanded\def\do_FLOW_include [#name][#settings]{% + \begingroup + \getparameters[FLOWi][x=1,y=1,#settings]% + \ctxcommand{flow_set_include("#name",\number\FLOWix,\number\FLOWiy,\!!bs\detokenize{#settings}\!!es)}% + \endgroup + \ignorespaces +} + +\setvariables + [flowcell:text] + [x=1, + y=1, + text=, + align=, + set=\setups{flowcell:text:place}] + +% \c!background={\@@FLOWbackground,\FLOWoverlay}, + +\defineoverlay + [flowcell:figure] + [\overlayfigure{\getvariable{flowcell:text}{figure}}] + +\startsetups flowcell:text:place + \begingroup + \iftrialtypesetting + \directsetup{flowcell:text:place:indeed} + \else \iflocation + \doifelsenothing {\getvariable{flowcell:text}{destination}} { + \directsetup{flowcell:text:place:indeed} + } { + % tricky: scaling and moving around is not taken into account + \setupinteraction[\c!color=,\c!contrastcolor=] + \gotobox{\directsetup{flowcell:text:place:indeed}}[\getvariable{flowcell:text}{destination}] + } + \else + \directsetup{flowcell:text:place:indeed} + \fi \fi + \endgroup +\stopsetups + +\startsetups flowcell:text:place:indeed + \begingroup + \directsetup{flowcell:text:user} + \doifelsenothing {\getvariable{flowcell:text}{figure}} { + \doframed + [flowcell:\getvariable{flowcell:text}{align}] + {\getvariable{flowcell:text}{text}} + } { + \doframed + [flowcell:\getvariable{flowcell:text}{align}] + [background=flowcell:figure] + {\getvariable{flowcell:text}{text}} + } + \endgroup +\stopsetups + +\defineframed % to be discussed: shape or global + [flowcell:base] + [\c!offset=\v!overlay, % no strut ? + \c!frame=\FLOWchartparameter\c!frame, + \c!background=\FLOWchartparameter\c!background, + \c!backgroundcolor=\FLOWchartparameter\c!backgroundcolor, + %\c!foregroundcolor=\FLOWshapeparameter\c!foregroundcolor, + \c!align=\v!middle, + \c!bottom=\vfill, + \c!top=\vfill, + \c!width=\FLOWchartparameter\c!width, + \c!height=\FLOWchartparameter\c!height, + % \c!rulethickness=\FLOWchartparameter\c!rulethickness, + \c!rulethickness=\zeropoint, % comment for tracing + \c!framecolor=\FLOWchartparameter\c!framecolor] + +\defineframed[flowcell:] [flowcell:base] +\defineframed[flowcell:l] [flowcell:base][\c!align=\v!flushleft] +\defineframed[flowcell:r] [flowcell:base][\c!align=\v!flushright] +\defineframed[flowcell:m] [flowcell:base][\c!align=\v!middle] +\defineframed[flowcell:c] [flowcell:base][\c!align=\v!middle] + +\defineframed[flowcell:t] [flowcell:base][\c!top=] +\defineframed[flowcell:b] [flowcell:base][\c!bottom=] + +\defineframed[flowcell:lt][flowcell:base][\c!top=,\c!align=\v!flushleft] +\defineframed[flowcell:rt][flowcell:base][\c!top=,\c!align=\v!flushright] +\defineframed[flowcell:mt][flowcell:base][\c!top=,\c!align=\v!middle] +\defineframed[flowcell:ct][flowcell:base][\c!top=,\c!align=\v!middle] + +\defineframed[flowcell:lb][flowcell:base][\c!bottom=,\c!align=\v!flushleft] +\defineframed[flowcell:rb][flowcell:base][\c!bottom=,\c!align=\v!flushright] +\defineframed[flowcell:mb][flowcell:base][\c!bottom=,\c!align=\v!middle] +\defineframed[flowcell:cb][flowcell:base][\c!bottom=,\c!align=\v!middle] + +% todo: each cell its own setup +% +% \startsetups flowcell +% \definelayer +% [flowcell] +% [width=\FLOWshapewidth, +% height=\FLOWshapeheight] +% \setlayerframed +% [flowcell] +% [preset=rightbottom,offset=1ex] +% [frame=off] +% {\tx(\FLOWx,\FLOWy)} +% \stopsetups + +%D \starttyping +%D \setupFLOWsplit +%D [nx=5,ny=10, +%D dx=0,dy=0, +%D before=, +%D after=\page] +%D +%D \FLOWcharts[mybigflow] +%D \stoptyping +%D +%D \starttyping +%D \splitfloat +%D {\placefigure{What a big flowchart this is!}} +%D {\FLOWcharts[mybigflow]} +%D \stoptyping + +\protect + +\continueifinputfile{m-flow.mkvi} + +\input chrt-xml.tex + +\usemodule[abr-01] + +\setupFLOWcharts[option=test] +\setupFLOWcharts[frame=on] +\setupinteraction[state=start] + +% \setupFLOWcharts[dx=30pt,dy=30pt] + +\startFLOWchart[demo] + \startFLOWcell[framecolor=darkgray] + \name {start} + \location {1,1} + \shape {action} + \text {start} + \connection [bl] {one} + \stopFLOWcell + \startFLOWcell + \name {one} +% \destination{CloseDocument} + \location {2,2} + \shape {action} + \text {first} +% \label [b] {\bfx bottom} + \connection [rt] {two} +% \exit [l] {exit l} +% \exit [r] {exit r} +% \exit [t] {exit t} +% \exit [b] {exit b} + \stopFLOWcell + \setupFLOWshapes[framecolor=darkgray] + \startFLOWcell % [foregroundcolor=white] + \name {two} +% \destination{CloseDocument} + \location {3,3} + \shape {action} + \text {second} + \figure {cow.pdf} +% \label [l] {\bfx left} +% \exit [l] {exit l} +% \exit [r] {exit r} +% \exit [t] {exit t} +% \exit [b] {exit b} + \stopFLOWcell +\stopFLOWchart + +\starttext + +\startTEXpage +% \FLOWchart[convert-en] +% \FLOWchart[conversion 1] +% \FLOWchart[conversion 7] +% \FLOWchart[conversion 9] +% \FLOWchart[conversion 10] + \FLOWchart[demo] + +\stopTEXpage + +\startTEXpage + \FLOWchart[conversion 10] +\stopTEXpage + +\stoptext diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua index 3eaffded1..38e59a94f 100644 --- a/tex/context/base/mlib-pdf.lua +++ b/tex/context/base/mlib-pdf.lua @@ -98,18 +98,18 @@ end function metapost.flushers.pdf.comment(message) if message then message = format("%% mps graphic %s: %s", metapost.n, message) -if experiment then - context(pdfliteral(message)) -else - if savedliterals then - local last = #savedliterals + 1 - savedliterals[last] = message - context.MPLIBtoPDF(last) + if experiment then + context(pdfliteral(message)) else - savedliterals = { message } - context.MPLIBtoPDF(1) + if savedliterals then + local last = #savedliterals + 1 + savedliterals[last] = message + context.MPLIBtoPDF(last) + else + savedliterals = { message } + context.MPLIBtoPDF(1) + end end -end end end @@ -129,18 +129,18 @@ end function metapost.flushers.pdf.flushfigure(pdfliterals) -- table if #pdfliterals > 0 then pdfliterals = concat(pdfliterals,"\n") -if experiment then - context(pdfliteral(pdfliterals)) -else - if savedliterals then - local last = #savedliterals + 1 - savedliterals[last] = pdfliterals - context.MPLIBtoPDF(last) + if experiment then + context(pdfliteral(pdfliterals)) else - savedliterals = { pdfliterals } - context.MPLIBtoPDF(1) + if savedliterals then + local last = #savedliterals + 1 + savedliterals[last] = pdfliterals + context.MPLIBtoPDF(last) + else + savedliterals = { pdfliterals } + context.MPLIBtoPDF(1) + end end -end end end diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua index 330339c40..ca3bbaa75 100644 --- a/tex/context/base/mlib-pps.lua +++ b/tex/context/base/mlib-pps.lua @@ -700,7 +700,7 @@ end local basepoints = number.dimenfactors["bp"] -local cm = function(object) +local function cm(object) local op = object.path local first, second, fourth = op[1], op[2], op[4] local tx, ty = first.x_coord , first.y_coord @@ -768,17 +768,19 @@ local function tx_process(object,prescript,before,after) if trace_textexts then report_textexts("processing %s (second pass)",tx_number) end - before[#before+1] = format("q %f %f %f %f %f %f cm",cm(object)) + -- before[#before+1] = format("q %f %f %f %f %f %f cm",cm(object)) + local sx,rx,ry,sy,tx,ty = cm(object) before[#before+1] = function() -- flush always happens, we can have a special flush function injected before local box = textexts[tx_number] if box then - context.MPLIBgettextscaled(tx_number,sxsy(box.width,box.height,box.depth)) + -- context.MPLIBgettextscaled(tx_number,sxsy(box.width,box.height,box.depth)) + context.MPLIBgettextscaledcm(tx_number,sx,rx,ry,sy,tx,ty,sxsy(box.width,box.height,box.depth)) else report_textexts("unknown %s",tx_number) end end - before[#before+1] = "Q" + -- before[#before+1] = "Q" if not trace_textexts then object.path = false -- else: keep it end diff --git a/tex/context/base/mlib-pps.mkiv b/tex/context/base/mlib-pps.mkiv index 25ebab6fa..b2afbc0da 100644 --- a/tex/context/base/mlib-pps.mkiv +++ b/tex/context/base/mlib-pps.mkiv @@ -45,6 +45,19 @@ {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}% \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=#2,\c!sy=#3]{\raise\dp\MPtextbox\box\MPtextbox}\forcecolorhack\hss}}} +% horrible: + +\def\MPLIBgettextscaledcm#1#2#3#4#5#6#7#8#9% 2-7: sx,rx,ry,sy,tx,ty + {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}% + \setbox\scratchbox\hbox + {\hskip\dimexpr#6bp\raise#7bp\hbox + {\pdfsave + \pdfsetmatrix{#2 #3 #4 #5}% + \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=#8,\c!sy=#9]{\raise\dp\MPtextbox\box\MPtextbox}\forcecolorhack\hss}}% + \pdfrestore}}% + \smashbox\scratchbox + \box\scratchbox} + \def\MPLIBgraphictext#1% {\startTEXpage[\c!scale=10000]#1\stopTEXpage} diff --git a/tex/context/base/mult-low.lua b/tex/context/base/mult-low.lua index 91fb4baf8..d76010e07 100644 --- a/tex/context/base/mult-low.lua +++ b/tex/context/base/mult-low.lua @@ -46,7 +46,8 @@ return { "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", - "starttext", "stoptext" + "starttext", "stoptext", + "startmodule", "stopmodule", "usemodule", }, ["helpers"] = { -- @@ -138,5 +139,7 @@ return { -- "getfirstcharacter", "doiffirstcharelse", -- + "startnointerference", "stopnointerference", + -- } } diff --git a/tex/context/base/mult-mps.lua b/tex/context/base/mult-mps.lua index 1dcb4d476..860ae29f1 100644 --- a/tex/context/base/mult-mps.lua +++ b/tex/context/base/mult-mps.lua @@ -42,6 +42,7 @@ return { "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", + "endinput", }, plain = { "ahangle", "ahlength", "bboxmargin", "defaultpen", "defaultscale", diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index ebadf90e0..5245208a2 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -2942,21 +2942,49 @@ %D also simplified the \type {\setupframed} command. There are %D certainly more places where such improvements can be made. -\def\defineframed - {\dodoubleempty\dodefineframed} - -\def\dodefineframed[#1][#2]% +% \def\defineframed +% {\dodoubleempty\dodefineframed} +% +% \def\dodefineframed[#1][#2]% +% {\ifcsname\??ol:#1\endcsname +% % already defined, keeps settings +% \else +% \expandafter\newcount\csname\??ol:#1\endcsname % \the\everypresetframed +% \fi +% \getparameters[\??ol#1][\s!parent=\??ol,#2]% +% \setuvalue{#1}{\doframed[#1]}}% % \the\everydefineframed + +\def\defineframed % also inheritance now + {\dotripleempty\dodefineframed} + +\def\dodefineframed[#1][#2][#3]% {\ifcsname\??ol:#1\endcsname % already defined, keeps settings \else \expandafter\newcount\csname\??ol:#1\endcsname % \the\everypresetframed \fi - \getparameters[\??ol#1][\s!parent=\??ol,#2]% + \ifsecondargument + \doifassignmentelse{#2} + {\getparameters[\??ol#1][\s!parent=\??ol,#2]}% + {\ifcsname#2\endcsname + \getparameters[\??ol#1][\s!parent=\??ol#2,#3]% + \else + \getparameters[\??ol#1][\s!parent=\??ol,#3]% + \fi}% + \else + \getparameters[\??ol#1][\s!parent=\??ol,#2]% + \fi \setuvalue{#1}{\doframed[#1]}}% % \the\everydefineframed -\def\doframed[#1]% +\newcount\crapframedcount + +\def\doframed[#1]% official (not much checking, todo: parent) {\bgroup - \expandafter\let\expandafter\tempframedcount\csname\??ol:#1\endcsname + \ifcsname\??ol:#1\endcsname + \expandafter\let\expandafter\tempframedcount\csname\??ol:#1\endcsname + \else + \let\tempframedcount\crapframedcount + \fi \advance\tempframedcount\plusone \expandafter\def\csname\??ol#1:\the\tempframedcount\s!parent\endcsname{\??ol#1}% \inheritlocalframed \dodoubleempty\dolocalframed[\??ol#1:\the\tempframedcount]} diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv index ef2f55752..6156ab8b1 100644 --- a/tex/context/base/page-one.mkiv +++ b/tex/context/base/page-one.mkiv @@ -289,7 +289,7 @@ \OTRONEdosettopinserts \OTRONEdosetbotinserts \ifsomefloatwaiting - \doif\rootfloatparameter\c!cache\v!no\doflushfloats + \doif{\rootfloatparameter\c!cache}\v!no\doflushfloats \fi \fi} diff --git a/tex/context/base/s-art-01.mkiv b/tex/context/base/s-art-01.mkiv new file mode 100644 index 000000000..d62689798 --- /dev/null +++ b/tex/context/base/s-art-01.mkiv @@ -0,0 +1,36 @@ +\startmodule[art-01] + +% \showframe + +\setuplayout + [topspace=2cm, + bottomspace=2.5cm, + width=middle, + height=middle, + footer=0pt] + +\setupbodyfont + [dejavu] + +\setupwhitespace + [big] + +\setuphead + [chapter] + [style=\bfc, + headerstate=high] + +\setuphead + [section] + [style=\bfb] + +\setuphead + [subsection] + [style=\bfa] + +\setuphead + [subsubsection] + [style=\bf, + after=] + +\stopmodule diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex 179300e49..cc89cf9a6 100644 --- a/tex/context/base/status-files.pdf +++ b/tex/context/base/status-files.pdf diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf Binary files differindex 1cba3622d..9634937b1 100644 --- a/tex/context/base/status-lua.pdf +++ b/tex/context/base/status-lua.pdf diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua index 969e1e5f2..fd25f7d45 100644 --- a/tex/context/base/strc-ini.lua +++ b/tex/context/base/strc-ini.lua @@ -170,6 +170,8 @@ local tags = { -- -- local command = format("\\xmlprocessbuffer{%s}{%s}{}",metadata.xmlroot or "main",tag) +local experiment = true + function helpers.title(title,metadata) -- coding is xml is rather old and not that much needed now if title and title ~= "" then -- so it might disappear if metadata then @@ -178,12 +180,21 @@ function helpers.title(title,metadata) -- coding is xml is rather old and not th -- title can contain raw xml local tag = tags[metadata.kind] or tags.generic local xmldata = format("<?xml version='1.0'?><%s>%s</%s>",tag,title,tag) +if not experiment then buffers.assign(tag,xmldata) +end if trace_processors then report_processors("putting xml data in buffer: %s",xmldata) report_processors("processing buffer with setup '%s' and tag '%s'",xmlsetup or "",tag) end +if experiment then + -- the question is: will this be forgotten ... better store in a via file + local xmltable = lxml.convert("temp",xmldata or "") + lxml.store("temp",xmltable) + context.xmlsetup("temp",xmlsetup or "") +else context.xmlprocessbuffer("dummy",tag,xmlsetup or "") +end elseif xmlsetup then -- title is reference to node (so \xmlraw should have been used) if trace_processors then report_processors("feeding xmlsetup '%s' using node '%s'",xmlsetup,title) diff --git a/tex/context/base/strc-ref.mkvi b/tex/context/base/strc-ref.mkvi index b7159dfbc..414dcbafe 100644 --- a/tex/context/base/strc-ref.mkvi +++ b/tex/context/base/strc-ref.mkvi @@ -1191,7 +1191,7 @@ \fi \endgroup} -\unexpanded\def\gotobox#content[#label]% no test for valid references +\unexpanded\def\gotobox#content[#label]% {\dontleavehmode \begingroup \global\lastsavedreferenceattribute\attributeunsetvalue diff --git a/tex/context/base/trac-set.lua b/tex/context/base/trac-set.lua index 27b5f17f2..f7708b5d5 100644 --- a/tex/context/base/trac-set.lua +++ b/tex/context/base/trac-set.lua @@ -74,6 +74,10 @@ local function set(t,what,newvalue) if type(what) ~= "table" then return end + if not done then -- catch ... why not set? + done = { } + t.done = done + end for w, value in next, what do if value == "" then value = newvalue diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 7371dcfc9..981b8510d 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 10/03/11 12:59:24 +-- merge date : 10/05/11 23:32:57 do -- begin closure to overcome local limits and interference @@ -5136,15 +5136,21 @@ local function showfeatureorder(rawdata,filename) if features then for feature, scripts in next, features do local tt = { } - for script, languages in next, scripts do - local ttt = { } - for language, _ in next, languages do - ttt[#ttt+1] = language + if type(scripts) == "table" then + for script, languages in next, scripts do + local ttt = { } + for language, _ in next, languages do + ttt[#ttt+1] = language + end + tt[#tt+1] = format("[%s: %s]",script,concat(ttt," ")) + end + if trace_loading then + report_otf(" %s: %s",feature,concat(tt," ")) + end + else + if trace_loading then + report_otf(" %s: %s",feature,tostring(scripts)) end - tt[#tt+1] = format("[%s: %s]",script,concat(ttt," ")) - end - if trace_loading then - report_otf(" %s: %s",feature,concat(tt," ")) end end end @@ -12136,7 +12142,7 @@ function definers.loadfont(specification) local embedding if directive_embedall then embedding = "full" - elseif properties.filename and constructors.dontembed[properties.filename] then + elseif properties and properties.filename and constructors.dontembed[properties.filename] then embedding = "no" else embedding = "subset" |