diff options
133 files changed, 8788 insertions, 4075 deletions
diff --git a/scripts/context/lua/mtx-base.lua b/scripts/context/lua/mtx-base.lua index 67bde5b79..7d64df6fd 100644 --- a/scripts/context/lua/mtx-base.lua +++ b/scripts/context/lua/mtx-base.lua @@ -12,14 +12,15 @@ logs.extendbanner("ConTeXt TDS Management Tool 1.35 (aka luatools)") local instance = resolvers.instance -instance.engine = environment.arguments["engine"] or instance.engine or 'luatex' -instance.progname = environment.arguments["progname"] or instance.progname or 'context' -instance.luaname = environment.arguments["luafile"] or "" -instance.lualibs = environment.arguments["lualibs"] or nil -instance.allresults = environment.arguments["all"] or false -instance.pattern = environment.arguments["pattern"] or nil -instance.sortdata = environment.arguments["sort"] or false -instance.my_format = environment.arguments["format"] or instance.format +instance.engine = environment.arguments["engine"] or instance.engine or 'luatex' +instance.progname = environment.arguments["progname"] or instance.progname or 'context' +instance.luaname = environment.arguments["luafile"] or "" +instance.lualibs = environment.arguments["lualibs"] or nil +instance.pattern = environment.arguments["pattern"] or nil +instance.sortdata = environment.arguments["sort"] or false + +local my_format = environment.arguments["format"] or "" -- nil ? +local all_results = environment.arguments["all"] or false if type(instance.pattern) == 'boolean' then logs.simple("invalid pattern specification") @@ -69,16 +70,14 @@ messages.help = [[ if environment.arguments["find-file"] then resolvers.load() - instance.format = environment.arguments["format"] or instance.format if instance.pattern then - instance.allresults = true - resolvers.dowithfilesandreport(resolvers.findfiles, { instance.pattern }, instance.my_format) + resolvers.dowithfilesandreport(resolvers.findfiles, { instance.pattern }, my_format, all_results) else - resolvers.dowithfilesandreport(resolvers.findfiles, environment.files, instance.my_format) + resolvers.dowithfilesandreport(resolvers.findfiles, environment.files, my_format, all_results) end elseif environment.arguments["find-path"] then resolvers.load() - local path = resolvers.findpath(environment.files[1], instance.my_format) + local path = resolvers.findpath(environment.files[1], my_format) print(path) -- quite basic, wil become function in logs elseif environment.arguments["run"] then resolvers.load("nofiles") -- ! no need for loading databases @@ -96,21 +95,19 @@ elseif environment.arguments["expand-path"] then resolvers.dowithfilesandreport(resolvers.expandpath, environment.files) elseif environment.arguments["expand-var"] or environment.arguments["expand-variable"] then resolvers.load("nofiles") - resolvers.dowithfilesandreport(resolvers.expandvar, environment.files) + resolvers.dowithfilesandreport(resolvers.expansion, environment.files) elseif environment.arguments["show-path"] or environment.arguments["path-value"] then resolvers.load("nofiles") resolvers.dowithfilesandreport(resolvers.showpath, environment.files) elseif environment.arguments["var-value"] or environment.arguments["show-value"] then resolvers.load("nofiles") - resolvers.dowithfilesandreport(resolvers.var_value, environment.files) + resolvers.dowithfilesandreport(resolvers.variable, environment.files) elseif environment.arguments["format-path"] then resolvers.load() logs.simple(caches.getwritablepath("format")) elseif instance.pattern then -- brrr resolvers.load() - instance.format = environment.arguments["format"] or instance.format - instance.allresults = true - resolvers.dowithfilesandreport(resolvers.findfiles, { instance.pattern }, instance.my_format) + resolvers.dowithfilesandreport(resolvers.findfiles, { instance.pattern }, my_format, all_results) elseif environment.arguments["generate"] then instance.renewcache = true trackers.enable("resolvers.locating") @@ -135,5 +132,5 @@ elseif environment.files[1] == 'texmfcnf.lua' then resolvers.listers.configurations() else resolvers.load() - resolvers.dowithfilesandreport(resolvers.findfiles, environment.files, instance.my_format) + resolvers.dowithfilesandreport(resolvers.findfiles, environment.files, my_format, all_results) end diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index 6e0c2b74c..c5976018c 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -298,7 +298,6 @@ end patterns.textline = content - local splitters_s, splitters_m = { }, { } local function splitat(separator,single) @@ -320,6 +319,7 @@ end lpeg.splitat = splitat + local cache = { } function lpeg.split(separator,str) @@ -2559,6 +2559,13 @@ end -- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" } +-- for myself: + +function file.strip(name,dir) + local b, a = match(name,"^(.-)" .. dir .. "(.*)$") + return a ~= "" and a or name +end + end -- of closure @@ -4520,7 +4527,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti data = data.data if data then for key, value in next, values do - key = gsub(key,"_",".") + -- key = gsub(key,"_",".") value = is_boolean(value,value) local functions = data[key] if functions then @@ -4547,6 +4554,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti end end end + return true end end end @@ -4782,6 +4790,29 @@ if directives and environment and environment.engineflags.directives then d_enable(environment.engineflags.directives) end +-- here + +if texconfig then + + local function set(k,v) + v = tonumber(v) + if v then + texconfig[k] = v + end + end + + directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end) + directives.register("luatex.hashextra", function(v) set("hash_extra",v) end) + directives.register("luatex.nestsize", function(v) set("nest_size",v) end) + directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end) + directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end) + directives.register("luatex.maxstrings", function(v) set("max_strings",v) end) + directives.register("luatex.paramsize", function(v) set("param_size",v) end) + directives.register("luatex.savesize", function(v) set("save_size",v) end) + directives.register("luatex.stacksize", function(v) set("stack_size",v) end) + +end + end -- of closure @@ -9626,92 +9657,231 @@ if not modules then modules = { } end modules ['data-env'] = { } local allocate = utilities.storage.allocate +local lower, gsub = string.lower, string.gsub + +local fileextname = file.extname local resolvers = resolvers -local formats = allocate() resolvers.formats = formats -local suffixes = allocate() resolvers.suffixes = suffixes -local dangerous = allocate() resolvers.dangerous = dangerous -local suffixmap = allocate() resolvers.suffixmap = suffixmap -local alternatives = allocate() resolvers.alternatives = alternatives - -formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' } -formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' } -formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' } -formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' } -formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' } -formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' } -formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' } -formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' } -formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' } -formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' } -formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' } -formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' } -formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' } -formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' } -formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' } -formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' } -formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' } -formats['icc'] = 'ICCPROFILES' suffixes['icc'] = { 'icc' } -formats['texmfscripts'] = 'TEXMFSCRIPTS' suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -formats['lua'] = 'LUAINPUTS' suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' } -formats['lib'] = 'CLUAINPUTS' suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' } - --- backward compatible ones - -alternatives['map files'] = 'map' -alternatives['enc files'] = 'enc' -alternatives['cid maps'] = 'cid' -- great, why no cid files -alternatives['font feature files'] = 'fea' -- and fea files here -alternatives['opentype fonts'] = 'otf' -alternatives['truetype fonts'] = 'ttf' -alternatives['truetype collections'] = 'ttc' -alternatives['truetype dictionary'] = 'dfont' -alternatives['type1 fonts'] = 'pfb' -alternatives['icc profiles'] = 'icc' +local formats = allocate() resolvers.formats = formats +local suffixes = allocate() resolvers.suffixes = suffixes +local dangerous = allocate() resolvers.dangerous = dangerous +local suffixmap = allocate() resolvers.suffixmap = suffixmap + +local relations = allocate { + core = { + ofm = { + names = { "ofm", "omega font metric", "omega font metrics" }, + variable = 'OFMFONTS', + suffixes = { 'ofm', 'tfm' }, + }, + ovf = { + names = { "ovf", "omega virtual font", "omega virtual fonts" }, + variable = 'OVFFONTS', + suffixes = { 'ovf', 'vf' }, + }, + tfm = { + names = { "tfm", "tex font metric", "tex font metrics" }, + variable = 'TFMFONTS', + suffixes = { 'tfm' }, + }, + vf = { + names = { "vf", "virtual font", "virtual fonts" }, + variable = 'VFFONTS', + suffixes = { 'vf' }, + }, + otf = { + names = { "otf", "opentype", "opentype font", "opentype fonts"}, + variable = 'OPENTYPEFONTS', + suffixes = { 'otf' }, + }, + ttf = { + names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" }, + variable = 'TTFONTS', + suffixes = { 'ttf', 'ttc', 'dfont' }, + }, + afm = { + names = { "afm", "adobe font metric", "adobe font metrics" }, + variable = "AFMFONTS", + suffixes = { "afm" }, + }, + pfb = { + names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" }, + variable = 'T1FONTS', + suffixes = { 'pfb', 'pfa' }, + }, + fea = { + names = { "fea", "font feature", "font features", "font feature file", "font feature files" }, + variable = 'FONTFEATURES', + suffixes = { 'fea' }, + }, + cid = { + names = { "cid", "cid map", "cid maps", "cid file", "cid files" }, + variable = 'FONTCIDMAPS', + suffixes = { 'cid', 'cidmap' }, + }, + fmt = { + names = { "fmt", "format", "tex format" }, + variable = 'TEXFORMATS', + suffixes = { 'fmt' }, + }, + mem = { + names = { 'mem', "metapost format" }, + variable = 'MPMEMS', + suffixes = { 'mem' }, + }, + mp = { + names = { "mp" }, + variable = 'MPINPUTS', + suffixes = { 'mp' }, + }, + tex = { + names = { "tex" }, + variable = 'TEXINPUTS', + suffixes = { 'tex', "mkiv", "mkii" }, + }, + icc = { + names = { "icc", "icc profile", "icc profiles" }, + variable = 'ICCPROFILES', + suffixes = { 'icc' }, + }, + texmfscripts = { + names = { "texmfscript", "texmfscripts", "script", "scripts" }, + variable = 'TEXMFSCRIPTS', + suffixes = { 'rb', 'pl', 'py' }, + }, + lua = { + names = { "lua" }, + variable = 'LUAINPUTS', + suffixes = { 'lua', 'luc', 'tma', 'tmc' }, + }, + lib = { + names = { "lib" }, + variable = 'CLUAINPUTS', + suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' }, + }, + bib = { + names = { 'bib' }, + suffixes = { 'bib' }, + }, + bst = { + names = { 'bst' }, + suffixes = { 'bst' }, + }, + fontconfig = { + names = { 'fontconfig', 'fontconfig file', 'fontconfig files' }, + variable = 'FONTCONFIG_PATH', + }, + }, + obsolete = { + enc = { + names = { "enc", "enc files", "enc file", "encoding files", "encoding file" }, + variable = 'ENCFONTS', + suffixes = { 'enc' }, + }, + map = { + names = { "map", "map files", "map file" }, + variable = 'TEXFONTMAPS', + suffixes = { 'map' }, + }, + lig = { + names = { "lig files", "lig file", "ligature file", "ligature files" }, + variable = 'LIGFONTS', + suffixes = { 'lig' }, + }, + opl = { + names = { "opl" }, + variable = 'OPLFONTS', + suffixes = { 'opl' }, + }, + otp = { + names = { "otp" }, + variable = 'OTPINPUTS', + suffixes = { 'otp' }, + }, + ovp = { + names = { "ovp" }, + variable = 'OVPFONTS', + suffixes = { 'ovp' }, + }, + }, + kpse = { -- subset + base = { + names = { 'base', "metafont format" }, + variable = 'MFBASES', + suffixes = { 'base', 'bas' }, + }, + cmap = { + names = { 'cmap', 'cmap files', 'cmap file' }, + variable = 'CMAPFONTS', + suffixes = { 'cmap' }, + }, + cnf = { + names = { 'cnf' }, + suffixes = { 'cnf' }, + }, + web = { + names = { 'web' }, + suffixes = { 'web', 'ch' } + }, + cweb = { + names = { 'cweb' }, + suffixes = { 'w', 'web', 'ch' }, + }, + gf = { + names = { 'gf' }, + suffixes = { '<resolution>gf' }, + }, + mf = { + names = { 'mf' }, + variable = 'MFINPUTS', + suffixes = { 'mf' }, + }, + mft = { + names = { 'mft' }, + suffixes = { 'mft' }, + }, + pk = { + names = { 'pk' }, + suffixes = { '<resolution>pk' }, + }, + }, +} ---[[ldx-- -<p>If you wondered about some of the previous mappings, how about -the next bunch:</p> ---ldx]]-- +resolvers.relations = relations + +-- formats: maps a format onto a variable + +for category, categories in next, relations do + for name, relation in next, categories do + local rn = relation.names + local rv = relation.variable + local rs = relation.suffixes + if rn and rv then + for i=1,#rn do + local rni = lower(gsub(rn[i]," ","")) + formats[rni] = rv + if rs then + suffixes[rni] = rs + for i=1,#rs do + local rsi = rs[i] + suffixmap[rsi] = rni + end + end + end + end + if rs then + end + end +end + +local function simplified(t,k) + return rawget(t,lower(gsub(k," ",""))) +end --- kpse specific ones (a few omitted) .. we only add them for locating --- files that we don't use anyway - -formats['base'] = 'MFBASES' suffixes['base'] = { 'base', 'bas' } -formats['bib'] = '' suffixes['bib'] = { 'bib' } -formats['bitmap font'] = '' suffixes['bitmap font'] = { } -formats['bst'] = '' suffixes['bst'] = { 'bst' } -formats['cmap files'] = 'CMAPFONTS' suffixes['cmap files'] = { 'cmap' } -formats['cnf'] = '' suffixes['cnf'] = { 'cnf' } -formats['cweb'] = '' suffixes['cweb'] = { 'w', 'web', 'ch' } -formats['dvips config'] = '' suffixes['dvips config'] = { } -formats['gf'] = '' suffixes['gf'] = { '<resolution>gf' } -formats['graphic/figure'] = '' suffixes['graphic/figure'] = { 'eps', 'epsi' } -formats['ist'] = '' suffixes['ist'] = { 'ist' } -formats['lig files'] = 'LIGFONTS' suffixes['lig files'] = { 'lig' } -formats['ls-R'] = '' suffixes['ls-R'] = { } -formats['mem'] = 'MPMEMS' suffixes['mem'] = { 'mem' } -formats['MetaPost support'] = '' suffixes['MetaPost support'] = { } -formats['mf'] = 'MFINPUTS' suffixes['mf'] = { 'mf' } -formats['mft'] = '' suffixes['mft'] = { 'mft' } -formats['misc fonts'] = '' suffixes['misc fonts'] = { } -formats['other text files'] = '' suffixes['other text files'] = { } -formats['other binary files'] = '' suffixes['other binary files'] = { } -formats['pdftex config'] = 'PDFTEXCONFIG' suffixes['pdftex config'] = { } -formats['pk'] = '' suffixes['pk'] = { '<resolution>pk' } -formats['PostScript header'] = 'TEXPSHEADERS' suffixes['PostScript header'] = { 'pro' } -formats['sfd'] = 'SFDFONTS' suffixes['sfd'] = { 'sfd' } -formats['TeX system documentation'] = '' suffixes['TeX system documentation'] = { } -formats['TeX system sources'] = '' suffixes['TeX system sources'] = { } -formats['Troff fonts'] = '' suffixes['Troff fonts'] = { } -formats['type42 fonts'] = 'T42FONTS' suffixes['type42 fonts'] = { } -formats['web'] = '' suffixes['web'] = { 'web', 'ch' } -formats['web2c files'] = 'WEB2C' suffixes['web2c files'] = { } -formats['fontconfig files'] = 'FONTCONFIG_PATH' suffixes['fontconfig files'] = { } -- not unique - -alternatives['subfont definition files'] = 'sfd' +setmetatablekey(formats, "__index", simplified) +setmetatablekey(suffixes, "__index", simplified) +setmetatablekey(suffixmap, "__index", simplified) -- A few accessors, mostly for command line tool. @@ -9720,31 +9890,12 @@ function resolvers.suffixofformat(str) return s and s[1] or "" end -function resolvers.suffixesofformat(str) +function resolvers.suffixofformat(str) return suffixes[str] or { } end --- As we don't register additional suffixes anyway, we can as well --- freeze the reverse map here. - -for name, suffixlist in next, suffixes do - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end -end - -local mt = getmetatable(suffixes) - -mt.__newindex = function(suffixes,name,suffixlist) - rawset(suffixes,name,suffixlist) - suffixes[name] = suffixlist - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end -end - for name, format in next, formats do - dangerous[name] = true + dangerous[name] = true -- still needed ? end -- because vf searching is somewhat dangerous, we want to prevent @@ -9757,15 +9908,15 @@ dangerous.tex = nil -- more helpers function resolvers.formatofvariable(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.formatofsuffix(str) -- of file - return suffixmap[file.extname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) + return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) end function resolvers.variableofformat(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.variableofformatorsuffix(str) @@ -9773,10 +9924,6 @@ function resolvers.variableofformatorsuffix(str) if v then return v end - v = formats[alternatives[str]] - if v then - return v - end v = suffixmap[fileextname(str)] if v then return formats[v] @@ -10281,7 +10428,6 @@ local formats = resolvers.formats local suffixes = resolvers.suffixes local dangerous = resolvers.dangerous local suffixmap = resolvers.suffixmap -local alternatives = resolvers.alternatives resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky @@ -10293,7 +10439,6 @@ function resolvers.newinstance() local newinstance = { progname = 'context', engine = 'luatex', - format = '', environment = allocate(), variables = allocate(), expansions = allocate(), @@ -10313,7 +10458,6 @@ function resolvers.newinstance() renewcache = false, loaderror = false, savelists = true, - allresults = false, pattern = nil, -- lists force_suffixes = true, } @@ -10400,7 +10544,8 @@ end local function entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - local result = entries[name..'.'..instance.progname] or entries[name] + -- local result = entries[name..'.'..instance.progname] or entries[name] + local result = entries[instance.progname .. '.' .. name] or entries[name] if result then return result else @@ -10418,7 +10563,8 @@ end local function is_entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + -- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + return (entries[instance.progname .. '.' .. name] or entries[name]) ~= nil else return false end @@ -10479,19 +10625,28 @@ local function load_configuration_files() end -- flattening is easier to deal with as we need to collapse local t = { } - for k, v in next, data do -- v = progname + for k, v in next, data do -- k = progname or setter or variables if v ~= unset_variable then local kind = type(v) if kind == "string" then + -- still supported, but preferably use the variables subtable t[k] = v elseif kind == "table" then - -- this operates on the table directly - initializesetter(filename,k,v) - -- this doesn't (maybe metatables some day) - for kk, vv in next, v do -- vv = variable - if vv ~= unset_variable then - if type(vv) == "string" then - t[kk.."."..k] = vv + if initializesetter(filename,k,v) then + -- directives, experiments, trackers, ... + else + for kk, vv in next, v do -- vv = variable + if vv ~= unset_variable then + if type(vv) == "string" then + -- t[kk.."."..k] = vv + if k == "variables" then + -- special table, shared variables can be grouped + t[kk] = vv + else + -- category.variable (progname) + t[k .. "." .. kk] = vv + end + end end end end @@ -10761,12 +10916,12 @@ function resolvers.expandvariables() if engine ~= "" then environment['engine'] = engine end if progname ~= "" then environment['progname'] = progname end for k,v in next, environment do - local a, b = match(k,"^(%a+)%_(.*)%s*$") - if a and b then - expansions[a..'.'..b] = v - else + -- local a, b = match(k,"^(%a+)%_(.*)%s*$") -- too many vars have an _ in the name + -- if a and b then -- so let's forget about it; it was a + -- expansions[a..'.'..b] = v -- hack anyway for linux and not needed + -- else -- anymore as we now have directives expansions[k] = v - end + -- end end for k,v in next, environment do -- move environment to expansions (variables are already in there) if not expansions[k] then expansions[k] = v end @@ -10820,7 +10975,7 @@ function resolvers.unexpandedpathlist(str) end function resolvers.unexpandedpath(str) - return file.joinpath(resolvers.unexpandedpath_list(str)) + return file.joinpath(resolvers.unexpandedpathlist(str)) end local done = { } @@ -11081,13 +11236,14 @@ local function can_be_dir(name) -- can become local return fakepaths[name] == 1 end -local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc) - local result = collected or { } +local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc) + local result = { } local stamp = nil + askedformat = askedformat or "" filename = collapsepath(filename) -- speed up / beware: format problem - if instance.remember then - stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format + if instance.remember and not allresults then + stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. askedformat if instance.found[stamp] then if trace_locating then report_resolvers("remembering file '%s'",filename) @@ -11096,12 +11252,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan return instance.found[stamp] end end - if not dangerous[instance.format or "?"] then + if not dangerous[askedformat] then if resolvers.isreadable.file(filename) then if trace_detail then report_resolvers("file '%s' found directly",filename) end - instance.found[stamp] = { filename } + if stamp then + instance.found[stamp] = { filename } + end return { filename } end end @@ -11109,7 +11267,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if trace_locating then report_resolvers("checking wildcard '%s'", filename) end - result = resolvers.findwildcardfiles(filename) + result = resolvers.findwildcardfiles(filename) -- we can use th elocal elseif file.is_qualified_path(filename) then if resolvers.isreadable.file(filename) then if trace_locating then @@ -11119,7 +11277,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else local forcedname, ok, suffix = "", false, fileextname(filename) if suffix == "" then -- why - local format_suffixes = instance.format == "" and resolvers.defaultsuffixes or suffixes[instance.format] + local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do local s = format_suffixes[i] @@ -11139,21 +11297,22 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan -- matching last part of the name local basename = filebasename(filename) local pattern = gsub(filename .. "$","([%.%-])","%%%1") - local savedformat = instance.format + -- messy .. to be sorted out + local savedformat = askedformat local format = savedformat or "" if format == "" then - instance.format = resolvers.formatofsuffix(suffix) + askedformat = resolvers.formatofsuffix(suffix) end if not format then - instance.format = "othertextfiles" -- kind of everything, maybe texinput is better + askedformat = "othertextfiles" -- kind of everything, maybe texinput is better end -- if basename ~= filename then - local resolved = collect_instance_files(basename) + local resolved = collect_instance_files(basename,askedformat,allresults) if #result == 0 then local lowered = lower(basename) if filename ~= lowered then - resolved = collect_instance_files(lowered) + resolved = collect_instance_files(lowered,askedformat,allresults) end end resolvers.format = savedformat @@ -11192,7 +11351,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else wantedfiles[#wantedfiles+1] = filename end - if instance.format == "" then + if askedformat == "" then if ext == "" or not suffixmap[ext] then local defaultsuffixes = resolvers.defaultsuffixes for i=1,#defaultsuffixes do @@ -11211,14 +11370,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end else if ext == "" or not suffixmap[ext] then - local format_suffixes = suffixes[instance.format] + local format_suffixes = suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i] end end end - filetype = instance.format + filetype = askedformat if trace_locating then report_resolvers("using given filetype '%s'",filetype) end @@ -11289,7 +11448,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan --- todo, test for readable result[#result+1] = fl[3] done = true - if instance.allresults then + if allresults then if trace_detail then report_resolvers("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d) end @@ -11320,7 +11479,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end result[#result+1] = fname done = true - if not instance.allresults then break end + if not allresults then break end end end else @@ -11332,7 +11491,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if not done and doscan then -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF end - if done and not instance.allresults then break end + if done and not allresults then break end end end end @@ -11341,7 +11500,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan result[k] = rk resolvers.registerintrees(rk) -- for tracing used files end - if instance.remember then + if stamp then instance.found[stamp] = result end return result @@ -11350,37 +11509,30 @@ end resolvers.concatinators.tex = filejoin resolvers.concatinators.file = resolvers.concatinators.tex -function resolvers.findfiles(filename,filetype,mustexist) - if type(mustexist) == boolean then - -- all set - elseif type(filetype) == 'boolean' then - filetype, mustexist = nil, false - elseif type(filetype) ~= 'string' then - filetype, mustexist = nil, false - end - instance.format = filetype or '' - local result = collect_instance_files(filename) +local function findfiles(filename,filetype,allresults) + local result = collect_instance_files(filename,filetype or "",allresults) if #result == 0 then local lowered = lower(filename) if filename ~= lowered then - return collect_instance_files(lowered) + return collect_instance_files(lowered,filetype or "",allresults) end end - instance.format = '' return result end -function resolvers.findfile(filename,filetype,mustexist) - return (resolvers.findfiles(filename,filetype,mustexist)[1] or "") +function resolvers.findfiles(filename,filetype) + return findfiles(filename,filetype,true) +end + +function resolvers.findfile(filename,filetype) + return findfiles(filename,filetype,false)[1] or "" end function resolvers.findpath(filename,filetype) - local path = resolvers.findfiles(filename,filetype)[1] or "" - -- todo return current path - return file.dirname(path) + return file.dirname(findfiles(filename,filetype,false)[1] or "") end -function resolvers.findgivenfiles(filename) +local function findgivenfiles(filename,allresults) local bname, result = filebasename(filename), { } local hashes = instance.hashes for k=1,#hashes do @@ -11398,12 +11550,12 @@ function resolvers.findgivenfiles(filename) if blist then if type(blist) == 'string' then result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or "" - if not instance.allresults then break end + if not allresults then break end else for kk=1,#blist do local vv = blist[kk] result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or "" - if not instance.allresults then break end + if not allresults then break end end end end @@ -11411,8 +11563,12 @@ function resolvers.findgivenfiles(filename) return result end +function resolvers.findgivenfiles(filename) + return findgivenfiles(filename,true) +end + function resolvers.findgivenfile(filename) - return (resolvers.findgivenfiles(filename)[1] or "") + return findgivenfiles(filename,false)[1] or "" end local function doit(path,blist,bname,tag,kind,result,allresults) @@ -11438,7 +11594,7 @@ local function doit(path,blist,bname,tag,kind,result,allresults) return done end -function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg +local function findwildcardfiles(filename,allresults) -- todo: remap: and lpeg local result = { } local bname, dname = filebasename(filename), filedirname(filename) local path = gsub(dname,"^*/","") @@ -11452,7 +11608,7 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg name = gsub(name,"-","%%-") path = lower(path) name = lower(name) - local files, allresults, done = instance.files, instance.allresults, false + local files, done = instance.files, false if find(name,"%*") then local hashes = instance.hashes for k=1,#hashes do @@ -11481,8 +11637,12 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg return result end +function resolvers.findwildcardfiles(filename) + return findwildcardfiles(filename,true) +end + function resolvers.findwildcardfile(filename) - return (resolvers.findwildcardfiles(filename)[1] or "") + return findwildcardfiles(filename,false)[1] or "" end -- main user functions @@ -11514,14 +11674,14 @@ local function report(str) end end -function resolvers.dowithfilesandreport(command, files, filetype, mustexist) +function resolvers.dowithfilesandreport(command, files, ...) if files and #files > 0 then if trace_locating then report('') -- ? end for f=1,#files do local file = files[f] - local result = command(file,filetype,mustexist) + local result = command(file,...) if type(result) == 'string' then report(result) else @@ -11543,9 +11703,7 @@ function resolvers.showpath(str) -- output search path for file type NAME end -- resolvers.findfile(filename) --- resolvers.findfile(filename, filetype, mustexist) --- resolvers.findfile(filename, mustexist) --- resolvers.findfile(filename, filetype) +-- resolvers.findfile(filename, f.iletype) function resolvers.registerfile(files, name, path) if files[name] then @@ -11574,7 +11732,7 @@ function resolvers.locateformat(name) local barename = gsub(name,"%.%a+$","") local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or "" if fmtname == "" then - fmtname = resolvers.findfiles(barename..".fmt")[1] or "" + fmtname = resolvers.findfile(barename..".fmt") fmtname = resolvers.cleanpath(fmtname) end if fmtname ~= "" then @@ -14108,7 +14266,7 @@ elseif environment.argument("expand-var") or environment.argument("expand-variab resolvers.load("nofiles") runners.register_arguments(filename) environment.initializearguments(environment.arguments_after) - resolvers.dowithfilesandreport(resolvers.expandvar, environment.files) + resolvers.dowithfilesandreport(resolvers.expansion, environment.files) elseif environment.argument("show-path") or environment.argument("path-value") then @@ -14126,7 +14284,7 @@ elseif environment.argument("var-value") or environment.argument("show-value") t resolvers.load("nofiles") runners.register_arguments(filename) environment.initializearguments(environment.arguments_after) - resolvers.dowithfilesandreport(resolvers.var_value,environment.files) + resolvers.dowithfilesandreport(resolvers.variable,environment.files) elseif environment.argument("format-path") then diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index 6e0c2b74c..c5976018c 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -298,7 +298,6 @@ end patterns.textline = content - local splitters_s, splitters_m = { }, { } local function splitat(separator,single) @@ -320,6 +319,7 @@ end lpeg.splitat = splitat + local cache = { } function lpeg.split(separator,str) @@ -2559,6 +2559,13 @@ end -- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" } +-- for myself: + +function file.strip(name,dir) + local b, a = match(name,"^(.-)" .. dir .. "(.*)$") + return a ~= "" and a or name +end + end -- of closure @@ -4520,7 +4527,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti data = data.data if data then for key, value in next, values do - key = gsub(key,"_",".") + -- key = gsub(key,"_",".") value = is_boolean(value,value) local functions = data[key] if functions then @@ -4547,6 +4554,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti end end end + return true end end end @@ -4782,6 +4790,29 @@ if directives and environment and environment.engineflags.directives then d_enable(environment.engineflags.directives) end +-- here + +if texconfig then + + local function set(k,v) + v = tonumber(v) + if v then + texconfig[k] = v + end + end + + directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end) + directives.register("luatex.hashextra", function(v) set("hash_extra",v) end) + directives.register("luatex.nestsize", function(v) set("nest_size",v) end) + directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end) + directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end) + directives.register("luatex.maxstrings", function(v) set("max_strings",v) end) + directives.register("luatex.paramsize", function(v) set("param_size",v) end) + directives.register("luatex.savesize", function(v) set("save_size",v) end) + directives.register("luatex.stacksize", function(v) set("stack_size",v) end) + +end + end -- of closure @@ -9626,92 +9657,231 @@ if not modules then modules = { } end modules ['data-env'] = { } local allocate = utilities.storage.allocate +local lower, gsub = string.lower, string.gsub + +local fileextname = file.extname local resolvers = resolvers -local formats = allocate() resolvers.formats = formats -local suffixes = allocate() resolvers.suffixes = suffixes -local dangerous = allocate() resolvers.dangerous = dangerous -local suffixmap = allocate() resolvers.suffixmap = suffixmap -local alternatives = allocate() resolvers.alternatives = alternatives - -formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' } -formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' } -formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' } -formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' } -formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' } -formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' } -formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' } -formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' } -formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' } -formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' } -formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' } -formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' } -formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' } -formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' } -formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' } -formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' } -formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' } -formats['icc'] = 'ICCPROFILES' suffixes['icc'] = { 'icc' } -formats['texmfscripts'] = 'TEXMFSCRIPTS' suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -formats['lua'] = 'LUAINPUTS' suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' } -formats['lib'] = 'CLUAINPUTS' suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' } - --- backward compatible ones - -alternatives['map files'] = 'map' -alternatives['enc files'] = 'enc' -alternatives['cid maps'] = 'cid' -- great, why no cid files -alternatives['font feature files'] = 'fea' -- and fea files here -alternatives['opentype fonts'] = 'otf' -alternatives['truetype fonts'] = 'ttf' -alternatives['truetype collections'] = 'ttc' -alternatives['truetype dictionary'] = 'dfont' -alternatives['type1 fonts'] = 'pfb' -alternatives['icc profiles'] = 'icc' +local formats = allocate() resolvers.formats = formats +local suffixes = allocate() resolvers.suffixes = suffixes +local dangerous = allocate() resolvers.dangerous = dangerous +local suffixmap = allocate() resolvers.suffixmap = suffixmap + +local relations = allocate { + core = { + ofm = { + names = { "ofm", "omega font metric", "omega font metrics" }, + variable = 'OFMFONTS', + suffixes = { 'ofm', 'tfm' }, + }, + ovf = { + names = { "ovf", "omega virtual font", "omega virtual fonts" }, + variable = 'OVFFONTS', + suffixes = { 'ovf', 'vf' }, + }, + tfm = { + names = { "tfm", "tex font metric", "tex font metrics" }, + variable = 'TFMFONTS', + suffixes = { 'tfm' }, + }, + vf = { + names = { "vf", "virtual font", "virtual fonts" }, + variable = 'VFFONTS', + suffixes = { 'vf' }, + }, + otf = { + names = { "otf", "opentype", "opentype font", "opentype fonts"}, + variable = 'OPENTYPEFONTS', + suffixes = { 'otf' }, + }, + ttf = { + names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" }, + variable = 'TTFONTS', + suffixes = { 'ttf', 'ttc', 'dfont' }, + }, + afm = { + names = { "afm", "adobe font metric", "adobe font metrics" }, + variable = "AFMFONTS", + suffixes = { "afm" }, + }, + pfb = { + names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" }, + variable = 'T1FONTS', + suffixes = { 'pfb', 'pfa' }, + }, + fea = { + names = { "fea", "font feature", "font features", "font feature file", "font feature files" }, + variable = 'FONTFEATURES', + suffixes = { 'fea' }, + }, + cid = { + names = { "cid", "cid map", "cid maps", "cid file", "cid files" }, + variable = 'FONTCIDMAPS', + suffixes = { 'cid', 'cidmap' }, + }, + fmt = { + names = { "fmt", "format", "tex format" }, + variable = 'TEXFORMATS', + suffixes = { 'fmt' }, + }, + mem = { + names = { 'mem', "metapost format" }, + variable = 'MPMEMS', + suffixes = { 'mem' }, + }, + mp = { + names = { "mp" }, + variable = 'MPINPUTS', + suffixes = { 'mp' }, + }, + tex = { + names = { "tex" }, + variable = 'TEXINPUTS', + suffixes = { 'tex', "mkiv", "mkii" }, + }, + icc = { + names = { "icc", "icc profile", "icc profiles" }, + variable = 'ICCPROFILES', + suffixes = { 'icc' }, + }, + texmfscripts = { + names = { "texmfscript", "texmfscripts", "script", "scripts" }, + variable = 'TEXMFSCRIPTS', + suffixes = { 'rb', 'pl', 'py' }, + }, + lua = { + names = { "lua" }, + variable = 'LUAINPUTS', + suffixes = { 'lua', 'luc', 'tma', 'tmc' }, + }, + lib = { + names = { "lib" }, + variable = 'CLUAINPUTS', + suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' }, + }, + bib = { + names = { 'bib' }, + suffixes = { 'bib' }, + }, + bst = { + names = { 'bst' }, + suffixes = { 'bst' }, + }, + fontconfig = { + names = { 'fontconfig', 'fontconfig file', 'fontconfig files' }, + variable = 'FONTCONFIG_PATH', + }, + }, + obsolete = { + enc = { + names = { "enc", "enc files", "enc file", "encoding files", "encoding file" }, + variable = 'ENCFONTS', + suffixes = { 'enc' }, + }, + map = { + names = { "map", "map files", "map file" }, + variable = 'TEXFONTMAPS', + suffixes = { 'map' }, + }, + lig = { + names = { "lig files", "lig file", "ligature file", "ligature files" }, + variable = 'LIGFONTS', + suffixes = { 'lig' }, + }, + opl = { + names = { "opl" }, + variable = 'OPLFONTS', + suffixes = { 'opl' }, + }, + otp = { + names = { "otp" }, + variable = 'OTPINPUTS', + suffixes = { 'otp' }, + }, + ovp = { + names = { "ovp" }, + variable = 'OVPFONTS', + suffixes = { 'ovp' }, + }, + }, + kpse = { -- subset + base = { + names = { 'base', "metafont format" }, + variable = 'MFBASES', + suffixes = { 'base', 'bas' }, + }, + cmap = { + names = { 'cmap', 'cmap files', 'cmap file' }, + variable = 'CMAPFONTS', + suffixes = { 'cmap' }, + }, + cnf = { + names = { 'cnf' }, + suffixes = { 'cnf' }, + }, + web = { + names = { 'web' }, + suffixes = { 'web', 'ch' } + }, + cweb = { + names = { 'cweb' }, + suffixes = { 'w', 'web', 'ch' }, + }, + gf = { + names = { 'gf' }, + suffixes = { '<resolution>gf' }, + }, + mf = { + names = { 'mf' }, + variable = 'MFINPUTS', + suffixes = { 'mf' }, + }, + mft = { + names = { 'mft' }, + suffixes = { 'mft' }, + }, + pk = { + names = { 'pk' }, + suffixes = { '<resolution>pk' }, + }, + }, +} ---[[ldx-- -<p>If you wondered about some of the previous mappings, how about -the next bunch:</p> ---ldx]]-- +resolvers.relations = relations + +-- formats: maps a format onto a variable + +for category, categories in next, relations do + for name, relation in next, categories do + local rn = relation.names + local rv = relation.variable + local rs = relation.suffixes + if rn and rv then + for i=1,#rn do + local rni = lower(gsub(rn[i]," ","")) + formats[rni] = rv + if rs then + suffixes[rni] = rs + for i=1,#rs do + local rsi = rs[i] + suffixmap[rsi] = rni + end + end + end + end + if rs then + end + end +end + +local function simplified(t,k) + return rawget(t,lower(gsub(k," ",""))) +end --- kpse specific ones (a few omitted) .. we only add them for locating --- files that we don't use anyway - -formats['base'] = 'MFBASES' suffixes['base'] = { 'base', 'bas' } -formats['bib'] = '' suffixes['bib'] = { 'bib' } -formats['bitmap font'] = '' suffixes['bitmap font'] = { } -formats['bst'] = '' suffixes['bst'] = { 'bst' } -formats['cmap files'] = 'CMAPFONTS' suffixes['cmap files'] = { 'cmap' } -formats['cnf'] = '' suffixes['cnf'] = { 'cnf' } -formats['cweb'] = '' suffixes['cweb'] = { 'w', 'web', 'ch' } -formats['dvips config'] = '' suffixes['dvips config'] = { } -formats['gf'] = '' suffixes['gf'] = { '<resolution>gf' } -formats['graphic/figure'] = '' suffixes['graphic/figure'] = { 'eps', 'epsi' } -formats['ist'] = '' suffixes['ist'] = { 'ist' } -formats['lig files'] = 'LIGFONTS' suffixes['lig files'] = { 'lig' } -formats['ls-R'] = '' suffixes['ls-R'] = { } -formats['mem'] = 'MPMEMS' suffixes['mem'] = { 'mem' } -formats['MetaPost support'] = '' suffixes['MetaPost support'] = { } -formats['mf'] = 'MFINPUTS' suffixes['mf'] = { 'mf' } -formats['mft'] = '' suffixes['mft'] = { 'mft' } -formats['misc fonts'] = '' suffixes['misc fonts'] = { } -formats['other text files'] = '' suffixes['other text files'] = { } -formats['other binary files'] = '' suffixes['other binary files'] = { } -formats['pdftex config'] = 'PDFTEXCONFIG' suffixes['pdftex config'] = { } -formats['pk'] = '' suffixes['pk'] = { '<resolution>pk' } -formats['PostScript header'] = 'TEXPSHEADERS' suffixes['PostScript header'] = { 'pro' } -formats['sfd'] = 'SFDFONTS' suffixes['sfd'] = { 'sfd' } -formats['TeX system documentation'] = '' suffixes['TeX system documentation'] = { } -formats['TeX system sources'] = '' suffixes['TeX system sources'] = { } -formats['Troff fonts'] = '' suffixes['Troff fonts'] = { } -formats['type42 fonts'] = 'T42FONTS' suffixes['type42 fonts'] = { } -formats['web'] = '' suffixes['web'] = { 'web', 'ch' } -formats['web2c files'] = 'WEB2C' suffixes['web2c files'] = { } -formats['fontconfig files'] = 'FONTCONFIG_PATH' suffixes['fontconfig files'] = { } -- not unique - -alternatives['subfont definition files'] = 'sfd' +setmetatablekey(formats, "__index", simplified) +setmetatablekey(suffixes, "__index", simplified) +setmetatablekey(suffixmap, "__index", simplified) -- A few accessors, mostly for command line tool. @@ -9720,31 +9890,12 @@ function resolvers.suffixofformat(str) return s and s[1] or "" end -function resolvers.suffixesofformat(str) +function resolvers.suffixofformat(str) return suffixes[str] or { } end --- As we don't register additional suffixes anyway, we can as well --- freeze the reverse map here. - -for name, suffixlist in next, suffixes do - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end -end - -local mt = getmetatable(suffixes) - -mt.__newindex = function(suffixes,name,suffixlist) - rawset(suffixes,name,suffixlist) - suffixes[name] = suffixlist - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end -end - for name, format in next, formats do - dangerous[name] = true + dangerous[name] = true -- still needed ? end -- because vf searching is somewhat dangerous, we want to prevent @@ -9757,15 +9908,15 @@ dangerous.tex = nil -- more helpers function resolvers.formatofvariable(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.formatofsuffix(str) -- of file - return suffixmap[file.extname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) + return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) end function resolvers.variableofformat(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.variableofformatorsuffix(str) @@ -9773,10 +9924,6 @@ function resolvers.variableofformatorsuffix(str) if v then return v end - v = formats[alternatives[str]] - if v then - return v - end v = suffixmap[fileextname(str)] if v then return formats[v] @@ -10281,7 +10428,6 @@ local formats = resolvers.formats local suffixes = resolvers.suffixes local dangerous = resolvers.dangerous local suffixmap = resolvers.suffixmap -local alternatives = resolvers.alternatives resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky @@ -10293,7 +10439,6 @@ function resolvers.newinstance() local newinstance = { progname = 'context', engine = 'luatex', - format = '', environment = allocate(), variables = allocate(), expansions = allocate(), @@ -10313,7 +10458,6 @@ function resolvers.newinstance() renewcache = false, loaderror = false, savelists = true, - allresults = false, pattern = nil, -- lists force_suffixes = true, } @@ -10400,7 +10544,8 @@ end local function entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - local result = entries[name..'.'..instance.progname] or entries[name] + -- local result = entries[name..'.'..instance.progname] or entries[name] + local result = entries[instance.progname .. '.' .. name] or entries[name] if result then return result else @@ -10418,7 +10563,8 @@ end local function is_entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + -- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + return (entries[instance.progname .. '.' .. name] or entries[name]) ~= nil else return false end @@ -10479,19 +10625,28 @@ local function load_configuration_files() end -- flattening is easier to deal with as we need to collapse local t = { } - for k, v in next, data do -- v = progname + for k, v in next, data do -- k = progname or setter or variables if v ~= unset_variable then local kind = type(v) if kind == "string" then + -- still supported, but preferably use the variables subtable t[k] = v elseif kind == "table" then - -- this operates on the table directly - initializesetter(filename,k,v) - -- this doesn't (maybe metatables some day) - for kk, vv in next, v do -- vv = variable - if vv ~= unset_variable then - if type(vv) == "string" then - t[kk.."."..k] = vv + if initializesetter(filename,k,v) then + -- directives, experiments, trackers, ... + else + for kk, vv in next, v do -- vv = variable + if vv ~= unset_variable then + if type(vv) == "string" then + -- t[kk.."."..k] = vv + if k == "variables" then + -- special table, shared variables can be grouped + t[kk] = vv + else + -- category.variable (progname) + t[k .. "." .. kk] = vv + end + end end end end @@ -10761,12 +10916,12 @@ function resolvers.expandvariables() if engine ~= "" then environment['engine'] = engine end if progname ~= "" then environment['progname'] = progname end for k,v in next, environment do - local a, b = match(k,"^(%a+)%_(.*)%s*$") - if a and b then - expansions[a..'.'..b] = v - else + -- local a, b = match(k,"^(%a+)%_(.*)%s*$") -- too many vars have an _ in the name + -- if a and b then -- so let's forget about it; it was a + -- expansions[a..'.'..b] = v -- hack anyway for linux and not needed + -- else -- anymore as we now have directives expansions[k] = v - end + -- end end for k,v in next, environment do -- move environment to expansions (variables are already in there) if not expansions[k] then expansions[k] = v end @@ -10820,7 +10975,7 @@ function resolvers.unexpandedpathlist(str) end function resolvers.unexpandedpath(str) - return file.joinpath(resolvers.unexpandedpath_list(str)) + return file.joinpath(resolvers.unexpandedpathlist(str)) end local done = { } @@ -11081,13 +11236,14 @@ local function can_be_dir(name) -- can become local return fakepaths[name] == 1 end -local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc) - local result = collected or { } +local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc) + local result = { } local stamp = nil + askedformat = askedformat or "" filename = collapsepath(filename) -- speed up / beware: format problem - if instance.remember then - stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format + if instance.remember and not allresults then + stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. askedformat if instance.found[stamp] then if trace_locating then report_resolvers("remembering file '%s'",filename) @@ -11096,12 +11252,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan return instance.found[stamp] end end - if not dangerous[instance.format or "?"] then + if not dangerous[askedformat] then if resolvers.isreadable.file(filename) then if trace_detail then report_resolvers("file '%s' found directly",filename) end - instance.found[stamp] = { filename } + if stamp then + instance.found[stamp] = { filename } + end return { filename } end end @@ -11109,7 +11267,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if trace_locating then report_resolvers("checking wildcard '%s'", filename) end - result = resolvers.findwildcardfiles(filename) + result = resolvers.findwildcardfiles(filename) -- we can use th elocal elseif file.is_qualified_path(filename) then if resolvers.isreadable.file(filename) then if trace_locating then @@ -11119,7 +11277,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else local forcedname, ok, suffix = "", false, fileextname(filename) if suffix == "" then -- why - local format_suffixes = instance.format == "" and resolvers.defaultsuffixes or suffixes[instance.format] + local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do local s = format_suffixes[i] @@ -11139,21 +11297,22 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan -- matching last part of the name local basename = filebasename(filename) local pattern = gsub(filename .. "$","([%.%-])","%%%1") - local savedformat = instance.format + -- messy .. to be sorted out + local savedformat = askedformat local format = savedformat or "" if format == "" then - instance.format = resolvers.formatofsuffix(suffix) + askedformat = resolvers.formatofsuffix(suffix) end if not format then - instance.format = "othertextfiles" -- kind of everything, maybe texinput is better + askedformat = "othertextfiles" -- kind of everything, maybe texinput is better end -- if basename ~= filename then - local resolved = collect_instance_files(basename) + local resolved = collect_instance_files(basename,askedformat,allresults) if #result == 0 then local lowered = lower(basename) if filename ~= lowered then - resolved = collect_instance_files(lowered) + resolved = collect_instance_files(lowered,askedformat,allresults) end end resolvers.format = savedformat @@ -11192,7 +11351,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else wantedfiles[#wantedfiles+1] = filename end - if instance.format == "" then + if askedformat == "" then if ext == "" or not suffixmap[ext] then local defaultsuffixes = resolvers.defaultsuffixes for i=1,#defaultsuffixes do @@ -11211,14 +11370,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end else if ext == "" or not suffixmap[ext] then - local format_suffixes = suffixes[instance.format] + local format_suffixes = suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i] end end end - filetype = instance.format + filetype = askedformat if trace_locating then report_resolvers("using given filetype '%s'",filetype) end @@ -11289,7 +11448,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan --- todo, test for readable result[#result+1] = fl[3] done = true - if instance.allresults then + if allresults then if trace_detail then report_resolvers("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d) end @@ -11320,7 +11479,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end result[#result+1] = fname done = true - if not instance.allresults then break end + if not allresults then break end end end else @@ -11332,7 +11491,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if not done and doscan then -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF end - if done and not instance.allresults then break end + if done and not allresults then break end end end end @@ -11341,7 +11500,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan result[k] = rk resolvers.registerintrees(rk) -- for tracing used files end - if instance.remember then + if stamp then instance.found[stamp] = result end return result @@ -11350,37 +11509,30 @@ end resolvers.concatinators.tex = filejoin resolvers.concatinators.file = resolvers.concatinators.tex -function resolvers.findfiles(filename,filetype,mustexist) - if type(mustexist) == boolean then - -- all set - elseif type(filetype) == 'boolean' then - filetype, mustexist = nil, false - elseif type(filetype) ~= 'string' then - filetype, mustexist = nil, false - end - instance.format = filetype or '' - local result = collect_instance_files(filename) +local function findfiles(filename,filetype,allresults) + local result = collect_instance_files(filename,filetype or "",allresults) if #result == 0 then local lowered = lower(filename) if filename ~= lowered then - return collect_instance_files(lowered) + return collect_instance_files(lowered,filetype or "",allresults) end end - instance.format = '' return result end -function resolvers.findfile(filename,filetype,mustexist) - return (resolvers.findfiles(filename,filetype,mustexist)[1] or "") +function resolvers.findfiles(filename,filetype) + return findfiles(filename,filetype,true) +end + +function resolvers.findfile(filename,filetype) + return findfiles(filename,filetype,false)[1] or "" end function resolvers.findpath(filename,filetype) - local path = resolvers.findfiles(filename,filetype)[1] or "" - -- todo return current path - return file.dirname(path) + return file.dirname(findfiles(filename,filetype,false)[1] or "") end -function resolvers.findgivenfiles(filename) +local function findgivenfiles(filename,allresults) local bname, result = filebasename(filename), { } local hashes = instance.hashes for k=1,#hashes do @@ -11398,12 +11550,12 @@ function resolvers.findgivenfiles(filename) if blist then if type(blist) == 'string' then result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or "" - if not instance.allresults then break end + if not allresults then break end else for kk=1,#blist do local vv = blist[kk] result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or "" - if not instance.allresults then break end + if not allresults then break end end end end @@ -11411,8 +11563,12 @@ function resolvers.findgivenfiles(filename) return result end +function resolvers.findgivenfiles(filename) + return findgivenfiles(filename,true) +end + function resolvers.findgivenfile(filename) - return (resolvers.findgivenfiles(filename)[1] or "") + return findgivenfiles(filename,false)[1] or "" end local function doit(path,blist,bname,tag,kind,result,allresults) @@ -11438,7 +11594,7 @@ local function doit(path,blist,bname,tag,kind,result,allresults) return done end -function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg +local function findwildcardfiles(filename,allresults) -- todo: remap: and lpeg local result = { } local bname, dname = filebasename(filename), filedirname(filename) local path = gsub(dname,"^*/","") @@ -11452,7 +11608,7 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg name = gsub(name,"-","%%-") path = lower(path) name = lower(name) - local files, allresults, done = instance.files, instance.allresults, false + local files, done = instance.files, false if find(name,"%*") then local hashes = instance.hashes for k=1,#hashes do @@ -11481,8 +11637,12 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg return result end +function resolvers.findwildcardfiles(filename) + return findwildcardfiles(filename,true) +end + function resolvers.findwildcardfile(filename) - return (resolvers.findwildcardfiles(filename)[1] or "") + return findwildcardfiles(filename,false)[1] or "" end -- main user functions @@ -11514,14 +11674,14 @@ local function report(str) end end -function resolvers.dowithfilesandreport(command, files, filetype, mustexist) +function resolvers.dowithfilesandreport(command, files, ...) if files and #files > 0 then if trace_locating then report('') -- ? end for f=1,#files do local file = files[f] - local result = command(file,filetype,mustexist) + local result = command(file,...) if type(result) == 'string' then report(result) else @@ -11543,9 +11703,7 @@ function resolvers.showpath(str) -- output search path for file type NAME end -- resolvers.findfile(filename) --- resolvers.findfile(filename, filetype, mustexist) --- resolvers.findfile(filename, mustexist) --- resolvers.findfile(filename, filetype) +-- resolvers.findfile(filename, f.iletype) function resolvers.registerfile(files, name, path) if files[name] then @@ -11574,7 +11732,7 @@ function resolvers.locateformat(name) local barename = gsub(name,"%.%a+$","") local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or "" if fmtname == "" then - fmtname = resolvers.findfiles(barename..".fmt")[1] or "" + fmtname = resolvers.findfile(barename..".fmt") fmtname = resolvers.cleanpath(fmtname) end if fmtname ~= "" then @@ -14108,7 +14266,7 @@ elseif environment.argument("expand-var") or environment.argument("expand-variab resolvers.load("nofiles") runners.register_arguments(filename) environment.initializearguments(environment.arguments_after) - resolvers.dowithfilesandreport(resolvers.expandvar, environment.files) + resolvers.dowithfilesandreport(resolvers.expansion, environment.files) elseif environment.argument("show-path") or environment.argument("path-value") then @@ -14126,7 +14284,7 @@ elseif environment.argument("var-value") or environment.argument("show-value") t resolvers.load("nofiles") runners.register_arguments(filename) environment.initializearguments(environment.arguments_after) - resolvers.dowithfilesandreport(resolvers.var_value,environment.files) + resolvers.dowithfilesandreport(resolvers.variable,environment.files) elseif environment.argument("format-path") then diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index 6e0c2b74c..c5976018c 100644 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -298,7 +298,6 @@ end patterns.textline = content - local splitters_s, splitters_m = { }, { } local function splitat(separator,single) @@ -320,6 +319,7 @@ end lpeg.splitat = splitat + local cache = { } function lpeg.split(separator,str) @@ -2559,6 +2559,13 @@ end -- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" } +-- for myself: + +function file.strip(name,dir) + local b, a = match(name,"^(.-)" .. dir .. "(.*)$") + return a ~= "" and a or name +end + end -- of closure @@ -4520,7 +4527,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti data = data.data if data then for key, value in next, values do - key = gsub(key,"_",".") + -- key = gsub(key,"_",".") value = is_boolean(value,value) local functions = data[key] if functions then @@ -4547,6 +4554,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti end end end + return true end end end @@ -4782,6 +4790,29 @@ if directives and environment and environment.engineflags.directives then d_enable(environment.engineflags.directives) end +-- here + +if texconfig then + + local function set(k,v) + v = tonumber(v) + if v then + texconfig[k] = v + end + end + + directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end) + directives.register("luatex.hashextra", function(v) set("hash_extra",v) end) + directives.register("luatex.nestsize", function(v) set("nest_size",v) end) + directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end) + directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end) + directives.register("luatex.maxstrings", function(v) set("max_strings",v) end) + directives.register("luatex.paramsize", function(v) set("param_size",v) end) + directives.register("luatex.savesize", function(v) set("save_size",v) end) + directives.register("luatex.stacksize", function(v) set("stack_size",v) end) + +end + end -- of closure @@ -9626,92 +9657,231 @@ if not modules then modules = { } end modules ['data-env'] = { } local allocate = utilities.storage.allocate +local lower, gsub = string.lower, string.gsub + +local fileextname = file.extname local resolvers = resolvers -local formats = allocate() resolvers.formats = formats -local suffixes = allocate() resolvers.suffixes = suffixes -local dangerous = allocate() resolvers.dangerous = dangerous -local suffixmap = allocate() resolvers.suffixmap = suffixmap -local alternatives = allocate() resolvers.alternatives = alternatives - -formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' } -formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' } -formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' } -formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' } -formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' } -formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' } -formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' } -formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' } -formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' } -formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' } -formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' } -formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' } -formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' } -formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' } -formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' } -formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' } -formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' } -formats['icc'] = 'ICCPROFILES' suffixes['icc'] = { 'icc' } -formats['texmfscripts'] = 'TEXMFSCRIPTS' suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -formats['lua'] = 'LUAINPUTS' suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' } -formats['lib'] = 'CLUAINPUTS' suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' } - --- backward compatible ones - -alternatives['map files'] = 'map' -alternatives['enc files'] = 'enc' -alternatives['cid maps'] = 'cid' -- great, why no cid files -alternatives['font feature files'] = 'fea' -- and fea files here -alternatives['opentype fonts'] = 'otf' -alternatives['truetype fonts'] = 'ttf' -alternatives['truetype collections'] = 'ttc' -alternatives['truetype dictionary'] = 'dfont' -alternatives['type1 fonts'] = 'pfb' -alternatives['icc profiles'] = 'icc' +local formats = allocate() resolvers.formats = formats +local suffixes = allocate() resolvers.suffixes = suffixes +local dangerous = allocate() resolvers.dangerous = dangerous +local suffixmap = allocate() resolvers.suffixmap = suffixmap + +local relations = allocate { + core = { + ofm = { + names = { "ofm", "omega font metric", "omega font metrics" }, + variable = 'OFMFONTS', + suffixes = { 'ofm', 'tfm' }, + }, + ovf = { + names = { "ovf", "omega virtual font", "omega virtual fonts" }, + variable = 'OVFFONTS', + suffixes = { 'ovf', 'vf' }, + }, + tfm = { + names = { "tfm", "tex font metric", "tex font metrics" }, + variable = 'TFMFONTS', + suffixes = { 'tfm' }, + }, + vf = { + names = { "vf", "virtual font", "virtual fonts" }, + variable = 'VFFONTS', + suffixes = { 'vf' }, + }, + otf = { + names = { "otf", "opentype", "opentype font", "opentype fonts"}, + variable = 'OPENTYPEFONTS', + suffixes = { 'otf' }, + }, + ttf = { + names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" }, + variable = 'TTFONTS', + suffixes = { 'ttf', 'ttc', 'dfont' }, + }, + afm = { + names = { "afm", "adobe font metric", "adobe font metrics" }, + variable = "AFMFONTS", + suffixes = { "afm" }, + }, + pfb = { + names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" }, + variable = 'T1FONTS', + suffixes = { 'pfb', 'pfa' }, + }, + fea = { + names = { "fea", "font feature", "font features", "font feature file", "font feature files" }, + variable = 'FONTFEATURES', + suffixes = { 'fea' }, + }, + cid = { + names = { "cid", "cid map", "cid maps", "cid file", "cid files" }, + variable = 'FONTCIDMAPS', + suffixes = { 'cid', 'cidmap' }, + }, + fmt = { + names = { "fmt", "format", "tex format" }, + variable = 'TEXFORMATS', + suffixes = { 'fmt' }, + }, + mem = { + names = { 'mem', "metapost format" }, + variable = 'MPMEMS', + suffixes = { 'mem' }, + }, + mp = { + names = { "mp" }, + variable = 'MPINPUTS', + suffixes = { 'mp' }, + }, + tex = { + names = { "tex" }, + variable = 'TEXINPUTS', + suffixes = { 'tex', "mkiv", "mkii" }, + }, + icc = { + names = { "icc", "icc profile", "icc profiles" }, + variable = 'ICCPROFILES', + suffixes = { 'icc' }, + }, + texmfscripts = { + names = { "texmfscript", "texmfscripts", "script", "scripts" }, + variable = 'TEXMFSCRIPTS', + suffixes = { 'rb', 'pl', 'py' }, + }, + lua = { + names = { "lua" }, + variable = 'LUAINPUTS', + suffixes = { 'lua', 'luc', 'tma', 'tmc' }, + }, + lib = { + names = { "lib" }, + variable = 'CLUAINPUTS', + suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' }, + }, + bib = { + names = { 'bib' }, + suffixes = { 'bib' }, + }, + bst = { + names = { 'bst' }, + suffixes = { 'bst' }, + }, + fontconfig = { + names = { 'fontconfig', 'fontconfig file', 'fontconfig files' }, + variable = 'FONTCONFIG_PATH', + }, + }, + obsolete = { + enc = { + names = { "enc", "enc files", "enc file", "encoding files", "encoding file" }, + variable = 'ENCFONTS', + suffixes = { 'enc' }, + }, + map = { + names = { "map", "map files", "map file" }, + variable = 'TEXFONTMAPS', + suffixes = { 'map' }, + }, + lig = { + names = { "lig files", "lig file", "ligature file", "ligature files" }, + variable = 'LIGFONTS', + suffixes = { 'lig' }, + }, + opl = { + names = { "opl" }, + variable = 'OPLFONTS', + suffixes = { 'opl' }, + }, + otp = { + names = { "otp" }, + variable = 'OTPINPUTS', + suffixes = { 'otp' }, + }, + ovp = { + names = { "ovp" }, + variable = 'OVPFONTS', + suffixes = { 'ovp' }, + }, + }, + kpse = { -- subset + base = { + names = { 'base', "metafont format" }, + variable = 'MFBASES', + suffixes = { 'base', 'bas' }, + }, + cmap = { + names = { 'cmap', 'cmap files', 'cmap file' }, + variable = 'CMAPFONTS', + suffixes = { 'cmap' }, + }, + cnf = { + names = { 'cnf' }, + suffixes = { 'cnf' }, + }, + web = { + names = { 'web' }, + suffixes = { 'web', 'ch' } + }, + cweb = { + names = { 'cweb' }, + suffixes = { 'w', 'web', 'ch' }, + }, + gf = { + names = { 'gf' }, + suffixes = { '<resolution>gf' }, + }, + mf = { + names = { 'mf' }, + variable = 'MFINPUTS', + suffixes = { 'mf' }, + }, + mft = { + names = { 'mft' }, + suffixes = { 'mft' }, + }, + pk = { + names = { 'pk' }, + suffixes = { '<resolution>pk' }, + }, + }, +} ---[[ldx-- -<p>If you wondered about some of the previous mappings, how about -the next bunch:</p> ---ldx]]-- +resolvers.relations = relations + +-- formats: maps a format onto a variable + +for category, categories in next, relations do + for name, relation in next, categories do + local rn = relation.names + local rv = relation.variable + local rs = relation.suffixes + if rn and rv then + for i=1,#rn do + local rni = lower(gsub(rn[i]," ","")) + formats[rni] = rv + if rs then + suffixes[rni] = rs + for i=1,#rs do + local rsi = rs[i] + suffixmap[rsi] = rni + end + end + end + end + if rs then + end + end +end + +local function simplified(t,k) + return rawget(t,lower(gsub(k," ",""))) +end --- kpse specific ones (a few omitted) .. we only add them for locating --- files that we don't use anyway - -formats['base'] = 'MFBASES' suffixes['base'] = { 'base', 'bas' } -formats['bib'] = '' suffixes['bib'] = { 'bib' } -formats['bitmap font'] = '' suffixes['bitmap font'] = { } -formats['bst'] = '' suffixes['bst'] = { 'bst' } -formats['cmap files'] = 'CMAPFONTS' suffixes['cmap files'] = { 'cmap' } -formats['cnf'] = '' suffixes['cnf'] = { 'cnf' } -formats['cweb'] = '' suffixes['cweb'] = { 'w', 'web', 'ch' } -formats['dvips config'] = '' suffixes['dvips config'] = { } -formats['gf'] = '' suffixes['gf'] = { '<resolution>gf' } -formats['graphic/figure'] = '' suffixes['graphic/figure'] = { 'eps', 'epsi' } -formats['ist'] = '' suffixes['ist'] = { 'ist' } -formats['lig files'] = 'LIGFONTS' suffixes['lig files'] = { 'lig' } -formats['ls-R'] = '' suffixes['ls-R'] = { } -formats['mem'] = 'MPMEMS' suffixes['mem'] = { 'mem' } -formats['MetaPost support'] = '' suffixes['MetaPost support'] = { } -formats['mf'] = 'MFINPUTS' suffixes['mf'] = { 'mf' } -formats['mft'] = '' suffixes['mft'] = { 'mft' } -formats['misc fonts'] = '' suffixes['misc fonts'] = { } -formats['other text files'] = '' suffixes['other text files'] = { } -formats['other binary files'] = '' suffixes['other binary files'] = { } -formats['pdftex config'] = 'PDFTEXCONFIG' suffixes['pdftex config'] = { } -formats['pk'] = '' suffixes['pk'] = { '<resolution>pk' } -formats['PostScript header'] = 'TEXPSHEADERS' suffixes['PostScript header'] = { 'pro' } -formats['sfd'] = 'SFDFONTS' suffixes['sfd'] = { 'sfd' } -formats['TeX system documentation'] = '' suffixes['TeX system documentation'] = { } -formats['TeX system sources'] = '' suffixes['TeX system sources'] = { } -formats['Troff fonts'] = '' suffixes['Troff fonts'] = { } -formats['type42 fonts'] = 'T42FONTS' suffixes['type42 fonts'] = { } -formats['web'] = '' suffixes['web'] = { 'web', 'ch' } -formats['web2c files'] = 'WEB2C' suffixes['web2c files'] = { } -formats['fontconfig files'] = 'FONTCONFIG_PATH' suffixes['fontconfig files'] = { } -- not unique - -alternatives['subfont definition files'] = 'sfd' +setmetatablekey(formats, "__index", simplified) +setmetatablekey(suffixes, "__index", simplified) +setmetatablekey(suffixmap, "__index", simplified) -- A few accessors, mostly for command line tool. @@ -9720,31 +9890,12 @@ function resolvers.suffixofformat(str) return s and s[1] or "" end -function resolvers.suffixesofformat(str) +function resolvers.suffixofformat(str) return suffixes[str] or { } end --- As we don't register additional suffixes anyway, we can as well --- freeze the reverse map here. - -for name, suffixlist in next, suffixes do - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end -end - -local mt = getmetatable(suffixes) - -mt.__newindex = function(suffixes,name,suffixlist) - rawset(suffixes,name,suffixlist) - suffixes[name] = suffixlist - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end -end - for name, format in next, formats do - dangerous[name] = true + dangerous[name] = true -- still needed ? end -- because vf searching is somewhat dangerous, we want to prevent @@ -9757,15 +9908,15 @@ dangerous.tex = nil -- more helpers function resolvers.formatofvariable(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.formatofsuffix(str) -- of file - return suffixmap[file.extname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) + return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) end function resolvers.variableofformat(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.variableofformatorsuffix(str) @@ -9773,10 +9924,6 @@ function resolvers.variableofformatorsuffix(str) if v then return v end - v = formats[alternatives[str]] - if v then - return v - end v = suffixmap[fileextname(str)] if v then return formats[v] @@ -10281,7 +10428,6 @@ local formats = resolvers.formats local suffixes = resolvers.suffixes local dangerous = resolvers.dangerous local suffixmap = resolvers.suffixmap -local alternatives = resolvers.alternatives resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky @@ -10293,7 +10439,6 @@ function resolvers.newinstance() local newinstance = { progname = 'context', engine = 'luatex', - format = '', environment = allocate(), variables = allocate(), expansions = allocate(), @@ -10313,7 +10458,6 @@ function resolvers.newinstance() renewcache = false, loaderror = false, savelists = true, - allresults = false, pattern = nil, -- lists force_suffixes = true, } @@ -10400,7 +10544,8 @@ end local function entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - local result = entries[name..'.'..instance.progname] or entries[name] + -- local result = entries[name..'.'..instance.progname] or entries[name] + local result = entries[instance.progname .. '.' .. name] or entries[name] if result then return result else @@ -10418,7 +10563,8 @@ end local function is_entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + -- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + return (entries[instance.progname .. '.' .. name] or entries[name]) ~= nil else return false end @@ -10479,19 +10625,28 @@ local function load_configuration_files() end -- flattening is easier to deal with as we need to collapse local t = { } - for k, v in next, data do -- v = progname + for k, v in next, data do -- k = progname or setter or variables if v ~= unset_variable then local kind = type(v) if kind == "string" then + -- still supported, but preferably use the variables subtable t[k] = v elseif kind == "table" then - -- this operates on the table directly - initializesetter(filename,k,v) - -- this doesn't (maybe metatables some day) - for kk, vv in next, v do -- vv = variable - if vv ~= unset_variable then - if type(vv) == "string" then - t[kk.."."..k] = vv + if initializesetter(filename,k,v) then + -- directives, experiments, trackers, ... + else + for kk, vv in next, v do -- vv = variable + if vv ~= unset_variable then + if type(vv) == "string" then + -- t[kk.."."..k] = vv + if k == "variables" then + -- special table, shared variables can be grouped + t[kk] = vv + else + -- category.variable (progname) + t[k .. "." .. kk] = vv + end + end end end end @@ -10761,12 +10916,12 @@ function resolvers.expandvariables() if engine ~= "" then environment['engine'] = engine end if progname ~= "" then environment['progname'] = progname end for k,v in next, environment do - local a, b = match(k,"^(%a+)%_(.*)%s*$") - if a and b then - expansions[a..'.'..b] = v - else + -- local a, b = match(k,"^(%a+)%_(.*)%s*$") -- too many vars have an _ in the name + -- if a and b then -- so let's forget about it; it was a + -- expansions[a..'.'..b] = v -- hack anyway for linux and not needed + -- else -- anymore as we now have directives expansions[k] = v - end + -- end end for k,v in next, environment do -- move environment to expansions (variables are already in there) if not expansions[k] then expansions[k] = v end @@ -10820,7 +10975,7 @@ function resolvers.unexpandedpathlist(str) end function resolvers.unexpandedpath(str) - return file.joinpath(resolvers.unexpandedpath_list(str)) + return file.joinpath(resolvers.unexpandedpathlist(str)) end local done = { } @@ -11081,13 +11236,14 @@ local function can_be_dir(name) -- can become local return fakepaths[name] == 1 end -local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc) - local result = collected or { } +local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc) + local result = { } local stamp = nil + askedformat = askedformat or "" filename = collapsepath(filename) -- speed up / beware: format problem - if instance.remember then - stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format + if instance.remember and not allresults then + stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. askedformat if instance.found[stamp] then if trace_locating then report_resolvers("remembering file '%s'",filename) @@ -11096,12 +11252,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan return instance.found[stamp] end end - if not dangerous[instance.format or "?"] then + if not dangerous[askedformat] then if resolvers.isreadable.file(filename) then if trace_detail then report_resolvers("file '%s' found directly",filename) end - instance.found[stamp] = { filename } + if stamp then + instance.found[stamp] = { filename } + end return { filename } end end @@ -11109,7 +11267,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if trace_locating then report_resolvers("checking wildcard '%s'", filename) end - result = resolvers.findwildcardfiles(filename) + result = resolvers.findwildcardfiles(filename) -- we can use th elocal elseif file.is_qualified_path(filename) then if resolvers.isreadable.file(filename) then if trace_locating then @@ -11119,7 +11277,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else local forcedname, ok, suffix = "", false, fileextname(filename) if suffix == "" then -- why - local format_suffixes = instance.format == "" and resolvers.defaultsuffixes or suffixes[instance.format] + local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do local s = format_suffixes[i] @@ -11139,21 +11297,22 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan -- matching last part of the name local basename = filebasename(filename) local pattern = gsub(filename .. "$","([%.%-])","%%%1") - local savedformat = instance.format + -- messy .. to be sorted out + local savedformat = askedformat local format = savedformat or "" if format == "" then - instance.format = resolvers.formatofsuffix(suffix) + askedformat = resolvers.formatofsuffix(suffix) end if not format then - instance.format = "othertextfiles" -- kind of everything, maybe texinput is better + askedformat = "othertextfiles" -- kind of everything, maybe texinput is better end -- if basename ~= filename then - local resolved = collect_instance_files(basename) + local resolved = collect_instance_files(basename,askedformat,allresults) if #result == 0 then local lowered = lower(basename) if filename ~= lowered then - resolved = collect_instance_files(lowered) + resolved = collect_instance_files(lowered,askedformat,allresults) end end resolvers.format = savedformat @@ -11192,7 +11351,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else wantedfiles[#wantedfiles+1] = filename end - if instance.format == "" then + if askedformat == "" then if ext == "" or not suffixmap[ext] then local defaultsuffixes = resolvers.defaultsuffixes for i=1,#defaultsuffixes do @@ -11211,14 +11370,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end else if ext == "" or not suffixmap[ext] then - local format_suffixes = suffixes[instance.format] + local format_suffixes = suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i] end end end - filetype = instance.format + filetype = askedformat if trace_locating then report_resolvers("using given filetype '%s'",filetype) end @@ -11289,7 +11448,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan --- todo, test for readable result[#result+1] = fl[3] done = true - if instance.allresults then + if allresults then if trace_detail then report_resolvers("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d) end @@ -11320,7 +11479,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end result[#result+1] = fname done = true - if not instance.allresults then break end + if not allresults then break end end end else @@ -11332,7 +11491,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if not done and doscan then -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF end - if done and not instance.allresults then break end + if done and not allresults then break end end end end @@ -11341,7 +11500,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan result[k] = rk resolvers.registerintrees(rk) -- for tracing used files end - if instance.remember then + if stamp then instance.found[stamp] = result end return result @@ -11350,37 +11509,30 @@ end resolvers.concatinators.tex = filejoin resolvers.concatinators.file = resolvers.concatinators.tex -function resolvers.findfiles(filename,filetype,mustexist) - if type(mustexist) == boolean then - -- all set - elseif type(filetype) == 'boolean' then - filetype, mustexist = nil, false - elseif type(filetype) ~= 'string' then - filetype, mustexist = nil, false - end - instance.format = filetype or '' - local result = collect_instance_files(filename) +local function findfiles(filename,filetype,allresults) + local result = collect_instance_files(filename,filetype or "",allresults) if #result == 0 then local lowered = lower(filename) if filename ~= lowered then - return collect_instance_files(lowered) + return collect_instance_files(lowered,filetype or "",allresults) end end - instance.format = '' return result end -function resolvers.findfile(filename,filetype,mustexist) - return (resolvers.findfiles(filename,filetype,mustexist)[1] or "") +function resolvers.findfiles(filename,filetype) + return findfiles(filename,filetype,true) +end + +function resolvers.findfile(filename,filetype) + return findfiles(filename,filetype,false)[1] or "" end function resolvers.findpath(filename,filetype) - local path = resolvers.findfiles(filename,filetype)[1] or "" - -- todo return current path - return file.dirname(path) + return file.dirname(findfiles(filename,filetype,false)[1] or "") end -function resolvers.findgivenfiles(filename) +local function findgivenfiles(filename,allresults) local bname, result = filebasename(filename), { } local hashes = instance.hashes for k=1,#hashes do @@ -11398,12 +11550,12 @@ function resolvers.findgivenfiles(filename) if blist then if type(blist) == 'string' then result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or "" - if not instance.allresults then break end + if not allresults then break end else for kk=1,#blist do local vv = blist[kk] result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or "" - if not instance.allresults then break end + if not allresults then break end end end end @@ -11411,8 +11563,12 @@ function resolvers.findgivenfiles(filename) return result end +function resolvers.findgivenfiles(filename) + return findgivenfiles(filename,true) +end + function resolvers.findgivenfile(filename) - return (resolvers.findgivenfiles(filename)[1] or "") + return findgivenfiles(filename,false)[1] or "" end local function doit(path,blist,bname,tag,kind,result,allresults) @@ -11438,7 +11594,7 @@ local function doit(path,blist,bname,tag,kind,result,allresults) return done end -function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg +local function findwildcardfiles(filename,allresults) -- todo: remap: and lpeg local result = { } local bname, dname = filebasename(filename), filedirname(filename) local path = gsub(dname,"^*/","") @@ -11452,7 +11608,7 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg name = gsub(name,"-","%%-") path = lower(path) name = lower(name) - local files, allresults, done = instance.files, instance.allresults, false + local files, done = instance.files, false if find(name,"%*") then local hashes = instance.hashes for k=1,#hashes do @@ -11481,8 +11637,12 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg return result end +function resolvers.findwildcardfiles(filename) + return findwildcardfiles(filename,true) +end + function resolvers.findwildcardfile(filename) - return (resolvers.findwildcardfiles(filename)[1] or "") + return findwildcardfiles(filename,false)[1] or "" end -- main user functions @@ -11514,14 +11674,14 @@ local function report(str) end end -function resolvers.dowithfilesandreport(command, files, filetype, mustexist) +function resolvers.dowithfilesandreport(command, files, ...) if files and #files > 0 then if trace_locating then report('') -- ? end for f=1,#files do local file = files[f] - local result = command(file,filetype,mustexist) + local result = command(file,...) if type(result) == 'string' then report(result) else @@ -11543,9 +11703,7 @@ function resolvers.showpath(str) -- output search path for file type NAME end -- resolvers.findfile(filename) --- resolvers.findfile(filename, filetype, mustexist) --- resolvers.findfile(filename, mustexist) --- resolvers.findfile(filename, filetype) +-- resolvers.findfile(filename, f.iletype) function resolvers.registerfile(files, name, path) if files[name] then @@ -11574,7 +11732,7 @@ function resolvers.locateformat(name) local barename = gsub(name,"%.%a+$","") local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or "" if fmtname == "" then - fmtname = resolvers.findfiles(barename..".fmt")[1] or "" + fmtname = resolvers.findfile(barename..".fmt") fmtname = resolvers.cleanpath(fmtname) end if fmtname ~= "" then @@ -14108,7 +14266,7 @@ elseif environment.argument("expand-var") or environment.argument("expand-variab resolvers.load("nofiles") runners.register_arguments(filename) environment.initializearguments(environment.arguments_after) - resolvers.dowithfilesandreport(resolvers.expandvar, environment.files) + resolvers.dowithfilesandreport(resolvers.expansion, environment.files) elseif environment.argument("show-path") or environment.argument("path-value") then @@ -14126,7 +14284,7 @@ elseif environment.argument("var-value") or environment.argument("show-value") t resolvers.load("nofiles") runners.register_arguments(filename) environment.initializearguments(environment.arguments_after) - resolvers.dowithfilesandreport(resolvers.var_value,environment.files) + resolvers.dowithfilesandreport(resolvers.variable,environment.files) elseif environment.argument("format-path") then diff --git a/tex/context/base/attr-eff.mkiv b/tex/context/base/attr-eff.mkiv index f4b05a14e..ea2dfcd4b 100644 --- a/tex/context/base/attr-eff.mkiv +++ b/tex/context/base/attr-eff.mkiv @@ -15,6 +15,8 @@ \registerctxluafile{attr-eff}{1.001} +% more will move to the lua end (old code, early luatex approach) + \unprotect \def\registereffect#1#2#3% #2=stretch #3=rulethickness @@ -28,10 +30,37 @@ \csname(es:##1:##2:\number\dimexpr##3\relax)\endcsname}% \dotriggereffect} -% \registereffect{normal} -% \registereffect{inner} -% \registereffect{outer} -% \registereffect{both} -% \registereffect{hidden} +\unexpanded\def\setupeffect + {\dodoubleargument\dosetupeffect} + +\def\dosetupeffect[#1][#2]% + {\getparameters[\??et#1][#2]} + +\unexpanded\def\defineeffect + {\dodoubleargument\dodefineeffect} + +\def\dodefineeffect[#1][#2]% + {\getparameters[\??et#1][\c!method=\v!none,\c!stretch=0,\c!rulethickness=\zeropoint,\c!alternative=\v!normal,#2]% + \doif{\getvalue{\??et#1\c!method}}\v!command + {\setugvalue{\e!start#1}{\starteffect[#1]}% + \setugvalue{\e!stop #1}{\stopeffect }}} + +% yes or no grouped + +\unexpanded\def\starteffect[#1]% + {\dotriggereffect{\getvalue{\??et#1\c!alternative}}{\getvalue{\??et#1\c!stretch}}{\getvalue{\??et#1\c!rulethickness}}} + +\unexpanded\def\stopeffect % can be special + {\dotriggereffect\v!normal0\zeropoint} + +\unexpanded\def\effect[#1]% + {\groupedcommand{\starteffect[#1]}{\stopeffect}} + +\defineeffect [\v!inner] [\c!alternative=\v!inner,\c!rulethickness=.25pt] +\defineeffect [\v!outer] [\c!alternative=\v!outer,\c!rulethickness=.25pt] +\defineeffect [\v!both] [\c!alternative=\v!both, \c!rulethickness=.25pt] +\defineeffect [\v!normal] [\c!alternative=\v!normal] +\defineeffect [\v!hidden] [\c!alternative=\v!hidden] +\defineeffect [\v!stretch] [\c!alternative=\v!stretch,\c!stretch=1] \protect \endinput diff --git a/tex/context/base/attr-lay.lua b/tex/context/base/attr-lay.lua index df7a4e6bb..1c13762c4 100644 --- a/tex/context/base/attr-lay.lua +++ b/tex/context/base/attr-lay.lua @@ -12,6 +12,7 @@ if not modules then modules = { } end modules ['attr-lay'] = { local type = type local format = string.format +local insert, remove = table.insert, table.remove local allocate = utilities.storage.allocate @@ -26,21 +27,28 @@ local report_viewerlayers = logs.new("viewerlayers") local attributes, nodes = attributes, nodes attributes.viewerlayers = attributes.viewerlayers or { } +local viewerlayers = attributes.viewerlayers -local viewerlayers = attributes.viewerlayers +local a_viewerlayer = attributes.private("viewerlayer") viewerlayers = viewerlayers or { } viewerlayers.data = allocate() viewerlayers.registered = viewerlayers.registered or { } viewerlayers.values = viewerlayers.values or { } viewerlayers.listwise = allocate() -viewerlayers.attribute = attributes.private("viewerlayer") +viewerlayers.attribute = a_viewerlayer viewerlayers.supported = true viewerlayers.hasorder = true -local states = attributes.states -local tasks = nodes.tasks -local nodeinjections = backends.nodeinjections +local states = attributes.states +local tasks = nodes.tasks +local nodeinjections = backends.nodeinjections +local codeinjections = backends.codeinjections + +local texsetattribute = tex.setattribute +local texgetattribute = tex.getattribute +local texsettokenlist = tex.settoks +local unsetvalue = attributes.unsetvalue storage.register("attributes/viewerlayers/registered", viewerlayers.registered, "attributes.viewerlayers.registered") storage.register("attributes/viewerlayers/values", viewerlayers.values, "attributes.viewerlayers.values") @@ -81,7 +89,7 @@ local function initializer(...) return states.initialize(...) end -viewerlayers.register = function(name,lw) -- if not inimode redefine data[n] in first call +local function register(name,lw) -- if not inimode redefine data[n] in first call local stamp = format(template,name) local n = registered[stamp] if not n then @@ -93,6 +101,8 @@ viewerlayers.register = function(name,lw) -- if not inimode redefine data[n] in return registered[stamp] -- == n end +viewerlayers.register = register + attributes.viewerlayers.handler = nodes.installattributehandler { name = "viewerlayer", namespace = viewerlayers, @@ -118,3 +128,50 @@ end function viewerlayers.setfeatures(hasorder) viewerlayers.hasorder = hasorder end + +local stack, enabled, global = { }, false, false + +function viewerlayers.start(name) + if not enabled then + viewerlayers.enable(true) + end + insert(stack,texgetattribute(a_viewerlayer)) + if global then + texsetattribute("global",a_viewerlayer,register(name) or unsetvalue) + else + texsetattribute(a_viewerlayer,register(name) or unsetvalue) + end + texsettokenlist("currentviewerlayertoks",name) +end + +function viewerlayers.stop() + local a = remove(stack) + if a >= 0 then + if global then + texsetattribute("global",a_viewerlayer,a) + else + texsetattribute(a_viewerlayer,a) + end + texsettokenlist("currentviewerlayertoks",values[a]) + else + if global then + texsetattribute("global",a_viewerlayer,unsetvalue) + else + texsetattribute(a_viewerlayer,unsetvalue) + end + texsettokenlist("currentviewerlayertoks","") + end +end + +function viewerlayers.define(settings) + local tag = settings.tag + if not tag or tag == "" then + -- error + else + local title = settings.title + if not title or title == "" then + settings.title = tag + end + codeinjections.defineviewerlayer(settings) + end +end diff --git a/tex/context/base/attr-lay.mkiv b/tex/context/base/attr-lay.mkiv index 42a628f03..efc9f4514 100644 --- a/tex/context/base/attr-lay.mkiv +++ b/tex/context/base/attr-lay.mkiv @@ -15,6 +15,8 @@ \unprotect +\def\c!printable{printable} % todo + \registerctxluafile{attr-lay}{1.001} % needs to work over stopitemize grouping etc @@ -29,4 +31,75 @@ \gdef\dotriggerviewerlayer##1{\csname(vl:##1)\endcsname}% \dotriggerviewerlayer} +\getparameters + [\??lr] + [\c!state=\v!start, + \c!title=, + \c!printable=\v!yes, + \c!method=\v!none] + +\def\defineviewerlayer + {\dodoubleargument\dodefineviewerlayer} + +\def\dodefineviewerlayer[#1][#2]% document wide properties + {\begingroup + \getparameters[\??lr][#2]% + \ctxlua{attributes.viewerlayers.define{ + tag = "#1", + title = "\@@lrtitle", + visible = "\@@lrstate", + kind = 0, % 1 == frozen + printable = "\@@lrprintable", + }}% + \doif\@@lrmethod\v!command + {\setugvalue{\e!start#1}{\startviewerlayer[#1]}% + \setugvalue{\e!stop #1}{\stopviewerlayer }}% + \endgroup} + +\unexpanded\def\startviewerlayer[#1]{\ctxlua{attributes.viewerlayers.start("#1")}} % not grouped +\unexpanded\def\stopviewerlayer {\ctxlua{attributes.viewerlayers.stop()}} % not grouped +\unexpanded\def\viewerlayer [#1]{\groupedcommand{\startviewerlayer[#1]}{\stopviewerlayer}} % grouped + +% some day we will keep this at the lua end as the info is only needed there + +\let\currentviewerlayer\empty \newtoks\currentviewerlayertoks % soon we can set macros at the lua end + +\def\currentviewerlayer{\the\currentviewerlayertoks} + +\appendtoks + \let\currentviewerlayer\empty +\to \everypagebody + +% layout components are implemented rather directly (speed) + +\def\doinitializelayoutcomponent#1#2% + {\ctxlua{backends.codeinjections.defineviewerlayer{% this will move to the lua end i.e be merged with register + tag = "#1:#2", + title = "#1 #2", + visible = "\v!start", + kind = 0, % 1 == frozen + printable = "\v!yes" + }}% + \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(attributes.viewerlayers.register('#1:#2',true))}\relax}% + \expandafter\glet\csname\??ly>#1:#2\endcsname\layoutcomponentboxattribute} + +\def\dosetlayoutcomponentattribute#1#2% make this faster + {\expandafter\let\expandafter\layoutcomponentboxattribute\csname\??ly>#1:#2\endcsname + \ifx\layoutcomponentboxattribute\relax + \doinitializelayoutcomponent{#1}{#2}% get rid of { } + \fi} + +\def\doresetlayoutcomponentattribute + {\let\layoutcomponentboxattribute\empty} + +\let\setlayoutcomponentattribute \gobbletwoarguments +\let\resetlayoutcomponentattribute\relax +\let\layoutcomponentboxattribute \empty + +\def\showlayoutcomponents + {\ctxlua{attributes.viewerlayers.enable()}% + \let\setlayoutcomponentattribute \dosetlayoutcomponentattribute + \let\resetlayoutcomponentattribute\doresetlayoutcomponentattribute} + + \protect \endinput diff --git a/tex/context/base/attr-neg.mkiv b/tex/context/base/attr-neg.mkiv index 20a1489c3..7ffd7ae19 100644 --- a/tex/context/base/attr-neg.mkiv +++ b/tex/context/base/attr-neg.mkiv @@ -28,4 +28,10 @@ \registernegative{positive}{positive} \registernegative{negative}{negative} +\unexpanded\def\startnegative{\dotriggernegative\v!negative} +\unexpanded\def\stopnegative {\dotriggernegative\v!positive} + +\unexpanded\def\startpositive{\dotriggernegative\v!positive} +\unexpanded\def\stoppositive {\dotriggernegative\v!negative} + \protect \endinput diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua index 28cb5c18c..892f35946 100644 --- a/tex/context/base/back-exp.lua +++ b/tex/context/base/back-exp.lua @@ -56,7 +56,7 @@ local attributes = attributes local variables = interfaces.variables local tasks = nodes.tasks -local fontchar = fonts.chr +local fontchar = fonts.characters local languagenames = languages.numbers local nodecodes = nodes.nodecodes diff --git a/tex/context/base/back-ini.lua b/tex/context/base/back-ini.lua index 1bceea691..10f908798 100644 --- a/tex/context/base/back-ini.lua +++ b/tex/context/base/back-ini.lua @@ -75,6 +75,7 @@ backends.codeinjections = { setpagetransition = nothing, defineviewerlayer = nothing, + useviewerlayer = nothing, addbookmarks = nothing, diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua index c9c0982f0..eec82d5f2 100644 --- a/tex/context/base/back-pdf.lua +++ b/tex/context/base/back-pdf.lua @@ -90,6 +90,7 @@ local cache = { } function nodeinjections.startlayer(name) local c = cache[name] if not c then + codeinjections.useviewerlayer(name) c = register(pdfliteral(format("/OC /%s BDC",name))) cache[name] = c end @@ -104,9 +105,10 @@ end local cache = { } -function nodeinjections.switchlayer(name) +function nodeinjections.switchlayer(name) -- not used, optimization local c = cache[name] if not c then + codeinjections.useviewerlayer(name) c = register(pdfliteral(format("EMC /OC /%s BDC",name))) end return copy_node(c) diff --git a/tex/context/base/cldf-com.lua b/tex/context/base/cldf-com.lua index 3bbeabb0f..5ab1d8c8d 100644 --- a/tex/context/base/cldf-com.lua +++ b/tex/context/base/cldf-com.lua @@ -6,8 +6,45 @@ if not modules then modules = { } end modules ['cldf-com'] = { license = "see context related readme files" } +local context = context local generics = context.generics local variables = interfaces.variables generics.starttabulate = "start" .. variables.tabulate -- todo: e!start generics.stoptabulate = "stop" .. variables.tabulate -- todo: e!stop + +local NC, NR = context.NC, context.NR + +local function tabulaterow(how,...) + local t = { ... } + for i=1,#t do + local ti = tostring(t[i]) + NC() + if how then + context[how](ti) + else + context(ti) + end + end + NC() + NR() +end + +function context.tabulaterow (...) tabulaterow(false, ...) end +function context.tabulaterowbold(...) tabulaterow("bold",...) end +function context.tabulaterowtype(...) tabulaterow("type",...) end +function context.tabulaterowtyp (...) tabulaterow("typ", ...) end + +function context.concat(t,separator) + local done = false + for i=1,#t do + local ti = t[i] + if ti ~= "" then + if done then + context(separator) + end + context(t) + done = true + end + end +end diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv index a94495a0b..406cc619d 100644 --- a/tex/context/base/colo-ini.mkiv +++ b/tex/context/base/colo-ini.mkiv @@ -217,9 +217,8 @@ \processcommalist[#1]\dodosetupcolor}} \def\dodosetupcolor#1% - {\makeshortfilename[\truefilename{\f!colorprefix#1}]% - \startreadingfile - \readsysfile\shortfilename + {\startreadingfile + \readsysfile{\truefilename{\f!colorprefix#1}} {\showcolormessage\m!colors4\colorstyle} {\showcolormessage\m!colors5\colorstyle}% \stopreadingfile} diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index ed43fb610..56f0cc8c6 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2010.11.03 19:42} +\newcontextversion{2010.11.12 18:22} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 754b518f8..7748b750e 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -91,6 +91,7 @@ \loadmarkfile{attr-col} \loadmarkfile{attr-lay} +\loadmarkfile{attr-neg} \loadmarkfile{attr-eff} \loadmarkfile{trac-tex} @@ -275,10 +276,10 @@ \loadmarkfile{scrp-ini} -\loadmarkfile{prop-ini} -\loadmarkfile{prop-lay} -\loadmarkfile{prop-eff} -\loadmarkfile{prop-neg} +\loadmarkfile{prop-ini} % only for downward compatibility +%loadmarkfile{prop-lay} +%loadmarkfile{prop-neg} +%loadmarkfile{prop-eff} \loadmarkfile{mlib-ctx} diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index bfd1b6119..272c2f1a4 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2010.11.03 19:42} +\edef\contextversion{2010.11.12 18:22} %D For those who want to use this: diff --git a/tex/context/base/core-fil.mkii b/tex/context/base/core-fil.mkii index fca253a7b..ad22ade1e 100644 --- a/tex/context/base/core-fil.mkii +++ b/tex/context/base/core-fil.mkii @@ -128,6 +128,12 @@ %D More information on the specific modules can be found in %D their dedicated manuals. We use \type {\next} so that we %D can \type {\end} in modules. +%D +%D In \MKIV\ we load the \type {mkiv} file when there is a \type +%D {tex} file on the same path but in \MKII\ we start with the \type +%D {tex} file as in many cases a \type {mkii} will be the same as an +%D (old) \type {tex} one simply because we don't update drastically +%D (or load a mark file indirectly). \newconditional\moduleisloaded diff --git a/tex/context/base/core-fil.mkiv b/tex/context/base/core-fil.mkiv index 14856fc0f..e96feae07 100644 --- a/tex/context/base/core-fil.mkiv +++ b/tex/context/base/core-fil.mkiv @@ -75,32 +75,10 @@ %D %D The implementation shows that nesting is supported. -\def\truefilename#1% +\def\truefilename#1% this will move to lua {\ifcsname\??fs#1\endcsname\expandafter\truefilename\csname\??fs#1\endcsname\else#1\fi} %D \macros -%D {makeshortfilename} -%D -%D To prevent cross platform problems with filenames, we -%D lowercase them as well as only use the first 8~characters. -%D -%D \starttyping -%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]% -%D {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}% -%D \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename} -%D -%D \def\makeshortfilename[#1]% -%D {\edef\fullfilename{#1.........}% -%D \expanded{\domakeshortfilename[\fullfilename]}} -%D \stoptyping -%D -%D In 2005 there is no need for the 8~character limit any more, so: - -\def\makeshortfilename[#1]% no need for further cleanup and shortening - {\lowercase{\edef\shortfilename{#1.}}% - \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename} - -%D \macros %D {usemodule} %D %D Most of \CONTEXT is preloaded in the format file. Some very diff --git a/tex/context/base/data-env.lua b/tex/context/base/data-env.lua index ac476593d..c6035d799 100644 --- a/tex/context/base/data-env.lua +++ b/tex/context/base/data-env.lua @@ -7,125 +7,245 @@ if not modules then modules = { } end modules ['data-env'] = { } local allocate = utilities.storage.allocate +local lower, gsub = string.lower, string.gsub + +local fileextname = file.extname local resolvers = resolvers -local formats = allocate() resolvers.formats = formats -local suffixes = allocate() resolvers.suffixes = suffixes -local dangerous = allocate() resolvers.dangerous = dangerous -local suffixmap = allocate() resolvers.suffixmap = suffixmap -local alternatives = allocate() resolvers.alternatives = alternatives - -formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' } -formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' } -formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' } -formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' } -formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' } -formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' } -formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' } -formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' } -formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' } -formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' } -formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' } -formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' } -formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' } -formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' } -formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' } -formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' } -formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' } -formats['icc'] = 'ICCPROFILES' suffixes['icc'] = { 'icc' } -formats['texmfscripts'] = 'TEXMFSCRIPTS' suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -formats['lua'] = 'LUAINPUTS' suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' } -formats['lib'] = 'CLUAINPUTS' suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' } - --- backward compatible ones - -alternatives['map files'] = 'map' -alternatives['enc files'] = 'enc' -alternatives['cid maps'] = 'cid' -- great, why no cid files -alternatives['font feature files'] = 'fea' -- and fea files here -alternatives['opentype fonts'] = 'otf' -alternatives['truetype fonts'] = 'ttf' -alternatives['truetype collections'] = 'ttc' -alternatives['truetype dictionary'] = 'dfont' -alternatives['type1 fonts'] = 'pfb' -alternatives['icc profiles'] = 'icc' - ---[[ldx-- -<p>If you wondered about some of the previous mappings, how about -the next bunch:</p> ---ldx]]-- - --- kpse specific ones (a few omitted) .. we only add them for locating --- files that we don't use anyway - -formats['base'] = 'MFBASES' suffixes['base'] = { 'base', 'bas' } -formats['bib'] = '' suffixes['bib'] = { 'bib' } -formats['bitmap font'] = '' suffixes['bitmap font'] = { } -formats['bst'] = '' suffixes['bst'] = { 'bst' } -formats['cmap files'] = 'CMAPFONTS' suffixes['cmap files'] = { 'cmap' } -formats['cnf'] = '' suffixes['cnf'] = { 'cnf' } -formats['cweb'] = '' suffixes['cweb'] = { 'w', 'web', 'ch' } -formats['dvips config'] = '' suffixes['dvips config'] = { } -formats['gf'] = '' suffixes['gf'] = { '<resolution>gf' } -formats['graphic/figure'] = '' suffixes['graphic/figure'] = { 'eps', 'epsi' } -formats['ist'] = '' suffixes['ist'] = { 'ist' } -formats['lig files'] = 'LIGFONTS' suffixes['lig files'] = { 'lig' } -formats['ls-R'] = '' suffixes['ls-R'] = { } -formats['mem'] = 'MPMEMS' suffixes['mem'] = { 'mem' } -formats['MetaPost support'] = '' suffixes['MetaPost support'] = { } -formats['mf'] = 'MFINPUTS' suffixes['mf'] = { 'mf' } -formats['mft'] = '' suffixes['mft'] = { 'mft' } -formats['misc fonts'] = '' suffixes['misc fonts'] = { } -formats['other text files'] = '' suffixes['other text files'] = { } -formats['other binary files'] = '' suffixes['other binary files'] = { } -formats['pdftex config'] = 'PDFTEXCONFIG' suffixes['pdftex config'] = { } -formats['pk'] = '' suffixes['pk'] = { '<resolution>pk' } -formats['PostScript header'] = 'TEXPSHEADERS' suffixes['PostScript header'] = { 'pro' } -formats['sfd'] = 'SFDFONTS' suffixes['sfd'] = { 'sfd' } -formats['TeX system documentation'] = '' suffixes['TeX system documentation'] = { } -formats['TeX system sources'] = '' suffixes['TeX system sources'] = { } -formats['Troff fonts'] = '' suffixes['Troff fonts'] = { } -formats['type42 fonts'] = 'T42FONTS' suffixes['type42 fonts'] = { } -formats['web'] = '' suffixes['web'] = { 'web', 'ch' } -formats['web2c files'] = 'WEB2C' suffixes['web2c files'] = { } -formats['fontconfig files'] = 'FONTCONFIG_PATH' suffixes['fontconfig files'] = { } -- not unique - -alternatives['subfont definition files'] = 'sfd' +local formats = allocate() resolvers.formats = formats +local suffixes = allocate() resolvers.suffixes = suffixes +local dangerous = allocate() resolvers.dangerous = dangerous +local suffixmap = allocate() resolvers.suffixmap = suffixmap --- A few accessors, mostly for command line tool. +local relations = allocate { + core = { + ofm = { + names = { "ofm", "omega font metric", "omega font metrics" }, + variable = 'OFMFONTS', + suffixes = { 'ofm', 'tfm' }, + }, + ovf = { + names = { "ovf", "omega virtual font", "omega virtual fonts" }, + variable = 'OVFFONTS', + suffixes = { 'ovf', 'vf' }, + }, + tfm = { + names = { "tfm", "tex font metric", "tex font metrics" }, + variable = 'TFMFONTS', + suffixes = { 'tfm' }, + }, + vf = { + names = { "vf", "virtual font", "virtual fonts" }, + variable = 'VFFONTS', + suffixes = { 'vf' }, + }, + otf = { + names = { "otf", "opentype", "opentype font", "opentype fonts"}, + variable = 'OPENTYPEFONTS', + suffixes = { 'otf' }, + }, + ttf = { + names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" }, + variable = 'TTFONTS', + suffixes = { 'ttf', 'ttc', 'dfont' }, + }, + afm = { + names = { "afm", "adobe font metric", "adobe font metrics" }, + variable = "AFMFONTS", + suffixes = { "afm" }, + }, + pfb = { + names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" }, + variable = 'T1FONTS', + suffixes = { 'pfb', 'pfa' }, + }, + fea = { + names = { "fea", "font feature", "font features", "font feature file", "font feature files" }, + variable = 'FONTFEATURES', + suffixes = { 'fea' }, + }, + cid = { + names = { "cid", "cid map", "cid maps", "cid file", "cid files" }, + variable = 'FONTCIDMAPS', + suffixes = { 'cid', 'cidmap' }, + }, + fmt = { + names = { "fmt", "format", "tex format" }, + variable = 'TEXFORMATS', + suffixes = { 'fmt' }, + }, + mem = { + names = { 'mem', "metapost format" }, + variable = 'MPMEMS', + suffixes = { 'mem' }, + }, + mp = { + names = { "mp" }, + variable = 'MPINPUTS', + suffixes = { 'mp' }, + }, + tex = { + names = { "tex" }, + variable = 'TEXINPUTS', + suffixes = { 'tex', "mkiv", "mkii" }, + }, + icc = { + names = { "icc", "icc profile", "icc profiles" }, + variable = 'ICCPROFILES', + suffixes = { 'icc' }, + }, + texmfscripts = { + names = { "texmfscript", "texmfscripts", "script", "scripts" }, + variable = 'TEXMFSCRIPTS', + suffixes = { 'rb', 'pl', 'py' }, + }, + lua = { + names = { "lua" }, + variable = 'LUAINPUTS', + suffixes = { 'lua', 'luc', 'tma', 'tmc' }, + }, + lib = { + names = { "lib" }, + variable = 'CLUAINPUTS', + suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' }, + }, + bib = { + names = { 'bib' }, + suffixes = { 'bib' }, + }, + bst = { + names = { 'bst' }, + suffixes = { 'bst' }, + }, + fontconfig = { + names = { 'fontconfig', 'fontconfig file', 'fontconfig files' }, + variable = 'FONTCONFIG_PATH', + }, + }, + obsolete = { + enc = { + names = { "enc", "enc files", "enc file", "encoding files", "encoding file" }, + variable = 'ENCFONTS', + suffixes = { 'enc' }, + }, + map = { + names = { "map", "map files", "map file" }, + variable = 'TEXFONTMAPS', + suffixes = { 'map' }, + }, + lig = { + names = { "lig files", "lig file", "ligature file", "ligature files" }, + variable = 'LIGFONTS', + suffixes = { 'lig' }, + }, + opl = { + names = { "opl" }, + variable = 'OPLFONTS', + suffixes = { 'opl' }, + }, + otp = { + names = { "otp" }, + variable = 'OTPINPUTS', + suffixes = { 'otp' }, + }, + ovp = { + names = { "ovp" }, + variable = 'OVPFONTS', + suffixes = { 'ovp' }, + }, + }, + kpse = { -- subset + base = { + names = { 'base', "metafont format" }, + variable = 'MFBASES', + suffixes = { 'base', 'bas' }, + }, + cmap = { + names = { 'cmap', 'cmap files', 'cmap file' }, + variable = 'CMAPFONTS', + suffixes = { 'cmap' }, + }, + cnf = { + names = { 'cnf' }, + suffixes = { 'cnf' }, + }, + web = { + names = { 'web' }, + suffixes = { 'web', 'ch' } + }, + cweb = { + names = { 'cweb' }, + suffixes = { 'w', 'web', 'ch' }, + }, + gf = { + names = { 'gf' }, + suffixes = { '<resolution>gf' }, + }, + mf = { + names = { 'mf' }, + variable = 'MFINPUTS', + suffixes = { 'mf' }, + }, + mft = { + names = { 'mft' }, + suffixes = { 'mft' }, + }, + pk = { + names = { 'pk' }, + suffixes = { '<resolution>pk' }, + }, + }, +} -function resolvers.suffixofformat(str) - local s = suffixes[str] - return s and s[1] or "" +resolvers.relations = relations + +-- formats: maps a format onto a variable + +for category, categories in next, relations do + for name, relation in next, categories do + local rn = relation.names + local rv = relation.variable + local rs = relation.suffixes + if rn and rv then + for i=1,#rn do + local rni = lower(gsub(rn[i]," ","")) + formats[rni] = rv + if rs then + suffixes[rni] = rs + for i=1,#rs do + local rsi = rs[i] + suffixmap[rsi] = rni + end + end + end + end + if rs then + end + end end -function resolvers.suffixesofformat(str) - return suffixes[str] or { } +local function simplified(t,k) + return rawget(t,lower(gsub(k," ",""))) end --- As we don't register additional suffixes anyway, we can as well --- freeze the reverse map here. +setmetatablekey(formats, "__index", simplified) +setmetatablekey(suffixes, "__index", simplified) +setmetatablekey(suffixmap, "__index", simplified) -for name, suffixlist in next, suffixes do - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end -end +-- A few accessors, mostly for command line tool. -local mt = getmetatable(suffixes) +function resolvers.suffixofformat(str) + local s = suffixes[str] + return s and s[1] or "" +end -mt.__newindex = function(suffixes,name,suffixlist) - rawset(suffixes,name,suffixlist) - suffixes[name] = suffixlist - for i=1,#suffixlist do - suffixmap[suffixlist[i]] = name - end +function resolvers.suffixofformat(str) + return suffixes[str] or { } end for name, format in next, formats do - dangerous[name] = true + dangerous[name] = true -- still needed ? end -- because vf searching is somewhat dangerous, we want to prevent @@ -139,15 +259,15 @@ dangerous.tex = nil -- more helpers function resolvers.formatofvariable(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.formatofsuffix(str) -- of file - return suffixmap[file.extname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) + return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc) end function resolvers.variableofformat(str) - return formats[str] or formats[alternatives[str]] or '' + return formats[str] or '' end function resolvers.variableofformatorsuffix(str) @@ -155,10 +275,6 @@ function resolvers.variableofformatorsuffix(str) if v then return v end - v = formats[alternatives[str]] - if v then - return v - end v = suffixmap[fileextname(str)] if v then return formats[v] diff --git a/tex/context/base/data-res.lua b/tex/context/base/data-res.lua index 8e3428b2f..d45597093 100644 --- a/tex/context/base/data-res.lua +++ b/tex/context/base/data-res.lua @@ -56,7 +56,6 @@ local formats = resolvers.formats local suffixes = resolvers.suffixes local dangerous = resolvers.dangerous local suffixmap = resolvers.suffixmap -local alternatives = resolvers.alternatives resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky @@ -68,7 +67,6 @@ function resolvers.newinstance() local newinstance = { progname = 'context', engine = 'luatex', - format = '', environment = allocate(), variables = allocate(), expansions = allocate(), @@ -88,7 +86,6 @@ function resolvers.newinstance() renewcache = false, loaderror = false, savelists = true, - allresults = false, pattern = nil, -- lists force_suffixes = true, } @@ -175,7 +172,8 @@ end local function entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - local result = entries[name..'.'..instance.progname] or entries[name] + -- local result = entries[name..'.'..instance.progname] or entries[name] + local result = entries[instance.progname .. '.' .. name] or entries[name] if result then return result else @@ -193,7 +191,8 @@ end local function is_entry(entries,name) if name and name ~= "" then name = gsub(name,'%$','') - return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + -- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + return (entries[instance.progname .. '.' .. name] or entries[name]) ~= nil else return false end @@ -254,19 +253,28 @@ local function load_configuration_files() end -- flattening is easier to deal with as we need to collapse local t = { } - for k, v in next, data do -- v = progname + for k, v in next, data do -- k = progname or setter or variables if v ~= unset_variable then local kind = type(v) if kind == "string" then + -- still supported, but preferably use the variables subtable t[k] = v elseif kind == "table" then - -- this operates on the table directly - initializesetter(filename,k,v) - -- this doesn't (maybe metatables some day) - for kk, vv in next, v do -- vv = variable - if vv ~= unset_variable then - if type(vv) == "string" then - t[kk.."."..k] = vv + if initializesetter(filename,k,v) then + -- directives, experiments, trackers, ... + else + for kk, vv in next, v do -- vv = variable + if vv ~= unset_variable then + if type(vv) == "string" then + -- t[kk.."."..k] = vv + if k == "variables" then + -- special table, shared variables can be grouped + t[kk] = vv + else + -- category.variable (progname) + t[k .. "." .. kk] = vv + end + end end end end @@ -536,12 +544,12 @@ function resolvers.expandvariables() if engine ~= "" then environment['engine'] = engine end if progname ~= "" then environment['progname'] = progname end for k,v in next, environment do - local a, b = match(k,"^(%a+)%_(.*)%s*$") - if a and b then - expansions[a..'.'..b] = v - else + -- local a, b = match(k,"^(%a+)%_(.*)%s*$") -- too many vars have an _ in the name + -- if a and b then -- so let's forget about it; it was a + -- expansions[a..'.'..b] = v -- hack anyway for linux and not needed + -- else -- anymore as we now have directives expansions[k] = v - end + -- end end for k,v in next, environment do -- move environment to expansions (variables are already in there) if not expansions[k] then expansions[k] = v end @@ -595,7 +603,7 @@ function resolvers.unexpandedpathlist(str) end function resolvers.unexpandedpath(str) - return file.joinpath(resolvers.unexpandedpath_list(str)) + return file.joinpath(resolvers.unexpandedpathlist(str)) end local done = { } @@ -856,13 +864,14 @@ local function can_be_dir(name) -- can become local return fakepaths[name] == 1 end -local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc) - local result = collected or { } +local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc) + local result = { } local stamp = nil + askedformat = askedformat or "" filename = collapsepath(filename) -- speed up / beware: format problem - if instance.remember then - stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format + if instance.remember and not allresults then + stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. askedformat if instance.found[stamp] then if trace_locating then report_resolvers("remembering file '%s'",filename) @@ -871,12 +880,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan return instance.found[stamp] end end - if not dangerous[instance.format or "?"] then + if not dangerous[askedformat] then if resolvers.isreadable.file(filename) then if trace_detail then report_resolvers("file '%s' found directly",filename) end - instance.found[stamp] = { filename } + if stamp then + instance.found[stamp] = { filename } + end return { filename } end end @@ -884,7 +895,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if trace_locating then report_resolvers("checking wildcard '%s'", filename) end - result = resolvers.findwildcardfiles(filename) + result = resolvers.findwildcardfiles(filename) -- we can use th elocal elseif file.is_qualified_path(filename) then if resolvers.isreadable.file(filename) then if trace_locating then @@ -894,7 +905,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else local forcedname, ok, suffix = "", false, fileextname(filename) if suffix == "" then -- why - local format_suffixes = instance.format == "" and resolvers.defaultsuffixes or suffixes[instance.format] + local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do local s = format_suffixes[i] @@ -914,21 +925,22 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan -- matching last part of the name local basename = filebasename(filename) local pattern = gsub(filename .. "$","([%.%-])","%%%1") - local savedformat = instance.format + -- messy .. to be sorted out + local savedformat = askedformat local format = savedformat or "" if format == "" then - instance.format = resolvers.formatofsuffix(suffix) + askedformat = resolvers.formatofsuffix(suffix) end if not format then - instance.format = "othertextfiles" -- kind of everything, maybe texinput is better + askedformat = "othertextfiles" -- kind of everything, maybe texinput is better end -- if basename ~= filename then - local resolved = collect_instance_files(basename) + local resolved = collect_instance_files(basename,askedformat,allresults) if #result == 0 then local lowered = lower(basename) if filename ~= lowered then - resolved = collect_instance_files(lowered) + resolved = collect_instance_files(lowered,askedformat,allresults) end end resolvers.format = savedformat @@ -970,7 +982,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan else wantedfiles[#wantedfiles+1] = filename end - if instance.format == "" then + if askedformat == "" then if ext == "" or not suffixmap[ext] then local defaultsuffixes = resolvers.defaultsuffixes for i=1,#defaultsuffixes do @@ -989,14 +1001,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end else if ext == "" or not suffixmap[ext] then - local format_suffixes = suffixes[instance.format] + local format_suffixes = suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i] end end end - filetype = instance.format + filetype = askedformat if trace_locating then report_resolvers("using given filetype '%s'",filetype) end @@ -1067,7 +1079,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan --- todo, test for readable result[#result+1] = fl[3] done = true - if instance.allresults then + if allresults then if trace_detail then report_resolvers("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d) end @@ -1098,7 +1110,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan end result[#result+1] = fname done = true - if not instance.allresults then break end + if not allresults then break end end end else @@ -1110,7 +1122,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan if not done and doscan then -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF end - if done and not instance.allresults then break end + if done and not allresults then break end end end end @@ -1119,7 +1131,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan result[k] = rk resolvers.registerintrees(rk) -- for tracing used files end - if instance.remember then + if stamp then instance.found[stamp] = result end return result @@ -1128,37 +1140,30 @@ end resolvers.concatinators.tex = filejoin resolvers.concatinators.file = resolvers.concatinators.tex -function resolvers.findfiles(filename,filetype,mustexist) - if type(mustexist) == boolean then - -- all set - elseif type(filetype) == 'boolean' then - filetype, mustexist = nil, false - elseif type(filetype) ~= 'string' then - filetype, mustexist = nil, false - end - instance.format = filetype or '' - local result = collect_instance_files(filename) +local function findfiles(filename,filetype,allresults) + local result = collect_instance_files(filename,filetype or "",allresults) if #result == 0 then local lowered = lower(filename) if filename ~= lowered then - return collect_instance_files(lowered) + return collect_instance_files(lowered,filetype or "",allresults) end end - instance.format = '' return result end -function resolvers.findfile(filename,filetype,mustexist) - return (resolvers.findfiles(filename,filetype,mustexist)[1] or "") +function resolvers.findfiles(filename,filetype) + return findfiles(filename,filetype,true) +end + +function resolvers.findfile(filename,filetype) + return findfiles(filename,filetype,false)[1] or "" end function resolvers.findpath(filename,filetype) - local path = resolvers.findfiles(filename,filetype)[1] or "" - -- todo return current path - return file.dirname(path) + return file.dirname(findfiles(filename,filetype,false)[1] or "") end -function resolvers.findgivenfiles(filename) +local function findgivenfiles(filename,allresults) local bname, result = filebasename(filename), { } local hashes = instance.hashes for k=1,#hashes do @@ -1176,12 +1181,12 @@ function resolvers.findgivenfiles(filename) if blist then if type(blist) == 'string' then result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or "" - if not instance.allresults then break end + if not allresults then break end else for kk=1,#blist do local vv = blist[kk] result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or "" - if not instance.allresults then break end + if not allresults then break end end end end @@ -1189,8 +1194,12 @@ function resolvers.findgivenfiles(filename) return result end +function resolvers.findgivenfiles(filename) + return findgivenfiles(filename,true) +end + function resolvers.findgivenfile(filename) - return (resolvers.findgivenfiles(filename)[1] or "") + return findgivenfiles(filename,false)[1] or "" end local function doit(path,blist,bname,tag,kind,result,allresults) @@ -1216,7 +1225,7 @@ local function doit(path,blist,bname,tag,kind,result,allresults) return done end -function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg +local function findwildcardfiles(filename,allresults) -- todo: remap: and lpeg local result = { } local bname, dname = filebasename(filename), filedirname(filename) local path = gsub(dname,"^*/","") @@ -1230,7 +1239,7 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg name = gsub(name,"-","%%-") path = lower(path) name = lower(name) - local files, allresults, done = instance.files, instance.allresults, false + local files, done = instance.files, false if find(name,"%*") then local hashes = instance.hashes for k=1,#hashes do @@ -1259,8 +1268,12 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg return result end +function resolvers.findwildcardfiles(filename) + return findwildcardfiles(filename,true) +end + function resolvers.findwildcardfile(filename) - return (resolvers.findwildcardfiles(filename)[1] or "") + return findwildcardfiles(filename,false)[1] or "" end -- main user functions @@ -1292,14 +1305,14 @@ local function report(str) end end -function resolvers.dowithfilesandreport(command, files, filetype, mustexist) +function resolvers.dowithfilesandreport(command, files, ...) if files and #files > 0 then if trace_locating then report('') -- ? end for f=1,#files do local file = files[f] - local result = command(file,filetype,mustexist) + local result = command(file,...) if type(result) == 'string' then report(result) else @@ -1321,9 +1334,7 @@ function resolvers.showpath(str) -- output search path for file type NAME end -- resolvers.findfile(filename) --- resolvers.findfile(filename, filetype, mustexist) --- resolvers.findfile(filename, mustexist) --- resolvers.findfile(filename, filetype) +-- resolvers.findfile(filename, f.iletype) function resolvers.registerfile(files, name, path) if files[name] then @@ -1352,7 +1363,7 @@ function resolvers.locateformat(name) local barename = gsub(name,"%.%a+$","") local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or "" if fmtname == "" then - fmtname = resolvers.findfiles(barename..".fmt")[1] or "" + fmtname = resolvers.findfile(barename..".fmt") fmtname = resolvers.cleanpath(fmtname) end if fmtname ~= "" then diff --git a/tex/context/base/data-tex.lua b/tex/context/base/data-tex.lua index cf66913c1..bd6eb0599 100644 --- a/tex/context/base/data-tex.lua +++ b/tex/context/base/data-tex.lua @@ -225,9 +225,9 @@ function resolvers.openfile(filename) end end -function resolvers.texdatablob(filename, filetype) +function resolvers.loadtexfile(filename, filetype) local ok, data, size = resolvers.loadbinfile(filename, filetype) return data or "" end -resolvers.loadtexfile = resolvers.texdatablob +resolvers.texdatablob = resolvers.loadtexfile diff --git a/tex/context/base/font-chk.lua b/tex/context/base/font-chk.lua index 1fa520452..78b3253c5 100644 --- a/tex/context/base/font-chk.lua +++ b/tex/context/base/font-chk.lua @@ -15,7 +15,7 @@ local fonts = fonts fonts.checkers = fonts.checkers or { } local checkers = fonts.checkers -local fontdata = fonts.ids +local fontdata = fonts.identifiers local is_character = characters.is_character local chardata = characters.data local tasks = nodes.tasks diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua index d22a8088e..ef08c0b8c 100644 --- a/tex/context/base/font-col.lua +++ b/tex/context/base/font-col.lua @@ -28,7 +28,7 @@ local definitions = collections.definitions collections.vectors = collections.vectors or { } local vectors = collections.vectors -local fontdata = fonts.ids +local fontdata = fonts.identifiers local glyph = node.id('glyph') diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua index 6101644e0..eb0990ec1 100644 --- a/tex/context/base/font-ctx.lua +++ b/tex/context/base/font-ctx.lua @@ -28,7 +28,6 @@ local report_mapfiles = logs.new("mapfiles") local fonts = fonts local tfm = fonts.tfm -local fontdata = fonts.identifiers local definers = fonts.definers local specifiers = definers.specifiers local currentfont = font.current @@ -47,8 +46,105 @@ local synonyms = specifiers.synonyms local triggers = fonts.triggers local names = fonts.names --- Beware, number can be shared between redefind features but as it is --- applied only for special cases it probably doesn't matter. +local allocate, mark = utilities.storage.allocate, utilities.storage.mark + +fonts.internalized = allocate() -- internal tex numbers + +fonts.characters = mark(fonts.characters or { }) -- chardata +fonts.csnames = mark(fonts.csnames or { }) -- namedata +fonts.quads = mark(fonts.quads or { }) -- quaddata +fonts.xheights = mark(fonts.xheights or { }) -- xheightdata + +local fontdata = fonts.identifiers +local chardata = fonts.characters +local quaddata = fonts.quads +local xheightdata = fonts.xheights + +fonts.ids = fontdata -- we keep this one for a while (as it is used in mk etc) + +local nulldata = { + name = "nullfont", + characters = { }, + descriptions = { }, + parameters = { + xheight = 0, + quad = 0, + }, +} + +setmetatablekey(fontdata, "__index", function(t,k) + return nulldata +end) + +setmetatablekey(chardata, "__index", function(t,k) + local characters = fontdata[k].characters + chardata[k] = characters + return characters +end) + +setmetatablekey(quaddata, "__index", function(t,k) + local parameters = fontdata[k].parameters + local quad = parameters and parameters.quad or 0 + quaddata[k] = quad + return quad +end) + +setmetatablekey(xheightdata, "__index", function(t,k) + local parameters = fontdata[k].parameters + local xheight = parameters and parameters.xheight or 0 + xheightdata[k] = xheight + return quad +end) + +-- local function enhancetfmdata(tfmdata) +-- local characters = tfmdata.characters +-- local parameters = tfmdata.parameters +-- local shared = tfmdata.shared +-- setmetatablekey(chardata, "__index", function(t,k) +-- if type(k) == "number" then +-- return characters[k] +-- else +-- -- t[k] = v -- can be option +-- return parameters[k] or shared[k] +-- end +-- return v +-- end) +-- end + +-- Here we overload the registration code. + +function definers.registered(hash) + local id = fonts.internalized[hash] + return id, id and fonts.identifiers[id] +end + +function definers.register(tfmdata,id) + if tfmdata and id then + local hash = tfmdata.hash + if not fonts.internalized[hash] then + fonts.internalized[hash] = id + if trace_defining then + report_define("registering font, id: %s, hash: %s",id or "?",hash or "?") + end + -- enhancetfmdata(tfmdata) + local characters = tfmdata.characters + local parameters = tfmdata.parameters + fontdata[id] = tfmdata + -- chardata [id] = characters + -- quaddata [id] = parameters and parameters.quad or 0 + -- xheightdata[id] = parameters and parameters.xheight or 0 + -- + tfmdata.mathconstants = tfmdata.mathconstants or tfmdata.MathMonstants + -- + parameters.xheight = parameters.xheight or parameters.x_height + parameters.extraspace = parameters.extraspace or parameters.extra_space + parameters.spacestretch = parameters.spacestretch or parameters.space_stretch + parameters.spaceshrink = parameters.spaceshrink or parameters.space_shrink + end + end +end + +-- End of overload. --[[ldx-- <p>So far we haven't really dealt with features (or whatever we want @@ -71,7 +167,7 @@ local function predefined(specification) return specification end -definers.registersplit("@", predefined) +definers.registersplit("@", predefined,"virtual") storage.register("fonts/setups" , setups , "fonts.definers.specifiers.contextsetups" ) storage.register("fonts/numbers", numbers, "fonts.definers.specifiers.contextnumbers") @@ -319,7 +415,7 @@ local function starred(features) -- no longer fallbacks here return features end -definers.registersplit('*',starred) +definers.registersplit('*',starred,"featureset") -- define (two steps) @@ -428,6 +524,10 @@ function definers.stage_two(global,cs,str,size,classfeatures,fontfeatures,classf specification.fallbacks = classfallbacks end local tfmdata = definers.read(specification,size) -- id not yet known + local cs = specification.cs + if cs then + fonts.csnames[cs] = tfmdata -- new (beware: locals can be forgotten) + end if not tfmdata then report_define("unable to define %s as \\%s",name,cs) texsetcount("global","lastfontid",-1) @@ -445,7 +545,7 @@ function definers.stage_two(global,cs,str,size,classfeatures,fontfeatures,classf local id = font.define(tfmdata) -- print(name,os.clock()-t) tfmdata.id = id - definers.register(tfmdata,id) + definers.register(tfmdata,id) -- to be sure, normally already done tex.definefont(global,cs,id) tfm.cleanuptable(tfmdata) if trace_defining then @@ -487,7 +587,7 @@ function definers.define(specification) specification.specification = "" -- not used specification.resolved = "" specification.forced = "" - specification.features = { } -- via detail + specification.features = { } -- via detail, maybe some day -- -- we don't care about mathsize textsize goodies fallbacks -- @@ -848,6 +948,10 @@ function fonts.definetypeface(name,t) context.dofastdefinetypeface(name, shortcut, shape, size, settings) end -function fonts.current(id) -- todo: also handle name +function fonts.current() -- todo: also handle name return fontdata[currentfont()] or fontdata[0] end + +function fonts.currentid() + return currentfont() or 0 +end diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua index 2f530f022..b9d8c403b 100644 --- a/tex/context/base/font-def.lua +++ b/tex/context/base/font-def.lua @@ -6,7 +6,8 @@ if not modules then modules = { } end modules ['font-def'] = { license = "see context related readme files" } -local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower +local concat = table.concat +local format, gmatch, match, find, lower, gsub = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub local tostring, next = tostring, next local lpegmatch = lpeg.match @@ -29,13 +30,11 @@ default loader that only handles <l n='tfm'/>.</p> local fonts = fonts local tfm = fonts.tfm local vf = fonts.vf -local fontcsnames = fonts.csnames fonts.used = allocate() tfm.readers = tfm.readers or { } tfm.fonts = allocate() -tfm.internalized = allocate() -- internal tex numbers local readers = tfm.readers local sequence = allocate { 'otf', 'ttf', 'afm', 'tfm' } @@ -125,9 +124,12 @@ end definers.getspecification = getspecification -function definers.registersplit(symbol,action) +function definers.registersplit(symbol,action,verbosename) addspecifier(symbol) variants[symbol] = action + if verbosename then + variants[verbosename] = action + end end function definers.makespecification(specification, lookup, name, sub, method, detail, size) @@ -338,7 +340,8 @@ function tfm.read(specification) if not tfmtable then local forced = specification.forced or "" if forced ~= "" then - tfmtable = readers[lower(forced)](specification) + local reader = readers[lower(forced)] + tfmtable = reader and reader(specification) if not tfmtable then report_define("forced type %s of %s not found",forced,specification.name) end @@ -391,17 +394,17 @@ function tfm.readanddefine(name,size) -- no id local hash = tfm.hashinstance(specification) local id = definers.registered(hash) if not id then - local fontdata = tfm.read(specification) - if fontdata then - fontdata.hash = hash - id = font.define(fontdata) - definers.register(fontdata,id) - tfm.cleanuptable(fontdata) + local tfmdata = tfm.read(specification) + if tfmdata then + tfmdata.hash = hash + id = font.define(tfmdata) + definers.register(tfmdata,id) + tfm.cleanuptable(tfmdata) else id = 0 -- signal end end - return fonts.ids[id], id + return fonts.identifiers[id], id end --[[ldx-- @@ -489,6 +492,16 @@ function readers.afm(specification,method) return tfmtable end +function readers.pfb(specification,method) -- only called when forced + local original = specification.specification + if trace_loading then + report_afm("using afm reader for '%s'",original) + end + specification.specification = gsub(original,"%.pfb",".afm") + specification.forced = "afm" + return readers.afm(specification,method) +end + -- maybe some day a set of names local function check_otf(forced,specification,suffix,what) @@ -568,31 +581,29 @@ not gain much. By the way, passing id's back to in the callback was introduced later in the development.</p> --ldx]]-- -local lastdefined = nil -- we don't want this one to end up in s-tra-02 +local lastdefined = nil -- we don't want this one to end up in s-tra-02 +local internalized = { } function definers.current() -- or maybe current return lastdefined end -function definers.register(fontdata,id) - if fontdata and id then - local hash = fontdata.hash - if not tfm.internalized[hash] then +function definers.register(tfmdata,id) -- will be overloaded + if tfmdata and id then + local hash = tfmdata.hash + if not internalized[hash] then if trace_defining then - report_define("loading at 2 id %s, hash: %s",id or "?",hash or "?") + report_define("registering font, id: %s, hash: %s",id or "?",hash or "?") end - fonts.identifiers[id] = fontdata - fonts.characters [id] = fontdata.characters - fonts.quads [id] = fontdata.parameters and fontdata.parameters.quad - -- todo: extra functions, e.g. setdigitwidth etc in list - tfm.internalized[hash] = id + fonts.identifiers[id] = tfmdata + internalized[hash] = id end end end -function definers.registered(hash) - local id = tfm.internalized[hash] - return id, id and fonts.ids[id] +function definers.registered(hash) -- will be overloaded + local id = internalized[hash] + return id, id and fonts.identifiers[id] end local cache_them = false @@ -625,49 +636,45 @@ function definers.read(specification,size,id) -- id can be optional, name can al specification = definers.resolve(specification) local hash = tfm.hashinstance(specification) if cache_them then - local fontdata = containers.read(fonts.cache,hash) -- for tracing purposes + local tfmdata = containers.read(fonts.cache,hash) -- for tracing purposes end - local fontdata = definers.registered(hash) -- id - if not fontdata then + local tfmdata = definers.registered(hash) -- id + if not tfmdata then if specification.features.vtf and specification.features.vtf.preset then - fontdata = tfm.make(specification) + tfmdata = tfm.make(specification) else - fontdata = tfm.read(specification) - if fontdata then - tfm.checkvirtualid(fontdata) + tfmdata = tfm.read(specification) + if tfmdata then + tfm.checkvirtualid(tfmdata) end end if cache_them then - fontdata = containers.write(fonts.cache,hash,fontdata) -- for tracing purposes + tfmdata = containers.write(fonts.cache,hash,tfmdata) -- for tracing purposes end - if fontdata then - fontdata.hash = hash - fontdata.cache = "no" + if tfmdata then + tfmdata.hash = hash + tfmdata.cache = "no" if id then - definers.register(fontdata,id) + definers.register(tfmdata,id) end end end - lastdefined = fontdata or id -- todo ! ! ! ! ! - if not fontdata then -- or id? + lastdefined = tfmdata or id -- todo ! ! ! ! ! + if not tfmdata then -- or id? report_define( "unknown font %s, loading aborted",specification.name) - elseif trace_defining and type(fontdata) == "table" then + elseif trace_defining and type(tfmdata) == "table" then report_define("using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s", - fontdata.type or "unknown", - id or "?", - fontdata.name or "?", - fontdata.size or "default", - fontdata.encodingbytes or "?", - fontdata.encodingname or "unicode", - fontdata.fullname or "?", - file.basename(fontdata.filename or "?")) - end - local cs = specification.cs - if cs then - fontcsnames[cs] = fontdata -- new (beware: locals can be forgotten) + tfmdata.type or "unknown", + id or "?", + tfmdata.name or "?", + tfmdata.size or "default", + tfmdata.encodingbytes or "?", + tfmdata.encodingname or "unicode", + tfmdata.fullname or "?", + file.basename(tfmdata.filename or "?")) end statistics.stoptiming(fonts) - return fontdata + return tfmdata end function vf.find(name) @@ -698,4 +705,4 @@ end --ldx]]-- callbacks.register('define_font' , definers.read, "definition of fonts (tfmtable preparation)") -callbacks.register('find_vf_file', vf.find , "locating virtual fonts, insofar needed") -- not that relevant any more +callbacks.register('find_vf_file', vf.find, "locating virtual fonts, insofar needed") -- not that relevant any more diff --git a/tex/context/base/font-dum.lua b/tex/context/base/font-dum.lua index 14d155aba..dac820274 100644 --- a/tex/context/base/font-dum.lua +++ b/tex/context/base/font-dum.lua @@ -275,7 +275,7 @@ end -- bonus function fonts.otf.nametoslot(name) - local tfmdata = fonts.ids[font.current()] + local tfmdata = fonts.identifiers[font.current()] if tfmdata and tfmdata.shared then local otfdata = tfmdata.shared.otfdata local unicode = otfdata.luatex.unicodes[name] diff --git a/tex/context/base/font-ext.lua b/tex/context/base/font-ext.lua index c17516653..16665d373 100644 --- a/tex/context/base/font-ext.lua +++ b/tex/context/base/font-ext.lua @@ -590,7 +590,7 @@ initializers.node.afm.extend = initializers.common.extend -- historic stuff, move from font-ota local delete_node = nodes.delete -local fontdata = fonts.ids +local fontdata = fonts.identifiers local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph diff --git a/tex/context/base/font-gds.lua b/tex/context/base/font-gds.lua index f18f8b395..ac83a611c 100644 --- a/tex/context/base/font-gds.lua +++ b/tex/context/base/font-gds.lua @@ -210,7 +210,7 @@ local function setcolorscheme(tfmdata,scheme) tfmdata.colorscheme = false end -local fontdata = fonts.ids +local fontdata = fonts.identifiers local fcs = fonts.colors.set local has_attribute = node.has_attribute local traverse_id = node.traverse_id diff --git a/tex/context/base/font-ini.lua b/tex/context/base/font-ini.lua index 6082c1d1d..eb741f0f7 100644 --- a/tex/context/base/font-ini.lua +++ b/tex/context/base/font-ini.lua @@ -25,14 +25,18 @@ fontloader.totable = fontloader.to_table fonts = fonts or { } --- we will also have des and fam hashes +-- beware, some already defined --- beware, soem alreadyu defined +fonts.identifiers = mark(fonts.identifiers or { }) -- fontdata +-----.characters = mark(fonts.characters or { }) -- chardata +-----.csnames = mark(fonts.csnames or { }) -- namedata +-----.quads = mark(fonts.quads or { }) -- quaddata -fonts.ids = mark(fonts.ids or { }) fonts.identifiers = fonts.ids -- aka fontdata -fonts.chr = mark(fonts.chr or { }) fonts.characters = fonts.chr -- aka chardata -fonts.qua = mark(fonts.qua or { }) fonts.quads = fonts.qua -- aka quaddata -fonts.css = mark(fonts.css or { }) fonts.csnames = fonts.css -- aka namedata +--~ fonts.identifiers[0] = { -- nullfont +--~ characters = { }, +--~ descriptions = { }, +--~ name = "nullfont", +--~ } fonts.tfm = fonts.tfm or { } fonts.vf = fonts.vf or { } @@ -41,15 +45,7 @@ fonts.pfb = fonts.pfb or { } fonts.otf = fonts.otf or { } fonts.privateoffset = 0xF0000 -- 0x10FFFF -fonts.verbose = false -- more verbose cache tables - -fonts.ids[0] = { -- nullfont - characters = { }, - descriptions = { }, - name = "nullfont", -} - -fonts.chr[0] = { } +fonts.verbose = false -- more verbose cache tables (will move to context namespace) fonts.methods = fonts.methods or { base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }, diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv index 79e5529ff..b99d44545 100644 --- a/tex/context/base/font-ini.mkiv +++ b/tex/context/base/font-ini.mkiv @@ -79,7 +79,7 @@ \registerctxluafile{font-oth}{1.001} % otf helpers \registerctxluafile{font-vf} {1.001} \registerctxluafile{font-def}{1.001} -\registerctxluafile{font-ctx}{1.001} +\registerctxluafile{font-ctx}{1.001} % after def as it overloads \registerctxluafile{font-xtx}{1.001} \registerctxluafile{font-gds}{1.001} \registerctxluafile{font-fbk}{1.001} @@ -4050,7 +4050,7 @@ % \startluacode % function commands.doifelsecurrentfonthasfeature(name) -% local f = fonts.ids[font.current()] +% local f = fonts.identifiers[font.current()] % f = f and f.shared % f = f and f.otfdata % f = f and f.luatex diff --git a/tex/context/base/font-ota.lua b/tex/context/base/font-ota.lua index 18b0bf2d8..f972d289f 100644 --- a/tex/context/base/font-ota.lua +++ b/tex/context/base/font-ota.lua @@ -40,7 +40,7 @@ local has_attribute = node.has_attribute local traverse_id = node.traverse_id local traverse_node_list = node.traverse -local fontdata = fonts.ids +local fontdata = fonts.identifiers local state = attributes.private('state') local categories = characters and characters.categories or { } -- sorry, only in context diff --git a/tex/context/base/font-otd.lua b/tex/context/base/font-otd.lua index 910725a9f..4d078017a 100644 --- a/tex/context/base/font-otd.lua +++ b/tex/context/base/font-otd.lua @@ -12,7 +12,7 @@ local report_otf = logs.new("load otf") local fonts = fonts local otf = fonts.otf -local fontdata = fonts.ids +local fontdata = fonts.identifiers otf.features = otf.features or { } otf.features.default = otf.features.default or { } diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 25bccfa29..922574ed2 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -42,7 +42,7 @@ fonts.otf = fonts.otf or { } local otf = fonts.otf local tfm = fonts.tfm -local fontdata = fonts.ids +local fontdata = fonts.identifiers local chardata = characters and characters.data -- not used otf.features = otf.features or { } @@ -1392,7 +1392,7 @@ actions["check metadata"] = function(data,filename,raw) data.map = nil end -local private_math_parameters = { +local private_mathparameters = { "FractionDelimiterSize", "FractionDelimiterDisplayStyleSize", } @@ -1400,8 +1400,8 @@ local private_math_parameters = { actions["check math parameters"] = function(data,filename,raw) local mathdata = data.metadata.math if mathdata then - for m=1,#private_math_parameters do - local pmp = private_math_parameters[m] + for m=1,#private_mathparameters do + local pmp = private_mathparameters[m] if not mathdata[pmp] then if trace_loading then report_otf("setting math parameter '%s' to 0", pmp) @@ -1614,7 +1614,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th local unicodes = luatex.unicodes -- names to unicodes local indices = luatex.indices local mode = data.mode or "base" - local characters, parameters, math_parameters, descriptions = { }, { }, { }, { } + local characters, parameters, mathparameters, descriptions = { }, { }, { }, { } local designsize = metadata.designsize or metadata.design_size or 100 if designsize == 0 then designsize = 100 @@ -1629,7 +1629,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th if metadata.math then -- parameters for name, value in next, metadata.math do - math_parameters[name] = value + mathparameters[name] = value end -- we could use a subset for u, char in next, characters do @@ -1744,7 +1744,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th return { characters = characters, parameters = parameters, - math_parameters = math_parameters, + mathparameters = mathparameters, descriptions = descriptions, indices = indices, unicodes = unicodes, diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua index ec246d20d..41169618f 100644 --- a/tex/context/base/font-otn.lua +++ b/tex/context/base/font-otn.lua @@ -211,7 +211,7 @@ local markonce = true local cursonce = true local kernonce = true -local fontdata = fonts.ids +local fontdata = fonts.identifiers otf.features.process = { } diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua index e8b24270b..4c5e668e1 100644 --- a/tex/context/base/font-tfm.lua +++ b/tex/context/base/font-tfm.lua @@ -38,7 +38,7 @@ fonts.initializers.common = fonts.initializers.common or { } local set_attribute = node.set_attribute -local fontdata = fonts.ids +local fontdata = fonts.identifiers local nodecodes = nodes.nodecodes local disc_code = nodecodes.disc @@ -304,7 +304,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid) end -- status local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized - local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil) + local hasmath = (tfmtable.mathparameters ~= nil and next(tfmtable.mathparameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil) local nodemode = tfmtable.mode == "node" local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude local hasitalic = tfmtable.has_italic @@ -330,7 +330,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid) t.fonts = table.fastcopy(tfmtable.fonts) -- hm also at the end end local tp = t.parameters - local mp = t.math_parameters + local mp = t.mathparameters local tfmp = tfmtable.parameters -- let's check for indexes -- tp.slant = (tfmp.slant or tfmp[1] or 0) diff --git a/tex/context/base/font-xtx.lua b/tex/context/base/font-xtx.lua index 5e9fea12f..505e08583 100644 --- a/tex/context/base/font-xtx.lua +++ b/tex/context/base/font-xtx.lua @@ -97,4 +97,4 @@ local function colonized(specification) -- xetex mode return specification end -definers.registersplit(":",colonized) +definers.registersplit(":",colonized,"cryptic") diff --git a/tex/context/base/java-ini.mkiv b/tex/context/base/java-ini.mkiv index 23379c357..a26c562b4 100644 --- a/tex/context/base/java-ini.mkiv +++ b/tex/context/base/java-ini.mkiv @@ -146,9 +146,8 @@ {\ifcsname\c!file\f!javascriptprefix#1\endcsname \else \startnointerference \letgvalueempty{\c!file\f!javascriptprefix#1}% - \makeshortfilename[\f!javascriptprefix#1]% \startreadingfile - \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing + \readsysfile{\truefilename{\f!javascriptprefix#1}}{\showmessage\m!javascript1{#1}}\donothing \stopreadingfile \stopnointerference \fi}} diff --git a/tex/context/base/l-dimen.lua b/tex/context/base/l-dimen.lua index cb97e35f6..0d77d13d3 100644 --- a/tex/context/base/l-dimen.lua +++ b/tex/context/base/l-dimen.lua @@ -325,7 +325,7 @@ yet be available.</p> --ldx]]-- function dimensions.texify() -- todo: % - local fti, fc = fonts and fonts.ids and fonts.ids, font and font.current + local fti, fc = fonts and fonts.identifiers, font and font.current if fti and fc then dimenfactors["ex"] = function() return fti[fc()].ex_height end dimenfactors["em"] = function() return fti[fc()].quad end diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua index 264b6a286..a2c461190 100644 --- a/tex/context/base/l-file.lua +++ b/tex/context/base/l-file.lua @@ -418,3 +418,10 @@ end --~ return (gsub(currentdir(),"\\","/")) --~ end --~ end + +-- for myself: + +function file.strip(name,dir) + local b, a = match(name,"^(.-)" .. dir .. "(.*)$") + return a ~= "" and a or name +end diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua index 4eb601432..00b55d622 100644 --- a/tex/context/base/l-lpeg.lua +++ b/tex/context/base/l-lpeg.lua @@ -106,11 +106,6 @@ end patterns.textline = content ---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more ---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more ---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps ---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps - local splitters_s, splitters_m = { }, { } local function splitat(separator,single) @@ -132,6 +127,11 @@ end lpeg.splitat = splitat +--~ local p = splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more +--~ local p = splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more +--~ local p = splitat("->",false) print(match(p,"oeps")) -- oeps +--~ local p = splitat("->",true) print(match(p,"oeps")) -- oeps + local cache = { } function lpeg.split(separator,str) diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua index fcb330506..f2e3be8ec 100644 --- a/tex/context/base/lpdf-ano.lua +++ b/tex/context/base/lpdf-ano.lua @@ -201,7 +201,7 @@ local function pdfaction(actions) what = what(a,actions) end if what then - action.next = what + action.Next = what action = what else -- error diff --git a/tex/context/base/lpdf-fld.lua b/tex/context/base/lpdf-fld.lua index 9e49e0098..969383595 100644 --- a/tex/context/base/lpdf-fld.lua +++ b/tex/context/base/lpdf-fld.lua @@ -361,7 +361,7 @@ end local function fieldlayer(specification) -- we can move this in line local layer = specification.layer - return (layer and lpdf.layerreferences[layer]) or nil + return (layer and lpdf.layerreference(layer)) or nil end -- defining diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua index 4b7972abe..29dc1bfbc 100644 --- a/tex/context/base/lpdf-ini.lua +++ b/tex/context/base/lpdf-ini.lua @@ -328,7 +328,7 @@ local function pdfverbose(t) -- maybe check for type return setmetatable({ t or "" },mt_v) end -lpdf.stream = pdfstream +lpdf.stream = pdfstream -- THIS WILL PROBABLY CHANGE lpdf.dictionary = pdfdictionary lpdf.array = pdfarray lpdf.string = pdfstring diff --git a/tex/context/base/lpdf-ren.lua b/tex/context/base/lpdf-ren.lua index 6cc00fc3e..404c45e11 100644 --- a/tex/context/base/lpdf-ren.lua +++ b/tex/context/base/lpdf-ren.lua @@ -42,20 +42,26 @@ local pdf_setocgstate = pdfconstant("SetOCGState") local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = pdfconstant("OFF") } } +-- We can have references to layers before they are places, for instance from +-- hide and vide actions. This is why we need to be able to force usage of layers +-- at several moments. + local pdfln, pdfld = { }, { } local textlayers, hidelayers, videlayers = pdfarray(), pdfarray(), pdfarray() -local pagelayers = pdfdictionary() - -lpdf.layerreferences = pdfln - -function backends.pdf.layerreference(name) - return pdfln[name] -end - local pagelayers, pagelayersreference, cache = nil, nil, { } +local specifications = { } + function codeinjections.defineviewerlayer(specification) if viewerlayers.supported and textlayers then + specifications[specification.tag] = specification + end +end + +local function useviewerlayer(name) + local specification = specifications[name] + if specification then + specifications[name] = nil -- or not if not pagelayers then pagelayers = pdfdictionary() pagelayersreference = pdfreserveobject() @@ -90,6 +96,20 @@ function codeinjections.defineviewerlayer(specification) end end +codeinjections.useviewerlayer = useviewerlayer + +local function layerreference(name) + local r = pdfln[name] + if r then + return r + else + useviewerlayer(name) + return pdfln[name] + end +end + +lpdf.layerreference = layerreference -- also triggered when a hide or vide happens + local function flushtextlayers() if viewerlayers.supported then if pagelayers then @@ -130,7 +150,7 @@ local function setlayer(what,arguments) arguments = (type(arguments) == "table" and arguments) or settings_to_array(arguments) local state = pdfarray { what } for i=1,#arguments do - local p = pdfln[arguments[i]] + local p = layerreference(arguments[i]) if p then state[#state+1] = p end @@ -141,9 +161,9 @@ local function setlayer(what,arguments) } end -function executers.hidelayer (arguments) setlayer(pdf_off, arguments) end -function executers.videlayer (arguments) setlayer(pdf_on, arguments) end -function executers.togglelayer(arguments) setlayer(pdf_toggle,arguments) end +function executers.hidelayer (arguments) return setlayer(pdf_off, arguments) end +function executers.videlayer (arguments) return setlayer(pdf_on, arguments) end +function executers.togglelayer(arguments) return setlayer(pdf_toggle,arguments) end -- transitions diff --git a/tex/context/base/lpdf-swf.lua b/tex/context/base/lpdf-swf.lua index a55ad9d1b..2d26a6867 100644 --- a/tex/context/base/lpdf-swf.lua +++ b/tex/context/base/lpdf-swf.lua @@ -26,6 +26,8 @@ local pdfimmediateobject = lpdf.immediateobject local codeinjections = backends.pdf.codeinjections local nodeinjections = backends.pdf.nodeinjections +local pdfannotation_node = nodes.pool.pdfannotation + local function insertswf(spec) local width, height, filename = spec.width, spec.height, spec.foundname @@ -124,5 +126,5 @@ function backends.pdf.nodeinjections.insertswf(spec) -- controls = spec.controls, -- label = spec.label, } - node.write(pdfannotation(spec.width,spec.height,0,annotation())) + node.write(pdfannotation_node(spec.width,spec.height,0,annotation())) end diff --git a/tex/context/base/lpdf-u3d.lua b/tex/context/base/lpdf-u3d.lua index dc0f6f43f..44e568ee1 100644 --- a/tex/context/base/lpdf-u3d.lua +++ b/tex/context/base/lpdf-u3d.lua @@ -18,20 +18,22 @@ local cos, sin, sqrt, pi, atan2, abs = math.cos, math.sin, math.sqrt, math.pi, m local backends, lpdf = backends, lpdf -local nodeinjections = backends.pdf.nodeinjections +local nodeinjections = backends.pdf.nodeinjections -local pdfconstant = lpdf.constant -local pdfboolean = lpdf.boolean -local pdfnumber = lpdf.number -local pdfunicode = lpdf.unicode -local pdfdictionary = lpdf.dictionary -local pdfarray = lpdf.array -local pdfnull = lpdf.null -local pdfreference = lpdf.reference -local pdfimmediateobject = lpdf.immediateobject +local pdfconstant = lpdf.constant +local pdfboolean = lpdf.boolean +local pdfnumber = lpdf.number +local pdfunicode = lpdf.unicode +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfnull = lpdf.null +local pdfreference = lpdf.reference +local pdfimmediateobject = lpdf.immediateobject -local checkedkey = lpdf.checkedkey -local limited = lpdf.limited +local checkedkey = lpdf.checkedkey +local limited = lpdf.limited + +local pdfannotation_node = nodes.pool.pdfannotation local schemes = table.tohash { "Artwork", "None", "White", "Day", "Night", "Hard", @@ -486,5 +488,5 @@ function nodeinjections.insertu3d(spec) controls = spec.controls, label = spec.label, } - node.write(pdfannotation(spec.width,spec.height,0,annotation())) + node.write(pdfannotation_node(spec.width,spec.height,0,annotation())) end diff --git a/tex/context/base/luat-cnf.lua b/tex/context/base/luat-cnf.lua index 2ab97e71d..609dc412b 100644 --- a/tex/context/base/luat-cnf.lua +++ b/tex/context/base/luat-cnf.lua @@ -17,37 +17,35 @@ texconfig.shell_escape = 't' luatex = luatex or { } local luatex = luatex -local variablenames = allocate { -- most of this becomes obsolete - 'buf_size', -- 3000 - 'dvi_buf_size', -- 16384 - 'error_line', -- 79 - 'expand_depth', -- 10000 - 'half_error_line', -- 50 - 'hash_extra', -- 0 - 'nest_size', -- 50 - 'max_in_open', -- 15 - 'max_print_line', -- 79 - 'max_strings', -- 15000 - 'param_size', -- 60 - 'pk_dpi', -- 72 - 'save_size', -- 4000 - 'stack_size', -- 300 - 'strings_free', -- 100 -} - -local function initialize() - local t, variable = allocate(), resolvers.variable - for i=1,#variablenames do - local name = variablenames[i] - local value = variable(name) - value = tonumber(value) or value - texconfig[name], t[name] = value, value - end - initialize = nil - return t -end - -luatex.variables = initialize() +texconfig.error_line = 79 -- 79 -- obsolete +texconfig.half_error_line = 50 -- 50 -- obsolete + +texconfig.expand_depth = 10000 -- 10000 +texconfig.hash_extra = 100000 -- 0 +texconfig.nest_size = 1000 -- 50 +texconfig.max_in_open = 500 -- 15 +texconfig.max_print_line = 10000 -- 79 +texconfig.max_strings = 500000 -- 15000 +texconfig.param_size = 25000 -- 60 +texconfig.save_size = 50000 -- 4000 +texconfig.stack_size = 10000 -- 300 + +--~ local function initialize() +--~ local t, variable = allocate(), resolvers.variable +--~ for name, default in next, variablenames do +--~ local name = variablenames[i] +--~ local value = variable(name) +--~ value = tonumber(value) +--~ if not value or value == "" or value == 0 then +--~ value = default +--~ end +--~ texconfig[name], t[name] = value, value +--~ end +--~ initialize = nil +--~ return t +--~ end + +--~ luatex.variables = initialize() local stub = [[ @@ -151,6 +149,14 @@ end) -- done, from now on input and callbacks are internal ]] + +local variablenames = { + "error_line", "half_error_line", + "expand_depth", "hash_extra", "nest_size", + "max_in_open", "max_print_line", "max_strings", + "param_size", "save_size", "stack_size", +} + local function makestub() name = name or (environment.jobname .. ".lui") firsttable = firsttable or lua.firstbytecode diff --git a/tex/context/base/luat-exe.lua b/tex/context/base/luat-exe.lua index e7f319e9c..fe7968896 100644 --- a/tex/context/base/luat-exe.lua +++ b/tex/context/base/luat-exe.lua @@ -13,7 +13,7 @@ local concat = table.concat local report_executers = logs.new("executers") -resolvers.executers = resolver.executers or { } +resolvers.executers = resolvers.executers or { } local executers = resolvers.executers local permitted = { } @@ -29,7 +29,7 @@ local function register(...) end local function finalize() -- todo: os.exec, todo: report ipv print - execute = function execute(...) + execute = function(...) -- todo: make more clever first split local t, name, arguments = { ... }, "", "" local one = t[1] @@ -68,9 +68,12 @@ executers.finalize = function(...) finalize(...) end executers.register = function(...) register(...) end executers.execute = function(...) execute (...) end +local execution_mode directives.register("system.executionmode", function(v) execution_mode = v end) +local execution_list directives.register("system.executionlist", function(v) execution_list = v end) + function executers.check() - local mode = resolvers.variable("command_mode") - local list = resolvers.variable("command_list") + local mode = execution_mode or resolvers.variable("command_mode") -- or ... will become obsolete + local list = execution_list or resolvers.variable("command_list") -- or ... will become obsolete if mode == "none" then finalize() elseif mode == "list" and list ~= "" then diff --git a/tex/context/base/luat-iop.lua b/tex/context/base/luat-iop.lua index 6642a2383..091639de2 100644 --- a/tex/context/base/luat-iop.lua +++ b/tex/context/base/luat-iop.lua @@ -133,10 +133,12 @@ function ioout.modes.handy() o_permit('[^/]') end +local input_mode directives.register("system.inputmode", function(v) input_mode = v end) +local output_mode directives.register("system.outputmode", function(v) output_mode = v end) function io.checkopeners() - local inp = resolvers.variable("input_mode") - local out = resolvers.variable("output_mode") + local inp = input_mode or resolvers.variable("input_mode") -- or ... will become obsolete + local out = output_mode or resolvers.variable("output_mode") -- or ... will become obsolete inp = inp and ioinp.modes[inp] out = out and ioinp.modes[out] if inp then inp() end diff --git a/tex/context/base/m-chart.mkii b/tex/context/base/m-chart.mkii index 2554fa2d4..bddd435ef 100644 --- a/tex/context/base/m-chart.mkii +++ b/tex/context/base/m-chart.mkii @@ -11,10 +11,1277 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D The \XML\ interface: +% 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}}% + \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} + {\ExpandBothAfter\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 + \ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWlines} + {\chardef\FLOWstate0 } + {\ExpandBothAfter\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 + \ExpandBothAfter\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}}} + +%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.]} + +%D The \XML\ interface: + \startXMLdefinitions flowchart \defineXMLargument [flowchartdefinition] diff --git a/tex/context/base/m-chart.mkiv b/tex/context/base/m-chart.mkiv index 4c008a5ee..e55a8c942 100644 --- a/tex/context/base/m-chart.mkiv +++ b/tex/context/base/m-chart.mkiv @@ -11,10 +11,2547 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D The \XML\ interface: +%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}}% + \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} + {\ExpandBothAfter\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 + \ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWlines} + {\chardef\FLOWstate0 } + {\ExpandBothAfter\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 + \ExpandBothAfter\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}}} + +%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 + +% 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}}% + \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} + {\ExpandBothAfter\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 + \ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWlines} + {\chardef\FLOWstate0 } + {\ExpandBothAfter\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 + \ExpandBothAfter\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}}} + +%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.]} + \writestatus\m!systems{The chart mkiv xml interface is not yet defined!} \protect \endinput diff --git a/tex/context/base/m-chart.tex b/tex/context/base/m-chart.tex index 5ccf4c2ad..c4e279d54 100644 --- a/tex/context/base/m-chart.tex +++ b/tex/context/base/m-chart.tex @@ -11,1274 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% 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}}% - \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} - {\ExpandBothAfter\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 - \ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWlines} - {\chardef\FLOWstate0 } - {\ExpandBothAfter\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 - \ExpandBothAfter\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}}} - -%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.]} +%D This file will become obsolete. \loadmarkfile{m-chart} diff --git a/tex/context/base/m-chemic.tex b/tex/context/base/m-chemic.tex deleted file mode 100644 index 7bacf4a90..000000000 --- a/tex/context/base/m-chemic.tex +++ /dev/null @@ -1,17 +0,0 @@ -%D \module -%D [ file=ppchtex (m-chemic), -%D version=1997.03.19, -%D title=\CONTEXT\ Extra Modules, -%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX), -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}, -%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{m-chemic} - -\endinput diff --git a/tex/context/base/m-database.lua b/tex/context/base/m-database.lua index ffaafa2f3..acfa9a47a 100644 --- a/tex/context/base/m-database.lua +++ b/tex/context/base/m-database.lua @@ -31,17 +31,17 @@ function buffers.database.process(settings) else data = buffers.raw(settings.database) end -local function sprint(c,...) - tex.sprint(tex.ctxcatcodes,[[\tt\bgroup]]) - tex.sprint(tex.vrbcatcodes,...) - tex.sprint(tex.ctxcatcodes,[[\egroup\crlf]]) -end - +--~ local function sprint(c,...) +--~ tex.sprint(tex.ctxcatcodes,[[\tt\bgroup]]) +--~ tex.sprint(tex.vrbcatcodes,...) +--~ tex.sprint(tex.ctxcatcodes,[[\egroup\crlf]]) +--~ end if data and #data > 0 then local separatorchar, quotechar, commentchar = settings.separator, settings.quotechar, settings.commentchar local before, after = settings.before or "", settings.after or "" local first, last = settings.first or "", settings.last or "" local left, right = settings.left or "", settings.right or "" + local setups = settings.setups or "" local command = settings.command separatorchar = (not separatorchar and ",") or separators[separatorchar] or separatorchar local separator = type(separatorchar) == "string" and lpegS(separatorchar) or separatorchar @@ -68,18 +68,14 @@ end local result, r = { }, 0 -- we collect as this is nicer in tracing local list = lpegmatch(splitter,line) if not found then - local setups = settings.setups or "" - if setups == "" then - sprint(ctxcatcodes,"\\begingroup") - else + if setups ~= "" then sprint(ctxcatcodes,"\\begingroup\\setups[",setups,"]") end sprint(ctxcatcodes,before) - found = true end r = r + 1 ; result[r] = first for j=1,#list do - result[#result+1] = left + r = r + 1 ; result[r] = left if command == "" then r = r + 1 ; result[r] = list[j] else @@ -96,7 +92,9 @@ end end if found then sprint(ctxcatcodes,after) - sprint(ctxcatcodes,"\\endgroup") + if setups ~= "" then + sprint(ctxcatcodes,"\\endgroup") + end end else -- message diff --git a/tex/context/base/m-database.mkiv b/tex/context/base/m-database.mkiv index 21be4365a..d89185c10 100644 --- a/tex/context/base/m-database.mkiv +++ b/tex/context/base/m-database.mkiv @@ -18,7 +18,7 @@ \unprotect -\ifdefined \installparameterhandler \else \input mult-aux.mkiv \fi +% \ifdefined \installparameterhandler \else \input mult-aux.mkiv \fi \def\c!first {first} \def\c!last {last} diff --git a/tex/context/base/m-graph.mkii b/tex/context/base/m-graph.mkii index db7538e98..69d1d3d57 100644 --- a/tex/context/base/m-graph.mkii +++ b/tex/context/base/m-graph.mkii @@ -69,4 +69,163 @@ enddef ; \stopMPinclusions -\endinput +\doifnotmode {demo} {\endinput} + +%D You need to have the data files in your path, +%D otherwise the run is aborted. + +\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end} + +%D The test: + +\starttext + +\startMPpage +draw begingraph(3in,2in); + gdraw "agepop91.d"; + endgraph; +\stopMPpage + +\startMPpage +draw begingraph(3in,2in); + gdraw "agepop91.d" plot btex$\bullet$etex; + endgraph; +\stopMPpage + +\startMPpage +draw begingraph(3in,2in); + glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT); + glabel.bot(btex Age in years etex, OUT); + gdraw "agepopm.d"; + endgraph; +\stopMPpage + +\startMPpage +draw begingraph(3in,2in); + glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT); + glabel.bot(btex Age in years etex, OUT); + setrange(origin, whatever,whatever); + gdraw "agepopm.d"; + endgraph; +\stopMPpage + +\startMPpage +draw begingraph(2.3in,2in); + setcoords(log,log); + glabel.lft(btex Seconds etex,OUT); + glabel.bot(btex Matrix size etex, + OUT); + gdraw "matmul.d" dashed evenly; + glabel.ulft(btex Standard etex,8); + gdraw "matmul.d"; + glabel.lrt(btex Strassen etex,7); + endgraph; +\stopMPpage + +\startMPpage +draw begingraph(6.5cm,4.5cm); + setrange(80,0, 90,whatever); + glabel.bot(btex Year etex, OUT); + glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of} + \hbox{metric tons} \hbox{(heavy line)}}etex, OUT); + gdraw "lead.d" withpen pencircle scaled 1.5pt; + autogrid(,otick.lft); + setcoords(linear,linear); + setrange(80,0, 90,whatever); + glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic} + \hbox{meter of air} \hbox{(thin line)}}etex, OUT); + gdraw "lead.d"; + autogrid(otick.bot,otick.rt); + endgraph; +\stopMPpage + +\stoptext + +% No longer needed, since John will fix it. +% +% %D For the moment we need the following patch. Adam T. Lindsay +% %D found out that the following code produced an error: +% %D +% %D \starttyping +% %D \startMPcode +% %D draw begingraph(130mm,35mm); +% %D setrange(0,0,10,22000); +% %D glabel.lft(btex {correct 0--22000} etex rotated 90, OUT); +% %D autogrid(itick.bot,grid.lft) withcolor .75white ; +% %D endgraph; +% %D \stopMPcode +% %D +% %D \startMPcode +% %D draw begingraph(130mm,35mm); +% %D setrange(0,50,10,22000); +% %D glabel.lft(btex {wrong 50--22000} etex rotated 90, OUT); +% %D autogrid(itick.bot,grid.lft) withcolor .75white ; +% %D endgraph; +% %D \stopMPcode +% %D +% %D \startMPcode +% %D draw begingraph(130mm,35mm); +% %D setrange(0,110,10,30000); +% %D glabel.lft(btex {failed 110--22000} etex rotated 90, OUT); +% %D autogrid(itick.bot,grid.lft) withcolor .75white ; +% %D endgraph; +% %D \stopMPcode +% %D \stoptyping +% %D +% %D The bug is a rather nasty one and needs some tweaking in +% %D the low level graph code. John Hobby suggested for the +% %D moment to initialize \type {setrange} as follows: +% %D +% %D \starttyping +% %D setrange(0,0,"22000","22000") +% %D \stoptyping +% %D +% %D Folowing this suggesion, I provide the following +% %D extension: + +% def begingraph(expr w, h) = +% begingroup +% save X_, Y_, Gfin_, Gcur_, Gcbb_, Gneedgr_, Gneedfr_, Gdidsc_; +% save Gdpic_, Gppic_, Ggl_, Garw_; +% picture Gfin_, Gcur_, Gcbb_, Gdpic_, Gppic_, Ggl_[]; +% boolean Gneedgr_, Gneedfr_, Gdidsc_; +% Gfin_ = nullpicture; +% Gcur_ = nullpicture; +% Gcbb_ = nullpicture; +% X_.ctyp = Y_.ctyp = linear; +% Z_.gdim = (w,h); +% X_.sc = Y_.sc = 0; +% Gneedgr_ = true; +% Gneedfr_ = true; +% Gdidsc_ = false; +% Gdpic_ = nullpicture; +% Garw_ = 0; +% scantokens everybegingraph ; +% enddef; +% +% boolean fixsetrange ; fixsetrange := true ; +% +% vardef dosetrange(text t) = +% interim warningcheck:=0; +% save r_; r_=0; +% string r_[]s; +% for x_= +% for p_=t: if pair p_: xpart p_, ypart fi p_, endfor: +% r_[incr r_] if string x_: s fi = x_; +% if r_>2: +% Gsetr_ if r_=3: X_(Gxcvlin_) else: Y_(Gycvlin_) fi( +% r_[r_-2] if unknown r_[r_-2]: s fi, x_); +% fi +% exitif r_=4; +% endfor +% enddef; +% +% vardef setrange(text t) = +% if fixsetrange : dosetrange(0,0,20000,20000) ; fi ; +% dosetrange(t) ; +% enddef ; +% +% if unknown everybegingraph : +% string everybegingraph ; +% % everybegingraph := "setrange(0,0,20000,20000)" ; +% fi ; diff --git a/tex/context/base/m-graph.mkiv b/tex/context/base/m-graph.mkiv index c92234884..837bdf888 100644 --- a/tex/context/base/m-graph.mkiv +++ b/tex/context/base/m-graph.mkiv @@ -60,4 +60,71 @@ % enddef; \stopMPinclusions -\endinput +\doifnotmode {demo} {\endinput} + +\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end} + +%D The test: + +\starttext + +\startMPpage +draw begingraph(3in,2in); + gdraw "agepop91.d"; +endgraph; +\stopMPpage + +\startMPpage +draw begingraph(3in,2in); + gdraw "agepop91.d" plot btex$\bullet$etex; +endgraph; +\stopMPpage + +\startMPpage +draw begingraph(3in,2in); + glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT); + glabel.bot(btex Age in years etex, OUT); + gdraw "agepopm.d"; +endgraph; +\stopMPpage + +\startMPpage +draw begingraph(3in,2in); + glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT); + glabel.bot(btex Age in years etex, OUT); + setrange(origin, whatever,whatever); + gdraw "agepopm.d"; +endgraph; +\stopMPpage + +\startMPpage +draw begingraph(2.3in,2in); + setcoords(log,log); + glabel.lft(btex Seconds etex,OUT); + glabel.bot(btex Matrix size etex, + OUT); + gdraw "matmul.d" dashed evenly; + glabel.ulft(btex Standard etex,8); + gdraw "matmul.d"; + glabel.lrt(btex Strassen etex,7); +endgraph; +\stopMPpage + +\startMPpage +draw begingraph(6.5cm,4.5cm); + setrange(80,0, 90,whatever); + glabel.bot(btex Year etex, OUT); + glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of} + \hbox{metric tons} \hbox{(heavy line)}}etex, OUT); + gdraw "lead.d" withpen pencircle scaled 1.5pt; + autogrid(,otick.lft); + setcoords(linear,linear); + setrange(80,0, 90,whatever); + glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic} + \hbox{meter of air} \hbox{(thin line)}}etex, OUT); + gdraw "lead.d"; + autogrid(otick.bot,otick.rt); +endgraph; +\stopMPpage + +\stoptext diff --git a/tex/context/base/m-graph.tex b/tex/context/base/m-graph.tex deleted file mode 100644 index 6f71cca3c..000000000 --- a/tex/context/base/m-graph.tex +++ /dev/null @@ -1,175 +0,0 @@ -%D \module -%D [ file=m-graph, -%D version=2000.08.06, -%D title=\CONTEXT\ Extra Modules, -%D subtitle=\METAPOST\ graph module support, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{m-graph} - -\doifnotmode {demo} {\endinput} - -%D You need to have the data files in your path, -%D otherwise the run is aborted. - -\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end} - -%D The test: - -\starttext - -\startMPpage -draw begingraph(3in,2in); - gdraw "agepop91.d"; - endgraph; -\stopMPpage - -\startMPpage -draw begingraph(3in,2in); - gdraw "agepop91.d" plot btex$\bullet$etex; - endgraph; -\stopMPpage - -\startMPpage -draw begingraph(3in,2in); - glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT); - glabel.bot(btex Age in years etex, OUT); - gdraw "agepopm.d"; - endgraph; -\stopMPpage - -\startMPpage -draw begingraph(3in,2in); - glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT); - glabel.bot(btex Age in years etex, OUT); - setrange(origin, whatever,whatever); - gdraw "agepopm.d"; - endgraph; -\stopMPpage - -\startMPpage -draw begingraph(2.3in,2in); - setcoords(log,log); - glabel.lft(btex Seconds etex,OUT); - glabel.bot(btex Matrix size etex, - OUT); - gdraw "matmul.d" dashed evenly; - glabel.ulft(btex Standard etex,8); - gdraw "matmul.d"; - glabel.lrt(btex Strassen etex,7); - endgraph; -\stopMPpage - -\startMPpage -draw begingraph(6.5cm,4.5cm); - setrange(80,0, 90,whatever); - glabel.bot(btex Year etex, OUT); - glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of} - \hbox{metric tons} \hbox{(heavy line)}}etex, OUT); - gdraw "lead.d" withpen pencircle scaled 1.5pt; - autogrid(,otick.lft); - setcoords(linear,linear); - setrange(80,0, 90,whatever); - glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic} - \hbox{meter of air} \hbox{(thin line)}}etex, OUT); - gdraw "lead.d"; - autogrid(otick.bot,otick.rt); - endgraph; -\stopMPpage - -\stoptext - -% No longer needed, since John will fix it. -% -% %D For the moment we need the following patch. Adam T. Lindsay -% %D found out that the following code produced an error: -% %D -% %D \starttyping -% %D \startMPcode -% %D draw begingraph(130mm,35mm); -% %D setrange(0,0,10,22000); -% %D glabel.lft(btex {correct 0--22000} etex rotated 90, OUT); -% %D autogrid(itick.bot,grid.lft) withcolor .75white ; -% %D endgraph; -% %D \stopMPcode -% %D -% %D \startMPcode -% %D draw begingraph(130mm,35mm); -% %D setrange(0,50,10,22000); -% %D glabel.lft(btex {wrong 50--22000} etex rotated 90, OUT); -% %D autogrid(itick.bot,grid.lft) withcolor .75white ; -% %D endgraph; -% %D \stopMPcode -% %D -% %D \startMPcode -% %D draw begingraph(130mm,35mm); -% %D setrange(0,110,10,30000); -% %D glabel.lft(btex {failed 110--22000} etex rotated 90, OUT); -% %D autogrid(itick.bot,grid.lft) withcolor .75white ; -% %D endgraph; -% %D \stopMPcode -% %D \stoptyping -% %D -% %D The bug is a rather nasty one and needs some tweaking in -% %D the low level graph code. John Hobby suggested for the -% %D moment to initialize \type {setrange} as follows: -% %D -% %D \starttyping -% %D setrange(0,0,"22000","22000") -% %D \stoptyping -% %D -% %D Folowing this suggesion, I provide the following -% %D extension: - -% def begingraph(expr w, h) = -% begingroup -% save X_, Y_, Gfin_, Gcur_, Gcbb_, Gneedgr_, Gneedfr_, Gdidsc_; -% save Gdpic_, Gppic_, Ggl_, Garw_; -% picture Gfin_, Gcur_, Gcbb_, Gdpic_, Gppic_, Ggl_[]; -% boolean Gneedgr_, Gneedfr_, Gdidsc_; -% Gfin_ = nullpicture; -% Gcur_ = nullpicture; -% Gcbb_ = nullpicture; -% X_.ctyp = Y_.ctyp = linear; -% Z_.gdim = (w,h); -% X_.sc = Y_.sc = 0; -% Gneedgr_ = true; -% Gneedfr_ = true; -% Gdidsc_ = false; -% Gdpic_ = nullpicture; -% Garw_ = 0; -% scantokens everybegingraph ; -% enddef; -% -% boolean fixsetrange ; fixsetrange := true ; -% -% vardef dosetrange(text t) = -% interim warningcheck:=0; -% save r_; r_=0; -% string r_[]s; -% for x_= -% for p_=t: if pair p_: xpart p_, ypart fi p_, endfor: -% r_[incr r_] if string x_: s fi = x_; -% if r_>2: -% Gsetr_ if r_=3: X_(Gxcvlin_) else: Y_(Gycvlin_) fi( -% r_[r_-2] if unknown r_[r_-2]: s fi, x_); -% fi -% exitif r_=4; -% endfor -% enddef; -% -% vardef setrange(text t) = -% if fixsetrange : dosetrange(0,0,20000,20000) ; fi ; -% dosetrange(t) ; -% enddef ; -% -% if unknown everybegingraph : -% string everybegingraph ; -% % everybegingraph := "setrange(0,0,20000,20000)" ; -% fi ; diff --git a/tex/context/base/m-pstricks.tex b/tex/context/base/m-pstricks.tex deleted file mode 100644 index 28bc9f30f..000000000 --- a/tex/context/base/m-pstricks.tex +++ /dev/null @@ -1,16 +0,0 @@ -%D \module -%D [ file=m-pstricks, -%D version=1997.01.15, -%D title=\CONTEXT\ Extra Modules, -%D subtitle=\PSTRICKS\ Connections, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{m-pstricks} - -\endinput diff --git a/tex/context/base/m-punk.mkiv b/tex/context/base/m-punk.mkiv index 46225d4ea..dc7692144 100644 --- a/tex/context/base/m-punk.mkiv +++ b/tex/context/base/m-punk.mkiv @@ -19,7 +19,7 @@ \startluacode local concat = table.concat local chardata = characters.data -local fontdata = fonts.ids +local fontdata = fonts.identifiers fonts.mp = fonts.mp or { } diff --git a/tex/context/base/m-punk.tex b/tex/context/base/m-punk.tex deleted file mode 100644 index fe7ec85cc..000000000 --- a/tex/context/base/m-punk.tex +++ /dev/null @@ -1,3 +0,0 @@ -% this file will disasppear but we need it as it is still in tex live - -\loadmarkfile{m-punk} diff --git a/tex/context/base/math-ext.lua b/tex/context/base/math-ext.lua index d65f70245..428bdad0a 100644 --- a/tex/context/base/math-ext.lua +++ b/tex/context/base/math-ext.lua @@ -30,9 +30,9 @@ function extras.add(unicode,t) end function extras.copy(tfmdata) - local math_parameters = tfmdata.math_parameters + local mathparameters = tfmdata.mathparameters local MathConstants = tfmdata.MathConstants - if (math_parameters and next(math_parameters)) or (MathConstants and next(MathConstants)) then + if (mathparameters and next(mathparameters)) or (MathConstants and next(MathConstants)) then local characters = tfmdata.characters for unicode, extradesc in next, mathdata do -- always, because in an intermediate step we can have a non math font diff --git a/tex/context/base/math-ini.lua b/tex/context/base/math-ini.lua index b4f7556c6..b4716d06a 100644 --- a/tex/context/base/math-ini.lua +++ b/tex/context/base/math-ini.lua @@ -369,11 +369,11 @@ local hvars = table.tohash { } function mathematics.scaleparameters(t,tfmtable,delta,hdelta,vdelta) - local math_parameters = tfmtable.math_parameters - if math_parameters and next(math_parameters) then + local mathparameters = tfmtable.mathparameters + if mathparameters and next(mathparameters) then delta = delta or 1 hdelta, vdelta = hdelta or delta, vdelta or delta - local _, mp = mathematics.dimensions(math_parameters) + local _, mp = mathematics.dimensions(mathparameters) for name, value in next, mp do if name == "RadicalDegreeBottomRaisePercent" then mp[name] = value diff --git a/tex/context/base/math-noa.lua b/tex/context/base/math-noa.lua index 51df84e6f..e8eea1666 100644 --- a/tex/context/base/math-noa.lua +++ b/tex/context/base/math-noa.lua @@ -70,10 +70,21 @@ local left_fence_code = 1 local function process(start,what,n,parent) if n then n = n + 1 else n = 0 end while start do + local id = start.id if trace_processing then - report_noads("%s%s",rep(" ",n or 0),tostring(start)) + local margin = rep(" ",n or 0) + local detail = tostring(start) + if id == math_noad then + report_noads("%s%s (class: %s)",margin,detail,noadcodes[start.subtype] or "?") + elseif id == math_char then + local char = start.char + local fam = start.fam + local font = font_of_family(fam) + report_noads("%s%s (family: %s, font: %s, char: %s, shape: %s)",margin,detail,fam,font,char,utfchar(char)) + else + report_noads("%s%s",margin,detail) + end end - local id = start.id local proc = what[id] if proc then local done, newstart = proc(start,what,n,parent or start.prev) @@ -137,7 +148,7 @@ end local remapalphabets = mathematics.remapalphabets local fcs = fonts.colors.set --- we can have a global famdata == fonts.famdata and chrdata == fonts.chrdata +-- we can have a global famdata == fonts.famdata --~ This does not work out well, as there are no fallbacks. Ok, we could --~ define a poor mans simplify mechanism. @@ -454,6 +465,17 @@ function builders.kernel.mlist_to_hlist(head,style,penalties) return mlist_to_hlist(head,style,penalties), true end +--~ function builders.kernel.mlist_to_hlist(head,style,penalties) +--~ print("!!!!!!! BEFORE",penalties) +--~ for n in node.traverse(head) do print(n) end +--~ print("!!!!!!!") +--~ head = mlist_to_hlist(head,style,penalties) +--~ print("!!!!!!! AFTER") +--~ for n in node.traverse(head) do print(n) end +--~ print("!!!!!!!") +--~ return head, true +--~ end + tasks.new ( "math", { diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua index e222c6002..504c841fa 100644 --- a/tex/context/base/math-vfu.lua +++ b/tex/context/base/math-vfu.lua @@ -369,19 +369,21 @@ function fonts.basecopy(tfmtable,name) end local reported = { } -local reverse -- index -> unicode +local reverse = { } -- index -> unicode -function fonts.vf.math.define(specification,set) - if not reverse then - reverse = { } - for k, v in next, mathencodings do - local r = { } - for u, i in next, v do - r[i] = u - end - reverse[k] = r - end +setmetatable ( reverse, { __index = function(t,name) + if trace_virtual then + report_virtual("initializing math vector '%s'",name) end + local m, r = mathencodings[name], { } + for u, i in next, m do + r[i] = u + end + reverse[name] = r + return r +end } ) + +function fonts.vf.math.define(specification,set) local name = specification.name -- symbolic name local size = specification.size -- given size local fnt, lst, main = { }, { }, nil @@ -437,7 +439,7 @@ function fonts.vf.math.define(specification,set) end -- beware, fnt[1] is already passed to tex (we need to make a simple copy then .. todo) main = fonts.basecopy(fnt[1],name) - main.name, main.fonts, main.virtualized, main.math_parameters = name, lst, true, { } + main.name, main.fonts, main.virtualized, main.mathparameters = name, lst, true, { } local characters, descriptions = main.characters, main.descriptions local mp = main.parameters if mp then @@ -451,7 +453,7 @@ function fonts.vf.math.define(specification,set) elseif ss.optional and fonts.vf.math.optional then -- skip, redundant else - local mm, fp = main.math_parameters, fs.parameters + local mm, fp = main.mathparameters, fs.parameters if mm and fp and mp then if ss.extension then mm.math_x_height = fp.x_height or 0 -- math_x_height height of x @@ -490,7 +492,7 @@ function fonts.vf.math.define(specification,set) local offset = 0xFF000 local vector = mathencodings[vectorname] local rotcev = reverse[vectorname] - if vector then + if vector and rotcev then local fc, fd, si = fs.characters, fs.descriptions, shared[s] local skewchar = ss.skewchar for unicode, index in next, vector do @@ -658,6 +660,8 @@ function fonts.vf.math.define(specification,set) end end end + else + report_virtual("error in loading %s: problematic vector %s",name,vectorname) end end mathematics.extras.copy(main) --not needed here (yet) diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv index d1f4b422f..eec9d71be 100644 --- a/tex/context/base/meta-ini.mkiv +++ b/tex/context/base/meta-ini.mkiv @@ -840,9 +840,8 @@ \def\douseMPlibrary#1% {\ifcsname\c!file\f!metapostprefix#1\endcsname\else \letvalueempty{\c!file\f!metapostprefix#1}% - \makeshortfilename[\truefilename{\f!metapostprefix#1}]% \startreadingfile - \readsysfile\shortfilename{\showmessage\m!metapost1{#1}}\donothing + \readsysfile{\truefilename{\f!metapostprefix#1}}{\showmessage\m!metapost1{#1}}\donothing \stopreadingfile \fi} @@ -1044,8 +1043,8 @@ %D Usage: %D %D \starttyping -%D \defineproperty[one][layer][state=start] -%D \defineproperty[two][layer][state=stop] +%D \defineviewerlayer[one][state=start] +%D \defineviewerlayer[two][state=stop] %D %D \startuseMPgraphic{step-1} %D fill fullcircle scaled 10cm withcolor red ; @@ -1055,8 +1054,8 @@ %D fill fullcircle scaled 5cm withcolor green ; %D \stopuseMPgraphic %D -%D \setlayer[mp]{\property[one]{\useMPgraphic{step-1}}} -%D \setlayer[mp]{\property[two]{\useMPgraphic{step-2}}} +%D \setlayer[mp]{\viewerlayer[one]{\useMPgraphic{step-1}}} +%D \setlayer[mp]{\viewerlayer[two]{\useMPgraphic{step-2}}} %D %D \ruledhbox{\flushlayer[mp]} %D \stoptyping diff --git a/tex/context/base/mult-sys.mkiv b/tex/context/base/mult-sys.mkiv index 5b3503d98..affbee64c 100644 --- a/tex/context/base/mult-sys.mkiv +++ b/tex/context/base/mult-sys.mkiv @@ -510,6 +510,7 @@ \definesystemvariable {ep} % ExternfiguurPreset \definesystemvariable {eq} % EQalign \definesystemvariable {er} % external resources +\definesystemvariable {et} % EffecT \definesystemvariable {ex} % ExterneFiguren \definesystemvariable {fa} % font feature \definesystemvariable {fc} % FramedContent @@ -574,6 +575,7 @@ \definesystemvariable {ln} % LijNen \definesystemvariable {lo} % LOgos \definesystemvariable {lt} % LiTeratuur +\definesystemvariable {lr} % LayeR \definesystemvariable {ls} % languageScript \definesystemvariable {ly} % LaYout \definesystemvariable {ma} % MargeAchtergrond diff --git a/tex/context/base/node-aux.lua b/tex/context/base/node-aux.lua index 275e2ba43..1eb42d95e 100644 --- a/tex/context/base/node-aux.lua +++ b/tex/context/base/node-aux.lua @@ -74,6 +74,14 @@ nodes.set_attributes = set_attributes nodes.set_unset_attributes = set_unset_attributes nodes.unset_attributes = unset_attributes +nodes.setattribute = set_attribute +nodes.unsetattribute = unset_attribute +nodes.hasattribute = has_attribute + +nodes.setattributes = set_attributes +nodes.setunsetattributes = set_unset_attributes +nodes.unsetattributes = unset_attributes + -- history: -- -- local function cp_skipable(a,id) -- skipable nodes at the margins during character protrusion diff --git a/tex/context/base/node-dum.lua b/tex/context/base/node-dum.lua index b04204740..512748151 100644 --- a/tex/context/base/node-dum.lua +++ b/tex/context/base/node-dum.lua @@ -29,10 +29,6 @@ local new_node = node.new local glyph_code = nodecodes.glyph --- fonts - -local fontdata = fonts.ids or { } - function nodes.simple_font_handler(head) -- lang.hyphenate(head) head = nodes.handlers.characters(head) @@ -48,7 +44,7 @@ if tex.attribute[0] ~= 0 then texio.write_nl("log","!") texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be") texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special") - texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.") + texio.write_nl("log","! purposes so setting them at the TeX end might break the font handler.") texio.write_nl("log","!") tex.attribute[0] = 0 -- else no features @@ -59,36 +55,41 @@ nodes.handlers.protectglyphs = node.protect_glyphs nodes.handlers.unprotectglyphs = node.unprotect_glyphs function nodes.handlers.characters(head) - local usedfonts, done, prevfont = { }, false, nil - for n in traverse_id(glyph_code,head) do - local font = n.font - if font ~= prevfont then - prevfont = font - local used = usedfonts[font] - if not used then - local tfmdata = fontdata[font] - if tfmdata then - local shared = tfmdata.shared -- we need to check shared, only when same features - if shared then - local processors = shared.processes - if processors and #processors > 0 then - usedfonts[font] = processors - done = true + local fontdata = fonts.identifiers + if fontdata then + local usedfonts, done, prevfont = { }, false, nil + for n in traverse_id(glyph_code,head) do + local font = n.font + if font ~= prevfont then + prevfont = font + local used = usedfonts[font] + if not used then + local tfmdata = fontdata[font] -- + if tfmdata then + local shared = tfmdata.shared -- we need to check shared, only when same features + if shared then + local processors = shared.processes + if processors and #processors > 0 then + usedfonts[font] = processors + done = true + end end end end end end - end - if done then - for font, processors in next, usedfonts do - for i=1,#processors do - local h, d = processors[i](head,font,0) - head, done = h or head, done or d + if done then + for font, processors in next, usedfonts do + for i=1,#processors do + local h, d = processors[i](head,font,0) + head, done = h or head, done or d + end end end + return head, true + else + return head, false end - return head, true end -- helper diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua index f7668415d..5c1cc9ad5 100644 --- a/tex/context/base/node-fin.lua +++ b/tex/context/base/node-fin.lua @@ -411,7 +411,8 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in done = done or ok end end - elseif default then +--~ elseif default then + elseif default > 0 then -- elseif current > 0 then head = insert_node_before(head,stack,copy_node(nsnone)) diff --git a/tex/context/base/node-fnt.lua b/tex/context/base/node-fnt.lua index 399cd8642..2eceb5dae 100644 --- a/tex/context/base/node-fnt.lua +++ b/tex/context/base/node-fnt.lua @@ -18,16 +18,16 @@ local report_fontrun = logs.new("font run") local nodes, node = nodes, node -fonts = fonts or { } -fonts.tfm = fonts.tfm or { } -fonts.ids = fonts.ids or { } +fonts = fonts or { } +fonts.tfm = fonts.tfm or { } +fonts.identifiers = fonts.identifiers or { } local traverse_id = node.traverse_id local has_attribute = node.has_attribute local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming local nodecodes = nodes.nodecodes -local fontdata = fonts.ids +local fontdata = fonts.identifiers local handlers = nodes.handlers local glyph_code = nodecodes.glyph @@ -60,7 +60,7 @@ function handlers.characters(head) local font, attr = n.font, has_attribute(n,0) or 0 report_run("font %03i dynamic %03i glyph %s",font,attr,utf.char(n.char)) else - report_run("[%s]",node.type(n.id)) + report_run("[%s]",nodecodes[n.id]) end n = n.next end diff --git a/tex/context/base/node-inj.lua b/tex/context/base/node-inj.lua index e4380a4ea..a55ea284d 100644 --- a/tex/context/base/node-inj.lua +++ b/tex/context/base/node-inj.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['node-inj'] = { license = "see context related readme files" } --- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini) +-- tricky ... fonts.identifiers is not yet defined .. to be solved (maybe general tex ini) -- This is very experimental (this will change when we have luatex > .50 and -- a few pending thingies are available. Also, Idris needs to make a few more @@ -21,18 +21,18 @@ local report_injections = logs.new("injections") local attributes, nodes, node = attributes, nodes, node -fonts = fonts or { } -fonts.tfm = fonts.tfm or { } -fonts.ids = fonts.ids or { } +fonts = fonts or { } +fonts.tfm = fonts.tfm or { } +fonts.identifiers = fonts.identifiers or { } -nodes.injections = nodes.injections or { } -local injections = nodes.injections +nodes.injections = nodes.injections or { } +local injections = nodes.injections -local fontdata = fonts.ids -local nodecodes = nodes.nodecodes -local glyph_code = nodecodes.glyph -local nodepool = nodes.pool -local newkern = nodepool.kern +local fontdata = fonts.identifiers +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph +local nodepool = nodes.pool +local newkern = nodepool.kern local traverse_id = node.traverse_id local unset_attribute = node.unset_attribute diff --git a/tex/context/base/node-mig.mkiv b/tex/context/base/node-mig.mkiv index cd731b96f..3047ac3af 100644 --- a/tex/context/base/node-mig.mkiv +++ b/tex/context/base/node-mig.mkiv @@ -49,12 +49,13 @@ \def\automigratemarks {\the\everyautomigratemarks} \appendtoks - \let\postponenotes\relax - \enableexperiments[inserts.migrate]% + \let\postponenotes\relax + \enableexperiments[inserts.migrate]% \to \everyautomigratefootnotes \appendtoks - \enableexperiments[marks.migrate]% + \writestatus\m!systems{migration of marks is normally not needed}% + \enableexperiments[marks.migrate]% \to \everyautomigratemarks \protect diff --git a/tex/context/base/node-res.lua b/tex/context/base/node-res.lua index 0a0cd0dc1..e636abaef 100644 --- a/tex/context/base/node-res.lua +++ b/tex/context/base/node-res.lua @@ -20,7 +20,6 @@ local copy_node = node.copy local free_node = node.free local free_list = node.flush_list local new_node = node.new -local node_type = node.type nodes.pool = nodes.pool or { } local pool = nodes.pool @@ -204,7 +203,7 @@ function pool.leftmarginkern(glyph,width) if not glyph then logs.fatal("nodes","invalid pointer to left margin glyph node") elseif glyph.id ~= glyph_code then - logs.fatal("nodes","invalid node type %s for left margin glyph node",node_type(glyph)) + logs.fatal("nodes","invalid node type %s for left margin glyph node",nodecodes[glyph]) else n.glyph = glyph end @@ -219,7 +218,7 @@ function pool.rightmarginkern(glyph,width) if not glyph then logs.fatal("nodes","invalid pointer to right margin glyph node") elseif glyph.id ~= glyph_code then - logs.fatal("nodes","invalid node type %s for right margin glyph node",node_type(p)) + logs.fatal("nodes","invalid node type %s for right margin glyph node",nodecodes[p]) else n.glyph = glyph end diff --git a/tex/context/base/node-rul.lua b/tex/context/base/node-rul.lua index 51a7b4d3a..991e08d93 100644 --- a/tex/context/base/node-rul.lua +++ b/tex/context/base/node-rul.lua @@ -73,7 +73,7 @@ local hpack_nodes = node.hpack local dimenfactor = fonts.dimenfactor local texwrite = tex.write -local fontdata = fonts.ids +local fontdata = fonts.identifiers local variables = interfaces.variables local nodecodes = nodes.nodecodes diff --git a/tex/context/base/node-ser.lua b/tex/context/base/node-ser.lua index f90741aac..9c968670c 100644 --- a/tex/context/base/node-ser.lua +++ b/tex/context/base/node-ser.lua @@ -17,7 +17,6 @@ local nodes, node = nodes, node local traverse = node.traverse local node_fields = node.fields -local node_type = node.type local nodecodes = nodes.nodecodes @@ -88,7 +87,7 @@ function nodes.astable(n,sparse) -- not yet ok end end end - t.type = node_type(n.id) + t.type = nodecodes[n.id] return t end @@ -119,7 +118,7 @@ local function totable(n,flat,verbose) end end if verbose then - tt.type = node_type(tt.id) + tt.type = nodecodes[tt.id] end return tt end diff --git a/tex/context/base/node-spl.lua b/tex/context/base/node-spl.lua index a942d3cdb..e90146bf9 100644 --- a/tex/context/base/node-spl.lua +++ b/tex/context/base/node-spl.lua @@ -75,7 +75,7 @@ local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming local process_characters = nodes.handlers.characters local inject_kerns = nodes.injections.handler -local fontdata = fonts.ids +local fontdata = fonts.identifiers local parbuilders = builders.paragraphs parbuilders.solutions = parbuilders.solutions or { } diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua index d41089e6c..ff038a816 100644 --- a/tex/context/base/node-tra.lua +++ b/tex/context/base/node-tra.lua @@ -24,9 +24,12 @@ nodes = nodes or { } local fonts, nodes, node, context = fonts, nodes, node, context -fonts.tfm = fonts.tfm or { } -fonts.ids = fonts.ids or { } -fonts.chr = fonts.chr or { } +fonts.tfm = fonts.tfm or { } +fonts.identifiers = fonts.identifiers or { } +fonts.characters = fonts.characters or { } + +local fontdata = fonts.identifiers +local fontchar = fonts.characters nodes.tracers = nodes.tracers or { } local tracers = nodes.tracers @@ -49,12 +52,8 @@ local step_tracers = tracers.steppers local copy_node_list = node.copy_list local hpack_node_list = node.hpack local free_node_list = node.flush_list -local node_type = node.type local traverse_nodes = node.traverse -local fontdata = fonts.ids -local fontchar = fonts.chr - local nodecodes = nodes.nodecodes local whatcodes = nodes.whatcodes local skipcodes = nodes.skipcodes @@ -287,7 +286,7 @@ function step_tracers.codes(i,command) elseif id == whatsit_code and (c.subtype == localpar_code or c.subtype == dir_code) then context("[%s]",c.dir) else - context("[%s]",node_type(id)) + context("[%s]",nodecodes[id]) end c = c.next end @@ -371,7 +370,7 @@ function nodes.handlers.checkforleaks(sparse) local l = { } local q = node.usedlist() for p in traverse(q) do - local s = table.serialize(nodes.astable(p,sparse),node_type(p.id)) + local s = table.serialize(nodes.astable(p,sparse),nodecodes[p.id]) l[s] = (l[s] or 0) + 1 end node.flush_list(q) @@ -402,13 +401,13 @@ local function tosequence(start,stop,compact) if compact then t[#t+1] = "|" else - t[#t+1] = node_type(id) + t[#t+1] = nodecodes[id] end else if compact then t[#t+1] = "[]" else - t[#t+1] = node_type(id) + t[#t+1] = nodecodes[id] end end if start == stop then @@ -463,9 +462,9 @@ function nodes.idstostring(head,tail) last_n = last_n + 1 else if last_n > 1 then - t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?") + t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?") else - t[#t+1] = format("[%s]",node_type(last_id) or "?") + t[#t+1] = format("[%s]",nodecodes[last_id] or "?") end last_id, last_n = id, 1 end @@ -476,9 +475,9 @@ function nodes.idstostring(head,tail) if not last_id then t[#t+1] = "no nodes" elseif last_n > 1 then - t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?") + t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?") else - t[#t+1] = format("[%s]",node_type(last_id) or "?") + t[#t+1] = format("[%s]",nodecodes[last_id] or "?") end return concat(t," ") end @@ -497,9 +496,9 @@ end --~ last_n = last_n + 1 --~ else --~ if last_n > 1 then ---~ t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?") +--~ t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?") --~ else ---~ t[#t+1] = format("[%s]",node_type(last_id) or "?") +--~ t[#t+1] = format("[%s]",nodecodes[last_id] or "?") --~ end --~ last_id, last_n = id, 1 --~ end @@ -511,9 +510,9 @@ end --~ if not last_id then --~ t[#t+1] = "no nodes" --~ elseif last_n > 1 then ---~ t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?") +--~ t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?") --~ else ---~ t[#t+1] = format("[%s]",node_type(last_id) or "?") +--~ t[#t+1] = format("[%s]",nodecodes[last_id] or "?") --~ end --~ return table.concat(table.reversed(t)," ") --~ end @@ -578,54 +577,63 @@ nodes.showboxes = showboxes local threshold = 65536 -local function toutf(list,result,stopcriterium) - for n in traverse_nodes(list) do - local id = n.id - if id == glyph_code then - local components = n.components - if components then - toutf(components,result) - else - local c = n.char - local fc = fontchar[n.font] - if fc then - local u = fc[c].tounicode - if u then - for s in gmatch(u,"....") do - result[#result+1] = utfchar(tonumber(s,16)) +local function toutf(list,result,nofresult,stopcriterium) + if list then + for n in traverse_nodes(list) do + local id = n.id + if id == glyph_code then + local components = n.components + if components then + result, nofresult = toutf(components,result,nofresult) + else + local c = n.char + local fc = fontchar[n.font] + if fc then + local u = fc[c].tounicode + if u then + for s in gmatch(u,"....") do + nofresult = nofresult + 1 + result[nofresult] = utfchar(tonumber(s,16)) + end + else + nofresult = nofresult + 1 + result[nofresult] = utfchar(c) end else - result[#result+1] = utfchar(c) + nofresult = nofresult + 1 + result[nofresult] = utfchar(c) end - else - result[#result+1] = utfchar(c) + end + elseif id == disc_code then + result, nofresult = toutf(n.replace,result,nofresult) + elseif id == hlist_code or id == vlist_code then +--~ if nofresult > 0 and result[nofresult] ~= " " then +--~ nofresult = nofresult + 1 +--~ result[nofresult] = " " +--~ end + result, nofresult = toutf(n.list,result,nofresult) + elseif id == glue_code and n.subtype == userskip_code and n.spec.width > threshold then + if nofresult > 0 and result[nofresult] ~= " " then + nofresult = nofresult + 1 + result[nofresult] = " " + end + elseif id == kern_code and n.kern > threshold then + if nofresult > 0 and result[nofresult] ~= " " then + nofresult = nofresult + 1 + result[nofresult] = " " end end - elseif id == disc_code then - toutf(n.replace,result) - elseif id == hlist_code or id == vlist_code then - if #result > 0 and result[#result] ~= " " then - result[#result+1] = " " - end - toutf(n.list,result) - elseif id == glue_code and n.subtype == userskip_code and n.spec.width > threshold then - if #result > 0 and result[#result] ~= " " then - result[#result+1] = " " - end - elseif id == kern_code and n.kern > threshold then - if #result > 0 and result[#result] ~= " " then - result[#result+1] = " " + if n == stopcriterium then + break end end - if n == stopcriterium then - break - end end - return result + return result, nofresult end function nodes.toutf(list,stopcriterium) - return concat(toutf(list,{},stopcriterium)) + local result, nofresult = toutf(list,{},0,stopcriterium) + return concat(result) end -- might move elsewhere diff --git a/tex/context/base/norm-ptx.tex b/tex/context/base/norm-ptx.tex index 8f911d874..352a884f0 100644 --- a/tex/context/base/norm-ptx.tex +++ b/tex/context/base/norm-ptx.tex @@ -11,6 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D Eventually most of these will be disabled in \MKIV. + \let \normalefcode = \efcode \let \normalexpanded = \expanded \let \normalifincsname = \ifincsname diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv index 66ab776b9..1327e796b 100644 --- a/tex/context/base/page-ini.mkiv +++ b/tex/context/base/page-ini.mkiv @@ -814,6 +814,15 @@ \setuplayout[\c!method=\v!normal] +\def\docolumnpagebodymarks#1#2#3#4% first last column box + {\ifnum#3=#1\relax + \dosynchronizemarking[\number#3,\v!column:\number#3,\v!first,\v!column:\v!first][#4]% + \else\ifnum#3=#2\relax + \dosynchronizemarking[\number#3,\v!column:\number#3,\v!last, \v!column:\v!last ][#4]% + \else + \dosynchronizemarking[\number#3,\v!column:\number#3 ][#4]% + \fi\fi} + \def\buildpagebody#1#2% {\ifsavepagebody\global\setbox\savedpagebody\fi \vbox @@ -821,10 +830,11 @@ % \forgetall % igv problemen, check: \boxmaxdepth\maxdimen \boxmaxdepth\maxdimen % new \dontcomplain + % marks get done here + \dosynchronizemarking[\v!page][#2]% % the following plugin uses and sets pagebox; beware: this % will change and is for my (hh) personal experiments - \executeifdefined{\??ly\c!method\@@lymethod}% - {\getvalue{\??ly\c!method\v!normal}}#1#2% + \executeifdefined{\??ly\c!method\@@lymethod}{\getvalue{\??ly\c!method\v!normal}}#1#2% % the finishing touch \ifcase\pageornamentstate \addpagebackground \pagebox @@ -893,8 +903,7 @@ \prependtoks \let\nextbox\nestednextbox \to \everybeforepagebody \def\dopagebody#1#2% - {%\getallmarks % now in following token register - \the\everybeforepagebody + {\the\everybeforepagebody \starttextproperties % \setnextsubpageno % nog eens: als in pagina (tbv standaard opmaak) \dontshowboxes % dan hier blokkeren en verderop resetten @@ -1020,9 +1029,9 @@ \penalty-\!!tenthousand % untested ! ! \column \fi \fi} -\let\resetcurrentsectionmarks\relax - -% was: \resetsectionmarks\firstsection, zie \handlepagebreak +\ifdefined\resetcurrentstructuremarkswithpage \else + \let\resetcurrentstructuremarkswithpage\relax +\fi \def\page{\pagebreak} % the short form of \pagebreak (mult-com one) @@ -1164,20 +1173,20 @@ \installpagebreakhandler \v!left {\ejectinsert \gotonextpageX % will become \gotonextpage - \doifbothsidesoverruled{}{\resetcurrentsectionmarks\ejectdummypage}{}} + \doifbothsidesoverruled{}{\resetcurrentstructuremarkswithpage\ejectdummypage}{}} \installpagebreakhandler \v!right {\ejectinsert \gotonextpageX % will become \gotonextpage - \doifbothsidesoverruled{}{}{\resetcurrentsectionmarks\ejectdummypage}} + \doifbothsidesoverruled{}{}{\resetcurrentstructuremarkswithpage\ejectdummypage}} \installpagebreakhandler \v!even {\page - \doifoddpageelse{\resetcurrentsectionmarks\ejectdummypage}\donothing} + \doifoddpageelse{\resetcurrentstructuremarkswithpage\ejectdummypage}\donothing} \installpagebreakhandler \v!odd {\page - \doifoddpageelse\donothing{\resetcurrentsectionmarks\ejectdummypage}} + \doifoddpageelse\donothing{\resetcurrentstructuremarkswithpage\ejectdummypage}} \installpagebreakhandler \v!quadruple % not yet ok inside columnsets {\ifdoublesided diff --git a/tex/context/base/page-mak.mkiv b/tex/context/base/page-mak.mkiv index f43734230..52834b2aa 100644 --- a/tex/context/base/page-mak.mkiv +++ b/tex/context/base/page-mak.mkiv @@ -78,8 +78,6 @@ \newtoks\everymakeup -\appendtoks \postponemarks \to \everymakeup - \let\currentmakeup\empty \unexpanded\def\startmakeup @@ -109,7 +107,6 @@ \def\donostopmakeup {\egroup - \flushmarks % new, here, else empty pages \page \egroup} @@ -139,7 +136,6 @@ \makeupparameter\c!bottom \doifsomething{\makeupparameter\c!color}{\stopcolor}% \egroup - \flushmarks % new, here, else empty pages \doflushmakeup \egroup \calculatehsizes diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv index 6a1691a00..12814ffbf 100644 --- a/tex/context/base/page-mar.mkiv +++ b/tex/context/base/page-mar.mkiv @@ -688,7 +688,7 @@ \to \collectedmargintexts} \def\doflushmargincontents % plural - {\ifcase\margintextcollected\else + {\ifconditional\margintextcollected \expandafter\flushmargincontentsindeed \fi} diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv index b7efb8782..0a57b9e41 100644 --- a/tex/context/base/page-mul.mkiv +++ b/tex/context/base/page-mul.mkiv @@ -604,6 +604,8 @@ \setmaxcolumndimensions \dohandleallcolumns {\mkprocesscolumncontents\currentcolumnbox}% + \dohandleallcolumns + {\docolumnpagebodymarks\plusone\nofcolumns\mofcolumns\currentcolumnbox}% \postprocesscolumns \dohandleallcolumns % \hbox i.v.m. \showcomposition {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv index f2e11e8a0..465918449 100644 --- a/tex/context/base/page-set.mkiv +++ b/tex/context/base/page-set.mkiv @@ -133,28 +133,6 @@ %D \stoptext %D \stoptyping -% not ok yet, for column sets we need a special case: within a column we -% need to bubble-up the marks; the indirectness permits overloading here - -\let\saveOTRSETmark \refreshsavedmark -\let\bubbleOTRSETmark\bubblesavedmark -\let\resetOTRSETmark \resetsavedmark -\let\presetOTRSETmark\presetsavedmark - -\def\doregisterOTRSETmarks#1{\saveOTRSETmark [#1][\number\mofcolumns]} -\def\dobubbleOTRSETmarks #1{\bubbleOTRSETmark[#1][\number\mofcolumns]} -\def\doresetOTRSETmarks #1{\resetOTRSETmark [#1][\recurselevel]} -\def\dopresetOTRSETmarks #1{\presetOTRSETmark[#1][\recurselevel]} - -\def\registerOTRSETmarks - {\processcommacommand[\alldefinedmarks]\doregisterOTRSETmarks} -\def\bubbleOTRSETmarks - {\processcommacommand[\alldefinedmarks]\dobubbleOTRSETmarks} -\def\resetOTRSETmarks - {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\doresetOTRSETmarks}} -\def\presetOTRSETmarks - {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\dopresetOTRSETmarks}} - %D test case of Vit Zika (context list): %D %D \starttyping @@ -459,6 +437,7 @@ \vss \fi}% \wd\scratchbox\localcolumnwidth % \textwidth + \docolumnpagebodymarks{#1}{#2}\recurselevel\scratchbox \ifcase\columndirection \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox \else @@ -512,7 +491,6 @@ \def\OTRSETdoflush {\ifcollectingcontent - \registerOTRSETmarks \global\mofcolumns\plusone \else \OTRSETdofinalflush @@ -524,7 +502,6 @@ \OTRSETinitializecolumns %\OTRSETdoflushfloats \OTRSETstartnextpage -\presetOTRSETmarks \initializecolumntextareas \fi} @@ -861,9 +838,7 @@ {\OTRSETsetfreecells\mofcolumns\columnlastcell \ifsomefreecolumncells % okay - \bubbleOTRSETmarks % not robust because we reenter \else - \registerOTRSETmarks % not robust because we reenter \global\advance\mofcolumns \plusone \ifnum\mofcolumns>\nofcolumns \OTRSETdoflush @@ -1634,7 +1609,6 @@ {\increment\columnsetlevel\relax \globallet\localcolumnmaxcells\!!zerocount \global\setfalse\OTRSETfinish - \resetOTRSETmarks \ifnum\columnsetlevel=\plusone \bgroup \saveinterlinespace @@ -1762,7 +1736,6 @@ \fi \vfill \eject -\registerOTRSETmarks % brr, may result in empty page after nicely fit text % or if left, then lost of first column only text \ifnum\mofcolumns>\plusone diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv index 69ef8c270..dc516a94e 100644 --- a/tex/context/base/page-txt.mkiv +++ b/tex/context/base/page-txt.mkiv @@ -305,7 +305,8 @@ \setvalue{\??tk::\v!nomarking}#1#2% {\bgroup \resettextlinestatus#1% - \let\dogetmarking\nogetmarking + \settrue\inhibitgetmarking + \let\dogetmarking\nogetmarking % obsolete in new marking mechanism \doplacelayouttextline#1#2% \egroup} @@ -503,79 +504,6 @@ \def\ignoredlinebreak{\unskip\space\ignorespaces} -% \def\doplacelayouttextline#1#2% -% {\ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height -% \goleftonpage -% \hbox -% {\setbox\scratchpagebox\vbox to #2 -% {\vsize#2\relax -% \normalbaselines -% \let\\\ignoredlinebreak -% \let\crlf\ignoredlinebreak -% \csname\??tk#1\c!before\endcsname -% \doifbothsidesoverruled -% {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone} -% {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone} -% {\dodoplacelayouttextline#1\c!righttext\c!middletext\c!lefttext \plusone\zerocount}% -% \csname\??tk#1\c!after\endcsname -% \kern\zeropoint}% keep the \dp, beware of \vtops, never change this! -% \dp\scratchpagebox\zeropoint -% \box\scratchpagebox}% -% \vskip-#2\relax -% \fi} -% -% \def\dodoplacelayouttextline#1#2#3#4#5#6% \hsize toegevoegd, \hss's niet meer wijzigen -% {\hbox -% {\ifdim\leftedgewidth>\zeropoint -% \dododoplacelayouttextline\leftedgewidth#1\v!edge -% {\hss\csname\??tk#1\v!edge#2\endcsname}% -% \hskip\leftedgedistance -% \fi -% \ifdim\leftmarginwidth>\zeropoint -% \dododoplacelayouttextline\leftmarginwidth#1\v!margin -% {\hbox to \leftmarginwidth -% {\hss\csname\??tk#1\v!margin#2\endcsname}% -% \hskip-\leftmarginwidth -% \hbox to \leftmarginwidth -% {\hss\ifcase#5\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi}}% -% \hskip\leftmargindistance -% \fi -% \ifdim\makeupwidth>\zeropoint -% \dododoplacelayouttextline\makeupwidth{#1}\v!text -% {\hbox to \makeupwidth -% {\ifcase#5\or\@@nmpre{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi -% \csname\??tk#1\v!text#2\endcsname\hss}% -% \hskip-\makeupwidth -% \hbox to \makeupwidth -% {\hss\csname\??tk#1\v!text#3\endcsname\hss}% -% \hskip-\makeupwidth -% \hbox to \makeupwidth -% {\hss\csname\??tk#1\v!text#4\endcsname -% \ifcase#6\or\@@nmpos{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi}}% -% \fi -% \ifdim\rightmarginwidth>\zeropoint -% \hskip\rightmargindistance -% \dododoplacelayouttextline\rightmarginwidth{#1}\v!margin -% {\hbox to \rightmarginwidth -% {\csname\??tk#1\v!margin#4\endcsname\hss}% -% \hskip-\rightmarginwidth -% \hbox to \rightmarginwidth -% {\ifcase#6\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi\hss}}% -% \fi -% \ifdim\rightedgewidth>\zeropoint -% \hskip\rightedgedistance -% \dododoplacelayouttextline\rightedgewidth{#1}\v!edge -% {\csname\??tk#1\v!edge#4\endcsname\hss}% -% \fi}} -% -% \def\dododoplacelayouttextline#1#2#3#4% -% {\vbox % to \vsize -% {\hsize#1\relax -% \csname\??tk#2#3\c!before\endcsname -% \setlayoutcomponentattribute#2#3% -% \hbox \layoutcomponentboxattribute to #1{#4}% -% \csname\??tk#2#3\c!after\endcsname}} - \def\doplacelayouttextline#1#2% {\let\currentlayouttextline#1% \ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height diff --git a/tex/context/base/prop-eff.mkiv b/tex/context/base/prop-eff.mkiv deleted file mode 100644 index 7207b9df4..000000000 --- a/tex/context/base/prop-eff.mkiv +++ /dev/null @@ -1,46 +0,0 @@ -%D \module -%D [ file=prop-eff, -%D version=2004.05.29, % some code moved from private modules -%D title=\CONTEXT\ Property Macros, -%D subtitle=Effects, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Property Macros / Effects} - -\unprotect - -%D Special font effects. - -\setupproperty - [\s!effect] - [\c!rulethickness=\zeropoint, - \c!stretch=0] - -\defineproperty [\v!inner] [\s!effect] [\c!rulethickness=.25pt] -\defineproperty [\v!outer] [\s!effect] [\c!rulethickness=.25pt] -\defineproperty [\v!both] [\s!effect] [\c!rulethickness=.25pt] -\defineproperty [\v!normal] [\s!effect] -\defineproperty [\v!hidden] [\s!effect] - -\defineproperty [\v!stretch] [\s!effect] [\c!stretch=1] - -\def\mktriggereffect#1% - {\dotriggereffect{#1}{\propertyparameter{#1}\c!stretch}{\propertyparameter{#1}\c!rulethickness}} - -\definepropertyhandler \v!normal {\mktriggereffect\v!normal} -\definepropertyhandler \v!inner {\mktriggereffect\v!inner } -\definepropertyhandler \v!outer {\mktriggereffect\v!outer } -\definepropertyhandler \v!both {\mktriggereffect\v!both } -\definepropertyhandler \v!hidden {\mktriggereffect\v!hidden} -\definepropertyhandler \v!stretch{\mktriggereffect\v!normal} - -\unexpanded\def\starteffectproperty{\mktriggereffect\currentproperty} -\unexpanded\def\stopeffectproperty {\mktriggereffect\v!normal } - -\protect \endinput diff --git a/tex/context/base/prop-ini.mkiv b/tex/context/base/prop-ini.mkiv index ada358f6d..a122e8bb4 100644 --- a/tex/context/base/prop-ini.mkiv +++ b/tex/context/base/prop-ini.mkiv @@ -13,33 +13,32 @@ \writestatus{loading}{ConTeXt Property Macros / Initialization} -%D Welcome to the third alternative of this yet undocumented module, -%D which means that there is no public interface yet! +%D This module is replaced by dedicated mechanisms. Originally properties were +%D a sort of attributes in \MKII, but now we do things different anyway. We keep +%D a surrogate mechanism around for compatibility reasons but even this will +%D become obsolete some day. \unprotect -\newcount\propertylevel +\def\propertyobsoletemessage + {\writestatus\m!systems{properties are obsolete, use dedicated commands}% + \glet\propertyobsoletemessage\donothing} -\def\currentpropertylevel {\csname\??py:l:\currentpropertytype\endcsname} % counter -\def\previouspropertylevel{\csname\??py:p:\currentpropertytype\endcsname} % counter +\setvalue{\??py:d:\v!layer }[#1][#2][#3]{\defineviewerlayer[#1][#3]} +\setvalue{\??py:d:\s!effect }[#1][#2][#3]{\defineeffect [#1][#3]} +\setvalue{\??py:d:\v!negative}[#1][#2][#3]{} -\def\currentproperty {\csname\??py:c:\number\currentpropertylevel \endcsname} % string -\def\previousproperty {\csname\??py:c:\number\previouspropertylevel\endcsname} % string - -% more efficient: - -\def\currentproperty {\csname\??py:c:\number\propertylevel\endcsname} % string -\def\currentpropertytype {\csname\??py\currentproperty\c!type\endcsname} +\unexpanded\def\defineproperty + {\dotripleempty\dodefineproperty} -\def\docheckproperty % watch the s instead of e - {\csname\s!check\currentpropertytype property\endcsname - \global\expandafter\let\csname\??py\s!check\currentproperty\endcsname\empty} +\def\dodefineproperty[#1][#2][#3]% + {\propertyobsoletemessage + \setevalue{\??py#1\c!type}{#2}% + \getvalue{\??py:d:#2}[#1][#2][#3]} -\def\checkproperty[#1]% - {\bgroup - \def\currentproperty{#1}% - \csname\??py\s!check\currentproperty\endcsname - \egroup} +\setvalue{\??py:s:\v!layer }#1{\let\dostopproperty\stopviewerlayer\startviewerlayer[#1]} +\setvalue{\??py:s:\s!effect }#1{\let\dostopproperty\stopeffect \starteffect [#1]} +\setvalue{\??py:s:\v!negative}#1{\let\dostopproperty\stopnegative \startnegative } \unexpanded\def\property[#1]% {\groupedcommand{\dostartproperty{#1}}\dostopproperty} @@ -50,101 +49,12 @@ \unexpanded\def\stopproperty {\dostopproperty} -\def\dostartgproperty - {\begingroup\dostartproperty} - -\def\dostopgproperty - {\dostopproperty\endgroup} - -\def\dostartproperty#1% evt pack: {current}{level}{ - {\global\advance\propertylevel\plusone - \@EAEAEA\xdef\currentproperty{#1}% - \global\advance\previouspropertylevel\plusone - \global\advance\currentpropertylevel\plusone - \csname\??py\s!check\currentproperty\endcsname - \csname\s!start\currentpropertytype\s!property\endcsname} - -\def\dostopproperty - {\csname\s!stop\currentpropertytype\s!property\endcsname - \global\advance\currentpropertylevel\minusone - \global\advance\previouspropertylevel\minusone - \global\advance\propertylevel\minusone} - -\unexpanded\def\defineproperty - {\dotripleempty\dodefineproperty} - -\def\dodefineproperty[#1]% - {\ifcsname\??py#1\c!global\endcsname - \expandafter\nododefineproperty - \else - \expandafter\dododefineproperty - \fi[#1]} - -% due to initializations/counters, definitions are always global -% -% global : yes : ungrouped -% no : grouped -% method : command : define commands -% none : no commands - -\def\dododefineproperty[#1][#2][#3]% global ! ! ! - {\getgparameters[\??py#1][\c!global=\v!no,\c!type=#2,\c!method=\v!none,#3]% global ! ! ! ! - \ifcsname\??py:l:#2\endcsname \else - \expandafter\newcount\csname\??py:l:#2\endcsname % current level - \expandafter\newcount\csname\??py:p:#2\endcsname % previous level - \global\csname\??py:p:#2\endcsname\minusone - \global\expandafter\let\csname\??py:c:0\endcsname\empty - \fi - \letgvalue{\??py\s!check#1}\docheckproperty - \doifelsevalue{\??py#1\c!method}\v!command - {\doifelsevalue{\??py#1\c!global}\v!yes - {\setugvalue{\e!start#1}{\dostartproperty{#1}}% - \setugvalue{\e!stop #1}{\dostopproperty}}% - {\setugvalue{\e!start#1}{\dostartgproperty{#1}}% - \setugvalue{\e!stop #1}{\dostopgproperty}}}% - {\doifelsevalue{\??py#1\c!global}\v!yes - {\setugvalue{\e!start#2}[##1]{\dostartproperty{##1}}% - \setugvalue{\e!stop #2}{\dostopproperty}}% - {\setugvalue{\e!start#2}[##1]{\dostartgproperty{##1}}% - \setugvalue{\e!stop #2}{\dostopgproperty}}}} - -\def\nododefineproperty[#1][#2][#3]% - {} - -\def\doifelseproperty#1{\doifdefinedelse{\??py#1\c!global}} - -\unexpanded\def\setupproperty - {\dodoubleempty\dosetupproperty} - -\def\dosetupproperty[#1][#2]% local - {\ifsecondargument - \getparameters[\??py#1][#2]% - \else - \getparameters[\??py][#1]% - \fi} - -\letvalueempty{\??py\s!empty} - -% beware, normally \*parameter concerns the current one - -\def\propertyparameter#1#2% expands to #1 when not defined (see \define...) - {\csname\??py - \ifcsname\??py#1#2\endcsname - #1#2% - \else\ifcsname\??py\csname\??py#1\c!type\endcsname#2\endcsname - \csname\??py#1\c!type\endcsname#2% - \else - \s!empty - \fi\fi - \endcsname} - -\def\currentpropertyparameter % self and class - {\propertyparameter\currentproperty} - -\def\checkedpropertyparameter#1% only self - {\ifcsname\??py\currentproperty#1\endcsname\csname\??py\currentproperty#1\endcsname\fi} +\unexpanded\def\dostartproperty#1% + {\pushmacro\dostopproperty + \getvalue{\??py:s:\getvalue{\??py#1\c!type}}{#1}} -\unexpanded\def\definepropertyhandler#1{\setvalue{\??py*#1}} -\def\propertyhandler #1{\getvalue{\??py*#1}} +\unexpanded\def\dostopproperty + {\dostopproperty + \popmacro\dostopproperty} \protect \endinput diff --git a/tex/context/base/prop-lay.mkiv b/tex/context/base/prop-lay.mkiv deleted file mode 100644 index 7d9d17870..000000000 --- a/tex/context/base/prop-lay.mkiv +++ /dev/null @@ -1,140 +0,0 @@ -%D \module -%D [ file=prop-lay, -%D version=2003.04.20, -%D title=\CONTEXT\ Property Macros, -%D subtitle=Layers, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Property Macros / Layers} - -%D Highly experimental, will probably change/evolve. Also, quite certainly -%D we will no longer share code between mkii and mkiv. - -% test, nesting is somewhat special with layers -% -% \defineproperty[hans][layer] -% \defineproperty[ton] [layer] -% \setupheadertexts[no layer] -% 1\startproperty[hans]2\startproperty[ton]3\stopproperty4\stopproperty5 - -\unprotect - -% will be redone ... no longer using property mechanism (less clashes) - -\let\currentviewerlayer\empty - -\appendtoks - \let\currentviewerlayer\empty -\to \everypagebody - -\unexpanded\def\startlayerproperty - {\pushmacro\currentviewerlayer % grouped (used in interaction) - \let\currentlayerproperty\currentproperty % can be cross group - \dotriggerviewerlayer\currentlayerproperty} - -\unexpanded\def\stoplayerproperty - {\popmacro\currentviewerlayer % grouped (used in interaction) - \let\currentlayerproperty\previousproperty % can be cross group - \dotriggerviewerlayer\currentlayerproperty} - -\def\checklayerproperty % could be made more clever - {\registerviewerlayer\currentproperty\currentproperty - \ctxlua{backends.codeinjections.defineviewerlayer{ - tag = "\currentproperty", - title = "\checkedpropertyparameter\c!title\currentproperty", - visible = "\checkedpropertyparameter\c!state\v!start", - kind = 0, % 1 == frozen - printable = "\checkedpropertyparameter\v!printable\v!yes" % v! looks wrong - }}} - -%D \starttext -%D -%D \setuppapersize[S4][S4] -%D \setuplayout[middle] -%D \setupcolors[state=start] -%D \setupinteraction[state=start,color=,contrastcolor=] -%D -%D \defineproperty [L1] [layer] [title=layer 1] -%D \defineproperty [L2] [layer] [title=layer 2] -%D -%D \button{HIDE L1}[HideLayer{L1}] -%D \button{VIDE L1}[VideLayer{L1}] -%D \button{TOGGLE L1}[ToggleLayer{L1}] -%D -%D \button{HIDE L2}[HideLayer{L2}] -%D \button{VIDE L2}[VideLayer{L2}] -%D \button{TOGGLE L2}[ToggleLayer{L2}] -%D -%D \noheaderandfooterlines \centerbox{\startoverlay -%D {\definedfont[Mono at 150pt]% -%D \startproperty[L1]\red TEST\stopproperty} -%D {\definedfont[Mono at 150pt]% -%D \startproperty[L2]\green TEST\stopproperty} -%D \stopoverlay} \page -%D -%D \noheaderandfooterlines \centerbox{\startoverlay -%D {\definedfont[Mono at 15pt]% -%D \goto{\startproperty[L1]\red TEST\stopproperty}[CloseDocument]} -%D {\definedfont[Mono at 15pt]% -%D \goto{\startproperty[L2]\green TEST\stopproperty}[CloseDocument]} -%D \stopoverlay} \page -%D -%D \startproperty[L1] -%D level 1 \startproperty[L2]level 2 \stopproperty level 1 -%D \stopproperty -%D -%D \startproperty[L1] -%D level 1 \page \startproperty[L2]level 2 \stopproperty level 1 -%D \stopproperty -%D -%D \stoptext - -\def\doinitializelayoutcomponent#1#2% - {\ctxlua{backends.codeinjections.defineviewerlayer{% this will move to the lua end i.e be merged with register - tag = "#1:#2", - title = "#1 #2", - visible = "\v!start", - kind = 0, % 1 == frozen - printable = "\v!yes" - }}% - \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(attributes.viewerlayers.register('#1:#2',true))}\relax}% - \expandafter\glet\csname\??ly>#1:#2\endcsname\layoutcomponentboxattribute} - -\def\dosetlayoutcomponentattribute#1#2% make this faster - {\expandafter\let\expandafter\layoutcomponentboxattribute\csname\??ly>#1:#2\endcsname - \ifx\layoutcomponentboxattribute\relax - \doinitializelayoutcomponent{#1}{#2}% get rid of { } - \fi} - -\def\doresetlayoutcomponentattribute - {\let\layoutcomponentboxattribute\empty} - -\let\setlayoutcomponentattribute \gobbletwoarguments -\let\resetlayoutcomponentattribute\relax -\let\layoutcomponentboxattribute \empty - -\def\showlayoutcomponents - {\ctxlua{attributes.viewerlayers.enable()}% - \let\setlayoutcomponentattribute \dosetlayoutcomponentattribute - \let\resetlayoutcomponentattribute\doresetlayoutcomponentattribute} - -\protect \endinput - -% \starttext -% \showlayoutcomponents -% \setupinteraction[state=start] -% \setupheadertexts[{\goto{page 1}[page(2)]}] -% test \setlayoutcomponentattribute{test}{aap}\hbox \layoutcomponentboxattribute \bgroup aap -% \setlayoutcomponentattribute{test}{noot}\hbox \layoutcomponentboxattribute \bgroup noot -% \setlayoutcomponentattribute{test}{mies}\hbox \layoutcomponentboxattribute \bgroup mies -% \egroup noot \egroup aap \egroup -% test \setlayoutcomponentattribute{test}{hans}\hbox \layoutcomponentboxattribute \bgroup aap \hbox{!} aap\egroup -% test \page test \page -% \stoptext - diff --git a/tex/context/base/prop-neg.mkiv b/tex/context/base/prop-neg.mkiv deleted file mode 100644 index 37e45833c..000000000 --- a/tex/context/base/prop-neg.mkiv +++ /dev/null @@ -1,40 +0,0 @@ -%D \module -%D [ file=prop-neg, -%D version=2004.05.29, % some code moved from private modules -%D title=\CONTEXT\ Property Macros, -%D subtitle=Negation, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Property Macros / Negation} - -\unprotect - -% D Overprint cum suis. -% -% \defineproperty[\v!overprint][\s!overprint] [\c!method=\v!command] -% \defineproperty[\v!knockout] [\s!overprint] [\c!method=\v!command] -% -% \definepropertyhandler \v!overprint {\dotriggeroverprint\v!overprint} -% \definepropertyhandler \v!knockout {\dotriggeroverprint\v!knockout } -% -% \unexpanded\def\startoverprintproperty{\dotriggeroverprint\v!overprint} -% \unexpanded\def\stopoverprintproperty {\dotriggeroverprint\v!knockout } - -%D Negative cum suis. - -\defineproperty [\v!negative] [\s!negative] [\c!method=\v!command] -\defineproperty [\v!positive] [\s!negative] [\c!method=\v!command] - -\definepropertyhandler \v!negative {\dotriggernegative\v!negative} -\definepropertyhandler \v!positive {\dotriggernegative\v!positive} - -\unexpanded\def\startnegativeproperty{\dotriggernegative\v!negative} -\unexpanded\def\stopnegativeproperty {\dotriggernegative\v!positive} - -\protect \endinput diff --git a/tex/context/base/s-fnt-10.tex b/tex/context/base/s-fnt-10.tex index 56f2decb4..612845fc2 100644 --- a/tex/context/base/s-fnt-10.tex +++ b/tex/context/base/s-fnt-10.tex @@ -1,4 +1,4 @@ -%D \module +fonts.identifiers%D \module %D [ file=s-fnt-01, %D version=2006.10.10, % guess %D title=\CONTEXT\ Style File, @@ -15,7 +15,7 @@ local format, sprint = string.format, tex.sprint function fonts.otf.show_all() - local tfmdata = fonts.ids[font.current()] + local tfmdata = fonts.identifiers[font.current()] if tfmdata and tfmdata.shared then local NC, NR, char = context.NC, context.NR, context.char local otfdata = tfmdata.shared.otfdata @@ -34,7 +34,7 @@ function fonts.otf.show_all() end function fonts.show_all() - local tfmdata = fonts.ids[font.current()] + local tfmdata = fonts.identifiers[font.current()] if tfmdata then local NC, NR, HL, char, bold, tttf = context.NC, context.NR, context.HL, context.char, context.bold, context.tttf local chars = tfmdata.characters @@ -100,7 +100,7 @@ function fonts.show_all() end function fonts.show_glyphs() - local tfmdata = fonts.ids[font.current()] + local tfmdata = fonts.identifiers[font.current()] if tfmdata then for k, v in ipairs(table.sortedkeys(tfmdata.characters)) do if v >=0 then diff --git a/tex/context/base/s-fnt-23.tex b/tex/context/base/s-fnt-23.tex index d2d6f4af5..35973d27e 100644 --- a/tex/context/base/s-fnt-23.tex +++ b/tex/context/base/s-fnt-23.tex @@ -17,7 +17,7 @@ local last_data = nil local format = string.format function fonts.otf.show_shape(n) - local tfmdata = fonts.ids[font.current()] + local tfmdata = fonts.identifiers[font.current()] last_data = tfmdata local charnum = tonumber(n) if not charnum then @@ -194,7 +194,7 @@ end end function fonts.otf.show_all_shapes(start,stop) - local tfmdata = fonts.ids[font.current()] + local tfmdata = fonts.identifiers[font.current()] last_data = tfmdata start, stop = start or "\\startTEXpage\\gobbleoneargument", stop or "\\stopTEXpage" local unicodes, indices, descriptions = tfmdata.unicodes, tfmdata.indices, tfmdata.descriptions @@ -208,7 +208,7 @@ end end function fonts.otf.show_shape_field(unicode,name) - local tfmdata = last_data or fonts.ids[font.current()] + local tfmdata = last_data or fonts.identifiers[font.current()] local d = tfmdata.descriptions[unicode] if d then if name == "unicode" then diff --git a/tex/context/base/s-fnt-25.tex b/tex/context/base/s-fnt-25.tex index f04b31c28..fc78ddfda 100644 --- a/tex/context/base/s-fnt-25.tex +++ b/tex/context/base/s-fnt-25.tex @@ -80,13 +80,13 @@ local format, lower = string.format, string.lower function document.showmathfont(id,slot) local data = characters.data - local tfmdata = fonts.ids[id] + local tfmdata = fonts.identifiers[id] local characters = tfmdata.characters local sorted = (slot and { slot }) or table.sortedkeys(characters) local virtual, names = tfmdata.type == "virtual", { } if virtual then for k, v in ipairs(tfmdata.fonts) do - local name = fonts.ids[v.id].name + local name = fonts.identifiers[v.id].name names[k] = (name and file.basename(name)) or v.id end end diff --git a/tex/context/base/s-fnt-29.tex b/tex/context/base/s-fnt-29.tex index 857591085..c09a8f85e 100644 --- a/tex/context/base/s-fnt-29.tex +++ b/tex/context/base/s-fnt-29.tex @@ -15,7 +15,7 @@ function fonts.tracers.shapes() -- todo: ranges local NC, NR = context.NC, context.NR - local chrs = fonts.ids[font.current()].characters + local chrs = fonts.identifiers[font.current()].characters context.starttabulate { "|l|c|c|c|c|l|" } context.FL() NC() context("unicode") diff --git a/tex/context/base/s-map-10.tex b/tex/context/base/s-map-10.mkii index 865132f97..865132f97 100644 --- a/tex/context/base/s-map-10.tex +++ b/tex/context/base/s-map-10.mkii diff --git a/tex/context/base/s-map-10.mkiv b/tex/context/base/s-map-10.mkiv new file mode 100644 index 000000000..03d74fe36 --- /dev/null +++ b/tex/context/base/s-map-10.mkiv @@ -0,0 +1,463 @@ +%D \module +%D [file=s-map-se, +%D version=2005.02.03, +%D title=\CONTEXT\ Style File, +%D subtitle=\MAPS\ basis stijl, +%D author={Hans Hagen, Taco Hoekwater and Siep Kroonenberg}, +%D date=\currentdate, +%D copyright={NTG / MAPS}] + +% This module re-implements the MAPS style for use with the Context macro +% package. The original MAPS layout was designed and implemented in +% LaTeX by Taco Hoekwater and Siep Kroonenberg. +% +% This variant is cleaned up for \MKIV. Some more cleanup is possible. +% +% Three layouts: +% +% 1. two columns +% 2. one column, with wide outer margins (option onecolumn) +% 3. one column, with wide left margin (option asym) +% +% A mode nosubsub defines only two levels of sectioning. If you +% don't need more and use the two-column layout, then this option +% will probably improve the looks of your paper. +% +% The default is twocolumns. + +\doifmode {asym} {\enablemode[onecolumn]} % implies onecolumn + +\definebodyfontenvironment [7pt] [interlinespace=8pt, big=8pt, small=6pt] +\definebodyfontenvironment [8pt] [interlinespace=9pt, big=9pt, small=7pt, x=6pt] +\definebodyfontenvironment [9pt] [interlinespace=10pt,big=10pt,small=8pt, x=7pt,script=6pt] +\definebodyfontenvironment [10pt][interlinespace=11pt,big=11pt,small=9pt, x=8pt,script=7pt,a=11pt] +\definebodyfontenvironment [11pt][interlinespace=11pt,big=11pt,small=10pt,x=9pt,script=8pt] +\definebodyfontenvironment [14pt][interlinespace=14pt,big=24pt,small=11pt,x=10pt] +\definebodyfontenvironment [24pt][interlinespace=24pt,big=24pt,small=14pt,x=11pt] +\definebodyfontenvironment [22pt][interlinespace=24pt,big=22pt,small=14pt,x=14pt] +\definebodyfontenvironment [30pt][interlinespace=30pt,big=30pt,small=26pt,x=26pt] + +\definefontfeature [default] [default] [protrusion=pure] + +\definetypeface [maps] [rm] [serif] [libertine] [default] +\definetypeface [maps] [ss] [sans] [default] [default] [rscale=0.95] +\definetypeface [maps] [tt] [mono] [inconsolata] [default] [rscale=0.92] +\definetypeface [maps] [mm] [math] [euler] [default] [rscale=0.9] + +\setupbodyfont[maps,10pt,rm] + +\setupinterlinespace + [line=11pt] + +\setupalign + [hanging] + +\setupindenting + [yes,next,11pt] + +% It is easy to do the shift toward the spine when assembling the +% volume with LaTeX pdfpages. + +% eh ... why not use backspace ? + +\definepapersize [maps] + [width=595.3bp, % 21cm + height=756bp] % 10.5in + +\setuppapersize + [maps] + [maps] % oversized + +\setuplayout + [topspace=40pt, + height=688pt, + header=33pt, + margin=106pt, + leftmargindistance=11pt, + rightmargindistance=11pt] + +\setupblank + [5.5pt] + +\setuppagenumbering + [location=] + +\definetyping [widetyping] + +\setupheader [style=\ss] +\setupfooter [style=\ss] + +\def\AuHead{\MapsRunningAuthor} +\def\TiHead{\ifnum\pageno=\MapsPage\relax\MapsRunningAuthor\else\MapsRunningTitle\fi} + +\setupheads + [sectionnumber=no, + align=flushleft] + +\def\hfonti {\ssbfa} +\def\hfontii {\ssbf} +\def\hfontiii{\rm\it} + +\def\runin#1#2{#2.} + +\doifmodeelse {nosubsub} { + + \setuphead [section] + [style=\hfontii, + before={\blank[line]}, + after=] + + \setuphead [subsection] + [style=\hfontiii, + before={\blank[halfline]}% + command=\runin, + alternative=text, + distance=6pt] + +} { + + \setuphead [section] + [style=\hfonti, + before={\blank[line]}, + after={\blank[halfline]}] + + \setuphead [subsection] + [style=\hfontii, + before={\blank[halfline]}, + after=] + + \setuphead [subsubsection] + [style=\hfontiii, + before={\blank[halfline]}, + command=\runin, + alternative=text, + distance=6pt] + +} + +\doifmodeelse {nosubsub} { + + \setuphead [subject] + [style=\hfontii, + before={\blank[halfline]}, + after=] + + \setuphead [subsubject] + [style=\hfontiii, + command=\runin, + alternative=text, + before={\blank[halfline]}] + +} { + + \setuphead [subject] + [style=\hfonti, + before={\blank}, + after={\blank[halfline]}] + + \setuphead [subsubject] + [style=\hfontii, + before={\blank[halfline]}, + after=] + + \setuphead [subsubsubject] + [style=\hfontiii, + command=\runin, + alternative=text, + before={\blank[halfline]}] + +} + +\setupfloats + [location=center, + before=\ss] % brrr + +\setupcaptions + [headstyle=\ss, + style=\ssx, + stopper=., + distance=6pt, + inbetween={\blank[halfline]}] + +% \def\ChkBox +% {\definedfont[file:stmary10]{\char "40}} % doesnt work + +\def\ChkBox + {\hbox + {\boxrulewidth=.4pt + \raise.2ex\ruledvbox{\phantom{\vrule width .85ex height .85ex}}}} + +\definesymbol [1][\ChkBox] + +\setupitemize[1][packed] + +\setupitemize [each] + [indentnext=no, + align=right, + width=1em, + distance=0pt] + +% an outer form of itemize that does not indent the paragraph. + +% \startitemize[width=1sp,#1] +% \let\doitem\item +% \def\item{\doitem[]\hbox{}\kern12pt\rightskip=0pt}% + +\defineitemgroup + [outeritemize] + +\setupitemgroup + [outeritemize] + [width=1sp, + distance=12pt] + +\setupenumerations + [indentnext=no] + +\setupdescriptions + [indentnext=no] + +% \unexpanded\def\smalltyping % ? ? ? ? +% {\switchtobodyfont[tt]% +% \parindent=0pt} + +% typing: +% - prettyverbatim is NOT the default +% - smaller size + +\setuptyping + [% style=\smalltyping, + option=none, + indentnext=no] + +\def\footnum#1{#1.} + +\setupfootnotes + [location=none, + width=\textwidth, + before=, + numbercommand=\footnum] + +\setupfootnotedefinition + [location=serried, + before=, + after=, + distance=0.5em] + +\setuptabulate + [before=\blank, + inner=\ss, + after=\blank] + +\def\startIntroEntry#1% + {\startlinecorrection + \bgroup + \setupalign[right] + \setuptolerance[verytolerant] + \setupindenting[no] + \noindent + \switchtobodyfont[9pt]% + \setuplocalinterlinespace[line=10pt]% + \parfillskip 0pt plus 1fill + \rightskip6pt plus 1fill + \ss + \bgroup + \bf + #1% + \par + \egroup + \ignorespaces} + +\def\stopIntroEntry + {\par + \egroup + \stoplinecorrection + \blank[line]} + +\unexpanded\def\defineIntroEntry[#1][#2][#3]% + {\setvalue{start#1}{\startIntroEntry{#2}}% + \setvalue {stop#1}{\stopIntroEntry#3}} + +\defineIntroEntry[Keywords][Keywords][] +\defineIntroEntry[Abstract][Abstract][] + +% article parameters (other fields and defaults) +% +% we can use setups instead (with a set key) + +\def\MapsBibData[#1]% + {\getparameters [Maps] + [SubTitle=, + RunningAuthor=, + RunningTitle=, + Email=, + Address=, + Page=1, + Title=, + Author=, + Period=VOORJAAR, + Number=40, + Year=2010, + #1]% + \doifinstringelse{oorjaar}{\MapsPeriod}{\def\MapsPeriod{VOORJAAR}}{}% + \doifinstringelse{pring} {\MapsPeriod}{\def\MapsPeriod{VOORJAAR}}{}% + \doifinstringelse{ajaar} {\MapsPeriod}{\def\MapsPeriod{NAJAAR}} {}% + \doifinstringelse{utumn} {\MapsPeriod}{\def\MapsPeriod{NAJAAR}} {}% + \doifnothing\MapsRunningAuthor + {\global\let\MapsRunningAuthor\MapsAuthor}% + \doifnothing\MapsRunningTitle + {\global\let\MapsRunningTitle\MapsTitle}} + +\def\dostartArticle[#1]% + {\MapsBibData[#1] + \pageno=\MapsPage + \count0=\MapsPage + \setuppagenumber[number=\MapsPage] + \startbaselinecorrection + \bgroup + \hsize = 457pt + \let\\\crlf + \blank[29pt,force] + \switchtobodyfont[ss,30pt] + \setupalign[right] + \bgroup + \noindent + \MapsTitle + \par + \blank[6pt] + \egroup + \ifx\MapsSubTitle\empty \else + \bgroup + \switchtobodyfont[ss,22pt]\noindent + \advance \rightskip 0pt plus 2em + \MapsSubTitle + \par + \egroup + \fi + \doifmodeelse{newstyle}{\blank[22pt]}{\blank[30pt]} + \egroup + \setupalign[width] + \switchtobodyfont[rm,10pt] + \doifmode{newstyle}{\noindent\MapsAuthor\blank[line]} + \stopbaselinecorrection + \doifnotmode {onecolumn} { + \startcolumns + \hyphenpenalty1000 + } { + \clubpenalty10000 + \widowpenalty10000 + } + \fi} + +\definecolumnset + [mapsset] + [n=2, + grid=on] + +\def\startArticle + {\dosingleempty\dostartArticle} + +\def\signArticle + {\blank + \let\\\crlf + \noindent + \switchtobodyfont[ss,9pt]% + \MapsAuthor + \doifsomething{\MapsAddress}{\crlf\MapsAddress}% + \doifsomething{\MapsEmail} {\crlf\MapsEmail}% + \switchtobodyfont[10pt]% + \def\signArticle{}} + +\def\stopArticle + {\par + \signArticle + \doifnotmode {onecolumn} { + \stopcolumns + } + \page} + +\installpagebreakhandler{last}{} + +\doifmodeelse {onecolumn} { + + \setuplayout[width=340pt] + + \doifmodeelse {asym} {% one col, asymmetric + + \setuplayout[backspace=187.3pt]% + \setuptyping [widetyping][oddmargin=-117pt] + \setuppagenumbering [alternative={singlesided,doublesided}] + \setupheadertexts + [{\hbox{}\hskip-117pt\TiHead}] + [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}] + [{\hbox{}\hskip-147pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}] + [\AuHead] + \setupfootertexts + + } { % one col, symmetric + + \setuplayout[backspace=70.3pt] + \setuppagenumbering [alternative=doublesided] + \setuptyping[blank=halfline] + \setupheadertexts + [\TiHead] + [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-147pt\hbox{}}] + [{\hbox{}\hskip-147pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}] + [\AuHead] + \setupfootertexts + + } + +} { % two col + + \setuplayout[width=457pt] + \setupcolumns[n=2,tolerance=verytolerant,distance=11pt] + \setuplayout[backspace=70.3pt,grid=yes] + \setuppagenumbering [alternative=doublesided] + \setuptyping[blank=halfline] + \setupheadertexts + [\TiHead] + [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}] + [{\hbox{}\hskip-30pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}] + [\AuHead] + \setupfootertexts + +} + +\def\fulltextwidth{457pt} + +\unexpanded\def\startdescription + {\blank + \startnarrower[left] + \def\sym##1{\par\noindent\hbox{\bf\kern-16pt\relax##1}\hskip12pt\relax}} + +\unexpanded\def\stopdescription + {\stopnarrower + \blank + \noindentation} + +\frenchspacing + +\setuptolerance + [tolerant] + +% tb compatible + +\unexpanded\def\ConTeXt {Con{\TeX}t} +\unexpanded\def\CONTEXT {\ConTeXt} +\unexpanded\def\METAFONT {Metafont} +\unexpanded\def\METAPOST {MetaPost} +\unexpanded\def\POSTSCRIPT{PostScript} +\unexpanded\def\XeTeX {X\lower.5ex\hbox{\kern-.1em\mirror{E}}\kern-.1667em\TeX} + +\unexpanded\def\LaTeX + {{\setbox\scratchbox\hbox{L}% + \scratchdimen\ht\scratchbox + \setbox\scratchbox\hbox{\switchtobodyfont[script]A}% + L\kern-.55\wd\scratchbox + \raise\scratchdimen\hbox{\lower\ht\scratchbox\copy\scratchbox}% + \kern-.2\wd\scratchbox\TeX}} + +\unexpanded\def\acro#1{{\switchtobodyfont[9pt]#1}} + +\endinput diff --git a/tex/context/base/s-pre-30.tex b/tex/context/base/s-pre-30.mkii index 2a3899c92..2a3899c92 100644 --- a/tex/context/base/s-pre-30.tex +++ b/tex/context/base/s-pre-30.mkii diff --git a/tex/context/base/s-pre-30.mkiv b/tex/context/base/s-pre-30.mkiv new file mode 100644 index 000000000..c3b524047 --- /dev/null +++ b/tex/context/base/s-pre-30.mkiv @@ -0,0 +1,257 @@ +%D \module +%D [ file=s-pre-30, +%D version=2006.04.25, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 30, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\usemodule[streams] + +\setuppapersize + [S6] [S6] + +\setupbodyfont + [12pt,tt] + +\definemeasure[bleed][6pt] + +\definecolor[maincolor-3][r=.5,g=.2,b=.2] +\definecolor[maincolor-1][r=.2,g=.5,b=.2] +\definecolor[maincolor-2][r=.2,g=.2,b=.5] + +\definecolor[pagecolor] [s=.5] +\definecolor[resultcolor][s=1,t=.85,a=1] +\definecolor[maincolor] [maincolor-3] + +\definecolorgroup + [maingroup] + [.5:.2:.2, + .2:.5:.2, + .2:.2:.5] + +\definecolorgroup + [resultgroup] + [1:.85:.85, + .85:1:.85, + .85:.85:1] + +\def\CurrentColor{1} + +\definecolor[maincolor] [maingroup:\CurrentColor] +\definecolor[resultcolor][resultgroup:\CurrentColor] + +\def\NextColor{\ifnum\CurrentColor=3 \def\CurrentColor{1}\else\doglobal\increment\CurrentColor\fi} + +\setuplayout + [backspace=\measure{bleed}, + topspace=30pt, + bottomdistance=\measure{bleed}, + bottom=\dimexpr30pt-\measure{bleed}\relax, + header=0pt, + footer=0pt, + topdistance=\measure{bleed}, + top=\dimexpr30pt-\measure{bleed}\relax, + width=middle, + height=middle] + +\setuptop + [before=\vfill, + after=\vfill, + strut=yes] + +\setupbackgrounds + [text] + [backgroundoffset=\measure{bleed}, + background=color, + backgroundcolor=maincolor] + +\setupbackgrounds + [page] + [background=color, + backgroundcolor=pagecolor] + +\setupcolors + [state=start, + textcolor=white] + +\setuphead + [chapter] + [style=\ttd] + +\setuphead + [section] + [style=\ttd] + +\defineviewerlayer + [result] + [state=stop] + +\definelayer + [result] + +\setuplayer + [result] + [width=\textwidth, + height=\textheight] + +\setupbackgrounds + [text] + [background={color,toggle,foreground,result}] + +\setupinteraction + [state=start, + click=no, + menu=on, + color=white, + contrastcolor=white, + closepageaction=HideLayer{result}, + openpageaction=HideLayer{result}] + +% We add a dummy color switch so that each page has at least one +% transparency; else acrobat will render the pages differently +% bug in 6 and 7). + +\startinteractionmenu[bottom] +% \color[resultcolor]{ }% + \hfill + \got [content] content \\ + \got [previouspage] previous \\ + \got [nextpage] next \\ + \got [ToggleLayer{result}] result \\ + \got [CloseDocument] close \\ +\stopinteractionmenu + +\setuphead + [section] + [placehead=no, + incrementnumber=list] + +\setuplist + [section] + [alternative=f] + +\defineoverlay + [toggle] + [\overlaybutton{ToggleLayer{result}}] + +\definestreamlayer + [resultstream] + +\startsetups streamlayer:resultstream:flush + \setlayer + [result] + [preset=middlebottom, + hoffset=\measure{bleed}, +% voffset=-\measure{bleed}] + voffset=\measure{bleed}] + {\startviewerlayer[result]% +% \framed +% [offset=overlay, +% frame=off, +% background=color, +% backgroundoffset=1\dimexpr\measure{bleed}\relax, +% backgroundcolor=maincolor] + {\framed + [offset=overlay, + frame=off, + foregroundcolor=maincolor, + background=color, + backgroundoffset=1\dimexpr\measure{bleed}\relax, + backgroundcolor=resultcolor] + {\tightlayer[\currentstreamlayer]}} + \stopviewerlayer} +\stopsetups + +\startsetups show-definition + \subject{definition} + \typebuffer + \getbuffer + \page +\stopsetups + +\startsetups show-result + \startstreamlayer[resultstream] + \subject{result} + \getbuffer + \stopstreamlayer + \placestreamlayer[resultstream] + \page +\stopsetups + +\startsetups show-usage + \subject{usage} + \typebuffer + \startstreamlayer[resultstream] + \subject{result} + \getbuffer + \stopstreamlayer + \placestreamlayer[resultstream] + \page +\stopsetups + +\startsetups show-usage-lines + \subject{usage} + \typebuffer + \startstreamlayer[resultstream] + \subject{result} + \startlines + \getbuffer + \stoplines + \stopstreamlayer + \placestreamlayer[resultstream] + \page +\stopsetups + +\startsetups show-contents + \startcolumns[n=3] + \placelist[section][criterium=text] + \stopcolumns + \pagereference[content] + \page + \NextColor +\stopsetups + +\def\TitlePage#1% + {\title{#1} + \setups{show-contents}} + +\def\StartSample#1% + {\starttext + \page + \section{#1} + \setuptoptexts[][\processedfile\enspace:\enspace\lowercase{#1}]} + +\def\StopSample + {\page + \setuptoptexts[][] + \stoptext + \NextColor} + +\endinput + +\usemodule[pre-30] + +% \TitlePage{Howling to the moon} + +\StartSample{Basics} + +\startbuffer +\lua{a = 1.5 ; b = 1.8 ; c = a*b ; tex.print(c) ;} + +\startlua + a = 1 + b = 2 + c = a*b + tex.print(c) +\stoplua +\stopbuffer + +\setups{show-usage} + +\StopSample diff --git a/tex/context/base/s-pre-60.tex b/tex/context/base/s-pre-60.mkii index f12b98b06..4df3e8a61 100644 --- a/tex/context/base/s-pre-60.tex +++ b/tex/context/base/s-pre-60.mkii @@ -62,36 +62,20 @@ \def\NextStepLayer {step:\the\numexpr\StepCounter+1\relax} \def\FirstStepLayer{step:1} -\startmode[mkiv] - - \def\StartStep - {\startproperty[\StepLayer]% - \ignorespaces} - - \def\StopStep - {\removeunwantedspaces - \stopproperty} - -\stopmode - -\startnotmode[mkiv] - - \def\StartStep - {\ifvmode - \scratchskip\lastskip - \vskip-\scratchskip - \startproperty[\StepLayer]% - \vskip\scratchskip - \else - \startproperty[\StepLayer]% - \fi - \ignorespaces} - - \def\StopStep - {\removeunwantedspaces - \stopproperty} - -\stopnotmode +\def\StartStep + {\ifvmode + \scratchskip\lastskip + \vskip-\scratchskip + \startproperty[\StepLayer]% + \vskip\scratchskip + \else + \startproperty[\StepLayer]% + \fi + \ignorespaces} + +\def\StopStep + {\removeunwantedspaces + \stopproperty} \def\StartSteps{\iftrialtypesetting\else\ResetStep\NextStep\StartStep\fi} \def\StopSteps {\iftrialtypesetting\else\StopStep \PrevStep \fi} diff --git a/tex/context/base/s-pre-60.mkiv b/tex/context/base/s-pre-60.mkiv new file mode 100644 index 000000000..2ceb23773 --- /dev/null +++ b/tex/context/base/s-pre-60.mkiv @@ -0,0 +1,132 @@ +%D \module +%D [ file=s-pre-60, +%D version=2004.03.15, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 60, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmode[paper,print] + \let\StartSteps\relax + \let\StopSteps \relax + \let\FlushStep \relax + \let\ResetStep \relax + \let\StartBusy \relax + \let\StopBusy \relax + \endinput +\stopmode + +\newcounter\StepCounter +\newcounter\StepMaximum + +\useJSscripts[stp] + +\startsetups[set-stepper] + + \ifnum\getvariable{stepper}{nofsteps}>\StepMaximum + + \dostepwiserecurse {\numexpr\StepMaximum+1\relax} {\getvariable{stepper}{nofsteps}} {1} { + \doifnotmode{nosteps,nostep} { + \expanded{\defineviewerlayer[step:\recurselevel][state=stop]} + } + } + + \xdef\StepMaximum{\getvariable{stepper}{nofsteps}} + + \fi + +\stopsetups + +\setvariables + [stepper] + [set=\setups{set-stepper}, + nofsteps=50] + +\defineviewerlayer[step:busy][state=start] + +\definereference [SetupStepper] [JS(SetupStepper{step,\StepMaximum})] +\definereference [ResetStepper] [JS(ResetStepper)] +\definereference [CheckStepper] [JS(CheckStepper{\StepCounter})] +\definereference [InvokeStepper] [JS(InvokeStepper)] + +% todo: roll back blank + +\def\ResetStep {\doglobal\newcounter\StepCounter} +\def\NextStep {\doglobal\increment \StepCounter} +\def\PrevStep {\doglobal\decrement \StepCounter} + +\def\StepLayer {step:\StepCounter} +\def\NextStepLayer {step:\the\numexpr\StepCounter+1\relax} +\def\FirstStepLayer{step:1} + +\def\StartStep {\startviewerlayer[\StepLayer]\ignorespaces} +\def\StopStep {\removeunwantedspaces\stopviewerlayer} +\def\StartSteps {\iftrialtypesetting\else\ResetStep\NextStep\StartStep\fi} +\def\StopSteps {\iftrialtypesetting\else\StopStep \PrevStep \fi} +\def\FlushStep {\iftrialtypesetting\else\StopStep \NextStep\StartStep\fi} + +\def\StartBusy {\startviewerlayer[step:busy]\ignorespaces} +\def\StopBusy {\removeunwantedspaces\stopviewerlayer} + +\appendtoks + \ResetStep +\to \everyaftershipout + +\setupinteraction + [%openaction=SetupStepper, + closeaction=ResetStepper, + openpageaction=CheckStepper, + closepageaction=ResetStepper] + +\defineoverlay[invoke][\overlaybutton{InvokeStepper}] + +\setupbackgrounds + [text] + [background=invoke] + +% bonus + +\useMPlibrary[nav] + +\definepalet + [navplus] + [attach=interactioncolor, + comment=interactioncolor] + +\setupcomment + [symbol={comment-normal,comment-down}, + textlayer=\StepLayer, + option=buffer, + height=\textheight, + width=\textwidth, + margin=0pt] + +\setupattachments + [symbol={attach-normal,attach-down}, + textlayer=\StepLayer] + +%D Handy: + +\def\StartLocalSteps{\ResetStep} +\def\StopLocalSteps {} + +\def\StartLocalStep {\NextStep\StartStep} +\def\StopLocalStep {\StopStep} + +%D used as (given some definitions): +%D +%D \starttyping +%D \StartLocalSteps +%D \startcombination[both] +%D {\StartLocalStep\placestreamlayer[left]\StopLocalStep} {} +%D {\StartLocalStep\placestreamlayer[right]\StopLocalStep} {} +%D \stopcombination +%D \StopLocalSteps +%D \stoptyping + +\endinput diff --git a/tex/context/base/s-pre-71.tex b/tex/context/base/s-pre-71.mkii index db65c8e28..db65c8e28 100644 --- a/tex/context/base/s-pre-71.tex +++ b/tex/context/base/s-pre-71.mkii diff --git a/tex/context/base/s-pre-71.mkiv b/tex/context/base/s-pre-71.mkiv new file mode 100644 index 000000000..a23d1950f --- /dev/null +++ b/tex/context/base/s-pre-71.mkiv @@ -0,0 +1,213 @@ +% engine=luatex + +%D \module +%D [ file=s-pre-71, +%D version=2008.08.05, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 71, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%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 I might improve this module so consider it experimental. + +% \enablemode[numbers] +% \enablemode[paper] + +\usemodule[pre-60,abr-02] + +\setupinteraction[state=start,click=off] + +\definepapersize[wide][width=900pt,height=600pt] + +\setuppapersize[wide][wide] + +\setuplayout[page] + +% \setupbodyfont[15pt] + +\usetypescriptfile[type-hgz] +\usetypescript[palatino-informal] +\setupbodyfont[palatino-informal,15pt] + +\setupsorting[logo][style=] + +\startnotmode[paper] + \setupbackgrounds[page][background=color,backgroundcolor=black] +\stopnotmode + +\TransparencyHack + +\definelayer[page][width=\paperwidth,height=\paperheight] + +\definecolor[TopicColor-1][r=.3,g=.4,b=.5] +\definecolor[TopicColor-2][r=.3,g=.5,b=.4] +\definecolor[TopicColor-3][r=.4,g=.3,b=.5] +\definecolor[TopicColor-4][r=.4,g=.5,b=.3] +\definecolor[TopicColor-5][r=.5,g=.3,b=.4] +\definecolor[TopicColor-6][r=.5,g=.4,b=.3] +\definecolor[TopicColor-7][r=.35,g=.35,b=.6] +\definecolor[TopicColor-8][r=.6,g=.35,b=.35] +\definecolor[TopicColor-9][r=.35,g=.6,b=.35] + +\definecolor[TopicColor-0][t=.5,a=1,s=.5] +\definecolor[TopicColor] [s=1] + +\setupcolors[state=start] +\setupcolors[textcolor=TopicColor] + +\startluacode + local locations = { + 'lefttop', + 'middletop', + 'righttop', + 'middleleft', + 'middle', + 'middleright', + 'leftbottom', + 'middlebottom', + 'rightbottom', + } + local done, current, previous, n = table.tohash(locations,false), 0, 0, 0 + function document.reset_locations() + done, current, previous, n = table.tohash(locations,false), 0, 0, 0 + end + function document.next_location(loc) + previous = current + n = n + 1 + loc = loc and loc ~= "" and tonumber(loc) + while true do + current = loc or math.random(1,#locations) + if not done[current] then + done[current] = true + break + end + end + end + function document.current_location() + tex.print(locations[current] or "") + end + function document.previous_location() + tex.print(locations[previous] or "") + end + function document.current_n() + tex.print(tostring(current)) + end + function document.previous_n() + tex.print(tostring(previous)) + end + function document.step() + tex.print(tostring(n)) + end +\stopluacode + +\def\StartTopics + {\startstandardmakeup + \ctxlua{document.reset_locations()} + \doifnotmode{paper}{\StartLocalSteps}} + +\def\StopTopics + {\doifnotmode{paper}{\StopLocalSteps} + \flushlayer[page] + \stopstandardmakeup} + +\def\StartTopic + {\dosingleempty\doStartTopic} + +\def\doStartTopic[#1]% + {\doifnotmode{paper}{\NextStep} + \ctxlua{document.next_location("#1")} + \startnotmode[paper] + \doifnothing{#1} + {\ifcase\ctxlua{document.previous_n()}\else + \setlayer + [page] + [preset=\ctxlua{document.previous_location()}] + \bgroup + \doifnotmode{paper}{\startviewerlayer[\StepLayer]}% + \framed + [offset=20pt, + strut=no, + align=normal, + frame=off, + height=\dimexpr\paperheight/3\relax, + width=\dimexpr\paperwidth/3\relax, + background=color, + backgroundcolor=TopicColor-0] + {}% + \doifnotmode{paper}{\stopviewerlayer}% + \egroup + \fi} + \stopnotmode + \setlayer + [page] + [preset=\ctxlua{document.current_location()}] + \bgroup + \doifnotmode{paper}{\startviewerlayer[\StepLayer]}% + \framed + [offset=20pt, + strut=no, + align=\expdoifelse{#1}{}{normal}{middle,lohi}, + align=\expdoifelse{#1}{}{flushleft,verytolerant}{middle,lohi}, + frame=off, + height=\dimexpr\paperheight/3\relax, + width=\dimexpr\paperwidth/3\relax, + background=color, + backgroundcolor=TopicColor-\ctxlua{document.current_n()}] + \bgroup + \ignorespaces} + +\def\StopTopic + {\removeunwantedspaces + \egroup + \doifnotmode{paper}{\stopviewerlayer}% + \egroup + \startmode[numbers] + \setlayerframed + [page] + [preset=\ctxlua{document.current_location()}] + [height=\dimexpr\paperheight/3\relax, + width=\dimexpr\paperwidth/3\relax, + frame=off, + foregroundstyle=\bfa, + align={flushright,low}] + {\doifnotmode{paper}{\startviewerlayer[\StepLayer]}% + \ctxlua{document.step()}\kern\strutdepth + \doifnotmode{paper}{\stopviewerlayer}} + \stopmode} + +\logo [METAPOST] {MetaPost} + +\definefont[TitleFont][SansBold at 60pt] +\definefont[TempFont] [SansBold at 12pt] + +\let\StartText\starttext +\let\StopText \stoptext + +\doifnotmode{demo}{\endinput} + +\starttext + +\StartTopics + \StartTopic[1] A \StopTopic + \StartTopic[5] B \StopTopic + \StartTopic[9] C \StopTopic +\StopTopics + +\StartTopics + \StartTopic A \StopTopic + \StartTopic B \StopTopic + \StartTopic C \StopTopic + \StartTopic D \StopTopic + \StartTopic E \StopTopic + \StartTopic F \StopTopic + \StartTopic G \StopTopic + \StartTopic H \StopTopic + \StartTopic I \StopTopic +\StopTopics + +\stoptext diff --git a/tex/context/base/scrp-ini.lua b/tex/context/base/scrp-ini.lua index b543053af..11ffd02f8 100644 --- a/tex/context/base/scrp-ini.lua +++ b/tex/context/base/scrp-ini.lua @@ -32,7 +32,7 @@ local state = attributes.private('state') local preproc = attributes.private('preproc') local prestat = attributes.private('prestat') -local fontdata = fonts.ids +local fontdata = fonts.identifiers local fcs = fonts.colors.set local fcr = fonts.colors.reset diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua index 9e29398cc..a856f4cab 100644 --- a/tex/context/base/spac-ver.lua +++ b/tex/context/base/spac-ver.lua @@ -646,7 +646,7 @@ local function nodes_to_string(head) local current, t = head, { } while current do local id = current.id - local ty = node.type(id) + local ty = nodecodes[id] if id == penalty_code then t[#t+1] = format("%s:%s",ty,current.penalty) elseif id == glue_code then @@ -680,7 +680,7 @@ local function trace_info(message, where, what) end local function trace_node(what) - local nt = node.type(what.id) + local nt = nodecodes[what.id] local tl = trace_list[#trace_list] if tl and tl[1] == "node" then trace_list[#trace_list] = { "node", tl[2] .. " + " .. nt } @@ -1160,7 +1160,7 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also end show_tracing(head) if oldhead ~= head then - trace_info("head has been changed from '%s' to '%s'",node.type(oldhead.id),node.type(head.id)) + trace_info("head has been changed from '%s' to '%s'",nodecodes[oldhead.id],nodecodes[head.id]) end end return head, true diff --git a/tex/context/base/strc-def.mkiv b/tex/context/base/strc-def.mkiv index 190764424..e386902e0 100644 --- a/tex/context/base/strc-def.mkiv +++ b/tex/context/base/strc-def.mkiv @@ -258,6 +258,7 @@ %\c!indentnext=\v!no, \c!continue=\v!no, \c!page=\v!right, + \c!marking=\v!page, \c!header=, \c!style=\tfc, \c!distance=.75em, diff --git a/tex/context/base/strc-ini.mkiv b/tex/context/base/strc-ini.mkiv index c2d882f7c..8575889e8 100644 --- a/tex/context/base/strc-ini.mkiv +++ b/tex/context/base/strc-ini.mkiv @@ -17,10 +17,6 @@ \unprotect -% \def\zerosection{0} -% \def\resetsectionmarks{} -% \setuppagenumbering - % maybe use structurecomponent more consistently as name below % segments: 0:100 2:3 chapter:subsection 3 (=self+2) (alternative: sectionset) diff --git a/tex/context/base/strc-mar.lua b/tex/context/base/strc-mar.lua index d2e2b0352..0ea352656 100644 --- a/tex/context/base/strc-mar.lua +++ b/tex/context/base/strc-mar.lua @@ -6,9 +6,538 @@ if not modules then modules = { } end modules ['strc-mar'] = { license = "see context related readme files" } -local structures = structures -local marks = structures.marks -local lists = structures.lists +-- todo: cleanup stack (structures.marks.reset(v_all) also does the job) + +local insert, concat = table.insert, table.concat +local tostring, next, setmetatable, rawget = tostring, next, setmetatable, rawget +local lpegmatch = lpeg.match + +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist + +local hasattribute = nodes.hasattribute +local traversenodes = node.traverse +local texsetattribute = tex.setattribute +local texbox = tex.box + +local a_marks = attributes.private('marks') + +local trace_marks_set = false trackers.register("marks.set", function(v) trace_marks_set = v end) +local trace_marks_get = false trackers.register("marks.get", function(v) trace_marks_get = v end) +local trace_marks_all = false trackers.register("marks.detail", function(v) trace_marks_all = v end) + +local report_marks = logs.new("marks") + +local variables = interfaces.variables +local v_first = variables.first +local v_last = variables.last +local v_previous = variables.previous +local v_next = variables.next +local v_firstpage = variables.firstpage +local v_lastpage = variables.lastpage +local v_previouspage = variables.previouspage +local v_nextpage = variables.nextpage +local v_current = variables.current +local v_default = variables.default +local v_page = variables.page +local v_all = variables.all + +local structures = structures +local marks = structures.marks +local lists = structures.lists + +local settings_to_array = utilities.parsers.settings_to_array + +marks.data = marks.data or { } + +storage.register("structures/marks/data", marks.data, "structures.marks.data") + +local data = marks.data +local stack, topofstack = { }, 0 + +local ranges = { + [v_page] = { + first = 0, + last = 0, + }, +} + +local function resolve(t,k) + if k then + if trace_marks_set or trace_marks_get then + report_marks("undefined: name=%s",k) + end + local crap = { autodefined = true } + t[k] = crap + return crap + else + -- weird: k is nil + end +end + +setmetatable(data, { __index = resolve} ) + +function marks.exists(name) + return rawget(data,name) ~= nil +end + +-- identify range + +local function sweep(head,first,last) + for n in traversenodes(head) do + local id = n.id + if id == glyph_code then + local a = hasattribute(n,a_marks) + if not a then + -- next + elseif first == 0 then + first, last = a, a + elseif a > last then + last = a + end + elseif id == hlist_code or id == vlist_code then + local list = n.list + if list then + first, last = sweep(list, first, last) + end + end + end + return first, last +end + +local classes = { } + +setmetatable(classes, { __index = function(t,k) local s = settings_to_array(k) t[k] = s return s end } ) + +function marks.synchronize(class,n) + local box = texbox[n] + if box then + local first, last = sweep(box.list,0,0) + local classlist = classes[class] + for i=1,#classlist do + local class = classlist[i] + local range = ranges[class] + if not range then + range = { } + ranges[class] = range + end + range.first, range.last = first, last + if trace_marks_get or trace_marks_set then + report_marks("synchronize: class=%s, first=%s, last=%s",class,range.first,range.last) + end + end + elseif trace_marks_get or trace_marks_set then + report_marks("synchronize: class=%s, box=%s, no content",class,n) + end +end + +-- define etc + +local function resolve(t,k) + if k == "fullchain" then + local fullchain = { } + local chain = t.chain + while chain and chain ~= "" do + insert(fullchain,1,chain) + chain = data[chain].chain + end + t[k] = fullchain + return fullchain + elseif k == "chain" then + t[k] = "" + return "" + elseif k == "reset" or k == "set" then + t[k] = 0 + return 0 + elseif k == "parent" then + t[k] = false + return false + end +end + +function marks.define(name,settings) + settings = settings or { } + data[name] = settings + local parent = settings.parent + if parent == nil or parent == "" then + settings.parent = false + else + local dp = data[parent] + if not dp then + setting.parent = false + elseif dp.parent then + setting.parent = dp.parent + end + end + setmetatable(settings, { __index = resolve } ) +end + +for k, v in next, data do + setmetatable(v, { __index = resolve } ) -- runtime loaded table +end + +function marks.relate(name,chain) + local dn = data[name] + if dn and not dn.parent then + if chain and chain ~= "" then + dn.chain = chain + local dc = data[chain] + if dc then + local children = dc.children + if not children then + children = { } + dc.children = children + end + children[#children+1] = name + end + elseif trace_marks_set then + report_marks("invalid relation: name=%s, chain=%s",name,chain or "-") + end + end +end + +local function resetchildren(new,name) + local dn = data[name] + if dn and not dn.parent then + local children = dn.children + if children then + for i=1,#children do + local ci = children[i] + new[ci] = false + if trace_marks_set then + report_marks("reset: parent=%s, child=%s",name,ci) + end + resetchildren(new,ci) + end + end + end +end + +function marks.set(name,value) + local dn = data[name] + if dn then + local child = name + local parent = dn.parent + if parent then + name = parent + dn = data[name] + end + dn.set = topofstack + local top = stack[topofstack] + local new = { } + if top then + for k, v in next, top do + local d = data[k] + local r = d.reset + local s = d.set + if r <= topofstack and s < r then + new[k] = false + else + new[k] = v + end + end + end + resetchildren(new,name) + new[name] = value + topofstack = topofstack + 1 + stack[topofstack] = new + if trace_marks_set then + if name == child then + report_marks("set: name=%s, index=%s, value=%s",name,topofstack,value) + else + report_marks("set: parent=%s, child=%s, index=%s, value=%s",parent,child,topofstack,value) + end + end + tex.setattribute("global",a_marks,topofstack) + end +end + +local function reset(name) + if v_all then + if trace_marks_set then + report_marks("reset: all") + end + stack = { } + for name, dn in next, data do + local parent = dn.parent + if parent then + dn.reset = 0 + dn.set = 0 + end + end + else + local dn = data[name] + if dn then + local parent = dn.parent + if parent then + name = parent + dn = data[name] + end + if trace_marks_set then + report_marks("reset: name=%s, index=%s",name,topofstack) + end + dn.reset = topofstack + local children = dn.children + if children then + for i=1,#children do + local ci = children[i] + reset(ci) + end + end + end + end +end + +marks.reset = reset + +function marks.get(n,name,value) + local dn = data[name] + if dn then + name = dn.parent or name + local top = stack[n] + if top then + context(top[name]) + end + end +end + +function marks.show(first,last) + if first and last then + for k=first,last do + local v = stack[k] + if v then + report_marks("% 4i: %s",k,table.sequenced(v)) + end + end + else + for k, v in table.sortedpairs(stack) do + report_marks("% 4i: %s",k,table.sequenced(v)) + end + end +end + +local function resolve(name,first,last,strict,quitonfalse,notrace) + local dn = data[name] + if dn then + local child = name + local parent = dn.parent + name = parent or child + dn = data[name] + local step, method + if first > last then + step, method = -1, "bottom-up" + else + step, method = 1, "top-down" + end + if trace_marks_get and not notrace then + report_marks("request: strategy=%s, name=%s, parent=%s, strict=%s",method,child,parent or "",tostring(strict or false)) + end + if trace_marks_all and not notrace then + marks.show(first,last) + end + local r = dn.reset + local s = dn.set + if first <= last and first <= r then + if trace_marks_get and not notrace then + report_marks("reset: name=%s, reset=%s, index=%s",name,r,first) + end + elseif first >= last and last <= r then + if trace_marks_get and not notrace then + report_marks("reset: name=%s, reset=%s, index=%s",name,r,last) + end + elseif not stack[first] or not stack[last] then + if trace_marks_get and not notrace then + -- a previous or next method can give an out of range, which is valid + report_marks("out of range: name=%s, reset=%s, index=%s",name,r,first) + end + elseif strict then + local top = stack[first] + local fullchain = dn.fullchain + if not fullchain or #fullchain == 0 then + return resolve(name,first,last) + else + if trace_marks_get and not notrace then + report_marks("found chain: %s",concat(fullchain," => ")) + end + local chaindata, chainlength = { }, #fullchain + for i=1,chainlength do + local cname = fullchain[i] + if data[cname].set > 0 then + local value = resolve(cname,first,last,false,false,true) + if value == "" then + if trace_marks_get and not notrace then + report_marks("quit chain: name=%s, reset=%s, start=%s",name,r,first) + end + return "" + else + chaindata[i] = value + end + end + end + if trace_marks_get and not notrace then + report_marks("chain list: %s",concat(chaindata," => ")) + end + local value, index, found = resolve(name,first,last,false,false,true) + if value ~= "" then + for i=1,chainlength do + local cname = fullchain[i] + if data[cname].set > 0 and chaindata[i] ~= found[cname] then + if trace_marks_get and not notrace then + report_marks("empty in chain: name=%s, reset=%s, index=%s",name,r,first) + end + return "" + end + end + if trace_marks_get and not notrace then + report_marks("found: name=%s, reset=%s, start=%s, index=%s, value=%s",name,r,first,index,value) + end + return value, index, found + elseif trace_marks_get and not notrace then + report_marks("not found: name=%s, reset=%s",name,r) + end + end + else + for i=first,last,step do + local current = stack[i] + local value = current and current[name] + if value == nil then + -- search on + elseif value == false then + if quitonfalse then + return "" + end + elseif value == true then + if trace_marks_get and not notrace then + report_marks("quit: name=%s, reset=%s, start=%s, index=%s",name,r,first,i) + end + return "" + elseif value ~= "" then + if trace_marks_get and not notrace then + report_marks("found: name=%s, reset=%s, start=%s, index=%s, value=%s",name,r,first,i,value) + end + return value, i, current + end + end + if trace_marks_get and not notrace then + report_marks("not found: name=%s, reset=%s",name,r) + end + end + end + return "" +end + +-- todo: column:first column:last + +local methods = { } + +local function doresolve(name,range,swap,df,dl,strict) + local range = ranges[range] or ranges[v_page] + local first, last = range.first, range.last + if trace_marks_get then + report_marks("resolve: name=%s, range=%s, swap=%s, first=%s, last=%s, df=%s, dl=%s, strict=%s", + name,range,tostring(swap or false),first,last,df,dl,tostring(strict or false)) + end + if swap then + first, last = last + df, first + dl + else + first, last = first + df, last + dl + end + return resolve(name,first,last,strict) +end + +methods[v_previous] = function(name,range) return doresolve(name,range,false,-1,0,true ) end +methods[v_previouspage] = function(name,range) return doresolve(name,range,false,-1,0,false) end +methods[v_first] = function(name,range) return doresolve(name,range,false, 0,0,true ) end +methods[v_firstpage] = function(name,range) return doresolve(name,range,false, 0,0,false) end +methods[v_last] = function(name,range) return doresolve(name,range,true , 0,0,true ) end +methods[v_lastpage] = function(name,range) return doresolve(name,range,true , 0,0,false) end +methods[v_next] = function(name,range) return doresolve(name,range,true , 0,1,true ) end +methods[v_nextpage] = function(name,range) return doresolve(name,range,true , 0,1,false) end + +methods[v_current] = function(name,range) -- range is ignored here + local top = stack[#topofstack] + return top and top[name] or "" +end + +local function fetched(name,range,method) + local value = (methods[method] or methods[v_first])(name,range) or "" + if not trace_marks_get then + -- no report + elseif value == "" then + report_marks("nothing fetched: name=%s, range=%s, method=%s",name,range,method) + else + report_marks("marking fetched: name=%s, range=%s, method=%s, value=%s",name,range,method) + end + return value or "" +end + +-- can be used at the lua end: + +marks.fetched = fetched + +-- this will move to a separate runtime modules + +marks.tracers = marks.tracers or { } + +function marks.tracers.showtable() + context.starttabulate { "|l|l|l|lp|lp|" } + context.tabulaterowbold("name","parent","chain","children","fullchain") + context.ML() + for k, v in table.sortedpairs(data) do + local parent, chain, children, fullchain = v.parent or "", v.chain or "", v.children or { }, v.fullchain or { } + table.sort(children) -- in-place but harmless + context.tabulaterowtyp(k,parent,chain,concat(children," "),concat(fullchain," ")) + end + context.stoptabulate() +end + +-- pushing to context: + +local separator = context.nested.markingseparator +local command = context.nested.markingcommand +local ctxconcat = context.concat + +local function fetchonemark(name,range,method) + context(command(name,fetched(name,range,method))) +end + +local function fetchtwomarks(name,range) + ctxconcat( { + command(name,fetched(name,range,v_first)), + command(name,fetched(name,range,v_last)), + }, separator(name)) +end + +local function fetchallmarks(name,range) + ctxconcat( { + command(name,fetched(name,range,v_previous)), + command(name,fetched(name,range,v_first)), + command(name,fetched(name,range,v_last)), + }, separator(name)) +end + +function marks.fetch(name,range,method) -- chapter page first | chapter column:1 first + if trace_marks_get then + report_marks("marking asked: name=%s, range=%s, method=%s",name,range,method) + end + if method == "" or method == v_default then + fetchonemark(name,range,v_first) + elseif method == v_both then + fetchtwomarks(name,range) + elseif method == v_all then + fetchallmarks(name,range) + else + fetchonemark(name,range,method) + end +end + +function marks.fetchonemark (name,range,method) fetchonemark (name,range,method) end +function marks.fetchtwomarks(name,range) fetchtwomarks(name,range ) end +function marks.fetchallmarks(name,range) fetchallmarks(name,range ) end + +-- here we have a few helpers function marks.title(tag,n) lists.savedtitle(tag,n,"marking") diff --git a/tex/context/base/strc-mar.mkiv b/tex/context/base/strc-mar.mkiv index bb87051e0..23c1239a4 100644 --- a/tex/context/base/strc-mar.mkiv +++ b/tex/context/base/strc-mar.mkiv @@ -17,479 +17,161 @@ \unprotect -%D Old stuff. - -\newtoks \listofmarks - -\let \getmarks \gobbleoneargument -\let \getallmarks \relax -\let \getsplitmarks \gobbleoneargument -\let \getallsplitmarks \relax - -%D \macros -%D {expandmarks} +%D Synchronizing marks is a rather tricky and messy business. When +%D setting a mark, a node is added to the list in order for to \TEX\ +%D be able to figure out the 3 current marks when a page is made +%D (last mark on previous page, first on current page, last on +%D current page; in \LUATEX\ we might at one point have the first on +%D the next page as well). %D -%D We can force expansion of marks with the following switch. - -% Synchronizing marks is a rather tricky and messy business. When -% setting a mark, a node is added to the list in order for to \TEX\ -% be able to figure out the 3 current marks when a page is made -% (last mark on previous page, first on current page, last on -% current page; in \LUATEX\ we might at one point have the first on -% the next page as well). - -% Resetting a mark is not easy. An empty one will not erase the last -% one on the previous page for instance. In \LUATEX\ we can clear a -% marks state register with \type {\clearmarks} but since this is an -% immediate operation it might have unwanted side effects when \TEX\ -% has collected several pages of text and finishing off these pages -% uses marks. - -% In \MKIV\ we provide a model that permits some control over the -% way marks are used. It is not entirely compatible with \MKII\ but -% in practice this is not a real problem. Quality has a price. - -% In fact we define multiple marks per visible mark and define -% additional ones on the fly. This has some price in terms of used -% mark registers but given the way that we fill marks in \MKIV\ -% their accumulated content is not really the issue. Also, -% periodically we cleanup any leftovers. - -\newif\ifexpandmarks \expandmarkstrue - -\def\marksomecs #1#2{\csname\string#1:m:\number#2\endcsname} -\def\markautocs #1{\csname\string#1:m:\number\csname\string#1:s\endcsname\endcsname} -\def\markmaincs #1{\csname\string#1:m\endcsname} -\def\markresetcs #1{\csname\string#1:r\endcsname} -\def\markstatecs #1{\csname\string#1:s\endcsname} -\def\markcurrentcs#1{\csname\string#1:c\endcsname} -\def\marktokscs #1{\csname\string#1:t\endcsname} - -\def\renewmarks#1% - {\ifx#1\relax - % \writestatus\m!systems{defining low level mark: \string#1}% - \newmarks#1% - \else - \clearmarks#1% - \fi} - -\unexpanded\def\definenewmark#1% - {\ifcsname\string#1:m\endcsname\else - \@EA\@EA\@EA\newcount \markstatecs #1\global\markstatecs#1\plusone - \@EA\@EA\@EA\renewmarks\markautocs #1% - \@EA\@EA\@EA\renewmarks\markmaincs #1% - \@EA\@EA\@EA\renewmarks\markresetcs #1% - \@EA\@EA\@EA\newtoks \marktokscs #1% - \@EA\@EA\@EA\let \markcurrentcs#1\empty - \listofmarks\expandafter{\the\listofmarks\checkmark#1}% - \fi} - -\long\def\setmark#1#2% marks expand - {\@EA\@EA\@EA\xdef \markcurrentcs#1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}% - \marks\markautocs #1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}% we could expand current one level - \marks\markmaincs #1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}% we could expand current one level - \marks\markresetcs #1{\number\markstatecs#1}} - -\def\resetmark#1% - {\global\advance\markstatecs#1\plusone - \@EA\@EA\@EA\glet\markcurrentcs#1\empty - \@EA\@EA\@EA\renewmarks\markautocs#1% - \the\marktokscs#1\relax} - -\def\addmarkreset#1#2% - {\global\marktokscs#2\@EA{\the\marktokscs#2\resetmark#1}} - -% already there: \prependtoks \getallmarks \to \everybeforepagebody -% -% \def\getallmarks{\the\listofmarks} - -\let\checkmark\gobbleoneargument - -\prependtoks \clearmarkswhenemptypage \to \everybeforepagebody - -\def\clearmarkswhenemptypage - {\iffalse % check if page is empty - \clearallmarks - \fi} - -\def\clearallmarks - {\let\checkmark\clearmarkchain - \the\listofmarks - \let\checkmark\gobbleoneargument} - -\def\clearmarkchain#1% - {\@EA\@EA\@EA\clearmarks\markmaincs#1% - \@EA\@EA\@EA\clearmarks\markresetcs#1% - \@EA\doclearmarkchain\@EA{\number\csname\string#1:s\endcsname}#1% - \@EA\@EA\@EA\glet\markcurrentcs#1\empty - \global\markstatecs#1\plusone} - -\def\doclearmarkchain#1#2% - {\@EA\@EA\@EA\clearmarks\marksomecs#1{#2}% - \@EA\doclearmarkchain\@EA#1\@EA{\number\numexpr#2+\minusone}} - -% Fetching (expandable versions, so no intermediate counter): - -\def\currenttopmarknumber #1{\number0\topmarks \markresetcs#1} -\def\currentfirstmarknumber#1{\number0\firstmarks\markresetcs#1} -\def\currentbotmarknumber #1{\number0\botmarks \markresetcs#1} - -\def\checkedcurrentmarkrange#1{[\currenttopmarknumber#1,\currentfirstmarknumber#1,\currentbotmarknumber#1]} - -\def\checkedcurrentmarks{\markcurrentcs} % #1 shared current mark - -\let\currentsplitfirstmarknumber\currentfirstmarknumber -\let\currentsplittopmarknumber \currenttopmarknumber -\let\currentsplitbotmarknumber \currentbotmarknumber -\let\normalsplittopmarks \normaltopmarks - -\def\uncheckedautotopmark {\normaltopmarks \markautocs} % #1 -\def\uncheckedautofirstmark {\normalfirstmarks \markautocs} % #1 -\def\uncheckedautobotmark {\normalbotmarks \markautocs} % #1 -\def\uncheckedautosplittopmark {\normalsplittopmarks \markautocs} % #1 -\def\uncheckedautosplitfirstmark {\normalsplitfirstmarks\markautocs} % #1 -\def\uncheckedautosplitbotmark {\normalsplitbotmarks \markautocs} % #1 - -\def\uncheckedmaintopmark {\normaltopmarks \markmaincs} % #1 -\def\uncheckedmainfirstmark {\normalfirstmarks \markmaincs} % #1 -\def\uncheckedmainbotmark {\normalbotmarks \markmaincs} % #1 -\def\uncheckedmainsplittopmark {\normalsplittopmarks \markmaincs} % #1 -\def\uncheckedmainsplitfirstmark {\normalsplitfirstmarks\markmaincs} % #1 -\def\uncheckedmainsplitbotmark {\normalsplitbotmarks \markmaincs} % #1 - -\def\checkedpagetopmarks #1{\ifcase\currentbotmarknumber #1\else\normaltopmarks \marksomecs#1{\currentbotmarknumber #1}\fi} -\def\checkedpagefirstmarks #1{\ifcase\currentbotmarknumber #1\else\normalfirstmarks \marksomecs#1{\currentbotmarknumber #1}\fi} -\def\checkedpagebotmarks #1{\ifcase\currentbotmarknumber #1\else\normalbotmarks \marksomecs#1{\currentbotmarknumber #1}\fi} -\def\checkedpagesplittopmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplittopmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi} -\def\checkedpagesplitfirstmarks#1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitfirstmarks\marksomecs#1{\currentsplitbotmarknumber #1}\fi} -\def\checkedpagesplitbotmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitbotmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi} - -\def\checkedfulltopmarks #1{\ifcase\currenttopmarknumber #1\else\normaltopmarks \marksomecs#1{\currenttopmarknumber #1}\fi} -\def\checkedfullfirstmarks #1{\ifcase\currentfirstmarknumber #1\else\normalfirstmarks \marksomecs#1{\currentfirstmarknumber #1}\fi} -\def\checkedfullbotmarks #1{\ifcase\currentbotmarknumber #1\else\normalbotmarks \marksomecs#1{\currentbotmarknumber #1}\fi} -\def\checkedfullsplittopmarks #1{\ifcase\currentsplittopmarknumber #1\else\normalsplittopmarks \marksomecs#1{\currentsplittopmarknumber #1}\fi} -\def\checkedfullsplitfirstmarks#1{\ifcase\currentsplitfirstmarknumber#1\else\normalsplitfirstmarks\marksomecs#1{\currentsplitfirstmarknumber#1}\fi} -\def\checkedfullsplitbotmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitbotmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi} - -% Interface macros: - -\def\getcurrentmark {\checkedcurrentmarks } -\def\gettopmark {\checkedfulltopmarks } -\def\getfirstmark {\checkedfullfirstmarks } -\def\getbotmark {\checkedfullbotmarks } -\def\getsplittopmark {\checkedfullsplittopmarks } -\def\getsplitfirstmark {\checkedfullsplitfirstmarks} -\def\getsplitbotmark {\checkedfullsplitbotmarks } - -\def\getbottommark {\getbotmark} -\def\getsplitbottommark{\getsplitbotmark} - -%D Some of these will go away (in the process of rewriting). - -\let \newmark \definenewmark -\let \newpersistentmark \newmarks -\let \normalsetmark \setmark -\let \rawnewmark \newmarks -\let \rawdefinemark \newmarks -\let \rawsetmark \normalmarks -\let \rawgettopmark \normaltopmarks -\let \rawgetfirstmark \normalfirstmarks -\let \rawgetbotmark \normalbotmarks -\let \rawgetsplitbotmark \normalsplitbotmarks -\let \rawgetsplitfirstmark \normalsplitfirstmarks -\let \rawgetsplittopmark \normalsplitfirstmarks - -\let \noninterferingmarks \relax % old color interference related hack - -%D Next comes the layer around the previous mechanism. +%D Resetting a mark is not easy. An empty one will not erase the last +%D one on the previous page for instance. In \LUATEX\ we can clear a +%D marks state register with \type {\clearmarks} but since this is an +%D immediate operation it might have unwanted side effects when \TEX\ +%D has collected several pages of text and finishing off these pages +%D uses marks. %D -%D Parameters +%D In \MKIV\ we provide an alternative model that permits some more +%D control over the way marks are used. It is not entirely compatible +%D with \MKII\ or previous \MKIV\ implementations but in practice this +%D is not a real problem. It's also easier now to extend this mechanism. -\def\markingparameter #1#2{\csname\domarkingparameter{\??mk#1}#2\endcsname} -\def\domarkingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\@EA\domarkingparentparameter\csname#1\s!parent\endcsname#2\fi} -\def\domarkingparentparameter#1#2{\ifx#1\relax\s!empty\else\domarkingparameter#1#2\fi} -\def\markingcoupling #1{\ifcsname\??mk#1\c!coupling\endcsname\@EA\markingcoupling\csname\??mk#1\c!coupling\endcsname\else#1\fi} +\definesystemattribute[marks] -\let\mainmarking\markingcoupling % compatibility +\let\currentmarking\empty -\def\doifelsemarking#1% - {\ifcsname\??mk#1\c!coupling\endcsname - \expandafter\firstoftwoarguments - \else - \expandafter\secondoftwoarguments - \fi} +\def\markingparameter #1{\csname\domarkingparameter{\??mk\currentmarking}#1\endcsname} +\def\namedmarkingparameter #1#2{\csname\domarkingparameter{\??mk#1}#2\endcsname} +\def\domarkingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\domarkingparentparameter\csname#1\s!parent\endcsname#2\fi} +\def\domarkingparentparameter#1#2{\ifx#1\relax\s!empty\else\domarkingparameter#1#2\fi} -\def\dowithmarkcommandone#1#2% \command {mark} - {\expandafter#1\csname\??mk:\markingcoupling{#2}\endcsname} +% \def\markingparameterhash #1{\domarkingparameterhash{\??mk\currentmarking}#1} +% \def\domarkingparameterhash #1#2{\ifcsname#1#2\endcsname#1\else\expandafter\domarkingparentparameterhash\csname#1\s!parent\endcsname#2\fi} +% \def\domarkingparentparameterhash#1#2{\ifx#1\relax\else\domarkingparameterhash#1#2\fi} +% +% \def\detokenizedmarkingparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??mk\currentmarking#1\endcsname}} +% +% \def\dosetmarkingattributes#1#2% style color +% {\edef\fontattributehash {\markingparameterhash#1}% +% \edef\colorattributehash{\markingparameterhash#2}% +% \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi +% \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} -\def\dowithmarkcommandtwo#1#2#3% \command {mark} {mark} - {\expandafter#1\csname\??mk:\markingcoupling{#2}\expandafter\endcsname\csname\??mk:\markingcoupling{#3}\endcsname} +\newconditional\inhibitgetmarking +\newconditional\inhibitsetmarking +\newtoks \everymarking \unexpanded\def\setupmarking {\dodoubleargument\dosetupmarking} \def\dosetupmarking[#1][#2]% - {\def\docommand##1{\getparameters[\??mk##1][#2]}% - \processcommalist[#1]\docommand} - -%D The filtercommand key is used to hook in a filtering command. Users are -%D adviced not to misuse this key. - -\getparameters - [\??mk] - [\c!expansion=\v!no, % saves a macro - \c!separator={\space\emdash\space}, - \c!limittext=\@@kolimittext, - \c!filtercommand=\firstofoneargument, - \c!state=\v!start] - -\let\alldefinedmarks\empty - -\unexpanded\def\definemarking - {\dodoubleempty\dodefinemarking} - -\def\dodefinemarking[#1][#2]% - {\doifelsenothing{#2}\donormaldefinemarking\docloneddefinemarking[#1][#2]} - -\def\donormaldefinemarking[#1][#2]% #2 empty - {\ifcsname\??mk#1\s!parent\endcsname - % already defined - \else - \letgvalue{\??mk#1\s!parent}\??mk - \dowithmarkcommandone\newmark{#1}% - \doglobal\addtocommalist{#2}\alldefinedmarks - \ifproductionrun\showmessage\m!systems{13}{#1,[#1]}\fi - \fi} - -\def\docloneddefinemarking[#1][#2]% - {\ifcsname\??mk#1\s!parent\endcsname \else \ifcsname\??mk#2\s!parent\endcsname - \doifnot{#1}{#2}% - {\setxvalue{\??mk#1\s!parent}{\??mk#2}% - \setxvalue{\??mk#1\c!coupling}{#2}% - \ifproductionrun\showmessage\m!systems{13}{#1,[#2]}\fi}% - \fi \fi} - -\def\decouplemarking[#1]% - {\letbeundefined{\??mk#1\c!coupling}} + {\ifsecondargument + \def\docommand##1{\getparameters[\??mk##1][#2]}% + \processcommalist[#1]\docommand + \else + \getparameters[\??mk][#1]% + \fi} -\def\couplemarking[#1]#2[#3]% couple 1 to 2 (this macro is not really needed) - {\setvalue{\??mk#1\c!coupling}{#3}} +% management -\def\relatemarking[#1]#2[#3]% define 1 as child of 2 - {\dowithmarkcommandtwo\addmarkreset{#1}{#3}} +\unexpanded\def\definemarking {\dodoubleempty \dodefinemarking} +\unexpanded\def\relatemarking {\dodoubleempty \dorelatemarking} +\unexpanded\def\setmarking {\dosingleargument\dosetmarking } \let\marking\setmarking +\unexpanded\def\resetmarking {\dosingleargument\doresetmarking } +\unexpanded\def\synchronizemarking{\dodoubleargument\dosynchronizemarking } -\unexpanded\def\definerawmarking[#1]% - {\dododefinemarking[#1][#1]% - \getgparameters[\??mk#1][\c!limittext=]} % global ! +\def\dodefinemarking[#1][#2]% marking parent + {\doifelsenothing{#2} + {\ctxlua{structures.marks.define("#1")}% + \getparameters[\??mk#1][\s!parent=\??mk]} + {\ctxlua{structures.marks.define("#1",{ parent = "#2" })}% + \getparameters[\??mk#1][\s!parent=\??mk#2]}} -% \decouplemarking[#1]% % no coupling with sections +\def\dorelatemarking[#1][#2]% + {\ctxlua{structures.marks.relate("#1","#2")}} -\def\fastresetmarker#1% - {\ifcsname\??mk#1\s!parent\endcsname - \dowithmarkcommandone\resetmark{#1}% +\def\dosetmarking[#1]#2% + {\ifconditional\inhibitsetmarking + % nothing + \else + \doifelse{\namedmarkingparameter{#1}\c!expansion}\v!yes + {\ctxlua{structures.marks.set("#1",\!!bs#2\!!es)}} + {\ctxlua{structures.marks.set("#1",\!!bs\detokenize{#2}\!!es)}}% \fi} -\def\fastresetmarkerlist[#1]% - {\normalexpanded{\noexpand\rawprocesscommalist[#1]}\fastresetmarker} - -\def\resetmarking - {\dosingleargument\doresetmarking} - \def\doresetmarking[#1]% - {\processcommalist[#1]\fastresetmarker} - -%D Used elsewhere: - -\let\nomarking\empty + {\ctxlua{structures.marks.reset("#1")}} -%D Basic fetching: - -\letvalue{\??mk::\??mk::\v!previous}\firstoffourarguments -\letvalue{\??mk::\??mk::\v!first }\secondoffourarguments -\letvalue{\??mk::\??mk::\v!last }\thirdoffourarguments -\letvalue{\??mk::\??mk::\v!current }\fourthoffourarguments - -\letvalue{\??mk\??mk\v!previous}\gettopmark -\letvalue{\??mk\??mk\v!first }\getfirstmark -\letvalue{\??mk\??mk\v!last }\getbotmark -\letvalue{\??mk\??mk\v!current }\getcurrentmark - -\letvalue{\??mk\??mk\v!column:\v!first}\getsplitfirstmark -\letvalue{\??mk\??mk\v!column:\v!last }\getsplitbottommark - -\def\fetchmark[#1]#2[#3]% % expandable / never use \unexpanded - {\ifcsname\??mk::#1\endcsname % saved mark - \markingparameter{#1}\c!filtercommand{\csname\??mk::\??mk::#3\@EA\@EA\@EA\endcsname\csname\??mk::#1\endcsname}% - \else\ifcsname\??mk#1\s!parent\endcsname % real mark - \markingparameter{#1}\c!filtercommand{\expandafter\dowithmarkcommandone\csname\??mk\??mk#3\endcsname{#1}}% - \fi\fi} +\def\doifelsemarking#1% + {\ctxlua{commands.testcase(structures.marks.exists("#1"))}} -\def\fetchtwomarks[#1]% - {\dofetchtwomarks[#1][#1]} +\def\dosynchronizemarking[#1][#2]% class boxnumber (some day also name), maybe second argument table + {\ifvoid#2\else\ctxlua{structures.marks.synchronize("#1",\number#2)}\fi} -\def\fetchallmarks[#1]% - {\dofetchallmarks[#1][#1]} +% \appendtoks +% \dosynchronizemarking[\v!page][\normalpagebox]% +% \to \everybeforepagebody -\def\dofetchtwomarks[#1][#2]% class class:tag - {\doifsomething{\fetchmark[#2][\v!first]} - {\fetchmark[#2][\v!first]% - \doifsomething{\fetchmark[#2][\v!last]} - {\doifnot{\fetchmark[#2][\v!first]}{\fetchmark[#2][\v!last]} - {\markingparameter{#1}\c!separator\fetchmark[#2][\v!last]}}}} +% defaults -\def\dofetchallmarks[#1][#2]% - {\doifsomething{\fetchmark[#2][\v!first]} - {\doifsomething{\fetchmark[#2][\v!previous]} - {\doifnot{\fetchmark[#2][\v!previous]}{\fetchmark[#2][\v!first]} - {\fetchmark[#2][\v!previous]\markingparameter{#1}\c!separator}}}% - \fetchtwomarks[#1][#2]} +\setupmarking + [\c!expansion=\v!no, + \c!separator=\space\emdash\space, + \c!filtercommand=\firstofoneargument, + \c!state=\v!start] -% \newtoks \everymarking +% fetching, regular interface -% \def\Interesting{\doifmodeelse{*\v!marking}{Interesting}{Boring}} -% \setupheadertexts[chapter] -% \starttext -% \chapter{This Is \Interesting} -% \stoptext +\unexpanded\def\getmarking + {\ifconditional\inhibitgetmarking + \expandafter\dotripleargument\expandafter\nogetmarking + \else + \expandafter\dotripleargument\expandafter\dogetmarking + \fi} -\def\markingnomarking#1{\splitsequence{\markingparameter{#1}\c!limittext}} % #2 +\def\nogetmarking[#1][#2][#3]% + {} \def\dogetmarking[#1][#2][#3]% - {\doif{\markingparameter{#1}\c!state}\v!start - {\bgroup + {\doif{\namedmarkingparameter{#1}\c!state}\v!start + {\begingroup \setsystemmode\v!marking \the\everymarking - \def\nomarking{\markingnomarking{#1}}% just for good old times, might disappear \ifthirdargument - \dodogetmarking{#3}{#1}{#1:#2}{#3}% + \ctxlua{structures.marks.fetch("#1","#2","#3")}% \else - \dodogetmarking{#2}{#1}{#1}{#2}% + \ctxlua{structures.marks.fetch("#1","\v!page","#2")}% \fi - \egroup}} - -\def\dodogetmarking#1#2#3#4% to be made faster - {\processaction % slow - [#1] - [ \v!both=>{\dofetchtwomarks[#2][#3]}, - \v!all=>{\dofetchallmarks[#2][#3]}, - \s!default=>{\fetchmark[#3][\v!first]}, - \s!unknown=>{\fetchmark[#3][#4]}]} - -\def\nogetmarking[#1][#2][#3]% - {} - -\unexpanded\def\getmarking - {\dotripleargument\dogetmarking} - -\let\setsomemark\setmark - -\def\setmarking - {\dosingleargument\dosetmarking} - -\def\dosetmarking[#1]#2% - {\ifcsname\??mk#1\s!parent\endcsname - \begingroup - \doifelse{\markingparameter{#1}\c!expansion}\v!yes\expandmarkstrue\expandmarksfalse - \dowithmarkcommandone\setsomemark{#1}{#2}% - \endgroup - \fi} - -\let\marking\setmarking + \endgroup}} -% to be adapted for mkiv: -% -% this version can be used when a page is built up in steps without -% feedback of the otr'd list to the mvl (i.e.\ a page made of pages, -% as in column sets where content is buffered) +% the fetchers are fully expandable: [name][method] -% reset at begin -% preset before page -% bubble in column -% refresh at end +\def\fetchmark[#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxlua{structures.marks.fetchonemark ("#1","\v!page","#2")}\fi} +\def\fetchtwomarks [#1]{\ifconditional\inhibitgetmarking\else\ctxlua{structures.marks.fetchtwomarks("#1","\v!page")}\fi} +\def\fetchallmarks [#1]{\ifconditional\inhibitgetmarking\else\ctxlua{structures.marks.fetchallmarks("#1","\v!page")}\fi} -% marks is a kind of toks, so maybe we need a low level \the\marks -% -% use \normalunexpanded here - -\def\refreshsavedmark[#1][#2]% mark tag (packing saves many hash entries) - {\setxvalue{\??mk::#1:#2}% - {{\@EA\ifx\csname\??mk::#1:pp\endcsname\relax - % empty - \else - \csname\??mk::#1:pp\endcsname - \fi}% - {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax - \fetchmark[#1][\v!first]% - \else - \csname\??mk::#1:ff\endcsname - \fi}% - {\fetchmark[#1][\v!last]}% - {\fetchmark[#1][\v!current]}}% - \setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!first]}% - \letgvalue{\??mk::#1:ff}\relax - } - -\def\bubblesavedmark[#1][#2]% no packing (not now, maybe make a six-pack later) - {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax - \setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}% - \fi} - -\def\resetsavedmark[#1][#2]% mark tag - {\doifelsenothing{\fetchmark[#1][\v!previous]} - {\letgvalue{\??mk::#1:pp}\relax} - {\setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!previous]}}% - \doifelsenothing{\fetchmark[#1][\v!first]} - {\letgvalue{\??mk::#1:ff}\relax} - {\setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}}% - \letgvalue{\??mk::#1:#2}\emptysavedmark} - -\def\presetsavedmark[#1][#2]% mark tag - {\letgvalue{\??mk::#1:#2}\emptysavedmark} - -\def\emptysavedmark{{}{}{}{}} - -% new (can be used in column sets) -% -% \getsavedmarking[M][previous] -% \getsavedmarking[M][first] -% \getsavedmarking[M][last] +% also fully expandable but here we have: [name][range][method] -\def\getsavedmarking - {\dodoubleargument\dogetsavedmarking} +\def\fetchmarking[#1]#2[#3]#4[#5]{\ifconditional\inhibitgetmarking\else\ctxlua{structures.marks.fetchonemark ("#1","#3","#5")}\fi} +\def\fetchtwomarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxlua{structures.marks.fetchtwomarks("#1","#3")}\fi} +\def\fetchallmarkings [#1]#2[#3]{\ifconditional\inhibitgetmarking\else\ctxlua{structures.marks.fetchallmarks("#1","#3")}\fi} -\def\dogetsavedmarking[#1][#2]% - {\doifelse{#2}\v!previous - {\getmarking[#1][1][\v!previous]} - {\doifelse{#2}\v!first - {\getmarking[#1][1][\v!first]} - {\getmarking[#1][\v!last]}}} +\def\markingseparator#1{\namedmarkingparameter{#1}\c!separator} +\def\markingcommand #1{\namedmarkingparameter{#1}\c!filtercommand} -%D And then \unknown\ we had a chaptertitle packaged in a -%D makeup environment. And we don't want to loose marks there! - -\newbox\collectedmarks - -\def\flushmarks % use with care to avoid empty pages - {\ifvoid\collectedmarks\else\unhbox\collectedmarks\fi} - -\def\postponemarks - {\let\setsomemark\postponemark} - -\def\postponemark#1#2% - {\global\setbox\collectedmarks\hbox{\unhbox\collectedmarks\setmark{#1}{#2}}} +%D Experimental: +%D +%D \starttyping +%D \definemarking[boxmark] +%D +%D \setbox0\ruledvbox{ +%D \marking[boxmark]{tufte} \input tufte \par +%D \marking[boxmark]{ward} \input ward \par +%D } +%D +%D \synchronizemarking[zerobox][0] \box0 +%D +%D marks: (\getmarking[boxmark][zerobox][first],\getmarking[boxmark][zerobox][last]) +%D \stoptyping \protect \endinput - -% todo: make it work in balancing -% -% \definemarking[vers][] -% \setupheadertexts -% [\doiftext{\getmarking[vers][first]} -% {\doiftextelse{\getmarking[vers][column:last]} -% {\getmarking[vers][first] -- \getmarking[vers][column:last]} -% {\getmarking[vers][first]}}] -% \starttext -% \startcolumns[n=2,balance=no] -% \dorecurse{10}{\normalexpanded{\noexpand\marking[vers]{\recurselevel}} \recurselevel:\dorecurse{4}{\input ward } \endgraf} -% \stopcolumns -% \stoptext diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv index 19930591d..552f19d86 100644 --- a/tex/context/base/strc-ref.mkiv +++ b/tex/context/base/strc-ref.mkiv @@ -1847,7 +1847,6 @@ \definereference [\v!HideField ] [action(hide)] \definereference [\v!ShowField ] [action(show)] \definereference [\v!GotoPage ] [action(gotopage)] -\definereference [\v!GotoPage ] [action(gotopage)] \definereference [\v!Query ] [action(query)] \definereference [\v!QueryAgain ] [action(queryagain)] \definereference [\v!FitWidth ] [action(fitwidth)] @@ -1855,6 +1854,10 @@ \definereference [\v!ShowThumbs ] [action(thumbnails)] \definereference [\v!ShowBookmarks ] [action(bookmarks)] +\definereference [\v!HideLayer ] [action(hidelayer)] +\definereference [\v!VideLayer ] [action(videlayer)] +\definereference [\v!ToggleLayer ] [action(togglelayer)] + \definereference [\v!firstpage] [page(firstpage)] \definereference [\v!previouspage] [page(previouspage)] \definereference [\v!nextpage] [page(nextpage)] diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv index c78f0413e..5737fc165 100644 --- a/tex/context/base/strc-ren.mkiv +++ b/tex/context/base/strc-ren.mkiv @@ -71,25 +71,23 @@ \fi \dontconvertfont} -\def\doplaceheadtextcomponent#1#2% +\def\doplaceheadtextcomponent#1% {\begingroup \setupheadcomponentfont\c!textstyle\c!textcolor - % \ifcase\headtimingmode#1\fi % can introduce cr \structureheadparameter\c!commandbefore \placeheadmargintexts \ifcsname\??nh\currentstructurehead\c!deeptextcommand\endcsname \expandafter\let\expandafter\deepstructuretitlecommand\csname\??nh\currentstructurehead\c!deeptextcommand\endcsname \fi \ifconditional\structureheadisdisplay % \ifdisplaysectionhead - % struts can be nilled with \setnostrut, the \hbox prevents break - \structureheadparameter\c!textcommand{\setstrut\begstrut\ifcase\headtimingmode\hbox{#1}\fi#2\endstrut}% + % struts can be nilled with \setnostrut + \structureheadparameter\c!textcommand{\setstrut\begstrut#1\endstrut}% \xdef\localheadheight {\the\strutht}% \xdef\localheaddepth {\the\strutdp}% \xdef\localheadlineheight{\the\lineheight}% % == \globallet\localheaddepth\strutdepth \else - \ifcase\headtimingmode#1\fi - \structureheadparameter\c!textcommand{#2}% + \structureheadparameter\c!textcommand{#1}% \fi \structureheadparameter\c!commandafter \ifconditional\structureheadisdisplay % \ifdisplaysectionhead @@ -97,19 +95,18 @@ \fi \endgroup} -\def\doplaceheadnumbercomponent#1#2% +\def\doplaceheadnumbercomponent#1% {\begingroup \setupheadcomponentfont\c!numberstyle\c!numbercolor - % \getvalue{\??ko\currentstructurehead\c!commandbefore}% strange, why here? moved 21/11/2005 \placeheadmargintexts \ifcsname\??nh\currentstructurehead\c!deepnumbercommand\endcsname \expandafter\let\expandafter\deepstructurenumbercommand\csname\??nh\currentstructurehead\c!deeptextcommand\endcsname \fi \ifconditional\structureheadisdisplay % \ifdisplaysectionhead % can be nilled with \setnostrut - \structureheadparameter\c!numbercommand{\setstrut\begstrut#2\endstrut}% + \structureheadparameter\c!numbercommand{\setstrut\begstrut#1\endstrut}% \else - \structureheadparameter\c!numbercommand{#2}% + \structureheadparameter\c!numbercommand{#1}% \fi \endgroup} @@ -149,45 +146,38 @@ % maybe auto: backreference when given, else list \fi\fi} -\def\doplacestructureheadtext#1#2#3% nodes, text, endstuff +\unexpanded\def\placestructureheadtext {\beginheadplacement + \setstructureheadmarking \doresettructureheadnumbercontent \ifconditional\structureheadleaveempty - \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{#1}% + \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{}% \makestrutofbox\sectionheadbox \else \docheckstructureheadreference \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute {\dosetlocalgridsnapping{\structureheadparameter\c!internalgrid}% \doresettructureheadnumbercontent - \ifcase\headtimingmode\or#1\fi % outerside font determines distance \dosetfontattribute{\??nh\currentstructurehead}\c!style % but we don't want color to influence user command, todo: get the if-else out of it - \structureheadparameter\c!command{}{\doplaceheadtextcomponent{#1}{#2}}}% + \structureheadparameter\c!command{}{\doplaceheadtextcomponent\getstructureheadtitle}}% \fi - \endheadplacement{#3}} + \endheadplacement{\getstructureheadsyncs}} -\def\doplacestructureheadnumbertext#1#2#3#4% nodes number text nodes +\unexpanded\def\placestructureheadnumbertext {\beginheadplacement - \doiftextelse{#2}\dosettructureheadnumbercontent\doresettructureheadnumbercontent + \setstructureheadmarking + \doiftextelse{\getstructureheadnumber}\dosettructureheadnumbercontent\doresettructureheadnumbercontent \ifconditional\structureheadleaveempty - \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{#1}% + \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{}% \makestrutofbox\sectionheadbox \else % = needed \docheckstructureheadreference \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute {\dosetlocalgridsnapping{\structureheadparameter\c!internalgrid}% - \ifcase\headtimingmode\or#1\fi \dosetfontattribute{\??nh\currentstructurehead}\c!style - \structureheadparameter\c!command{\doplaceheadnumbercomponent{#1}{#2}}{\doplaceheadtextcomponent{#1}{#3}}}% + \structureheadparameter\c!command{\doplaceheadnumbercomponent\getstructureheadnumber}{\doplaceheadtextcomponent\getstructureheadtitle}}% \fi - \endheadplacement{#4}} - - -\unexpanded\def\placestructureheadnumbertext - {\doplacestructureheadnumbertext\empty\getstructureheadnumber\getstructureheadtitle\getstructureheadsyncs} - -\unexpanded\def\placestructureheadtext - {\doplacestructureheadtext\empty\getstructureheadtitle\getstructureheadsyncs} + \endheadplacement{\getstructureheadsyncs}} \unexpanded\def\placestructureheadempty {\hbox \structureheadattribute {\getstructureheadsyncs}} @@ -243,7 +233,7 @@ \iflocation \ifconditional\structureheadisdisplay % \ifdisplaysectionhead \else - \noninterferingmarks + % obsolete: \noninterferingmarks \fi \fi \resetinteractionparameter\c!style diff --git a/tex/context/base/strc-sbe.mkiv b/tex/context/base/strc-sbe.mkiv index 75d78d48b..e9d8d9c1a 100644 --- a/tex/context/base/strc-sbe.mkiv +++ b/tex/context/base/strc-sbe.mkiv @@ -56,9 +56,13 @@ \setvalue {\e!start#2}{\startstructureblock[#1]}% \setvalue {\e!stop #2}{\stopstructureblock}} +\ifdefined \resetallstructuremarks \else + \let\resetallstructuremarks\relax +\fi + \appendtoks \doifsomething{\structureblockparameter\c!page}{\page[\structureblockparameter\c!page]}% -% TODO \resetsectionmarks\zerosection + \resetallstructuremarks \getstructureblockenvironment\currentstructureblock \structureblockparameter\c!before % don't move \dostarttagged\t!division\currentstructureblock @@ -68,7 +72,7 @@ \structureblockparameter\c!after % don't move \doifsomething{\structureblockparameter\c!page}{\page[\structureblockparameter\c!page]}% \dostoptagged -% TODO \resetsectionmarks\zerosection + \resetallstructuremarks \to \everyafterstructureblock \def\dosetupstructureblock[#1]% diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv index f872043cb..0d1cd17a6 100644 --- a/tex/context/base/strc-sec.mkiv +++ b/tex/context/base/strc-sec.mkiv @@ -78,28 +78,36 @@ \let\laststructuresectionname\empty +\let\resetallstructuremarks \relax +\let\resetcurrentstructuremarks \relax +\let\resetcurrentstructuremarkswithpage\relax + +\def\resetallstructuremarks {\resetmarking[\v!section-1]} % will become option +\def\resetcurrentstructuremarks {\resetmarking[\laststructuresectionname]} % will become option +%def\resetcurrentstructuremarkswithpage{\resetmarking[\laststructuresectionname]} % will become option + \unexpanded\def\definestructuresection[#1]% - {\doifundefined{\??nh#1} - {\global\advance\maxstructuredepth\plusone - \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}% - \setstructurelevel{#1}{\the\maxstructuredepth}% - %\letvalueempty{\??nh#1\c!marking}% ? - %\writestatus{structure}{#1\ifx\laststructuresectionname\empty\else\space->\space\laststructuresectionname\fi}% - \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}% - % this is a rather practical default that we don't want to be part of the parent chain - % lookup mechanism; it's also mkii compativle; this might become \everystructureheaddefine - \getparameters[\??nh#1] - [ \c!textstyle=\structureheadparameterstrict\c!style, - \c!textcolor=\structureheadparameterstrict\c!color, - \c!numberstyle=\structureheadparameterstrict\c!style, - \c!numbercolor=\structureheadparameterstrict\c!color]% - % so far for these default inheritances - \definemarking[#1]% - \ifnum\maxstructuredepth>\plusone - %\normalexpanded{\noexpand\couplemarking[#1][\laststructuresectionname]}% so, the child inherits settings from the parent - \normalexpanded{\noexpand\relatemarking[#1][\laststructuresectionname]}% so, the parent will reset the child - \fi - \xdef\laststructuresectionname{#1}}} + {\ifcsname\??nh#1\endcsname + % rather fatal error + \else + \global\advance\maxstructuredepth\plusone + \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}% + \setstructurelevel{#1}{\the\maxstructuredepth}% + \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}% + % this is a rather practical default that we don't want to be part of the parent chain + % lookup mechanism; it's also mkii compativle; this might become \everystructureheaddefine + \getparameters[\??nh#1] + [ \c!textstyle=\structureheadparameterstrict\c!style, + \c!textcolor=\structureheadparameterstrict\c!color, + \c!numberstyle=\structureheadparameterstrict\c!style, + \c!numbercolor=\structureheadparameterstrict\c!color]% + % so far for these default inheritances + \definemarking[#1]% + \ifnum\maxstructuredepth>\plusone + \normalexpanded{\noexpand\relatemarking[#1][\laststructuresectionname]}% so, the parent will reset the child + \fi + \xdef\laststructuresectionname{#1}% + \fi} \unexpanded\def\setupstructuresection {\dotripleempty\dosetupstructuresection} @@ -173,25 +181,28 @@ \edef\currentstructureheaddefault{\structureheadparameter\c!default}% \edef\currentstructureheadsection{\structureheadparameter\c!section}% \edef\currentstructureheadparent - {\??nh - \ifx\currentstructurehead\currentstructureheaddefault + {\ifx\currentstructurehead\currentstructureheaddefault \currentstructureheadsection \else\ifx\currentstructureheaddefault\empty \currentstructureheadsection \else \currentstructureheaddefault \fi\fi}% - \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\currentstructureheadparent]}% \setevalue{\??nh#1\s!parent}{\currentstructureheadparent}% - \ifx\currentstructureheadsection\empty - %\writestatus{structure}{#1->\currentstructureheadparent}% - \else - %\writestatus{structure}{#1->\currentstructureheadparent\space(\currentstructureheadsection)}% - % todo: filtercommand - \definemarking[#1][\currentstructureheadsection]% - \definemarking[#1\v!number][#1]% - \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]% - \setupmarking[#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]% - \fi + \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\currentstructureheadparent]}% + % or just \setevalue{\??nh#1\s!parent}{\??nh\currentstructureheadparent}% +% \ifx\currentstructureheadsection\empty +% \definemarking[#1]% +% \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]% +% \else +% \definemarking[#1][\currentstructureheadsection]% +% \definemarking[#1\v!number][#1]% +% \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]% +% \setupmarking[#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]% +% \fi + \definemarking[#1] [\currentstructureheadsection]% + \definemarking[#1\v!number][\currentstructureheadsection]% + \setupmarking [#1] [\c!filtercommand=\sectionheadmarkingtitle {#1}]% + \setupmarking [#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]% \doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}% definestructurelist ? \the\everystructureheadsetup} @@ -205,7 +216,9 @@ {\getparameters[\??nh#1][\c!label=#1]% \doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}}% definestructurelist ? {\getparameters[\??nh#1][\s!parent=\??nh#2,\c!label=#1,\c!coupling=#2]% - \definemarking[#1][#2]% +% \definemarking[#1] [#2]% +% \definemarking[#1\v!number][#2\c!number]% + \definemarking[#1] [#2]% \definemarking[#1\v!number][#2\c!number]% \doifundefined{\??li#1}{\definelist[#1][#2][\c!prefix=\v!no]}}% definestructurelist ? \the\everystructureheadsetup} @@ -407,9 +420,11 @@ \unexpanded\def\thestructureheadsynchonization {\pagetype[\currentstructureheadcoupling]% hm also number - \normalexpanded{\noexpand\setmarking[\currentstructureheadcoupling]{\currentstructurelistnumber}}% \currentstructuresynchronize} +\unexpanded\def\setstructureheadmarking + {\normalexpanded{\noexpand\setmarking[\currentstructurehead]{\currentstructurelistnumber}}} + % \unexpanded\def\fullstructureheadnumber{\labeltexts{\structureheadparameter\c!label}{\structurenumber}} % todo % \def\fullstructureheadtitle {\structurevariable{titledata.title}} % no catcode! % \unexpanded\def\fullstructureheadtitle{\structureautocatcodedget{titledata.title}{\structureheadparameter\s!catcodes}} @@ -602,15 +617,18 @@ % typesetting \unexpanded\def\placestructureheadnumbertext % dummy, will be overloaded - {\getstructureheadnumber/\getstructureheadtitle + {\setstructureheadmarking + \getstructureheadnumber/\getstructureheadtitle \getstructureheadsyncs} \unexpanded\def\placestructureheadtext % dummy, will be overloaded - {\getstructureheadtitle + {\setstructureheadmarking + \getstructureheadtitle \getstructureheadsyncs} \unexpanded\def\placestructureheadempty % dummy, will be overloaded - {\getstructureheadsyncs} + {\setstructureheadmarking + \getstructureheadsyncs} \unexpanded\def\placestructureheadhidden {\setxvalue{\currentstructurehead:sync}% @@ -709,9 +727,16 @@ {\doifsomething{\structureheadparameter#2}{\expanded{\setuplayouttext[#1][\c!state=\structureheadparameter#2]}}} \donothing} +\setvalue{\??nh:\??mk:n:\v!page }{} +\setvalue{\??nh:\??mk:n:\v!reset}{\resetcurrentstructuremarks} +\setvalue{\??nh:\??mk:y:\v!page }{\resetcurrentstructuremarks} +\setvalue{\??nh:\??mk:y:\v!reset}{\resetcurrentstructuremarks} + \def\docheckstructureheadlayout - {\doifsomething{\structureheadparameter\c!page} + {\doifelsenothing{\structureheadparameter\c!page} + {\getvalue{\??nh:\??mk:n:\structureheadparameter\c!marking}} {\page[\structureheadparameter\c!page]% + \getvalue{\??nh:\??mk:y:\structureheadparameter\c!marking}% \dodocheckstructureheadlayout\v!header\c!header \dodocheckstructureheadlayout\v!text \c!text \dodocheckstructureheadlayout\v!footer\c!footer}} diff --git a/tex/context/base/supp-fil.lua b/tex/context/base/supp-fil.lua index b95d72d7f..500443f7d 100644 --- a/tex/context/base/supp-fil.lua +++ b/tex/context/base/supp-fil.lua @@ -155,7 +155,7 @@ end -- modules can only have a tex or mkiv suffix or can have a specified one local prefixes = { "m", "p", "s", "x", "t" } -local suffixes = { "tex", "mkiv" } +local suffixes = { "mkiv", "tex" } -- what about cld local modstatus = { } local function usemodule(name,hasscheme) @@ -173,7 +173,7 @@ local function usemodule(name,hasscheme) report_modules("checking suffix driven file '%s'",name) end foundname = commands.readfilename(name,false,true) or "" - else + elseif true then for i=1,#suffixes do local fullname = file.addsuffix(name,suffixes[i]) if trace_modules then @@ -184,6 +184,35 @@ local function usemodule(name,hasscheme) break end end + else + -- -- we don't want a tex file for each mkiv file so we do some checking + -- local foundtexname = commands.readfilename(file.addsuffix(name,"tex"), false,true) or "" + -- local foundmkivname = commands.readfilename(file.addsuffix(name,"mkiv"),false,true) or "" + -- if foundtexfile ~= "" and foundmkivfile ~= "" then + -- if file.dirname(foundtexname) == file.dirname(foundmkivname) then + -- foundname = foundtexname -- we assume that this (shared) file loads the mkiv file + -- if trace_modules then + -- report_modules("using tex file for module '%s' (mkiv file on same dir)",name) + -- end + -- else + -- foundname = foundmkivname -- we assume that the tex file is an old one someplace else + -- if trace_modules then + -- report_modules("using mkiv file for module '%s' (tex file on other dir)",name) + -- end + -- end + -- elseif foundtexfile ~= "" then + -- foundname = foundtexname + -- if trace_modules then + -- report_modules("using tex file for module '%s'",name) + -- end + -- elseif foundmkivfile ~= "" then + -- foundname = foundmkivname + -- if trace_modules then + -- report_modules("using mkiv file for module '%s'",name) + -- end + -- else + -- -- nothing + -- end end if foundname ~= "" then if trace_modules then diff --git a/tex/context/base/symb-ini.mkiv b/tex/context/base/symb-ini.mkiv index f4f6bdd79..3b7e55d4a 100644 --- a/tex/context/base/symb-ini.mkiv +++ b/tex/context/base/symb-ini.mkiv @@ -263,9 +263,8 @@ %D \showsetup{usesymbols} \def\dousesymbols#1% - {\makeshortfilename[\truefilename{\f!symbolprefix#1}]% - \startreadingfile - \readsysfile\shortfilename + {\startreadingfile + \readsysfile{\truefilename{\f!symbolprefix#1}} {\showmessage\m!symbols1{#1}} \donothing \stopreadingfile} diff --git a/tex/context/base/tabl-tab.mkiv b/tex/context/base/tabl-tab.mkiv index 01b483a7e..c45a4f178 100644 --- a/tex/context/base/tabl-tab.mkiv +++ b/tex/context/base/tabl-tab.mkiv @@ -1472,7 +1472,7 @@ \let\LR\TableLR \let\AR\TableAR} -\def\TableSR +\unexpanded\def\TableSR {\ifTABLEgrayline \else \ifnum\TABLEaction=\TABLEfirstrow \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}% @@ -1485,7 +1485,7 @@ \checkTABLErow\SR \endTABLErow\TABLEseparaterow\TABLErowfactor\TABLErowfactor} -\def\TableFR +\unexpanded\def\TableFR {\ifTABLEgrayline \else \ifnum\TABLEaction=\TABLEmidrow \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}% @@ -1496,7 +1496,7 @@ \checkTABLErow\FR \endTABLErow\TABLEfirstrow\TABLErowfactor\TABLErowzero} -\def\TableMR +\unexpanded\def\TableMR {\ifTABLEgrayline \else \ifnum\TABLEaction=\TABLErule \writestatus\m!TABLE{change \string\MR\space into \string\FR/\string\SR}% @@ -1507,7 +1507,7 @@ \checkTABLErow\MR \endTABLErow\TABLEmidrow00} -\def\TableLR +\unexpanded\def\TableLR {\ifTABLEgrayline \else \ifnum\TABLEaction=\TABLErule \writestatus\m!TABLE{change \string\LR\space into \string\FR/\string\SR}% @@ -1576,7 +1576,7 @@ %D check takes care of the first and mid rows, the chuck macro %D |<|how about that name|>| handles the last row. -\def\TableAR +\unexpanded\def\TableAR {\ifTABLEgraydone \globalletempty\checkTABLEautorow \globalletempty\chuckTABLEautorow @@ -1721,7 +1721,7 @@ \let\VT\TableVT \let\VN\TableVN} -\def\TableVL +\unexpanded\def\TableVL {\checkTABLEautorow \nextTABLEgrayline \ifnum\currentTABLEcolumn>\maxTABLEcolumn @@ -1764,10 +1764,10 @@ % \HL % \stoptable -\def\TableVS {\VN1} -\def\TableVD {\VN2} -\def\TableVT {\VN3} -\def\TableVN#1{\gdef\@VLn{#1}\VL} +\unexpanded\def\TableVS {\VN1} +\unexpanded\def\TableVD {\VN2} +\unexpanded\def\TableVT {\VN3} +\unexpanded\def\TableVN#1{\gdef\@VLn{#1}\VL} \def\resetVLvalues {\dostepwiserecurse\zerocount\maxTABLEcolumn\plusone @@ -1776,7 +1776,7 @@ \letgvalueempty{eVL\recurselevel}}% \global\currentTABLEcolumn\zerocount} -\def\TableVC +\unexpanded\def\TableVC {\checkTABLEautorow \nextTABLEgrayline \ifnum\currentTABLEcolumn>\maxTABLEcolumn @@ -1805,7 +1805,7 @@ {\getvalue{eVC\the\currentTABLEcolumn}}% \doTableVL} -\def\TableHL +\unexpanded\def\TableHL {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \chuckTABLEautorow \else\ifnum\currentTABLEcolumn=\zerocount @@ -1850,7 +1850,7 @@ \let\startHLcommand\empty \let\stopHLcommand \empty -\def\TableHC +\unexpanded\def\TableHC {\complexorsimpleTable{HC}} \def\complexTableHC[#1]% @@ -1884,7 +1884,7 @@ \let\MC\TableNC \let\LC\TableNC} -\def\TableNL +\unexpanded\def\TableNL {\complexorsimpleTable{NL}} \def\complexTableNL[#1]% @@ -1899,7 +1899,7 @@ \vskip\ht0 \nobreak}} -\def\TableNR +\unexpanded\def\TableNR {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \global\currentTABLEcolumn\zerocount \normalTABLElineending @@ -1911,7 +1911,7 @@ {\nobreak \setTABLEaction\TABLEunknown}} -\def\TableNC +\unexpanded\def\TableNC {\checkTABLEautorow \nextTABLEgrayline \ifnum\currentTABLEcolumn>\maxTABLEcolumn @@ -1964,7 +1964,7 @@ \global\TABLEdivisiontrue \fi} -\def\TableDL +\unexpanded\def\TableDL {\checkTABLEdivision \complexorsimpleTable{DL}} @@ -2004,13 +2004,13 @@ %\globalletempty\stopHLcommand \fi} -\def\TableDV +\unexpanded\def\TableDV {\TableDCV\normalTABLEsimplebar} -\def\TableDC +\unexpanded\def\TableDC {\TableDCV\normalTABLEquote} -\def\TableDCV#1% +\unexpanded\def\TableDCV#1% {\checkTABLEdivision \checkTABLEautorow \ifnum\currentTABLEcolumn>\maxTABLEcolumn @@ -2021,7 +2021,7 @@ #1% \fi} -\def\TableDR +\unexpanded\def\TableDR {\ifnum\currentTABLEcolumn<\maxTABLEcolumn % silent recovery %\setTABLEerror\TABLEmissingcolumn % some day warning %\handleTABLEerror @@ -2070,7 +2070,7 @@ {\global\TABLEcr\plusone} {\global\TABLEcr\plustwo}} -\def\TableBC +\unexpanded\def\TableBC {\ifTABLEgrayline \normalTABLEquote \else @@ -2086,7 +2086,7 @@ {\addtoTABLEgrayline{\BC}% \gobbleTableBCL} -\def\TableBL +\unexpanded\def\TableBL {\TABLEnoalign\bgroup \globallet\nextTABLEgrayline\executeTABLEgrayline \globalletempty\TABLEgrayline % new @@ -2106,7 +2106,7 @@ {\analyzeTABLEcr[#1]% \handleTABLEcr} -\def\TableBR#1% +\unexpanded\def\TableBR#1% {\TABLEnoalign {\globallet\nextTABLEgrayline\executeTABLEgrayline \checkTABLEgrayline#1\BR @@ -2153,7 +2153,7 @@ {\dodoanalyzeTABLEcr[#2,#1,#3]} {\dodoanalyzeTABLEcr[\ifTABLEgrayline1\else\maxTABLEcolumn\fi,#1,#2]}} -\def\TableCL +\unexpanded\def\TableCL {\TABLEnoalign\bgroup \globallet\nextTABLEgrayline\executeTABLEgrayline \globalletempty\TABLEgrayline % new @@ -2173,7 +2173,7 @@ {\analyzeTABLEcrl{c}[#1]% \handleTABLEcr} -\def\TableRL +\unexpanded\def\TableRL {\TABLEnoalign\bgroup \globallet\nextTABLEgrayline\executeTABLEgrayline \globalletempty\TABLEgrayline % new @@ -2264,7 +2264,7 @@ \doPostTableGL #2} -\def\TableBACKGROUND +\unexpanded\def\TableBACKGROUND {\TableBR} \def\simpleTableRASTER #1{\docomplexTableRASTER[1]#1} @@ -2272,8 +2272,8 @@ \def\simpleTableCOLOR {\docomplexTableCOLOR [1]} \def\complexTableCOLOR [#1]{\docomplexTableCOLOR [#1]} -\def\TableRASTER{\complexorsimpleTable{RASTER}} -\def\TableCOLOR {\complexorsimpleTable{COLOR}} +\unexpanded\def\TableRASTER{\complexorsimpleTable{RASTER}} +\unexpanded\def\TableCOLOR {\complexorsimpleTable{COLOR}} \def\addtoTABLEgrayline#1% {\TABLEgraytoks\expandafter{\TABLEgrayline}% diff --git a/tex/context/base/trac-set.lua b/tex/context/base/trac-set.lua index f4e152b14..49dfcf74d 100644 --- a/tex/context/base/trac-set.lua +++ b/tex/context/base/trac-set.lua @@ -36,7 +36,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti data = data.data if data then for key, value in next, values do - key = gsub(key,"_",".") + -- key = gsub(key,"_",".") value = is_boolean(value,value) local functions = data[key] if functions then @@ -63,6 +63,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti end end end + return true end end end @@ -297,3 +298,27 @@ end if directives and environment and environment.engineflags.directives then d_enable(environment.engineflags.directives) end + +-- here + +if texconfig then + + local function set(k,v) + v = tonumber(v) + if v then +--~ print(k,v) + texconfig[k] = v + end + end + + directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end) + directives.register("luatex.hashextra", function(v) set("hash_extra",v) end) + directives.register("luatex.nestsize", function(v) set("nest_size",v) end) + directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end) + directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end) + directives.register("luatex.maxstrings", function(v) set("max_strings",v) end) + directives.register("luatex.paramsize", function(v) set("param_size",v) end) + directives.register("luatex.savesize", function(v) set("save_size",v) end) + directives.register("luatex.stacksize", function(v) set("stack_size",v) end) + +end diff --git a/tex/context/base/typo-cap.lua b/tex/context/base/typo-cap.lua index 6e244b9b9..eee5208a4 100644 --- a/tex/context/base/typo-cap.lua +++ b/tex/context/base/typo-cap.lua @@ -20,6 +20,7 @@ local has_attribute = node.has_attribute local unset_attribute = node.unset_attribute local set_attribute = node.set_attribute local traverse_id = node.traverse_id +local copy_node = node.copy local texattribute = tex.attribute @@ -35,8 +36,8 @@ local userskip_code = skipcodes.userskip local tasks = nodes.tasks -local fontdata = fonts.ids -local fontchar = fonts.chr +local fontdata = fonts.identifiers +local fontchar = fonts.characters local chardata = characters.data typesetters = typesetters or { } diff --git a/tex/context/base/typo-dir.lua b/tex/context/base/typo-dir.lua index 931e6c90c..006c184c6 100644 --- a/tex/context/base/typo-dir.lua +++ b/tex/context/base/typo-dir.lua @@ -51,8 +51,8 @@ local new_textdir = nodepool.textdir local beginmath_code = mathcodes.beginmath local endmath_code = mathcodes.endmath -local fontdata = fonts.ids -local fontchar = fonts.chr +local fontdata = fonts.identifiers +local fontchar = fonts.characters local chardata = characters.data local chardirs = characters.directions -- maybe make a special mirror table @@ -381,7 +381,7 @@ function directions.process(namespace,attribute,start) -- todo: make faster end else if trace_directions then - list[#list+1] = format("node %s (subtype %s)",node.type(id),current.subtype) + list[#list+1] = format("node %s (subtype %s)",nodecodes[id],current.subtype) end if finish then finish_auto_before() diff --git a/tex/context/base/typo-rep.lua b/tex/context/base/typo-rep.lua index bdeb813ba..5519207e2 100644 --- a/tex/context/base/typo-rep.lua +++ b/tex/context/base/typo-rep.lua @@ -25,7 +25,7 @@ local has_attribute = node.has_attribute local chardata = characters.data local collected = false local attribute = attributes.private("stripping") -local fontdata = fonts.ids +local fontdata = fonts.identifiers local tasks = nodes.tasks local nodecodes = nodes.nodecodes diff --git a/tex/context/base/util-seq.lua b/tex/context/base/util-seq.lua index 14c425dfc..028d0cf8d 100644 --- a/tex/context/base/util-seq.lua +++ b/tex/context/base/util-seq.lua @@ -151,20 +151,20 @@ return function(head%s) return head, done end]] -function sequencers.nodeprocessor(t,n) +function sequencers.nodeprocessor(t,nofarguments) local list, order, kind, gskip, askip = t.list, t.order, t.kind, t.gskip, t.askip local vars, calls, args, n = { }, { }, nil, 0 - if n == 0 then + if nofarguments == 0 then args = "" - elseif n == 1 then + elseif nofarguments == 1 then args = ",one" - elseif n == 2 then + elseif nofarguments == 2 then args = ",one,two" - elseif n == 3 then + elseif nofarguments == 3 then args = ",one,two,three" - elseif n == 4 then + elseif nofarguments == 4 then args = ",one,two,three,four" - elseif n == 5 then + elseif nofarguments == 5 then args = ",one,two,three,four,five" else args = ",..." @@ -189,6 +189,6 @@ function sequencers.nodeprocessor(t,n) end end local processor = format(template,concat(vars,"\n"),args,concat(calls,"\n")) ---~ print(processor) + -- print(processor) return processor end diff --git a/tex/context/base/x-chemml.tex b/tex/context/base/x-chemml.tex deleted file mode 100644 index 65d33b5ec..000000000 --- a/tex/context/base/x-chemml.tex +++ /dev/null @@ -1,16 +0,0 @@ -%D \module -%D [ file=m-chemml, -%D version=2001.09.12, -%D title=\CONTEXT\ XML Modules, -%D subtitle=Loading CHEMML Filters, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{x-chemml} - -\endinput diff --git a/tex/context/base/x-mathml.tex b/tex/context/base/x-mathml.tex deleted file mode 100644 index 8ad493eeb..000000000 --- a/tex/context/base/x-mathml.tex +++ /dev/null @@ -1,16 +0,0 @@ -%D \module -%D [ file=x-mathml, -%D version=1999.12.20, -%D title=\CONTEXT\ XML Modules, -%D subtitle=Loading \MATHML\ Filters, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{x-mathml} - -\endinput diff --git a/tex/context/base/x-newcml.tex b/tex/context/base/x-newcml.mkii index 76d69ed51..76d69ed51 100644 --- a/tex/context/base/x-newcml.tex +++ b/tex/context/base/x-newcml.mkii diff --git a/tex/context/base/x-newmme.tex b/tex/context/base/x-newmme.mkii index 5e17ea7a4..5e17ea7a4 100644 --- a/tex/context/base/x-newmme.tex +++ b/tex/context/base/x-newmme.mkii diff --git a/tex/context/base/x-newmml.tex b/tex/context/base/x-newmml.tex deleted file mode 100644 index 9eb994021..000000000 --- a/tex/context/base/x-newmml.tex +++ /dev/null @@ -1,16 +0,0 @@ -%D \module -%D [ file=x-newmml, -%D version=2005.06.10, % 1999.12.20, -%D title=\CONTEXT\ XML Macros, -%D subtitle=MathML Renderer, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{x-newmml} - -\endinput diff --git a/tex/context/base/x-newmmo.tex b/tex/context/base/x-newmmo.mkii index c3b56cc16..c3b56cc16 100644 --- a/tex/context/base/x-newmmo.tex +++ b/tex/context/base/x-newmmo.mkii diff --git a/tex/context/base/x-newpml.tex b/tex/context/base/x-newpml.mkii index d69231e3f..d69231e3f 100644 --- a/tex/context/base/x-newpml.tex +++ b/tex/context/base/x-newpml.mkii diff --git a/tex/context/base/x-physml.tex b/tex/context/base/x-physml.tex deleted file mode 100644 index 10768db51..000000000 --- a/tex/context/base/x-physml.tex +++ /dev/null @@ -1,16 +0,0 @@ -%D \module -%D [ file=m-physml, -%D version=2001.09.04, -%D title=\CONTEXT\ XML Modules, -%D subtitle=Loading PHYSML Filters, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{x-physml} - -\endinput diff --git a/tex/context/base/x-res-50.tex b/tex/context/base/x-res-50.mkii index 6fa1a3e4f..6fa1a3e4f 100644 --- a/tex/context/base/x-res-50.tex +++ b/tex/context/base/x-res-50.mkii diff --git a/tex/context/base/x-res-50.mkiv b/tex/context/base/x-res-50.mkiv new file mode 100644 index 000000000..f29b1d61e --- /dev/null +++ b/tex/context/base/x-res-50.mkiv @@ -0,0 +1,427 @@ +%D \module +%D [ file=x-res-50, +%D version=2004.02.18, +%D title=\CONTEXT\ Style File, +%D subtitle=Multimedia Presentation, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={\PRAGMA\ / Hans Hagen \& Ton Otten}] +%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 is a preliminary module, using a preliminary xml media format that +%D looks as follows (record is embedded in resource library element): +%D +%D \starttyping +%D <rl:mediaclip label="sample 1"> +%D <rl:name>Sample One</rl:name> +%D <rl:mime>application/x-shockwave-flash</rl:mime> +%D <rl:file>http://localhost/mb.swf</rl:file> +%D <rl:width>8cm</rl:width> +%D <rl:height>6cm</rl:height> +%D <rl:text>Nothing special to be said.</rl:text> +%D <rl:picture>cow.pdf</rl:picture> +%D </rl:mediaclip> +%D +%D <rl:mediaclip label="sample 2"> +%D <rl:name>Sample Two</rl:name> +%D <rl:mime>audio/mpeg</rl:mime> +%D <rl:file>mb.mp3</rl:file> +%D <rl:picture>mb.jpg</rl:picture> +%D </rl:mediaclip> +%D \stoptyping +%D +%D \starttyping +%D texexec --pdf --use=med-show yourfile.xml +%D \stoptyping +%D +%D Bonus: +%D +%D \starttyping +%D --arg="url=http://localhost:8881/e:/media" +%D \stoptyping + +% output=pdftex + +% \nopdfcompression + +% bugs in recognizing embedded stream cq. player +% bugs in layers + hide/vide +% bugs in save javascripts +% bugs all over the place + +% in principe kan menu overal hetzelfde zijn als we via JS per pagina de clip var zetten, +% hoewel, misschien zal het menu gaan afhangen van de soort clip + +% viewerlayer (eigenschap) aan framed en layer + +\usemodule[meta-dum] \usemodule[contml] \autoXMLnamespace [context] + +\doifelsevariable{environment}{url} + {\setvariables[mediaclip][url=\getvariable{environment}{url}/]} + {\setvariables[mediaclip][url=]} + +\startmode [silent] + + \setvariables[mediaclip:option][start=] + +\stopmode + +\startnotmode [silent] + + \setvariables[mediaclip:option][start=auto] + +\stopnotmode + +\chardef\XMLtokensreduction=1 \dontcomplain % \showframe \pdfcompresslevel=0 + +\setuppapersize + [S6][S6] + +\definemeasure [GapSize] [\dimexpr( 15pt)] +\definemeasure [EdgeWidth] [\dimexpr(100pt)] +\definemeasure [TextWidth] [\dimexpr(.5\textwidth)] +\definemeasure [RenderingWidth] [\dimexpr(\textwidth)] +\definemeasure [RenderingHeight] [\dimexpr(\textheight)] + +% \XMLflush{rl:ratio}\dimexpr(.75\textwidth), + +\setuplayout + [backspace=\measure{GapSize}, + topspace=\measure{GapSize}, + header=0pt, + footer=0pt, + margin=0pt, + edgedistance=2\measure{GapSize}, + rightedge=\measure{EdgeWidth}, + bottomdistance=2\measure{GapSize}, + bottom=2\measure{GapSize}, + height=fit, + width=fit] + +\setupinteraction + [state=start, + color=lightgray, + contrastcolor=lightgray, + openaction=PresetFields, + closeaction=ForgetChanges, + menu=on, + click=no] + +\setupinteractionscreen + [option=max] + +\setupcolors + [state=start] + +\usetypescript + [palatino][texnansi] + +\setupbodyfont + [palatino] + +\definecolor[darkgray] [s=.2] +\definecolor[mediumgray][s=.5] +\definecolor[lightgray] [s=.8] +\definecolor[transgray] [s=1,t=.9,a=1] + +\setupbackgrounds + [page] + [backgroundoffset=\measure{GapSize}, + background={color,pagebutton}, + backgroundcolor=black] + +\definelayer + [main] + [width=\textwidth, + height=\textheight] + +\definelayer + [extra] + [width=\rightedgewidth, + height=\bottomheight] + +\setupbackgrounds + [text] + [backgroundoffset=0pt, + background=main] + +\setupbackgrounds + [bottom][rightedge] + [backgroundoffset=0pt, + background=extra] + +% java scripts + +\startJSpreamble {handy} used now + + function ForgetChanges () + { this.dirty = false } + + function PresetFields () + { this.syncAnnotScan() } + +\stopJSpreamble + +\definereference[PresetFields] [JS(PresetFields)] +\definereference[ForgetChanges][JS(ForgetChanges)] + +% layers + +\defineviewerlayer [menulayer] [title=menulayer] +\defineviewerlayer [textlayer] [title=textlayer,state=stop] +\defineviewerlayer [datalayer] [title=datalayer,state=stop] + +\setupfield + [rollbutton] + [fieldlayer=menulayer] + +\setupfield + [rollbutton] + [option=auto] + +\definepalet + [rollover] + [n=darkgray, + r=lightgray, + d=darkgray] + +% list + +\definelist + [clips] + [expansion=yes, + criterium=text, + alternative=f] + +% navigation + +\defineoverlay[pagebutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer},ToggleLayer{menulayer}}] +\defineoverlay[textbutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer}}] +\defineoverlay[databutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer}}] + +% clips + +\defineXMLenvironment + [rl:mediaclip] + {\setups[mediaclip:start]} + {\setups[mediaclip:stop]} + +\newcounter\MediaClip + +\startsetups[mediaclip:start] + + \bgroup \startXMLignore + + % no \startstandardmakeup here since we need the dsta in the menuconstruction + + \defineXMLsave [rl:name] + \defineXMLsave [rl:visualization] + \defineXMLsave [rl:file] + \defineXMLsave [rl:mime] + \defineXMLsave [rl:picture] [backgroundcolor=lightgray] + + \defineXMLsavecontent [rl:text] {No additional info.} + \defineXMLsavecontent [rl:width] {\measure{RenderingWidth}} + \defineXMLsavecontent [rl:height] {\measure{RenderingHeight}} + \defineXMLsavecontent [rl:aspect] {1} + +\stopsetups + +\startsetups[mediaclip:stop] + + \startstandardmakeup + + \doifXMLdataelse{rl:file} + {\setups[mediaclip:file:yes]} + {} + + \doifXMLdataelse{rl:picture} + {\doifelse{\XMLflush{rl:picture}}{self} + {\setups[mediaclip:picture:self]} + {\setups[mediaclip:picture:yes]}} + {\setups[mediaclip:picture:no]} + + \doifXMLdata{rl:text} + {\setups[mediaclip:text]} + + \setlayerframed + [extra] + [preset=rightbottom] + [frame=off,offset=overlay,width=fit,background=databutton,align=left] + {\startviewerlayer[datalayer]\setups[mediaclip:data]\stopviewerlayer} + + \doifXMLdataelse{rl:name} + {\writetolist[clips]{}{\XMLflush{rl:name}}} + {\writetolist[clips]{}{\XMLpar{rl:mediaclip}{label}{unknown}}} + + \stopstandardmakeup + + \stopXMLignore \egroup + +\stopsetups + +\setuptabulate + [before=, + after=] + +\def\rlCleanupFileName#1% + {\bgroup + \def\cleanup##1##2{\ifnum##1##2=20 \space\else\char\octnumber{##1##2}\fi}% + \defineactivecharacter 37 {\cleanup}% + \scantokens{#1}% + \egroup} + +\startsetups[mediaclip:data] + + \noindent \buttonframed + [framecolor=lightgray, + foregroundcolor=lightgray] + {\bf\expanded{\rlCleanupFileName{\XMLflush{rl:file}}}} + + \vskip.75\measure{GapSize} + + \noindent \buttonframed + [framecolor=lightgray, + foregroundcolor=lightgray] + {\bf\XMLflush{rl:mime}} + +\stopsetups + +\startsetups[mediaclip:picture:self] + + \definerenderingwindow + [mediaclip] + [width=\XMLflush{rl:width}, + height=\XMLflush{rl:height}, + frame=off, + openpageaction=StartCurrentRendering, + closepageaction=StopCurrentRendering] + + \setlayer + [main] + {\placerenderingwindow[mediaclip][mediaclip-\MediaClip]} + +\stopsetups + +\startsetups[mediaclip:picture:yes] + + \setlayer + [main] + {\externalfigure + [\XMLflush{rl:picture}] + [background=color, + backgroundcolor=\XMLpar{rl:picture}{backgroundcolor}{lightgray}, + factor=max, + width=\XMLflush{rl:width}, + height=\XMLflush{rl:height}]} + +\stopsetups + +\startsetups[mediaclip:picture:no] + + \setlayer + [main] + {\externalfigure + [dummy] + [width=\XMLflush{rl:width}, + height=\XMLflush{rl:height}]} + +\stopsetups + +\startsetups[mediaclip:file:yes] + + \doglobal\increment\MediaClip + + \useexternalrendering + [mediaclip-\MediaClip] + [\XMLflush{rl:mime}] + [\getvariable{mediaclip}{url}\XMLflush{rl:file}] + [\getvariable{mediaclip:option}{start}] + +\stopsetups + +\defineinteractionmenu + [navigation] [right] + +\defineinteractionmenu + [control] [bottom] + +\setupinteractionmenu + [navigation,control] + [state=start, + frame=on, + middle=\hskip.5\measure{GapSize}, + inbetween=\vskip.5\measure{GapSize}] + +\setupinteractionmenu + [right,bottom] + [distance=overlay] + +\startinteractionmenu [navigation] + \rob [HideLayer{textlayer},FirstPage] First Page \\ + \rob [HideLayer{textlayer},PreviousPage] Previous Page \\ + \rob [HideLayer{textlayer},NextPage] Next Page \\ + \rob [HideLayer{textlayer},LastPage] Last Page \\ + \rob [HideLayer{textlayer},clips] List Of Clips \\ + \rob [ForgetChanges,CloseDocument] Close Document \\ +\stopinteractionmenu + +\startinteractionmenu [control] + \rob [StartRendering{mediaclip-\MediaClip}] Start \\ + \rob [StopRendering{mediaclip-\MediaClip}] Stop \\ + \rob [PauseRendering{mediaclip-\MediaClip}] Pause \\ + \rob [ResumeRendering{mediaclip-\MediaClip}] Resume \\ + \rob [ToggleLayer{datalayer}] Info \\ + \doifXMLdata{rl:text}{\rob [HideLayer{datalayer},ToggleLayer{textlayer}] Text \\} +\stopinteractionmenu + +\startsetups[mediaclip:text] + + \setlayer + [extra] + [preset=rightbottom] + {\startviewerlayer[textlayer] + \framed + [align=normal, + frame=off, + width=\measure{TextWidth}, + foregroundcolor=darkgray, + background={color,textbutton}, + backgroundcolor=lightgray] + {\XMLflush{rl:text}} + \stopviewerlayer} + +\stopsetups + +\setupcolors[textcolor=lightgray] + +\startsetups [library:start] + + \starttext + + \setupinteractionmenu[control][state=stop] + + \title[clips]{List of Media Clips} + + \placelist[clips] \page + + \setupinteractionmenu[control][state=start] + +\stopsetups + +\startsetups [library:stop] + + \stoptext + +\stopsetups + +\defineXMLenvironment [rl:resourcelibrary] + {\setups[library:start]} + {\setups[library:stop]} + +\doifelsenothing{\inputfilename} + {\processXMLfile{mediaclient.xml}} + {\processXMLfile{\inputfilename}} diff --git a/tex/context/base/x-set-11.tex b/tex/context/base/x-set-11.tex deleted file mode 100644 index 920fd7426..000000000 --- a/tex/context/base/x-set-11.tex +++ /dev/null @@ -1,110 +0,0 @@ -%D \module -%D [ file=x-set-11, -%D version=2004.10.31, -%D remark=setupx.tex: 1998.07.20 and later, -%D title=\CONTEXT\ Setup Definitions, -%D subtitle=Macro Definitions, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\loadmarkfile{x-set-11} - -\endinput - -% Old code, a mixture of loading in mkiv and processing in mkii. - -\startluacode - do - document = document or { } - - document.setups = { - loaded = { }, - root = nil, - used = { }, - } - - function document.setups.load(filename) - filename = resolvers.find_file(filename) or "" - if filename ~= "" and not document.setups.loaded[filename] then - local loaded = xml.load(filename) - if loaded then - if document.setups.root then - xml.inject(document.setups.root,"/",loaded) - else - document.setups.root = loaded - end - document.setups.loaded[filename] = true - end - end - end - function document.setups.name(ek) - local at = ek.at - local name = at.name - if at.type == 'environment' then - name = "start" .. name - end - if at.variant then - name = name .. ":" .. at.variant - end - if at.generated == "yes" then - name = name .. "*" - end - return name:lower() - end - function document.setups.show(name) - if document.setups.root then - local name = name:gsub("[<>]","") - local setup = xml.first(document.setups.root,"cd:command[@name='" .. name .. "']") - document.setups.used[#document.setups.used+1] = setup - xml.sprint(setup) - end - end - function document.setups.showused() - if document.setups.root and next(document.setups.used) then - for k,v in ipairs(table.sortedkeys(document.setups.used)) do - xml.sprint(document.setups.used[v]) - end - end - end - function document.setups.showall() - if document.setups.root then - local list = { } - xml.each_element(document.setups.root,"cd:command", function(r,d,t) - local ek = d[t] - list[document.setups.name(ek)] = ek - end ) - for k,v in ipairs(table.sortedkeys(list)) do - xml.sprint(list[v]) - end - end - end - function document.setups.resolve(name) - if document.setups.root then - local e = xml.filter(document.setups.root,string.format("cd:define[@name='%s']/text()",name)) - if e then - xml.sprint(e) - end - end - end - end -\stopluacode - -\def\mkloadsetups #1{\ctxlua{document.setups.load("#1")}} -\def\mkshowsetup #1{\ctxlua{document.setups.show("#1")}} -\def\mkshowusedsetups {\bgroup\enableXML\ctxlua{document.setups.showused()}\egroup} -\def\mkshowallsetups {\bgroup\enableXML\ctxlua{document.setups.showall ()}\egroup} - -\def\mkshowsetup #1{\bgroup\enableXML\ctxlua{document.setups.show("#1")}\egroup} - -\defineXMLenvironmentsave [cd:define] [name=] - {} - -\defineXMLsingular [cd:resolve] [name=] - {\enableXML\ignorespaces\ctxlua{document.setups.resolve("\XMLop{name}")}} - -\endinput diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index 2f3ad7e85..795ddb515 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 11/03/10 19:42:18 +-- merge date : 11/12/10 18:22:36 do -- begin closure to overcome local limits and interference @@ -285,11 +285,6 @@ end patterns.textline = content ---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more ---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more ---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps ---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps - local splitters_s, splitters_m = { }, { } local function splitat(separator,single) @@ -311,6 +306,11 @@ end lpeg.splitat = splitat +--~ local p = splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more +--~ local p = splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more +--~ local p = splitat("->",false) print(match(p,"oeps")) -- oeps +--~ local p = splitat("->",true) print(match(p,"oeps")) -- oeps + local cache = { } function lpeg.split(separator,str) @@ -2089,6 +2089,13 @@ end --~ end --~ end +-- for myself: + +function file.strip(name,dir) + local b, a = match(name,"^(.-)" .. dir .. "(.*)$") + return a ~= "" and a or name +end + end -- closure do -- begin closure to overcome local limits and interference @@ -2699,10 +2706,6 @@ local new_node = node.new local glyph_code = nodecodes.glyph --- fonts - -local fontdata = fonts.ids or { } - function nodes.simple_font_handler(head) -- lang.hyphenate(head) head = nodes.handlers.characters(head) @@ -2718,7 +2721,7 @@ if tex.attribute[0] ~= 0 then texio.write_nl("log","!") texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be") texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special") - texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.") + texio.write_nl("log","! purposes so setting them at the TeX end might break the font handler.") texio.write_nl("log","!") tex.attribute[0] = 0 -- else no features @@ -2729,36 +2732,41 @@ nodes.handlers.protectglyphs = node.protect_glyphs nodes.handlers.unprotectglyphs = node.unprotect_glyphs function nodes.handlers.characters(head) - local usedfonts, done, prevfont = { }, false, nil - for n in traverse_id(glyph_code,head) do - local font = n.font - if font ~= prevfont then - prevfont = font - local used = usedfonts[font] - if not used then - local tfmdata = fontdata[font] - if tfmdata then - local shared = tfmdata.shared -- we need to check shared, only when same features - if shared then - local processors = shared.processes - if processors and #processors > 0 then - usedfonts[font] = processors - done = true + local fontdata = fonts.identifiers + if fontdata then + local usedfonts, done, prevfont = { }, false, nil + for n in traverse_id(glyph_code,head) do + local font = n.font + if font ~= prevfont then + prevfont = font + local used = usedfonts[font] + if not used then + local tfmdata = fontdata[font] -- + if tfmdata then + local shared = tfmdata.shared -- we need to check shared, only when same features + if shared then + local processors = shared.processes + if processors and #processors > 0 then + usedfonts[font] = processors + done = true + end end end end end end - end - if done then - for font, processors in next, usedfonts do - for i=1,#processors do - local h, d = processors[i](head,font,0) - head, done = h or head, done or d + if done then + for font, processors in next, usedfonts do + for i=1,#processors do + local h, d = processors[i](head,font,0) + head, done = h or head, done or d + end end end + return head, true + else + return head, false end - return head, true end -- helper @@ -2820,7 +2828,7 @@ if not modules then modules = { } end modules ['node-inj'] = { license = "see context related readme files" } --- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini) +-- tricky ... fonts.identifiers is not yet defined .. to be solved (maybe general tex ini) -- This is very experimental (this will change when we have luatex > .50 and -- a few pending thingies are available. Also, Idris needs to make a few more @@ -2835,18 +2843,18 @@ local report_injections = logs.new("injections") local attributes, nodes, node = attributes, nodes, node -fonts = fonts or { } -fonts.tfm = fonts.tfm or { } -fonts.ids = fonts.ids or { } +fonts = fonts or { } +fonts.tfm = fonts.tfm or { } +fonts.identifiers = fonts.identifiers or { } -nodes.injections = nodes.injections or { } -local injections = nodes.injections +nodes.injections = nodes.injections or { } +local injections = nodes.injections -local fontdata = fonts.ids -local nodecodes = nodes.nodecodes -local glyph_code = nodecodes.glyph -local nodepool = nodes.pool -local newkern = nodepool.kern +local fontdata = fonts.identifiers +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph +local nodepool = nodes.pool +local newkern = nodepool.kern local traverse_id = node.traverse_id local unset_attribute = node.unset_attribute @@ -3293,14 +3301,18 @@ fontloader.totable = fontloader.to_table fonts = fonts or { } --- we will also have des and fam hashes +-- beware, some already defined --- beware, soem alreadyu defined +fonts.identifiers = mark(fonts.identifiers or { }) -- fontdata +-----.characters = mark(fonts.characters or { }) -- chardata +-----.csnames = mark(fonts.csnames or { }) -- namedata +-----.quads = mark(fonts.quads or { }) -- quaddata -fonts.ids = mark(fonts.ids or { }) fonts.identifiers = fonts.ids -- aka fontdata -fonts.chr = mark(fonts.chr or { }) fonts.characters = fonts.chr -- aka chardata -fonts.qua = mark(fonts.qua or { }) fonts.quads = fonts.qua -- aka quaddata -fonts.css = mark(fonts.css or { }) fonts.csnames = fonts.css -- aka namedata +--~ fonts.identifiers[0] = { -- nullfont +--~ characters = { }, +--~ descriptions = { }, +--~ name = "nullfont", +--~ } fonts.tfm = fonts.tfm or { } fonts.vf = fonts.vf or { } @@ -3309,15 +3321,7 @@ fonts.pfb = fonts.pfb or { } fonts.otf = fonts.otf or { } fonts.privateoffset = 0xF0000 -- 0x10FFFF -fonts.verbose = false -- more verbose cache tables - -fonts.ids[0] = { -- nullfont - characters = { }, - descriptions = { }, - name = "nullfont", -} - -fonts.chr[0] = { } +fonts.verbose = false -- more verbose cache tables (will move to context namespace) fonts.methods = fonts.methods or { base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }, @@ -3426,7 +3430,7 @@ fonts.initializers.common = fonts.initializers.common or { } local set_attribute = node.set_attribute -local fontdata = fonts.ids +local fontdata = fonts.identifiers local nodecodes = nodes.nodecodes local disc_code = nodecodes.disc @@ -3692,7 +3696,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid) end -- status local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized - local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil) + local hasmath = (tfmtable.mathparameters ~= nil and next(tfmtable.mathparameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil) local nodemode = tfmtable.mode == "node" local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude local hasitalic = tfmtable.has_italic @@ -3718,7 +3722,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid) t.fonts = table.fastcopy(tfmtable.fonts) -- hm also at the end end local tp = t.parameters - local mp = t.math_parameters + local mp = t.mathparameters local tfmp = tfmtable.parameters -- let's check for indexes -- tp.slant = (tfmp.slant or tfmp[1] or 0) @@ -5602,7 +5606,7 @@ fonts.otf = fonts.otf or { } local otf = fonts.otf local tfm = fonts.tfm -local fontdata = fonts.ids +local fontdata = fonts.identifiers local chardata = characters and characters.data -- not used otf.features = otf.features or { } @@ -6952,7 +6956,7 @@ actions["check metadata"] = function(data,filename,raw) data.map = nil end -local private_math_parameters = { +local private_mathparameters = { "FractionDelimiterSize", "FractionDelimiterDisplayStyleSize", } @@ -6960,8 +6964,8 @@ local private_math_parameters = { actions["check math parameters"] = function(data,filename,raw) local mathdata = data.metadata.math if mathdata then - for m=1,#private_math_parameters do - local pmp = private_math_parameters[m] + for m=1,#private_mathparameters do + local pmp = private_mathparameters[m] if not mathdata[pmp] then if trace_loading then report_otf("setting math parameter '%s' to 0", pmp) @@ -7174,7 +7178,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th local unicodes = luatex.unicodes -- names to unicodes local indices = luatex.indices local mode = data.mode or "base" - local characters, parameters, math_parameters, descriptions = { }, { }, { }, { } + local characters, parameters, mathparameters, descriptions = { }, { }, { }, { } local designsize = metadata.designsize or metadata.design_size or 100 if designsize == 0 then designsize = 100 @@ -7189,7 +7193,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th if metadata.math then -- parameters for name, value in next, metadata.math do - math_parameters[name] = value + mathparameters[name] = value end -- we could use a subset for u, char in next, characters do @@ -7304,7 +7308,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th return { characters = characters, parameters = parameters, - math_parameters = math_parameters, + mathparameters = mathparameters, descriptions = descriptions, indices = indices, unicodes = unicodes, @@ -7487,7 +7491,7 @@ local report_otf = logs.new("load otf") local fonts = fonts local otf = fonts.otf -local fontdata = fonts.ids +local fontdata = fonts.identifiers otf.features = otf.features or { } otf.features.default = otf.features.default or { } @@ -8238,7 +8242,7 @@ local markonce = true local cursonce = true local kernonce = true -local fontdata = fonts.ids +local fontdata = fonts.identifiers otf.features.process = { } @@ -10784,7 +10788,7 @@ local has_attribute = node.has_attribute local traverse_id = node.traverse_id local traverse_node_list = node.traverse -local fontdata = fonts.ids +local fontdata = fonts.identifiers local state = attributes.private('state') local categories = characters and characters.categories or { } -- sorry, only in context @@ -14983,7 +14987,8 @@ if not modules then modules = { } end modules ['font-def'] = { license = "see context related readme files" } -local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower +local concat = table.concat +local format, gmatch, match, find, lower, gsub = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub local tostring, next = tostring, next local lpegmatch = lpeg.match @@ -15006,13 +15011,11 @@ default loader that only handles <l n='tfm'/>.</p> local fonts = fonts local tfm = fonts.tfm local vf = fonts.vf -local fontcsnames = fonts.csnames fonts.used = allocate() tfm.readers = tfm.readers or { } tfm.fonts = allocate() -tfm.internalized = allocate() -- internal tex numbers local readers = tfm.readers local sequence = allocate { 'otf', 'ttf', 'afm', 'tfm' } @@ -15102,9 +15105,12 @@ end definers.getspecification = getspecification -function definers.registersplit(symbol,action) +function definers.registersplit(symbol,action,verbosename) addspecifier(symbol) variants[symbol] = action + if verbosename then + variants[verbosename] = action + end end function definers.makespecification(specification, lookup, name, sub, method, detail, size) @@ -15315,7 +15321,8 @@ function tfm.read(specification) if not tfmtable then local forced = specification.forced or "" if forced ~= "" then - tfmtable = readers[lower(forced)](specification) + local reader = readers[lower(forced)] + tfmtable = reader and reader(specification) if not tfmtable then report_define("forced type %s of %s not found",forced,specification.name) end @@ -15368,17 +15375,17 @@ function tfm.readanddefine(name,size) -- no id local hash = tfm.hashinstance(specification) local id = definers.registered(hash) if not id then - local fontdata = tfm.read(specification) - if fontdata then - fontdata.hash = hash - id = font.define(fontdata) - definers.register(fontdata,id) - tfm.cleanuptable(fontdata) + local tfmdata = tfm.read(specification) + if tfmdata then + tfmdata.hash = hash + id = font.define(tfmdata) + definers.register(tfmdata,id) + tfm.cleanuptable(tfmdata) else id = 0 -- signal end end - return fonts.ids[id], id + return fonts.identifiers[id], id end --[[ldx-- @@ -15466,6 +15473,16 @@ function readers.afm(specification,method) return tfmtable end +function readers.pfb(specification,method) -- only called when forced + local original = specification.specification + if trace_loading then + report_afm("using afm reader for '%s'",original) + end + specification.specification = gsub(original,"%.pfb",".afm") + specification.forced = "afm" + return readers.afm(specification,method) +end + -- maybe some day a set of names local function check_otf(forced,specification,suffix,what) @@ -15545,31 +15562,29 @@ not gain much. By the way, passing id's back to in the callback was introduced later in the development.</p> --ldx]]-- -local lastdefined = nil -- we don't want this one to end up in s-tra-02 +local lastdefined = nil -- we don't want this one to end up in s-tra-02 +local internalized = { } function definers.current() -- or maybe current return lastdefined end -function definers.register(fontdata,id) - if fontdata and id then - local hash = fontdata.hash - if not tfm.internalized[hash] then +function definers.register(tfmdata,id) -- will be overloaded + if tfmdata and id then + local hash = tfmdata.hash + if not internalized[hash] then if trace_defining then - report_define("loading at 2 id %s, hash: %s",id or "?",hash or "?") + report_define("registering font, id: %s, hash: %s",id or "?",hash or "?") end - fonts.identifiers[id] = fontdata - fonts.characters [id] = fontdata.characters - fonts.quads [id] = fontdata.parameters and fontdata.parameters.quad - -- todo: extra functions, e.g. setdigitwidth etc in list - tfm.internalized[hash] = id + fonts.identifiers[id] = tfmdata + internalized[hash] = id end end end -function definers.registered(hash) - local id = tfm.internalized[hash] - return id, id and fonts.ids[id] +function definers.registered(hash) -- will be overloaded + local id = internalized[hash] + return id, id and fonts.identifiers[id] end local cache_them = false @@ -15602,49 +15617,45 @@ function definers.read(specification,size,id) -- id can be optional, name can al specification = definers.resolve(specification) local hash = tfm.hashinstance(specification) if cache_them then - local fontdata = containers.read(fonts.cache,hash) -- for tracing purposes + local tfmdata = containers.read(fonts.cache,hash) -- for tracing purposes end - local fontdata = definers.registered(hash) -- id - if not fontdata then + local tfmdata = definers.registered(hash) -- id + if not tfmdata then if specification.features.vtf and specification.features.vtf.preset then - fontdata = tfm.make(specification) + tfmdata = tfm.make(specification) else - fontdata = tfm.read(specification) - if fontdata then - tfm.checkvirtualid(fontdata) + tfmdata = tfm.read(specification) + if tfmdata then + tfm.checkvirtualid(tfmdata) end end if cache_them then - fontdata = containers.write(fonts.cache,hash,fontdata) -- for tracing purposes + tfmdata = containers.write(fonts.cache,hash,tfmdata) -- for tracing purposes end - if fontdata then - fontdata.hash = hash - fontdata.cache = "no" + if tfmdata then + tfmdata.hash = hash + tfmdata.cache = "no" if id then - definers.register(fontdata,id) + definers.register(tfmdata,id) end end end - lastdefined = fontdata or id -- todo ! ! ! ! ! - if not fontdata then -- or id? + lastdefined = tfmdata or id -- todo ! ! ! ! ! + if not tfmdata then -- or id? report_define( "unknown font %s, loading aborted",specification.name) - elseif trace_defining and type(fontdata) == "table" then + elseif trace_defining and type(tfmdata) == "table" then report_define("using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s", - fontdata.type or "unknown", - id or "?", - fontdata.name or "?", - fontdata.size or "default", - fontdata.encodingbytes or "?", - fontdata.encodingname or "unicode", - fontdata.fullname or "?", - file.basename(fontdata.filename or "?")) - end - local cs = specification.cs - if cs then - fontcsnames[cs] = fontdata -- new (beware: locals can be forgotten) + tfmdata.type or "unknown", + id or "?", + tfmdata.name or "?", + tfmdata.size or "default", + tfmdata.encodingbytes or "?", + tfmdata.encodingname or "unicode", + tfmdata.fullname or "?", + file.basename(tfmdata.filename or "?")) end statistics.stoptiming(fonts) - return fontdata + return tfmdata end function vf.find(name) @@ -15675,7 +15686,7 @@ end --ldx]]-- callbacks.register('define_font' , definers.read, "definition of fonts (tfmtable preparation)") -callbacks.register('find_vf_file', vf.find , "locating virtual fonts, insofar needed") -- not that relevant any more +callbacks.register('find_vf_file', vf.find, "locating virtual fonts, insofar needed") -- not that relevant any more end -- closure @@ -15780,7 +15791,7 @@ local function colonized(specification) -- xetex mode return specification end -definers.registersplit(":",colonized) +definers.registersplit(":",colonized,"cryptic") end -- closure @@ -16063,7 +16074,7 @@ end -- bonus function fonts.otf.nametoslot(name) - local tfmdata = fonts.ids[font.current()] + local tfmdata = fonts.identifiers[font.current()] if tfmdata and tfmdata.shared then local otfdata = tfmdata.shared.otfdata local unicode = otfdata.luatex.unicodes[name] diff --git a/tex/generic/context/luatex-fonts.lua b/tex/generic/context/luatex-fonts.lua index 4cfe8b945..5fffecb47 100644 --- a/tex/generic/context/luatex-fonts.lua +++ b/tex/generic/context/luatex-fonts.lua @@ -51,21 +51,18 @@ loadmodule('luatex-fonts-merged.lua',true) -- you might comment this line if fonts then - -- We're using the merged version. That one could be outdated so - -- remove it from your system when you want to use the files from - -- from the ConTeXt tree, or keep your copy of the merged version - -- up to date. - - texio.write_nl("log",[[ - -I am using the merged version of 'luatex-fonts.lua' here. If -you run into problems or experience unexpected behaviour, and -if you have ConTeXt installed you can try to delete the file -'luatex-font-merged.lua' as I might then use the possibly -updated libraries. The merged version is not supported as it -is a frozen instance. + if not fonts._merge_loaded_message_done_ then + texio.write_nl("log", "!") + texio.write_nl("log", "! I am using the merged version of 'luatex-fonts.lua' here. If") + texio.write_nl("log", "! you run into problems or experience unexpected behaviour, and") + texio.write_nl("log", "! if you have ConTeXt installed you can try to delete the file") + texio.write_nl("log", "! 'luatex-font-merged.lua' as I might then use the possibly") + texio.write_nl("log", "! updated libraries. The merged version is not supported as it") + texio.write_nl("log", "! is a frozen instance.") + texio.write_nl("log", "!") + end - ]]) + fonts._merge_loaded_message_done_ = true else @@ -93,7 +90,9 @@ else -- We do need some basic node support although the following -- modules contain a little bit of code that is not used. It's - -- not worth weeding. + -- not worth weeding. Beware, in node-dum some functions use + -- fonts.* tables, not that nice but I don't want two dummy + -- files. Some day I will sort this out (no problem in context). loadmodule('node-dum.lua') loadmodule('node-inj.lua') -- will be replaced (luatex >= .70) diff --git a/web2c/contextcnf.lua b/web2c/contextcnf.lua index 53b4086a2..072f06980 100644 --- a/web2c/contextcnf.lua +++ b/web2c/contextcnf.lua @@ -9,93 +9,74 @@ return { content = { - TEXMFCACHE = "$SELFAUTOPARENT/texmf-cache", + variables = { - TEXMFOS = "$SELFAUTODIR", - TEXMFSYSTEM = "$SELFAUTOPARENT/texmf-$SELFAUTOSYSTEM", - TEXMFMAIN = "$SELFAUTOPARENT/texmf", - TEXMFCONTEXT = "$SELFAUTOPARENT/texmf-context", - TEXMFLOCAL = "$SELFAUTOPARENT/texmf-local", - TEXMFFONTS = "$SELFAUTOPARENT/texmf-fonts", - TEXMFPROJECT = "$SELFAUTOPARENT/texmf-project", + TEXMFCACHE = "$SELFAUTOPARENT/texmf-cache", - -- I don't like this texmf under home and texmf-home would make more - -- sense. One never knows what installers put under texmf anywhere and - -- sorting out problems will be a pain. + TEXMFOS = "$SELFAUTODIR", + TEXMFSYSTEM = "$SELFAUTOPARENT/texmf-$SELFAUTOSYSTEM", + TEXMFMAIN = "$SELFAUTOPARENT/texmf", + TEXMFCONTEXT = "$SELFAUTOPARENT/texmf-context", + TEXMFLOCAL = "$SELFAUTOPARENT/texmf-local", + TEXMFFONTS = "$SELFAUTOPARENT/texmf-fonts", + TEXMFPROJECT = "$SELFAUTOPARENT/texmf-project", - TEXMFHOME = "$HOME/texmf", -- "tree:///$HOME/texmf + -- I don't like this texmf under home and texmf-home would make more + -- sense. One never knows what installers put under texmf anywhere and + -- sorting out problems will be a pain. - -- We need texmfos for a few rare files but as I have a few more bin trees - -- a hack is needed. Maybe other users also have texmf-platform-new trees. + TEXMFHOME = "$HOME/texmf", -- "tree:///$HOME/texmf - TEXMF = "{$TEXMFHOME,!!$TEXMFPROJECT,!!$TEXMFFONTS,!!$TEXMFLOCAL,!!$TEXMFCONTEXT,!!$TEXMFSYSTEM,!!$TEXMFMAIN}", + -- We need texmfos for a few rare files but as I have a few more bin trees + -- a hack is needed. Maybe other users also have texmf-platform-new trees. - TEXFONTMAPS = ".;$TEXMF/fonts/data//;$TEXMF/fonts/map/{pdftex,dvips}//", - ENCFONTS = ".;$TEXMF/fonts/data//;$TEXMF/fonts/enc/{dvips,pdftex}//", - VFFONTS = ".;$TEXMF/fonts/{data,vf}//", - TFMFONTS = ".;$TEXMF/fonts/{data,tfm}//", - T1FONTS = ".;$TEXMF/fonts/{data,type1,pfb}//;$OSFONTDIR", - AFMFONTS = ".;$TEXMF/fonts/{data,afm}//;$OSFONTDIR", - TTFONTS = ".;$TEXMF/fonts/{data,truetype,ttf}//;$OSFONTDIR", - OPENTYPEFONTS = ".;$TEXMF/fonts/{data,opentype}//;$OSFONTDIR", - CMAPFONTS = ".;$TEXMF/fonts/cmap//", - FONTFEATURES = ".;$TEXMF/fonts/{data,fea}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS", - FONTCIDMAPS = ".;$TEXMF/fonts/{data,cid}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS", - OFMFONTS = ".;$TEXMF/fonts/{data,ofm,tfm}//", - OVFFONTS = ".;$TEXMF/fonts/{data,ovf,vf}//", + TEXMF = "{$TEXMFHOME,!!$TEXMFPROJECT,!!$TEXMFFONTS,!!$TEXMFLOCAL,!!$TEXMFCONTEXT,!!$TEXMFSYSTEM,!!$TEXMFMAIN}", - TEXINPUTS = ".;$TEXMF/tex/{context,plain/base,generic}//", - MPINPUTS = ".;$TEXMF/metapost/{context,base,}//", + TEXFONTMAPS = ".;$TEXMF/fonts/data//;$TEXMF/fonts/map/{pdftex,dvips}//", + ENCFONTS = ".;$TEXMF/fonts/data//;$TEXMF/fonts/enc/{dvips,pdftex}//", + VFFONTS = ".;$TEXMF/fonts/{data,vf}//", + TFMFONTS = ".;$TEXMF/fonts/{data,tfm}//", + T1FONTS = ".;$TEXMF/fonts/{data,type1,pfb}//;$OSFONTDIR", + AFMFONTS = ".;$TEXMF/fonts/{data,afm}//;$OSFONTDIR", + TTFONTS = ".;$TEXMF/fonts/{data,truetype,ttf}//;$OSFONTDIR", + OPENTYPEFONTS = ".;$TEXMF/fonts/{data,opentype}//;$OSFONTDIR", + CMAPFONTS = ".;$TEXMF/fonts/cmap//", + FONTFEATURES = ".;$TEXMF/fonts/{data,fea}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS", + FONTCIDMAPS = ".;$TEXMF/fonts/{data,cid}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS", + OFMFONTS = ".;$TEXMF/fonts/{data,ofm,tfm}//", + OVFFONTS = ".;$TEXMF/fonts/{data,ovf,vf}//", - -- In the next variable the inputs path will go away. + TEXINPUTS = ".;$TEXMF/tex/{context,plain/base,generic}//", + MPINPUTS = ".;$TEXMF/metapost/{context,base,}//", - TEXMFSCRIPTS = ".;$TEXMF/scripts/context/{lua,ruby,python,perl}//;$TEXINPUTS", - PERLINPUTS = ".;$TEXMF/scripts/context/perl", - PYTHONINPUTS = ".;$TEXMF/scripts/context/python", - RUBYINPUTS = ".;$TEXMF/scripts/context/ruby", - LUAINPUTS = ".;$TEXINPUTS;$TEXMF/scripts/context/lua//", - CLUAINPUTS = ".;$SELFAUTOLOC/lib/{$progname,$engine,}/lua//", + -- In the next variable the inputs path will go away. - -- Not really used by MkIV so they might go away. + TEXMFSCRIPTS = ".;$TEXMF/scripts/context/{lua,ruby,python,perl}//;$TEXINPUTS", + PERLINPUTS = ".;$TEXMF/scripts/context/perl", + PYTHONINPUTS = ".;$TEXMF/scripts/context/python", + RUBYINPUTS = ".;$TEXMF/scripts/context/ruby", + LUAINPUTS = ".;$TEXINPUTS;$TEXMF/scripts/context/lua//", + CLUAINPUTS = ".;$SELFAUTOLOC/lib/{$progname,$engine,}/lua//", - BIBINPUTS = ".;$TEXMF/bibtex/bib//", - BSTINPUTS = ".;$TEXMF/bibtex/bst//", + -- Not really used by MkIV so they might go away. - -- Experimental + BIBINPUTS = ".;$TEXMF/bibtex/bib//", + BSTINPUTS = ".;$TEXMF/bibtex/bst//", - ICCPROFILES = ".;$TEXMF/colors/icc/{context,profiles}//;$OSCOLORDIR", + -- Experimental - -- Sort of obsolete. + ICCPROFILES = ".;$TEXMF/colors/icc/{context,profiles}//;$OSCOLORDIR", - OTPINPUTS = ".;$TEXMF/omega/otp//", - OCPINPUTS = ".;$TEXMF/omega/ocp//", + -- Sort of obsolete. - -- A few special ones that will change some day. + OTPINPUTS = ".;$TEXMF/omega/otp//", + OCPINPUTS = ".;$TEXMF/omega/ocp//", - FONTCONFIG_FILE = "fonts.conf", - FONTCONFIG_PATH = "$TEXMFSYSTEM/fonts/conf", - FC_CACHEDIR = "$TEXMFSYSTEM/fonts/cache", -- not needed + -- A few special ones that will change some day. - -- Some of the following parameters will disappear. Also, some are - -- not used at all as we disable the ocp mechanism. At some point - -- it makes more sense then to turn then into directives. - - context = { - - hash_extra = "100000", - nest_size = "500", - param_size = "10000", - save_size = "50000", - stack_size = "10000", - expand_depth = "10000", - max_print_line = "10000", - max_in_open = "256", - - ocp_stack_size = "10000", - ocp_list_size = "1000", - - buf_size = "4000000", -- obsolete - ocp_buf_size = "500000", -- obsolete + FONTCONFIG_FILE = "fonts.conf", + FONTCONFIG_PATH = "$TEXMFSYSTEM/fonts/conf", + FC_CACHEDIR = "$TEXMFSYSTEM/fonts/cache", -- not needed }, @@ -104,35 +85,48 @@ return { -- like ['foo.bar'] so for convenience we also support 'foo_bar'. directives = { - -- system_checkglobals = "10", - -- system_nostatistics = "yes", - system_errorcontext = "10", - mplib_texerrors = "yes", - -- fonts_otf_loader_method = "table", -- table mixed sparse - -- fonts_otf_loader_cleanup = "0", -- 0 1 2 3 - system_compile_cleanup = "no", -- remove tma files - system_compile_strip = "yes", -- strip tmc files - }, + ["luatex.expanddepth"] = "10000", -- 10000 + ["luatex.hashextra"] = "100000", -- 0 + ["luatex.nestsize"] = "1000", -- 50 + ["luatex.maxinopen"] = "500", -- 15 + ["luatex.maxprintline"] = " 10000", -- 79 + ["luatex.maxstrings"] = "500000", -- 15000 -- obsolete + ["luatex.paramsize"] = "25000", -- 60 + ["luatex.savesize"] = "50000", -- 4000 + ["luatex.stacksize"] = "10000", -- 300 - experiments = { - fonts_autorscale = "yes", - }, + -- ["system.checkglobals"] = "10", + -- ["system.nostatistics"] = "yes", + ["system.errorcontext"] = "10", - trackers = { + ["mplib.texerrors"] = "yes", - }, + -- ["fonts.otf.loader.method"] = "table", -- table mixed sparse + -- ["fonts.otf.loader.cleanup"] = "0", -- 0 1 2 3 - -- The io modes are similar to the traditional ones. Possible values - -- are all, paranoid and restricted. + ["system.compile.cleanup"] = "no", -- remove tma files + ["system.compile.strip"] = "yes", -- strip tmc files - output_mode = "restricted", - input_mode = "any", + -- The io modes are similar to the traditional ones. Possible values + -- are all, paranoid and restricted. - -- The following variable is under consideration. We do have protection - -- mechanims but it's not enabled by default. + ["system.outputmode"] = "restricted", + ["system.inputmode"] = "any", - command_mode = "any", -- any none list - command_list = "mtxrun, convert, inkscape, gs, imagemagick, curl, bibtex, pstoedit", + -- The following variable is under consideration. We do have protection + -- mechanims but it's not enabled by default. + + ["system.commandmode"] = "any", -- any none list + ["system.commandlist"] = "mtxrun, convert, inkscape, gs, imagemagick, curl, bibtex, pstoedit", + + }, + + experiments = { + ["fonts.autorscale"] = "yes", + }, + + trackers = { + }, }, |