diff options
526 files changed, 42211 insertions, 25099 deletions
diff --git a/context/data/texworks/TUG/texworks.ini b/context/data/texworks/TUG/texworks.ini index a0ff34539..8ef43433e 100644 --- a/context/data/texworks/TUG/texworks.ini +++ b/context/data/texworks/TUG/texworks.ini @@ -12,10 +12,10 @@ previewScale=200 magnifierSize=2 circularMagnifier=true defaultEngine=ConTeXt MkIV -binaryPaths=E:/context/lua, E:/tex/texmf-mswin/bin +binaryPaths= autoHideConsole=false -openDialogDir=E:/context/manuals/mk -recentFileList=D:/texworks/bin/texworks-setup.ini, E:/context/manuals/mk/mk-math.tex, E:/tmp/oeps.tex +openDialogDir= +recentFileList= [engines] size=6 diff --git a/context/data/texworks/texworks-context.rme b/context/data/texworks/texworks-context.rme new file mode 100644 index 000000000..7019cb78e --- /dev/null +++ b/context/data/texworks/texworks-context.rme @@ -0,0 +1,2 @@ +This is just a placeholder. We need to make sure that we end +up here in case of multiple texworks ini files. diff --git a/context/data/texworks/texworks-setup.ini b/context/data/texworks/texworks-setup.ini index 1c638fc1b..6357e775b 100644 --- a/context/data/texworks/texworks-setup.ini +++ b/context/data/texworks/texworks-setup.ini @@ -1,2 +1,2 @@ -inipath=./../../texmf-context/context/data/texworks -libpath=./../../texmf-context/context/data/texworks +inipath=. +libpath=. diff --git a/fonts/map/luatex/context/demo-font.lum b/fonts/map/luatex/context/demo-font.lum new file mode 100644 index 000000000..0beca031b --- /dev/null +++ b/fonts/map/luatex/context/demo-font.lum @@ -0,0 +1,70 @@ +if not modules then modules = { } end modules ['demo-font.lum'] = { + version = 1.001, + comment = "companion to font-map.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ + + After some testing Taco and I decided that the lack of information + with regards to unicode mapping of alternative shapes can best be + handled by an auxiliary table. So, here is an example. This file + gets its place in TDS in: + + <texroot>/fonts/map/luatex/context/demo-file.lum + + We recommend that you use a lowercase filename, just to prevent + lookup errors. Font filenames are already such a mess. + + A test file, dedicated to Dohyun Kim is: + + \usemodule[fnt-20] + + \starttext + + \definefontfeature + [otftracker-kozminprovi-regular] + [mode=node,vrt2=yes,script=latn] + + \setvariables + [otftracker] + [font=kozminprovi-regular, + sample=\char"3002] + + \stoptext + + In the resulting pdf file you will then find: + + begincmap + /CIDSystemInfo + << /Registry (TeX) + /Ordering (FNUMTE-KozMinProVI-Regular) + /Supplement 0 + >> def + /CMapName /TeX-Identity-FNUMTE-KozMinProVI-Regular def + /CMapType 2 def + 1 begincodespacerange + <0000> <FFFF> + endcodespacerange + 0 beginbfrange + endbfrange + 2 beginbfchar + <027B> <3002> + <1ED0> <3002> + endbfchar + endcmap + + Of course this assumes that the font used is the same as we + have on our machines. + +]]-- + +return { + version = 1.00, + fontname = "kozminprovi-regular.otf", + tounicode = { + ["Japan1.7888"] = 0x3002, + }, +} diff --git a/metapost/context/base/mp-core.mp b/metapost/context/base/mp-core.mp index 6720fe90d..7c5d5a1c1 100644 --- a/metapost/context/base/mp-core.mp +++ b/metapost/context/base/mp-core.mp @@ -346,7 +346,7 @@ boolean force_multi_par_chain ; force_multi_par_chain := true ; boolean one_piece_multi_par ; one_piece_multi_par := false ; boolean check_multi_par_chain ; check_multi_par_chain := true ; % extra page check -boolean multi_column_first_page_hack; multi_column_first_page_hack := false ; +boolean multi_column_first_page_hack; multi_column_first_page_hack := true ; % seems to work ok def simplify_multi_pars = % boundingbox ipv shape als optie for i := 1 upto nofmultipars : diff --git a/scripts/context/lua/mtx-context.lua b/scripts/context/lua/mtx-context.lua index 3e0abb1e7..71d2eee56 100644 --- a/scripts/context/lua/mtx-context.lua +++ b/scripts/context/lua/mtx-context.lua @@ -9,6 +9,13 @@ if not modules then modules = { } end modules ['mtx-context'] = { scripts = scripts or { } scripts.context = scripts.context or { } +-- a demo cld file: +-- +-- context.starttext() +-- context.chapter("Hello There") +-- context.readfile("tufte","","not found") +-- context.stoptext() + -- l-file / todo function file.needsupdate(oldfile,newfile) @@ -521,6 +528,10 @@ end -- end -- end +scripts.context.cldsuffixes = table.tohash { + "cld", +} + scripts.context.xmlsuffixes = table.tohash { "xml", } @@ -648,6 +659,7 @@ function scripts.context.run(ctxdata,filename) if a and (a.engine == 'pdftex' or a.engine == 'xetex' or environment.argument("pdftex") or environment.argument("xetex")) then local texexec = resolvers.find_file("texexec.rb") or "" if texexec ~= "" then + os.setenv("RUBYOPT","") local command = string.format("ruby %s %s",texexec,environment.reconstruct_commandline(environment.arguments_after)) os.exec(command) end @@ -672,7 +684,9 @@ function scripts.context.run(ctxdata,filename) else filename = makestub("\\xmlprocess{\\xmldocument}{%s}{}",filename) end - elseif scripts.context.luasuffixes[suffix] then + elseif scripts.context.cldsuffixes[suffix] or environment.argument("forcecld") then + filename = makestub("\\ctxlua{context.runfile('%s')}",filename) + elseif scripts.context.luasuffixes[suffix] or environment.argument("forcelua") then filename = makestub("\\ctxlua{dofile('%s')}",filename) end -- @@ -1333,6 +1347,7 @@ messages.help = [[ --ctx=name use ctx file --version report installed context version --forcexml force xml stub (optional flag: --mkii) +--forcecld force cld (context lua document) stub --autopdf close pdf file in viewer and start pdf viewer afterwards --once only one run --purge(all) purge files (--pattern=...) diff --git a/scripts/context/lua/mtx-convert.lua b/scripts/context/lua/mtx-convert.lua index cf1d640c5..c0c383b17 100644 --- a/scripts/context/lua/mtx-convert.lua +++ b/scripts/context/lua/mtx-convert.lua @@ -6,66 +6,88 @@ if not modules then modules = { } end modules ['mtx-convert'] = { license = "see context related readme files" } -do +-- todo: eps and svg - graphics = graphics or { } - graphics.converters = graphics.converters or { } +graphics = graphics or { } +graphics.converters = graphics.converters or { } - local gsprogram = (os.platform == "windows" and "gswin32c") or "gs" - local gstemplate = "%s -q -sDEVICE=pdfwrite -dEPSCrop -dNOPAUSE -dNOCACHE -dBATCH -dAutoRotatePages=/None -dProcessColorModel=/DeviceCMYK -sOutputFile=%s %s -c quit" +local gsprogram = (os.platform == "windows" and "gswin32c") or "gs" +local gstemplate = "%s -q -sDEVICE=pdfwrite -dEPSCrop -dNOPAUSE -dNOCACHE -dBATCH -dAutoRotatePages=/None -dProcessColorModel=/DeviceCMYK -sOutputFile=%s %s -c quit" - function graphics.converters.eps(oldname,newname) - return gstemplate:format(gsprogram,newname,oldname) - end +function graphics.converters.eps(oldname,newname) + return gstemplate:format(gsprogram,newname,oldname) +end - local improgram = "convert" - local imtemplate = { - low = "%s -quality 0 -compress zip %s pdf:%s", - medium = "%s -quality 75 -compress zip %s pdf:%s", - high = "%s -quality 100 -compress zip %s pdf:%s", - } - - function graphics.converters.jpg(oldname,newname) - local ea = environment.arguments - local quality = (ea.high and 'high') or (ea.medium and 'medium') or (ea.low and 'low') or 'high' - return imtemplate[quality]:format(improgram,oldname,newname) +local improgram = "convert" +local imtemplate = { + low = "%s -quality 0 -compress zip %s pdf:%s", + medium = "%s -quality 75 -compress zip %s pdf:%s", + high = "%s -quality 100 -compress zip %s pdf:%s", +} + +function graphics.converters.jpg(oldname,newname) + local ea = environment.arguments + local quality = (ea.high and 'high') or (ea.medium and 'medium') or (ea.low and 'low') or 'high' + return imtemplate[quality]:format(improgram,oldname,newname) +end + +graphics.converters.tif = graphics.converters.jpg +graphics.converters.tiff = graphics.converters.jpg +graphics.converters.png = graphics.converters.jpg + +local function convert(kind,oldname,newname) + if graphics.converters[kind] then -- extra test + local tmpname = file.replacesuffix(newname,"tmp") + local command = graphics.converters[kind](oldname,tmpname) + logs.simple("command: %s",command) + io.flush() + os.spawn(command) + os.remove(newname) + os.rename(tmpname,newname) + if lfs.attributes(newname,"size") == 0 then + os.remove(newname) + end end +end - graphics.converters.tif = graphics.converters.jpg - graphics.converters.tiff = graphics.converters.jpg - graphics.converters.png = graphics.converters.jpg - - function graphics.converters.convertpath(inputpath,outputpath) - inputpath = inputpath or "." - outputpath = outputpath or "." - for name in lfs.dir(inputpath) do - local suffix = file.extname(name) - if name:find("%.$") then - -- skip . and .. - elseif graphics.converters[suffix] then - local oldname = file.join(inputpath,name) - local newname = file.join(outputpath,file.replacesuffix(name,"pdf")) - local et = lfs.attributes(oldname,"modification") - local pt = lfs.attributes(newname,"modification") - if not pt or et > pt then - dir.mkdirs(outputpath) - local tmpname = file.replacesuffix(newname,"tmp") - local command = graphics.converters[suffix](oldname,tmpname) - logs.simple("command: %s",command) - io.flush() - os.spawn(command) - os.remove(newname) - os.rename(tmpname,newname) - if lfs.attributes(newname,"size") == 0 then - os.remove(newname) - end - end - elseif lfs.isdir(inputpath .. "/".. name) then - graphics.converters.convertpath(inputpath .. "/".. name,outputpath .. "/".. name) +function graphics.converters.convertpath(inputpath,outputpath) + inputpath = inputpath or "." + outputpath = outputpath or "." + for name in lfs.dir(inputpath) do + local suffix = file.extname(name) + if name:find("%.$") then + -- skip . and .. + elseif graphics.converters[suffix] then + local oldname = file.join(inputpath,name) + local newname = file.join(outputpath,file.replacesuffix(name,"pdf")) + local et = lfs.attributes(oldname,"modification") + local pt = lfs.attributes(newname,"modification") + if not pt or et > pt then + dir.mkdirs(outputpath) + convert(suffix,oldname,newname) end + elseif lfs.isdir(inputpath .. "/".. name) then + graphics.converters.convertpath(inputpath .. "/".. name,outputpath .. "/".. name) end end +end +function graphics.converters.convertfile(oldname) + local suffix = file.extname(oldname) + if graphics.converters[suffix] then + local newname = file.replacesuffix(name,"pdf") + if oldname == newname then + -- todo: downsample, crop etc + elseif environment.argument("force") then + convert(suffix,oldname,newname) + else + local et = lfs.attributes(oldname,"modification") + local pt = lfs.attributes(newname,"modification") + if not pt or et > pt then + convert(suffix,oldname,newname) + end + end + end end scripts = scripts or { } @@ -88,6 +110,13 @@ function scripts.convert.convertall() end end +function scripts.convert.convertgiven() + for _, name in ipairs(environment.files) do + graphics.converters.convertfile(name) + end +end + + logs.extendbanner("Graphic Conversion Tools 0.10",true) messages.help = [[ @@ -95,11 +124,14 @@ messages.help = [[ --inputpath=string original graphics path --outputpath=string converted graphics path --watch watch folders +--force force conversion (even if older) --delay time between sweeps ]] if environment.argument("convertall") then scripts.convert.convertall() +elseif environment.files[1] then + scripts.convert.convertgiven() else logs.help(messages.help) end diff --git a/scripts/context/lua/mtx-grep.lua b/scripts/context/lua/mtx-grep.lua index 82a80314a..a6617d711 100644 --- a/scripts/context/lua/mtx-grep.lua +++ b/scripts/context/lua/mtx-grep.lua @@ -44,7 +44,7 @@ function scripts.grep.find(pattern, files, offset) -- skip elseif find(line,pattern) then m = m + 1 - write_nl(format("%s %s: %s",name,n,line)) + write_nl(format("%s %6i: %s",name,n,line)) io.flush() end end @@ -62,7 +62,7 @@ function scripts.grep.find(pattern, files, offset) n = n + 1 if find(line,pattern) then m = m + 1 - write_nl(format("%s %s: %s",name,n,line)) + write_nl(format("%s %6i: %s",name,n,line)) io.flush() end end diff --git a/scripts/context/lua/mtx-texworks.lua b/scripts/context/lua/mtx-texworks.lua new file mode 100644 index 000000000..f525d5336 --- /dev/null +++ b/scripts/context/lua/mtx-texworks.lua @@ -0,0 +1,96 @@ +if not modules then modules = { } end modules ['mtx-texworks'] = { + version = 1.002, + comment = "companion to mtxrun.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +scripts = scripts or { } +scripts.texworks = scripts.texworks or { } + +local texworkspaths = { + "completion", + "configuration", + "dictionaries", + "translations", + "scripts", + "templates", + "TUG" +} + +local texworkssignal = "texworks-context.rme" +local texworkininame = "TeXworks.ini" + +function scripts.texworks.start(indeed) + local is_mswin = os.platform == "windows" + local workname = (is_mswin and "texworks.exe") or "TeXworks" + local fullname = nil + local binpaths = file.split_path(os.getenv("PATH")) or file.split_path(os.getenv("path")) + local datapath = resolvers.find_file(texworkssignal,"other text files") or "" + if datapath ~= "" then + datapath = file.dirname(datapath) -- data + if datapath == "" then + datapath = resolvers.ownpath + end + else + datapath = resolvers.find_file(texworkininame,"other text files") or "" + if datapath == "" then + datapath = resolvers.find_file(string.lower(texworkininame),"other text files") or "" + end + if datapath ~= "" and lfs.isfile(datapath) then + datapath = file.dirname(datapath) -- TUG + datapath = file.dirname(datapath) -- data + if datapath == "" then + datapath = resolvers.ownpath + end + end + end + if datapath == "" then + logs.simple("invalid datapath, maybe you need to regenerate the file database") + return false + end + if not binpaths or #binpaths == 0 then + logs.simple("invalid binpath") + return false + end + for i=1,#binpaths do + local p = file.join(binpaths[i],workname) + if lfs.isfile(p) then + fullname = p + break + end + end + if not fullname then + logs.simple("unable to locate %s",workname) + return false + end + for _, subpath in ipairs(texworkspaths) do + dir.makedirs(file.join(datapath,subpath)) + end + os.setenv("TW_INIPATH",datapath) + os.setenv("TW_LIBPATH",datapath) + if not indeed or environment.argument("verbose") then + logs.simple("data path: %s", datapath) + logs.simple("full name: %s", fullname) + end + if indeed then + os.launch(fullname) + end +end + + +logs.extendbanner("TeXworks startup script 1.0",true) + +messages.help = [[ +--start [--verbose] start texworks +--test report what will happen +]] + +if environment.argument("start") then + scripts.texworks.start(true) +elseif environment.argument("test") then + scripts.texworks.start() +else + logs.help(messages.help) +end diff --git a/scripts/context/lua/mtx-tools.lua b/scripts/context/lua/mtx-tools.lua new file mode 100644 index 000000000..87fd51dc6 --- /dev/null +++ b/scripts/context/lua/mtx-tools.lua @@ -0,0 +1,57 @@ +if not modules then modules = { } end modules ['mtx-tools'] = { + version = 1.002, + comment = "companion to mtxrun.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- data tables by Thomas A. Schmitz + +local find, gsub = string.find, string.gsub + +scripts = scripts or { } +scripts.tools = scripts.tools or { } + +local bomb_1, bomb_2 = "^\254\255", "^\239\187\191" + +function scripts.tools.disarmutfbomb() + local force, done = environment.argument("force"), false + for _, name in ipairs(environment.files) do + if lfs.isfile(name) then + local data = io.loaddata(name) + if not data then + -- just skip + elseif find(data,bomb_1) then + logs.simple("file '%s' has a 2 character utf bomb",name) + if force then + io.savedata(name,(gsub(data,bomb_1,""))) + end + done = true + elseif find(data,bomb_2) then + logs.simple("file '%s' has a 3 character utf bomb",name) + if force then + io.savedata(name,(gsub(data,bomb_2,""))) + end + done = true + else + -- logs.simple("file '%s' has no utf bomb",name) + end + end + end + if done and not force then + logs.simple("use --force to do a real disarming") + end +end + +logs.extendbanner("All Kind Of Tools 1.0",true) + +messages.help = [[ +--disarmutfbomb remove utf bomb if present +]] + +if environment.argument("disarmutfbomb") then + scripts.tools.disarmutfbomb() +else + logs.help(messages.help) +end diff --git a/scripts/context/lua/mtx-update.lua b/scripts/context/lua/mtx-update.lua index 66f6898d3..bc6ca4026 100644 --- a/scripts/context/lua/mtx-update.lua +++ b/scripts/context/lua/mtx-update.lua @@ -102,6 +102,15 @@ scripts.update.engines = { }, } +scripts.update.goodies = { + ["scite"] = { + { "bin/<platform>/scite/", "texmf-<platform>" }, + }, + ["texworks"] = { + { "bin/<platform>/texworks/", "texmf-<platform>" }, + }, +} + scripts.update.platforms = { ["mswin"] = "mswin", ["windows"] = "mswin", @@ -163,7 +172,8 @@ function scripts.update.synchronize() local bin = states.get("rsync.program") -- rsync local url = states.get("rsync.server") -- contextgarden.net local version = states.get("context.version") -- current (or beta) - local extras = states.get("extras") -- extra goodies (like modules) + local extras = states.get("extras") -- extras (like modules) + local goodies = states.get("goodies") -- goodies (like editors) local force = environment.argument("force") bin = string.gsub(bin,"\\","/") @@ -285,6 +295,14 @@ function scripts.update.synchronize() end end + if goodies and type(goodies) == "table" then + for goodie, _ in pairs(goodies) do + for platform, _ in pairs(platforms) do + add_collection(scripts.update.goodies[goodie],platform) + end + end + end + local combined = { } for _, repository in ipairs(scripts.update.repositories) do if repositories[repository] then @@ -374,7 +392,8 @@ function scripts.update.make() local force = environment.argument("force") local texroot = scripts.update.fullpath(states.get("paths.root")) - local engines= states.get('engines') + local engines = states.get('engines') + local goodies = states.get('goodies') local platforms = states.get('platforms') local formats = states.get('formats') @@ -431,6 +450,7 @@ messages.help = [[ --texroot=string installation directory (not guessed for the moment) --engine=string tex engine (luatex, pdftex, xetex) --extras=string extra modules (can be list or 'all') +--goodies=string extra binaries (like scite and texworks) --force instead of a dryrun, do the real thing --update update minimal tree --make also make formats and generate file databases @@ -500,6 +520,9 @@ if scripts.savestate then for r in gmatch(environment.argument("extras") or "","([^, ]+)") do states.set("extras." .. r, true) end + for r in gmatch(environment.argument("goodies") or "","([^, ]+)") do + states.set("goodies." .. r, true) + end logs.report("state","loaded") diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index 0c96ed446..d30350ea5 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -10070,6 +10070,12 @@ function runners.execute_ctx_script(filename,arguments) end end +function runners.timedrun(filename) -- just for me + if filename and filename ~= "" then + runners.timed(function() os.execute(filename) end) + end +end + function runners.timed(action) statistics.timed(action) end @@ -10197,6 +10203,9 @@ elseif environment.argument("locate") then elseif environment.argument("platform")then -- locate platform runners.locate_platform() +elseif environment.argument("timedrun") then + -- locate platform + runners.timedrun(filename) elseif environment.argument("help") or filename=='help' or filename == "" then logs.help(messages.help) -- execute script diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index 0c96ed446..d30350ea5 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -10070,6 +10070,12 @@ function runners.execute_ctx_script(filename,arguments) end end +function runners.timedrun(filename) -- just for me + if filename and filename ~= "" then + runners.timed(function() os.execute(filename) end) + end +end + function runners.timed(action) statistics.timed(action) end @@ -10197,6 +10203,9 @@ elseif environment.argument("locate") then elseif environment.argument("platform")then -- locate platform runners.locate_platform() +elseif environment.argument("timedrun") then + -- locate platform + runners.timedrun(filename) elseif environment.argument("help") or filename=='help' or filename == "" then logs.help(messages.help) -- execute script diff --git a/scripts/context/stubs/mswin/mtxworks.cmd b/scripts/context/stubs/mswin/mtxworks.cmd new file mode 100644 index 000000000..322d9464d --- /dev/null +++ b/scripts/context/stubs/mswin/mtxworks.cmd @@ -0,0 +1 @@ +mtxrun --script texworks --start diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index 0c96ed446..d30350ea5 100755 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -10070,6 +10070,12 @@ function runners.execute_ctx_script(filename,arguments) end end +function runners.timedrun(filename) -- just for me + if filename and filename ~= "" then + runners.timed(function() os.execute(filename) end) + end +end + function runners.timed(action) statistics.timed(action) end @@ -10197,6 +10203,9 @@ elseif environment.argument("locate") then elseif environment.argument("platform")then -- locate platform runners.locate_platform() +elseif environment.argument("timedrun") then + -- locate platform + runners.timedrun(filename) elseif environment.argument("help") or filename=='help' or filename == "" then logs.help(messages.help) -- execute script diff --git a/scripts/context/stubs/unix/mtxworks b/scripts/context/stubs/unix/mtxworks new file mode 100755 index 000000000..ef8f230c3 --- /dev/null +++ b/scripts/context/stubs/unix/mtxworks @@ -0,0 +1,2 @@ +#!/bin/sh +mtxrun --script texworks --start diff --git a/tex/context/base/anch-pgr.mkii b/tex/context/base/anch-pgr.mkii index bc4e0d828..fde8755c2 100644 --- a/tex/context/base/anch-pgr.mkii +++ b/tex/context/base/anch-pgr.mkii @@ -1352,6 +1352,7 @@ \def\do@@ammenuposition#1% {\ifnum\currentamposition>0 \dowithnextbox{\hpos{menu:#1:\realfolio}{\flushnextbox}}\hbox + % \hpos{menu:#1:\realfolio} % also ok if we skip over fi \fi} %D \macros diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv index ba566f970..8e719e0d7 100644 --- a/tex/context/base/anch-pgr.mkiv +++ b/tex/context/base/anch-pgr.mkiv @@ -17,6 +17,9 @@ %D the reference point on the page. The next macro does so and %D is hooked into the page building routine. +%D I will speed up this module when I have a proper torture +%D test file. + \unprotect % in the future, the depth of tail will reflect page depth @@ -26,9 +29,9 @@ %D The next macros so some housekeeping. \def\pageanchor{page:0} % for the moment only one pagesize -\def\textanchor{text:\realfolio} -\def\headanchor{head:\realfolio} % virtual position -\def\tailanchor{tail:\realfolio} % virtual position +\def\textanchor{text:\the\realpageno} +\def\headanchor{head:\the\realpageno} % virtual position +\def\tailanchor{tail:\the\realpageno} % virtual position %D Anchors: @@ -201,7 +204,7 @@ \newtoks\everyinsertpositionaction \def\cleanuppositionaction#1% not in trialtypesetting - {\ifcsname\POSactionprefix#1++\endcsname % \ifundefined{\POSactionprefix#1++}\else + {\ifcsname\POSactionprefix#1++\endcsname \the\everycleanpositionaction \iflocalpositioning \letgvalue{\POSactionprefix#1++}\empty @@ -273,10 +276,6 @@ \let\stopMPpositiongraphic\relax -% \def\prepareMPpositionvariables -% {\ifundefined{\@@meta self}\setvalue{\@@meta self}{\currentposition}\fi -% \ifundefined{\@@meta from}\setvalue{\@@meta from}{\currentposition}\fi} - \def\prepareMPpositionvariables {\ifcsname\@@meta self\endcsname\else\setvalue{\@@meta self}{\currentposition}\fi \ifcsname\@@meta from\endcsname\else\setvalue{\@@meta from}{\currentposition}\fi} @@ -292,23 +291,26 @@ % Now we need a adapted action handler: \def\dopositionaction#1% test saves hash entry in etex - {\ifundefined{\POSactionprefix#1::}\else - \ifnum\MPp{#1}>\zerocount % new - \bgroup - \setbox\scratchbox\hbox - \bgroup - \traceposstring\clap\red{<#1>}% - \the\everyinsertpositionaction - \the\everypositionaction - \getvalue{\POSactionprefix#1::}% - \cleanuppositionaction{#1}% - \egroup % smashed is really needed else - \smashedbox\scratchbox % we get problems with too big - \egroup % overlays (s-pre-0x.tex) - \else - % shouldn't happen too often - \traceposstring\clap\cyan{<#1>}% - \fi + {\ifcsname\POSactionprefix#1::\endcsname + \dodopositionaction{#1}% + \fi} + +\def\dodopositionaction#1% + {\ifnum\MPp{#1}>\zerocount % new + \bgroup + \setbox\scratchbox\hbox + \bgroup + \traceposstring\clap\red{<#1>}% + \the\everyinsertpositionaction + \the\everypositionaction + \csname\POSactionprefix#1::\endcsname + \cleanuppositionaction{#1}% + \egroup % smashed is really needed else + \smashedbox\scratchbox % we get problems with too big + \egroup % overlays (s-pre-0x.tex) + \else + % shouldn't happen too often + \traceposstring\clap\cyan{<#1>}% \fi} \def\MPpositiongraphic @@ -607,28 +609,29 @@ \newcounter\localpositionnumber \def\MPanchornumber - {\iflocalpositioning\localpositionnumber\else\realfolio\fi} + {\iflocalpositioning\localpositionnumber\else\the\realpageno\fi} %D So far for the trickery. \newcount\textbackgrounddepth -\appendtoks - \expanded{\savecurrentvalue\noexpand\totalnofparbackgrounds{\number\nofparbackgrounds}}% -\to \everybye - -\appendtoks - \initializeparbackgrounds -\to \everystarttext - -\ifx\totalnofparbackgrounds\undefined \newcounter\totalnofparbackgrounds \fi \ifx\nofparbackgrounds \undefined \newcount \nofparbackgrounds \fi -\def\initializeparbackgrounds - {\ifcase\totalnofparbackgrounds\else - \global\positioningtrue - \global\positioningpartrue - \fi} +% \ifx\totalnofparbackgrounds\undefined \newcounter\totalnofparbackgrounds \fi +% +% \appendtoks +% \expanded{\savecurrentvalue\noexpand\totalnofparbackgrounds{\number\nofparbackgrounds}}% +% \to \everybye +% +% \appendtoks +% \initializeparbackgrounds +% \to \everystarttext +% +% \def\initializeparbackgrounds +% {\ifcase\totalnofparbackgrounds\else +% \global\positioningtrue +% \global\positioningpartrue +% \fi} \unexpanded\def\starttextbackground {\bgroup @@ -680,10 +683,6 @@ \def\currenttextbackground{#1}% \global\advance\nofparbackgrounds\plusone \edef\currentparbackground{pbg:\number\nofparbackgrounds}% -% \bgroup -% \advance\nofparbackgrounds\plusone -% \xdef\nextparbackground{pbg:\number\nofparbackgrounds}% -% \egroup \xdef\nextparbackground{pbg:\number\numexpr\nofparbackgrounds+\plusone\relax}% still xdef ? % todo : \synchonizepositionpage{b:\currentparbackground}{s:\currentparbackground}% \setuptextbackground[#1][#2]% @@ -695,8 +694,7 @@ % todo \backgroundvariable\c!variant \def\dopresettextbackground#1% todo: \backgroundparameter - {\ExpandFirstAfter\processaction % \EFA niet echt nodig - [\textbackgroundparameter\c!location] + {\normalexpanded{\noexpand\processaction[\textbackgroundparameter\c!location]} [ \v!text=>\let\dodostarttextbackground\dostarttextbackgroundtxt \let\dodostoptextbackground \dostoptextbackgroundtxt, \v!paragraph=>\let\dodostarttextbackground\dostarttextbackgroundpar @@ -754,7 +752,7 @@ \dostopattributes} \def\dostarttextbackgroundtxt - {\ifvmode \dontleavehmode \fi % was leavevmode, brrr + {\ifvmode \dontleavehmode \fi \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty \fpos\currentparbackground\ignorespaces} @@ -762,37 +760,6 @@ {\tpos\currentparbackground \dostopattributes} -% keep this simple one, it's used in prikkels and alike -% -% \def\dostarttextbackgroundpar -% {\endgraf % new -% \getvalue{\??td\currenttextbackground\c!before}% -% \noindent\fpos\currentparbackground\ignorespaces -% \bgroup -% \nobreak \vskip-\lineheight \nobreak -% \doassignsomeskip\getvalue{\??td\currenttextbackground\c!topoffset}\to\scratchskip -% \kern\scratchskip\nobreak -% \dosetleftskipadaption{\getvalue{\??td\currenttextbackground\c!leftoffset}}% -% \advance\leftskip\leftskipadaption -% \dosetleftskipadaption{\getvalue{\??td\currenttextbackground\c!rightoffset}}% -% \advance\rightskip\leftskipadaption -% \dostartattributes{\??td\currenttextbackground}\c!style\c!color{}% -% \nowhitespace -% \seteffectivehsize -% \par} -% -% \def\dostoptextbackgroundpar -% {\par -% \dostopattributes -% \doassignsomeskip\getvalue{\??td\currenttextbackground\c!bottomoffset}\to\scratchskip -% \kern\scratchskip\nobreak -% \nobreak \vskip-\lineheight \nobreak -% \nowhitespace -% \egroup -% \nobreak \noindent \strut \hfill \kern\zeropoint \tpos\currentparbackground -% \endgraf % new -% \getvalue{\??td\currenttextbackground\c!after}} - \newskip\textbackgroundskip \def\dostarttextbackgroundpar @@ -868,52 +835,83 @@ \let\textparwidth \!!zeropoint \def\calculatetextpardimensions - {\docalculatetextpardimensions\btbanchor \etbanchor \MPparanchor} + {\docalculatetextpardimensions\btbanchor\etbanchor\MPparanchor} \def\calculatenexttextpardimensions {\docalculatetextpardimensions\nextbtbanchor\nextetbanchor\relax} -\def\docalculatetextpardimensions#1#2#3% todo: dimexpr - {\scratchcounter\MPp#2%\etbanchor - \advance\scratchcounter-\MPp#1%\btanchor - \edef\textparpages{\the\scratchcounter}% - \ifcase\scratchcounter - % one page - \scratchdimen \MPy#1%\btanchor - \advance\scratchdimen-\MPy#2%\etbanchor - \else - % two or more pages - \scratchdimen \MPy#1%\btanchor - \advance\scratchdimen-\MPy#2%\etbanchor - \advance\scratchdimen-\MPy\textanchor - \advance\scratchdimen \MPy\textanchor % - and then + ? - \advance\scratchdimen \MPh\textanchor\relax - \ifcase\scratchcounter>2 \ifnum\scratchcounter<5 - % more pages - \scratchdimen\textheight - \advance\scratchcounter \minusone - \multiply\scratchdimen \scratchcounter - \else - % keep'm small - \scratchdimen5\textheight - \fi \fi - \fi - \edef\textparheight{\the\scratchdimen}% - \ifcase\scratchcounter - % one page - \scratchdimen \MPx#2%\etbanchor - \advance\scratchdimen-\MPx#1%\btanchor - \else - % two or more pages / maybe also hang - \ifx#3\relax - \scratchdimen\makeupwidth % \textwidth - \else - \scratchdimen\MPw\MPparanchor - \advance\scratchdimen-\MPl\MPparanchor - \advance\scratchdimen-\MPr\MPparanchor - \fi - \fi - \edef\textparwidth{\the\scratchdimen}} +% \def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor +% {\scratchcounter\numexpr\MPp#2-\MPp#1\relax +% \edef\textparpages{\the\scratchcounter}% +% \ifcase\scratchcounter +% % one page +% \scratchdimen\dimexpr\MPy#1-\MPy#2\relax +% \else +% % two or more pages +% \ifnum\scratchcounter>2 +% \ifnum\scratchcounter<5 +% % more pages +% \scratchdimen\textheight +% \advance\scratchcounter \minusone +% \multiply\scratchdimen \scratchcounter +% \else +% % keep'm small +% \scratchdimen5\textheight +% \fi +% \else +% \scratchdimen\dimexpr\MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor\relax +% \fi +% \fi +% \edef\textparheight{\the\scratchdimen}% +% \ifcase\scratchcounter +% % one page +% \scratchdimen\dimexpr\MPx#2-\MPx#1\relax +% \else +% % two or more pages / maybe also hang +% \ifx#3\relax +% \scratchdimen\makeupwidth % \textwidth +% \else +% \scratchdimen\dimexpr\MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor\relax +% \fi +% \fi +% \edef\textparwidth{\the\scratchdimen}} + +\def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor (adapted 8/6/2009) + {\scratchcounter\numexpr\MPp#2-\MPp#1\relax + \edef\textparpages + {\the\scratchcounter}% + \edef\textparheight + {\the\dimexpr + \ifcase\scratchcounter + % one page + \MPy#1-\MPy#2% + \else + % two or more pages + \ifnum\scratchcounter>2 + \ifnum\scratchcounter<5 + % more pages + \textheight*\numexpr\scratchcounter+\minusone + \else + % keep'm small + 5\textheight + \fi + \else + \MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor + \fi + \fi}% + \edef\textparwidth + {\the\dimexpr + \ifcase\scratchcounter + % one page + \dimexpr\MPx#2-\MPx#1% + \else + % two or more pages / maybe also hang + \ifx#3\relax + \makeupwidth % \textwidth + \else + \MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor + \fi + \fi}} \def\mintextparheight{4\lineheight} @@ -938,7 +936,7 @@ \def\definetextbackground {\dodoubleempty\dodefinetextbackground} -\def\dodefinetextbackground[#1][#2]% +\def\dodefinetextbackground[#1][#2]% parent and ..parameter {\ifsecondargument % why ? \copyparameters[\??td#1][\??td] [\c!state,\c!location,\c!alternative,\c!mp,\c!method, @@ -1250,7 +1248,7 @@ % new but bugged % \setbox#1\hbox % {\hskip-\MPx{\s!margin:\number\currentmarginpos}% - % \hskip\MPx{head:\realfolio}% + % \hskip\MPx{head:\the\realpageno}% % \box#1}% % so far \setbox#1\hbox @@ -1278,7 +1276,7 @@ \dp#1\zeropoint \ht#1\zeropoint \fi - \graphicvadjust{\box#1}% + \graphicvadjust{\dontleavehmode\box#1}% dontleavehmode is needed to get direction right \egroup} \chardef\marginrepositionmethod\plusone % sidemethod @@ -1308,25 +1306,22 @@ % 0=notfound 1=found 2=currentpage -\def\do@@amposition#1#2#3% +\def\domenuitemposition#1#2#3% {\doifelsevalue{\??am#1\c!position}\v!yes {\doglobal\increment\currentamposition - \doifnumberelse{#2} - {\docheckrealreferencepage{#2}% - \global\chardef\currentamrealpage\ifrealreferencepage2\else1\fi} - {\doifreferencefoundelse{#2} - {\global\chardef\currentamrealpage\ifrealreferencepage2\else1\fi} - {\global\chardef\currentamrealpage0}}% % not found + \doifreferencefoundelse{#2}% 0=not found, 1=same page, >1=elsewhere + {\chardef\currentamrealpage\ifnum\currentreferencerealpage=\realpageno\plusone\else\plustwo\fi}% + {\chardef\currentamrealpage\plustwo}% \expanded {\doglobal\noexpand\appendtoks - #1_menu_button(\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ; + #1_menu_button(\number\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ; \to \MPmenutoks}% \hpos{#1:\currentamposition}{#3}} {#3}} -\def\do@@ammenuposition#1% +\def\dowholemenuposition#1% {\ifnum\currentamposition>0 - \dowithnextbox{\hpos{menu:#1:\realfolio}{\flushnextbox}}\hbox + \dowithnextbox{\hpos{menu:#1:\the\realpageno}{\flushnextbox}}\hbox \fi} %D \macros @@ -1337,6 +1332,7 @@ %D specified with symbolic names, and symbolic references to %D the graphics involved. Each table has its own namespace. +\newconditional\tablehaspositions \newcount\noftabpositions \newtoks \posXCtoks @@ -1346,10 +1342,13 @@ \def\tbPOSprefix {tbp:\number\noftabpositions:} +% \def\tableposindeed +% {\scratchtoks\posXCtoks +% \global\posXCtoks\emptytoks +% \the\scratchtoks} + \def\tablepos - {\scratchtoks\posXCtoks - \global\posXCtoks\emptytoks - \the\scratchtoks} + {\normalexpanded{\global\posXCtoks\emptytoks\the\posXCtoks}} \let\tabulatepos\tablepos @@ -1403,10 +1402,16 @@ \def\dodoXC[#1]% {{\let\NC\relax\processcommalist[#1]\dododoXC}} -\def\doGSC[#1]{\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi} -\def\doGFC[#1]{\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi} -\def\doGTC[#1]{\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi} -\def\doXC [#1]{\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC} +\def\@@checktablepositionstate + {\iftrialtypesetting + \global\settrue\tablehaspositions + \firstargumentfalse + \fi} + +\def\doGSC[#1]{\@@checktablepositionstate\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi} +\def\doGFC[#1]{\@@checktablepositionstate\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi} +\def\doGTC[#1]{\@@checktablepositionstate\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi} +\def\doXC [#1]{\@@checktablepositionstate\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC} \def\tbGSC{\dosingleempty\doGSC} \def\tbGFC{\dosingleempty\doGFC} @@ -1419,15 +1424,30 @@ \let\tabulatepos\tablepos \def\tabulatenormalpos - {\hss\tabulatepos\hss} + {\iftrialtypesetting + % nothing + \else\ifconditional\tablehaspositions + \hss\tabulatepos\hss + \else + % nothing + \fi\fi} \def\tabulateequalpos + {\iftrialtypesetting + \tabulateEQ + \else\ifconditional\tablehaspositions + \tabulateEQpos + \else + \tabulateEQ + \fi\fi} + +\def\tabulateEQpos {\setbox\scratchbox\hbox{\tabulateEQ}% \hbox to \wd\scratchbox{\hss\kern\zeropoint\tabulatepos\hss}% \hskip-\wd\scratchbox \box\scratchbox} -\def\tabulatenormalcolumn#1% overloaded +\def\tabulatenormalcolumn#1% overloaded later in node-bck {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi &\global\chardef\tabulatetype#1&} @@ -1437,6 +1457,7 @@ \appendtoks \global\advance\noftabpositions\plusone + \global\setfalse\tablehaspositions \to \everytabulate % We need to handle paragraphs as well. @@ -1454,7 +1475,7 @@ \gdef\doflushtabulateepos{\epos{#1}}% \fi} -\def\splitofftabulatebox +\def\splitofftabulatebox % overloaded in node-bck {\dontcomplain \global\setbox\tabulatebox % % % global ? % % % \vsplit\tablebox\tabulatecolumn to \lineheight @@ -1465,11 +1486,12 @@ \ht\tabulatebox\strutht \dp\tabulatebox\strutdp \box\tabulatebox - \doflushtabulateepos} + \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi} \appendtoks \let\dotablebpos\dotabulatebpos \let\dotableepos\dotabulateepos + \glet\doflushtabulateepos\relax \to \everytabulate %D In order to prevent potential clashes with abbreviations, @@ -1517,6 +1539,7 @@ \appendtoks \global\advance\noftabpositions\plusone + \global\setfalse\tablehaspositions \to \everytable %D Since we don't want nameclashes: diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua index b6a66870f..b16fac05c 100644 --- a/tex/context/base/anch-pos.lua +++ b/tex/context/base/anch-pos.lua @@ -29,7 +29,7 @@ local dx, dy = "0pt", "0pt" local function initializer() ptbs, pcol = jobpositions.tobesaved, jobpositions.collected - local p = pcol["page:0"] + local p = pcol["page:0"] -- page:1 if p then -- to be checked ! --~ dx, dy = p[2] or "0pt", p[3] or "0pt" diff --git a/tex/context/base/anch-pos.mkiv b/tex/context/base/anch-pos.mkiv index f58f68302..88f492fb8 100644 --- a/tex/context/base/anch-pos.mkiv +++ b/tex/context/base/anch-pos.mkiv @@ -188,11 +188,6 @@ %D positions. \newcount\currentpositions % current number of positions -\newcounter\totalnofpositions % total from previous run - -\appendtoks - \expanded{\savecurrentvalue\noexpand\totalnofpositions{\the\currentpositions}}% -\to \everybye %D The next switch can be used to communicate a special %D situation. Positioning and associated actions can be @@ -216,15 +211,6 @@ \localpositioningfalse \to \everypagebody -% \def\checkpositions -% {\startnointerference -% \protectlabels -% \doutilities{positions}\jobname\empty\relax\relax -% \global\let\checkpositions\relax -% \stopnointerference} - -\let\checkpositions\relax - %D Since the positional values are to be fully expandable, we %D need to preload them as soon as possible, which is why we %D load the data when we start a text. diff --git a/tex/context/base/anch-snc.tex b/tex/context/base/anch-snc.tex index ed090eaf9..cf5b35d69 100644 --- a/tex/context/base/anch-snc.tex +++ b/tex/context/base/anch-snc.tex @@ -143,8 +143,6 @@ \starttext -\setupcolors[state=start] - \definesyncpositions[1] \startuseMPgraphic{sync} diff --git a/tex/context/base/attr-ini.lua b/tex/context/base/attr-ini.lua index a7d09bba1..afd69f1f5 100644 --- a/tex/context/base/attr-ini.lua +++ b/tex/context/base/attr-ini.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['attr-ini'] = { } -- this module is being reconstructed +-- we can also do the nsnone via a metatable and then also se index 0 local type = type local format, gmatch = string.format, string.gmatch @@ -28,11 +29,6 @@ shipouts = shipouts or { } -- first implementation did that and while it saves a bit for glyphs and rules, it -- costs more resourses for transparencies. So why bother. --- namespace for all those features / plural becomes singular - --- i will do the resource stuff later, when we have an interface to pdf (ok, i can --- fake it with tokens but it will take some coding - -- -- colors -- @@ -63,6 +59,7 @@ colors = colors or { } colors.data = colors.data or { } colors.values = colors.values or { } colors.registered = colors.registered or { } + colors.enabled = true colors.weightgray = true colors.attribute = 0 @@ -174,38 +171,49 @@ function colors.spot(parent,f,d,p) return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p } end -function colors.reviver(n) - local d = data[n] - if not d then - local v = values[n] - if not v then - local gray = nodeinjections.graycolor(0) +local function graycolor(...) graycolor = nodeinjections.graycolor return graycolor(...) end +local function rgbcolor (...) rgbcolor = nodeinjections.rgbcolor return rgbcolor (...) end +local function cmykcolor(...) cmykcolor = nodeinjections.cmykcolor return cmykcolor(...) end +local function spotcolor(...) spotcolor = nodeinjections.spotcolor return spotcolor(...) end + +local function extender(colors,key) + if key == "none" then + local d = graycolor(0) + colors.none = d + return d + end +end + +local function reviver(data,n) + local v = values[n] + if not v then + local gray = graycolor(0) + d = { gray, gray, gray, gray } + logs.report("attributes","unable to revive color %s",n or "?") + else + local kind, gray, rgb, cmyk = v[1], graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9]) + if kind == 2 then d = { gray, gray, gray, gray } - logs.report("attributes","unable to revive color %s",n or "?") - else - local kind, gray, rgb, cmyk = v[1], nodeinjections.graycolor(v[2]), nodeinjections.rgbcolor(v[3],v[4],v[5]), nodeinjections.cmykcolor(v[6],v[7],v[8],v[9]) - if kind == 2 then - d = { gray, gray, gray, gray } - elseif kind == 3 then - d = { rgb, gray, rgb, cmyk } - elseif kind == 4 then - d = { cmyk, gray, rgb, cmyk } - elseif kind == 5 then - local spot = nodeinjections.spotcolor(v[10],v[11],v[12],v[13]) - d = { spot, gray, rgb, cmyk } - end + elseif kind == 3 then + d = { rgb, gray, rgb, cmyk } + elseif kind == 4 then + d = { cmyk, gray, rgb, cmyk } + elseif kind == 5 then + local spot = spotcolor(v[10],v[11],v[12],v[13]) + d = { spot, gray, rgb, cmyk } end - data[n] = d end + data[n] = d return d end +setmetatable(colors, { __index = extender }) +setmetatable(colors.data, { __index = reviver }) + function colors.filter(n) return concat(data[n],":",5) end -colors.none = nodeinjections.graycolor(0) - function colors.setmodel(attribute,name,weightgray) colors.model = name colors.selector = numbers[attribute] @@ -221,7 +229,7 @@ function colors.register(attribute, name, colorspace, ...) -- passing 9 vars is color = #values+1 values[color] = colors[colorspace](...) registered[stamp] = color - colors.reviver(color) + -- colors.reviver(color) end if name then list[numbers[attribute]][name] = color -- not grouped, so only global colors @@ -244,9 +252,6 @@ shipouts.handle_color = nodes.install_attribute_handler { -- transparencies --- for the moment we manage transparencies in the pdf driver because --- first we need a nice interface to some pdf things - transparencies = transparencies or { } transparencies.registered = transparencies.registered or { } transparencies.data = transparencies.data or { } @@ -262,43 +267,45 @@ local data = transparencies.data local values = transparencies.values local template = "%s:%s" -local function reference(n) - reference = nodeinjections.transparency - return reference(n) -end +local function inject_transparency (...) inject_transparency = nodeinjections.transparency return inject_transparency (...) end +local function register_transparency(...) register_transparency = registrations.transparency return register_transparency(...) end function transparencies.register(name,a,t) local stamp = format(template,a,t) local n = registered[stamp] if not n then - n = #data+1 - data[n] = reference(n) + n = #values + 1 values[n] = { a, t } registered[stamp] = n - registrations.transparency(n,a,t) + register_transparency(n,a,t) end return registered[stamp] end -function transparencies.reviver(n) - local d = data[n] - if not d then - local v = values[n] - if not v then - d = reference(0) - logs.report("attributes","unable to revive transparency %s",n or "?") - else - d = reference(n) - registrations.transparency(n,v[1],v[2]) - end - data[n] = d +local function extender(transparencies,key) + if key == "none" then + local d = inject_transparency(0) + transparencies.none = d + return d + end +end + +local function reviver(data,n) + local v = values[n] + if not v then + d = inject_transparency(0) + else + d = inject_transparency(n) + register_transparency(n,v[1],v[2]) end + data[n] = d return d end --- check if there is an identity +setmetatable(transparencies, { __index = extender }) +setmetatable(transparencies.data, { __index = reviver }) -transparencies.none = reference(0) -- for the moment the pdf backend does this +-- check if there is an identity function transparencies.value(id) return values[id] @@ -308,8 +315,8 @@ shipouts.handle_transparency = nodes.install_attribute_handler { name = "transparency", namespace = transparencies, initializer = states.initialize, - finalizer = states.finalize , - processor = states.process , + finalizer = states.finalize, + processor = states.process, } --- overprint / knockout @@ -318,21 +325,35 @@ overprints = overprints or { } overprints.data = overprints.data or { } overprints.enabled = false -overprints.data[1] = nodeinjections.overprint() -overprints.data[2] = nodeinjections.knockout() - -overprints.none = overprints.data[2] - overprints.registered = { overprint = 1, knockout = 2, } ---~ storage.register("overprints/registered", overprints.registered, "overprints.registered") ---~ storage.register("overprints/data", overprints.data, "overprints.data") +local data, registered = overprints.data, overprints.registered -local data = overprints.data -local registered = overprints.registered +local function extender(overprints,key) + if key == "none" then + local d = data[2] + overprints.none = d + return d + end +end + +local function reviver(data,n) + if n == 1 then + local d = nodeinjections.overprint() -- called once + data[1] = d + return d + elseif n == 2 then + local d = nodeinjections.knockout() -- called once + data[2] = d + return d + end +end + +setmetatable(overprints, { __index = extender }) +setmetatable(overprints.data, { __index = reviver }) function overprints.register(stamp) return registered[stamp] or registered.overprint @@ -348,22 +369,42 @@ shipouts.handle_overprint = nodes.install_attribute_handler { --- negative / positive -negatives = negatives or { } -negatives.data = negatives.data or { } -negatives.enabled = false - -negatives.data[1] = nodeinjections.positive() -negatives.data[2] = nodeinjections.negative() - -negatives.none = negatives.data[1] +negatives = negatives or { } +negatives.data = negatives.data or { } +negatives.enabled = false negatives.registered = { positive = 1, negative = 2, } +local data, registered = negatives.data, negatives.registered + +local function extender(negatives,key) + if key == "none" then + local d = data[1] + negatives.none = d + return d + end +end + +local function reviver(data,n) + if n == 1 then + local d = nodeinjections.positive() -- called once + data[1] = d + return d + elseif n == 2 then + local d = nodeinjections.negative() -- called once + data[2] = d + return d + end +end + +setmetatable(negatives, { __index = extender }) +setmetatable(negatives.data, { __index = reviver }) + function negatives.register(stamp) - return negatives.registered[stamp] or negatives.registered.positive + return registered[stamp] or registered.positive end shipouts.handle_negative = nodes.install_attribute_handler { @@ -374,36 +415,52 @@ shipouts.handle_negative = nodes.install_attribute_handler { processor = states.process, } --- effects -- can be optimized +-- effects -- can be optimized (todo: metatables) effects = effects or { } effects.data = effects.data or { } +effects.values = effects.values or { } effects.registered = effects.registered or { } effects.enabled = false effects.stamp = "%s:%s:%s" storage.register("effects/registered", effects.registered, "effects.registered") -storage.register("effects/data", effects.data, "effects.data") +storage.register("effects/values", effects.values, "effects.values") -function effects.register(effect,stretch,rulethickness) - local stamp = format(effects.stamp,effect,stretch,rulethickness) - local n = effects.registered[stamp] - if not n then - n = #effects.data+1 - effects.data[n] = effects.reference(effect,stretch,rulethickness) - effects.registered[stamp] = n +local data, registered, values = effects.data, effects.registered, effects.values + +-- valid effects: normal inner outer both hidden (stretch,rulethickness,effect) + +local function effect(...) effect = nodeinjections.effect return effect(...) end + +local function extender(effects,key) + if key == "none" then + local d = effect(0,0,0) + effects.none = d + return d end - return effects.registered[stamp] end --- valid effects: normal inner outer both hidden - -function effects.reference(effect,stretch,rulethickness) - effects.reference = nodeinjections.effect - return nodeinjections.effect(stretch,rulethickness,effect) +local function reviver(data,n) + local e = values[n] -- we could nil values[n] now but hardly needed + local d = effect(v[1],v[2],v[3]) + data[n] = d + return d end -effects.none = effects.reference(0,0,0) +setmetatable(effects, { __index = extender }) +setmetatable(effects.data, { __index = reviver }) + +function effects.register(effect,stretch,rulethickness) + local stamp = format(effects.stamp,effect,stretch,rulethickness) + local n = registered[stamp] + if not n then + n = #values + 1 + values[n] = { effect, stretch, rulethickness } + registered[stamp] = n + end + return n +end shipouts.handle_effect = nodes.install_attribute_handler { name = "effect", @@ -413,61 +470,101 @@ shipouts.handle_effect = nodes.install_attribute_handler { processor = states.process, } --- layers (ugly code, due to no grouping and such) +-- layers (ugly code, due to no grouping and such); currently we use exclusive layers +-- but when we need it stacked layers might show up too; the next function based +-- approach can be replaced by static (metatable driven) resolvers viewerlayers = viewerlayers or { } viewerlayers.data = viewerlayers.data or { } viewerlayers.registered = viewerlayers.registered or { } +viewerlayers.values = viewerlayers.values or { } viewerlayers.enabled = false storage.register("viewerlayers/registered", viewerlayers.registered, "viewerlayers.registered") ---~ storage.register("viewerlayers/data", viewerlayers.data, "viewerlayers.data") +storage.register("viewerlayers/values", viewerlayers.values, "viewerlayers.values") local data = viewerlayers.data +local values = viewerlayers.values local registered = viewerlayers.registered local template = "%s" -local somedone = false -local somedata = { } -local nonedata = nodeinjections.stoplayer() +-- interwoven + +--~ local somedone = false +--~ local somedata = { } +--~ local nonedata = nodeinjections.stoplayer() +--~ +--~ function viewerlayers.none() -- no local +--~ if somedone then +--~ somedone = false +--~ return nonedata +--~ else +--~ return nil +--~ end +--~ end +--~ +--~ local function some(name) +--~ local sd = somedata[name] +--~ if not sd then +--~ sd = { +--~ nodeinjections.switchlayer(name), +--~ nodeinjections.startlayer(name), +--~ } +--~ somedata[name] = sd +--~ end +--~ if somedone then +--~ return sd[1] +--~ else +--~ somedone = true +--~ return sd[2] +--~ end +--~ end +--~ +--~ local function initializer(...) +--~ somedone = false +--~ return states.initialize(...) +--~ end +--~ +--~ viewerlayers.register = function(name) -- if not inimode redefine data[n] in first call +--~ local stamp = format(template,name) +--~ local n = registered[stamp] +--~ if not n then +--~ n = #data + 1 +--~ data[n] = function() return some(name) end -- slow but for the moment we don't store things in the format +--~ registered[stamp] = n +--~ end +--~ return registered[stamp] -- == n +--~ end -function viewerlayers.none() -- no local - if somedone then - somedone = false - return nonedata - else - return nil +-- stacked + +local function extender(viewerlayers,key) + if key == "none" then + local d = nodeinjections.stoplayer() + viewerlayers.none = d + return d end end -local function some(name) - local sd = somedata[name] - if not sd then - sd = { - nodeinjections.switchlayer(name), - nodeinjections.startlayer(name), - } - somedata[name] = sd - end - if somedone then - return sd[1] - else - somedone = true - return sd[2] - end +local function reviver(data,n) + local d = nodeinjections.startlayer(values[n]) + data[n] = d + return d end +setmetatable(viewerlayers, { __index = extender }) +setmetatable(viewerlayers.data, { __index = reviver }) + local function initializer(...) - somedone = false return states.initialize(...) end -viewerlayers.register = function(name) +viewerlayers.register = function(name) -- if not inimode redefine data[n] in first call local stamp = format(template,name) local n = registered[stamp] if not n then - n = #data + 1 - data[n] = function() return some(name) end -- slow but for the moment we don't store things in the format + n = #values + 1 + values[n] = name registered[stamp] = n end return registered[stamp] -- == n @@ -478,5 +575,5 @@ shipouts.handle_viewerlayer = nodes.install_attribute_handler { namespace = viewerlayers, initializer = initializer, finalizer = states.finalize, - processor = states.process, + processor = states.stacked, } diff --git a/tex/context/base/attr-ini.mkiv b/tex/context/base/attr-ini.mkiv index a44a16be6..f653e8c75 100644 --- a/tex/context/base/attr-ini.mkiv +++ b/tex/context/base/attr-ini.mkiv @@ -23,15 +23,17 @@ \definesystemattribute[state] \definesystemattribute[skip] \definesystemattribute[penalty] -\definesystemattribute[colormodel][global] % no reset -\definesystemattribute[color] -\definesystemattribute[transparency] -\definesystemattribute[background] +\definesystemattribute[colormodel][global] % no reset \chardef\colormodelattribute \dogetattributeid{colormodel} +\definesystemattribute[color] \chardef\colorattribute \dogetattributeid{color} +\definesystemattribute[transparency] \chardef\transparencyattribute \dogetattributeid{transparency} +\definesystemattribute[background] \chardef\backgroundattribute \dogetattributeid{background} \definesystemattribute[overprint] \definesystemattribute[negative] \definesystemattribute[effect] -\definesystemattribute[viewerlayer] -\definesystemattribute[reference] +\definesystemattribute[viewerlayer] \chardef\viewerlayerattribute \dogetattributeid{viewerlayer} +\definesystemattribute[reference] \chardef\referenceattribute \dogetattributeid{reference} +\definesystemattribute[destination] \chardef\destinationattribute \dogetattributeid{destination} +\definesystemattribute[graphicvadjust] \chardef\graphicvadjustattribute\dogetattributeid{graphicvadjust} % \definesystemattribute[ignore] % @@ -85,8 +87,7 @@ {\setevalue{(os:#1)}{\dosetattribute{overprint}{\ctxlua{tex.print(overprints.register('#2'))}}}} \def\dotriggeroverprint - {\initializePDFoverprint % temp here, to be tested in la code (states.collect) - \ctxlua{overprints.enabled=true}% + {\ctxlua{overprints.enabled=true}% \gdef\dotriggeroverprint##1{\csname(os:##1)\endcsname}% \dotriggeroverprint} @@ -99,8 +100,7 @@ {\setevalue{(ns:#1)}{\dosetattribute{negative}{\ctxlua{tex.print(negatives.register('#2'))}}}} \def\dotriggernegative - {\initializePDFnegative % temp here, to be tested in la code (states.collect) - \ctxlua{negatives.enabled=true}% + {\ctxlua{negatives.enabled=true}% \gdef\dotriggernegative##1{\csname(ns:##1)\endcsname}% \dotriggernegative} @@ -126,7 +126,7 @@ % \registereffect{both} % \registereffect{hidden} -% viewerlayers +% viewerlayers (will probably change a bit) % \def\registerviewerlayer#1#2% global ! % {\setxvalue{(vl:#1)}{\dosetattribute{viewerlayer}{\ctxlua{tex.print(viewerlayers.register('#2'))}}}} @@ -140,8 +140,6 @@ \setevalue{(vl:)}{\global\doresetattribute{viewerlayer}} -% - \def\dotriggerviewerlayer {\ctxlua{viewerlayers.enabled=true}% \gdef\dotriggerviewerlayer##1{\csname(vl:##1)\endcsname}% diff --git a/tex/context/base/back-ini.lua b/tex/context/base/back-ini.lua index 0a11c2ef7..bad6b0282 100644 --- a/tex/context/base/back-ini.lua +++ b/tex/context/base/back-ini.lua @@ -8,8 +8,12 @@ if not modules then modules = { } end modules ['back-ini'] = { backends = backends or { } +local trace_backend = false + local function nothing() return nil end +backends.nothing = nothing + backends.nodeinjections = { rgbcolor = nothing, cmykcolor = nothing, @@ -24,10 +28,61 @@ backends.nodeinjections = { startlayer = nothing, stoplayer = nothing, switchlayer = nothing, + + reference = nothing, + destination = nothing, + } backends.codeinjections = { - insertmovie = nothing, + + prerollreference = nothing, + + insertmovie = nothing, + insertsound = nothing, + + presetsymbollist = nothing, + registersymbol = nothing, + registeredsymbol = nothing, + + registercomment = nothing, + attachfile = nothing, + adddocumentinfo = nothing, + setupidentity = nothing, + setpagetransition = nothing, + defineviewerlayer = nothing, + addbookmarks = nothing, + addtransparencygroup = nothing, + + typesetfield = nothing, + finishfields = nothing, + doiffieldelse = nothing, + doiffieldgroupelse = nothing, + definefield = nothing, + clonefield = nothing, + definefieldset = nothing, + getfieldgroup = nothing, + setformsmethod = nothing, + getdefaultfieldvalue = nothing, + + setupcanvas = nothing, + + initializepage = nothing, + initializedocument = nothing, + finalizepage = nothing, + finalizedocument = nothing, + + flushpageactions = nothing, + flushdocumentactions = nothing, + + insertrenderingwindow = nothing, + processrendering = nothing, + kindofrendering = nothing, + flushrenderingwindow = nothing, + + setfigurecolorspace = nothing, + setfigurealternative = nothing, + } backends.registrations = { @@ -49,27 +104,40 @@ backends.current = "unknown" function backends.install(what) if type(what) == "string" then - backends.current = what - what = backends[what] - if what then - local wi = what.nodeinjections - if wi then - for k, v in next, wi do - nodeinjections[k] = v - end - end - local wi = what.codeinjections - if wi then - for k, v in next, wi do - codeinjections[k] = v - end + local backend = backends[what] + if backend then + if trace_backend then + logs.report("backend", "initializing backend %s (%s)",what,backend.comment or "no comment") end - local wi = what.registrations - if wi then - for k, v in next, wi do - registrations[k] = v + backends.current = what + for _, category in next, { "nodeinjections", "codeinjections", "registrations"} do + local plugin = backend[category] + if plugin then + local whereto = backends[category] + for name, meaning in next, whereto do + if plugin[name] then + whereto[name] = plugin[name] + -- logs.report("backend", "installing function %s in category %s of %s",name,category,what) + elseif trace_backend then + logs.report("backend", "no function %s in category %s of %s",name,category,what) + end + end + elseif trace_backend then + logs.report("backend", "no category %s in %s",category,what) end end + backends.helpers = backend.helpers + elseif trace_backend then + logs.report("backend", "no backend named %s",what) end end end + +statistics.register("used backend", function() + local bc = backends.current + if bc ~= "unknown" then + return string.format("%s (%s)",bc,backends[bc].comment or "no comment") + else + return nil + end +end) diff --git a/tex/context/base/back-ini.mkiv b/tex/context/base/back-ini.mkiv index a60b6a329..b074d04fe 100644 --- a/tex/context/base/back-ini.mkiv +++ b/tex/context/base/back-ini.mkiv @@ -11,6 +11,9 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D Most will go away here as it is replaced by \LUA\ calls to +%D backend functions. + \writestatus{loading}{ConTeXt Backend Macros / Initialization} \registerctxluafile{back-ini}{1.001} @@ -20,6 +23,9 @@ \unprotect +\ifdefined\everybackendshipout \else \newtoks\everybackendshipout \fi +\ifdefined\everylastbackendshipout \else \newtoks\everylastbackendshipout \fi + %D Right from the start \CONTEXT\ had a backend system based on %D runtime pluggable code. As most backend issues involved specials %D and since postprocessors had not that much in common, we ended up @@ -44,122 +50,6 @@ %D Not everything here makes sense and the content of this file will %D definitely change. -%D We use a couple of (global) variables because it saves us the -%D trouble of dealing with arguments. - -\letempty \@@DriverFieldName -\letempty \@@DriverFieldWidth -\letempty \@@DriverFieldHeight -\letempty \@@DriverFieldDefault -\letempty \@@DriverFieldNumber -\letempty \@@DriverFieldNumber -\letempty \@@DriverFieldStyle -\letempty \@@DriverFieldColor -\letempty \@@DriverFieldBackgroundColor -\letempty \@@DriverFieldFrameColor -\letempty \@@DriverFieldLayer -\letempty \@@DriverFieldOption -\letempty \@@DriverFieldAlign -\letempty \@@DriverFieldClickIn -\letempty \@@DriverFieldClickOut -\letempty \@@DriverFieldRegionIn -\letempty \@@DriverFieldRegionOut -\letempty \@@DriverFieldAfterKey -\letempty \@@DriverFieldFormat -\letempty \@@DriverFieldValidate -\letempty \@@DriverFieldCalculate -\letempty \@@DriverFieldFocusIn -\letempty \@@DriverFieldFocusOut - -\letempty \@@DriverCommentLayer -\letempty \@@DriverAttachmentLayer - -\letempty \@@DriverImageBox -\letempty \@@DriverImageOptions -\letempty \@@DriverImageWidth -\letempty \@@DriverImageHeight -\letempty \@@DriverImageFile -\letempty \@@DriverImageLabel -\letempty \@@DriverImageType -\letempty \@@DriverImageMethod -\letempty \@@DriverImagePage - -\newif\ifcollectreferenceactions - -%D \macros -%D {dostartgraymode,dostopgraymode, -%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode} -%D -%D Switching to and from color can be done in two ways: -%D -%D \startitemize[packed,n] -%D \item insert driver specific commands -%D \item pass instructions to the output device -%D \stopitemize -%D -%D The first approach is more general and lays the -%D responsibility at the driver side. Probably due to the fact -%D that \TEX\ does not directly support color, we have been -%D confronted for the last few years with changing special -%D definitions. The need for support depends on how a macro -%D package handles colored text that crosses the page boundary. -%D Again, there are two approaches. -%D -%D \startitemize[packed,n] -%D \item let \TEX\ do the job -%D \item let the driver handle things -%D \stopitemize -%D -%D The first approach is as driver independant as possible and -%D can easily be accomplished by using \TEX's mark mechanism. -%D In \CONTEXT\ we follow this approach. More and more, drivers -%D are starting to support color, including stacking them. -%D -%D Colors as well as grayscales can be represented in scales -%D from~0 to~1. When drivers use values in the range 0..255, -%D this value has to be adapted in the translation process. -%D Technically it's possible to get a grayscale from combining -%D colors. In the \cap{RGB} color system, a color with Red, -%D Green and Blue components of 0.80 show the same gray as a -%D Gray Scale specified 0.80. The \cap{CMYK} color system -%D supports a Black component apart from Cyan, Magenta and -%D Yellow. -%D -%D Depending on the target format, color support differs from -%D gray support. PostScript for example offers different -%D operators for setting gray and color. This is because -%D printing something using three colors is someting else than -%D printing with just black. -%D -%D In \CONTEXT\ we have implemented a color subsystem that -%D supports the use of well defined colors that, when printed -%D in black and white, still can be distinguished. This -%D approach enables us to serve both printed and electronic -%D versions, using colored text and illustrations. More on the -%D fundamentals of this topic can be found in the \cap{MAPS} of -%D the Dutch User Group, 14 (95.1). -%D -%D To satisfy all those needs, we define four specials which -%D supply enough information for drivers to act upon. We -%D could have used more general commands with the keywords -%D 'rgb' and 'gray', but because these specials are used often, -%D we prefer the more direct and shorter alternative. -%D -%D We start with the installation of color and grayscale -%D specials. The values are in the range 0..1 (e.g. 0.25). -%D -%D \starttyping -%D \dostartgraymode {gray} ... \dostopgraymode -%D \dostartrgbcolormode {red} {green} {blue} ... \dostopcolormode -%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode -%D \dostartgraycolormode {gray} ... \dostopcolormode -%D \stoptyping -%D -%D Because we can expect conflicts between drivers, we -%D implement them as category \type{or}. In previous versions -%D of \DVIPSONE\ the use of their color||specials did not -%D interfere with the PostScript ones, but recent versions do. - \let \dostartgraymode \gobbleoneargument \let \dostopgraymode \donothing \let \dostartrgbcolormode \gobblethreearguments @@ -167,70 +57,24 @@ \let \dostartgraycolormode \gobbleoneargument \let \dostopcolormode \donothing \let \dostartspotcolormode \gobbletwoarguments -\let \doregisterrgbspotcolor \gobblesevenarguments -\let \doregistercmykspotcolor \gobbleeightarguments -\let \doregistergrayspotcolor \gobblefourarguments -\let \doregisterrgbindexcolor \gobblesevenarguments -\let \doregistercmykindexcolor \gobbleeightarguments -\let \doregistergrayindexcolor \gobblefourarguments \let \doregisterspotcolorname \gobbletwoarguments \let \dostartnonecolormode \donothing \let \doregisternonecolor \donothing -%D \macros -%D {doinsertsoundtrack} -%D -%D Sounds are (for the moment) just files with -%D associated options. -%D -%D \starttyping -%D \doinsertsoundtrack {file} {label} {options} -%D \stoptyping +\let \doinsertsoundtrack \gobblethreearguments -\let \doinsertsoundtrack \gobblethreearguments - -%D \macros -%D {dostartrotation,dostoprotation, -%D dostartscaling,dostopscaling, -%D dostartmirroring,dostopmirroring, -%D dostartnegative,dostopnegative} -%D dostartoverprint,dostopoverprint} -%D -%D We support a couple of transformations and renderings: -%D -%D \starttyping -%D \dostartrotation {angle} ... \dostoprotation -%D \dostartscaling {x} {y} ... \dostopscaling -%D \dostartmirroring {x} {y} ... \dostopmirroring -%D \stoptyping - -\let \dostartrotation \gobbleoneargument -\let \dostoprotation \donothing -\let \dostartscaling \gobbletwoarguments -\let \dostopscaling \donothing -\let \dostartmirroring \donothing -\let \dostopmirroring \donothing - -\let \dostartnegative \donothing -\let \dostopnegative \donothing -\let \dostartoverprint \donothing -\let \dostopoverprint \donothing - -%D The following two specials are used in for instance \type -%D {\vadjust}'d margin material inside colored paragraphs. - -\let \dostartgraphicgroup \donothing -\let \dostopgraphicgroup \donothing - -%D \macros -%D {doselectfirstpaperbin, -%D doselectsecondpaperbin} -%D -%D Here are some very printer||specific ones. No further -%D comment. - -\let \doselectfirstpaperbin \donothing -\let \doselectsecondpaperbin \donothing +\let \dostartrotation \gobbleoneargument +\let \dostoprotation \donothing +\let \dostartscaling \gobbletwoarguments +\let \dostopscaling \donothing +\let \dostartmirroring \donothing +\let \dostopmirroring \donothing +\let \dostartnegative \donothing +\let \dostopnegative \donothing +\let \dostartoverprint \donothing +\let \dostopoverprint \donothing +\let \dostartgraphicgroup \donothing +\let \dostopgraphicgroup \donothing %D \macros %D {doovalbox} @@ -263,300 +107,8 @@ \let \dostartclipping \gobblethreearguments \let \dostopclipping \donothing -%D \macros -%D {dosetupidentity} -%D -%D We can declare some characteristics of the document with -%D -%D \starttyping -%D \dosetupidentity {title} {subject} {author} {creator} {date} {keys} -%D \stoptyping -%D -%D All data is in string format. - -\let \dosetupidentity \gobblesixarguments - -%D \macros -%D {dosetuppaper} -%D -%D This special can be used to tell the driver what page size -%D to use. The special takes three arguments. -%D -%D \starttyping -%D \dosetuppaper {type} {width} {height} -%D \stoptyping -%D -%D The type is one of the common identifiers, like A4, A5 or -%D B2. - -\let \dosetuppaper \gobblethreearguments - -%D \macros -%D {dosetupprinter} -%D -%D Some drivers enable the user to specify the paper type -%D used and/or page dimensions to be taken into account. -%D -%D \starttyping -%D \dosetupprinter {type} {hoffset} {voffset} {width} {height} -%D \stoptyping -%D -%D The first argument is one of \type{letter}, \type{legal}, -%D \type{A4}, \type{A5} etc. The dimensions are in -%D basepoints. - -\let \dosetupprinter \gobblefourarguments - -%D \macros -%D {dosetupopenaction, dosetupclosaction, -%D dosetupopenpageaction, dosetupclospageaction, -%D dosetupinteraction, -%D dosetupscreen, -%D dosetupviewmode} -%D -%D Here come some obscure interactive commands. Probably the -%D specs will change with the development of the macros that -%D use them. -%D -%D The first ones can be used to set up the interaction. -%D -%D \starttyping -%D \dosetupinteraction -%D \stoptyping -%D -%D Normally this command does nothing but giving a message -%D that some scheme is supported. -%D -%D \starttyping -%D \dosetupstartaction -%D \dosetupstopaction -%D \stoptyping -%D -%D These two setup the actions to be executed when the document -%D is opened and closed. -%D -%D The next commands sets up the page and screen. They are -%D kind of related. -%D -%D \starttyping -%D \dosetuppage {hoffset} {voffset} {width} {height} {options} -%D \dosetupscreen {hoffset} {voffset} {width} {height} {options} -%D \stoptyping -%D -%D The first four arguments are in points. Option~1 results in a -%D full screen launch. -%D -%D \starttyping -%D \dosetuppageview {keyword} -%D \stoptyping -%D -%D For the moment we only support \type{fit}. - -\let \dosetupinteraction \donothing -\let \dosetupopenaction \donothing -\let \dosetupscreen \gobblefourarguments -\let \dosetuppageview \gobbleoneargument -\let \dosetupcloseaction \donothing -\let \dosetupopenpageaction \donothing -\let \dosetupclosepageaction \donothing \let \dosetuprenderingopenpageaction \donothing \let \dosetuprenderingclosepageaction \donothing -\let \dosetupcropbox \gobblefourarguments -\let \dosetuptrimbox \gobblefourarguments -\let \dosetupartbox \gobblefourarguments -\let \dosetupbleedbox \gobblefourarguments - -%D \macros -%D {dostarthide, -%D dostophide} -%D -%D Not every part of the screen is suitable for paper. Menus -%D for instance have no meaning on an non||interactive medium. -%D These elements are hidden by means of: -%D -%D \starttyping -%D \dostarthide .. \dostophide -%D \stoptyping - -\let \dostarthide \donothing -\let \dostophide \donothing - -%D \macros -%D {dostartgotolocation, dostopgotolocation, -%D dostartgotorealpage, dostopgotorealpage} -%D -%D When we want to support hypertext buttons, again we have -%D to deal with two concepts. -%D -%D \startitemize[packed,n] -%D \item let \TEX\ highlight the text -%D \item let the driver show us where to click -%D \stopitemize -%D -%D The first approach is the most secure one. It gives us -%D complete control over the visual appearance of hyper -%D buttons. The second alternative lets the driver guess what -%D part of the text needs highlighting. As long as we deal with -%D not too complicated textual buttons, this is no problem. -%D It's even a bit more efficient when we take long mid -%D paragraph active regions into account. When we let \TEX\ -%D handle active sentences {\em for instance marked like this -%D one}, we have to take care of line- and pagebreaks ourselve. -%D However, it's no trivial matter to let a driver find out -%D where things begin and end. Because most hyperlinks can be -%D found in tables of contents and registers, the saving in -%D terms of bytes can be neglected and the first approach is a -%D clear winner. -%D -%D The most convenient way of cross||referencing is using named -%D destinations. A more simple scheme is using page numbers as -%D destinations. Because the latter alternative can often be -%D implemented more efficient, and because we cannot be sure -%D what scheme a driver supports, we always have to supply a -%D pagenumber, even when we use named destinations. -%D -%D To enable a driver to find out what to make active, we have -%D to provide begin and endpoints, so like with color, we use -%D pairs of specials. The first scheme can be satisfied with -%D proper dimensions of the areas to be made active. -%D -%D The interactive real work is done by the following four -%D specials. The reason for providing the first one with both -%D a label and a number, is a result of the quite poor -%D implementation of \type{pdfmarks} in version 1.0 of -%D Acrobat. Because only pagenumbers were supported as -%D destination, we had to provide both labels (\DVIWINDO) and -%D pagenumbers (\PDF). Some drivers use start stop pairs. -%D -%D \starttyping -%D \dostartgotolocation {w} {h} {url} {file} {label} {page} -%D \dostartgotorealpage {w} {h} {url} {file} {page} -%D \stoptyping -%D -%D Their counterparts are: -%D -%D \starttyping -%D \dostopgotolocation -%D \dostopgotorealpage -%D \stoptyping -%D -%D The internal alternative is used for system||generated -%D links, the external one for user||generated links. The -%D Uniform Resource Locator can be used to let the reader -%D surf the net. - -\let \dostartgotolocation \gobblesixarguments -\let \dostopgotolocation \donothing -\let \dostartgotorealpage \gobblefourarguments -\let \dostopgotorealpage \donothing - -%D One may wonder why jumps to page and location are not -%D combined. By splitting them, we enable macro||packages to -%D force the prefered alternative, while on the other hand -%D drivers can pick up the alternative desired most. - -%D \macros -%D {dostartgotoJS, doflushJSpreamble} -%D -%D Rather special is the option to include and execute -%D JavaScript code. This is a typical \PDF\ option. -%D -%D \starttyping -%D \dostartgotoJS {w} {h} {script} -%D \stoptyping -%D -%D This not so standard \TEX\ feature should be used with -%D care. Preamble scripts are flushed by -%D -%D \doflushJSpreamble {script} - -\let \dostartgotoJS \gobblethreearguments -\let \dostopgotoJS \donothing -\let \doflushJSpreamble \gobbleoneargument - -%D \macros -%D {dostartthisislocation, dostopthisislocation, -%D dostartthisisrealpage, dostopthisisrealpage} -%D -%D Before we can goto some location or page, we have to tell -%D the system where it can be found. Because some drivers -%D follow the \SGML\ approach of begin||end tags, we have to -%D support pairs. A possible extension to this scheme is -%D supplying coordinates for viewing the text. -%D -%D The opposite commands of \type{\dogotosomething} have only -%D one argument: -%D -%D \starttyping -%D \dostartthisislocation {label} -%D \dostartthisisrealpage {page} -%D \stoptyping -%D -%D These commands are accompanied by: -%D -%D \starttyping -%D \dostopthisislocation -%D \dostopthisisrealpage -%D \stoptyping -%D -%D As with all interactive commands's they are installed as -%D \type{and} category specials. - -\let \dostartthisislocation \gobbleoneargument -\let \dostopthisislocation \donothing -\let \dostartthisisrealpage \gobbleoneargument -\let \dostopthisisrealpage \donothing - -%D In \CONTEXT\ we don't use the \type{\stopsomething} -%D macros because we let \TEX\ take care of typographic -%D issues. - -%D \macros -%D {doresetgotowhereever} -%D -%D These and others need: - -\let \doresetgotowhereever \donothing - -%D \macros -%D {dostartexecutecommand, dostopexecutecommand} -%D -%D The actual behavior of the next pair of commands depends -%D much on the viewing engine. Therefore one cannot depend -%D too much on their support. -%D -%D \starttyping -%D \dostartexecutecommand {w} {h} {command} {options} -%D \stoptyping -%D -%D At least the next commands are supported (more examples -%D can be found in \type {spec-fdf.tex}: -%D -%D \startlinecorrection\setupalign[middle]\leavevmode -%D \starttable[|l|l|] -%D \HL -%D \NC \bf command \NC \bf action \NC\SR -%D \HL -%D \NC first \NC go to the first page \NC\FR -%D \NC previous \NC go to the previous page \NC\MR -%D \NC next \NC go to the next page \NC\MR -%D \NC last \NC go to the last page \NC\MR -%D \NC backward \NC go back to the link list \NC\MR -%D \NC forward \NC go forward in the link list \NC\MR -%D \NC print \NC enter print mode \NC\MR -%D \NC exit \NC exit viewer \NC\MR -%D \NC close \NC close document \NC\MR -%D \NC enter \NC enter viewer \NC\MR -%D \NC help \NC show help on the viewer \NC\LR -%D \HL -%D \stoptable -%D \stoplinecorrection -%D -%D Options are to be passed as a comma separated list of -%D assignments. - -\let \dostartexecutecommand \gobblefourarguments -\let \dostopexecutecommand \donothing %D \macros %D {dostartobject, @@ -590,229 +142,6 @@ \let \doinsertobject \gobbletwoarguments \let \doresetobjects \donothing -%D \macros -%D {doregisterfigure, doregisterfigurecolor} -%D -%D Images can be objects as well and it's up to the driver to -%D handle this. Alternative images are also up to the driver, -%D and the next macro tells the driver that the previous image -%D is somehow followed by another and that both have to be -%D handled together. This is a rather fuzzy model, but for the -%D moment it suits its purpose: low res screen versions combined -%D with high res printable ones. - -\let \doregisterfigure \gobbletwoarguments -\let \doregisterfigurecolor \gobbleoneargument - -% %D \macros -% %D {dogetobjectreference} -% %D -% %D For very special purposes, one can ask for the internal -% %D reference to the object. Beware! -% -% \let \dogetobjectreference \gobblethreearguments -% -% %D The first argument is the name, the second a macro that -% %D gets the associated value. - -%D \macros -%D {dostartrunprogram, dostoprunprogram, -%D dostartgotoprofile, dostopgotoprofile, -%D dobeginofprofile, -%D doendofprofile} -%D -%D These specials are still experimental. They are not yet -%D supported by the programs the way they should be. -%D -%D {\em --- still undocumented ---} - -\let \dostartrunprogram \gobblefourarguments -\let \dostoprunprogram \donothing -\let \dostartgotoprofile \gobblethreearguments -\let \dostopgotoprofile \donothing -\let \dobeginofprofile \gobblefourarguments -\let \doendofprofile \donothing - -%D \macros -%D {doinsertbookmark} -%D -%D Bookmarks, that is viewer generated tables of contents, are -%D a strange phenomena, mainly because \TEX\ can provide -%D whatever kind of table in much better quality. - -\let \doinsertbookmark \gobblefourarguments - -%D This special is called as: -%D -%D \starttyping -%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open} -%D \stoptyping -%D -%D This definition is very \PDF\ oriented, so for more -%D information we kindly refer to the \PDF\ manuals. - -%D \macros -%D {dosetpagetransition} -%D -%D In presentations, fancy page transitions can, at least for a -%D short moment, let the audience focus at the screen. Like the -%D previous one, this special is very \PDF. -%D -%D \starttyping -%D \dosetpagetransition{dissolve}{0} -%D \stoptyping -%D -%D Transitions have symbolic names, like dissolve, box, split, -%D blinds, wipe and glitter. The second argument determines -%D the wait time (unless zero). - -\let \dosetpagetransition \gobbletwoarguments - -%D \macros -%D {dopresettextfield,dopresetlinefield, -%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield, -%D dopresetbuttonfield,dopresetcheckfield, -%D dopresetradiofield,dopresetradiorecord} -%D -%D The special drivers are programmed independant from their -%D calling macros are thereby use the standard \TEX\ way of -%D passing parameters. Unfortunately fields often have more -%D than nine characteristics, so we pack some arguments in one. -%D -%D \starttyping -%D \dopresettextfield / \dopresetlinefield -%D {name} {width} {height} {default} {length} -%D {style,color} {options} {alignment} {actions} -%D -%D \dopresetchoicefield / \dopresetpopupfield / \dopresetcombofield -%D {name} {width} {height} {default} -%D {style,color} {options} {values} {actions} -%D -%D \dopresetpushfield -%D {name} {width} {height} {default} -%D {options} {values} {actions} -%D -%D \dopresetcheckfield -%D {name} {width} {height} {default} -%D {options} {values} {actions} -%D -%D \dopresetradiofield -%D {name} {width} {height} {default} -%D {options} {parent} {values} {actions} -%D -%D \dopresetradiorecord -%D {name} {top} {options} {kids} {actions} -%D \stoptyping - -\let \dopresetlinefield \gobbleninearguments -\let \dopresettextfield \gobbleninearguments -\let \dopresetchoicefield \gobbleeightarguments -\let \dopresetpopupfield \gobbleeightarguments -\let \dopresetcombofield \gobbleeightarguments -\let \dopresetpushfield \gobblesevenarguments -\let \dopresetcheckfield \gobblesevenarguments -\let \dopresetradiofield \gobbleeightarguments -\let \dopresetradiorecord \gobblefourarguments - -%D \macros -%D {dodefinefieldset,dogetfieldset,doiffieldset} -%D -%D Field sets, used in resetting and submitting, are handled -%D by: - -\let \dodefinefieldset \gobbletwoarguments -\let \dogetfieldset \gobbleoneargument -\let \doiffieldset \gobbletwoarguments - -%D \macros -%D {dosetfieldstatus} -%D -%D For practical reasons we set some field characteristics -%D using: -%D -%D \starttyping -%D \dosetfieldstatus {mode} {parent} {kids} {root} -%D \stoptyping - -\let \dosetfieldstatus \gobblefourarguments - -%D with: - -\def\fieldlonermode {0} % no \chardef here -\def\fieldparentmode{1} % no \chardef here -\def\fieldchildmode {2} % no \chardef here -\def\fieldcopymode {3} % no \chardef here - -%D \macros -%D {doregistercalculationset} -%D -%D We can define a calculation order list with: -%D -%D \starttyping -%D \doregistercalculationset {set identifier} -%D \stoptyping - -\let \doregistercalculationset \gobbleoneargument - -%D \macros -%D {doinsertcomment, doflushcomments} -%D -%D Not so much out of need, but to be complete, we also -%D implement text annotations, so called comment: -%D -%D \starttyping -%D \doinsertcomment -%D {title} {width} {height} {color} {open} {symbol} {collect} {data} -%D \stoptyping -%D -%D When enables, comments can be collected and flushed: -%D -%D \starttyping -%D \doflushcomments -%D \stoptyping - -\let \doinsertcomment \gobbleeightarguments -\let \doflushcomments \donothing - -%D \macros -%D {dostarttransparency,dostoptransparency} -%D -%D \starttyping -%D \dostarttransparency{fraction}{type} -%D \dostoptransparency -%D \stoptyping -%D -%D Although in \CONTEXT\ transparency is closely integrated -%D in the color drivers, in the end it is an independent -%D feature. - -\let \dostarttransparency \gobbletwoarguments -\let \dostoptransparency \donothing - -%D \macros -%D {doattachfile} -%D -%D \starttyping -%D \doattachfile{title}{width}{height}{depth}{color}{symbol}{filename}{source} -%D \stoptyping - -\let \doattachfile \gobbleeightarguments - -%D Experimental (properties): - -\let \dostartviewerlayer \gobbleoneargument -\let \dostopviewerlayer \donothing -\let \dodefineviewerlayer \gobblefivearguments -\let \domakeviewerlayerlist \gobbleoneargument - -\let \doinsertrenderingwindow \gobblefourarguments -\let \doinsertrendering \gobblefourarguments -\let \doinsertrenderingobject \gobblefourarguments -\let \doinsertrenderingobject \gobblefourarguments - -\let \dostartfonteffect \gobblethreearguments -\let \dostopfonteffect \donothing - %D From now on, mapfile loading is also a special; we assume the %D more or less standard dvips syntax. @@ -837,24 +166,6 @@ \newif\ifusepagedestinations %D \macros -%D {ifhighlighthyperlinks} -%D -%D The next switch can be used to make user hyperlinks are -%D not highlighted when clicked on. - -\newif\ifhighlighthyperlinks - -%D \macros -%D {ifgotonewwindow} -%D -%D To make the {\em goto previous jump} feature more -%D convenient when using more than one file, it makes sense -%D to force the viewer to open a new window for each file -%D opened. - -\newif\ifgotonewwindow - -%D \macros %D {jobsuffix} %D %D By default, \TEX\ produces \DVI\ files which can be @@ -862,8 +173,6 @@ %D know what the target file will be. In other driver %D modules we wil set \type {\jobsuffix} to \type {pdf}. -% this will become a mode - \def\jobsuffix{pdf} \ifdefined\resetsystemmode \else @@ -876,21 +185,6 @@ \edef\jobsuffix{#1}% \setsystemmode\jobsuffix} -%D \macros -%D {everyresetspecials} -%D -%D Now what will this one do? We'll see in a few lines. - -\newtoks\everyresetspecials - -\appendtoksonce - \ifdefined\setjobsuffix\setjobsuffix{pdf}\fi -\to \everyresetspecials - -\def\defineoutput{\dodoubleargument\dodefineoutput} - -\def\usespecials [#1]{} -\def\dodefineoutput[#1][#2]{} -\def\setupoutput [#1]{} +\def\setupoutput[#1]{} % will be command line switch \protect \endinput diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua index 7f04ced5f..b2e103d36 100644 --- a/tex/context/base/back-pdf.lua +++ b/tex/context/base/back-pdf.lua @@ -14,63 +14,30 @@ than one argument to <l n='tex'/>.</p> --ldx]]-- local type, next, tostring = type, next, tostring -local char, byte, format, gsub = string.char, string.byte, string.format, string.gsub +local char, byte, format, gsub, rep, gmatch = string.char, string.byte, string.format, string.gsub, string.rep, string.gmatch local concat = table.concat +local round = math.round local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local texsprint, texwrite = tex.sprint, tex.write ctxcatcodes = tex.ctxcatcodes -pdf = pdf or { } -- global +local copy_node = node.copy -backends.pdf = pdf -- registered - -function pdf.cleandestination(str) - texsprint((gsub(str,"[%/%#%<%>%[%]%(%)%-%s]+","-"))) -end - -function pdf.cleandestination(str) - texsprint((gsub(str,"[%/%#%<%>%[%]%(%)%-%s]+","-"))) -end - -function pdf.sanitizedstring(str) - texsprint((gsub(str,"([\\/#<>%[%]%(%)])","\\%1"))) -end - -function pdf.hexify(str) - texwrite("feff") - for b in utfvalues(str) do - if b < 0x10000 then - texwrite(format("%04x",b)) - else - texwrite(format("%04x%04x",b/1024+0xD800,b%1024+0xDC00)) - end - end -end - -function pdf.utf8to16(s,offset) -- derived from j. sauter's post on the list - offset = (offset and 0x110000) or 0 -- so, only an offset when true - texwrite(char(offset+254,offset+255)) - for c in utfvalues(s) do - if c < 0x10000 then - texwrite(char(offset+c/256,offset+c%256)) - else - c = c - 0x10000 - local c1, c2 = c / 1024 + 0xD800, c % 1024 + 0xDC00 - texwrite(char(offset+c1/256,offset+c1%256,offset+c2/256,offset+c2%256)) - end - end -end - -pdf.nodeinjections = pdf.nodeinjections or { } -- we hash elsewhere -pdf.codeinjections = pdf.codeinjections or { } -- we hash elsewhere -pdf.registrations = pdf.registrations or { } -- we hash elsewhere +local nodeinjections = backends.pdf.nodeinjections +local codeinjections = backends.pdf.codeinjections +local registrations = backends.pdf.registrations local pdfliteral, register = nodes.pdfliteral, nodes.register -local nodeinjections = pdf.nodeinjections -local codeinjections = pdf.codeinjections -local registrations = pdf.registrations +local pdfconstant = lpdf.constant +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfreference = lpdf.reference +local pdfverbose = lpdf.verbose + +local pdfreserveobj = pdf.reserveobj +local pdfimmediateobj = pdf.immediateobj function nodeinjections.rgbcolor(r,g,b) return register(pdfliteral(format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b))) @@ -80,7 +47,7 @@ function nodeinjections.cmykcolor(c,m,y,k) return register(pdfliteral(format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k))) end -function nodeinjections.graycolor(s) +function nodeinjections.graycolor(s) -- caching 0/1 does not pay off return register(pdfliteral(format("%s g %s G",s,s))) end @@ -95,21 +62,15 @@ function nodeinjections.transparency(n) return register(pdfliteral(format("/Tr%s gs",n))) end -function nodeinjections.overprint() - return register(pdfliteral("/GSoverprint gs")) -end - -function nodeinjections.knockout() - return register(pdfliteral("/GSknockout gs")) -end - -function nodeinjections.positive() - return register(pdfliteral("/GSpositive gs")) -end +local positive = register(pdfliteral("/GSpositive gs")) +local negative = register(pdfliteral("/GSnegative gs")) +local overprint = register(pdfliteral("/GSoverprint gs")) +local knockout = register(pdfliteral("/GSknockout gs")) -function nodeinjections.negative() - return register(pdfliteral("/GSnegative gs")) -end +function nodeinjections.positive () return copy_node(positive) end +function nodeinjections.negative () return copy_node(negative) end +function nodeinjections.overprint() return copy_node(overprint) end +function nodeinjections.knockout () return copy_node(knockout) end local effects = { normal = 0, @@ -126,60 +87,379 @@ function nodeinjections.effect(stretch,rulethickness,effect) return register(pdfliteral(format("%s Tc %s w %s Tr",stretch,rulethickness,effect))) -- watch order end +-- cached .. + +local cache = { } + function nodeinjections.startlayer(name) - return register(pdfliteral(format("/OC /%s BDC",name))) + local c = cache[name] + if not c then + c = register(pdfliteral(format("/OC /%s BDC",name))) + cache[name] = c + end + return copy_node(c) end +local stop = register(pdfliteral("EMC")) + function nodeinjections.stoplayer() - return register(pdfliteral("EMC")) + return copy_node(stop) end +local cache = { } + function nodeinjections.switchlayer(name) - return register(pdfliteral(format("EMC /OC /%s BDC",name))) + local c = cache[name] + if not c then + c = register(pdfliteral(format("EMC /OC /%s BDC",name))) + end + return copy_node(c) end -- code -function codeinjections.insertmovie(spec) -- width, height, factor, repeat, controls, preview, label, foundname - local width, height, factor = spec.width, spec.height, spec.factor or number.dimenfactors.bp - local options, actions = "", "" - if spec["repeat"] then - actions = actions .. "/Mode /Repeat " +function codeinjections.insertmovie(specification) + -- managed in figure inclusion: width, height, factor, repeat, controls, preview, label, foundname + local width = specification.width + local height = specification.height + local factor = specification.factor or number.dimenfactors.bp + local moviedict = pdfdictionary { + F = specification.foundname, + Aspect = pdfarray { factor * width, factor * height }, + Poster = (specification.preview and true) or false, + } + local controldict = pdfdictionary { + ShowControls = (specification.controls and true) or false, + Mode = (specification["repeat"] and pdfconstant("Repeat")) or nil, + } + local action = pdfdictionary { + Subtype = pdfconstant("Movie"), + Border = pdfarray { 0, 0, 0 }, + T = format("movie %s",specification.label), + Movie = moviedict, + A = controldict, + } + node.write(nodes.pdfannot(width,height,0,action())) +end + +function codeinjections.insertsound(specification) + -- rmanaged in interaction: repeat, label, foundname + local soundclip = interactions.soundclip(specification.label) + if soundclip then + local controldict = pdfdictionary { + Mode = (specification["repeat"] and pdfconstant("Repeat")) or nil + } + local sounddict = pdfdictionary { + F = soundclip.filename + } + local action = pdfdictionary { + Subtype = pdfconstant("Movie"), + Border = pdfarray { 0, 0, 0 }, + T = format("sound %s",specification.label), + Movie = sounddict, + A = controldict, + } + node.write(nodes.pdfannot(0,0,0,action())) end - if spec.controls then - actions = actions .. "/ShowControls true " +end + +-- spot- and indexcolors + +local pdf_separation = pdfconstant("Separation") +local pdf_indexed = pdfconstant("Indexed") +local pdf_device_n = pdfconstant("DeviceN") +local pdf_device_rgb = pdfconstant("DeviceRGB") +local pdf_device_cmyk = pdfconstant("DeviceCMYK") +local pdf_device_gray = pdfconstant("Devicegray") +local pdf_extgstate = pdfconstant("ExtGState") + +local pdf_rbg_range = pdfarray { 0, 1, 0, 1, 0, 1 } +local pdf_cmyk_range = pdfarray { 0, 1, 0, 1, 0, 1, 0, 1 } +local pdf_gray_range = pdfarray { 0, 1 } + +local rgb_function = "dup %s mul exch dup %s mul exch %s mul" +local cmyk_function = "dup %s mul exch dup %s mul exch dup %s mul exch %s mul" +local gray_function = "%s mul" + +local documentcolorspaces = pdfdictionary() + +local spotcolorhash = { } -- not needed +local spotcolornames = { } +local indexcolorhash = { } +local delayedindexcolors = { } + +function registrations.spotcolorname(name,e) + spotcolornames[name] = e or name +end + +local function registersomespotcolor(name,noffractions,names,p,colorspace,range,funct) + noffractions = tonumber(noffractions) or 1 -- to be checked + if noffractions == 0 then + -- can't happen + elseif noffractions == 1 then + local dictionary = pdfdictionary { + FunctionType = 4, + Domain = { 0, 1 }, + Range = range, + } + local n = pdfimmediateobj("stream",format("{ %s }",funct),dictionary()) + local array = pdfarray { + pdf_separation, + pdfconstant(spotcolornames[name] or name), + colorspace, + pdfreference(n), + } + local m = pdfimmediateobj(tostring(array)) + local mr = pdfreference(m) + spotcolorhash[name] = m + documentcolorspaces[name] = mr + lpdf.adddocumentcolorspace(name,mr) else - actions = actions .. "/ShowControls false " - end - if spec.preview then - options = options .. "/Poster true " - end - if actions ~= "" then - actions= "/A <<" .. actions .. ">>" - end - return format( -- todo: doPDFannotation - "\\insertpdfannotation{%ssp}{%ssp}{/Subtype /Movie /Border [0 0 0] /T (movie %s) /Movie << /F (%s) /Aspect [%s %s] %s>> %s}", - width, height, spec.label, spec.foundname, factor * width, factor * height, options, actions - ) -end - -local s_template_g = "\\dodoPDFregistergrayspotcolor{%s}{%s}{%s}{%s}{%s}" -- n f d p s (p can go away) -local s_template_r = "\\dodoPDFregisterrgbspotcolor {%s}{%s}{%s}{%s}{%s}{%s}{%s}" -- n f d p r g b -local s_template_c = "\\dodoPDFregistercmykspotcolor{%s}{%s}{%s}{%s}{%s}{%s}{%s}{%s}" -- n f d p c m y k -local m_template_g = "\\doPDFregistergrayindexcolor{%s}{%s}{%s}{%s}{%s}" -- n f d p s (p can go away) -local m_template_r = "\\doPDFregisterrgbindexcolor {%s}{%s}{%s}{%s}{%s}{%s}{%s}" -- n f d p r g b -local m_template_c = "\\doPDFregistercmykindexcolor{%s}{%s}{%s}{%s}{%s}{%s}{%s}{%s}" -- n f d p c m y k -local s_template_e = "\\doPDFregisterspotcolorname{%s}{%s}" -- name, e -- todo in new backend: gsub(e," ","#20") -local t_template = "\\presetPDFtransparencybynumber{%s}{%s}{%s}" -- n, a, t - -function registrations.grayspotcolor (n,f,d,p,s) states.collect(format(s_template_g,n,f,d,p,s)) end -function registrations.rgbspotcolor (n,f,d,p,r,g,b) states.collect(format(s_template_r,n,f,d,p,r,g,b)) end -function registrations.cmykspotcolor (n,f,d,p,c,m,y,k) states.collect(format(s_template_c,n,f,d,p,c,m,y,k)) end -function registrations.grayindexcolor(n,f,d,p,s) states.collect(format(m_template_g,n,f,d,p,s)) end -function registrations.rgbindexcolor (n,f,d,p,r,g,b) states.collect(format(m_template_r,n,f,d,p,r,g,b)) end -function registrations.cmykindexcolor(n,f,d,p,c,m,y,k) states.collect(format(m_template_c,n,f,d,p,c,m,y,k)) end -function registrations.spotcolorname (name,e) states.collect(format(s_template_e,name,e)) end -- texsprint(ctxcatcodes,format(s_template_e,name,e)) -function registrations.transparency (n,a,t) states.collect(format(t_template ,n,a,t)) end -- too many, but experimental anyway + local cnames = pdfarray() + local domain = pdfarray() + for n in gmatch(names,"[^,]+") do + cnames[#cnames+1] = pdfconstant(spotcolornames[n] or n) + domain[#domain+1] = 0 + domain[#domain+1] = 1 + end + local dictionary = pdfdictionary { + FunctionType = 4, + Domain = domain, + Range = range, + } + local n = pdfimmediateobj("stream",format("{ %s %s }",rep("pop ",noffractions),funct),dictionary()) + local array = pdfarray { + pdf_device_n, + cnames, + colorspace, + pdfreference(n), + } + local m = pdfimmediateobj(tostring(array)) + local mr = pdfreference(m) + spotcolorhash[name] = m + documentcolorspaces[name] = mr + lpdf.adddocumentcolorspace(name,mr) + end +end + +function registersomeindexcolor(name,noffractions,names,p,colorspace,range,funct) + noffractions = tonumber(noffractions) or 1 -- to be checked + local cnames = pdfarray() + local domain = pdfarray() + if names == "" then + names = name .. ",None" + else + names = names .. ",None" + end + for n in gmatch(names,"[^,]+") do + cnames[#cnames+1] = pdfconstant(spotcolornames[n] or n) + domain[#domain+1] = 0 + domain[#domain+1] = 1 + end + local dictionary = pdfdictionary { + FunctionType = 4, + Domain = domain, + Range = range, + } + local n = pdfimmediateobj("stream",format("{ %s %s }",rep("exch pop ",noffractions),funct),dictionary()) -- exch pop + local a = pdfarray { + pdf_device_n, + cnames, + colorspace, + pdfreference(n), + } + if p == "" then + p = "1" + else + p = p .. ",1" + end + local pi = { } + for pp in gmatch(p,"[^,]+") do + pi[#pi+1] = tonumber(pp) + end + local vector, set, n = { }, { }, #pi + for i=255,0,-1 do + for j=1,n do + set[j] = format("%02X",round(pi[j]*i)) + end + vector[#vector+1] = concat(set) + end + vector = pdfverbose { "<", concat(vector, " "), ">" } + local n = pdfimmediateobj(tostring(pdfarray{ pdf_indexed, a, 255, vector })) + lpdf.adddocumentcolorspace(format("%s_indexed",name),pdfreference(n)) + return n +end + +-- actually, names (parent) is the hash + +local function delayindexcolor(name,names,func) + local hash = (names ~= "" and names) or name + -- logs.report("index colors","delaying '%s'",name) + delayedindexcolors[hash] = func +end + +local function indexcolorref(name) -- actually, names (parent) is the hash + if not indexcolorhash[name] then + -- logs.report("index colors","registering '%s'",name) + local delayedindexcolor = delayedindexcolors[name] + if type(delayedindexcolor) == "function" then + indexcolorhash[name] = delayedindexcolor() + delayedindexcolors[name] = true + end + end + return indexcolorhash[name] +end + +function registrations.rgbspotcolor(name,noffractions,names,p,r,g,b) + if noffractions == 1 then + registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format(rgb_function,r,g,b)) + else + registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format("%s %s %s",r,g,b)) + end + delayindexcolor(name,names,function() + return registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b)) + end) +end + +function registrations.cmykspotcolor(name,noffractions,names,p,c,m,y,k) + if noffractions == 1 then + registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k)) + else + registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format("%s %s %s %s",c,m,y,k)) + end + delayindexcolor(name,names,function() + return registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k)) + end) +end + +function registrations.grayspotcolor(name,noffractions,names,p,s) + if noffractions == 1 then + registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s)) + else + registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,s) + end + delayindexcolor(name,names,function() + return registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s)) + end) +end + +function registrations.rgbindexcolor(name,noffractions,names,p,r,g,b) + registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b)) +end + +function registrations.cmykindexcolor(name,noffractions,names,p,c,m,y,k) + registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k)) +end + +function registrations.grayindexcolor(name,noffractions,names,p,s) + registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,gray_function) +end + +function codeinjections.setfigurecolorspace(data,figure) + local color = data.request.color + if color then + local ref = indexcolorref(color) + if ref then + figure.colorspace = ref + data.used.color = color + end + end +end + +-- transparency + +local transparencies = { [0] = + pdfconstant("Normal"), + pdfconstant("Normal"), + pdfconstant("Multiply"), + pdfconstant("Screen"), + pdfconstant("Overlay"), + pdfconstant("SoftLight"), + pdfconstant("HardLight"), + pdfconstant("ColorDodge"), + pdfconstant("ColorBurn"), + pdfconstant("Darken"), + pdfconstant("Lighten"), + pdfconstant("Difference"), + pdfconstant("Exclusion"), + pdfconstant("Compatible"), +} + +local documenttransparencies = { } +local transparencyhash = { } -- not needed + +local done = false + +function registrations.transparency(n,a,t) + if not done then + local d = pdfdictionary { + Type = pdf_extgstate, + ca = 1, + CA = 1, + BM = transparencies[1], + AIS = false, + } + local m = pdfimmediateobj(tostring(d)) + local mr = pdfreference(m) + transparencyhash[0] = m + documenttransparencies[0] = mr + lpdf.adddocumentextgstate("Tr0",mr) + done = true + end + if n > 0 then + local d = pdfdictionary { + Type = pdf_extgstate, + ca = tonumber(t), + CA = tonumber(t), + BM = transparencies[a] or transparencies[0], + AIS = false, + } + local m = pdfimmediateobj(tostring(d)) + local mr = pdfreference(m) + transparencyhash[n] = m + documenttransparencies[n] = mr + lpdf.adddocumentextgstate(format("Tr%s",n),mr) + end +end + +function codeinjections.adddocumentinfo(key,value) + lpdf.addtoinfo(key,lpdf.tosixteen(value)) +end + +-- graphics + +function codeinjections.setfigurealternative(data,figure) + local display = data.request.display + if display and display ~= "" then + local request = data.request + figures.push { + name = request.display, + page = request.page, + size = request.size, + prefix = request.prefix, + cache = request.cache, + width = request.width, + height = request.height, + } + figures.identify() + local displayfigure = figures.check() + if displayfigure then + -- figure.aform = true + img.immediatewrite(figure) + local a = lpdf.array { + lpdf.dictionary { + Image = lpdf.reference(figure.objnum), + DefaultForPrinting = true, + } + } + local d = lpdf.dictionary { + Alternates = lpdf.reference(pdf.immediateobj(tostring(a))), + } + displayfigure.attr = d() + return displayfigure, figures.current() + end + end +end -- eventually we need to load this runtime -- @@ -187,4 +467,7 @@ function registrations.transparency (n,a,t) states.collect(format(t_t -- -- but now we need to force this as we also load the pdf tex part which hooks into all kind of places +codeinjections.finalizepage = lpdf.finalizepage +codeinjections.finalizedocument = lpdf.finalizedocument + backends.install("pdf") diff --git a/tex/context/base/back-pdf.mkiv b/tex/context/base/back-pdf.mkiv index fcfc53091..aaba4554f 100644 --- a/tex/context/base/back-pdf.mkiv +++ b/tex/context/base/back-pdf.mkiv @@ -13,320 +13,14 @@ \writestatus{loading}{ConTeXt Backend Macros / PDF} -\registerctxluafile{back-pdf}{1.001} +\registerctxluafile{back-pdf}{1.001} % this will change \unprotect -%D When dealing with resources, we share the resource dictionaries -%D between all xforms. This is inefficent in the sense that when no -%D resources are used, redundant entries take space, but on the other -%D hand we save redundant dictionaries so it's a nice compromise. Maybe -%D that in \LUATEX\ I will reimplement most of the code here anyway. - -%D Initialization of fields is tricky. If a field has no -%D value, it is kind of not there. If ResetForm is used, the -%D default is assigned, but pushbuttons are spoiled. Adding a -%D \type {/MK} dictionary helps, but gives ugly down -%D appearances (displaced with background). What a mess. -%D Also, in order to get at least something, the \type {/AS} -%D key should be provided. - -%D A couple of variables: - -\newtoks \everybackendshipout -\newtoks \everylastbackendshipout - -\let\lastPDFaction\empty - -\ifdefined\everyPDFximage \else \newtoks\everyPDFximage \fi -\ifdefined\everyPDFxform \else \newtoks\everyPDFxform \fi -\ifdefined\everygoto \else \newtoks\everygoto \fi -\ifdefined\everysetfield \else \newtoks\everysetfield \fi - -%D A few helpers: - -\let\PDFcode \pdfliteral -\def\PDFcontentcode{\pdfliteral} -\def\PDFdirectcode {\pdfliteral direct} - -%D \macros -%D {PDFobjref} +%D We will minimize the number of calls to \PDF\ specific primitives +%D and delegate all management and injection of code to the backend. %D -%D Just a shortcut. - -% Watch out, \def\PDFobjref#1{\purenumber#1 0 R} also works, but not when -% #1 == \the\whatever - -\def\PDFobjref#1{\purenumber{#1} 0 R} - -%D \macros -%D {PDFswapdir} - -\let\PDFswapdir\empty \def\PDFswapdir{\ifcase\inlinedirection\or\or-\fi} - -% the pdf spec changed cq. viewers started behaving differently / 5+ - -\chardef\overcomePDFpage\plusone % page numbers/ beware: optimizers remove this one -\chardef\overcomePDFpage\plustwo % page:number -\chardef\overcomePDFpage\plusthree % pdftex page ref feature - -%D \macros -%D {setPDFdestination} -%D -%D \PDF\ destinations should obey the specifications laid down -%D in the \PDF\ reference manual. The next macro strips illegal -%D characters from the destination name. - -\def\setPDFdestination #1{\xdef\PDFdestination{\ctxlua{pdf.cleandestination("\luaescapestring{#1}")}}} -\def\hexifiedPDFstring #1{\ctxlua{pdf.hexify("\luaescapestring{#1}")}} -\def\sanitizePDFencoding#1\to#2{\xdef#2{\ctxlua{pdf.hexify("\luaescapestring{#1}")}}} - -%D - -\def\appendtopdfpageresources #1{\normalexpanded{\global\pdfpageresources{#1\the\pdfpageresources}}} -\def\appendtopdfpageattributes #1{\normalexpanded{\global\pdfpageattr {#1\the\pdfpageattr }}} -\def\appendtopdfpagesattributes#1{\normalexpanded{\global\pdfpagesattr {#1\the\pdfpagesattr }}} -\def\appendtopdfcatalog {\pdfcatalog} -\def\appendtopdfinfo {\pdfinfo} - -\def\resetpdfpageattributes{\global\pdfpageattr\emptytoks} -\def\resetpdfpageresources {\global\pdfpageresources\emptytoks} - -%D Due to the fact that \PDFTEX\ has a different concept of -%D page attributes, we need: - -\appendtoksonce - \resetpdfpageattributes - \resetpdfpageresources -\to \everyaftershipout - -%D \macros -%D {insertpdfaction, -%D insertpdfannotation, -%D insertpdfannotationobject, -%D createpdfdictionaryobject, -%D createpdfarrayobject, -%D defaultobjectreference, -%D doPDFgetobjectreference} -%D -%D This module deals with \PDF\ support, including fill||in -%D forms. Before we present the largely unreadable bunch of -%D macros, we introduce the here||not||defined low level -%D interface macros. These must be provided by the special -%D drivers \type{pdf} (\ACROBAT) and \type{tpd} (\PDFTEX). -%D -%D \starttyping -%D \insertpdfaction #1#2#3 width height action -%D \insertpdfannotation #1#2#3 width height data -%D \createpdfannotationobject #1#2#3#4#5 class name width height data -%D \createpdfdictionaryobject #1#2#3 class name data -%D \createpdfarrayobject #1#2#3 class name data -%D -%D \defaultobjectreference #1#2 class name -%D \doPDFgetobjectreference #1#2#3 class name \PDFobjectreference -%D \doPDFgetobjectpagereference #1#2#3 class name \PDFobjectreference -%D \stoptyping -%D -%D The keywords reflect their use. For the moment we stick to -%D keywords, because that way at we get an indication of what -%D we're doing. - -\def\createpdfdictionaryobject#1#2#3% - {\flushatshipout - {\immediate\pdfobj{<< #3 >>}% - \dosetobjectreference{#1}{#2}{\the\pdflastobj}}} - -\def\createpdfarrayobject#1#2#3% - {\flushatshipout - {\immediate\pdfobj{[ #3 ]}% - \dosetobjectreference{#1}{#2}{\the\pdflastobj}}} - -\def\createpdfannotationobject#1#2#3#4#5% - {\insertpdfannotation{#3}{#4}{#5}% - \dosetobjectreference{#1}{#2}{\the\pdflastannot}} - -\def\createpdfactionobject#1#2#3#4#5% - {\insertpdfaction{#3}{#4}{#5}% - \dosetobjectreference{#1}{#2}{\the\pdflastannot}} - -%D \macros -%D {insertpdfaction,insertpdfannotation,ifsharePDFactions} -%D -%D Next we handle annotations. All link annotations are -%D implemented using the action dictionary. This enables us to -%D use multiple actions. The second macro is for instance -%D used for movie inclusion. - -\newif\ifsharePDFactions \sharePDFactionstrue - -\def\insertpdfaction#1#2#3% - {\xdef\lastPDFcontent{#3}% - \ifcollectreferenceactions - \global\let\lastPDFaction\lastPDFcontent - \else - \ifsharePDFactions - \ifcase\similarreference\relax - \xdef\lastPDFaction{<<\lastPDFcontent>>}% - \or - \immediate\pdfobj{<<\lastPDFcontent>>}% - \xdef\lastPDFaction{\PDFobjref\pdflastobj}% - \else - % leave \lastPDFaction untouched - \fi - \else - \xdef\lastPDFaction{<<\lastPDFcontent>>}% - \fi - \pdfannot - width #1 height #2 depth \zeropoint - {/Subtype /Link - /Border [0 0 0] - \ifhighlighthyperlinks \else /H /N \fi - /A \lastPDFaction}% - \fi} - -\def\insertpdfannotation#1#2#3% - {\pdfannot width #1 height #2 depth \zeropoint{#3}} - -%D \macros -%D {doPDFbookmark} -%D -%D Well, isn't the next one ugly? Thanks to the \PDF\ -%D standard. - -\def\doPDFbookmark#1#2#3#4#5% to be renamed - {\doPDFgetpagereference{#4}\PDFobjectreference - \pdfoutline - user {<</S /GoTo /D [\PDFobjectreference\space\PDFpageviewwrd]>>}% - \ifcase#2 \else count \ifcase#5-\fi#2 \fi - {#3}} - -%D For special (\METAPOST) effects, we need to build -%D resource dictionaries. Here is the framework. - -\let\docuPDFextgstates \empty -\let\docuPDFcolorspaces\empty -\let\docuPDFshades \empty - -\def\checkPDFextgstates - {\ifx\docuPDFextgstates\empty \else - \ifnum\realpageno=\lastpage\relax - \createpdfdictionaryobject{FDF}{docuextgstates}{\docuPDFextgstates}% - \fi - \doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference - \appendtopdfpageresources{/ExtGState \PDFobjectreference}% - \fi} - -\def\checkPDFcolorspaces - {\ifx\docuPDFcolorspaces\empty \else - \ifnum\realpageno=\lastpage\relax - \createpdfdictionaryobject{FDF}{colorspaces}{\docuPDFcolorspaces}% - \fi - \doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference - \appendtopdfpageresources{/ColorSpace \PDFobjectreference}% - \fi} - -\def\checkPDFshades - {\ifx\docuPDFshades\empty \else - \ifnum\realpageno=\lastpage\relax - \createpdfdictionaryobject{FDF}{docushades}{\docuPDFshades}% - \fi - \doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference - \appendtopdfpageresources{/Shading \PDFobjectreference}% - \fi} - -\def\appendtoPDFdocumentextgstates #1{\xdef\docuPDFextgstates {\docuPDFextgstates \space#1}} -\def\appendtoPDFdocumentcolorspaces#1{\xdef\docuPDFcolorspaces{\docuPDFcolorspaces\space#1}} -\def\appendtoPDFdocumentshades #1{\xdef\docuPDFshades {\docuPDFshades \space#1}} - -%D Page actions: - -\let\lastpdfopenaction \empty -\let\lastpdfcloseaction\empty - -\def\dosetupopenaction {\appendtopdfcatalog{/OpenAction <<\lastPDFaction>>}} -\def\dosetupcloseaction{\appendtopdfcatalog{/CloseAction <<\lastPDFaction>>}} - -\def\dosetupopenpageaction {\glet\lastpdfopenaction \lastPDFaction} -\def\dosetupclosepageaction{\glet\lastpdfcloseaction\lastPDFaction} - -\def\checkPDFpageactions - {\iflocation % important since direct - \donefalse - \ifx\lastpdfopenaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi - \ifx\lastpdfcloseaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi - \ifdone - \appendtopdfpageattributes - {/AA <<\if!!donea/O <<\lastpdfopenaction >> \fi - \if!!doneb/C <<\lastpdfcloseaction>> \fi>>}% - \fi - \glet\lastpdfopenaction \empty - \glet\lastpdfcloseaction\empty - \fi} - -%D \macros -%D {ifPDFstrokecolor} -%D -%D We can reduce the filesize a bit by setting the next switch -%D to false. The amount of reduction depends on the use of -%D color, but don't expect more than a few percent. Zip -%D compression is already rather efficient in itself. - -\newif\ifPDFstrokecolor \PDFstrokecolortrue - -%D When submitting forms, we need to communicate the format. - -\chardef\submitoutputformat=0 % 0=unknown 1=HTML 2=FDF 3=XML - -\def\setsubmitoutputformat#1% - {\doifinsetelse{#1}{FDF,fdf} - {\chardef\submitoutputformat\plustwo} - {\doifinsetelse{#1}{XML,xml} - {\chardef\submitoutputformat\plusthree} - {\chardef\submitoutputformat\plusone}}% - \relax} - -%D Handy to have this available asap: - -\ifdefined\everyPDFxform \newtoks\everyPDFxform \fi -\ifdefined\everyPDFximage \newtoks\everyPDFximage \fi - -% once we can be sure that the latest versions of pdftex are -% available we can use: -% -% \pdfobj reserveobjnum \edef\one{\the\pdflastobj} -% \pdfobj reserveobjnum \edef\two{\the\pdflastobj} -% -% \pdfobj useobjnum \one {x} -% \pdfobj useobjnum \two {x} -% -% we then can rewrite part of spec-fdf because the other drivers -% already support symbolic references - -%D \macros -%D {jobsuffix} -%D -%D Being one of the first typographical systems able to support -%D advances \PDF\ support, \TEX\ is also one of the first -%D systems to produce high quality \PDF\ code directly. Thanks -%D to Han The Thanh c.s. the \TEX\ community can leap forward -%D once again. -%D -%D One important characteristic of \PDFTEX\ is that is can -%D produce standard \DVI\ code as well as \PDF\ code. This -%D enables us to use one format file to support both output -%D formats. - -%D All modules in this group use specials to tell drivers what -%D non||\TEX\ actions to take. Because from the \TEX\ point of -%D view, there is no difference between \DVI\ and \PDF, we -%D therefore only have to bend the \DVI\ driver support into -%D \PDF\ support. Technically spoken, specials no longer serve -%D a purpose, except from ending up as comment in the \PDF\ -%D file. -%D -%D Before we continue we need to make sure if indeed those -%D \PDFTEX\ primitives are permitted. If no primitives are -%D available, we just stop reading any further. +%D Here we initialize some internal quantities. \pdfoutput = 1 \pdfhorigin = 1 true in @@ -338,2889 +32,141 @@ \pdfminorversion = 5 %pdfuniqueresname = 1 -\def\PDFversion{1.\number\pdfminorversion} - -%D For some internal testing we need to know the output -%D suffix. +%D This one can be consulted by users although the suffix is also +%D a system mode. \setjobsuffix{pdf} -%D \macros -%D {dosetuppaper} -%D -%D If we don't set the paper size, \PDFTEX\ will certainly do -%D it in a way we don't want, therefore we need: - -\def\dosetuppaper#1#2#3% - {\global\pdfpagewidth #2\relax - \global\pdfpageheight#3\relax} - -%D \macros -%D {doloadmapfile,doloadmapline,doresetmapfilelist} - -\def\doresetmapfilelist - {\global\let\doresetmapfilelist\relax - \pdfmapfile{original-empty.map}} - -\def\doloadmapfile #1#2{\pdfmapfile{#1#2}} -\def\doloadmapline #1#2{\pdfmapline{#1#2}} - -%D nasty but needed - -\appendtoksonce \loadallfontmapfiles \to \everyPDFximage -\appendtoksonce \loadallfontmapfiles \to \everyPDFxform - -%D left overs: - - \let\currentmovie\s!unknown - - \def\doPDFinsertmov - {\bgroup - \xdef\currentmovie{\@@DriverImageLabel}% - \PointsToBigPoints\@@DriverImageWidth \width - \PointsToBigPoints\@@DriverImageHeight\height - \let\pdf@@options\empty - \let\pdf@@actions\empty - \donefalse - \expanded{\processallactionsinset[\@@DriverImageOptions]} - [\v!controls=>\donetrue, - \v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat }, - \v!preview=>\edef\pdf@@options{\pdf@@options /Poster true }]% - \edef\pdf@@actions{\pdf@@actions /ShowControls \ifdone true\else false\fi}% - \insertpdfannotation\@@DriverImageWidth\@@DriverImageHeight - {/Subtype /Movie - /Border [0 0 0] - /T (movie \currentmovie) - /Movie << /F (\@@DriverImageFile) /Aspect [\width\space\height] \pdf@@options >> - /A << \pdf@@actions >>}% - \egroup} - -%D \macros -%D {doinsertsoundtrack} -%D -%D We use numbers instead of labels to keep track of sounds. - -\let\currentsound\s!unknown - -\def\doinsertsoundtrack#1#2#3% - {\bgroup - \xdef\currentsound{#2}% - \let\pdf@@actions\empty - \@EA\processallactionsinset\@EA - [#3] - [\v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat }]% - \collectdriverresource - %\flushatshipout % since it can be buried in a chained box - {\insertpdfannotation{0pt}{0pt} - {/Subtype /Movie - /Border [0 0 0] - /T (sound \currentsound) - /Movie <</F (#1)>>% - \ifx\pdf@@actions\empty\else/A << \pdf@@actions >>\fi}}% - \egroup} - -%D \macros -%D {doPDFattachfile} - -\def\doPDFfilestreamobject#1#2#3#4% - {} - -\def\doPDFfilestreamidentifier#1% - {0} +%D For the moment we keep these. -\def\doPDFgetfilestreamreference#1#2% - {0 0 R} +\newtoks \pdfbackendeveryximage +\newtoks \pdfbackendeveryxform -\def\doattachfile#1#2#3#4#5#6#7#8% - {\bgroup % title width height color symbol file - \edefconvertedargument\PDFfile{#8}% - % beware: the symbol may (indirectly) use the file - % reference when typesetting the object number; - \presetPDFsymbolappearance{#5}{#6}{#2}{#3}{#4}% sets width/height - \startPDFsymbolappearance - \doPDFembedfile\PDFfile{#7}{#8}% - \doPDFgetembeddedfilereference\PDFfile\PDFobjectreference - \setFDFlayer\@@DriverAttachmentLayer - \insertpdfannotation{\width}{\totalheight} - {/Subtype /FileAttachment - /FS \PDFobjectreference\space - /Contents (#1) - \PDFsymbol - \FDFlayer - \PDFattributes}% - \stopPDFsymbolappearance - \egroup} - -% semi-public - -\def\doPDFembedfile#1#2#3% symbolic name | filename | user name - {\edefconvertedargument\PDFfile{#1}% - \doifnotflagged{a:\PDFfile}% - {\doPDFfilestreamobject{PDFEF}{\PDFfile}{#2}{#3}% - \doglobal\setflag{a:\PDFfile}}} - -\def\doPDFgetembeddedfilereference#1#2% - {\edefconvertedargument\PDFfile{#1}% - \doPDFgetobjectreference{PDFEF}\PDFfile#2} - -\def\doPDFgetembeddedfilestreamreference#1#2% - {\edefconvertedargument\PDFfile{#1}% - \doPDFgetfilestreamreference\PDFfile#2} % == \doPDFgetobjectreference{PDFFS}\PDFfile#2 - -% requested by Jens-Uwe Morawski: permits usage of pdftosrc -% in viewers that don't support attachments: -% -% \definesymbol -% [ObjectNumber] -% % [object number {\PDFattachmentnumber[xx]}] % named -% [object number \PDFattachmentnumber] % current -% -% \useattachment[test][xx][test.tex] -% \setupattachments[symbol=ObjectNumber] -% \attachment[test] - -\def\PDFattachmentnumber - {\dosingleargument\doPDFattachmentnumber} - -\def\doPDFattachmentnumber[#1]% - {\iffirstargument - \doPDFfilestreamidentifier{#1}% - \else - \doPDFfilestreamidentifier\PDFfile - \fi} - -%D \macros -%D {...} -%D -%D Rather preliminary. We have to wait till the complete specs -%D show up. As usual, we cannot really check it (Acrobat 6.0 -%D has a bug that inhibits us to make a test file). Half a day -%D of testing made clear that trying to control the plugin fails -%D in most cases (we need plugin specs -). We also miss a feature -%D to let acrobat wait with proceeding (action processing) till -%D the media clip is ready. - -% aiff audio/aiff -% au audio/basic -% avi video/avi -% mid audio/midi -% mov video/quicktime -% mp3 audio/x-mp3 (mpeg) -% mp4 audio/mp4 -% mp4 video/mp4 -% mpeg video/mpeg -% smil application/smil -% swf application/x-shockwave-flash - -% beware, this is preliminary code, should be improved - -\def\PDFrenderingspecs#1{\executeifdefined{PDFMR:#1}\empty} - -\def\PDFexecutestartrendering {/Rendition /OP 0 \PDFrenderingspecs\argumentA} -\def\PDFexecutestoprendering {/Rendition /OP 1 \PDFrenderingspecs\argumentA} -\def\PDFexecutepauserendering {/Rendition /OP 2 \PDFrenderingspecs\argumentA} -\def\PDFexecuteresumerendering {/Rendition /OP 3 \PDFrenderingspecs\argumentA} - -% todo : sub files -% -% \doPDFembedfile{pier-39.png}{pier-39.png}{pier-39.png}% -% \doPDFgetembeddedfilestreamreference{pier-39.png}\xPDFobjectreference -% \edef\xxxx{/RF [(pier-39.png) \xPDFobjectreference]}% - -% todo: alternative renderings -% -% object_1 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >> -% object_2 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >> -% rendering -> <</Type /Rendition /S /MS [objref_1 objref_2]>> +%D These are the only official methods to add stuff to the resources. -\def\doinsertrendering#1#2#3#4% tag mime file options - {\ifundefined{PDFMR:#1}% - \doifinstringelse{://}{#3}\donetrue\donefalse % evt url as keyword - \createpdfdictionaryobject{PDFMF}{#1} - {/Type /Rendition - /S /MR - % does not work: /SP << /Type /MediaScreenParam /BE << /B [1 0 0] /O 0.5 >> >> - /C << /Type /MediaClip - /S /MCD - /N (#1) - /Alt [() (file not found)] % language id + message - /D << /Type /Filespec - /F (#3) - \ifdone/FS /URL\fi >> - /CT (#2) >>}% - % common code - \doifobjectreferencefoundelse{PDFMS}{#1} - {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB} - {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}% - \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA - \setxvalue{PDFMR:#1}% needed /AA actions in /Screen - {/R \PDFobjectreferenceA - /AN \PDFobjectreferenceB}% - \doifobjectreferencefoundelse{PDFMS}{#1}\donothing - {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}% - \fi} +\def\pdfbackendsetcatalog #1#2{\ctxlua{lpdf.addtocatalog ("#1",\!!bs#2\!!es)}} \newtoks\pdfcatalog +\def\pdfbackendsetinfo #1#2{\ctxlua{lpdf.addtoinfo ("#1",\!!bs#2\!!es)}} \newtoks\pdfinfo +\def\pdfbackendsetname #1#2{\ctxlua{lpdf.addtonames ("#1",\!!bs#2\!!es)}} \newtoks\pdfnames -\def\doinsertrenderingobject#1#2#3#4% tag class objectname options - {\ifundefined{PDFMR:#1}% - \doPDFgetobjectreference{#2}{#3}\PDFobjectreference - \createpdfdictionaryobject{PDFMF}{#1} - {/Type /Rendition - /S /MR - /C << /Type /MediaClip - /S /MCD - /N (#1) - /D \PDFobjectreference>>}% - % common code - \doifobjectreferencefoundelse{PDFMS}{#1} - {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB} - {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}% - \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA - \setxvalue{PDFMR:#1}% needed /AA actions in /Screen - {/R \PDFobjectreferenceA - /AN \PDFobjectreferenceB}% - \doifobjectreferencefoundelse{PDFMS}{#1}\donothing - {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}% - \fi} +\def\pdfbackendsetpageattribute #1#2{\ctxlua{lpdf.addtopageattributes ("#1",\!!bs#2\!!es)}} \newtoks\pdfpageresources +\def\pdfbackendsetpagesattribute#1#2{\ctxlua{lpdf.addtopagesattributes("#1",\!!bs#2\!!es)}} \newtoks\pdfpageattr +\def\pdfbackendsetpageresource #1#2{\ctxlua{lpdf.addtopageresources ("#1",\!!bs#2\!!es)}} \newtoks\pdfpagesattr -\def\doinsertrenderingwindow - {\dodoinsertrenderingwindow{PDFMS}} +\def\pdfbackendsetextgstate #1#2{\ctxlua{lpdf.adddocumentextgstate ("#1",lpdf.verbose(\!!bs#2\!!es))}} +\def\pdfbackendsetcolorspace #1#2{\ctxlua{lpdf.adddocumentcolorspace("#1",lpdf.verbose(\!!bs#2\!!es))}} +\def\pdfbackendsetpattern #1#2{\ctxlua{lpdf.adddocumentpattern ("#1",lpdf.verbose(\!!bs#2\!!es))}} +\def\pdfbackendsetshade #1#2{\ctxlua{lpdf.adddocumentshade ("#1",lpdf.verbose(\!!bs#2\!!es))}} -\def\dodoinsertrenderingwindow#1#2#3#4#5% - {\vbox to #4 \bgroup - \checkPDFscreenactions{#2}{#5}% - \doPDFgetobjectpagereference{PDFMF}{#2}\PDFobjectreferenceA - \doPDFgetobjectreference {PDFMF}{#2}\PDFobjectreferenceB - \vss - \hbox to #3 \bgroup - \createpdfannotationobject{#1}{#2}{#3}{#4} - {/Subtype /Screen - /P \PDFobjectreferenceA - /A \PDFobjectreferenceB - \PDFattributes - /Border [0 0 0]}% - \hss - \egroup - \egroup} - -\global\let\PDFrenderingopenpageaction \empty -\global\let\PDFrenderingclosepageaction\empty - -\def\checkPDFscreenactions#1#2% - {\let\PDFattributes\empty - \iflocation % important since direct -) - % the action can either (already) be set by the window handler - % or (normally when no window [i.e a zero dimensions one] is present) by keyword - \doifinset\v!auto{#2} - {% brrr, here instead of in navigation module, must move and become special - % now two sided dependency - \let\checkrendering\gobbleoneargument - \ifx\PDFrenderingopenpageaction \empty - \handlereferenceactions{\v!StartRendering{#1}}\dosetuprenderingopenpageaction - \fi - \ifx\PDFrenderingclosepageaction\empty - \handlereferenceactions{\v!StopRendering {#1}}\dosetuprenderingclosepageaction - \fi - }% - \donefalse - \ifx\PDFrenderingopenpageaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi - \ifx\PDFrenderingclosepageaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi - \ifdone - \edef\PDFattributes - {/AA <<\if!!donea/PO <<\PDFrenderingopenpageaction >> \fi - \if!!doneb/PC <<\PDFrenderingclosepageaction>> \fi>>}% - \fi - \global\let\PDFrenderingopenpageaction \empty - \global\let\PDFrenderingclosepageaction\empty - \fi} +\def\pdfbackendcurrentresources {\ctxlua{lpdf.collectedresources()}} -\def\dosetuprenderingopenpageaction {\global\let\PDFrenderingopenpageaction \lastPDFaction} -\def\dosetuprenderingclosepageaction{\global\let\PDFrenderingclosepageaction\lastPDFaction} +%D An example of usage is: -%D For the moment we don't test for alternatives that -%D themselves have alternatives, especially cylcic -%D dependencies. +\appendtoks % will change ... + \pdfbackendsetinfo{ConTeXt.Version}{(\contextversion)}% + \pdfbackendsetinfo{ConTeXt.Time} {(\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute)}% + \pdfbackendsetinfo{ConTeXt.Jobname}{(\jobname)}% + \pdfbackendsetinfo{ConTeXt.Url} {(www.pragma-ade.com)}% +\to \everylastbackendshipout -% \def\pdfimmediateximage{\immediate\pdfximage} -% -% \def\checkpdfimageattributes -% {\ifx\PDFfigurereference\empty -% \global\let\pdfimageattributes\empty -% \else -% \immediate\pdfobj -% {[ << /Image \PDFobjref\PDFfigurereference -% /DefaultForPrinting true >> ]}% -% \xdef\pdfimageattributes -% {attr {/Alternates \PDFobjref\pdflastobj}}% -% \fi} -% -% \global\let\PDFimagecolorreference\empty -% -% \def\checkpdfimagecolorspecs -% {\ifx\pdflastximagecolordepth \undefined -% \global\let\pdfimagecolorspecs\empty -% \else\ifx\PDFimagecolorreference\empty -% \global\let\pdfimagecolorspecs\empty -% \else -% \xdef\pdfimagecolorspecs{colorspace \PDFimagecolorreference\space}% -% \fi\fi -% \global\let\PDFimagecolorreference\empty} +%D Unfortunately this is still needed (also for \METAPOST\ to +%D \PDF\ converter): -%D \macros -%D {doregisterfigure} -%D -%D Here is the fuzzy, very special dependant figure -%D registration special. We need to refer to the innermost -%D object (ximage). - - \def\doregisterfigure#1#2% - {\doifundefined{IM::#1::#2} - {\setxvalue{IM::#1::#2}{\the\pdflastximage}}% - \xdef\PDFfigurereference{\getvalue{IM::#1::#2}}} +\def\doresetmapfilelist + {\global\let\doresetmapfilelist\relax + \pdfmapfile{original-empty.map}} -%D \macros -%D {doovalbox} -%D -%D Drawing frames with round corners is inherited from the -%D main module. -%D -%D For drawing ovals we use quite raw \PDF\ code. The next -%D implementation does not differ that much from the one -%D implemented in the \POSTSCRIPT\ driver. +\def\doloadmapfile #1#2{\pdfmapfile{#1#2}} +\def\doloadmapline #1#2{\pdfmapline{#1#2}} -\def\doPDFovalcalc#1#2#3% - {\PointsToBigPoints{\dimexpr#1+#2\relax}#3} +\appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryxform +\appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryximage -\def\doovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox - {\forcecolorhack - \bgroup - \dimen0=#4\divide\dimen0 \plustwo - \doPDFovalcalc{0pt}{+\dimen0}\xmin - \doPDFovalcalc{#1}{-\dimen0}\xmax - \doPDFovalcalc{#2}{-\dimen0}\ymax - \doPDFovalcalc{-#3}{+\dimen0}\ymin - \advance\dimen0 by #5% - \doPDFovalcalc{0pt}{+\dimen0}\xxmin - \doPDFovalcalc{#1}{-\dimen0}\xxmax - \doPDFovalcalc{#2}{-\dimen0}\yymax - \doPDFovalcalc{-#3}{+\dimen0}\yymin - \doPDFovalcalc{#4}{\zeropoint}\stroke - \doPDFovalcalc{#5}{\zeropoint}\radius - \edef\dostroke{#6}% - \edef\dofill{#7}% - \edef\mode{\number#8 \space}% - % no \ifcase, else \relax in pdfcode - \setbox\scratchbox\hbox - {\ifnum\dostroke\dofill>\zerocount - \ifPDFstrokecolor\else\ifnum\dostroke=\plusone - \writestatus\m!colors{pdf stroke color will fail}\wait - \fi\fi - \PDFcode - {q - \stroke\space w - \ifcase\mode - \xxmin\space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or % 1 - \xxmin\space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or % 2 - \xxmin\space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or % 3 - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l - h - \or % 4 - \xmin \space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xmin \space \ymax \space l - \xmin \space \ymin\space l - h - \or % 5 - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xmin \space \ymax \space l - \xmin \space \ymin \space l - h - \or % 6 - \xmin \space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \ymin \space l - h - \or - \xxmin\space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l - h - \or % 9 top open - \xmin \space \ymax \space m - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \or % 10 right open - \xmax \space \ymax \space m - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - \xmax\space \ymin \space l - \or % 11 bottom open - \xmax \space \ymin \space m - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax \space \ymax\space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l - \or % 12 left open - \xmin \space \ymax \space m - \xxmax\space \ymax \space l - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space l - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \ymin \space l - \or % 13 - \xmin \space \ymax \space m - \xxmax\space \ymax \space l - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax\space \ymin \space l - \or % 14 - \xmax \space \ymax \space m - \xmax \space \yymin\space l - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \ymin \space l - \or % 15 - \xmax \space \ymin \space m - \xxmin\space \ymin \space l - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \ymax \space l - \or % 16 - \xmin \space \ymin \space m - \xmin \space \yymax\space l - \xmin \space \ymax \space \xxmin\space \ymax \space y - \xmax \space \ymax \space l - \or % 17 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \or % 18 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \or % 19 - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \or % 20 - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 21 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 22 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \or % 23 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \or % 24 - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 25 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 26 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 27 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \or % 28 - \fi - \ifnum\mode>8 - S - \else - \ifnum\dostroke=\plusone S \fi - \ifnum\dofill =\plusone f \fi - \fi - Q}% - \fi}% - \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox - \egroup} +%D Transformations. Some day we will use primitives (once they're fixed). -%D \macros -%D {dostartgraymode,dostopgraymode, -%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode, -%D dostopcolormode, -%D dostartrotation,dostoprotation, -%D dostartscaling,dostopscaling, -%D dostartmirroring,dostopmirroring, -%D dostartnegative,dostopnegative, -%D dostartoverprint,dostopoverprint} +\def\dostartgraphicgroup{\pdfliteral{q}} +\def\dostopgraphicgroup {\pdfliteral{Q}} \def\dostartrotation#1% grouped - {\setcalculatedcos\cos{#1}% - \setcalculatedsin\sin{#1}% - \forcecolorhack - \PDFcode{q \cos\space\sin\space\negated\sin\space\cos\space0 0 cm}} + {\forcecolorhack + \pdfliteral{q \ctxlua{lpdf.rotationcm(#1)}}} \def\dostoprotation - {\PDFcode{Q}} - -\def\@@PDFzeroscale{.0001} + {\pdfliteral{Q}} \def\dostartscaling#1#2% the test is needed because acrobat is bugged! {\forcecolorhack - \PDFcode{q \ifdim#1\points=\zeropoint\@@PDFzeroscale\else#1\fi\space 0 0 - \ifdim#2\points=\zeropoint\@@PDFzeroscale\else#2\fi\space 0 0 cm}} + \pdfliteral{q \ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0 + \ifdim#2\points=\zeropoint.0001\else#2\fi\space 0 0 cm}} \def\dostopscaling - {\PDFcode{Q}} - -\def\dostartmirroring{\PDFcode{-1 0 0 1 0 0 cm}} -\def\dostopmirroring {\PDFcode{-1 0 0 1 0 0 cm}} - -\def\dostartnegative {\ifdefined\initializePDFnegative \initializePDFnegative \PDFcode{/GSnegative gs}\fi} -\def\dostopnegative {\ifdefined\initializePDFnegative \initializePDFnegative \PDFcode{/GSpositive gs}\fi} -\def\dostartoverprint{\ifdefined\initializePDFoverprint\initializePDFoverprint\PDFcode{/GSoverprint gs}\fi} -\def\dostopoverprint {\ifdefined\initializePDFoverprint\initializePDFoverprint\PDFcode{/GSknockout gs}\fi} % wrong - -%D \macros -%D {doPDFstartgraymode,doPDFstopgraymode, -%D doPDFstartrgbcolormode,doPDFstartcmykcolormode,doPDFstartgraycolormode, -%D doPDFstopcolormode} -%D -%D In \PDF\ there are two color states, one for strokes and one -%D for fills. This means that we have to set the color in a -%D rather redundant looking way. Unfortunately this makes the -%D \PDF\ file much larger than needed. We can save few bytes -%D by not setting the stroke color. Due to zip compression we -%D only save a few percent. - -\def\dostartgraymode #1{\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}} -\def\dostopgraymode {\PDFcode{0 g\ifPDFstrokecolor\space 0 G\fi}} -\def\dostartrgbcolormode #1#2#3{\PDFcode{#1 #2 #3 rg\ifPDFstrokecolor\space#1 #2 #3 RG\fi}} -\def\dostartcmykcolormode#1#2#3#4{\PDFcode{#1 #2 #3 #4 k\ifPDFstrokecolor\space#1 #2 #3 #4 K\fi}} -\def\dostartgraycolormode #1{\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}} -\def\dostopcolormode {\PDFcode{0 g\ifPDFstrokecolor\space0 G\fi}} - -\def\dostartspotcolormode#1#2% redefining spotcolors is not possible anyway - {\ifundefined{pdf:scs:#2}% - \bgroup - \getcommacommandsize[#2]% - \ifcase\commalistsize\or - \setxvalue{pdf:scs:#2}{#2 SCN #2 scn}% \setxvalue{pdf:scs:#2}{#2 SC #2 sc}% - \else - \let\PDFspotcolorspecs\empty - \def\dospotcolorcommand##1{\edef\PDFspotcolorspecs{\PDFspotcolorspecs##1\space}}% - \processcommacommand[#2]\dospotcolorcommand - \setxvalue{pdf:scs:#2}{\PDFspotcolorspecs SCN \PDFspotcolorspecs scn}% - \fi - \egroup - \fi - \PDFcode{/#1 cs /#1 CS \PDFgetspotcolorspec{#2}}} - -\def\PDFgetspotcolorspec#1% - {\executeifdefined{pdf:scs:#1}\empty} % better no default than one with too less args - -\def\dostartnonecolormode - {\PDFcode{/None CS 1 SC /None cs 1 sc}} - -%D We need to register the spot colors and their fallbacks. - -% we cannot use /DeviceN since GS <=7.21 breaks on it -% and Jaws does not handle it at all {[/DeviceN [/All|/None] -% /Device#2 \PDFobjref\pdflastobj]} so we use separation -% colors that work and print ok - -\def\doPDFregistersomespotcolor#1#2#3#4% implemented in the driver - {\writestatus\m!systems{missing spot color definition}\wait} - -\def\doregisternonecolor % internal command - {\doregistergrayspotcolor{None}{1}% - \globallet\doregisternonecolor\relax} - -\def\dodoPDFregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b - {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}% - {\ifcase#2\or dup #5 mul exch dup #6 mul exch #7 mul\else#5 #6 #7\fi}} - -\def\dodoPDFregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k - {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}% - {\ifcase#2\or dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul\else #5 #6 #7 #8\fi}} + {\pdfliteral{Q}} -\def\dodoPDFregistergrayspotcolor#1#2#3#4#5% name noffractions names p's s - {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}% - {\ifcase#2\or #5 mul\else #5\fi}} +\def\dostartmirroring{\pdfliteral{-1 0 0 1 0 0 cm}} +\def\dostopmirroring {\pdfliteral{-1 0 0 1 0 0 cm}} -\def\doregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b - {\ifRGBsupported - \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}% - \else - \edef\@@cl@@r{#5}\edef\@@cl@@g{#6}\edef\@@cl@@b{#7}% - \ifCMYKsupported - \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b - \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k - \else - \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b - \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s - \fi - \fi} - -\def\doregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k - {\ifCMYKsupported - \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}% - \else - \edef\@@cl@@c{#5}\edef\@@cl@@m{#6}\edef\@@cl@@y{#7}\edef\@@cl@@k{#8}% - \ifRGBsupported - \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k - \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}\@@cl@@r\@@cl@@g\@@cl@@b - \else - \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k - \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s - \fi - \fi} - -\def\doregistergrayspotcolor{\dodoPDFregistergrayspotcolor} - -%D New and very experimental. - -\def\doregistercmykindexcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k - {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}% - {dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul}} - -\def\doregisterrgbindexcolor#1#2#3#4#5#6#7% name noffractions names p's r g b - {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}% - {dup #5 mul exch dup #6 mul exch #7 mul}} - -\def\doregistergrayindexcolor#1#2#3#4#5% name noffractions names p's s - {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}% - {pop}} - -\let\checkpredefinedcolor\predefineindexcolor % we need an index in order to negate bitmaps - -\def\doregisterfigurecolor#1% always an index color - {\dogetobjectreference{PDFIX}{\internalspotcolorname{#1}}\PDFimagecolorreference} - -\def\doregisterspotcolorname#1#2% no need for escape in luatex - {\bgroup - \let\ascii\empty - \def\docommand##1% - {\edef\ascii{\ascii - \ifx\nexthandledtoken\space - \letterhash20% - \else\ifx\nexthandledtoken\blankspace - \letterhash20% - \else - ##1% - \fi\fi}}% - \expanded{\handletokens#2}\with\docommand - \letgvalue{@@pdf@@scn@@#1}\ascii - \egroup} - -\def\doPDFregistersomespotcolor#1#2#3#4#5#6#7% name fractions names p's space domain function - {\bgroup - \let\spotpops\empty - \ifcase#2\or - %def\PDFspotcolornames{/Separation /#1}% - \edef\PDFspotcolornames{/Separation /\executeifdefined{@@pdf@@scn@@#1}{#1}}% - \def\PDFspotcolordomain{0.0 1.0}% - \else - \dorecurse{#2}{\edef\spotpops{\spotpops pop }}% - \let\PDFspotcolornames \empty - \let\PDFspotcolordomain\empty - \def\dospotcolorcommand##1% - {\edef\PDFspotcolornames {\PDFspotcolornames/\executeifdefined{@@pdf@@scn@@##1}{##1}\space}% - \edef\PDFspotcolordomain{\PDFspotcolordomain 0.0 1.0\space}}% - \processcommacommand[#3]\dospotcolorcommand - \edef\PDFspotcolornames{/DeviceN [\PDFspotcolornames]}% - \fi - \immediate \pdfobj stream attr - {/FunctionType 4 /Domain [\PDFspotcolordomain] /Range [#6]}{{\spotpops#7}}% - \immediate \pdfobj - {[\PDFspotcolornames\space /Device#5 \PDFobjref\pdflastobj]}% - \dosetobjectreference{PDFCS}{#1}{\the\pdflastobj}% - \appendtoPDFdocumentcolorspaces{/#1 \PDFobjref\pdflastobj}% - \egroup} - -%D New and very experimental. - -\def\doPDFregistersomeindexcolor#1#2#3#4#5#6#7% name fractions names p's space domain function - {\bgroup - \let\spotpops\empty - \dorecurse{#2}{\edef\spotpops{\spotpops exch pop\space}}% - \let\PDFspotcolornames \empty - \let\PDFspotcolordomain\empty - \def\docommand##1% - {%\edef\PDFspotcolornames {\PDFspotcolornames/##1\space}% - \edef\PDFspotcolornames{\PDFspotcolornames/\executeifdefined{@@pdf@@scn@@##1}{##1}\space}% - \edef\PDFspotcolordomain{\PDFspotcolordomain 0.0 1.0\space}}% - \processcommacommand[#3,None]\docommand - \let\PDFcolorindexvector\empty - \def\docommand##1% - {\scratchdimen##1\points - \scratchdimen\recurselevel\scratchdimen - \scratchcounter\scratchdimen - \divide\scratchcounter \maxcard - \edef\PDFcolorindexvector{\PDFcolorindexvector\uchexnumbers\scratchcounter}}% - %\dostepwiserecurse\zerocount{255}\plusone - \dostepwiserecurse{255}\zerocount\minusone % we need to negate - {\rawprocesscommacommand[#4,1]\docommand - \xdef\PDFcolorindexvector{\PDFcolorindexvector\space}}% - \immediate \pdfobj stream attr - {/FunctionType 4 /Domain [\PDFspotcolordomain] /Range [#6]}{{\spotpops#7}}% - \immediate \pdfobj - {[/Indexed - [/DeviceN [\PDFspotcolornames] /Device#5 \the\pdflastobj\space0 R] % - 255 <\PDFcolorindexvector>]}% - \dosetobjectreference{PDFIX}{#1}{\the\pdflastobj}% - \appendtoPDFdocumentcolorspaces{/#1_INDEXED \the\pdflastobj\space0 R}% - \egroup} - -%D \macros -%D {dostarttransparency,dostoptransparency} -%D -%D For transparency, we need to implement a couple of -%D auxiliary macros. If needed, we will generalize them later. - -\def\@@PDT{@PDT@} - -\ifx\PDFcurrenttransparency\undefined - \newcount\PDFcurrenttransparency \PDFcurrenttransparency=0 % -1 -\fi - -\def\assignPDFtransparency#1#2% - {\edef\PDFtransparencyidentifier{/Tr#1}% - \edef\PDFtransparencyreference{\PDFobjref{#2}}} - -\def\presetPDFtransparency#1#2% - {\initializePDFtransparency - \executeifdefined{\@@PDT#1:#2}{\dopresetPDFtransparency{#1}{#2}}} - -\def\dopresetPDFtransparency#1#2% - {\global\advance\PDFcurrenttransparency \plusone - \immediate\pdfobj{\PDFtransparancydictionary{#1}{#2}{}}% - \edef\PDFtransparencyidentifier{/Tr\the\PDFcurrenttransparency}% - \edef\PDFtransparencyreference {\PDFobjref\pdflastobj}% - \setxvalue{\@@PDT#1:#2}% - {\noexpand\assignPDFtransparency{\the\PDFcurrenttransparency}{\the\pdflastobj}}% - \appendtoPDFdocumentextgstates - {\PDFtransparencyidentifier\space - \PDFtransparencyreference\space}} - -\def\initializePDFtransparency - {\immediate\pdfobj{\PDFtransparancydictionary{1}{1}{/AIS false}}% - \xdef\PDFtransparencyresetidentifier{/Tr0}% - \xdef\PDFtransparencyresetreference{\PDFobjref\pdflastobj}% - \setxvalue{\@@PDT0:0}% - {\noexpand\assignPDFtransparency{0}{\the\pdflastobj}}% - \appendtoPDFdocumentextgstates - {\PDFtransparencyresetidentifier\space - \PDFtransparencyresetreference\space}% - \global\let\initializePDFtransparency\relax} - -%D Transparency support: - -\def\PDFtransparancydictionary#1#2#3% type fraction extras - {<</Type /ExtGState - /ca #2 /CA #2 - /BM /\ifcase#1 Normal\or Normal\or Multiply\or Screen\or - Overlay\or SoftLight\or HardLight\or ColorDodge\or - ColorBurn\or Darken\or Lighten\or Difference\or - Exclusion\else Compatible\fi - #3>>} - -\def\dodoPDFstarttransparency#1#2% - {\presetPDFtransparency{#1}{#2}% - \PDFcode{\PDFtransparencyidentifier\space gs }} - -\def\dodoPDFstoptransparency - {\PDFcode{/Tr0 gs }} - -\def\dostarttransparency - {\global\let\dostarttransparency\dodoPDFstarttransparency - \global\let\dostoptransparency \dodoPDFstoptransparency - \initializetransparency - \dostarttransparency} - -% This is tricky: because a text stream is handled before -% the page body is built, we can run into stops that will -% match an outer start; however, the stop is needed in case -% of a text color: [text color text] [other color text] on a -% first page combined with color splitting will go wrong if -% we stick to the relaxing method. - -% \def\dostoptransparency -% {\initializetransparency -% \dodoPDFstoptransparency} - -%D These use: - -\let\initializetransparency\relax - -\let\PDFtransparencyresetreference \empty -\let\PDFtransparencyresetidentifier\empty - -\let\PDFtransparencyreference \empty -\let\PDFtransparencyidentifier\empty - -%D New trickery: - -\def\dostartgraphicgroup{\PDFcode{q}} -\def\dostopgraphicgroup {\PDFcode{Q}} - -%D \macros -%D {dostartclipping,dostopclipping} -%D -%D Clipping in \PDFTEX\ is rather trivial. We can even hook -%D in \METAPOST\ without problems. - -\def\dostartclipping#1#2#3% +\def\dostartclipping#1#2#3% todo {\PointsToBigPoints{#2}\width \PointsToBigPoints{#3}\height - \grabMPclippath{#1}{1}\width\height - {0 0 m \width\space 0 l \width \height l 0 \height l}% - \pdfliteral % PDFcode ? - {q 0 w \MPclippath\space W n}} + \grabMPclippath{#1}{1}\width\height{0 0 m \width\space 0 l \width \height l 0 \height l}% + \pdfliteral{q 0 w \MPclippath\space W n}} \def\dostopclipping - {\pdfliteral{Q n}} % PDFcode - -%D \macros -%D {dosetupinteraction} -%D -%D Nothing special is needed to enable \PDF\ commands and -%D interaction. We stick with a message. - -\def\dosetupinteraction - {\showmessage\m!interactions{21}{pdftex}} - -%D \macros -%D {doresetgotowhereever, -%D dostartthisisrealpage,dostartthisislocation, -%D dostartgotorealpage,dostartgotolocation,dostartgotoJS} -%D -%D The interactions macros are the core of this module. We -%D support both page destinations and named ones. We don't -%D need the \type{\stop}||alternatives. We also don't need -%D to set the special that sets the real page number. + {\pdfliteral{Q n}} -%D In the goto specials we took care of secondary references. -%D Here we define the macros used. +%D The following will move to the backend \LUA\ code: -\def\doresetgotowhereever - {\global\let\secondaryPDFreferences\empty} +\appendtoks \ctxlua{backends.codeinjections.finalizepage ()}\to \everybackendshipout % is immediate +\appendtoks \ctxlua{backends.codeinjections.finalizedocument()}\to \everylastbackendshipout % is immediate -\doresetgotowhereever % just to be sure +%D Temporary hack, will be removed or improved. -% we can (in etex) share more by testing on this - -\def\savesecondaryPDFreference#1% - {\@EA\xdef\csname PDF-SR:\the\nofsecondaryreferences\endcsname{#1}} - -\def\savesecondaryPDFreference % #1 == \action - {\global\@EA\let\csname PDF-SR:\the\nofsecondaryreferences\endcsname} - -% test should happen in core-ref - -\def\getsecondaryPDFreferences - {\ifcase\nofsecondaryreferences\else - \ifcsname PDF-SR:\the\nofsecondaryreferences\endcsname - \xdef\secondaryPDFreferences{/Next <<\csname PDF-SR:\the\nofsecondaryreferences\endcsname\space\secondaryPDFreferences>>}% - \fi - \global\advance\nofsecondaryreferences \minusone - \expandafter\getsecondaryPDFreferences - \fi} - -%D \macros -%D {dostartthisislocation} -%D -%D Next we define the macros that deal with hyperreferencing, -%D graphic inclusion and general document features. These are -%D the olderst ones. I won't comment much because one needs -%D knowledge of \PDF\ itself, and explaning \PDF\ is beyond -%D this documentation. - -\def\dostartthisislocation#1% - {\bgroup - \setPDFdestination{#1}% - \ifx\PDFdestination\empty \else - \pdfdest name {\PDFdestination}\PDFpageviewkey - \fi - \egroup} - -\def\locationfilesuffix{pdf} - -\def\dostartgotolocation#1#2#3#4#5#6% - {\bgroup - \doifelsenothing{#3} - {\setPDFdestination{#5}% - \doifelsenothing\PDFdestination - {\let\action\empty} - {\doifelsenothing{#4} - {\let\PDFfile\empty} - {\expanded{\beforesplitstring#4}\at.\to\PDFfile - \doifparentfileelse\PDFfile % {#4} - {\let\PDFfile\empty} - %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile - {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile - \edef\PDFfile - {R /F (\PDFfile)\ifgotonewwindow\space/NewWindow true \fi}}}% - \edef\action% - {/S /GoTo\PDFfile\space /D (\PDFdestination)}}} - {\doifelsenothing{#4} - {\let\PDFfile\empty - \let\PDFdestination\empty} - {\setreferencefilename/#4\to\PDFfile - \setPDFdestination{#5}% - \doifsomething\PDFdestination - {\edef\PDFdestination{\letterhash\PDFdestination}}}% - \edef\action{/S /URI /URI (#3\PDFfile\PDFdestination)}}% - \ifx\action\empty\else - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \fi - \egroup} - -\def\PDFgotonewwindow{\ifgotonewwindow\space/NewWindow true \fi} - -% optimization in tpd driver -% -% \edef\PDFdestination{(page:\the\scratchcounter)}% -% -% ==> -% -% \advance\scratchcounter 1 -% \edef\PDFdestination{[\pdfpageref \PDFobjref\scratchcounter\PDFpageviewwrd]}% -% -% \doPDFgetpagedestination#1#2% pagenumber macro % % fuzzy hack - -\def\dostartgotorealpage#1#2#3#4#5% watch the R append trick - {\bgroup - \doifelsenothing{#3}% #1 = url - {\scratchcounter0#5\relax - \ifnum\scratchcounter>0 - \doifelsenothing{#4} - {\let\PDFfile\empty} - {\expanded{\beforesplitstring#4}\at.\to\PDFfile - \doifparentfileelse\PDFfile % {#4} - {\let\PDFfile\empty} - %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile - {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile - \edef\PDFfile{R /F (\PDFfile)\PDFgotonewwindow}}}% - \ifx\PDFfile\empty - \ifcase\overcomePDFpage - \or % pdf starts numbering at zero - \advance\scratchcounter \minusone - \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}% - \or % pdf starts numbering at zero - \advance\scratchcounter \minusone - \edef\PDFdestination{(page:\the\scratchcounter)}% - \or % pdftex starts numbering at one - \edef\PDFdestination{[\pdfpageref\scratchcounter\space0 R \PDFpageviewwrd]}% - \fi - \else % across files it's a page number / pdf starts numbering at zero - \advance\scratchcounter \minusone - \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}% - \fi - \edef\action{/S /GoTo\PDFfile\space /D \PDFdestination}% - \else - \let\action\empty - \fi} - {\doifelsenothing{#4} - {\let\PDFfile\empty} - {\setreferencefilename/#4\to\PDFfile}% - \edef\action{/S /URI /URI (#3\PDFfile)}}% - \ifx\action\empty\else - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \fi - \egroup} - -\let\lastfakedPDFpage\!!zerocount - -\def\fakePDFpagedestination % as in pdf, we start numbering at zero - {\iflocation \ifarrangingpages \ifnum\overcomePDFpage=\plustwo \else - \ifnum\lastfakedPDFpage<\realpageno - \bgroup - \xdef\lastfakedPDFpage{\realfolio}% - \advance\realpageno \minusone % is \expanded needed ? - \normalexpanded{\noexpand\pdfdest name {page:\realfolio}\PDFpageviewkey}% - \egroup - \fi - \fi \fi \fi} - -\def\dostartgotoJS#1#2#3% - {\bgroup - \doPSsanitizeJScode#3\to\sanitizedJScode - \edef\action{/S /JavaScript /JS (\sanitizedJScode)}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \egroup} - -%D When going to a location, we obey the time and space saving -%D boolean \type{\ifusepagedestination}. Named destinations are -%D stripped and made robust. This all happens in the macros -%D called for. - -%D \macros -%D {doflushJSpreamble} -%D -%D It does not make sense to duplicate common \JAVASCRIPT\ -%D functions, and therefore they can be predefined and must be -%D output separately. Currently this special is not shared -%D with the \ACROBAT\ one, simply because \DISTILLER\ does not -%D yet support something \type{\pdfnames}. - -% \oneJSpreamblefalse % buggy in acrobat - -\def\doflushJSpreamble#1% - {\bgroup - \let\compositeJScode\empty - \def\docommand##1% - {\edef\sanitizedJScode{\getJSpreamble{##1}}% - \@EA\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode - \immediate\pdfobj {<< /S /JavaScript /JS (\sanitizedJScode) >>}% - \edef\compositeJScode - {\compositeJScode\space (##1) \PDFobjref\pdflastobj}}% - \processcommalist[#1]\docommand - \immediate\pdfobj{<< /Names [ \compositeJScode ] >>}% - \pdfnames{/JavaScript \PDFobjref\pdflastobj}% - \egroup} - -%D \macros -%D {dostarthide,dostophide} -%D -%D Hiding parts of the document for printing is not yet -%D supported by \PDF\ and therefore \PDFTEX. - -\let\dostarthide\donothing -\let\dostophide \donothing - -%D \macros -%D {doPDFsetupscreen,doPDFsetupidentity} -%D -%D Opposite to \DVI\ drivers, \PDF\ ones must know which what -%D page dimensions they are dealing. We also use the -%D opportunity to launch full screen (1) or show bookmarks (2). -%D -%D Setting of the screen boundingbox involves some -%D calculations. Here we also take care of (non) full screen -%D startup. The dimensions are rounded. Because \PDFTEX\ and -%D \ACROBAT\ handle setting the page dimensions in a -%D different way, we do not share this special. - -\def\dosetupscreen{\doPDFsetupscreen\pdfpageheight} - -\let\currentPDFpagemode \empty % document catalog -\let\currentPDFviewerprefs\empty % document catalog - -\let\currentPDFcropbox \empty % page attributes -\let\currentPDFbleedbox \empty % page attributes -\let\currentPDFartbox \empty % page attributes -\let\currentPDFtrimbox \empty % page attributes - -\def\doPDFsetupscreen#1#2#3#4#5#6% watch the extra argument - {\bgroup - \xdef\currentPDFpagemode - {\ifnum#6=4 - /PageLayout /TwoColumnRight - \else - /PageMode \ifcase#6 - /UseNone\or/FullScreen\or/UseOutlines\else/UseNone\fi - \fi}% - \xdef\currentPDFviewerprefs % space after #6 needed, else \relax - {\ifcase#6 \or\or\else /ViewerPreferences << /FitWindow true >>\fi}% - \egroup} - -\def\addPDFdocumentinfo - {\appendtopdfcatalog{\currentPDFpagemode\currentPDFviewerprefs}% - \appendtopdfcatalog{/Version \ifdim\PDFversion00\points>100\points 1.\fi\PDFversion}% - \appendtopdfinfo{/Trapped /False}% - \appendtopdfinfo{/ConTeXt.Version (\contextversion)}% - \appendtopdfinfo{/ConTeXt.Time (\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute)}% - \appendtopdfinfo{/ConTeXt.Jobname (\jobname)}% - \appendtopdfinfo{/ConTeXt.Url (www.pragma-ade.com)}% - \glet\addPDFdocumentinfo\relax} - -\def\PDFversion{1.5} - -\appendtoksonce - \def\PDFversion{1.5}% -\to \everyresetspecials - -\def\doPDFsetupwhateverbox#1#2#3#4#5#6% watch the extra arguments - {\bgroup - \!!widtha \dimexpr#5+#3\relax - \!!heightb\dimexpr#2-#4\relax - \!!heighta\dimexpr\!!heightb-#6\relax - % sometimes whole values give better results - % \PointsToWholeBigPoints{#3}\left - % \PointsToWholeBigPoints\!!heighta\bottom - % \PointsToWholeBigPoints\!!widtha \width - % \PointsToWholeBigPoints\!!heightb\height - % but since pdf/x does not round when checking if - % the boxes fit inside the media box ... - \PointsToBigPoints{#3}\left - \PointsToBigPoints\!!heighta\bottom - \PointsToBigPoints\!!widtha \width - \PointsToBigPoints\!!heightb\height - \xdef#1{[\left\space\bottom\space\width\space\height]}% - \egroup} - -\gdef\currentPDFtrimbox{\currentPDFcropbox} % default, needed for pdf/x - -\def\dosetupartbox {\doPDFsetupwhateverbox\currentPDFartbox \pdfpageheight} -\def\dosetupcropbox {\doPDFsetupwhateverbox\currentPDFcropbox \pdfpageheight} -\def\dosetupbleedbox{\doPDFsetupwhateverbox\currentPDFbleedbox\pdfpageheight} -\def\dosetuptrimbox {\doPDFsetupwhateverbox\currentPDFtrimbox \pdfpageheight} - -\def\flushPDFpageboxes - {\edef\currentPDFtrimbox{\currentPDFtrimbox}% - \ifx\currentPDFartbox \empty\else\appendtopdfpageattributes{/ArtBox \currentPDFartbox }\fi - \ifx\currentPDFcropbox \empty\else\appendtopdfpageattributes{/CropBox \currentPDFcropbox }\fi - \ifx\currentPDFbleedbox\empty\else\appendtopdfpageattributes{/BleedBox \currentPDFbleedbox}\fi - \ifx\currentPDFtrimbox \empty\else\appendtopdfpageattributes{/TrimBox \currentPDFtrimbox }\fi} - -%D \macros -%D {dostartexecutecommand} -%D -%D \PDF\ viewers enable us to navigate using menus and shortcut -%D keys. These navigational tools can also be accessed by using -%D annotations. The next special takes care of inserting them. -%D -%D At the cost of much auxiliary placeholders, we can pretty -%D fast convert the command asked for. This is how the \PDF\ -%D code looks like. - -\def\PDFmoviecode#1#2#3% - {/Movie - /T (\ifcase#1movie \else sound \fi\ifx\argumentA\empty#2\else\argumentA\fi) - /Operation /\ifcase#3Play\or Stop\or Pause\or Resume\fi\space} - -\def\PDFexecutestartmovie {\PDFmoviecode0\currentmovie0} -\def\PDFexecutestopmovie {\PDFmoviecode0\currentmovie1} -\def\PDFexecutepausemovie {\PDFmoviecode0\currentmovie2} -\def\PDFexecuteresumemovie {\PDFmoviecode0\currentmovie3} - -\def\PDFexecutestartsound {\PDFmoviecode1\currentsound0} -\def\PDFexecutestopsound {\PDFmoviecode1\currentsound1} -\def\PDFexecutepausesound {\PDFmoviecode1\currentsound2} -\def\PDFexecuteresumesound {\PDFmoviecode1\currentsound3} - -\def\PDFformcode#1% - {\doiffieldset{#1}{/Field [\dogetfieldset{#1}]}} - -% bit 3 = html -% bit 6 = xml -% bit 4 = get - -\ifx\PDFsubmitfiller\undefined \let\PDFsubmitfiller\empty \fi - -\chardef\PDFformmethod=1 % 0=GET 1=POST - -\def\PDFformflag#1#2{\ifcase\PDFformmethod#1\else#2\fi} - -\def\PDFexecuteimportform {/Named /N /AcroForm:ImportFDF} -\def\PDFexecuteexportform {/Named /N /AcroForm:ExportFDF} -\def\PDFexecuteresetform {/ResetForm \PDFformcode\argumentA} -\def\PDFexecutesubmitform {/SubmitForm \PDFformcode\argumentB - /Flags \ifcase\submitoutputformat\space - \PDFformflag{12} {4} % 0=unknown - \or \PDFformflag{12} {4} % 1=HTML - \or \PDFformflag {8} {0} % 2=FDF - \or \PDFformflag{40}{32} % 3=XML - \else \PDFformflag{12} {4} % ?=unknown - \fi - /F (\argumentA)\PDFsubmitfiller} - -% urifill permits url substitution - -\def\PDFexecutehide {/Hide /T (\argumentA) /H true} -\def\PDFexecuteshow {/Hide /T (\argumentA) /H false} - -\def\PDFexecutefirst {/Named /N /FirstPage} -\def\PDFexecuteprevious {/Named /N /PrevPage} -\def\PDFexecutenext {/Named /N /NextPage} -\def\PDFexecutelast {/Named /N /LastPage} -\def\PDFexecutebackward {/Named /N /GoBack} -\def\PDFexecuteforward {/Named /N /GoForward} -\def\PDFexecuteprint {/Named /N /Print} -\def\PDFexecuteexit {/Named /N /Quit} -\def\PDFexecuteclose {/Named /N /Close} -\def\PDFexecutesave {/Named /N /Save} -\def\PDFexecutesavenamed {/Named /N /SaveAs} -\def\PDFexecuteopennamed {/Named /N /Open} -\def\PDFexecutehelp {/Named /N /HelpUserGuide} -\def\PDFexecutetoggle {/Named /N /FullScreen} -\def\PDFexecutesearch {/Named /N /Find} -\def\PDFexecutesearchagain {/Named /N /FindAgain} -\def\PDFexecutegotopage {/Named /N /GoToPage} -\def\PDFexecutequery {/Named /N /AcroSrch:Query} -\def\PDFexecutequeryagain {/Named /N /AcroSrch:NextHit} -\def\PDFexecutefitwidth {/Named /N /FitWidth} -\def\PDFexecutefitheight {/Named /N /FitHeight} - -\let\PDFobjectclass\empty -\let\PDFobjectname \empty - -\def\dostartexecutecommand#1#2#3#4% - {\doifdefined{PDFexecute#3} - {\bgroup - \edef\argument{#4}% - \ifx\argument\empty - \let\argumentA\empty - \let\argumentB\empty - \else - \@EA\dogetcommalistelement\@EA1\@EA\from#4\to\argumentA - \@EA\dogetcommalistelement\@EA2\@EA\from#4\to\argumentB - \fi - \edef\action% - {/S \getvalue{PDFexecute#3}}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences -% \ifx\PDFobjectclass\empty -% \let\next\insertpdfaction -% \else -% \edef\next{\createpdfactionobject{\PDFobjectclass}{\PDFobjectname}}% -% \globalletempty\PDFobjectclass -% \globalletempty\PDFobjectname -% \fi -% \next - \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \egroup}} - -%D \macros -%D {dosetupidentity} -%D -%D Documents can be tagged with an application accessible title -%D and subtitle, the authorname, a date, the creator, keywords -%D etc. For the moment \PDFTEX\ only supports the first three -%D of these. - -\def\dosetupidentity#1#2#3#4#5#6% - {\normalexpanded{\noexpand\appendtopdfinfo - {/Title <\hexifiedPDFstring{#1}> - /Subject <\hexifiedPDFstring{#2}> - /Author <\hexifiedPDFstring{#3}> - /Creator <\hexifiedPDFstring{#4}> - /ModDate (#4) - /ID (\jobname.#5) % needed for pdf/x - /Keywords <\hexifiedPDFstring{#6}>}}} - -%D \macros -%D {dostartrunprogam} -%D -%D We can run a program form within a document, although this -%D feature is rather weak, due to path problems and buggy -%D argument passing. - -\def\dostartrunprogram#1#2#3#4% new: #3 => #3#4 - {\bgroup - %\edef\string{#3}% - %\@EA\beforesplitstring\string\at{ }\to\program - %\@EA\aftersplitstring \string\at{ }\to\parameters - %\edef\action% - % {/S /Launch /F (\program) /P (\parameters) /D (.)}% - \edef\action - {/S /Launch /F (#3) /P (#4) /D (.)}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \egroup} - -%D \macros -%D {dostartgotoprofile, dostopgotoprofile, -%D dobeginofprofile, doendofprofile} -%D -%D \CONTEXT\ user profiles and version control fall back on -%D \PDF\ article threads. Unfortunately one cannot influence -%D the view yet in an (for me) acceptable way. - -\def\dostartgotoprofile#1#2#3% to be done: file - {\bgroup - \setPDFdestination{#3}% - \doifsomething\PDFdestination - {\edef\action - {/S /Thread /D (\PDFdestination)}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi}% - \egroup} - -%D Some day, I'll reimplement threading in a useful way. -%D Currently the viewers handle threads rather diffuse. - -\def\dobeginofprofile#1#2#3#4% - {\setPDFdestination{#1}% - \doifsomething\PDFdestination - {\pdfthread - width #2 height #3 - attr {/Title (\PDFdestination)} % can be omitted - name {\PDFdestination}}} - -\def\doendofprofile - {} - -%D \macros -%D {doinsertbookmark} -%D -%D In \PDF\ bookmarks are the building blocks of a viewer -%D provided sort of table of contents. \TEX\ has to provide -%D the entry as well as the number of child entries. Strings -%D need to be sanatized as good as possible to suit the default -%D encoding. In \CONTEXT\ users can overrule this string by -%D supplying an alternative one. Look at the macro called for -%D to see how funny these bookmarks are defined. - -\def\doinsertbookmark#1#2#3#4#5% level sublevels text page open=1 - {\bgroup - \doPDFgetpagereference{#4}\PDFobjectreference - \pdfoutline - user {<</S /GoTo /D [\PDFobjectreference\space\PDFpageviewwrd]>>}% - \ifcase#2 \else count \ifcase#5-\fi#2 \fi -% {<\hexifiedPDFstring{#3}>}% goes wrong - {<#3>}% - \egroup} +\def\TransparencyHack{\ctxlua{backends.codeinjections.addtransparencygroup()}} %D \macros %D {dostartobject,dostopobject,doinsertobject} -%D -%D Due to \PDF's object oriented character, we can include and -%D reuse objects. These can be compared with \TEX's boxes. The -%D \TEX\ counterpart is defined in the module \type{spec-dvi}. -%D We don't use the dimensions here. -%D -%D The next solution is not that beautiful. Because objects are -%D containers for whatever kind of content, graphics can be -%D part of this content, and a graphic object can be part of -%D the more general type. In practice this means that an ximage -%D would be embedded in an xform, which in itself is not that -%D big a problem, apart from a few bytes overhead. However, for -%D reasons unknown to me alternative images must be pure -%D ximages |<|indeed, somehow one cannot use a vector graphic -%D as alternative|>| that are not embedded into forms, so this -%D is why the object handler treats them different. This -%D implies knowledge of the calling routines, especially the -%D \type{FIG} trigger, that signals that we just embedded an -%D image. Alternatively I could have introduced a dual object -%D system, but the overhead in duplicate specials is currently -%D not what we want. I'd rather implement a more mature -%D object support system from scratch. -\let\currentPDFresources\empty -\let\PDFimageattributes \empty -\let\PDFfigurereference \empty -\let\PDFimagereference \empty +%D This will change: + +\newbox\objectbox \def\dostartobject#1#2#3#4#5% {\bgroup - \setbox\nextbox\vbox\bgroup - \def\dodostopobject - {\egroup - \ifx\PDFimagereference\empty - % We also flush page resources, since shared - % resources end up there; otherwise transparencies - % won't work in xforms; some day I will optimize - % this. - \the\everyPDFxform - \finalizeobjectbox\nextbox - \immediate\pdfxform - resources {\currentPDFresources\the\pdfpageresources}% - \nextbox - \global\let\currentPDFresources\empty - \dosetobjectreference{#1}{#2}{\the\pdflastxform}% - \else - \dosetobjectreference{#1}{#2}{-\PDFimagereference}% - \global\let\PDFimagereference\empty - \fi}} + \setbox\objectbox\vbox\bgroup + \def\dodostopobject{\egroup\doregisterobject{#1}{#2}}} \def\dostopobject {\dodostopobject \egroup} +\def\doregisterobject#1#2% + {\the\pdfbackendeveryxform + \finalizeobjectbox\objectbox + \immediate\pdfxform resources {\pdfbackendcurrentresources}\objectbox + \dosetobjectreference{#1}{#2}{\the\pdflastxform}} + \def\doresetobjects - {\global\let\PDFimagereference\empty} + {} \def\doinsertobject#1#2% - {\bgroup + {\begingroup \doifobjectreferencefoundelse{#1}{#2} - {\dogetobjectreference{#1}{#2}\PDFobjectreference - \ifnum\PDFobjectreference<0 - \@EA\@EA\@EA\pdfrefximage\@EA\gobbleoneargument\PDFobjectreference - \else - \pdfrefxform\PDFobjectreference - \fi}% - {}% - \egroup} - -\appendtoksonce - \collectPDFresources - \global\let\currentPDFresources\collectedPDFresources -\to \everyPDFxform - -%D \macros -%D {dosetpagetransition} -%D -%D Page transitions only make sence in presentations. They are -%D passed as raw \PDF\ code to the page object. Take a look -%D at the implementation to get an impression of the rubish -%D passed on. -%D -%D This array holds a reasonable selection of transitions -%D (watch out: \type{replace} is not in this list). Most of -%D the transitions look awful anyway. By the way, \CONTEXT\ is -%D able to select transitions randomly. - -\def\pagetransitions - {{split,in,vertical},{split,in,horizontal}, - {split,out,vertical},{split,out,horizontal}, - {blinds,horizontal},{blinds,vertical}, - {box,in},{box,out}, - {wipe,east},{wipe,west},{wipe,north},{wipe,south}, - dissolve, - {glitter,east},{glitter,south}, - {fly,in,east},{fly,in,west},{fly,in,north},{fly,in,south}, - {fly,out,east},{fly,out,west},{fly,out,north},{fly,out,south}, - {push,east},{push,west},{push,north},{push,south}, - {cover,east},{cover,west},{cover,north},{cover,south}, - {uncover,east},{uncover,west},{uncover,north},{uncover,south}, - fade} - -%D Again, we use macros as placeholders for \PDF\ key||value -%D pairs. - -\def\PDFpagesplit {/S /Split } -\def\PDFpageblinds {/S /Blinds } -\def\PDFpagebox {/S /Box } -\def\PDFpagewipe {/S /Wipe } -\def\PDFpagedissolve {/S /Dissolve } -\def\PDFpageglitter {/S /Glitter } -\def\PDFpagereplace {/S /R } - -\def\PDFpagefly {/S /Fly } % 1.5 -\def\PDFpagepush {/S /Push } % 1.5 -\def\PDFpagecover {/S /Cover } % 1.5 -\def\PDFpageuncover {/S /Uncover } % 1.5 -\def\PDFpagefade {/S /Fade } % 1.5 - -\def\PDFpagehorizontal {/Dm /H } -\def\PDFpagevertical {/Dm /V } -\def\PDFpagein {/M /I } -\def\PDFpageout {/M /O } -\def\PDFpageeast {/Di 0 } -\def\PDFpagenorth {/Di 90 } -\def\PDFpagewest {/Di 180 } -\def\PDFpagesouth {/Di 270 } - -\def\dodoPDFsetpagetransition#1% - {\doifdefined{PDFpage#1} - {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}} - -\def\dosetpagetransition#1#2% - {\let\PDFpagetransitions\empty - \processcommalist[#1]\dodoPDFsetpagetransition - \appendtopdfpageattributes - %{\ifnum#2>0 /Dur #2 \fi - {\ifnum0<0#2 /Dur #2 \fi - \ifx\PDFpagetransitions\empty\else/Trans <<\PDFpagetransitions>>\fi}} - -%D The expansion is needed because else the \type{\pdfpageattr} -%D token list flushes an unexpanded \type{\csname}. The -%D \type{\global} is needed because the assignment can take -%D place deeply buried (for instance in the \type{\shipout} -%D box. - -%D \macros -%D {doinsertcomment, doflushcomments} -%D -%D Text annotation, or comments, are provided too: - -%D \macros -%D {dopresetlinefield,dopresettextfield, -%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield, -%D dopresetpushfield,dopresetcheckfield, -%D dopresetradiofield,dopresetradiorecord} -%D -%D \PDF\ offers extensive field support. The next bunch of -%D definitions map the specials. - -%D \macros -%D {dodefinefieldset,dogetfieldset,doiffieldset} -%D -%D Field sets, needed for reset and submit handling, are -%D taken care of by: - -%D The next section of this module is dedicated to form -%D support. These macros are complicated by the fact that -%D cloning is possible. - -%D \macros -%D {FDFflag...,FDFplus...} -%D -%D The \type{/FT} key determines the type of field: text, -%D button or choice. The latter two come in several disguises, -%D which are set by flipping bits in the \type{/Ff}. Other bits -%D are used to set states. Personally I hate this bitty way of -%D doing things. The next six bit determine the field sub type: - -\def\FDFflagMultiLine {4096} % 13 -\def\FDFflagNoToggleToOff {16384} % 15 -\def\FDFflagRadio {32768} % 16 -\def\FDFflagPushButton {65536} % 17 -\def\FDFflagPopUp {131072} % 18 -\def\FDFflagEdit {262144} % 19 - -% bugged anyway, so we need to drop it: - -\def\FDFflagRadiosInUnison {33554432} % 26 - -%D A few more (pdf 1.4) flags, what the spell check one: for -%D obscure reasons for Adobe downward compatibility means -%D enabling features that harm old applications like testing. - -\def\FDFflagDoNotSpellCheck {4194304} % 23 -\def\FDFflagDoNotScroll {8388608} % 24 - -%D The next bits (watch how strange the bits are organized) -%D take care of the states: - -\def\FDFflagReadOnly {1} % 1 -\def\FDFflagRequired {2} % 2 -\def\FDFflagNoExport {4} % 3 -\def\FDFflagPassword {8192} % 14 -\def\FDFflagSort {524288} % 20 -\def\FDFflagFileSelect {1048576} % 21 - -%D There is a second, again bitset oriented, \type{/F} flag: - -\def\FDFplusInvisible {1} % 1 -\def\FDFplusHidden {2} % 2 -\def\FDFplusPrintable {4} % 3 - -%def\FDFplusNoView {32} % 6 -%def\FDFplusToggleNoView {256} % 9 - -\def\FDFplusAutoView {256} % {288} % 6+9 - -%D \macros -%D {setFDFswitches} -%D -%D The non||type bits are mapped onto user||interface -%D swithes, to be used later on: - -\def\@@FDFflag{FDFflag} -\def\@@FDFplus{FDFplus} - -\letvalue {\@@FDFflag\v!readonly}=\FDFflagReadOnly -\letvalue {\@@FDFflag\v!required}=\FDFflagRequired -\letvalue {\@@FDFflag\v!protected}=\FDFflagPassword -\letvalue {\@@FDFflag\v!sorted}=\FDFflagSort -\letvalue {\@@FDFflag\v!unavailable}=\FDFflagNoExport -\letvalue {\@@FDFflag\v!nocheck}=\FDFflagDoNotSpellCheck -\letvalue {\@@FDFflag\v!fixed}=\FDFflagDoNotScroll -\letvalue {\@@FDFflag\v!file}=\FDFflagFileSelect - -\letvalue {\@@FDFplus\v!hidden}=\FDFplusHidden -\letvalue {\@@FDFplus\v!printable}=\FDFplusPrintable - -\letvalue {\@@FDFplus\v!auto}=\FDFplusAutoView - -%D A set of switches is collected into the flags we mentioned -%D before by the next macro (we don't handle negations yet, -%D but do take care of redundancy): - -\def\FDFflag{0} -\def\FDFplus{0} - -\def\setFDFswitches[#1]% - {\bgroup - \!!counta\zerocount - \!!countb\zerocount - \def\docommand##1% - {\doifsomething{##1} - {\advance\!!counta 0\getvalue{\@@FDFflag##1}% - \setvalue{\@@FDFflag##1}{0}% - \advance\!!countb 0\getvalue{\@@FDFplus##1}% - \setvalue{\@@FDFplus##1}{0}}}% - \processcommacommand[#1]\docommand - \xdef\FDFflag{\the\!!counta}% - \xdef\FDFplus{\the\!!countb}% - \egroup} - -%D \macros -%D {setFDFvalues} -%D -%D Menu items are passed as an array of \type{(string)}'s and -%D the content of this array is build with: - -\let\FDFvalues \empty -\let\FDFfirstvalues \empty -\let\FDFsecondvalues\empty -\let\FDFkidlist \empty -\let\FDFdefaultindex\!!zerocount -\let\FDFdefaultvalue\empty - -% Why do we need to tweak this mechanism each time acrobat updates ... -% it would make sense to have version specific sections in pdf files -% since my guess is that it never will be done right since each year -% new programmers have new ideas about what is supposed to happen with -% kids. So .. best is not to trust this feature esp not for radio -% widgets. (new flags, different interpretation of AS etc etc) - -\def\setFDFvalues[#1][#2]% #1 = list (item=>value) #2 = default - {\let\FDFvalues \empty - %when radio opt works ok - %\let\FDFfirstvalues \empty - %\let\FDFsecondvalues\empty - \let\FDFkidlist \empty - %\let\FDFdefaultindex\!!zerocount - %\let\FDFdefaultvalue\empty - %\scratchcounter\zerocount - \def\dodocommand##1=>##2=>##3\end - {\addtocommalist{##1}\FDFkidlist - %\edef\FDFfirstvalues{\FDFfirstvalues(##1)}% - %\doif{##1}{#2}{\edef\FDFdefaultindex{\the\scratchcounter}}% - %\advance\scratchcounter\plusone - \doifelsenothing{##2} - {\doif{##1}{#2}{\edef\FDFdefaultvalue{##1}}% - %\edef\FDFsecondvalues{\FDFsecondvalues(##1)}% - \edef\FDFvalues{\FDFvalues [(##1)(##1)] }} - {\doif{##1}{#2}{\edef\FDFdefaultvalue{##2}}% - %\edef\FDFsecondvalues{\FDFsecondvalues(##2)}% - \edef\FDFvalues{\FDFvalues [(##2)(##1)] }}}% ! ##1 is shown - \def\docommand##1% - {\dodocommand##1=>=>\end}% - \expanded{\processcommalist[#1]}\docommand} - -%D This macro accepts comma separated \type{visual=>result} -%D pairs. - -%D \macros -%D {setFDFalignment} -%D -%D Text and line fields can be entered and showed in three -%D alternative alingments, indicated by a digit: - -\def\FDFalign{0} - -\def\setFDFalignment[#1]% - {\processaction - [#1] - [ \v!left=>\edef\FDFalign{2}, % raggedleft - \v!middle=>\edef\FDFalign{1}, % raggedcenter - \v!right=>\edef\FDFalign{0}]} % raggedright - -%D \macros -%D {setFDFattributes} -%D -%D The weak part of (at least version 2.1 \PDF) is that only -%D default fonts are handled well. Another restriction is that -%D the encoding vector must be the standard \PDF\ document one. -%D Although the \PDF\ reference explictly states that one could -%D use the normal text operators, leading is not yet handled. -%D -%D For the moment the current \CONTEXT\ font is mapped onto -%D one best suitable default font. The color attribute is -%D less problematic and is directly derived from the \CONTEXT\ -%D color. - -\def\FDFattributes{/Helv 12 Tf 0 g 14.4 TL} - -\def\FDFrm {TiRo} \def\FDFss {Helv} \def\FDFtt {Cour} -\def\FDFrmtf{TiRo} \def\FDFsstf{Helv} \def\FDFtttf{Cour} -\def\FDFrmbf{TiBo} \def\FDFssbf{HeBo} \def\FDFttbf{CoBo} -\def\FDFrmit{TiIt} \def\FDFssit{HeOb} \def\FDFttit{CoOb} -\def\FDFrmsl{TiIt} \def\FDFsssl{HeOb} \def\FDFttsl{CoOb} -\def\FDFrmbi{TiBI} \def\FDFssbi{HeBO} \def\FDFttbi{CoBO} -\def\FDFrmbs{TiBI} \def\FDFssbs{HeBO} \def\FDFttbs{CoBO} - -\let\FDFusedfonts=\FDFsstf - -\def\setFDFattributes[#1,#2,#3,#4]% style, color, backgroundcolor, framecolor - {\bgroup % nog interlinie: n TL - \setbox\scratchbox\hbox - \bgroup - \doconvertfont{#1}{}% - \PointsToBigPoints\bodyfontsize\size % x/xx, so better the actual size - \doifdefinedelse{FDF\fontstyle\fontalternative} - {\xdef\FDFattributes{\getvalue{FDF\fontstyle\fontalternative}}} - {\doifdefinedelse{FDF\fontstyle} - {\xdef\FDFattributes{\getvalue{FDF\fontstyle}}} - {\xdef\FDFattributes{\FDFrm}}}% - \doglobal\addtocommalist\FDFattributes\FDFusedfonts - \xdef\FDFattributes% move up with "x.y Ts" - {/\FDFattributes\space\size\space Tf\space\PDFcolor{#2}}% - \doifelsenothing{#3} - {\global\let\FDFsurroundings\empty} - {\xdef\FDFsurroundings{/BG \FDFcolor{#3}}}% - \doifsomething{#4} - {\xdef\FDFsurroundings{\FDFsurroundings\space /BC \FDFcolor{#4}}}% - \ifx\FDFsurroundings\empty \else - \xdef\FDFsurroundings{/MK << \FDFsurroundings\space>>}% - \fi - \egroup - \egroup} - -%D \macros -%D {setFDFactions} -%D -%D Depending on the type of the field, one can assign -%D \JAVASCRIPT\ code to a mouse event or keystroke. The next -%D preparation macro shows what events are handled. - -\let\FDFactions\empty - -\def\setFDFactions[#1,#2,#3,#4,#5,#6,#7,#8,% - {\global\let\FDFactions\empty - \setFDFaction D#1% mousedown - \setFDFaction U#2% mouseup - \setFDFaction E#3% enterregion - \setFDFaction X#4% exitregion - \setFDFaction K#5% afterkeystroke - \setFDFaction F#6% formatresult - \setFDFaction V#7% validateresult - \setFDFaction C#8% calculatewhatever - \setFDFactionsmore} - -\def\setFDFactionsmore#1,#2]% - {\setFDFaction{Fo}#1% focusin - \setFDFaction{Bl}#2% focusout % was I (now pdf ref manual explicitly talks about lowercase l) - \ifx\FDFactions\empty\else - \xdef\FDFactions{/AA << \FDFactions >>}% since 1.3 no longer inherited - \fi} - -% todo, when new var scheme is implemented -% -% \setFDFaction{PO}\@@DriverFieldPageOpen -% \setFDFaction{PC}\@@DriverFieldPageClose -% \setFDFaction{PV}\@@DriverFieldPageVisible -% \setFDFaction{PI}\@@DriverFieldPageInVisible - -%D The event handler becomes something: -%D -%D \starttyping -%D /AA << /D << /S ... >> ... /C << /S ... >> -%D /A << /S /JavaScript /JS (...) >> -%D \stoptyping - -\def\setFDFaction#1#2% - {\bgroup - \def\docommand{\xdef\FDFactions{\FDFactions /#1 << \lastPDFaction >> }}% - \@EA\handlereferenceactions\@EA{#2}\docommand % one level expansion - \egroup} - -%D \macros -%D {testFDFactions} -%D -%D This rather confusion prone series of script can be tested -%D with: -%D -%D \starttyping -%D \testFDFactions -%D \stoptyping -%D -%D which simply redefined the previous macro to one that prints -%D a message to the console. - -\def\testFDFactions - {\def\setFDFaction##1##2% - {\doPSsanitizeJScode console.show();console.println("executing:##1"); \to\sanitizedJScode - \edef\FDFactions{\FDFactions /##1 << /S /JavaScript /JS (\sanitizedJScode) >> }}} - -%D \macros -%D {doregistercalculationset} -%D -%D There is at most one calculation order list, which defines -%D the order in which fields are calculated. The calculation -%D order is defined using: - -\let\PDFcalculationset\empty - -\def\doregistercalculationset#1% - {\def\PDFcalculationset{#1}} - -%D \macros -%D {registerFDFobject,everylastshipout} -%D -%D Officially one needs to embed some general datastructures -%D that tell the viewer what fields are present in the file, as -%D well as what resources they use. The next mechanism does that -%D job automatically when one registers the field. - -\def\flushFDFnames - {\ifx\FDFcollection\empty\else - \defineFDFfonts - \createpdfarrayobject{FDF}{local:fields}{\FDFcollection}% - \doPDFgetobjectreference{FDF}{local:fields}\PDFobjectreference - % The /NeedAppearances is pretty important because - % otherwise Acrobat 5 blows up on cloned radio widgets - \createpdfdictionaryobject{FDF}{local:acroform} - {/Fields \PDFobjectreference\space - /NeedAppearances true - \doiffieldset\PDFcalculationset{/CO [\dogetfieldset\PDFcalculationset]} - /DR << /Font << \FDFfonts >> >> - /DA (/Helv 10 Tf 0 g)}% - \doPDFgetobjectreference{FDF}{local:acroform}\PDFobjectreference - \appendtopdfcatalog - {/AcroForm \PDFobjectreference}% - \global\let\FDFcollection\empty - \global\let\flushFDFnames\relax - \fi} - -\let\FDFcollection\empty - -\def\registerFDFobject#1% - {\ifx\flushFDFnames\relax - \writestatus{FDF}{second run needed for field list (#1)}% - \fi - \doPDFgetobjectreference{FDF}{#1}\PDFobjectreference - \xdef\FDFcollection{\FDFcollection\space\PDFobjectreference}} - -\appendtoksonce \flushFDFnames \to \everylastshipout % test \everybye / was \prependtoksonce - -%D \macros -%D {defineFDFfonts} -%D -%D Another datastruture concerns the fonts used. We only -%D define the fonts we use. - -\def\defineFDFfonts - {\let\FDFfonts\empty - \processcommacommand[\FDFusedfonts]\defineFDFfont} - -\def\defineFDFfont#1% - {\createpdfdictionaryobject{FDF}{local:#1} - {/Type /Font - /Subtype /Type1 - /Name /#1 - /BaseFont /\getvalue{FDFname#1}}% - \doPDFgetobjectreference{FDF}{local:#1}\PDFobjectreference - \edef\FDFfonts{\FDFfonts \space/#1 \PDFobjectreference}} - -%D Another list of constants: - -\def\FDFnameTiRo {Times-Roman} -\def\FDFnameTiBo {Times-Bold} -\def\FDFnameTiIt {Times-Italic} -\def\FDFnameTiBI {Times-BoldItalic} -\def\FDFnameHelv {Helvetica} -\def\FDFnameHeBo {Helvetica-Bold} -\def\FDFnameHeOb {Helvetica-Oblique} -\def\FDFnameHeBO {Helvetica-BoldOblique} -\def\FDFnameCour {Courier} -\def\FDFnameCoBo {Courier-Bold} -\def\FDFnameCoOb {Courier-Oblique} -\def\FDFnameCoBO {Courier-BoldOblique} - -%D \macros -%D {currentFDFmode,currentFDFparent,currentFDFkids,currenrFDFroot} -%D -%D There are three more quasi global interfacing variables -%D that need to be set. - -\let\currentFDFmode \fieldlonermode -\let\currentFDFkids \empty -\let\currentFDFparent\empty -\let\currentFDFroot \empty - -%D \macros -%D {dosetfieldstatus} -%D -%D And here comes the special that deals with them. - -\def\dosetfieldstatus#1#2#3#4% - {\chardef\currentFDFmode #1% - \edef\currentFDFparent {#2}% - \edef\currentFDFkids {#3}% - \edef\currentFDFroot {#4}} - -%D We already dealt with the encoding vector. Conversion from -%D \TEX\ \ASCII\ encoding to the other one, is accomplished by -%D the next few macros. Wach out: we don't group here. - -\appendtoksonce - \simplifycommands -\to \everysetfield - -%D \macros -%D {doPDFinsertcomment} -%D -%D An example its use is the next special, one that deals with -%D text annotations. - -\newcounter\nofFDFcomments - -\newif\ifPDFpopupcomments \PDFpopupcommentstrue - -\def\doflushcomments - {\box\PDFsymbolbox} - -\long\def\doinsertcomment#1#2#3#4#5#6#7#8% % \@@DriverCommentLayer set otherwise - {\bgroup % title width height color open symbol collect data - \presetPDFsymbolappearance{#4}{#6}{#2}{#3}\!!zeropoint% sets width/height - \doifelsenothing{#1} - {\let\PDFidentifier\empty} - {\sanitizePDFencoding#1\to\PDFcommenttitle - \def\PDFidentifier{/T <\PDFcommenttitle>}}% - \sanitizePDFencoding#8\to\PDFdata - \setFDFlayer\@@DriverCommentLayer - \startPDFsymbolappearance - \ifPDFpopupcomments - \doglobal\increment\nofFDFcomments - \doifobjectreferencefoundelse{FDF}{c:\nofFDFcomments} - {\doPDFgetobjectreference{FDF}{c:\nofFDFcomments}\PDFobjectreference - \donetrue} - \donefalse - \ifdone - \setbox\scratchbox\hbox - {\createpdfannotationobject{FDF}{c::\nofFDFcomments}{#2}{#3}% text window, size does not work - {/Subtype /Popup - /Parent \PDFobjectreference}}% - \ifcase#7\relax - \vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}% - \else % incredible trial and error hack - % it's quite a mess, the annot width cannot be set, well, it can - % but the appearance and text sizes get mixed up -% \setbox\scratchbox\vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}% -% \global\setbox\PDFsymbolbox\vbox -% {\hsize#2% -% \forgetall -% \vsmash{\box\PDFsymbolbox} -% \box\scratchbox}% - % this may change when acrobat gets less bugged - \setbox\scratchbox\vbox to #3{\forgetall\vss\box\scratchbox}% - \wd\scratchbox#2% - \global\setbox\PDFsymbolbox\vbox - {\startoverlay{\box\PDFsymbolbox}{\box\scratchbox}\stopoverlay}% - \fi - \fi - % generic - \doifobjectreferencefoundelse{FDF}{c::\nofFDFcomments} - {\doPDFgetobjectreference{FDF}{c::\nofFDFcomments}\PDFobjectreference - \donetrue} - \donefalse - \createpdfannotationobject{FDF}{c:\nofFDFcomments}{\width}{\height} - {/Subtype /Text - \ifcase#5 \else/Open true\fi - % pdftex (efficient) - % \ifdone /Popup \PDFobjref\pdflastannot\fi - % generic (less efficient) - \ifdone /Popup \PDFobjectreference\fi - /Contents <\PDFdata> - \PDFidentifier - \FDFlayer - \PDFsymbol - \PDFattributes}% - \else - \insertpdfannotation{#2}{#3} - {/Subtype /Text - \ifcase#5 \else/Open true\fi - /Contents <\PDFdata> - \FDFlayer - \PDFsymbol - \PDFidentifier - \PDFattributes}% - \fi - \stopPDFsymbolappearance - \egroup} - -% symbols with a reasonable default of 18/24 pt - -\newbox\PDFsymbolbox - -\def\PDFsymbolNew {/Insert} -\def\PDFsymbolBalloon {/Comment} -\def\PDFsymbolAddition {/NewParagraph} -\def\PDFsymbolHelp {/Help} -\def\PDFsymbolParagraph {/Paragraph} -\def\PDFsymbolKey {/Key } - -\def\PDFsymbolGraph {/Graph} -\def\PDFsymbolPaperclip {/Paperclip} -\def\PDFsymbolAttachment{/Attachment} -\def\PDFsymbolTag {/Tag} - -\def\startPDFsymbolappearance - {\setbox\scratchbox\vbox to \totalheight \bgroup \vfill} - -\def\stopPDFsymbolappearance - {\egroup - \setbox\scratchbox\hbox{\lower\depth\box\scratchbox}% - \wd\scratchbox\width - \ht\scratchbox\height - \dp\scratchbox\depth - \box\scratchbox} - -\def\presetPDFsymbolappearance#1#2#3#4#5% symbol color width height depth - {\doifelsenothing{#1} - {\let\PDFattributes\empty} - {\def\PDFattributes{/C \FDFcolor{#1}}}% - \scratchdimen#3\edef\width {\the\scratchdimen}% - \scratchdimen#4\edef\height{\the\scratchdimen}% - \scratchdimen#5\edef\depth {\the\scratchdimen}% - \advance\scratchdimen\height\edef\totalheight{\the\scratchdimen}% - \doifelsenothing{#2} - {\let\PDFsymbol\empty} - {\ifundefined{PDFsymbol#2}% - \getfromcommacommand[#2][1]\let\PDFsymbolnormalsymbol\commalistelement - \getfromcommacommand[#2][2]\let\PDFsymboldownsymbol \commalistelement - \doifsymboldefinedelse\PDFsymbolnormalsymbol - {\doifsymboldefinedelse\PDFsymboldownsymbol - {\dopresetPDFsymbolappearance - \PDFsymbolnormalsymbol\PDFsymboldownsymbol} - {\dopresetPDFsymbolappearance - \PDFsymbolnormalsymbol\PDFsymbolnormalsymbol}} - {\doifsymboldefinedelse\PDFsymboldownsymbol - {\dopresetPDFsymbolappearance - \PDFsymboldownsymbol\PDFsymboldownsymbol} - {\let\PDFsymbol\empty}}% - \else - \def\PDFsymbol{/Name \getvalue{PDFsymbol#2} }% - \fi}} - -\def\dopresetPDFsymbolappearance#1#2% - {\dopresetfieldsymbol{#1}% - \dopresetfieldsymbol{#2}% - \setbox\scratchbox\hbox{\symbol[#1]}% - \edef\width {\the\wd\scratchbox}% - \edef\height{\the\ht\scratchbox}% - \edef\depth {\the\dp\scratchbox}% - \scratchdimen\height \advance\scratchdimen\depth - \edef\totalheight{\the\scratchdimen}% - \doPDFgetobjectreference{SYM}{#1}\FDFsymbolNappearance - \doPDFgetobjectreference{SYM}{#2}\FDFsymbolDappearance - \edef\PDFsymbol - {/AP <</N \FDFsymbolNappearance /D \FDFsymbolDappearance>>}} - -%D Hooked into \CONTEXT, this special supports -%D -%D \starttyping -%D \startcomment -%D hello beautiful\\world -%D \stopcomment -%D -%D \startcomment[hello] -%D de \'e\'erste keer -%D the f\'irst time -%D \stopcommen -%D -%D \startcommentaar[hallo][color=green,width=4cm,height=3cm] -%D first -%D -%D second -%D \stopcommentaar -%D \stoptyping -%D -%D So, special characters, forced linebreaks using \type{\\} -%D and \type{\par} are handled in the appropriate way. - -%D \macros -%D {dosetuppageview} -%D -%D Because this command will seldom be called, we can permit -%D slow action processing. We need three settings, one for -%D direct \PDF\ inclusion, the other as \PDFTEX\ keyword, an -%D a last one for form. All determine in what way the -%D screen is adapted when going to a destination. Watch the -%D space. - -\def\PDFpageviewkey{fit} -\def\PDFpageviewwrd{/Fit} -\def\PDFpageview {/View [\PDFpageviewwrd] } -\def\PDFpagexyzspec{0 0 0} % hack, pdftex does handle this -\let\PDFpagexyzspec\empty % hack, pdftex does not accept spec - -\def\dosetuppageview#1% watch the v-h swapping here - {\processaction - [#1] - [ \v!fit=>\def\PDFpageviewkey {fit}\def\PDFpageviewwrd{/Fit}, - \v!width=>\def\PDFpageviewkey {fith}\def\PDFpageviewwrd{/FitH}, - \v!height=>\def\PDFpageviewkey {fitv}\def\PDFpageviewwrd{/FitV}, - \v!minwidth=>\def\PDFpageviewkey{fitbh}\def\PDFpageviewwrd{/FitBH}, - \v!minheight=>\def\PDFpageviewkey{fitbv}\def\PDFpageviewwrd{/FitBV}, - \v!standard=>\def\PDFpageviewkey{xyz \PDFpagexyzspec}\def\PDFpageviewwrd{/XYZ \PDFpagexyzspec}, - \s!unknown=>\def\PDFpageviewkey {fit}\def\PDFpageviewwrd{/Fit}]% - \edef\PDFpageview{/View [\PDFpageviewwrd]}} - -%D \macros -%D {setFDFkids} -%D -%D Clones as well as radiofields (which themselves can have -%D cloned components) need a list of kids. The next macro -%D builds one. - -\def\setFDFkids[#1][#2]% tag commalist - {\let\FDFkids\empty - \def\docommand##1% - {\doPDFgetobjectreference{FDF}{#1##1}\PDFobjectreference - \edef\FDFkids{\FDFkids\PDFobjectreference\space}}% - \@EA\processcommalist\@EA[#2]\docommand - \ifx\FDFkids\empty\else\edef\FDFkids{/Kids [\FDFkids]}\fi} - -%D \macros -%D {dopresetlinefield,dopresettextfield, -%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield, -%D dopresetpushfield,dopresetcheckfield, -%D dopresetfield,dopresetradiorecord} -%D -%D I would say: read the \PDF\ reference manual first and see -%D what happens here next. Lucky us that they have so much in -%D common. - -\def\dopresetlinefield#1#2#3#4#5#6#7#8#9% - {\bgroup - \setFDFlayer\@@DriverFieldLayer - \setFDFswitches[#7]% - \setFDFattributes[#6]% - \setFDFalignment[#8]% - \setFDFactions[#9]% - \edef\FDFtext{\hexifiedPDFstring{#4}}% - \ifcase\currentFDFmode - \createpdfannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget /T (#1) /FT /Tx - /MaxLen \ifcase0#5 1000 \else#5 \fi - %/DV (#4) /V (#4) % value added - /DV <\FDFtext> /V <\FDFtext> - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Q \FDFalign\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \setFDFkids[kids:][\currentFDFkids]% - \createpdfdictionaryobject{FDF}{#1} - {/T (#1) /FT /Tx - /MaxLen \ifcase0#5 1000 \else#5 \fi - \FDFkids\space - %/DV (#4) /V (#4) % value added - /DV <\FDFtext> /V <\FDFtext> - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Q \FDFalign\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Q \FDFalign\space - \FDFactions}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /F \FDFplus - \FDFactions}% - \fi - \egroup} - -\def\dopresettextfield#1#2#3#4#5#6#7#8#9% - {\dopresetlinefield{#1}{#2}{#3}{#4}{#5}{#6}{MultiLine,#7}{#8}{#9}} - -\def\dopresetchoicefield#1#2#3#4#5#6#7#8% - {\bgroup - \setFDFlayer\@@DriverFieldLayer - \setFDFswitches[#6]% - \setFDFattributes[#5]% - \setFDFvalues[#7][#4]% - \setFDFactions[#8]% - \ifcase\currentFDFmode - \createpdfannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget - /T (#1) /FT /Ch - /DV (#4) /V (#4) - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Opt [\FDFvalues] - \FDFactions}% - \registerFDFobject{#1}% - \or - \setFDFkids[kids:][\currentFDFkids]% - \createpdfdictionaryobject{FDF}{#1} - {/T (#1) /FT /Ch - \FDFkids\space - /DV (#4) /V (#4) - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Opt [\FDFvalues] - \FDFactions}% - \registerFDFobject{#1}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - \FDFactions}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /F \FDFplus - \FDFactions}% - \fi - \egroup} - -\def\dopresetpopupfield#1#2#3#4#5#6#7#8% - {\dopresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,#6}{#7}{#8}} - -\def\dopresetcombofield#1#2#3#4#5#6#7#8% - {\dopresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,Edit,#6}{#7}{#8}} - -\newif\ifFDFvalues - -\def\doFDFpresetpushcheckfield#1#2#3#4#5#6#7#8% in acro<5 (\FDFdefault) - {\bgroup % in acro>5 /\FDFdefault - \setFDFlayer\@@DriverFieldLayer - \ifcase#8\relax\FDFvaluesfalse\else\FDFvaluestrue\fi - \setFDFswitches[#5]% - \setFDFactions[#7]% - \doifelse{#4}{1} - {\def\FDFdefault{On}} - {\def\FDFdefault{Off}}% - \ifcase\currentFDFmode - \doFDFappearance{On}{#6}{#8}% - \createpdfannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget /T (#1) /FT /Btn - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - \FDFlayer - /Ff \FDFflag\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space -% /IF << /SW /N >> % strange, only works for stupid buttons - \FDFactions}% - \registerFDFobject{#1}% - \or % no appearance and layer ? - \setFDFkids[kids:][\currentFDFkids]% - \createpdfdictionaryobject{FDF}{#1} - {/T (#1) /FT /Btn - \FDFkids\space - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - /Ff \FDFflag\space - /F \FDFplus\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \doFDFappearance{On}{#6}{#8}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - /Ff \FDFflag\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \or - \doFDFappearance{On}{#6}{#8}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /F \FDFplus\space - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - \FDFlayer\space - \FDFappearance - \FDFactions}% - \fi - \egroup} - -\def\dopresetpushfield#1#2#3#4#5#6#7% - {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{PushButton,#5}{#6}{#7}{0}} - -\def\dopresetcheckfield#1#2#3#4#5#6#7% - {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{#5}{#6}{#7}{1}} - -\def\dopresetradiofield#1#2#3#4#5#6#7#8% - {\bgroup - \setFDFlayer\@@DriverFieldLayer - \FDFvaluestrue - \setFDFswitches[#5]% - \setFDFactions[#8]% - \doifelsenothing{#4} - {\def\FDFdefault{Off}} - {\def\FDFdefault{#4}}% - \@EA\aftersplitstring\FDFdefault\at=>\to\FDFdefaultvalue - \ifx\FDFdefaultvalue\empty\else\let\FDFdefault\FDFdefaultvalue\fi - \ifcase\currentFDFmode - \doFDFappearance{#1}{#7}{1}% - \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference - \createpdfannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /F \FDFplus\space - /AS /\FDFdefault\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \setFDFkids[kids:][\currentFDFkids]% - \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference - \createpdfdictionaryobject{FDF}{#1} - {/Parent \PDFobjectreference\space - \FDFkids\space - /F \FDFplus\space - \FDFactions}% - \registerFDFobject{#1}% - \or - %\doFDFappearance{#1}{#7}{1}% - \doFDFappearance{\currentFDFparent}{#7}{1}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue % nb - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /AS /\FDFdefault\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \or - %\doFDFappearance{#1}{#7}{1}% - \doFDFappearance{\currentFDFparent}{#7}{1}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \createpdfannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /AS /\FDFdefault\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \fi - \egroup} - -% Beware, RadiosInUnison is really needed in the pre 1.5/6 time this -% was the default but out of a sudden it's no longer the case. Also -% the NoToggleToOff interferes with kids of kids and both it will -% break older documents, i.e. so much for pdf as standard. With -% features like widgets we can probably best wait till adobe tools -% themselves support it because that's probably the moment that -% functionality gets frozen/becomes definitive. Actually, acrobat -% flattens the kids tree, so that's yet another situation. The -% interesting thing is that it worked ok in acrobat 2/3 but got bugged -% in later versions. [The rationale is in html compatibility, which -% seems to be more important than compatibility of documents, which in -% turn renders acrobat useless for forms.] Anyway, synchronization is -% broken or not depending on the combination pdfversion/acrobatversion. - -\def\dopresetradiorecord#1#2#3#4#5% - {\bgroup - % < pdf 1.5 (1.5 was broken) - % \setFDFswitches[Radio,NoToggleToOff,RadiosInUnison,#3]% - % > pdf 1.5 - \setFDFswitches[Radio,RadiosInUnison,#3]% - % older, else fatal error - % \setFDFkids[#4][]% - % newer - \setFDFvalues[#4][#2]% inits kidlist - \expanded{\setFDFkids[][\FDFkidlist]}% - % - \setFDFactions[#5]% - \createpdfdictionaryobject{FDF}{#1} - {%/Subtype /Widget - /FT /Btn /T (#1) /Rect [0 0 0 0] - % used to be this - % /V (#2) - % then this - % /DV (#2) - % since this bomded in 5 - % /V (#2) - % and now finally this works - /H /N - % /opt is buggy in 5.05, only works once, sigh - %\ifx\FDFfirstvalues\FDFsecondvalues - /V /#2 - %\else - % /V /\FDFdefaultindex\space - % /Opt [\FDFsecondvalues] - %\fi - /Ff \FDFflag\space - /F \FDFplus\space - \FDFkids\space - \FDFactions}% - \egroup} - -%D At the cost of some more references, we can save bytes, -%D by sharing appearance dictionaries. This code needs more -%D documentation. Surprise: - -\def\dodoFDFappearance#1#2% - {\ifx#2\empty\else - \dogetcommacommandelement1\from#2\to\commalistelement - \ifx\commalistelement\empty\else - \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference - \edef\N{\ifFDFvalues\N /#1 \fi\PDFobjectreference\space}% - \fi - \dogetcommacommandelement2\from#2\to\commalistelement - \ifx\commalistelement\empty\else - \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference - \edef\R{\ifFDFvalues\R /#1 \fi\PDFobjectreference\space}% - \fi - \dogetcommacommandelement3\from#2\to\commalistelement - \ifx\commalistelement\empty\else - \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference - \edef\D{\ifFDFvalues\D /#1 \fi\PDFobjectreference\space}% - \def\FDFappearance{/H /P }% - \fi - \fi} - -\def\redoFDFappearance#1% - {\ifx#1\empty\else - \dogetcommacommandelement3\from#1\to\commalistelement - \ifx\commalistelement\empty\else - \def\FDFappearance{/H /P }% - \fi - \fi} - -\def\doFDFappearance#1#2#3% - {\ifcase#3\relax % push only field - \edef\yes{#2}% - \let\no\empty - \else % on / off field - \dogetcommacommandelement1\from#2,\to\yes - \dogetcommacommandelement2\from#2,\to\no - \fi - \def\FDFappearance{/H /N}% - \doifobjectfoundelse{FDF}{ap:#1:\yes:\no} - {\redoFDFappearance\yes - \redoFDFappearance\no} - {\presetobject{FDF}{ap:#1:\yes:\no}% funny hack - \let\N\empty\let\R\empty\let\D\empty - \dodoFDFappearance{#1}\yes - \dodoFDFappearance{Off}\no - \createpdfdictionaryobject{FDF}{ap:#1:\yes:\no} - {\ifx\N\empty\else/N \ifFDFvalues<<\N>>\else\N\fi\fi - \ifx\R\empty\else/R \ifFDFvalues<<\R>>\else\R\fi\fi - \ifx\D\empty\else/D \ifFDFvalues<<\D>>\else\D\fi\fi}}% - \doPDFgetobjectreference{FDF}{ap:#1:\yes:\no}\PDFobjectreference - \edef\FDFappearance{\FDFappearance /AP \PDFobjectreference}} - -\def\doFDFdefault#1#2% - {\doifelse{#2}{1}{\def\FDFdefault{On}}{\def\FDFdefault{Off}}} - -%D Layer support: - -\def\setFDFlayer#1% todo : \ifx\PDFobjectreference\noPDFobjectreference ipv found - {\letempty\FDFlayer - \doifsomething{#1}% - {\checkproperty[#1]% == \dodocheckproperty\@@DriverFieldLayer - \doifobjectreferencefoundelse{PDLN}{#1} - {\doPDFgetobjectreference{PDLN}{#1}\!!stringa % we need to avoid a clash with other macros - \edef\FDFlayer{/OC \!!stringa}}% - \donothing}} - -%D The three appearances {\em normal}, \type{roll over} and -%D \type{push down} are passed as comma separated triplets, -%D that is, the second argument can look like: -%D -%D \starttyping -%D {yes,ok,fine},{no,rubish,awful} -%D \stoptyping - -%D \macros -%D {dodefinefieldset,dogetfieldset,doiffieldset} -%D -%D Field sets, the ones we use in submitting and resetting -%D fields, are implemented using the next low level specials: -%D -%D \starttyping -%D \doFDFdefinefieldset{TAG}{name,name,...} -%D \doFDFgetfieldset{TAG} -%D \doiffieldset{TAG}{sequence} -%D \stoptyping - -\def\dodefinefieldset#1#2% tag commalist - {\let\FDFfieldset\empty - \def\docommand##1% - {\doPDFgetobjectreference{FDF}{##1}\PDFobjectreference - \edef\FDFfieldset{\FDFfieldset\PDFobjectreference\space}}% - \processcommacommand[#2]\docommand % nb: command - \setevalue{FDF:set:#1}{\FDFfieldset}} - -\def\dogetfieldset#1% - {\getvalue{FDF:set:#1}} - -\def\doiffieldset#1#2% - {\ifundefined{FDF:set:#1}\else#2\fi} - -%D \macros -%D {defaultobjectreference,doPDFgetobjectreference} -%D -%D Because in \PDFTEX\ we have to construct the object -%D references \type{N 0 R}, we can default to the non existing -%D zero object number. - -\def\defaultobjectreference#1#2% - {0} - -\def\doPDFgetobjectreference#1#2#3% - {\dogetobjectreference{#1}{#2}#3% - \edef#3{\ifx#3\empty null\else\PDFobjref{#3}\fi}} - -\def\doPDFgetobjectnumber#1#2#3% - {\dogetobjectreference{#1}{#2}#3% - \edef#3{\ifx#3\empty 0\else#3\fi}} + {\dogetobjectreference{#1}{#2}\PDFobjectreference\pdfrefxform\PDFobjectreference}% + \donothing + \endgroup} \def\doPDFgetobjectpage#1#2#3% {\dogetobjectreferencepage{#1}{#2}#3% - \ifx#3\empty\def#3{1}\fi} + \ifx#3\empty\def#3{\realfolio}\fi} \def\doPDFgetobjectpagereference#1#2#3% {\dogetobjectreferencepage{#1}{#2}#3% - \ifx#3\empty - \doPDFgetpagereference\realfolio#3% - \else - \doPDFgetpagereference#3#3% we assume that #3 gets expanded - \fi} - -\def\doPDFgetpagereference#1#2% number macro - {\edef#2{\ifnum#1>\zerocount\PDFobjref{\pdfpageref#1}\else null\fi}} - -\def\thePDFpagereference#1#2% number macro - {\ifnum#1>\zerocount\PDFobjref{\pdfpageref#1}\else null\fi} - -%D \macros -%D {initializePDFnegative,initializePDFoverprint} -%D -%D Here follow some rather obscure macros. They will only -%D come into action when one wants negated output. - -\def\initializePDFnegative - {\immediate\pdfobj stream attr {/FunctionType 4 /Range [0 1] /Domain [0 1]} {{1 exch sub}}% - \immediate\pdfobj{<</Type /ExtGState /TR \PDFobjref\pdflastobj>>}% - \appendtoPDFdocumentextgstates{/GSnegative \PDFobjref\pdflastobj}% - \immediate\pdfobj{<</Type /ExtGState /TR /Identity>>}% - \appendtoPDFdocumentextgstates{/GSpositive \PDFobjref\pdflastobj}% - \global\let\initializePDFnegative\relax} - -\def\initializePDFoverprint - {\immediate\pdfobj{<</Type /ExtGState /OP false /OPM 0>>}% /op defaults to /OP - \appendtoPDFdocumentextgstates{/GSknockout \PDFobjref\pdflastobj}% - \immediate\pdfobj{<</Type /ExtGState /OP true /OPM 1>>}% /op defaults to /OP - \edef\PDFobjectreferenceB{\the\pdflastobj}% - \appendtoPDFdocumentextgstates{/GSoverprint \PDFobjref\pdflastobj}% - \global\let\initializePDFoverprint\relax} - -%D File embedding. Storing the stream identifier is needed -%D to get access to the number. When typeset, the user can -%D feed this number to \type {pdftosrc} and filter the -%D file from the \PDF\ file. - -\let\PDFlaststreamobject \s!unknown -%def\PDFlaststreamreference{0 0 R} - -\def\doPDFfilestreamobject#1#2#3#4% - {\immediate\pdfobj stream file{#4}% - \edef\PDFlaststreamobject{\the\pdflastobj}% - \dosetobjectreference{PDFFS}{#2}{\PDFlaststreamobject}% - \createpdfdictionaryobject{#1}{#2}{/Type /Filespec /F (#3) /EF <</F \PDFobjref\PDFlaststreamobject>>}} - -\def\doPDFgetfilestreamreference#1#2% - {\doPDFgetobjectreference{PDFFS}{#1}#2} - -\def\doPDFfilestreamidentifier#1% - {\doifsomething{#1} - {\doPDFgetfilestreamreference{#1}\PDFobjectreference - \@EA\beforesplitstring\PDFobjectreference\at{ }\to\PDFlaststreamobject - \PDFlaststreamobject}} - -% MP ? - - \def\setMPPDFobject#1#2% resources boxnumber - {\the\everyPDFxform - \finalizeobjectbox{#2}% - \immediate\pdfxform resources{#1}#2% - \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}} - - \let\getMPPDFobject\relax - - \def\doinsertMPfile#1% - {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}} - -%D Even newer trickery: - -% resource -> prop -> mc's -> OCG|OCMD (nested) -% ocg: -% /Intent/Design -% ocmd -% /P /AllOn -% kan zelf ocmd bevatten - -\let\PDFtextlayers\empty -\let\PDFpagelayers\empty -\let\PDFhidelayers\empty -\let\PDFvidelayers\empty - -\def\dostartlayer#1{\PDFcode{/OC /#1 BDC}} -\def\dostoplayer {\PDFcode {EMC}} - -\def\dodefineviewerlayer#1#2#3#4#5% tag title visible type printable - {\createpdfdictionaryobject{PDLN}{#1} - {/Type /OCG - \ifcase#4 \or - /Intent /Design % disable layer hiding by user - \fi - \ifnum#5=\zerocount - /Usage << /Print << /PrintState /OFF >> >> % printable or not - \fi - /Name (#2)}% - \doPDFgetobjectreference{PDLN}{#1}\PDFobjectreference - \xdef\PDFtextlayers{\PDFtextlayers\space\PDFobjectreference}% - \doifelse{#3}\v!start - {\xdef\PDFvidelayers{\PDFvidelayers\space\PDFobjectreference}}% - {\xdef\PDFhidelayers{\PDFhidelayers\space\PDFobjectreference}}% - \createpdfdictionaryobject{PDLD}{#1} - {/Type /OCMD - /OCGs [\PDFobjectreference]}% - \doPDFgetobjectreference{PDLD}{#1}\PDFobjectreference - \xdef\PDFpagelayers{\PDFpagelayers\space /#1 \PDFobjectreference}} - -\def\flushPDFtextlayers - {\ifx\PDFtextlayers\empty \else - \driverreferenced \createpdfarrayobject{PDF}{textlayers}{\PDFtextlayers}% - \doPDFgetobjectreference{PDF}{textlayers}\!!stringa - \ifx\PDFvidelayers\empty - \def\!!stringb{[null]}% - \else - \driverreferenced \createpdfarrayobject{PDF}{videlayers}{\PDFvidelayers}% - \doPDFgetobjectreference{PDF}{videlayers}\!!stringb - \fi - \ifx\PDFhidelayers\empty - \def\!!stringc{[null]}% - \else - \driverreferenced \createpdfarrayobject{PDF}{hidelayers}{\PDFhidelayers}% - \doPDFgetobjectreference{PDF}{hidelayers}\!!stringc - \fi - \appendtopdfcatalog - {/OCProperties - << % display in menu - /D << /Order \!!stringa - /ON \!!stringb - /OFF \!!stringc >> - % used properties - /OCGs \!!stringa >>}% - \globallet\flushPDFtextlayers\relax - \fi} - -\def\flushPDFpagelayers - {\ifx\PDFpagelayers\empty \else - \appendtopdfpageresources{/Properties <<\PDFpagelayers>>}% - \fi} - -\def\PDFlayeractionlist{null} - -\def\PDFexecutehidelayer {/SetOCGState /State [/OFF \PDFlayeractionlist]} -\def\PDFexecutevidelayer {/SetOCGState /State [/ON \PDFlayeractionlist]} -\def\PDFexecutetogglelayer {/SetOCGState /State [/Toggle \PDFlayeractionlist]} - -\def\domakeviewerlayerlist#1% - {\bgroup - \globallet\PDFlayeractionlist\empty - \def\docommand##1% - {\doPDFgetobjectreference{PDLN}{##1}\PDFobjectreference - \xdef\PDFlayeractionlist{\PDFlayeractionlist\space\PDFobjectreference}}% - \processcommalist[#1]\docommand - \egroup} - -%D Something rather pdf dependent: - -% #1 => 1=fill 2=stroke 3=strokedfill 4=invisible -% #2 => linewidth -% #3 => spacing (beware, one needs to set the hsize as well) - -\def\dostartfonteffect#1#2#3% - {\ifdim#2>\zeropoint - \PointsToBigPoints{#2}\ascii - \PDFcode{\ascii\space w}% - \fi - \ifdim#3\points=\onepoint\else - \scratchdimen#3\points - \PDFcode{\withoutpt{\the\scratchdimen}\space Tc}% - \fi - \PDFcode{\purenumber#1 Tr}} - -\def\dostopfonteffect - {\PDFcode{1 w 0 Tc 0 Tr}} - -%D Handy for the \METAPOST\ to \PDF\ converter: - -\appendtoksonce - \collectPDFresources - \global\let\currentPDFresources\collectedPDFresources -\to \everyPDFxform - -\let\collectedPDFresources\empty - -\def\collectPDFresources % suboptimal - {\doifobjectreferencefoundelse{FDF}{docushades} % redundant, we have an reserved object now - {\doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference - \xdef\collectedPDFresources{\collectedPDFresources/Shading \PDFobjectreference}}\donothing - \doifobjectreferencefoundelse{FDF}{docuextgstates} - {\doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference - \xdef\collectedPDFresources{\collectedPDFresources/ExtGState \PDFobjectreference}}\donothing - \doifobjectreferencefoundelse{FDF}{colorspaces} - {\doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference - \xdef\collectedPDFresources{\collectedPDFresources/ColorSpace \PDFobjectreference}}\donothing - \global\let\collectPDFresources\relax} - -\appendtoks - \flushPDFpagelayers - \flushJSpreamble - \flushJSpreamble - \checkPDFextgstates - \checkPDFcolorspaces - \checkPDFshades - \checkPDFpageactions - \fakePDFpagedestination - \flushPDFpageboxes - \addPDFdocumentinfo -\to \everybackendshipout - -\appendtoks - \flushPDFtextlayers - \finalflushJSpreamble -\to \everylastbackendshipout - -%D Temporary hack: - -\def\TransparencyHack % png: /CS /DeviceRGB /I true - {\appendtoksonce - \appendtopdfpageattributes{/Group << /S /Transparency /I true /K true>>}% - \to \everyPDFxform - \appendtoksonce - \appendtopdfpageattributes{/Group << /S /Transparency /I true /K true>>}% - \to \everyshipout} + \doPDFgetpagereference{\ifx#3\empty\realfolio\else#3\fi}#3} + +\def\predefinesymbol[#1]% + {\begingroup + \setobject{SYM}{#1}\hbox{\symbol[#1]}% + \dogetobjectreference{SYM}{#1}\lastref + \ctxlua{backends.codeinjections.registersymbol("#1",\lastref)}% + \endgroup} \protect \endinput diff --git a/tex/context/base/bibl-bib.tex b/tex/context/base/bibl-bib.mkiv index 51db67ed7..51db67ed7 100644 --- a/tex/context/base/bibl-bib.tex +++ b/tex/context/base/bibl-bib.mkiv diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua index 4be320f76..5b13f669a 100644 --- a/tex/context/base/buff-ini.lua +++ b/tex/context/base/buff-ini.lua @@ -31,6 +31,10 @@ local ctxcatcodes = tex.ctxcatcodes local data, commands, flags, hooks, visualizers = buffers.data, buffers.commands, buffers.flags, buffers.hooks, buffers.visualizers +function buffers.raw(name) + return data[name] or { } +end + function buffers.erase(name) data[name] = nil end @@ -484,3 +488,48 @@ function buffers.flush_result(result,nested) texsprint(ctxcatcodes,concat(result,"")) end end + +-- THIS WILL BECOME A FRAMEWORK: the problem with prety printing is that +-- we deal with snippets and therefore we need tolerant parsing + +--~ local type = type + +--~ visualizers = visualizers or { } + +--~ local function fallback(s) return s end + +--~ function visualizers.visualize(visualizer,kind,pattern) +--~ if type(visualizer) == "table" and type(kind) == "string" then +--~ kind = visualizer[kind] or visualizer.default or fallback +--~ else +--~ kind = fallback +--~ end +--~ return (lpeg.C(pattern))/kind +--~ end + +--~ local flusher = texio.write +--~ local format = string.format + +--~ local visualizer = { +--~ word = function(s) return flusher(format("\\bold{%s}",s)) end, +--~ number = function(s) return flusher(format("\\slanted{%s}",s)) end, +--~ default = function(s) return flusher(s) end, +--~ } + +--~ local word = lpeg.R("AZ","az")^1 +--~ local number = lpeg.R("09")^1 +--~ local any = lpeg.P(1) + +--~ local pattern = lpeg.P { "start", +--~ start = ( +--~ visualizers.visualize(visualizer,"word",word) + +--~ visualizers.visualize(visualizer,"number",number) + +--~ visualizers.visualize(visualizer,"default",any) +--~ )^1 +--~ } + +--~ str = [[test 123 test $oeps$]] + +--~ pattern:match(str) + + diff --git a/tex/context/base/buff-ini.mkiv b/tex/context/base/buff-ini.mkiv index c9c1ae052..29ce4687d 100644 --- a/tex/context/base/buff-ini.mkiv +++ b/tex/context/base/buff-ini.mkiv @@ -15,6 +15,41 @@ \registerctxluafile{buff-ini}{1.001} +% todo: +% +% \startluacode +% local locations = { } +% function document.set_number(name) +% locations[name] = { +% line = status.linenumber, +% file = status.filename +% } +% end +% function document.add_number(name) +% local b, l = buffers.raw(name), locations[name] +% if b and l then +% for i=1,#b do +% b[i] = string.gsub(b[i],"# line: <number>","# line: " .. l.line + 2) +% end +% end +% end +% \stopluacode +% +% \starttext +% +% \ctxlua{document.set_number("oeps")} +% \startbuffer[oeps] +% # line: <number> +% +% test +% test +% \stopbuffer +% \ctxlua{document.add_number("oeps")} +% +% \typebuffer[oeps] +% +% \stoptext + \ifdefined\doinitializeverbatim \else% temp hack \ifdefined\mkinitializeverbatim \let\doinitializeverbatim\mkinitializeverbatim diff --git a/tex/context/base/buff-ver.mkii b/tex/context/base/buff-ver.mkii index c9ad8cbc9..8c2929a4b 100644 --- a/tex/context/base/buff-ver.mkii +++ b/tex/context/base/buff-ver.mkii @@ -60,7 +60,7 @@ \restorecatcodes % also needed when loading during \newpretty \startreadingfile % restore < and > if needed \lowercasestring verb-\prettyidentifier.tex\to\filename - \readsysfile\filename\donothing\donothing + \readsysfile{\filename.mkii}\donothing\donothing \stopreadingfile \stopnointerference}% \doifdefinedelse{setuppretty\prettyidentifier type}% diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv index aed357de8..53ad235fe 100644 --- a/tex/context/base/buff-ver.mkiv +++ b/tex/context/base/buff-ver.mkiv @@ -142,7 +142,6 @@ \def\obs{\obeyedspace}% \ctxlua{buffers.doifelsevisualizer("\prettyidentifier")} {\ctxlua{buffers.setvisualizer("\prettyidentifier")}% - \localcolortrue % tricky, maybe not here \def\bop{\bgroup\beginofpretty}% \def\eop{\endofpretty\egroup}% \def\sop{\endofpretty\egroup\bgroup\beginofpretty}}% @@ -568,14 +567,14 @@ \ctxlua{buffers.typefile("\readfilename")}% #2} -\def\dotypeblockverbatim#1#2% +\unexpanded\def\dotypeblockverbatim#1#2% {\dowithbuffer{_typing_}{#1}{#2} {} {\doinitializeverbatim \beginofverbatimlines \ctxlua{buffers.type("_typing_")}% \endofverbatimlines - \getvalue{\strippedcsname#2}}} + \csname#2\endcsname}} \def\dododostarttyping[#1]% {\typingparameter\c!before @@ -583,7 +582,7 @@ \dosetuptypelinenumbering{#1}% \initializetyping \startverbatimcolor - \expanded{\dotypeblockverbatim{\s!start\currenttyping}{\s!stop\currenttyping}}} + \normalexpanded{\dotypeblockverbatim{\e!start\currenttyping}{\e!stop\currenttyping}}} % was s!start \def\dostoptyping#1% hm, currenttyping {\stopverbatimcolor @@ -753,8 +752,9 @@ \fi\fi} \def\dosetuptypelinenumbering#1% fuzzy - {\doifundefined{\currenttypingclass\currenttyping\c!start} - {\setuptyping[\currenttyping][\c!start=1,\c!stop=,\c!step=1,\c!nlines=]}% + {\ifcsname\currenttypingclass\currenttyping\c!start\endcsname \else + \setuptyping[\currenttyping][\c!start=1,\c!stop=,\c!step=1,\c!nlines=]% + \fi \setuptyping[\currenttyping][#1]% \doifelse{\typingparameter\c!numbering}\v!file {% kind of special: filters lines ! @@ -804,11 +804,13 @@ \settypingparameter\c!option{\prettyidentifier}}% \initializetyping \startverbatimcolor - \doifundefinedelse{\currenttypingclass#3\v!global\c!start} - {\scratchcounter\zerocount} - {\scratchcounter\getvalue{\currenttypingclass#3\v!global\c!start}}% - \advance\scratchcounter\plusone - \setxvalue{\currenttypingclass#3\v!global\c!start}{\the\scratchcounter}% + \scratchcounter + \ifcsname\currenttypingclass#3\v!global\c!start\endcsname + \numexpr\csname\currenttypingclass#3\v!global\c!start\endcsname+\plusone\relax + \else + \plusone + \fi + \setxvalue{\currenttypingclass#3\v!global\c!start}{\the\scratchcounter}% no direct setxvalue as it defines beforehand \doifelsenothing{\typingparameter\c!start} {#4} {\doif{\typingparameter\c!start}\v!continue diff --git a/tex/context/base/catc-ctx.tex b/tex/context/base/catc-ctx.tex index 028ae496c..83e802e77 100644 --- a/tex/context/base/catc-ctx.tex +++ b/tex/context/base/catc-ctx.tex @@ -205,3 +205,46 @@ \let\xmlcatcodes \xmlcatcodesn \endinput + +% under consideration: +% +% \newcatcodetable\txtcatcodes +% +% \startcatcodetable \txtcatcodes +% \catcode`\^^I = 10 +% \catcode`\^^M = 5 +% \catcode`\^^L = 5 +% \catcode`\ = 10 +% \catcode`\\ = 0 +% \catcode`\{ = 1 +% \catcode`\} = 2 +% \stopcatcodetable +% +% \newcount\relaxedcatcodedepth +% +% \def\startrelaxedcatcodes +% {\global\chardef\relaxedcatcodeparent\catcodetable +% \global\advance\relaxedcatcodedepth\plusone +% \nonknuthmode\setcatcodetable\txtcatcodes} +% +% \def\stoprelaxedcatcodes +% {\ifcase\relaxedcatcodedepth +% % error +% \or +% \setcatcodetable\relaxedcatcodeparent +% \global\relaxedcatcodedepth\zerocount +% \else +% \global\advance\relaxedcatcodedepth\minusone +% \setcatcodetable\txtcatcodes +% \fi} +% +% \starttext +% +% \startrelaxedcatcodes +% \startcomment test \stopcomment +% test $ test 10% whatever|test \mathematics{x^2=1} +% \stoprelaxedcatcodes +% +% $x^2=1$ +% +% \stoptext diff --git a/tex/context/base/catc-sym.tex b/tex/context/base/catc-sym.tex index 49d94815c..da6c9c068 100644 --- a/tex/context/base/catc-sym.tex +++ b/tex/context/base/catc-sym.tex @@ -115,4 +115,73 @@ \egroup +%D (Inspired by a discussion on the \CONTEXT\ mailing list) +%D +%D In \TEX\ each character can have one of 16 catcodes. This way the +%D backslash, dollar, ampersand, hash and some more characters get +%D their special meaning. If you want to process tokens under a +%D certain catcode regime, passing arguments can interfere badly. +%D +%D \startbuffer[a] +%D \def\whatever#1{[#1]} +%D \whatever{whatever \type {\whatever{you want}} $or$ not!} +%D \stopbuffer +%D +%D \typebuffer[a] +%D +%D Here we pass an argument to \type {\whatever} but part of that +%D argument is to be processed under a different catcode regime, i.e.\ +%D all characters that need to be typeset verbatim need to get +%D the catcode that makes it a letter. This is what we get when we typeset +%D the text verbatim: +%D +%D \starttyping +%D whatever \type {\whatever{you want}} $or$ not! +%D \stoptyping +%D +%D However, when passed to \type {\whatever} we get: +%D +%D \getbuffer[a] +%D +%D In \ETEX\ one can use \type {\scantokens} to circumvent this problem. +%D +%D \startbuffer[b] +%D \def\rescan#1{\scantokens{#1}} +%D \def\whatever#1{[\rescan{#1}]} +%D \whatever{whatever \type {\whatever{you want}} $or$ not!} +%D \stopbuffer +%D +%D \getbuffer[b] \typebuffer[b] +%D +%D This time the \type {\whatever} call gives: +%D +%D \getbuffer[b] +%D +%D In this example, two spaces have crept in. The first one, after the +%D macro name, is inserted by \TEX\ and cannot be avoided. The last space +%D is inserted by \type {\scantokens}, and is the consequence of the fact +%D that this macro mimics reading from a file. You can avoid the last +%D space by a slightly different definition: +%D +%D \startbuffer[c] +%D \def\rescan#1{\scantokens{#1\ignorespaces}} +%D \def\whatever#1{[\rescan{#1}]} +%D \whatever{whatever \type {\whatever{you want}} $or$ not!} +%D \stopbuffer +%D +%D \typebuffer[c] +%D +%D Unfortunately we still keep the first space, but at least it's better than +%D a failure: +%D +%D \getbuffer[c] + +\long\def\rescan#1{\scantokens{#1\ignorespaces}} +\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup} + +\ifx\scantextokens\undefined \else + \long\def\rescan#1{\scantextokens{#1}} + \long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup} +\fi + \protect \endinput diff --git a/tex/context/base/colo-ext.mkiv b/tex/context/base/colo-ext.mkiv index 06facd34e..274086bb6 100644 --- a/tex/context/base/colo-ext.mkiv +++ b/tex/context/base/colo-ext.mkiv @@ -32,7 +32,7 @@ \def\negatecolorbox#1% {\setbox#1\hbox {\dostartnegative - \localstartcolor[white]\vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1\localstopcolor + \startcolor[white]\vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1\stopcolor \hskip-\wd#1% \box#1% \dostopnegative}} diff --git a/tex/context/base/colo-hex.mkii b/tex/context/base/colo-hex.mkii index dac2e46d0..7cef6e8a2 100644 --- a/tex/context/base/colo-hex.mkii +++ b/tex/context/base/colo-hex.mkii @@ -38,7 +38,17 @@ \unprotect -\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr(1pt/256) +% \definecolor[rgbtestcolor] [r=0.87843,g=0.87451,b=0.89020] % RGB(224,223,227) +% \definecolor[hextestcolor] [h=E0DFE3] +% +% \startMPpage +% path p ; % example by Peter Rolf +% p := unitsquare xyscaled(5cm,5cm) ; +% fill (point 0 of p -- point 1 of p -- point 2 of p --cycle) withcolor \MPcolor{rgbtestcolor} ; % bottom right part of the square +% fill (point 0 of p -- point 3 of p -- point 2 of p --cycle) withcolor \MPcolor{hextestcolor} ; % top left part +% \stopMPpage + +\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr1pt/255\relax \chardef\hexcolorprefix=`# @@ -49,7 +59,7 @@ \def\hexcolorcomponent#1#2% {\ifnum\dohexstringtonumber#1#2=\zerocount0\else\ifnum\dohexstringtonumber#1#2=\plusone1\else - \expandafter\withoutpt\the\dimexpr(\dohexstringtonumber#1#2\hexcolorfraction)% + \expandafter\withoutpt\the\dimexpr\dohexstringtonumber#1#2\hexcolorfraction\relax \fi\fi} \def\dohexcolorspec#1#2#3#4#5#6#7#8\relax @@ -98,7 +108,7 @@ \def\colorhexcomponent#1% {\ifdim#1\points<.005\points - 00\else\lchexnumbers{\the\dimexpr(255\dimexpr(#1\points)\relax+.5\points)\relax}% + 00\else\lchexnumbers{\the\dimexpr255\dimexpr#1\points\relax+.5\points\relax}% \fi} % the faster one @@ -109,7 +119,7 @@ \def\colorhexcomponent#1% {\ifdim#1\points<\hex@color@a - 00\else\lchexnumbers{\the\dimexpr(#1\points*\hex@color@c+\hex@color@b)\relax}% + 00\else\lchexnumbers{\the\dimexpr#1\points*\hex@color@c+\hex@color@b\relax}% \fi} \protect \endinput diff --git a/tex/context/base/colo-hex.mkiv b/tex/context/base/colo-hex.mkiv index b31321b7e..dd8e03938 100644 --- a/tex/context/base/colo-hex.mkiv +++ b/tex/context/base/colo-hex.mkiv @@ -11,105 +11,16 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D Not yet supported in \MKIV. +%D This is built in. -\endinput - -\writestatus{loading}{ConTeXt Color Macros / Hexadecimal} - -% \edef\testcolor{\string#FFC0C0} -% \edef\testcolor{\string#55} -% -% \setupcolors[state=start] -% -% \expanded{\definecolor[thehexcolor][\hexcolorspec\testcolor]} -% -% \checkhexcolor[\testcolor] -% -% \definecolor[thehexcolor][\testcolor] -% -% \starttext +% \definecolor[rgbtestcolor] [r=0.87843,g=0.87451,b=0.89020] % RGB(224,223,227) +% \definecolor[hextestcolor] [\letterhash E0DFE3] % or [h=E0DFE3] % -% test \color[thehexcolor]{rood} -% test \color[red]{rood} -% test \color[\testcolor]{rood} -% -% \stoptext - -\unprotect - -\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr1pt/256\relax - -\chardef\hexcolorprefix=`# - -\def\hexcolorspec #1{\expandafter\dohexcolorspec #1\empty\empty\empty\empty\relax} -\def\hexcolorpattern#1{\expandafter\dohexcolorpattern#1\empty\empty\empty\empty\relax} - -\ifx\dohexstringtonumber\undefined \def\dohexstringtonumber{"} \fi - -\def\hexcolorcomponent#1#2% - {\ifnum\dohexstringtonumber#1#2=\zerocount0\else\ifnum\dohexstringtonumber#1#2=\plusone1\else - \expandafter\withoutpt\the\dimexpr(\dohexstringtonumber#1#2\hexcolorfraction)% - \fi\fi} - -\def\dohexcolorspec#1#2#3#4#5#6#7#8\relax - {\ifx#4\empty - s=\hexcolorcomponent#2#3% - \else - r=\hexcolorcomponent#2#3,g=\hexcolorcomponent#4#5,b=\hexcolorcomponent#6#7% - \fi} +% \startMPpage +% path p ; % example by Peter Rolf +% p := unitsquare xyscaled(5cm,5cm) ; +% fill (point 0 of p -- point 1 of p -- point 2 of p --cycle) withcolor \MPcolor{rgbtestcolor} ; % bottom right part of the square +% fill (point 0 of p -- point 3 of p -- point 2 of p --cycle) withcolor \MPcolor{hextestcolor} ; % top left part +% \stopMPpage -\def\dohexcolorpattern#1#2#3#4#5#6#7#8\relax - {0\ifx#4\empty - S:\hexcolorcomponent#2#3% - \else - R:\hexcolorcomponent#2#3:\hexcolorcomponent#4#5:\hexcolorcomponent#6#7% - \fi:0:0} - -\def\doifhexcolorelse#1% - {\expandafter\dodoifhexcolorelse#10\od} % 0 is a dirty trick to catch an empty #1 - -\def\dodoifhexcolorelse#1#2\od - {\ifnum`#1=\hexcolorprefix - \expandafter\firstoftwoarguments - \else - \expandafter\secondoftwoarguments - \fi} - -\def\docheckhexcolor#1% - {\doifhexcolorelse{#1}{\doifundefined{#1}{\setxvalue{\??cr#1}{\hexcolorpattern{#1}}}}\donothing} - -\def\checkhexcolor[#1]% - {\expanded{\docheckhexcolor{#1}}} - -\def\colorHpattern{\@EA\hexcolorpattern\@EA{\@EA*\@@cl@@h}} % * == dummy placeholder - -\let\dodododefinecolor\dododefinecolor % we will overload this one - -\def\dododefinecolor#1#2#3#4[#5][#6]% - {\doifhexcolorelse{#6} - {\setxvalue{\??cr#5}{\hexcolorpattern{#6}}} - {\dodododefinecolor#1#2#3#4[#5][#6]}} - -%D For Adam Lindsay and his XeTeX special driver: - -% because we intercept the zero condition, the .23pt in 1.23pt will disappear in the -% ifcase zero part branch - -\def\colorhexcomponent#1% - {\ifdim#1\points<.005\points - 00\else\lchexnumbers{\the\dimexpr(255\dimexpr(#1\points)\relax+.5\points)\relax}% - \fi} - -% the faster one - -\newdimen\hex@color@a \hex@color@a=.005pt -\newdimen\hex@color@b \hex@color@b=.5pt -\chardef \hex@color@c =255 - -\def\colorhexcomponent#1% - {\ifdim#1\points<\hex@color@a - 00\else\lchexnumbers{\the\dimexpr(#1\points*\hex@color@c+\hex@color@b)\relax}% - \fi} - -\protect \endinput +\endinput diff --git a/tex/context/base/colo-ini.lua b/tex/context/base/colo-ini.lua index 4a188eba8..befac2452 100644 --- a/tex/context/base/colo-ini.lua +++ b/tex/context/base/colo-ini.lua @@ -6,26 +6,15 @@ if not modules then modules = { } end modules ['colo-ini'] = { license = "see context related readme files" } --- split_settings -> aux.settings_to_hash - --- for the moment this looks messy but we're waiting for a pdf backend interface --- --- code collected here will move and be adapted --- --- some pdf related code can go away - --- spec-pdf.lua - --- todo: %s -> %f - +local concat = table.concat +local format, gmatch, gsub, lower, match = string.format, string.gmatch, string.gsub, string.lower, string.match local texsprint = tex.sprint -local concat =table.concat -local format, gmatch, gsub, lower = string.format, string.gmatch, string.gsub, string.lower +local ctxcatcodes = tex.ctxcatcodes -ctx = ctx or { } -ctx.aux = ctx.aux or { } +local settings_to_hash_strict = aux.settings_to_hash_strict -local ctxcatcodes = tex.ctxcatcodes +colors = colors or { } +transparencies = transparencies or { } local registrations = backends.registrations @@ -60,7 +49,7 @@ local r_l_t_template = "\\localundefine{(ta:%s)}" .. local r_g_t_template = "\\globalundefine{(ta:%s)}" .. "\\globalundefine{(ts:%s)}" -function ctx.aux.definecolor(name, ca, global) +local function definecolor(name, ca, global) if ca and ca > 0 then if global then texsprint(ctxcatcodes,format(a_g_c_template, name, ca, name, ca)) @@ -75,7 +64,7 @@ function ctx.aux.definecolor(name, ca, global) end end end -function ctx.aux.inheritcolor(name, ca, global) +local function inheritcolor(name, ca, global) if ca and ca ~= "" then if global then texsprint(ctxcatcodes,format(f_g_c_template, name, ca, name, ca)) @@ -90,7 +79,7 @@ function ctx.aux.inheritcolor(name, ca, global) end end end -function ctx.aux.definetransparent(name, ta, global) +local function definetransparent(name, ta, global) if ta and ta > 0 then if global then texsprint(ctxcatcodes,format(a_g_t_template, name, ta, name, ta)) @@ -105,7 +94,7 @@ function ctx.aux.definetransparent(name, ta, global) end end end -function ctx.aux.inherittransparent(name, ta, global) +local function inherittransparent(name, ta, global) if ta and ta ~= "" then if global then texsprint(ctxcatcodes,format(f_g_t_template, name, ta, name, ta)) @@ -139,17 +128,17 @@ local transparent = { -- By coupling we are downward compatible. When we decouple we need to do more tricky -- housekeeping (e.g. persist color independent transparencies when color bound ones --- are nil. +-- are nil.) -ctx.couplecolors = true +colors.couple = true -function ctx.definetransparency(name,n) +function colors.definetransparency(name,n) transparent[name] = n end local registered = { } -local function registerspotcolor(parent,name,parentnumber,e,f,d,p) +local function do_registerspotcolor(parent,name,parentnumber,e,f,d,p) if not registered[parentnumber] then local v = colors.values[parentnumber] if v then @@ -170,7 +159,7 @@ local function registerspotcolor(parent,name,parentnumber,e,f,d,p) end end -local function registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template +local function do_registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template if not registered[parentnumber] then local v = colors.values[parentnumber] if v then @@ -188,41 +177,42 @@ local function registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same end end -function ctx.definesimplegray(name,s) +function colors.definesimplegray(name,s) return colors.register('color',name,'gray',s) -- we still need to get rid of 'color' end -function ctx.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent - local t = str:split_settings() +function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent + local r = match(str,"^#(.+)$") -- for old times sake (if we need to feed from xml or so) + local t = (r and { h = r }) or settings_to_hash_strict(str) if t then if t.h then - local r, g, b = (t.h .. "000000"):match("(..)(..)(..)") - ctx.aux.definecolor(name, colors.register('color',name,'rgb',(tonumber(r,16) or 0)/256,(tonumber(g,16) or 0)/256,(tonumber(b,16) or 0)/256 ), global) + local r, g, b = match(t.h .. "000000","(..)(..)(..)") -- watch the 255 + definecolor(name, colors.register('color',name,'rgb',(tonumber(r,16) or 0)/255,(tonumber(g,16) or 0)/255,(tonumber(b,16) or 0)/255 ), global) elseif t.r or t.g or t.b then - ctx.aux.definecolor(name, colors.register('color',name,'rgb', tonumber(t.r) or 0, tonumber(t.g) or 0, tonumber(t.b) or 0 ), global) + definecolor(name, colors.register('color',name,'rgb', tonumber(t.r) or 0, tonumber(t.g) or 0, tonumber(t.b) or 0 ), global) elseif t.c or t.m or t.y or t.k then - ctx.aux.definecolor(name, colors.register('color',name,'cmyk',tonumber(t.c) or 0, tonumber(t.m) or 0, tonumber(t.y) or 0, tonumber(t.k) or 0), global) + definecolor(name, colors.register('color',name,'cmyk',tonumber(t.c) or 0, tonumber(t.m) or 0, tonumber(t.y) or 0, tonumber(t.k) or 0), global) else - ctx.aux.definecolor(name, colors.register('color',name,'gray',tonumber(t.s) or 0), global) + definecolor(name, colors.register('color',name,'gray',tonumber(t.s) or 0), global) end if t.a and t.t then - ctx.aux.definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global) - elseif ctx.couplecolors then - -- ctx.aux.definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up - ctx.aux.definetransparent(name, 0, global) -- can be sped up + definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global) + elseif colors.couple then + -- definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up + definetransparent(name, 0, global) -- can be sped up end elseif freeze then local ca = attributes.list[a_color] [str] local ta = attributes.list[a_transparency][str] if ca then - ctx.aux.definecolor(name, ca, global) + definecolor(name, ca, global) end if ta then - ctx.aux.definetransparent(name, ta, global) + definetransparent(name, ta, global) end else - ctx.aux.inheritcolor(name, str, global) - ctx.aux.inherittransparent(name, str, global) + inheritcolor(name, str, global) + inherittransparent(name, str, global) -- if global and str ~= "" then -- For Peter Rolf who wants access to the numbers in Lua. (Currently only global is supported.) -- attributes.list[a_color] [name] = attributes.list[a_color] [str] or attributes.unsetvalue -- reset -- attributes.list[a_transparency][name] = attributes.list[a_transparency][str] or attributes.unsetvalue @@ -230,28 +220,28 @@ function ctx.defineprocesscolor(name,str,global,freeze) -- still inconsistent co end end -function ctx.isblack(ca) -- maybe commands +function colors.isblack(ca) -- maybe commands local cv = ca > 0 and colors.value(ca) return (cv and cv[2] == 0) or false end -function ctx.definespotcolor(name,parent,str,global) +function colors.definespotcolor(name,parent,str,global) if parent == "" or parent:find("=") then - ctx.registerspotcolor(name, parent) + colors.registerspotcolor(name, parent) elseif name ~= parent then local cp = attributes.list[a_color][parent] if cp then - local t = str:split_settings() + local t = settings_to_hash_strict(str) if t then t.p = tonumber(t.p) or 1 - registerspotcolor(parent, name, cp, t.e, 1, "", t.p) -- p not really needed, only diagnostics + do_registerspotcolor(parent, name, cp, t.e, 1, "", t.p) -- p not really needed, only diagnostics if name and name ~= "" then - ctx.aux.definecolor(name, colors.register('color',name,'spot', parent, 1, "", t.p), true) + definecolor(name, colors.register('color',name,'spot', parent, 1, "", t.p), true) if t.a and t.t then - ctx.aux.definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global) - elseif ctx.couplecolors then - --~ ctx.aux.definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up - ctx.aux.definetransparent(name, 0, global) -- can be sped up + definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global) + elseif colors.couple then + --~ definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up + definetransparent(name, 0, global) -- can be sped up end end end @@ -259,49 +249,49 @@ function ctx.definespotcolor(name,parent,str,global) end end -function ctx.registerspotcolor(parent, str) +function colors.registerspotcolor(parent, str) local cp = attributes.list[a_color][parent] if cp then local e = "" if str then - local t = str:split_settings() + local t = settings_to_hash_strict(str) e = (t and t.e) or "" end - registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics + do_registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics end end -function ctx.definemultitonecolor(name,multispec,colorspec,selfspec) +function colors.definemultitonecolor(name,multispec,colorspec,selfspec) local dd, pp, nn = { }, { }, { } for k,v in gmatch(multispec,"(%a+)=([^%,]*)") do dd[#dd+1] = k pp[#pp+1] = v nn[#nn+1] = k - nn[#nn+1] = format("%1.3g",tonumber(v)) + nn[#nn+1] = format("%1.3g",tonumber(v) or 0) -- 0 can't happen end --~ v = tonumber(v) * p local nof = #dd if nof > 0 then dd, pp, nn = concat(dd,','), concat(pp,','), concat(nn,'_') local parent = gsub(lower(nn),"[^%d%a%.]+","_") - ctx.defineprocesscolor(parent,colorspec..","..selfspec,true,true) + colors.defineprocesscolor(parent,colorspec..","..selfspec,true,true) local cp = attributes.list[a_color][parent] if cp then - registerspotcolor (parent, name, cp, "", nof, dd, pp) - registermultitonecolor(parent, name, cp, "", nof, dd, pp) - ctx.aux.definecolor(name, colors.register('color', name, 'spot', parent, nof, dd, pp), true) - local t = selfspec:split_settings() + do_registerspotcolor(parent, name, cp, "", nof, dd, pp) + do_registermultitonecolor(parent, name, cp, "", nof, dd, pp) + definecolor(name, colors.register('color', name, 'spot', parent, nof, dd, pp), true) + local t = settings_to_hash_strict(selfspec) if t and t.a and t.t then - ctx.aux.definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global) - elseif ctx.couplecolors then - -- ctx.aux.definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up - ctx.aux.definetransparent(name, 0, global) -- can be sped up + definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global) + elseif colors.couple then + -- definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up + definetransparent(name, 0, global) -- can be sped up end end end end -function ctx.mpcolor(model,ca,ta,default) +function colors.mp(model,ca,ta,default) local cv = colors.value(ca) -- faster when direct colors.values[ca] if cv then local tv = transparencies.value(ta) @@ -335,7 +325,7 @@ function ctx.mpcolor(model,ca,ta,default) end end -function ctx.formatcolor(ca,separator) +function colors.formatcolor(ca,separator) local cv = colors.value(ca) if cv then local c, f, t, model = { }, 13, 13, cv[1] @@ -355,12 +345,12 @@ function ctx.formatcolor(ca,separator) end end -function ctx.formatgray(ca,separator) +function colors.formatgray(ca,separator) local cv = colors.value(ca) return format("%0.3f",(cv and cv[2]) or 0) end -function ctx.colorcomponents(ca) +function colors.colorcomponents(ca) local cv = colors.value(ca) if cv then local model = cv[1] @@ -380,7 +370,7 @@ function ctx.colorcomponents(ca) end end -function ctx.transparencycomponents(ta) +function colors.transparencycomponents(ta) local tv = transparencies.value(ta) if tv then return format("a=%1.3f t=%1.3f",tv[1],tv[2]) @@ -389,153 +379,29 @@ function ctx.transparencycomponents(ta) end end -function ctx.pdfcolor(model,ca,default) -- todo: use gray when no color - local cv = colors.value(ca) - if cv then - if model == 1 then - model = cv[1] - end - if model == 2 then - local s = cv[2] - return format("%s g %s G",s,s) - elseif model == 3 then - local r, g, b = cv[3], cv[4], cv[5] - return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b) - elseif model == 4 then - local c, m, y, k = cv[6],cv[7],cv[8],cv[9] - return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k) - else - local n,f,d,p = cv[10],cv[11],cv[12],cv[13] - if type(p) == "string" then - p = gsub(p,","," ") -- brr misuse of spot - end - return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p) - end - else - return format("%s g %s G",default or 0,default or 0) - end -end - -function ctx.pdfcolorvalue(model,ca,default) - local cv = colors.value(ca) - if cv then - if model == 1 then - model = cv[1] - end - if model == 2 then - return format("%s",cv[2]) - elseif model == 3 then - return format("%s %s %s",cv[3],cv[4],cv[5]) - elseif model == 4 then - return format("%s %s %s %s",cv[6],cv[7],cv[8],cv[9]) - else - return format("%s",cv[13]) - end - else - return format("%s",default or 0) - end -end - -function ctx.fdfcolor(model,ca,default) - local cv = colors.value(ca) - if cv then - if model == 1 then - model = cv[1] - end - if model == 2 then - return format("[%s]",cv[2]) - elseif model == 3 then - return format("[%s %s %s]",cv[3],cv[4],cv[5]) - elseif model == 4 then - return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9]) - elseif model == 4 then - return format("[%s]",cv[13]) - end - else - return format("[%s]",default or 0) - end -end - -function ctx.pdfcolorspace(model,ca) - local cv = colors.value(ca) - if cv then - if model == 1 then - model = cv[1] - end - if model == 2 then - return "DeviceGray" - elseif model == 3 then - return "DeviceRGB" - elseif model == 4 then - return "DeviceCMYK" - end +function colors.spotcolorname(ca,default) + local cv, v = colors.value(ca), "unknown" + if cv and cv[1] == 5 then + v = cv[10] end - return "DeviceGRAY" + return tostring(v) end -function ctx.spotcolorname(ca,default) +function colors.spotcolorparent(ca,default) local cv, v = colors.value(ca), "unknown" if cv and cv[1] == 5 then - v = cv[10] + v = cv[12] + if v == "" then + v = cv[10] + end end return tostring(v) end -function ctx.spotcolorvalue(ca,default) +function colors.spotcolorvalue(ca,default) local cv, v = colors.value(ca), 0 if cv and cv[1] == 5 then v = cv[13] end return tostring(v) end - --- unfortunately we have \cs's here but this will go anyway once we have mplib and such - -function ctx.resolvempgraycolor(csa,csb,model,s) - local ca = colors.register('color',nil,'gray',s) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca))) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca))) -end -function ctx.resolvemprgbcolor(csa,csb,model,r,g,b) - local ca = colors.register('color',nil,'rgb',r,g,b) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca))) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca))) -end -function ctx.resolvempcmykcolor(csa,csb,model,c,m,y,k) - local ca = colors.register('color',nil,'cmyk',c,m,y,k) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca))) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca))) -end -function ctx.resolvempspotcolor(csa,csb,model,n,f,d,p) - local ca = colors.register('color',nil,'spot',n,f,d,p) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca))) - texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca))) -end - --- literals needed to inject code in the mp stream, we cannot use attributes there --- since literals may have qQ's, much may go away once we have mplib code in place - -local intransparency = false - -function ctx.pdfrgbliteral(model,r,g,b) - texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'rgb',r,g,b)))) -end -function ctx.pdfcmykliteral(model,c,m,y,k) - texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'cmyk',c,m,y,k)))) -end -function ctx.pdfgrayliteral(model,s) - texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'gray',s)))) -end -function ctx.pdfspotliteral(model,n,f,d,p) - texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'spot',n,f,d,p)))) -- incorrect -end -function ctx.pdftransparencyliteral(a,t) - intransparency = true - texsprint(ctxcatcodes,format("\\pdfliteral{/Tr%s gs}",transparencies.register(nil,a,t))) -end -function ctx.pdffinishtransparency() - if intransparency then - intransparency = false - texsprint(ctxcatcodes,"\\pdfliteral{/Tr0 gs}") -- we happen to know this -) - end -end diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv index 197a69ba6..197cbcdca 100644 --- a/tex/context/base/colo-ini.mkiv +++ b/tex/context/base/colo-ini.mkiv @@ -20,6 +20,7 @@ %D different approach, this module only implements a few generic mechanisms. \registerctxluafile{colo-ini}{1.000} +\registerctxluafile{lpdf-col}{1.000} \unprotect @@ -80,7 +81,6 @@ \newif\iffreezecolors \freezecolorsfalse \newif\ifincolor % true if colors enabled -\newif\iflocalcolor \let\colorlist \empty \let\currentspotcolor \empty @@ -122,8 +122,6 @@ %D \macros %D {startcolor,stopcolor, %D faststartcolor,faststopcolor, -%D localstartcolor,localstopcolor, -%D localstartraster,localstopraster, %D startraster,stopraster,raster, %D color,graycolor} %D @@ -162,13 +160,7 @@ \def\faststopcolor {} \unexpanded\def\dosetcolorattribute#1#2{\ifcsname#1#2\endcsname\doactivatecolor{\csname#1#2\endcsname}\fi} -\let\localstartcolor \startcolor -\let\localstopcolor \stopcolor -\let\globalstartcolor\startcolor -\let\globalstopcolor \stopcolor -\let\localstartraster\startraster -\let\localstopraster \stopraster -\let\grey \graycolor +\let\grey\graycolor %D \macros %D {startcurrentcolor,stopcurrentcolor} @@ -211,8 +203,8 @@ {\makeshortfilename[\truefilename{\f!colorprefix#1}]% \startreadingfile \readsysfile\shortfilename - {\showmessage\m!colors4\colorstyle} - {\showmessage\m!colors5\colorstyle}% + {\showcolormessage\m!colors4\colorstyle} + {\showcolormessage\m!colors5\colorstyle}% \stopreadingfile} \let\usecolors\setupcolor @@ -262,6 +254,8 @@ \setsystemmode{\v!color\colorsplitsuffix}% \iffilterspotcolor \let\@@clrgb\v!no \fi} +\let\showcolormessage\gobblethreearguments + \def\dosetupcolors[#1]% some no longer make sense in MkIV {\getparameters[\??cl][#1]% \doifelse\@@clspot\v!yes @@ -283,17 +277,17 @@ \weightGRAYfalse \weightGRAYtrue \doifelse\@@clrgb\v!no - {\ifRGBsupported \ifproductionrun\showmessage\m!colors {9}\v!rgb \fi\RGBsupportedfalse \fi} - {\ifRGBsupported \else\ifproductionrun\showmessage\m!colors{10}\v!rgb \fi\RGBsupportedtrue \fi}% + {\ifRGBsupported \showcolormessage\m!colors {9}\v!rgb \RGBsupportedfalse \fi} + {\ifRGBsupported \else\showcolormessage\m!colors{10}\v!rgb \RGBsupportedtrue \fi}% \doifelse\@@clcmyk\v!no - {\ifCMYKsupported \ifproductionrun\showmessage\m!colors {9}\v!cmyk \fi\CMYKsupportedfalse\fi} - {\ifCMYKsupported\else\ifproductionrun\showmessage\m!colors{10}\v!cmyk \fi\CMYKsupportedtrue \fi}% + {\ifCMYKsupported \showcolormessage\m!colors {9}\v!cmyk \CMYKsupportedfalse\fi} + {\ifCMYKsupported\else\showcolormessage\m!colors{10}\v!cmyk \CMYKsupportedtrue \fi}% \doifelse\@@clmpcmyk\v!no - {\ifMPcmykcolors \ifproductionrun\showmessage\m!colors {9}{\v!mp\v!cmyk}\fi\MPcmykcolorsfalse \fi} - {\ifMPcmykcolors \else\ifproductionrun\showmessage\m!colors{10}{\v!mp\v!cmyk}\fi\MPcmykcolorstrue \fi}% + {\ifMPcmykcolors \showcolormessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykcolorsfalse \fi} + {\ifMPcmykcolors \else\showcolormessage\m!colors{10}{\v!mp\v!cmyk}\MPcmykcolorstrue \fi}% \doifelse\@@clmpspot\v!no - {\ifMPspotcolors \ifproductionrun\showmessage\m!colors {9}{\v!mp\v!spot}\fi\MPspotcolorsfalse \fi} - {\ifMPspotcolors \else\ifproductionrun\showmessage\m!colors{10}{\v!mp\v!spot}\fi\MPspotcolorstrue \fi}% + {\ifMPspotcolors \showcolormessage\m!colors {9}{\v!mp\v!spot}\MPspotcolorsfalse \fi} + {\ifMPspotcolors \else\showcolormessage\m!colors{10}{\v!mp\v!spot}\MPspotcolorstrue \fi}% \preferGRAYfalse \processaction [\@@clconversion] @@ -310,23 +304,15 @@ \reduceMPcolorstrue \fi \else - \ifconverttoGRAY\else\showmessage\m!colors{11}\empty\fi + \ifconverttoGRAY\else\showcolormessage\m!colors{11}\empty\fi \converttoGRAYtrue \forcegrayMPcolorstrue \convertMPcolorsfalse \reduceMPcolorsfalse \fi\fi - \processaction - [\@@clstate] - [ \v!global=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi - \incolortrue\localcolorfalse, - \v!local=>\ifincolor\else\showmessage\m!colors2\colorstyle\fi - \incolortrue\localcolortrue, - \v!start=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi - \incolortrue\localcolorfalse - \let\@@clstate\v!global, - \v!stop=>\incolorfalse\localcolorfalse - \forcegrayMPcolorstrue]% + \doifelse\@@clstate\v!stop + {\incolorfalse\forcegrayMPcolorstrue}% + {\ifincolor\else\showcolormessage\m!colors1\colorstyle\fi\incolortrue\let\@@clstate\v!start}% \dosetupcolormodel \initializemaintextcolor} @@ -400,7 +386,7 @@ \def\dodefinepalet[#1][#2]% {\doifassignmentelse{#2} - {%\showmessage\m!colors6{#1}% + {%\showcolormessage\m!colors6{#1}% \letvalue{\??pa#1}\empty \setevalue{\??pa\??pa#1}{#2}% \def\dodododefinepalet[##1=##2]% @@ -448,7 +434,7 @@ \else\ifcsname\??pa\currentpalet\endcsname \edef\currentpalet{#1:}% \else - \showmessage\m!colors7\currentpalet + \showcolormessage\m!colors7\currentpalet \let\currentpalet\empty \fi\fi} @@ -695,11 +681,6 @@ \def\MPcolor#1{(0,0,0)} \fi -%D \macros -%D {PDFcolor,FDFcolor} -%D -%D Similar alternatives are avaliable for \PDF: - %D For the moment we keep the next downward compatibility %D switch, i.e.\ expanded colors. However, predefined colors %D and palets are no longer expanded (which is what I wanted @@ -791,7 +772,7 @@ \ifx\currentcolormodel\undefined \newcount\currentcolormodel \fi \def\setcolormodel#1% - {\showmessage\m!colors1{#1}% + {\showcolormessage\m!colors1{#1}% \currentcolormodel\ctxlua{tex.print(colors.setmodel('colormodel','#1',\ifweightGRAY true\else false\fi))}% \dosetattribute{colormodel}{\the\currentcolormodel}} @@ -859,8 +840,8 @@ \def\deactivatecolor {\let\currentcolorname\s!black - \doresetattribute\s!color - \doresetattribute\s!transparency} + \attribute\colorattribute\attributeunsetvalue + \attribute\transparencyattribute\attributeunsetvalue} \def\dodefinecolorcommand#1#2% {\unexpanded#1{#2}{\doactivatecolor{#2}}} @@ -869,41 +850,41 @@ \setfalse\collectcolorsinlist \def\collectcolorinlist#1{\doglobal\addtocommalist{#1}\colorlist} -\def\doregistercolor#1#2{\ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}} +\def\doregistercolor#1#2{\ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}} \def\dodefinecolor[#1][#2]% {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi - \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}% + \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}% \dodefinecolorcommand\setvalue{#1}} \def\dodefineglobalcolor[#1][#2]% {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi - \ctxlua{ctx.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}% + \ctxlua{colors.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}% \dodefinecolorcommand\setgvalue{#1}} \def\dodefinenamedcolor[#1][#2]% {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi - \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}% + \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}% \dodefinecolorcommand\setvalue{#1}} \def\dodefinespotcolor[#1][#2][#3]% {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi - \ctxlua{ctx.definespotcolor("#1","#2","#3",true)}% + \ctxlua{colors.definespotcolor("#1","#2","#3",true)}% \dodefinecolorcommand\setxvalue{#1}} \def\dodefinemultitonecolor[#1][#2][#3][#4]% - {\ctxlua{ctx.definemultitonecolor("#1","#2","#3","#4",true)}% + {\ctxlua{colors.definemultitonecolor("#1","#2","#3","#4",true)}% \dodefinecolorcommand\setxvalue{#1}} \def\dodefinetransparency[#1][#2]% - {\ctxlua{ctx.definetransparency("#1",#2)}} + {\ctxlua{colors.definetransparency("#1",#2)}} \def\dosetrastercolor#1% slow, we need a fast one {\edef\@@rastervalue{#1}% \ifx\@@rastervalue\empty \let\@@rastervalue\@@rsscreen \fi - \dosetattribute\s!color{\ctxlua{tex.sprint(ctx.definesimplegray("_raster_",\@@rastervalue))}}} + \dosetattribute\s!color{\ctxlua{tex.sprint(colors.definesimplegray("_raster_",\@@rastervalue))}}} %D \macros %D {doifcolorelse, doifcolor} @@ -936,7 +917,7 @@ %D A bit like \type {\definedfont}: \unexpanded\def\colored[#1]% - {\ctxlua{ctx.defineprocesscolor("@colored@","#1",false,false)}% + {\ctxlua{colors.defineprocesscolor("@colored@","#1",false,false)}% \groupedcommand{\doactivatecolor{@colored@}}{}} %D \macros @@ -965,37 +946,15 @@ %D \stopregistercolor %D \stoptyping +% can be cleaned up + \let\maintextcolor \empty \def\defaulttextcolor {black} \def\@@themaintextcolor{themaintextcolor} -\def\startregistercolor[#1]% - {\doifelsenothing{#1} - {\let\stopregistercolor\relax} - {\edef\stopregistercolor - {\dosetattribute\s!color {\dogetattribute\s!color }% - \dosetattribute\s!transparency{\dogetattribute\s!transparency}}% - \doactivatecolor{#1}}} - -\let\resynccolor \relax % ? -\let\pushcolor \relax -\let\popcolor \relax -\let\popsplitcolor\relax - -\def\restorecolormode - {\ifincolor - \deactivatecolor - \ifx\maintextcolor\empty \else - \doactivatecolor\maintextcolor - \fi - \fi} - -\let\pushpostponedpagecolor\relax -\let\poppostponedpagecolor \relax - -\appendtoks\deactivatecolor\to\everybeforeoutput % maybe we don't need push pop now +\appendtoks\deactivatecolor\to\everybeforeoutput -\def\startregistercolor[#1]% +\def\startregistercolor[#1]% probably obsolete {\doifelsenothing{#1} {\let\stopregistercolor\relax} {\edef\stopregistercolor @@ -1024,10 +983,6 @@ \appendtoks \initializemaintextcolor \to \everyjob -\def\localstarttextcolor{\normalexpanded{\noexpand\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}} -\let\localstoptextcolor \stopcolor -\let\restoretextcolor \firstofoneargument - \def\dodefinepaletcolor#1#2#3% {\doifassignmentelse{#3}% \definepalet[test][xx={y=.4}] {\definecolor[\??pa#1:#2][#3]% @@ -1071,7 +1026,7 @@ \def\colorformatseparator{ } -\def\MPcolor#1{\ctxlua{tex.sprint(ctx.mpcolor(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}} +\def\MPcolor#1{\ctxlua{tex.sprint(colors.mp(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}} \let\currentcolorname\s!black % todo \let\outercolorname \s!black % todo @@ -1079,33 +1034,18 @@ \def\thecolorattribute #1{\number\csname(ca:\ifcsname(ca:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ca:#1)\endcsname#1\fi\fi)\endcsname} \def\thetransparencyattribute#1{\number\csname(ta:\ifcsname(ta:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ta:#1)\endcsname#1\fi\fi)\endcsname} -\def\PDFcolor #1{\ctxlua{tex.sprint(ctx.pdfcolor (\number\currentcolormodel, \thecolorattribute{#1}))}} -\def\PDFcolorvalue#1{\ctxlua{tex.sprint(ctx.pdfcolorvalue(\number\currentcolormodel, \thecolorattribute{#1}))}} -\def\FDFcolor #1{\ctxlua{tex.sprint(ctx.fdfcolor (\number\currentcolormodel, \thecolorattribute{#1}))}} - -\def\internalspotcolorname#1{\ctxlua{tex.sprint(ctx.spotcolorname (\thecolorattribute{#1}))}} -\def\internalspotcolorsize#1{\ctxlua{tex.sprint(ctx.spotcolorvalue(\thecolorattribute{#1}))}} - -\def\colorcomponents #1{\ctxlua{tex.sprint(ctx.colorcomponents (\thecolorattribute {#1}))}} -\def\transparencycomponents#1{\ctxlua{tex.sprint(ctx.transparencycomponents(\thetransparencyattribute{#1}))}} - -\def\colorvalue#1{\ctxlua{tex.sprint(ctx.formatcolor(\thecolorattribute{#1},"\colorformatseparator"))}} -\def\grayvalue #1{\ctxlua{tex.sprint(ctx.formatgray (\thecolorattribute{#1},"\colorformatseparator"))}} +\def\internalspotcolorname #1{\ctxlua{tex.sprint(colors.spotcolorname (\thecolorattribute{#1}))}} +\def\internalspotcolorparent#1{\ctxlua{tex.sprint(colors.spotcolorparent(\thecolorattribute{#1}))}} +\def\internalspotcolorsize #1{\ctxlua{tex.sprint(colors.spotcolorvalue (\thecolorattribute{#1}))}} -% \definecolor[foo][black] {\red red {\foo (\doifblackelse{foo}{YES}{NO} \doifdrawingblackelse{YES}{NO}) black} red} -% \definecolor[foo][green] {\red red {\foo (\doifblackelse{foo}{YES}{NO} \doifdrawingblackelse{YES}{NO}) green} red} +\def\colorcomponents #1{\ctxlua{tex.sprint(colors.colorcomponents (\thecolorattribute {#1}))}} +\def\transparencycomponents#1{\ctxlua{tex.sprint(colors.transparencycomponents(\thetransparencyattribute{#1}))}} -\def\doifblackelse #1{\ctxlua{commands.doifelse(ctx.isblack(\thecolorattribute{#1}))}} -\def\doifdrawingblackelse {\ctxlua{commands.doifelse(ctx.isblack(tex.attribute[attributes.numbers['color']]))}} +\def\colorvalue#1{\ctxlua{tex.sprint(colors.formatcolor(\thecolorattribute{#1},"\colorformatseparator"))}} +\def\grayvalue #1{\ctxlua{tex.sprint(colors.formatgray (\thecolorattribute{#1},"\colorformatseparator"))}} -% hack, till we have adapted backend: (move it there) - -\def\presetPDFtransparencybynumber#1#2#3% - {\initializetransparency - \ifcase#1\else - \global\PDFcurrenttransparency\numexpr#1+\minusone\relax - \presetPDFtransparency{#2}{#3}% - \fi} +\def\doifblackelse #1{\ctxlua{commands.doifelse(colors.isblack(\thecolorattribute{#1}))}} +\def\doifdrawingblackelse {\ctxlua{commands.doifelse(colors.isblack(tex.attribute[attributes.numbers['color']]))}} %D \macros %D {forcecolorhack} @@ -1129,21 +1069,6 @@ \unexpanded\def\forcecolorhack{\leaders\hrule\normalhskip\zeropoint} -% \setupcolors[state=start] -% -% \starttext -% \defineglobalcolor[foo][black] {\red red {\foo black} red} -% \ctxlua{tex.print(ctx.aux.colorattribute("foo"))} -% \ctxlua{tex.print(ctx.aux.colorattribute("red"))} -% \ctxlua{tex.print(ctx.aux.colorattribute("green"))} -% \ctxlua{tex.print(ctx.aux.colorattribute("black"))} -% \definecolor[black][green] {\red red {\foo black} red} -% \ctxlua{tex.print(ctx.aux.colorattribute("foo"))} -% \ctxlua{tex.print(ctx.aux.colorattribute("red"))} -% \ctxlua{tex.print(ctx.aux.colorattribute("green"))} -% \ctxlua{tex.print(ctx.aux.colorattribute("black"))} -% \stoptext - %D We default to the colors defined in \module{colo-rgb} and %D support both \cap{RGB} and \cap{CMYK} output. As you can %D see, color support is turned off by default. Reduction of @@ -1170,6 +1095,10 @@ \setupcolors[\c!state=\v!start]% later direct \to \everyjob +\appendtoks + \let\showcolormessage\showmessage +\to \everyjob + \setupcolors [\c!state=\v!stop, % in mkii: \v!stop \c!conversion=\v!yes, diff --git a/tex/context/base/cont-log.tex b/tex/context/base/cont-log.tex index 27f3b1134..a22c1d2c4 100644 --- a/tex/context/base/cont-log.tex +++ b/tex/context/base/cont-log.tex @@ -292,4 +292,18 @@ \let\LUATEX \luaTeX \let\XETEX \XeTeX +\def\MkApproved + {\rotate + [\c!rotation={\ifnum\texengine=\luatexengine\ctxlua{tex.write(45-45*\the\luatexversion/100)}\else0\fi}, + \c!align=\v!middle, + \c!foregroundstyle=\v!type, + \c!foregroundcolor=darkred, + \c!frame=\v!on, + \c!offset=1ex, + \c!background=\v!color, + \c!backgroundcolor=lightgray, + \c!framecolor=darkred, + \c!rulethickness=2pt] + {Mk\ifnum\texengine=\luatexengine IV\else II\fi\\approved}} + \protect \endinput diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii index 6af6de4b6..8b5bed657 100644 --- a/tex/context/base/cont-new.mkii +++ b/tex/context/base/cont-new.mkii @@ -13,4 +13,7 @@ \enablemode[mkii] +\long\def\startluacode#1\stopluacode{} +\long\def\ctxlua #1{} + \endinput diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 9e2ca49c0..35b716ed4 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,19 +11,26 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +% 2009-07-15 / vista sp 2 / 2.2G duo dell M90 precision: +% +% \dorecurse{10000}{test \page} % 300 pps +% \dorecurse {2000}{test \page} % 260 pps +% \dorecurse {300}{test \page} % 135 pps + % \ctxlua { fonts.define.method = 2 } % normally 3 \enablemode[mkiv] \setsystemmode{mkiv} -% there is more code here that is wise, but first we need to split -% more modules in mkii/mkiv - % potential new defaults: - +% % \setbreakpoints[compound] \unprotect +% % % % % % needs testing but saves runtime + +\let\checknotes\relax % probably not needed, checking already done + % we need to figure this out (to be discussed) \unexpanded\def\textminus @@ -46,82 +53,6 @@ % \def\pagedir{\expandafter\gobblethreearguments} % \def\bodydir{\expandafter\gobblethreearguments} -% we have to make an mkii/mkiv core-not - -\ifx\definestructurecounter\undefined - -\def\dochecknote % only to be called locally, some bools will become class-ones - {% for the moment no mixed text/endnotes modes, so we use - % \footnoteparameter and not \noteparameter (**) - \setnotedistance - \edef\notelocationasked{\noteparameter\c!location}% can be set - \count\currentnoteins\plusthousand - \expdoifcommonelse{\v!columns,\v!lastcolumn}\notelocationasked - {\chardef\clevernotes\plustwo} - {\expdoifinsetelse\v!firstcolumn\notelocationasked - {\chardef\clevernotes\plusone}% - {\chardef\clevernotes\zerocount}}% - \ifcase\clevernotes\relax - % notes not in column areas - \ifnum\noteparameter\c!n=\zerocount % no ifcase - \settextnotes - \scratchcounter\plusone - \else - \setcolumnnotes - \scratchcounter\noteparameter\c!n\relax - \divide\count\currentnoteins \scratchcounter - \fi - \global\endnotesfalse - \expdoifinsetelse\v!page\notelocationasked - {\expdoifinsetelse\v!high\notelocationasked - {\global\bottomnotesfalse} - {\global\bottomnotestrue}} - {\global\endnotestrue - \global\bottomnotestrue}% not: \postponenotes, else global - \else - % notes in column areas - \ifnum\@@kln=\zerocount % no ifcase / brrr dependency on \??kl - \scratchcounter\plusone - \else - \scratchcounter\footnoteparameter\c!n\relax % ** - \fi - \global\endnotesfalse - \global\bottomnotestrue - \setclevernotes - \fi - \doifsomething{\noteparameter\c!factor} - {\ifnum\noteparameter\c!factor<\zerocount\else - \count\currentnoteins\noteparameter\c!factor - \fi}% - \ifnotelimit - \dimen\currentnoteins\noteparameter\c!height - \multiply\dimen\currentnoteins \scratchcounter - \fi - \ifendnotes - \dimen\currentnoteins\maxdimen - \count\currentnoteins\zerocount - \skip \currentnoteins\zeropoint - \fi} - -\fi - -\ifx\clearmarks\undefined - \def\clearmarks {\begingroup\afterassignment\doclearmarks\scratchcounter} - \def\doclearmarks{\normalmarks\scratchcounter{}\endgroup} -\fi - -\ifx\@@trk\undefined \else - - \def\resetmark#1% we cannot use \normalmarks#1{} - {\global\@EA\chardef\csname\@@mrk\string#1\endcsname\zerocount - \@EA\clearmarks\csname\@@prk\string#1\endcsname - \global\@EA\let\csname\@@trk\string#1\endcsname\empty - \global\@EA\let\csname\@@frk\string#1\endcsname\empty - \global\@EA\let\csname\@@brk\string#1\endcsname\empty - \global\@EA\let\csname\@@crk\string#1\endcsname\empty} - -\fi - %D Since this can be a showstopper, we report the path at the beginning %D as well as at the end of a run. @@ -169,12 +100,12 @@ % remapper.define('encoding','^qtm','^(.*)$','q-\letterpercent1') % } -\appendtoksonce \loadallXfontmapfiles \to \everyPDFxform -\appendtoksonce \loadallXfontmapfiles \to \everyPDFximage -\appendtoksonce \loadallXfontmapfiles \to \everystarttext -\appendtoksonce \loadallXfontmapfiles \to \everybeforepagebody +% \appendtoksonce \loadallXfontmapfiles \to \pdfbackendeveryximage +% \appendtoksonce \loadallXfontmapfiles \to \pdfbackendeveryxform +% \appendtoksonce \loadallXfontmapfiles \to \everystarttext +% \appendtoksonce \loadallXfontmapfiles \to \everybeforepagebody -\def\loadallXfontmapfiles{\ctxlua{fonts.map.flush("pdftex")}} +% \def\loadallXfontmapfiles{\ctxlua{fonts.map.flush("pdftex")}} % \ctxlua{ % do diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 378eed523..9c729629c 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{2009.06.13 14:03} +\newcontextversion{2009.07.17 13:16} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new @@ -28,8 +28,6 @@ % \font\f=dummyfont \rpcode\f0=500 \hbox{..}\char0 % todo: mp-new % caption: grid=top|bottom in xml defs - -\let\then\relax % \ifnum1>2\then -) \def\fastscale#1% {\begingroup @@ -74,35 +72,6 @@ \fi \relax} -% maybe to be integrated (option=...) - -\def\directexternalfigure - {\dodoubleempty\dodirectexternalfigure} - -\def\dodirectexternalfigure[#1][#2]% - {\bgroup - \getparameters[\??ef][\c!type=\splitofftype,\c!page=1,#2]% - \sanitizefilename#1\to\expandedfigurename - \splitfilename\expandedfigurename - \let\@@DriverImageWidth \!!zeropoint - \let\@@DriverImageHeight \!!zeropoint - \let\@@DriverImageFile \splitofffull - \let\@@DriverImageType \@@eftype - \let\@@DriverImageMethod \@@eftype - \let\@@DriverImageLabel \empty - \let\@@DriverImagePage \@@efpage - \doinsertfile - \egroup} - -% \directexternalfigure[cow.pdf] - -% normally one does not want this to happen nested, maybe there -% is more; non public vars btw, will become conditionals - -\ifx\writetoregisterfalse\undefined \else \appendtoks \writetoregisterfalse \to \everybeforeutilityread \fi -\ifx\writetolistfalse \undefined \else \appendtoks \writetolistfalse \to \everybeforeutilityread \fi -\ifx\notesenabledfalse \undefined \else \appendtoks \notesenabledfalse \to \everybeforeutilityread \fi - % \setuplabeltext[\s!itemcount1={{I(},{)}}] % \def\labeledcountervalue#1{\labeltexts{#1}{\countervalue{#1}}} @@ -213,132 +182,6 @@ % % \shapesynonym{eacute} -% \page[left] -% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer] -% \setupcolumntextareatext[intro][left][\setups{intro}] -% \flushcolumntextareas - -\def\flushcolumntextareas - {\initializecolumntextareas - \setvsize} - -%D (Inspired by a discussion on the \CONTEXT\ mailing list) -%D -%D In \TEX\ each character can have one of 16 catcodes. This way the -%D backslash, dollar, ampersand, hash and some more characters get -%D their special meaning. If you want to process tokens under a -%D certain catcode regime, passing arguments can interfere badly. -%D -%D \startbuffer[a] -%D \def\whatever#1{[#1]} -%D \whatever{whatever \type {\whatever{you want}} $or$ not!} -%D \stopbuffer -%D -%D \typebuffer[a] -%D -%D Here we pass an argument to \type {\whatever} but part of that -%D argument is to be processed under a different catcode regime, i.e.\ -%D all characters that need to be typeset verbatim need to get -%D the catcode that makes it a letter. This is what we get when we typeset -%D the text verbatim: -%D -%D \starttyping -%D whatever \type {\whatever{you want}} $or$ not! -%D \stoptyping -%D -%D However, when passed to \type {\whatever} we get: -%D -%D \getbuffer[a] -%D -%D In \ETEX\ one can use \type {\scantokens} to circumvent this problem. -%D -%D \startbuffer[b] -%D \def\rescan#1{\scantokens{#1}} -%D \def\whatever#1{[\rescan{#1}]} -%D \whatever{whatever \type {\whatever{you want}} $or$ not!} -%D \stopbuffer -%D -%D \getbuffer[b] \typebuffer[b] -%D -%D This time the \type {\whatever} call gives: -%D -%D \getbuffer[b] -%D -%D In this example, two spaces have crept in. The first one, after the -%D macro name, is inserted by \TEX\ and cannot be avoided. The last space -%D is inserted by \type {\scantokens}, and is the consequence of the fact -%D that this macro mimics reading from a file. You can avoid the last -%D space by a slightly different definition: -%D -%D \startbuffer[c] -%D \def\rescan#1{\scantokens{#1\ignorespaces}} -%D \def\whatever#1{[\rescan{#1}]} -%D \whatever{whatever \type {\whatever{you want}} $or$ not!} -%D \stopbuffer -%D -%D \typebuffer[c] -%D -%D Unfortunately we still keep the first space, but at least it's better than -%D a failure: -%D -%D \getbuffer[c] - -\long\def\rescan#1{\scantokens{#1\ignorespaces}} -\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup} - -\ifx\scantextokens\undefined \else - \long\def\rescan#1{\scantextokens{#1}} - \long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup} -\fi - -% In 2005 we will abandon support for font encodings that don't have -% the ascii characters { } $ etc in their normal slot, i.e. latin modern -% instead of computer modern. Then we can also clean up some of the ugly -% xml internals that are a result from the need to deal with funny -% encodings. -% -% a solution: -% -% \defineXMLargument[ctx:c]{\getXMLcharacter} -% \defineXMLargument[ctx:e]{\getXMLentity } -% \defineXMLargument[ctx:u]{\unicodechar } -% -% \bgroup \catcode`\<=\active \catcode`\&=\active -% -% \gdef\dontexpandutf -% {\def\getXMLcharacter##1{<ctx:c>##1</ctx:c>}% -% \def\getXMLentity ##1{<ctx:e>##1</ctx:e>}% -% \def\unicodechar ##1{<ctx:u>##1</ctx:u>}} -% -% \egroup -% -% more generic -% -% IS THIS STILL OK? TO BE CHECKED (UTF AND SUCH) ! ! ! ! - -\def\XMLexpanded#1% - {\bgroup - \honorunexpanded -% \dontexpandencoding -% \dontexpandutf - \chardef\activecharactermode\zerocount - \xdef\@@globalexpanded{#1}% - \egroup - \@@globalexpanded} - -\def\setXMLexpandedmark#1#2% using a tok prevents unwanted expansion in mark - {\XMLexpanded{\scratchtoks{\enableXML#2}}% - \expanded{\normalsetnormalmark{#1}{\the\scratchtoks}}} - -% \separatestring123 456\to\test [\test] - -% \def\separatestring#1\to#2% -% {\let#2\empty -% \def\docommand##1{\edef#2{\ifx#2\empty\else#2,\fi##1}}% -% \processseparatedlist[#1][ ]\docommand} -% -% \processseparatedlist[aap noot][]\ruledhbox - % this will be activated when % \newinsert\thispageinsert % <- installinsertion @@ -509,7 +352,7 @@ \expandafter#1% \fi} -\gdef\collapsespaces% +\gdef\collapsespaces {\prependtoksonce\relax\to\everyeof% \ignorelines% \ignoretabs% @@ -518,165 +361,6 @@ \egroup -% no, wrong! never! -% -% \def\tightlayer[#1]% -% {\begingroup -% \def\currentlayer{#1}% todo: left/right -% \setbox\nextbox\emptybox % hoogte/breedte are \wd\nextbox/\ht\nextbox -% \hsize\layerparameter\c!width % \overlaywidth = \hsize -% \vsize\layerparameter\c!height % \overlaywheight = \vsize -% \hbox to \hsize{\composedlayer{#1}}% -% \endgroup} - -% todo : share symbols - -% \definecolor[rollover:n][red] -% \definecolor[rollover:r][green] -% \definecolor[rollover:d][blue] - -\definepalet - [rollover] - [n=red, - r=green, - d=blue] - -% \newcounter\nofrollovers -% -% \def\dorollbutton[#1][#2]#3[#4]% -% {\dontleavehmode -% \bgroup -% \doglobal\increment\nofrollovers -% \unexpanded\def\dosetlocationbox[##1]##2[##3]% -% {\getparameters[##1][##3]% -% \definecolor[rollover][rollover:##2]% -% \let\next\hbox -% \doif{##2}{n} -% {\doifvalue{##1\c!variant}\v!verborgen{\let\next\phantom}}% -% \next -% {\localframed[##1] -% [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]% -% {\dolocationattributes{##1}\c!style\c!color{#3}}}}% -% \iffirstargument -% \ifsecondargument -% \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}% -% \else -% \doifassignmentelse{#1} -% {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}} -% {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}% -% \fi -% \else -% \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}% -% \fi -% % todo: share symbols -% \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]% -% \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]% -% \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]% -% \nextsystemfield -% \setupfield -% [rollbutton] -% [\c!frame=\v!off,\c!offset=\v!overlay,\c!klickoff={#4}]% -% \definefield -% [\currentsystemfield][push][rollbutton] -% [rsym:\nofrollovers:n,% -% rsym:\nofrollovers:r,% -% rsym:\nofrollovers:d]% -% \fitfield[\currentsystemfield]% -% \egroup} - -\newcounter\nofrollovers -\newcounter\nofrollbuttons - -\def\dorollbutton[#1][#2]#3[#4]% - {\dontleavehmode - \bgroup - \doglobal\increment\nofrollovers - \doglobal\increment\nofrollbuttons - \unexpanded\def\dosetlocationbox[##1]##2[##3]% - {\getparameters[##1][##3]% - \definecolor[rollover][rollover:##2]% - \doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox - {\localframed[##1] - [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]% - {\dolocationattributes{##1}\c!style\c!color{#3}}}}% - \iffirstargument - \ifsecondargument - \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}% - \else - \doifassignmentelse{#1} - {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}} - {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}% - \fi - \else - \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}% - \fi - % todo: share symbols, tricky since different dimensions - \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]% - \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]% - \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]% - \setupfield - [rollbutton] - [\c!frame=\v!off, - \c!offset=\v!overlay, - \c!clickout={#4}]% - \definefield - [roll:\nofrollbuttons][push][rollbutton] - [rsym:\nofrollovers:n,% - rsym:\nofrollovers:r,% - rsym:\nofrollovers:d]% - \fitfield[roll:\nofrollbuttons]% - \egroup} - -\unexpanded\def\rollbutton - {\dodoubleempty\dorollbutton} - -% \def\do@@amrob[#1]#2\\% -% {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}% - -% \appendtoks \let\rob\do@@amrob \to \everysetmenucommands - -\def\menu@rob[#1]#2\\% - {\@@amboxcommand\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}% - -\appendtoks \let\rob\menu@rob \to \everysetmenucommands - -% calls: -% {..} [JS..] -% [left] {..} [JS..] -% [a=b] {..} [JS..] -% [left] [a=b] {..} [JS..] -% -% \setupbuttons[offset=0pt,frame=off] % alternative=hidden -% -% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})] -% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})] -% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})] -% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})] -% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})] -% -% \rob [JS(...)] bla bla \\ - -\unexpanded\def\overlayrollbutton - {\dodoubleargument\dooverlayrollbutton} - -\def\dooverlayrollbutton[#1][#2]% - {\bgroup - \nextsystemfield - \setupfield - [overlayrollbutton] - [\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]% - \definesymbol - [\currentsystemfield] - [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]% - \definefield - [\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]% - \fitfield[\currentsystemfield]% - \egroup} - -% \defineoverlay -% [ShowMenu] -% [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}] - \def\inlinedbox {\bgroup \dowithnextbox @@ -708,19 +392,6 @@ \unexpanded\def\asciistr#1{\dontleavehmode{\defconvertedargument\ascii{#1}\verbatimfont\ascii}} -% messy, will be improved: - -\prependtoks \setnormalcatcodes \to \everyTEXinputmode -\appendtoks \processingXMLfalse \to \everyTEXinputmode - -\let\normalenableXML\enableXML % some day we move the normal \enableXML into the toks - -\prependtoks \normalenableXML \to \everyXMLinputmode -\appendtoks \processingXMLtrue \to \everyXMLinputmode - -\unexpanded\def\enableXML {\setinputmode[XML]} % \enableXML is used in edef's and marks -\unexpanded\def\disableXML{\setinputmode[TEX]} - \def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax} \let\normaltype\type @@ -771,10 +442,6 @@ \fi \fi \advance\boislevel\minusone} -\defineblankmethod [\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut} - -% \vtop{\blank[synchronize]\blank[line]test} - \def\minimalhbox#1#% {\dowithnextbox {\bgroup @@ -784,28 +451,6 @@ \egroup} \hbox} -% manual -% -% externfiguur -> grid =ja|hoogte|diepte|halveregel|passend -> helemaal in details -% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details' - -% todo: switch koppelen aan par scheelt pos - -% to be documented: \startspread .. \stopspread - -% to be documented primarydef p crossed d -% to be documented PlainTextArea - -% manual -% -% Sometimes the demands are getting pretty weird: -% -% \startitemize -% \item test -% \item test -% \headsym{xx} test \par test -% \stopitemize - % \def\dodimchoice#1#2#3% % {\ifx#3\relax % #1\@EA\gobbleuntilrelax @@ -853,22 +498,6 @@ \def\showsetupsdefinition[#1]{\showvalue{\??su:#1}} % temp hack for debugging % documentation : \setupregister[alternative=a|b|A|B] - -\def\defineXMLstore {\doquadrupleargument\dodefineXMLstore[\saveXMLasdata]} -\def\defineXMLgstore{\doquadrupleargument\dodefineXMLstore[\gsaveXMLasdata]} - -\def\dodefineXMLstore[#1][#2][#3][#4]% element attribute prefix % will become faster - {\defineXMLargument[#2][#3=\s!dummy]{#1{#4:\XMLop{#3}}}} - -\def\countXMLchildren[#1]#2% - {\startnointerference - \doglobal\newcounter\nofXMLchildren - \defineXMLargument[#1]{\doglobal\increment\nofXMLchildren}% - \startXMLignore - #2% - \stopXMLignore - \stopnointerference} - \unprotected \def\traceposstring#1#2#3% {\iftracepositions \smashedhbox% @@ -878,144 +507,6 @@ \vrule\!!width4\scratchdimen\!!height\scratchdimen\!!depth\scratchdimen}% \fi} -% It took quite a while to figure this out (using the preliminary 1.5 -% spec). There are still a lot of things to be implemented. This is -% the third alternative. - -% todo: multiple instances, dus indirect - -\let\currentrendering\empty - -\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}] -\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}] -\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}] -\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}] - -\newcounter\nofexternalrenderings - -\def\useexternalrendering{\doquadrupleempty\douseexternalrendering} -\def\setinternalrendering{\dodoubleempty \dosetinternalrendering} - -\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options - {\setgvalue{\??rd:#1}{\plusone{#1}{#2}{#3}{#4}}} - -\def\dosetinternalrendering[#1][#2]% tag options {content} - {\bgroup - \dowithnextbox - {\setgvalue{\??rd:#1}{\plustwo{#1}{IRO}{#1}{#2}}% - \let\objectoffset\zeropoint - \setobject{IRO}{#1}\hbox{\box\nextbox}% - \egroup}% - \hbox} - -\def\checkrendering#1% let's hope that \next is not used - {\iflocation - \doifsomething{#1}% - {\doifdefined{\??rd:#1}% - {\expanded{\getvalue{\??rd::\number\renderingtype{#1}}% - {\filterfromvalue{\??rd:#1}52}{\filterfromvalue{\??rd:#1}53}% - {\filterfromvalue{\??rd:#1}54}{\filterfromvalue{\??rd:#1}55}}}}% - \fi} - -\setvalue{\??rd::1}{\doinsertrendering} -\setvalue{\??rd::2}{\doinsertrenderingobject} - -\def\renderingtype #1{\filterfromvalue{\??rd:#1}51} -\def\renderingoptions#1{\filterfromvalue{\??rd:#1}55} - -\setexecutecommandcheck {startrendering} \checkrendering -\setexecutecommandcheck {stoprendering} \checkrendering -\setexecutecommandcheck {pauserendering} \checkrendering -\setexecutecommandcheck {resumerendering} \checkrendering - -% by using a nice trick (used in other places of context as well) we -% can easily overload the default size to match the opbject size - -\def\renderingwidth {8cm} -\def\renderingheight{6cm} - -\def\definerenderingwindow - {\dodoubleempty\dodefinerenderingwindow} - -\def\dodefinerenderingwindow[#1][#2]% - {\presetlocalframed[\??rw#1]% - \getparameters% - [\??rw#1]% - [\c!openpageaction=,\c!closepageaction=,% - \c!width=\renderingwidth,\c!height=\renderingheight,% - #2]} - -\def\setuprenderingwindow - {\dodoubleargument\dosetuprenderingwindow} - -\def\dosetuprenderingwindow[#1]% - {\getparameters[\??rw#1]} - -\def\placerenderingwindow - {\dodoubleempty\doplacerenderingwindow} - -\def\doplacerenderingwindow[#1][#2]% - {\bgroup - \edef\currentrendering{\ifsecondargument#2\else#1\fi}% - \ifcase\renderingtype\currentrendering\or - % a file - \or - % an object - \getobjectdimensions{IRO}\currentrendering - \scratchdimen\objectheight - \advance\scratchdimen\objectdepth - \edef\renderingheight{\the\scratchdimen}% - \edef\renderingwidth{\objectwidth}% - \fi - % create fall back if needed - \doifdefinedelse{\??rw#1\c!width} - {\def\currentrenderingwindow{#1}} - {\let\currentrenderingwindow\s!default - \definerenderingwindow[\currentrenderingwindow]}% - \checkrendering\currentrendering - \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction - \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction - \localframed - [\??rw\currentrenderingwindow][\c!offset=\v!overlay]% - {\expanded{\doinsertrenderingwindow - \noexpand\currentrendering\hsize\vsize{\renderingoptions\currentrendering}}}% - \egroup} - -% todo: -% -% \setinternalrendering[example-1][options]{} - -% test file: -% -% \definerenderingwindow -% [example] -% [width=320pt,height=150pt,frame=off, -% background=color,backgroundcolor=gray, -% openpageaction=StartCurrentRendering, -% closepageaction=NextPage]% StopCurrentRendering] -% -% \useexternalrendering[example-1][audio/mpeg] [eldorado.mp3] -% \useexternalrendering[example-2][audio/mpeg] [myst-12.mp3] -% \useexternalrendering[example-3][application/x-shockwave-flash][http://localhost/mb.swf] [auto] -% \useexternalrendering[example-4][application/x-shockwave-flash][celebration.swf] -% \useexternalrendering[example-5][video/quicktime] [p1000726.mov] -% \useexternalrendering[example-6][application/smil] [quadratic_map.smi] -% -% \def\renderingmenu[#1]% -% {\hbox -% {\setupbuttons[width=2.5em]% -% \button{\symbol[StartRendering]} [StartRendering{#1}]\enspace -% \button{\symbol[StopRendering]} [StopRendering{#1}]\enspace -% \button{\symbol[PauseRendering]} [PauseRendering{#1}]\enspace -% \button{\symbol[ResumeRendering]}[ResumeRendering{#1}]}} -% -% \renderingmenu[example-1]\blank -% \renderingmenu[example-2]\blank -% \renderingmenu[example-3]\blank -% \renderingmenu[example-4] \placefigure{A ShockWave}{\placerenderingwindow[example][example-4]} \page -% \renderingmenu[example-5] \placefigure{A Movie}{\placerenderingwindow[example][example-5]} \page -% \renderingmenu[example-6] \placefigure{A Smile}{\placerenderingwindow[example][example-6]} - % will be a MyWay % % \setuplayout[grid=yes] \setupcaption[figure][inbetween=] \useMPlibrary[dum] \setupcolors[state=start] @@ -1118,94 +609,12 @@ {\endgraf\verticalstrut\endgraf\kern-2\lineheight \egroup} -\def\definepushbutton % name optional setup - {\dodoubleempty\dodefinepushbutton} - -\def\dodefinepushbutton[#1][#2]% name setup - {\dododefinepushbutton{#1}{n}{push}% - \dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}% - \dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}% - \setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}} - -\def\dododefinepushbutton#1#2#3% - {\doifsymboldefinedelse{psym:#1:#2}% - \donothing{\definesymbol[psym:#1:#2][{#3}]}} - -\def\definepushsymbol - {\dotripleargument\dodefinepushsymbol} - -\def\dodefinepushsymbol[#1][#2]% [#3] - {\definesymbol[psym:#1:#2]} - -\def\dopushbutton[#1][#2]% - {\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}} - -\def\pushbutton - {\dodoubleargument\dopushbutton} - -\def\dohandlepushbutton#1#2#3% identifier setup script - {\bgroup - \nextsystemfield - \setupfield - [pushbutton] - [\c!frame=\v!overlay, - \c!offset=\v!overlay, - \c!clickout=#3,#2]% - \definefield - [\currentsystemfield] - [push] - [pushbutton] - [psym:#1:n,psym:#1:r,psym:#1:d]% - \fitfield - [\currentsystemfield]% - \egroup} - -% \def\do@@ampsh -% {\dodoubleargument\dodo@@ampsh} -% -% \def\dodo@@ampsh[#1][#2]#3\\% -% {\txt\pushbutton[#1][#2]\\}% -% -%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands - -\def\@@ampsh{\txt\pushbutton} - -\appendtoks \let\psh\@@ampsh \to \everysetmenucommands - -% \definepushbutton [reset] -% -% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}] -% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}] -% -% \startinteractionmenu[bottom] -% \psh [reset] [JS(reset_something)] \\ -% \stopinteractionmenu - \def\tabulaterule % to be redone, not correct {\dotabulaterule {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax \doifvalue{\??tt\currenttabulate\c!distance}\v!grid {\kern-\scratchdimen}}} % experimental tm-prikkels -% todo: \setupinterlinespace[\c!regel=\v!vast] => ==\the\baselineskip - -%%%%%%%% todo: \chardef\snapstruts=1 => d=l-h - -\def\useMPvariables - {\dodoubleargument\douseMPvariables} - -\def\douseMPvariables[#1][#2]% - {\def\@@meta{#1:}% - \prepareMPvariables{#2}} - -\def\processlinetableXMLfile#1% - {\bgroup - \let\startlinetable\donothing - \let\stoplinetable \donothing - \startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis - \startlinetablerun \processXMLfile{#1}\stoplinetablerun - \egroup} - % experimental: \synchronizegrid bla bla bla \newcounter\currentgridsync @@ -1241,13 +650,10 @@ % \message{no grid correction: \the\scratchdimen}\wait \fi} -% needed for extreme +% needed for extreme (will go away) \definesystemvariable{ie} -% \def\definetest[#1]#2% -% {\long\setvalue{\??ie#1}{#2}} - \def\definetest {\dodoubleempty\dodefinetest} @@ -1257,13 +663,13 @@ \processaction [#2] [% first test true, rest depends - \v!next=>\setgvalue{\??ie#1}{\setgvalue{\??ie#1}{#3}\firstoftwoarguments}, + \v!next=>\setgvalue{\??ie#1}{\setgvalue{\??ie#1}{#3}\firstoftwoarguments}, % rest true if first true % \v!first=>\setgvalue{\??ie#1}{#3{\letgvalue{\??ie#1}% - % \firstoftwoarguments\firstoftwoarguments}% - % \secondoftwoarguments}, + % \firstoftwoarguments\firstoftwoarguments}% + % \secondoftwoarguments}, % always true - \v!yes=>\letgvalue{\??ie#1}\firstoftwoarguments, + \v!yes=>\letgvalue{\??ie#1}\firstoftwoarguments, % always false \v!no=>\letgvalue{\??ie#1}\secondoftwoarguments]% \fi} @@ -1296,42 +702,13 @@ % \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}% % \stoptabulate} -\long \def\tableifelse#1% +\long\def\tableifelse#1% {\TABLEnoalign{#1% {\aftergroup \firstoftwoarguments}% {\aftergroup\secondoftwoarguments}}} -% \long \def\tableif#1% whow, this is real ugly -% {\TABLEnoalign{\let\gnext\gobbleoneargument#1% -% {\let\gnext\firstofoneargument}}\gnext} - \long \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}} -\def\expandifnonempty#1% - {\@EA\ifx\csname#1\endcsname\empty - \expandafter\secondoftwoarguments - \else - \expandafter\firstoftwoarguments - \fi - {\csname#1\endcsname}} - -\def\@@sectiekoppeling#1% - {\expandifnonempty{\??ko#1\c!coupling}{#1}} - -\def\@@sectiesectie#1% - {\expandifnonempty{\??ko#1\c!section}{\@@sectiekoppeling{#1}}} - -\def\sectioncountervalue#1% - {\@@sectionvalue{\@@sectiesectie{#1}}} - -% todo namespace \@@meta:#1:... ! ! ! ! ! ! - -\def\presetMPvariable - {\dodoubleargument\dopresetMPvariable} - -\def\dopresetMPvariable[#1][#2=#3]% - {\doifundefined{#1:#2}{\setvalue{#1:#2}{#3}}} - % experiment, not yet to be used \def\displaybreak @@ -1347,30 +724,6 @@ \def\tightvbox{\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\vbox} \def\tightvtop{\dowithnextbox{\nextboxht\zeropoint\flushnextbox}\vtop} -% \translateMPinput{il2-pl} -% -% \startMPenvironment[global] -% \setupbodyfont[plr] -% \stopMPenvironment -% -% \TeX: ± ¶ -% -% \startMPcode -% draw btex MetaPost: ± ¶ etex scaled 5 ; -% \stopMPcode - -% now in cont-loc.tex, for the sake of testing. -% -% %D When \type {\somecolor} is issued, we can savely assume -% %D grouping. Using \type {\groupedcommand} here (i.e.\ the -% %D definition of \type {\color}) is unsafe because in -% %D interferes with for instance switching attributes. -% -% \def\switchtocolor[#1]% -% {\bgroup\startcolor[#1] -% \aftergroup\stopcolor -% \aftergroup\egroup} - % what is this stupid macro meant for: \def\hyphenationpoint @@ -1502,8 +855,6 @@ \egroup \synchronizehsize} -% todo : hoe komt box er uit - \long\def\startexternalfigure {\dotripleempty\dostartexternalfigure} @@ -1538,6 +889,18 @@ %% \def\changedpage#1% %% {\getvalue{\s!paragraph:p:#1}} +\newcount\nofprofiled + +\def\profilemacro#1% + {\nofprofiled\zerocount + \letvalue{\string#1\string#1}#1% + \appendtoks + \normalwritestatus\m!systems{profile \string#1: \number\nofprofiled}% + \to \everystoptext + \unexpanded\def#1% + {\global\advance\nofprofiled\plusone + \csname\string#1\string#1\endcsname}} + % incomplete, will be a special case of float placement \def\startfixed{\dosingleempty\dostartfixed} @@ -1555,7 +918,7 @@ \processaction [#2] [ \v!high=>\bbox {\flushnextbox}, - \v!low=>\tbox {\flushnextbox}, + \v!low=>\tbox {\flushnextbox}, \v!middle=>\vcenter{\flushnextbox}, \v!lohi=>\vcenter{\flushnextbox}, \s!unknown=>\tbox {\flushnextbox}, @@ -1596,44 +959,29 @@ % % \stopitemize -% still needed for uguide - -\let\placefloatlabel \placefloatcaption -\let\placefloatlabeltext \placefloatcaptiontext -\let\placefloatlabelreference \placefloatcaptionreference - \def\obeyfollowingtoken{{}} % end \cs scanning -\def\gobbleparameters{\doquadrupleempty\dogobbleparameters} -\def\dogobbleparameters[#1][#2][#3][#4]{} - -% documentation - -% \starttable[|||] -% \HL -% \VL test \VS test \VL \FR -% \VL test \VD test \VL \MR -% \VL test \VT test \VL \LR -% \HL -% \stoptable - -%D To be documented, \type {\includemenu[menu]}. -%D To be documented, \type {\emphbf} cum suis. - -%D For Ton. To be documented. - -\def\plaatsexterndocument[#1]% - {\def\doexternaldocument##1##2##3{\readlocfile{##2}\donothing\donothing}% - \getvalue{\v!file:::#1}} - -%D Far from complete. - -\def\startgeheel - {\startlinecorrection - \insidefloattrue} - -\def\stopgeheel - {\stoplinecorrection} +% \def\comparedimension#1#2% +% {\chardef\compresult +% \ifdim#1<#2% +% \zerocount +% \else\ifdim#1<#2% +% \plusone +% \else +% \plustwo +% \fi\fi} +% \newdimen\roundingeps \roundingeps=10sp +% \def\comparedimensioneps#1#2% +% {\chardef\compresult +% \ifdim\dimexpr(#1-#2)<\roudingeps +% \zerocount +% \else\ifdim\dimexpr(#2-#1)<\roudingeps +% \zerocount +% \else\ifdim#1<#2% +% \plusone +% \else +% \plustwo +% \fi\fi\fi} %D Next we load a few local optimizations and new features. They %D live on on my machine and are not distributed, but they may end @@ -1643,6 +991,6 @@ \readsysfile {cont-loc} {} {} % local improvements, patches, new features \readsysfile {cont-exp} {} {} % experimental features (e.g. local speed-ups) -\readsysfile {cont-mtx} {} {} % experimental metatex features +%readsysfile {cont-mtx} {} {} % experimental metatex features \protect \endinput diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii index 61650e4fd..24a4d6514 100644 --- a/tex/context/base/context.mkii +++ b/tex/context/base/context.mkii @@ -15,35 +15,35 @@ %D manipulation macros. The first one loads \PLAIN\ \TEX, as %D minimal as possible. -\loadcorefile{syst-ini.tex} -\loadcorefile{norm-tex.tex} -\loadcorefile{norm-etx.tex} -\loadcorefile{norm-ptx.tex} -\loadcorefile{norm-xtx.tex} -\loadcorefile{norm-ctx.tex} -\loadcorefile{syst-pln.tex} +\loadcorefile{syst-ini} +\loadcorefile{norm-tex} +\loadcorefile{norm-etx} +\loadcorefile{norm-ptx} +\loadcorefile{norm-xtx} +\loadcorefile{norm-ctx} +\loadcorefile{syst-pln} \loadmarkfile{catc-ini} -\loadcorefile{catc-act.tex} -\loadcorefile{catc-def.tex} -\loadcorefile{catc-ctx.tex} -\loadcorefile{catc-sym.tex} - -\loadcorefile{syst-gen.tex} -\loadcorefile{syst-ext.tex} -\loadcorefile{syst-new.tex} +\loadcorefile{catc-act} +\loadcorefile{catc-def} +\loadcorefile{catc-ctx} +\loadcorefile{catc-sym} + +\loadmarkfile{syst-gen} +\loadmarkfile{syst-ext} +\loadmarkfile{syst-new} \loadmarkfile{syst-con} -\loadcorefile{thrd-trg.tex} % based on: David Carlisle +\loadmarkfile{thrd-trg} % based on: David Carlisle \loadmarkfile{syst-fnt} \loadmarkfile{syst-str} \loadmarkfile{syst-rtp} \ifnum\texengine=\xetexengine - \loadcorefile{xetx-ini.tex} - \loadcorefile{xetx-utf.tex} - \loadcorefile{xetx-chr.tex} - \loadcorefile{xetx-cls.tex} + \loadmarkfile{xetx-ini} + \loadmarkfile{xetx-utf} + \loadmarkfile{xetx-chr} + \loadmarkfile{xetx-cls} \fi %D To enable selective loading, we say: @@ -60,36 +60,35 @@ %D modules. \loadmarkfile{mult-ini} -\loadcorefile{mult-fst.tex} -\loadcorefile{mult-sys.tex} -\loadcorefile{mult-def.tex} +\loadcorefile{mult-fst} +\loadcorefile{mult-sys} +\loadcorefile{mult-def} \loadmarkfile{mult-chk} %D Now we're ready for some general support modules. These %D modules implement some basic typesetting functionality. -\loadcorefile{core-var.tex} +\loadmarkfile{core-var} \loadmarkfile{core-env} -\loadcorefile{supp-box.tex} -\loadcorefile{supp-mrk.tex} -\loadcorefile{supp-vis.tex} -\loadcorefile{supp-fun.tex} -%loadcorefile{supp-eps.tex} -\loadcorefile{supp-spe.tex} +\loadcorefile{supp-box} +\loadmarkfile{supp-mrk} +\loadcorefile{supp-vis} +\loadcorefile{supp-fun} +%loadmarkfile{supp-eps} +\loadmarkfile{supp-spe} \loadmarkfile{supp-ran} -%loadcorefile{supp-mps.tex} -\loadmkiifile{supp-mps.tex} -\loadmkiifile{supp-tpi.tex} -\loadcorefile{supp-mat.tex} -\loadcorefile{supp-ali.tex} -\loadcorefile{supp-num.tex} +\loadmarkfile{supp-mps} +\loadmarkfile{supp-tpi} +\loadcorefile{supp-mat} +\loadcorefile{supp-ali} +\loadcorefile{supp-num} %D Verbatim typesetting is implemented in a separate class of %D modules. The pretty typesetting modules are loaded at run %D time. -\loadcorefile{verb-ini.tex} +\loadmarkfile{verb-ini} %D The following modules are not sequentially dependent, %D i.e. they have ugly dependencies, which will be cleaned @@ -99,33 +98,33 @@ %D bit more advanced file handling as well as some general %D variables, and features, so next we load: -\loadcorefile{core-ins.tex} -\loadcorefile{core-fil.tex} +\loadmarkfile{page-ins} +\loadmarkfile{core-fil} \loadmarkfile{core-con} %D We already need some synonyms (patterns). At runtime this %D file will be reloaded. -\loadcorefile{cont-fil.tex} +\loadcorefile{cont-fil} %D \CONTEXT\ does not implement its own table handling. We %D just go for the best there is and load \TABLE. Just to be %D sure we do it here, before we redefine \type{|}. -\loadcorefile{thrd-tab.tex} % based on: Michael Wichura / will be reimplemented +\loadcorefile{thrd-tab} % based on: Michael Wichura / will be reimplemented %D Here comes the last support modules. They take care of %D some language specific things. -\loadcorefile{supp-pat.tex} +\loadmarkfile{supp-pat} %D The next few modules do what their names state. They %D load additional definition modules when needed. \loadmarkfile{regi-ini} -\loadcorefile{regi-syn.tex} +\loadcorefile{regi-syn} \loadmarkfile{enco-ini} -%loadcorefile{filt-ini.tex} +%loadmarkfile{filt-ini} \loadmarkfile{hand-ini} \loadmarkfile{lang-ini} @@ -134,15 +133,15 @@ \loadmarkfile{unic-ini} -\loadcorefile{core-gen.tex} +\loadmarkfile{core-gen} \loadmarkfile{core-uti} \loadmarkfile{core-two} -\loadcorefile{core-stg.tex} +\loadmarkfile{core-stg} -\loadcorefile{spec-ini.tex} -\loadcorefile{spec-mis.tex} -\loadcorefile{spec-def.tex} -\loadcorefile{spec-var.tex} +\loadmarkfile{spec-ini} +\loadmarkfile{spec-mis} +\loadmarkfile{spec-def} +\loadmarkfile{spec-var} \loadmarkfile{colo-ini} \loadmarkfile{colo-ext} @@ -150,29 +149,28 @@ %D For the moment we load a lot of languages. In the future %D we'll have to be more space conservative. -\loadcorefile{lang-mis.tex} +\loadmarkfile{lang-mis} \loadmarkfile{lang-url} -\loadcorefile{lang-ger.tex} -\loadcorefile{lang-ita.tex} -\loadcorefile{lang-sla.tex} -\loadcorefile{lang-alt.tex} -\loadcorefile{lang-ana.tex} -\loadcorefile{lang-art.tex} -\loadcorefile{lang-bal.tex} -\loadcorefile{lang-cel.tex} -\loadcorefile{lang-grk.tex} -\loadcorefile{lang-ind.tex} -\loadcorefile{lang-ura.tex} -\loadcorefile{lang-vn.tex} -\loadcorefile{lang-ara.tex} -\loadcorefile{lang-cyr.tex} +\loadcorefile{lang-ger} +\loadcorefile{lang-ita} +\loadcorefile{lang-sla} +\loadcorefile{lang-alt} +\loadcorefile{lang-ana} +\loadcorefile{lang-art} +\loadcorefile{lang-bal} +\loadcorefile{lang-cel} +\loadcorefile{lang-grk} +\loadcorefile{lang-ind} +\loadcorefile{lang-ura} +\loadcorefile{lang-vn} +\loadcorefile{lang-cyr} \loadmarkfile{typo-ini} %D All kind of symbols are handled in: -\loadcorefile{symb-ini.tex} +\loadmarkfile{symb-ini} %D Sorting: @@ -183,10 +181,9 @@ %D is important, due to dependancies. \loadmarkfile{core-spa} -\loadcorefile{core-grd.tex} +\loadmarkfile{core-grd} \loadmarkfile{strc-mar} \loadmarkfile{anch-pos} -\loadcorefile{core-mak.tex} \loadmarkfile{buff-ver} \loadmarkfile{buff-ini} @@ -194,9 +191,9 @@ \loadmarkfile{pack-rul} \loadmarkfile{trac-vis} \loadmarkfile{strc-num} -\loadcorefile{tabl-pln.tex} -\loadcorefile{tabl-tab.tex} -\loadcorefile{tabl-tsp.tex} +\loadmarkfile{tabl-pln} +\loadmarkfile{tabl-tab} +\loadmarkfile{tabl-tsp} \loadmarkfile{scrn-nav} \loadmarkfile{strc-ref} \loadmarkfile{pack-obj} @@ -209,22 +206,22 @@ \loadmarkfile{page-ini} \loadmarkfile{page-bck} -\loadcorefile{page-not.tex} +\loadmarkfile{page-not} \loadmarkfile{page-one} -\loadcorefile{page-lay.tex} -\loadmkiifile{page-log.tex} +\loadmarkfile{page-lay} +\loadmarkfile{page-log} \loadmarkfile{page-txt} -\loadcorefile{page-sid.tex} +\loadmarkfile{page-sid} \loadmarkfile{strc-flt} -\loadcorefile{page-mis.tex} -\loadcorefile{page-mul.tex} -\loadcorefile{page-set.tex} +\loadmarkfile{page-mis} +\loadmarkfile{page-mul} +\loadmarkfile{page-set} \loadmarkfile{pack-lyr} -\loadcorefile{page-mak.tex} +\loadmarkfile{page-mak} \loadmarkfile{strc-pag} \loadmarkfile{page-lin} -\loadcorefile{page-par.tex} -\loadcorefile{page-mar.tex} +\loadmarkfile{page-par} +\loadmarkfile{page-mar} \loadmarkfile{core-job} % why so late? @@ -234,18 +231,19 @@ \loadmarkfile{strc-swd} \loadmarkfile{strc-blk} -\loadcorefile{page-imp.tex} -\loadcorefile{tabl-tbl.tex} +\loadmarkfile{page-imp} +\loadmarkfile{tabl-tbl} \loadmarkfile{scrn-int} \loadmarkfile{tabl-ntb} -\loadcorefile{tabl-nte.tex} -\loadcorefile{tabl-ltb.tex} +\loadmarkfile{tabl-nte} +\loadmarkfile{tabl-ltb} %D A few more languages, that have specifics using core %D functionality: -\loadcorefile{lang-chi.tex} -\loadcorefile{lang-jap.tex} +%loadmarkfile{lang-ara} % undefined +\loadmarkfile{lang-chi} +\loadmarkfile{lang-jap} %D How about fill||in fields and related stuff? @@ -265,17 +263,17 @@ \loadmarkfile{font-ini} \ifnum\texengine=\xetexengine - \loadcorefile{font-xtx.tex} + \loadmarkfile{font-xtx} \fi \loadmarkfile{font-unk} \loadmarkfile{font-uni} -\loadcorefile{font-bfm.tex} +\loadmarkfile{font-bfm} -\loadcorefile{enco-pfr.tex} +\loadmarkfile{enco-pfr} \loadmarkfile{type-ini} -\loadcorefile{type-def.tex} +\loadcorefile{type-def} %D Properties. Don't ask. @@ -290,20 +288,20 @@ \loadmarkfile{meta-tex} \loadmarkfile{meta-pdf} -\loadcorefile{meta-pag.tex} +\loadmarkfile{meta-pag} %D Special page handling (maybe even later) -\loadcorefile{page-flw.tex} -\loadcorefile{page-spr.tex} -\loadcorefile{page-plg.tex} -\loadcorefile{page-str.tex} +\loadmarkfile{page-flw} +\loadmarkfile{page-spr} +\loadmarkfile{page-plg} +\loadmarkfile{page-str} %D Anchoring graphics: \loadmarkfile{anch-pgr} -\loadcorefile{anch-bar.tex} -\loadcorefile{anch-snc.tex} +\loadcorefile{anch-bar} +\loadcorefile{anch-snc} %D Math. @@ -316,7 +314,7 @@ \loadmarkfile{core-fnt} \loadmarkfile{strc-not} -\loadcorefile{core-lnt.tex} +\loadmarkfile{strc-lnt} \loadmarkfile{core-mis} @@ -324,35 +322,35 @@ \loadmarkfile{grph-inc} \loadmarkfile{grph-fig} -\loadcorefile{core-par.tex} +\loadmarkfile{core-par} \loadmarkfile{pack-box} -\loadcorefile{page-app.tex} +\loadmarkfile{page-app} \loadmarkfile{meta-fig} %D Language specific spacing. -\loadcorefile{lang-spa.tex} +\loadcorefile{lang-spa} %D Only the basic XML parser and remapper are part of the core. %D These macros are loaded last since they overload and|/|or %D extend previously defined ones. -\loadcorefile{xtag-ini.tex} -\loadcorefile{xtag-ext.tex} -\loadcorefile{xtag-exp.tex} -\loadcorefile{xtag-pre.tex} -\loadcorefile{xtag-xsd.tex} -\loadcorefile{xtag-rng.tex} +\loadcorefile{xtag-ini} +\loadcorefile{xtag-ext} +\loadcorefile{xtag-exp} +\loadcorefile{xtag-pre} +\loadcorefile{xtag-xsd} +\loadcorefile{xtag-rng} %D How about this: -\loadcorefile{meta-xml.tex} +\loadcorefile{meta-xml} %D \TEX\ related logo's are always typeset in a special way. %D Here they come: -\loadcorefile{cont-log.tex} +\loadcorefile{cont-log} %D This one overloads af few things: @@ -361,8 +359,7 @@ %D Defaults go here (more will be moved to this module %D later): -\loadcorefile{core-lme.tex} -\loadcorefile{core-ini.tex} +\loadmarkfile{core-ini} \loadmarkfile{core-def} %D Preloaded modules (some need xml support): @@ -383,4 +380,4 @@ % %D Except from english, no hyphenation patterns are loaded % %D yet. Users can specify their needs in the next module: % -% \input cont-usr.tex +% \input cont-usr diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index fc3149f6b..735d1c780 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -18,19 +18,25 @@ %D manipulation macros. The first one loads \PLAIN\ \TEX, as %D minimal as possible. -\loadcorefile{syst-ini.tex} -\loadcorefile{norm-ctx.tex} -\loadcorefile{syst-pln.tex} +\loadcorefile{syst-ini} + +\ifnum\luatexversion<42 + \writestatus{!!!!}{Your luatex binary is way too old, you need at least version 0.42.} + \expandafter\end +\fi + +\loadcorefile{norm-ctx} +\loadcorefile{syst-pln} \loadmarkfile{luat-cod} \loadmarkfile{luat-bas} \loadmarkfile{luat-lib} \loadmarkfile{catc-ini} -\loadcorefile{catc-act.tex} -\loadcorefile{catc-def.tex} -\loadcorefile{catc-ctx.tex} -\loadcorefile{catc-sym.tex} +\loadcorefile{catc-act} +\loadcorefile{catc-def} +\loadcorefile{catc-ctx} +\loadcorefile{catc-sym} \newif\ifCONTEXT \CONTEXTtrue % will disappear @@ -50,10 +56,11 @@ \loadmarkfile{char-act} \loadmarkfile{mult-ini} -\loadcorefile{mult-fst.tex} -\loadcorefile{mult-sys.tex} -\loadcorefile{mult-def.tex} +\loadcorefile{mult-fst} +\loadcorefile{mult-sys} +\loadcorefile{mult-def} \loadmarkfile{mult-chk} +\loadmarkfile{mult-cld} \loadmarkfile{luat-ini} @@ -63,12 +70,11 @@ \loadmarkfile{node-fin} \loadmarkfile{node-par} -\loadcorefile{core-var.tex} - -\loadmarkfile{lpdf-ini} +\loadmarkfile{core-var} \loadmarkfile{back-ini} -\loadmarkfile{back-pdf} +\loadmarkfile{lpdf-ini} % some day back-ini will load this +\loadmarkfile{back-pdf} % some day back-ini will load this \loadmarkfile{attr-ini} @@ -77,71 +83,70 @@ \loadmarkfile{trac-lmx} \loadmarkfile{trac-deb} -\loadcorefile{supp-box.tex} +\loadcorefile{supp-box} -\loadcorefile{supp-vis.tex} -\loadcorefile{supp-fun.tex} +\loadcorefile{supp-vis} +\loadcorefile{supp-fun} \loadmarkfile{supp-ran} -\loadcorefile{supp-mat.tex} -\loadcorefile{supp-ali.tex} -\loadcorefile{supp-num.tex} +\loadcorefile{supp-mat} +\loadcorefile{supp-ali} +\loadcorefile{supp-num} \loadmarkfile{typo-ini} -\loadcorefile{core-ins.tex} -\loadcorefile{core-fil.tex} +\loadmarkfile{page-ins} +\loadmarkfile{core-fil} \loadmarkfile{core-con} -\loadcorefile{cont-fil.tex} +\loadcorefile{cont-fil} \loadmarkfile{regi-ini} -\loadcorefile{regi-syn.tex} +\loadcorefile{regi-syn} \loadmarkfile{enco-ini} \loadmarkfile{hand-ini} \loadmarkfile{lang-ini} -\loadmarkfile{lang-spe} \loadmarkfile{lang-lab} \loadmarkfile{unic-ini} -\loadcorefile{core-gen.tex} +\loadmarkfile{core-gen} \loadmarkfile{core-uti} \loadmarkfile{core-two} -\loadcorefile{core-stg.tex} \loadmarkfile{colo-ini} \loadmarkfile{colo-ext} \loadmarkfile{trac-vis} -\loadcorefile{lang-mis.tex} +\loadmarkfile{lang-mis} \loadmarkfile{lang-url} -\loadcorefile{lang-ger.tex} -\loadcorefile{lang-ita.tex} -\loadcorefile{lang-sla.tex} -\loadcorefile{lang-alt.tex} -\loadcorefile{lang-ana.tex} -\loadcorefile{lang-art.tex} -\loadcorefile{lang-bal.tex} -\loadcorefile{lang-cel.tex} -\loadcorefile{lang-grk.tex} -\loadcorefile{lang-ind.tex} -\loadcorefile{lang-ura.tex} -\loadcorefile{lang-cjk.tex} -\loadcorefile{lang-vn.tex} -\loadcorefile{lang-ara.tex} -\loadcorefile{lang-cyr.tex} - -\loadcorefile{symb-ini.tex} +\loadcorefile{lang-ger} +\loadcorefile{lang-ita} +\loadcorefile{lang-sla} +\loadcorefile{lang-alt} +\loadcorefile{lang-ana} +\loadcorefile{lang-art} +\loadcorefile{lang-bal} +\loadcorefile{lang-cel} +\loadcorefile{lang-grk} +\loadcorefile{lang-ind} +\loadcorefile{lang-ura} +\loadcorefile{lang-vn} +\loadcorefile{lang-cyr} + +\loadmarkfile{lang-ara} +\loadmarkfile{lang-cjk} + +\loadmarkfile{symb-ini} \loadmarkfile{sort-ini} \loadmarkfile{pack-rul} -\loadcorefile{lxml-ini} +\loadmarkfile{lxml-ini} \loadmarkfile{strc-ini} \loadmarkfile{strc-doc} @@ -158,13 +163,12 @@ \loadmarkfile{strc-ref} \loadmarkfile{strc-reg} -\loadcorefile{bibl-bib} +\loadmarkfile{bibl-bib} \loadmarkfile{core-spa} -\loadcorefile{core-grd.tex} +\loadmarkfile{core-grd} \loadmarkfile{anch-pos} -\loadcorefile{core-mak.tex} \loadmarkfile{scrn-nav} \loadmarkfile{pack-obj} @@ -177,23 +181,23 @@ \loadmarkfile{page-ini} \loadmarkfile{page-bck} -\loadcorefile{page-not.tex} +\loadmarkfile{page-not} \loadmarkfile{page-one} -\loadcorefile{page-lay.tex} +\loadmarkfile{page-lay} \loadmarkfile{page-txt} -\loadcorefile{page-sid.tex} +\loadmarkfile{page-sid} \loadmarkfile{strc-flt} -\loadcorefile{page-mis.tex} -\loadcorefile{page-mul.tex} -\loadcorefile{page-set.tex} +\loadmarkfile{page-mis} +\loadmarkfile{page-mul} +\loadmarkfile{page-set} \loadmarkfile{pack-lyr} -\loadcorefile{page-mak.tex} +\loadmarkfile{page-mak} \loadmarkfile{page-lin} -\loadcorefile{page-par.tex} -\loadcorefile{page-mar.tex} +\loadmarkfile{page-par} +\loadmarkfile{page-mar} \loadmarkfile{core-job} % why so late? @@ -202,19 +206,22 @@ \loadmarkfile{strc-blk} -\loadcorefile{page-imp.tex} +\loadmarkfile{page-imp} \loadmarkfile{scrn-int} +\loadmarkfile{scrn-men} +\loadmarkfile{scrn-but} +\loadmarkfile{scrn-bar} \loadmarkfile{strc-bkm} % bookmarks -\loadcorefile{tabl-pln.tex} -\loadcorefile{thrd-tab.tex} -\loadcorefile{tabl-tab.tex} -\loadcorefile{tabl-tbl.tex} +\loadmarkfile{tabl-pln} +\loadcorefile{thrd-tab} +\loadmarkfile{tabl-tab} +\loadmarkfile{tabl-tbl} \loadmarkfile{tabl-ntb} -\loadcorefile{tabl-nte.tex} -\loadcorefile{tabl-ltb.tex} -\loadcorefile{tabl-tsp.tex} +\loadmarkfile{tabl-nte} +\loadmarkfile{tabl-ltb} +\loadmarkfile{tabl-tsp} \loadmarkfile{java-ini} @@ -235,7 +242,7 @@ \loadmarkfile{typo-cap} \loadmarkfile{type-ini} -\loadcorefile{type-def.tex} +\loadcorefile{type-def} \loadmarkfile{scrp-ini} @@ -252,16 +259,16 @@ \loadmarkfile{meta-pdf} \loadmarkfile{meta-fun} -\loadcorefile{meta-pag.tex} +\loadmarkfile{meta-pag} -\loadcorefile{page-flw.tex} -\loadcorefile{page-spr.tex} -\loadcorefile{page-plg.tex} -\loadcorefile{page-str.tex} +\loadmarkfile{page-flw} +\loadmarkfile{page-spr} +\loadmarkfile{page-plg} +\loadmarkfile{page-str} -\loadmarkfile{anch-pgr} -\loadcorefile{anch-bar.tex} -\loadcorefile{anch-snc.tex} +\loadmarkfile{anch-pgr} % overloads tabl-tbl +\loadcorefile{anch-bar} +\loadcorefile{anch-snc} \loadmarkfile{math-pln} \loadmarkfile{math-ini} @@ -284,8 +291,7 @@ \loadmarkfile{core-fnt} \loadmarkfile{strc-not} - -\loadcorefile{core-lnt.tex} +\loadmarkfile{strc-lnt} \loadmarkfile{core-mis} @@ -294,28 +300,28 @@ \loadmarkfile{grph-fig} \loadmarkfile{pack-box} -\loadcorefile{page-app.tex} +\loadmarkfile{pack-bar} +\loadmarkfile{page-app} \loadmarkfile{meta-fig} -\loadcorefile{lang-spa.tex} +\loadcorefile{lang-spa} -\loadcorefile{xtag-ini.tex} % might go away -\loadcorefile{xtag-ext.tex} % might go away -\loadcorefile{xtag-exp.tex} % will go away -\loadcorefile{xtag-pre.tex} % has old encoding code -\loadcorefile{xtag-xsd.tex} % will go away (stub anyway) -\loadcorefile{xtag-rng.tex} % will go away (stub anyway) +\loadcorefile{xtag-ini} % might go away +\loadcorefile{xtag-ext} % might go away +\loadcorefile{xtag-exp} % will go away +\loadcorefile{xtag-pre} % has old encoding code +\loadcorefile{xtag-xsd} % will go away (stub anyway) +\loadcorefile{xtag-rng} % will go away (stub anyway) -\loadcorefile{meta-xml.tex} +\loadcorefile{meta-xml} -\loadcorefile{cont-log.tex} +\loadcorefile{cont-log} \loadmarkfile{task-ini} \loadmarkfile{core-ctx} -\loadcorefile{core-lme.tex} -\loadcorefile{core-ini.tex} +\loadmarkfile{core-ini} \loadmarkfile{core-def} %usemodule[x][res-04] % xml resource libraries diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 6316c6156..95c528f32 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{2009.06.13 14:03} +\edef\contextversion{2009.07.17 13:16} %D For those who want to use this: diff --git a/tex/context/base/core-def.mkii b/tex/context/base/core-def.mkii index ea2d0ff15..e51cd96d3 100644 --- a/tex/context/base/core-def.mkii +++ b/tex/context/base/core-def.mkii @@ -74,4 +74,11 @@ % \appendtoks\everyjob\expandafter{\the\everyjob\checkpreprocessor}\to\everydump +% normally one does not want this to happen nested, maybe there +% is more; non public vars btw, will become conditionals + +\ifx\writetoregisterfalse\undefined \else \appendtoks \writetoregisterfalse \to \everybeforeutilityread \fi +\ifx\writetolistfalse \undefined \else \appendtoks \writetolistfalse \to \everybeforeutilityread \fi +\ifx\notesenabledfalse \undefined \else \appendtoks \notesenabledfalse \to \everybeforeutilityread \fi + \protect \endinput diff --git a/tex/context/base/core-def.mkiv b/tex/context/base/core-def.mkiv index 380b733bc..782fe3f67 100644 --- a/tex/context/base/core-def.mkiv +++ b/tex/context/base/core-def.mkiv @@ -54,8 +54,6 @@ \appendtoks \ifarrangingpages\poparrangedpages\fi \to \everybye \appendtoks \registerfileinfo[end]\jobname \to \everybye -\prependtoks \resetutilities \to \everystarttext % moved 28-02-2002 - \appendtoks \MPLIBallocate{1000} \to \everydump \prependtoks \resetallattributes \to \everybeforeoutput diff --git a/tex/context/base/core-fil.tex b/tex/context/base/core-fil.mkii index fca253a7b..fca253a7b 100644 --- a/tex/context/base/core-fil.tex +++ b/tex/context/base/core-fil.mkii diff --git a/tex/context/base/core-fil.mkiv b/tex/context/base/core-fil.mkiv new file mode 100644 index 000000000..14154fca4 --- /dev/null +++ b/tex/context/base/core-fil.mkiv @@ -0,0 +1,317 @@ +%D \module +%D [ file=core-fil, +%D version=1997.11.15, +%D title=\CONTEXT\ Core Macros, +%D subtitle=File 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. + +\writestatus{loading}{ConTeXt Core Macros / File Support} + +\unprotect + +%D \macros +%D {definefilesynonym} +%D +%D One of the problems with loading files is that their names +%D can depend on the interface language. We therefore need a +%D method to define filesynonyms. The actual synonyms are +%D defined elsewhere, but look like: +%D +%D \starttyping +%D \definefilesynonym [chemic] [chemie] +%D \definefilesynonym [einheit] [unit] +%D \definefilesynonym [unit] [unit] +%D \stoptyping +%D +%D So we can say in english: +%D +%D \starttyping +%D \usemodules[pictex,chemic,unit] +%D \stoptyping +%D +%D and in dutch: +%D +%D \starttyping +%D \usemodules[pictex,chemie,unit] +%D \stoptyping + +% will be redone in mkiv + +\def\definefilesynonym + {\dodoubleempty\dodefinefilesynonym} + +\def\dodefinefilesynonym[#1][#2]% + {\ifcsname\??fs#1\endcsname + \doifnotvalue{\??fs#1}{#2}{\showmessage\m!files1{#1 (#2),\getvalue{\??fs#1}}}% + \fi + \doifelse{#1}{#2}{\letbeundefined{\??fs#1}{#2}}{\setevalue{\??fs#1}{#2}}} + +%D \macros +%D {definefilefallback} + +\def\definefilefallback + {\dodoubleargument\dodefinefilefallback} + +\def\dodefinefilefallback[#1][#2]% + {\doifnotfile{#1} + {\def\docommand##1{\doiffile{##1}{\definefilesynonym[#1][##1]\quitcommalist}}% + \processcommalist[#2]\docommand}} + +%D \macros +%D {truefilename} +%D +%D At the system level such a filename can be called upon by +%D saying: +%D +%D \starttyping +%D \truefilename{filename/filesynonym} +%D \stoptyping +%D +%D The implementation shows that nesting is supported. + +\def\truefilename#1% + {\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 +%D domain specific typesetting topics are however dealt with in +%D separate modules, e.g. typesetting of chemical structure +%D formulas. These modules are loaded by: +%D +%D \showsetup{usemodule} +%D +%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. + +\newconditional\moduleisloaded + +\def\dododousemodules#1#2% no \unprotect/\protect when loading, + {\relax % since we need to use ? ! unprotected + \ifconditional\moduleisloaded % sometimes (see xtag-map) + \let\next\relax % or: \expandafter\gobbleoneargument + \else + \makeshortfilename[#1\truefilename{#2}]% beware: *- is not part of syn + \doifelseflagged\shortfilename + {\showmessage\m!systems7{#2 (line \number\inputlineno)}% + \settrue\moduleisloaded + \let\next\relax} + {\doglobal\setflag\shortfilename + \def\next + {\startreadingfile + \readsysfile\shortfilename + {\showmessage\m!systems5{#2}\settrue\moduleisloaded} + {\readsysfile{\shortfilename.\mksuffix} % new + {\showmessage\m!systems5{#2 (\mksuffix)}\settrue\moduleisloaded} + \donothing}% + \stopreadingfile}}% + \fi + \next} + +\def\dodousemodules#1#2% + {\setfalse\moduleisloaded + \doifelsenothing{#1} + {\dododousemodules\f!moduleprefix {#2}% + \dododousemodules\f!privateprefix{#2}% + \dododousemodules\f!styleprefix {#2}% + \dododousemodules\f!xstyleprefix {#2}% + \dododousemodules\f!thirdprefix {#2}% + \dododousemodules\empty {#2}}% new, fall back on raw name + {\dododousemodules{#1-}{#2}}% + \ifconditional\moduleisloaded\else + \showmessage\m!systems6{#2}% + \appendtoks\showmessage\m!systems6{#2}\to\everynotabene + \fi} + +\def\usemodules + {\dotripleempty\dousemodules} + +\def\dousemodules[#1][#2][#3]% + {\pushmacro\currentmodule + \pushmacro\currentmoduleparameters + \let\currentmoduleparameters\empty + \ifthirdargument + \doifelsenothing{#2} + {\let\next\relax} + {\def\currentmoduleparameters{#3}% + \def\next{\processcommalist[#2]{\dodousemodules{#1}}}}% + \else\ifsecondargument + \doifelsenothing{#2} + {\let\next\relax} + {\doifassignmentelse{#2} + {\def\currentmoduleparameters{#2}% + \def\next{\processcommalist[#1]{\dodousemodules{}}}} + {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}}% + \else + \def\next{\processcommalist[#1]{\dodousemodules{}}}% + \fi\fi + \next + \popmacro\currentmoduleparameters + \popmacro\currentmodule} + +\let\currentmoduleparameters\empty +\let\currentmodule \s!unknown + +\def\startmodule + {\doifnextoptionalelse\dostartmodule\nostartmodule} + +\def\nostartmodule #1 % + {\dostartmodule[#1]} + +\def\dostartmodule[#1]% + {\pushmacro\currentmodule + \pushmacro\currentmoduleparameters + \def\currentmodule{#1}} + +\def\stopmodule + {\popmacro\currentmoduleparameters + \popmacro\currentmodule} + +\def\setupmodule + {\dodoubleempty\dosetupmodule} + +\def\dosetupmodule[#1][#2]% + {\scratchtoks\expandafter{\currentmoduleparameters}% + \ifsecondargument + \getparameters[\??md:#1:][#2]% + \expanded{\getparameters[\??md:#1:][\the\scratchtoks]}% + \else + \getparameters[\??md:\currentmodule:][#1]% + \expanded{\getparameters[\??md:\currentmodule:][\the\scratchtoks]}% + \fi + \let\currentmoduleparameters\empty} + +\def\moduleparameter #1#2{\executeifdefined{\??md:#1:#2}\s!empty} +\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}\s!empty} + +% \usemodule[newmml] +% \usemodule[newmml][a=b] +% \usemodule[x][newmml] +% \usemodule[x][newmml][a=b] +% +% \startmodule [mathml] +% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars will be set afterwards +% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars are now forgotten +% \stopmodule + +% one can introduce test sections with: +% +% \enablemode[newmml:test:\currentmoduleparameter{test}] +% \startmode[newmml:test:yes} ... \stopmode +% +% these will be ignored unless test=yes +% +% however, a better way is: + +\let\stopmoduletestsection\donothing + +\def\startmoduletestsection + {\bgroup + \setupmodule % we need to make sure that the vars are set + \doifelse{\currentmoduleparameter\v!test}\v!yes + {\egroup + \writestatus{\currentmodule}{loading experimental code}} + {\egroup + \writestatus{\currentmodule}{skipping experimental code}% + \gobbleuntil\stopmoduletestsection}} + +%D We also support a singular call, which saves us for +%D frustrations when we do a typo. + +\let\usemodule=\usemodules + +% %D The definition shows that the language specific settings +% %D are activated after loading all the modules specified. + +%D \macros +%D {ifprotectbuffers, bufferprefix, +%D TEXbufferfile, MPgraphicfile} +%D +%D The next switch enables protection of temporary filenames, +%D which is needed when we process more files on one path at +%D the same time. + +\newif\ifprotectbuffers + +\def\bufferprefix{\ifprotectbuffers\jobname-\fi} + +% The following filenames are defined here: + +\def\TEXbufferfile #1{\bufferprefix#1.\f!temporaryextension} +\def\MPgraphicfile {\bufferprefix mp\ifMPrun run\else graph\fi} % not needed in luatex +\def\convertMPcolorfile{\bufferprefix metacmyk.tmp} + +%D To save memory, we implement some seldomly used commands +%D in a lazy way. Nota bene: such runtime definitions are +%D global. +%D +%D \starttyping +%D \fetchruntimecommand\showaccents{\f!encodingprefix ...} +%D \stoptyping + +\def\fetchruntimecommand#1#2% + {\def#1{\dofetchruntimecommand#1{#2}}} + +\def\dofetchruntimecommand#1#2% + {\doifnotflagged{#2} + {\let#1\undefined + \startreadingfile + \startnointerference % \bgroup + \cleanupfeatures % better \setnormalcatcodes / test first + \readfile{#2}\donothing\donothing + \stopnointerference % \egroup + \stopreadingfile + \doglobal\setflag{#2}}% + \ifx#1\undefined + \writestatus\m!systems{command \string#1 not found in file #2}% + \def#1{{\infofont[unknown command \string#1]}}% + \fi + #1} + +%D Experimental: + +\let\checkpreprocessor\relax + +%D To be documented and probably moved + +\def\documentresources{\@@erurl} + +\def\setupexternalresources + {\dodoubleargument\getparameters[\??er]} + +\setupexternalresources + [url=] + +%D This module will be perfected / changed / weeded. + +\protect \endinput diff --git a/tex/context/base/core-gen.tex b/tex/context/base/core-gen.mkii index b6ab2a208..b6ab2a208 100644 --- a/tex/context/base/core-gen.tex +++ b/tex/context/base/core-gen.mkii diff --git a/tex/context/base/core-gen.mkiv b/tex/context/base/core-gen.mkiv new file mode 100644 index 000000000..b6ab2a208 --- /dev/null +++ b/tex/context/base/core-gen.mkiv @@ -0,0 +1,166 @@ +%D \module +%D [ file=core-gen, +%D version=1995.10.10, +%D title=\CONTEXT\ Core Macros, +%D subtitle=General, +%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 Core Macros / General} + +\unprotect + +%D \macros +%D {assigndimension,assignalfadimension} +%D +%D Hieronder worden enkele commando's gedefinieerd rond +%D toekenningen. Allereerst een commando om waarden aan +%D een \DIMENSION\ toe te kennen: +%D +%D \starttyping +%D \assigndimension +%D {<waarde>|klein|middel|groot|-klein|-middel|-groot|geen} +%D {\dimension} +%D {waarde klein} +%D {waarde middel} +%D {waarde groot} +%D \stoptyping +%D +%D Hierbij krijgt de \DIMENSION\ \type{\dimension} een waarde +%D afhankelijk van het meegegeven trefwoord. +%D +%D \startnarrower +%D \startlines +%D \type{(-)klein }\qquad (--) waarde klein +%D \type{(-)middel}\qquad (--) waarde middel +%D \type{(-)groot }\qquad (--) waarde groot +%D \type{geen }\qquad 0pt +%D \type{waarde }\qquad waarde +%D \stoplines +%D \stopnarrower +%D +%D Een trefwoord mag worden voorafgegaan door een \type{-}. +%D Deze macro toont een voorbeeld van het gebruik van +%D \type{\processaction} en constanten. +%D +%D Analoog aan het bovenstaande commando kennen we een +%D commando om waarden toe te kennen aan een macro: +%D +%D \starttyping +%D \assignalfadimension +%D {<waarde>|klein|middel|groot|geen} +%D {\macro} +%D {waarde klein} +%D {waarde middel} +%D {waarde groot} +%D \stoptyping + +% The third (optimized) version: + +\def\@ad@{@ad@} + +\setvalue{\@ad@ \v!none }{\zeropoint\gobblethreearguments} +\setvalue{\@ad@ \v!big }{\thirdofthreearguments} +\setvalue{\@ad@ \v!medium}{\secondofthreearguments} +\setvalue{\@ad@ \v!small }{\firstofthreearguments} +\setvalue{\@ad@-\v!big }{-\thirdofthreearguments} +\setvalue{\@ad@-\v!medium}{-\secondofthreearguments} +\setvalue{\@ad@-\v!small }{-\firstofthreearguments} + +\def\assigndimension#1#2% #3 #4 #5 + {#2=\ifcsname\@ad@#1\endcsname + \csname\@ad@#1\expandafter\endcsname + \else + #1\expandafter\gobblethreearguments + \fi} + +\def\@aa@{@aa@} + +\setvalue{\@aa@\v!none }{0\gobblethreearguments} +\setvalue{\@aa@\v!big }{\thirdofthreearguments} +\setvalue{\@aa@\v!medium}{\secondofthreearguments} +\setvalue{\@aa@\v!small }{\firstofthreearguments} + +\def\assignalfadimension#1#2#3#4#5% #3#4#5 are single digits + {\edef#2{\ifcsname\@aa@#1\endcsname + \csname\@aa@#1\expandafter\endcsname + \else + #1\expandafter\gobblethreearguments + \fi#3#4#5}} + +%D \macros +%D {assignvalue} +%D +%D Een variant hierop is het commando: +%D +%D \starttyping +%D \assignvalue +%D {<waarde>|klein|middel|groot} +%D {\macro} +%D {waarde klein } +%D {waarde middel} +%D {waarde groot} +%D \stoptyping +%D +%D Hierbij krijgt \type{\macro} een waarde afhankelijk van +%D het meegegeven trefwoord: +%D +%D \startnarrower +%D \startlines +%D \type{klein }\qquad waarde klein +%D \type{middel}\qquad waarde middel +%D \type{groot }\qquad waarde groot +%D \type{waarde}\qquad waarde +%D \stoplines +%D \stopnarrower +%D +%D Hier doet \type{geen} dus niet mee. + +\def\@av@{@av@} + +\letvalue{\@av@\v!big }\thirdofthreearguments +\letvalue{\@av@\v!medium}\secondofthreearguments +\letvalue{\@av@\v!small }\firstofthreearguments + +\def\assignvalue#1#2#3#4#5% + {\edef#2{\ifcsname\@av@#1\endcsname + \csname\@av@#1\expandafter\endcsname + \else + #1\expandafter\gobblethreearguments + \fi{#3}{#4}{#5}}} + +%D \macros +%D {assignwidth} +%D +%D Een breedte van een opgegeven tekst kan worden berekend en +%D toegekend aan een \DIMENSION\ met: +%D +%D \starttyping +%D \assignwidth +%D {\dimension} +%D {<waarde>|passend|ruim} +%D {tekst} +%D \stoptyping +%D +%D Dit commando sluit, evenals de bovenstaande +%D \type{\assign}||commando's, aan op de wijze waarop +%D in de andere \CONTEXT||modules toekenningen +%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte +%D met 1~em vermeerderd. + +\def\assignwidth#1#2#3#4% + {\doifelsenothing{#2} + {\setbox\scratchbox\hbox{#3}% + #1\wd\scratchbox} + {\doifinsetelse{#2}{\v!fit,\v!broad} + {\setbox\scratchbox\hbox{#3}% + #1\wd\scratchbox + \doif{#2}\v!broad{\advance#1 #4}}% + {#1=#2}}}% + +\protect \endinput diff --git a/tex/context/base/core-grd.tex b/tex/context/base/core-grd.mkii index 249e2e430..249e2e430 100644 --- a/tex/context/base/core-grd.tex +++ b/tex/context/base/core-grd.mkii diff --git a/tex/context/base/core-grd.mkiv b/tex/context/base/core-grd.mkiv new file mode 100644 index 000000000..d6cc93735 --- /dev/null +++ b/tex/context/base/core-grd.mkiv @@ -0,0 +1,1074 @@ +%D \module +%D [ file=core-grd, +%D version=1998.03.10, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Grid Snapping (Experimental), +%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 Core Macros / Grid Snapping} + +\unprotect + +%D Moved from supp-box: + +%D \macros +%D {startbaselinecorrection,baselinecorrection, +%D showbaselinecorrection,offbaselinecorrection} +%D +%D Spacing around ruled boxes can get pretty messed up. The +%D next macro tries as good as possible to fix this. +%D +%D \startbuffer[1] +%D \startbaselinecorrection +%D \ruledhbox{Rule Brittanica} +%D \stopbaselinecorrection +%D \stopbuffer +%D +%D \typebuffer[1] +%D +%D The macros put some white space around the box: +%D +%D \getbuffer[1] +%D +%D A simple alternative is \type {\baselinecorrection}, which +%D only looks at the previous line. +%D +%D \startbuffer[2] +%D \baselinecorrection +%D \ruledhbox{Rule Brittanica} +%D \baselinecorrection +%D \stopbuffer +%D +%D \typebuffer[2] +%D +%D This time the last preceding line gets a correction,% +%D dependant on the depth. +%D +%D \getbuffer[2] +%D +%D One can make the correction visible by saying \type +%D {\showbaselinecorrection}. Part of the correction is +%D calculated from the dimensions of a~(. One can disble the +%D correction by calling \type {\offbaselinecorrection}. +%D +%D When visualize the first example looks like: +%D +%D {\showbaselinecorrection\getbuffer[1]} +%D +%D and the second one comes out as: +%D +%D {\showbaselinecorrection\getbuffer[2]} + +% \definecolor[GridLineColor][red] +% \definecolor[GridTextColor][blue] + +\let\thetopbaselinecorrection \!!zeropoint +\let\thebotbaselinecorrection \!!zeropoint +\let\thenegtopbaselinecorrection\!!zeropoint +\let\thenegbotbaselinecorrection\!!zeropoint + +\definepalet + [grid] + [ one=red, + two=green, + three=blue, + four=gray] + +\def\setbaselinecorrections + {\setbox0\hbox{\setstrut\strut}% + \setbox2\hbox{(}% + \dimen0\ht0\advance\dimen0 -\ht2 + \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi + \dimen2\dp0\advance\dimen2 -\dp2 + \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi + \edef\thetopbaselinecorrection {\the\dimen0}\dimen0-\dimen0 + \edef\thebotbaselinecorrection {\the\dimen2}\dimen2-\dimen2 + \edef\thenegtopbaselinecorrection{\the\dimen0}% + \edef\thenegbotbaselinecorrection{\the\dimen2}} + +\def\dotopbaselinecorrection {\kern\thetopbaselinecorrection} +\def\dobotbaselinecorrection {\kern\thebotbaselinecorrection} +\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection} +\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection} + +\def\showbaselinecorrection + {\def\dobaselinecorrection % visualization is not watertight! + {\bgroup +\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi + \setbox0\null + \wd0\hsize + \dp0\strutdp + \nointerlineskip + \forgetall + \ruledvbox{\box0}% + \egroup + \prevdepth\strutdp}% + \def\dotopbaselinecorrection + {\hrule\!!height\thetopbaselinecorrection}% + \def\dobotbaselinecorrection + {\hrule\!!height\thebotbaselinecorrection}} + +\def\dobaselinecorrection + {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi + \kern\strutdp + \prevdepth\strutdp} + +% \def\baselinecorrection +% {\endgraf +% \ifvmode +% \ifdim\prevdepth<\maxdimen +% \ifdim\prevdepth<\zeropoint \else +% \ifdim\prevdepth<\strutdp +% \dobaselinecorrection +% \fi +% \fi +% \fi +% \fi} + +\def\baselinecorrection + {\endgraf + \ifvmode + \ifdim\prevdepth<\maxdimen + \ifdim\prevdepth<\zeropoint \else + \ifdim\prevdepth<\strutdepth \relax + \pushlastnode + \dobaselinecorrection + \poplastnode + \fi + \fi + \fi + \fi} + +\def\pagebaselinecorrection + {\ifdim\pagegoal<\maxdimen + \ifdim\pagetotal>\lineheight % or \topskip + \scratchdimen\pagetotal + \advance\scratchdimen\lineheight + \ifdim\scratchdimen<\pagegoal + \baselinecorrection + \fi + \fi + \fi} + +% Beware, keep this one as it is, see for instance module +% m-steps.tex, where we apply a \localhsize to the \vbox, in +% order to follow narrower and side floats ! + +% \def\startbaselinecorrection +% {\baselinecorrection +% \ifvmode +% \bgroup +% \setbox\scratchbox\vbox\bgroup +% \ignorespaces +% \let\stopbaselinecorrection\dostopbaselinecorrection +% \else +% \let\stopbaselinecorrection\relax +% \fi} + +% \def\dostopbaselinecorrection % I have to check columns yet. +% {\endgraf +% \egroup +% \topbaselinecorrection +% \box\scratchbox +% \botbaselinecorrection +% \egroup} + +% \let\stopbaselinecorrection=\relax + +\def\startbaselinecorrection + {\bgroup + \let\stopbaselinecorrection\egroup + \ifcase\baselinecorrectionmode + \or % normal + \baselinecorrection + \ifvmode + \setbox\scratchbox\vbox\bgroup\ignorespaces + \let\stopbaselinecorrection\donormalstopbaselinecorrection + \fi + \or % off + \or % force + \baselinecorrection + \ifvmode + \setbox\scratchbox\vbox\bgroup\ignorespaces + \let\stopbaselinecorrection\doforcedstopbaselinecorrection + \fi + \fi} + +\let\stopbaselinecorrection\relax + +\def\donormalstopbaselinecorrection % I have to check columns yet. + {\egroup + \topbaselinecorrection + \box\scratchbox + \botbaselinecorrection + \egroup} + +\def\doforcedstopbaselinecorrection % I have to check columns yet. + {\egroup + \forcedtopbaselinecorrection + \box\scratchbox + \forcedbotbaselinecorrection + \egroup} + +%D We do a bit more checking than needed. The pageborder check +%D is not needed, but I want to look the visualization as good +%D as possible too. + +% \def\offbaselinecorrection % Can be used inside correction. +% {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}} + +\chardef\baselinecorrectionmode\plusone + +\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone } +\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo } +\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree} + +%D \macros +%D {topbaselinecorrection,botbaselinecorrection} +%D +%D The actual top and bottom corrections are implemented as: + +% \def\topbaselinecorrection +% {\ifvmode \ifdim\pagegoal<\maxdimen +% \bgroup +% \setbaselinecorrections +% \whitespace +% \nointerlineskip +% \dotopbaselinecorrection +% \egroup +% \fi \fi} + + +\def\topbaselinecorrection + {\ifvmode \ifdim\pagegoal<\maxdimen + \forcedtopbaselinecorrection + \fi \fi} + +\def\forcedtopbaselinecorrection + {\ifvmode + \bgroup + \setbaselinecorrections + \whitespace + \nointerlineskip + \dotopbaselinecorrection + \egroup + \fi} + +\def\botbaselinecorrection + {\ifvmode + \bgroup + \setbaselinecorrections + \dobotbaselinecorrection + \allowbreak % new, otherwise problems when many in a row + \prevdepth\strutdp + \egroup + \fi} + +\let\forcedbotbaselinecorrection\botbaselinecorrection + +%D Still very experimental and therefore undocumented. + +\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE +\newif\ifforcepresnap \forcepresnaptrue % false in mixed single/double +\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false + +\def\positiveextrasnap {\gdef\extrasnapsign{+}} +\def\negativeextrasnap {\gdef\extrasnapsign{-}} + +\def\extrasnapreset {\global\chardef\@@extrasnap0 + \positiveextrasnap} +\def\extrasnapbefore {\global\chardef\@@extrasnap1 } +\def\extrasnaparound {\global\chardef\@@extrasnap2 } +\def\extrasnapafter {\global\chardef\@@extrasnap3 } + +\def\enablepresnapcorrection {\global\chardef\@@presnap\zerocount} +\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone} + +\extrasnapreset \enablepresnapcorrection + +\newif\iftracegridsnapping +\newif\ifshowgridboxes +\newif\ifshowfuzzyskips + +\let\showgridboxes\showgridboxestrue + +\def\showgridsnapping + {\tracegridsnappingtrue + \showgridboxestrue} + +\chardef\@@alignsnap =0 +\chardef\@@alignsnapbox =0 +\chardef\@@alignsnapmethod=0 + +\let\presnapskip \!!zeropoint \def\presnap {-} +\let\postsnapskip\!!zeropoint \let\postsnap\presnap + +\newcount\currentgridsnap + +\def\tracedsnapping + {\iftracegridsnapping + \llap + {\setlayoutcomponentattribute\v!grid\v!test + \hbox \layoutcomponentboxattribute + {\infofont + \global\advance\currentgridsnap\plusone + \color[grid:three] + {\vl\presnapskip + \vl\presnap + \vl\postsnap + \ifcase\@@alignsnapbox\relax\vl\ifcase\@@extrasnap00\or\extrasnapsign0\or\extrasnapsign\extrasnapsign\or0\extrasnapsign\fi\fi + \vl\the\currentgridsnap\vl}}}% + \fi} + +\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox + {\dosingleempty\dosnaptogrid} + +% \def\dosnaptogrid[#1]% +% {\ifgridsnapping +% \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi +% \expandafter\dodosnaptogrid +% \fi} + +% \def\dosnaptogrid[#1]% +% {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up +% \ifgridsnapping +% \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi +% \expandafter\dodosnaptogrid +% \fi} + +\def\dosnaptogrid[#1]% + {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up + \doifinsetelse\v!force{#1}% + {\moveongrid[#1]% + \dodosnaptogrid} + {\ifgridsnapping + \doifsomething{#1}{\moveongrid[#1]}% + \expandafter\dodosnaptogrid + \fi}} + +% \def\forcedpresnapcorrection % test this on 'details' +% {\ifforcepresnap +% \ifvmode \else \par \fi % new +% % we don't want top of page space when 'top' option +% %\verticalstrut\nobreak\vskip-\struttotal +% %\verticalstrut\vskip-\struttotal +% % nobreak really needed +% \allowbreak\verticalstrut\nobreak\vskip-\struttotal +% %\ifdim\pagetotal>\topskip \else +% % eigenlijk signal +% %\writestatus{grid}{removing dummy at top of page}% +% %\bgroup +% %\output{\setbox\scratchbox\box255}% +% %\penalty\outputpenalty +% %\egroup +% %\fi +% \fi} + +\def\forcedpresnapcorrection % test this on 'details' + {\ifforcepresnap + \ifvmode \else \par \fi % new + % we don't want top of page space when 'top' option + % \verticalstrut\nobreak\vskip-\struttotal + % \verticalstrut\vskip-\struttotal + % \nobreak really needed + % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper + \verticalstrut + \nobreak + \vskip-\struttotal + %\ifdim\pagetotal>\topskip \else + % eigenlijk signal + %\writestatus{grid}{removing dummy at top of page}% + %\bgroup + %\output{\setbox\scratchbox\box255}% + %\penalty\outputpenalty + %\egroup + %\fi + \fi} + +\def\setgridtracebox#1[#2]% % maybe reverse the order + {\setbox\nextbox#1% + {\hbox + {\hbox to \zeropoint + {\setlayoutcomponentattribute\v!grid\v!test + \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}% + \hss}% + \flushnextbox}}} + +\newif\ifboxedsnapping \boxedsnappingtrue + +\chardef\depthsnapmethod \plusone % downward compatible, minus one line +\chardef\heightsnapmethod\plusone % downward compatible, minus one line + +\def\dodosnaptogrid + {\dowithnextbox + {\bgroup + \ifcase\@@alignsnapmethod \or + % we're dealing with text with a possible big depth/height + \chardef\depthsnapmethod \plustwo + \chardef\heightsnapmethod\plustwo + \fi + \ifdim\nextboxht<\textheight % handle special case (like page fig) + \ifcase\@@alignsnapbox\relax + \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low + \ifshowgridboxes + \setgridtracebox\hbox[two]% + \fi + %\getnoflines{\nextboxht}% + \getnoflines\nextboxht + \setbox\nextbox\vbox to \noflines\lineheight + {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi + \ifnum\@@alignsnap>2 \vfill\fi + \flushnextbox + \ifnum\@@alignsnap<4 \vfill\fi}% + \fi + \ifshowgridboxes + \setgridtracebox\hbox[three]% + \fi + \forgetall + \par + \ifvbox\nextbox + \setbox\nextbox\hbox{\flushnextbox}% don't ask + \fi + \scratchskip\lastskip + \edef\presnapskip{\the\lastskip}% + % mixing single/double columns sometimes goes wrong, + % check 'som' document + \ifinsidecolumns + \forcepresnaptrue + \fi + \forcedpresnapcorrection + \ifdim\nextboxht>\strutht + \scratchdimen\nextboxht + \ifcase\@@presnap\relax + \ifdim\scratchskip>\zeropoint\relax + \scratchcounter\scratchskip + \advance\scratchcounter -\openlineheight + \ifnum\scratchcounter<0 + \scratchcounter-\scratchcounter + \fi + \ifnum\scratchcounter<10 % \lastkip is about \openlineheight + \advance\scratchdimen -\openstrutdepth + \edef\presnapskip{*\presnapskip}% + \else\ifdim\scratchskip>\openlineheight + %<\openlineheight \else + \advance\scratchdimen -\openstrutdepth + \edef\presnapskip{*\presnapskip}% + \fi\fi + \fi + \fi + % \getnoflines\scratchdimen % maybe raw ? + % \advance\noflines -1 + \ifcase\heightsnapmethod + % raw + \or + \advance\scratchdimen-\lineheight % tight (default) + \or + \advance\scratchdimen-\strutheight % fit (text) + \or + \advance\scratchdimen-\strutheight % tolerant + \advance\scratchdimen-\roundingeps + \fi + \getnoflines\scratchdimen + \ifnum\noflines>0 + \scratchdimen\noflines\lineheight + \else + \scratchdimen\zeropoint + \fi + \else + \scratchdimen\zeropoint + \fi + \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign \lineheight \fi + \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi + \edef\presnap{\the\scratchdimen}% + \ifstrutsnapping + \ifboxedsnapping + \getrawnoflines\scratchdimen + \advance\scratchdimen-\noflines\lineheight + \vskip\scratchdimen % disappears at top of page + \dorecurse\noflines{\verticalstrut\nobreak}% + \else \ifdim\scratchdimen=\zeropoint + % nothing to skip + \else % disappears at top of page + \vskip\scratchdimen + \fi \fi + \fi + \ifdim\nextboxdp>\strutdp + % \getnoflines\nextboxdp + % \advance\noflines \minusone + \scratchdimen\nextboxdp\relax + \ifcase\depthsnapmethod + % raw + \or + \advance\scratchdimen-\lineheight % tight (default) + \or + \advance\scratchdimen-\strutdepth % fit (text) + \or + \advance\scratchdimen-\strutdepth % tolerant + \advance\scratchdimen-\roundingeps + \fi + \getnoflines\scratchdimen + \ifnum\noflines>0 + \scratchdimen\noflines\lineheight + \else + \scratchdimen\zeropoint + \fi + \else + \scratchdimen\zeropoint + \fi + \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi + \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign \lineheight \fi + \edef\postsnap{\the\scratchdimen}% + \ifstrutsnapping + \nextboxht\strutht + \nextboxdp\strutdp + \else + \scratchdimen\presnap + \advance\scratchdimen \strutht + \nextboxht\scratchdimen + \scratchdimen\postsnap + \advance\scratchdimen \strutdp + \nextboxdp\scratchdimen + \fi + \hbox{\tracedsnapping\flushnextbox}% + \ifstrutsnapping + \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi + \fi + \else + \scratchdimen\nextboxht\relax + \ifcase\@@alignsnapbox + % can't happen here + \or + \getrawnoflines\scratchdimen + \else + \getnoflines \scratchdimen + \fi + \scratchdimen\noflines\lineheight\relax + \advance\scratchdimen-\strutdepth + % spoils the whole game (fit/broad/line) + % \ifnum\pagetotal>\zeropoint \else % disable this as option + % \advance\scratchdimen-\strutheight + % \advance\scratchdimen+\topskip + % \fi + \dimen0=\scratchdimen + \dimen2=\strutdepth + \ifshowgridboxes + \setgridtracebox\hbox[two]% + \fi + \nextboxdp\strutdp + \dimen4=\nextboxht + \dimen6=\nextboxdp + \iftracegridsnapping + \setbox\scratchbox\hbox + {\scratchdimen\@@alignsnapamount\relax + \ifdim\scratchdimen<\zeropoint + \tracedgridamount\zeropoint{-\scratchdimen}% + \else + \tracedgridamount\scratchdimen\zeropoint + \fi}% + \smashbox\scratchbox + \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}% + \fi + \setbox\nextbox\hbox + {\scratchdimen\@@alignsnapamount\relax + \ifcase\@@alignsnapdepth\or + % don't change this ever ! + \ifdim\dimen0<\lineheight + % otherwise it is ok, but ending up inside + % the next paragraph is seldom what we want, + % so we move one line up + \advance\scratchdimen-\lineheight + \advance\scratchdimen\strutheight + \else + % otherwise we can move down to the + % baseline + \advance\scratchdimen\dimen6 % == \strutdepth + \fi + \fi + \lower\scratchdimen\flushnextbox}% + \nextboxht\dimen4 + \nextboxdp\dimen6 + \ifnum\@@alignsnap<4 % 4 = regel + \setbox\nextbox\vbox to \scratchdimen + {\forgetall + \ifnum\@@alignsnap>2 \vfill\fi % 3 4 + \flushnextbox + \nointerlineskip % \offinterlineskip + \ifnum\@@alignsnap<4 \vfill\fi % 2 3 + \kern\zeropoint}% + \fi + \ifshowgridboxes + \setgridtracebox\vbox[three]% + \fi + \scratchdimen\@@alignsnapamount + \edef\presnapskip{\the\scratchdimen}% + \ifnum\@@alignsnap>2 \def\presnap {+}\fi + \ifnum\@@alignsnap<4 \def\postsnap{+}\fi + \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}% + \par + \nextboxht\dimen0 + \nextboxdp\dimen2 + \forcedpresnapcorrection + \nointerlineskip + \flushnextbox + \fi + \else + \setbox\nextbox\vbox to \textheight + {\ifdim\nextboxdp=\zeropoint + \hbox{\lower\strutdepth\flushnextbox} + \else % this branch is yet untested + \vss + \hbox{\lower\nextboxdp\flushnextbox} + \vskip-\strutdepth + \fi}% + \nextboxdp\strutdepth + \flushnextbox + \fi + \extrasnapreset + \enablepresnapcorrection + \global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount + \egroup}} + +\def\tracedgridamount#1#2% + {\startcolor[grid:four]% + \setlayoutcomponentattribute\v!grid\v!test + \hbox \layoutcomponentboxattribute{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}% + \stopcolor} + +\def\snaptomathgrid % probably not working ok, also kind of obsolete + {\ifgridsnapping + \dowithnextbox + {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]} + \vbox\bgroup + \forgetdisplayskips + \@EA\let\@EA\next + \fi} + +\def\topsnaptogrid + {\ifgridsnapping + \dowithnextbox + {\scratchdimen\nextboxht + \advance\scratchdimen -\strutht + \advance\scratchdimen \topskip + \nextboxht\scratchdimen + \nextboxdp\zeropoint + \flushnextbox + \kern\lineheight + \kern-\topskip + \nointerlineskip} + \hbox + \fi} + +% \def\centertogrid % meant for special situations +% {\ifgridsnapping +% \dowithnextboxcontent +% {\ignorespaces} +% {\bgroup +% \par +% \scratchdimen\nextboxht +% \advance\scratchdimen \nextboxdp +% \getnoflines\scratchdimen +% \setbox\nextbox\vbox to \noflines\lineheight +% {\forgetall +% \vskip\zeropoint \!!plus \nextboxht +% \copy\nextbox +% \kern.5\strutdp % VOORLOPIGE WAARDE +% \vskip\zeropoint \!!plus \nextboxdp}% +% \noindent\snaptogrid\vbox{\flushnextbox}% +% \egroup} +% \vbox % was \hbox +% \fi} + +% The next implementation is sub-optimal +% +% \def\centertogrid % usage: see ie pascal / stepcharts +% {\snaptogrid[\v!midden,.5\strutdp]\vbox} + +\def\centertogrid % meant for special situations + {\ifgridsnapping + \dowithnextboxcontent + {\ignorespaces} + {\bgroup + \par + \scratchdimen\nextboxht + \advance\scratchdimen \nextboxdp + \getnoflines\scratchdimen + \setbox\nextbox\vbox to \noflines\lineheight + {\forgetall + \vss + \topbaselinecorrection + \copy\nextbox + \botbaselinecorrection + \vss}% + \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}% + \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace + \noindent\snaptogrid\vbox{\flushnextbox}% + \egroup} + \vbox % was \hbox + \fi} + +% testbed for \centertogrid +% +% \strut Bruggetje +% \startlinecorrection +% \startcombination +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination[2*2] +% {\framed{test}} {} {\framed{test}} {} +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination[2*2] +% {\framed{test}} {} {\framed{test}} {} +% {\framed{test}} {} {\framed{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection +% \startcombination[2*2] +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection +% \strut Bruggetje +% \startlinecorrection[blank] +% \startcombination[2*2] +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} +% \stopcombination +% \stoplinecorrection + +\ifx\startbaselinecorrection\undefined \wait \fi % change order + +\let\normalstartbaselinecorrection=\startbaselinecorrection + +\def\startbaselinecorrection + {\ifgridsnapping + \centertogrid\bgroup + \let\stopbaselinecorrection\egroup + \else + \normalstartbaselinecorrection + \fi} + +\chardef\gridboxlinenomode\plusone +\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame + +\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi} +\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth} + +\def\setgridbox#1#2#3% + {\setbox#1\gridboxvbox to #3 % given size + {\forgetall + \resetteststrut + \offinterlineskip + \hsize#2% + \baselinerulefalse + \gridboxvbox % calculated size + {\getrawnoflines{#3}% \getnoflines{#3}% + \vskip\topskip + \vskip-\strutht + \scratchdimen#2\advance\scratchdimen \lineheight + \dorecurse\noflines + {\strut + \hskip-.5\lineheight + \ifcase\gridboxlinenomode\or + \rlap + {\hskip.2\bodyfontsize\hskip\scratchdimen + \infofont\hbox to 1em{\hss\recurselevel}}% + \or + \llap + {\infofont\hbox to 1em{\hss\recurselevel}% + \hskip.2\bodyfontsize}% + \fi + \vrule + \!!height \gridboxwidth + \!!depth \gridboxwidth + \!!width \scratchdimen + \par}} + \vfill}} + +%D Some intervention macros: + +\def\gridwarning#1{\message{[beware of #1 extra snap]}} + +\global\let\@@alignsnapamount\!!zeropoint +\global\chardef\@@alignsnapdepth0 + +\def\@@unknowngriddisplacement + {\global\chardef\@@alignsnapbox\plusthree + \global\let\@@alignsnapamount\commalistelement} + +\def\domoveongrid[#1]% + {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi} + +\def\dodomoveongrid[#1]% some day : speed up + {\global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount + \global\chardef\@@alignsnapdepth\zerocount + \global\chardef\@@alignsnapmethod\zerocount + \global\let\@@alignsnapamount\!!zeropoint + \donefalse + \expanded{\processallactionsinset[#1]} + [\v!standard=>, + \v!normal=>, % to be sure + \v!yes=>, % to be sure + \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore, + \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter, + \v!both=>\positiveextrasnap\extrasnaparound, + -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore, + -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter, + -\v!both=>\negativeextrasnap\extrasnaparound, + \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations + \v!page=>\global\chardef\@@alignsnap\plusone, % topskip + \v!high=>\global\chardef\@@alignsnap\plustwo, + \v!middle=>\global\chardef\@@alignsnap\plusthree, + \v!low=>\global\chardef\@@alignsnap\plusfour, + \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new + \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new + \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new + \v!line=>\global\chardef\@@alignsnapbox\plusthree +% \global\chardef\@@alignsnapdepth\plusone + \global\chardef\@@alignsnap\plusfour, + \v!reset=>\positiveextrasnap\extrasnapreset, + \v!none=>\global\chardef\@@alignsnap\zerocount + \global\chardef\@@alignsnapbox\zerocount, + \v!force=>, % turns on grid snapping even when not on + \s!default=>, + \s!unknown=>\@@unknowngriddisplacement]} + +\def\moveongrid + {\dosingleempty\domoveongrid} + +\def\doplaceongrid[#1]% + {\domoveongrid[#1]\snaptogrid\vbox} + +\def\placeongrid + {\dosingleempty\doplaceongrid} + +%D Snapping is rather robust as long as we use whole lines. +%D Half lines of white space can however be handled when they +%D come in pairs. The corrections needed when crossing page +%D boundaries in the middle of such a pair, are handled by +%D macros that are (named) sort of fuzzy. This fuzzy mechanism +%D was written as an extension to the grid typesetting needed +%D for typesetting (part of) the \MAPS. +%D +%D \starttyping +%D \setuptyping +%D [before={\blank[halfline]}, +%D after={\blank[halfline]}] +%D \stoptyping + +\newif \iffuzzyvskip +\newif \iffuzzysnapdone +\newif \iffuzzysnapping +\newif \iffuzzysnapped +\chardef \fuzzysnappedleft=0 % ==1 when fuzzybegin still open +\newpersistentmark\fuzzymark % (!) +\newcount \fuzzymarker +\newbox \fuzzysnapbox +\newbox \fuzzysnapsplit + +\def\dosyncfuzzyvskip + {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint + \bgroup % - added 28/2/2003: check this, there was no - + \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal + \egroup + \fi\fi\fi} + +\def\fuzzyvskip#1% + {\iffuzzysnapdone + \dosyncfuzzyvskip % NEWER + \endfuzzysnapping + \vskip#1\relax + \global\fuzzysnapdonefalse + \else + \vskip#1\relax + \beginfuzzysnapping + \global\fuzzysnapdonetrue + \fi} + +\def\setfuzzymark#1#2#3% #1/#2 => error recovery + {\ifgridsnapping + \global\fuzzysnappingtrue + \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi + \nobreak + \ifshowfuzzyskips + \hbox{\color[grid:three] + {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak + \vrule\!!width\hsize\!!height.1\lineheight}} + \nobreak + \fi + %[\the\fuzzymarker] + %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% + \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% + \nobreak + \fi} + +\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd +\def\endfuzzysnapping {\setfuzzymark12\v!stop } % even + +\def\removelastfuzzyvskip + {\ifgridsnapping + \iffuzzysnapping + \ifdim\lastskip<\openlineheight + \else + \removelastskip + \fi + \else + \removelastskip + \fi + \else + \removelastskip + \fi} + +\def\docheckfuzzysnap#1% + {\bgroup + \dontcomplain + \setbox\fuzzysnapbox\copy#1\relax + \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight + \let\topfuzzymark\empty % indeed here ... no real mark + \getsplitmarks\fuzzymark +% \ifcase0\topfuzzymark + \ifcase0\rawgetsplittopmark\fuzzymark + \global\chardef\fuzzysnappedleft\zerocount + \global\fuzzysnappedfalse +% \else\ifodd\topfuzzymark + \else\ifodd\rawgetsplittopmark\fuzzymark + \global\chardef\fuzzysnappedleft\plusone + \global\fuzzysnappedtrue + \else + \global\chardef\fuzzysnappedleft=2 + \global\fuzzysnappedtrue + \fi\fi + \iffuzzysnapped \else + \doloop + {\ifvoid\fuzzysnapbox + \exitloop + \else + \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight + %\let\topfuzzymark=\empty % ... but not here + \getsplitmarks\fuzzymark +% \ifcase0\topfuzzymark + \ifcase0\rawgetsplittopmark\fuzzymark + % continue +% \else\ifodd\topfuzzymark + \else\ifodd\rawgetsplittopmark\fuzzymark + \exitloop + \else + \global\chardef\fuzzysnappedleft\plusone + \global\fuzzysnappedtrue + \exitloop + \fi\fi + \fi}% + \fi + \egroup} + +\def\getfuzzysnapcorrection#1% + {\global\let\presnapcorrection \relax + \global\let\postsnapcorrection\relax + \ifgridsnapping\iffuzzysnapping + \docheckfuzzysnap{#1}% + \iffuzzysnapped + \iftracegridsnapping + \gdef\presnapcorrection + {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}% + \else + \gdef\presnapcorrection{\kern.5\openlineheight}% + \fi + \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok + \fi + \fi\fi} + +\def\fuzzysnappedbox#1#2% \box<n> \unvbox<n> + {\getfuzzysnapcorrection{#2}% + \presnapcorrection + #1#2% + \postsnapcorrection} + +\def\adaptfuzzypagegoal + {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents + \scratchdimen\pagegoal + \advance\scratchdimen -.5\openlineheight + \global\pagegoal\scratchdimen + \global\advance\vsize -.5\openlineheight + \global\chardef\fuzzysnappedleft0 + \fi\fi\fi} + +%D New, experimental, used in caption snapping: +%D +%D \starttyping +%D \startcolumnset +%D +%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top] +%D +%D \placefigure [lrtb] {\dorecurse{5}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D \placefigure [lrtb] {\dorecurse{15}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D +%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom] +%D +%D \placefigure [rltb] {\dorecurse{5}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D \placefigure [rltb] {\dorecurse{15}{green gras}} +%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} +%D +%D \input thuan +%D +%D \stopcolumnset +%D \stoptyping + +\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! ! + {\doifsomething{#2} + {\getnoflines{\ht#1}% no depth taken into account, depth preserved + \scratchdimen\noflines\lineheight + \advance\scratchdimen-\strutdp + \bgroup + \advance\scratchdimen-\onepoint % be a bit tolerant + \ifdim\scratchdimen>\ht#1\relax + \egroup + \doif{#2}\v!top {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}% + \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}% + \dp#1\strutdp + \else + \egroup + \ht#1\scratchdimen + \dp#1\strutdp + \fi}} + +%D New: + +\let\checkgridsnapping\relax + +\protect \endinput diff --git a/tex/context/base/core-ini.tex b/tex/context/base/core-ini.mkii index 69edf9735..69edf9735 100644 --- a/tex/context/base/core-ini.tex +++ b/tex/context/base/core-ini.mkii diff --git a/tex/context/base/core-ini.mkiv b/tex/context/base/core-ini.mkiv new file mode 100644 index 000000000..69edf9735 --- /dev/null +++ b/tex/context/base/core-ini.mkiv @@ -0,0 +1,67 @@ +%D \module +%D [ file=core-ini, +%D version=2003.12.01, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Additional Initialization, +%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 Core Macros / Additional Initialization} + +%D We will move more code to here, so that we become less dependent of the +%D orde in which modules are loaded. + +\unprotect + +\everypar \emptytoks +\neverypar \emptytoks + +\appendtoks \flushnotes \to \everypar +\appendtoks \synchronizesidefloats \to \everypar + +\appendtoks \checkinlinedirection \to \everypar + +\appendtoks \checkindentation \to \everypar +\appendtoks \showparagraphnumber \to \everypar +\appendtoks \flushmargincontents \to \everypar +\appendtoks \flushcommentanchors \to \everypar +\appendtoks \synchronizenotes \to \everypar +\appendtoks \OTRSETshowstatus \to \everypar +\appendtoks \flushpostponedbookmark \to \everypar +\appendtoks \registerparoptions \to \everypar +\appendtoks \flushsyncpositions \to \everypar +\appendtoks \flushpostponednodedata \to \everypar +\appendtoks \dohandlerepeatdelimitedtext \to \everypar +\appendtoks \insertparagraphintro \to \everypar + +\appendtoks \flushpostponedbookmark \to \neverypar +\appendtoks \flushpostponedbookmark \to \everylistentry + +\appendtoks \flushnotes \to \everydisplay +\appendtoks \adjustsidefloatdisplaylines \to \everydisplay + +\appendtoks \flushsyncpositions \to \everyheadstart + +\appendtoks \flushsyncresets \to \everyendoftextbody + +\appendtoks \ignorespaces \to \everybeginofpar + +\appendtoks \removeunwantedspaces \to \everyendofpar +%appendtoks \strut \to \everyendofpar % option ? +\appendtoks \flushsyncresets \to \everyendofpar +\appendtoks \setlastlinewidth \to \everyendofpar % must happen before endgraf +\appendtoks \endgraf \to \everyendofpar + +% Todo: verbatim, xml, tex, move code to here + +\ifx\normalcompound\undefined \let\normalcompound=| \fi + +\appendtoks \catcode`|=\@@active \let|\normalcompound \to \everyTEXinputmode +\appendtoks \catcode`|=\@@letter \to \everyXMLinputmode + +\protect \endinput diff --git a/tex/context/base/core-job.mkiv b/tex/context/base/core-job.mkiv index 84877eb3f..7231ac383 100644 --- a/tex/context/base/core-job.mkiv +++ b/tex/context/base/core-job.mkiv @@ -63,8 +63,7 @@ \def\doloadexamodes [#1]{\ctxlua{commands.loadexamodes("#1")}} \def\registerfileinfo[#1#2]#3% geen \showmessage ? - {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}% - \immediatewriteutility{f #1 {#3}}} + {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}} \ifx\preloadfonts \undefined \let\preloadfonts \relax \fi \ifx\preloadspecials\undefined \let\preloadspecials\relax \fi @@ -92,19 +91,6 @@ \bgroup\disableXML\loadallsystemfiles\f!errfilename\donothing\egroup \to\everygoodbye}} -%D Loading of \type {cont-usr.tex} (edited by the user) -%D and \type {cont-fmt.tex} (generated by texexec). - -% \def\loaduserspecifications -% {% this used to be the file where users can tune their system, especially patterns -% \readsysfile\f!usrfilename{\showmessage\m!systems2\f!usrfilename}\donothing -% % this one took care of user preferences (fonts, messages) but lm made this obsolete -% \readjobfile\f!fmtfilename{\showmessage\m!systems2\f!fmtfilename}\donothing -% % from now on we preload all patterns (only in mkii) -% \preloadallpatterns} - -\let\loaduserspecifications\relax - %D We don't want multiple jobfiles to interfere. \def\loadoptionfile @@ -189,9 +175,6 @@ \def\donotexecutefile#1% {} -\def\verwerkfile#1 % - {\doexecutefile{#1}} - \def\useenvironment[#1]% maybe commalist {\environment #1 \relax} @@ -300,7 +283,7 @@ % NOT TOEVOEGEN: \the\everytrace -\neverypar=\emptytoks +\neverypar\emptytoks % \appendtoks \flushnotes \to \everypar % \appendtoks \synchronizesidefloats \to \everypar @@ -313,8 +296,6 @@ % \appendtoks \flushnotes \to \everydisplay % \appendtoks \adjustsidefloatdisplaylines \to \everydisplay -% soon, when pdftex 1.22 is out in the field: - \chardef\systemcommandmode\zerocount % 0=unknown 1=disabled 2=enabled \def\checksystemcommandmode @@ -331,22 +312,4 @@ \writestatus\m!systems{system commands are enabled}% \fi} -% \ifx\etexversion\undefined \else \ifnum\etexversion<202 -% \prependtoks -% \writestatus\m!systems{eTeX version \number\etexversion\space -> too old (bugs)}% -% \writeline -% \to \everyjob -% \fi \fi - -% \ifx\pdftexversion\undefined \else \ifnum\number\pdftexversion<120 -% \prependtoks -% \writestatus\m!systems{pdfTeX version \number\pdftexversion\space -> please update}% -% \writeline -% \to \everyjob -% \fi \fi - -% Default-instellingen (verborgen) - -\resetutilities - \protect \endinput diff --git a/tex/context/base/core-lme.tex b/tex/context/base/core-lme.tex deleted file mode 100644 index 69dc3b7b2..000000000 --- a/tex/context/base/core-lme.tex +++ /dev/null @@ -1,55 +0,0 @@ -%D \module -%D [ file=core-lme, -%D version=2006.08.14, -%D title=\CONTEXT\ Core Macros, -%D subtitle=LAst Minute Extensions, -%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 Core Macros / Last Minute Extensions} - -%D Things that depend on too much other things. - -\unprotect - -%D Probably obsolete, depends on \type {\checksidefloat}. May disappear. - -\def\checkframedtext - {\ifinsidefloat - \localhsize\hsize - \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle - % \strut % rather clean way to invoke the sidefloat OTR - % \setbox0=\lastbox % and get the widths set, so from now on we - % \setlocalhsize % can have framed texts alongside sidefloats - \checksidefloat - \setlocalhsize - \else - \localhsize\hsize - \fi\fi} - -%D For my eyes only: - -\newcount\nofprofiled - -\def\profilemacro#1% - {\nofprofiled\zerocount - \letvalue{\string#1\string#1}#1% - \appendtoks - \normalwritestatus\m!systems{profile \string#1: \number\nofprofiled}% - \to \everystoptext - \unexpanded\def#1% - {\global\advance\nofprofiled\plusone - \csname\string#1\string#1\endcsname}} - -%D Some plain goodies, they may be moved to \type {m-plain.tex} some day. - -\ifx\hang \undefined \def\hang {\hangindent\parindent} \fi -\ifx\textindent\undefined \def\textindent#1{\indent\llap{#1\enspace}\ignorespaces} \fi -\ifx\narrower \undefined \def\narrower {\advance\leftskip \parindent\advance\rightskip\parindent} \fi - -\protect \endinput diff --git a/tex/context/base/core-mak.tex b/tex/context/base/core-mak.tex deleted file mode 100644 index 574fb9756..000000000 --- a/tex/context/base/core-mak.tex +++ /dev/null @@ -1,84 +0,0 @@ -%D \module -%D [ file=core-mak, -%D version=1997.10.05, -%D title=\CONTEXT\ Core Macros, -%D subtitle=General Makeup Commands, -%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 Core Macros / General Makeup Commands} - -\unprotect - -% \definieerplaats[naam][instellingen] -% \stelplaatsin[naam][instellingen] -% \plaats<naam>[[instellingen]] -% -% - still undocumented and also not in setupb yet -% - kan ook intern/direct (scheelt duplicatie), zie \framedtext - -\def\dodefineplacement[#1][#2]% - {\getparameters - [\??pl#1] - [\c!left=\hss, - \c!right=\hss, - \c!linecorrection=\v!off, - \c!depthcorrection=\v!off, - \c!margin=\v!standard, - \c!grid=\v!middle, - %\c!before=, - %\c!after=, - #2]% - \setvalue{\e!place#1}{\doplacement[\??pl#1]}} - -\def\defineplacement - {\dodoubleempty\dodefineplacement} - -\def\setupplacement - {\dodoubleempty\dosetupplacement} - -\def\dosetupplacement[#1]% - {\dodoubleempty\getparameters[\??pl#1]} - -\def\doplacement - {\dodoubleempty\dodoplacement} - -\def\dodoplacement[#1][#2]% correctie moet mooier - {\bgroup - \dowithnextboxcontent - {\forgetall} - {\setlocalhsize - \getparameters[#1][#2]% - \getvalue{#1\c!before}% - \begingroup - \positioningparfalse - \setbox\nextbox\hbox to \localhsize - {\getvalue{#1\c!left}% - \flushnextbox - \getvalue{#1\c!right}}% - \ifinsidefloat \else - \addlocalbackgroundtobox\nextbox - \fi - \ifgridsnapping - \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}% - % unchecked - \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent - \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}% - \else - \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection - \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent - \flushnextbox - \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection - \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection - \fi - \endgroup - \getvalue{#1\c!after}% - \egroup} - \vbox} - -\protect \endinput diff --git a/tex/context/base/core-mis.mkii b/tex/context/base/core-mis.mkii index e860a537a..e61adee25 100644 --- a/tex/context/base/core-mis.mkii +++ b/tex/context/base/core-mis.mkii @@ -196,6 +196,72 @@ \c!inbetween={\blank[\v!medium]}, \c!after=\blank] +% \definieerplaats[naam][instellingen] +% \stelplaatsin[naam][instellingen] +% \plaats<naam>[[instellingen]] +% +% - still undocumented and also not in setupb yet +% - kan ook intern/direct (scheelt duplicatie), zie \framedtext + +\def\dodefineplacement[#1][#2]% + {\getparameters + [\??pl#1] + [\c!left=\hss, + \c!right=\hss, + \c!linecorrection=\v!off, + \c!depthcorrection=\v!off, + \c!margin=\v!standard, + \c!grid=\v!middle, + %\c!before=, + %\c!after=, + #2]% + \setvalue{\e!place#1}{\doplacement[\??pl#1]}} + +\def\defineplacement + {\dodoubleempty\dodefineplacement} + +\def\setupplacement + {\dodoubleempty\dosetupplacement} + +\def\dosetupplacement[#1]% + {\dodoubleempty\getparameters[\??pl#1]} + +\def\doplacement + {\dodoubleempty\dodoplacement} + +\def\dodoplacement[#1][#2]% correctie moet mooier + {\bgroup + \dowithnextboxcontent + {\forgetall} + {\setlocalhsize + \getparameters[#1][#2]% + \getvalue{#1\c!before}% + \begingroup + \positioningparfalse + \setbox\nextbox\hbox to \localhsize + {\getvalue{#1\c!left}% + \flushnextbox + \getvalue{#1\c!right}}% + \ifinsidefloat \else + \addlocalbackgroundtobox\nextbox + \fi + \ifgridsnapping + \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}% + % unchecked + \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent + \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}% + \else + \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection + \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent + \flushnextbox + \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection + \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection + \fi + \endgroup + \getvalue{#1\c!after}% + \egroup} + \vbox} + % Te zijner tijd [plaats=boven,onder,midden] implementeren, % in dat geval moet eerst de maximale hoogte worden bepaald. % diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv index 96d3bd2cd..88a027c02 100644 --- a/tex/context/base/core-mis.mkiv +++ b/tex/context/base/core-mis.mkiv @@ -44,16 +44,16 @@ %appendtoks \def\executesynonym#1#2#3#4{#3}\to\simplifiedcommands %appendtoks \def\executesort#1#2#3{#3}\to\simplifiedcommands -\appendtoks \def\ { }\to\simplifiedcommands -\appendtoks \def\type#1{\letterbackslash\strippedcsname#1}\to\simplifiedcommands -\appendtoks \def\tex#1{\letterbackslash#1}\to\simplifiedcommands -\appendtoks \def\TeX{TeX}\to\simplifiedcommands -\appendtoks \def\ConTeXt{ConTeXt}\to\simplifiedcommands -\appendtoks \def\MetaPost{MetaPost}\to\simplifiedcommands -\appendtoks \def\MetaFont{MetaFont}\to\simplifiedcommands -\appendtoks \def\MetaFun{MetaFun}\to\simplifiedcommands -%appendtoks \def||{-}\to\simplifiedcommands -\appendtoks \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands +\appendtoks \def\ { }\to\simplifiedcommands +\appendtoks \def\type#1{\letterbackslash\checkedstrippedcsname#1}\to\simplifiedcommands +\appendtoks \def\tex#1{\letterbackslash#1}\to\simplifiedcommands +\appendtoks \def\TeX{TeX}\to\simplifiedcommands +\appendtoks \def\ConTeXt{ConTeXt}\to\simplifiedcommands +\appendtoks \def\MetaPost{MetaPost}\to\simplifiedcommands +\appendtoks \def\MetaFont{MetaFont}\to\simplifiedcommands +\appendtoks \def\MetaFun{MetaFun}\to\simplifiedcommands +%appendtoks \def||{-}\to\simplifiedcommands +\appendtoks \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands \appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands @@ -196,6 +196,72 @@ \c!inbetween={\blank[\v!medium]}, \c!after=\blank] +% \definieerplaats[naam][instellingen] +% \stelplaatsin[naam][instellingen] +% \plaats<naam>[[instellingen]] +% +% - still undocumented and also not in setupb yet +% - kan ook intern/direct (scheelt duplicatie), zie \framedtext + +\def\dodefineplacement[#1][#2]% + {\getparameters + [\??pl#1] + [\c!left=\hss, + \c!right=\hss, + \c!linecorrection=\v!off, + \c!depthcorrection=\v!off, + \c!margin=\v!standard, + \c!grid=\v!middle, + %\c!before=, + %\c!after=, + #2]% + \setvalue{\e!place#1}{\doplacement[\??pl#1]}} + +\def\defineplacement + {\dodoubleempty\dodefineplacement} + +\def\setupplacement + {\dodoubleempty\dosetupplacement} + +\def\dosetupplacement[#1]% + {\dodoubleempty\getparameters[\??pl#1]} + +\def\doplacement + {\dodoubleempty\dodoplacement} + +\def\dodoplacement[#1][#2]% correctie moet mooier + {\bgroup + \dowithnextboxcontent + {\forgetall} + {\setlocalhsize + \getparameters[#1][#2]% + \getvalue{#1\c!before}% + \begingroup + \positioningparfalse + \setbox\nextbox\hbox to \localhsize + {\getvalue{#1\c!left}% + \flushnextbox + \getvalue{#1\c!right}}% + \ifinsidefloat \else + \addlocalbackgroundtobox\nextbox + \fi + \ifgridsnapping + \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}% + % unchecked + \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent + \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}% + \else + \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection + \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent + \flushnextbox + \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection + \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection + \fi + \endgroup + \getvalue{#1\c!after}% + \egroup} + \vbox} + % Te zijner tijd [plaats=boven,onder,midden] implementeren, % in dat geval moet eerst de maximale hoogte worden bepaald. % @@ -1654,13 +1720,11 @@ \def\afterbothpairedboxes {\setbox\secondpairedbox\vbox - {% \localstartcolor[\@@ldcolor]% does not work yet - \ifnum\@@ldn>1 - \rigidcolumnbalance\nextbox - \else - \flushnextbox - \fi - }% \localstopcolor}% + {\ifnum\@@ldn>1 + \rigidcolumnbalance\nextbox + \else + \flushnextbox + \fi}% \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize \forgetall \ifnum\pairedlocationa<2 @@ -1836,101 +1900,9 @@ \afterassignment\next\let\nexttoken=} \hbox} -% stupid version, does not align top stuff when captions, -% keep as example -% -% \def\dodocombination -% {\vbox -% {\forgetall % \setupwhitespace[\v!none]% -% \let\next\vbox -% \ExpandFirstAfter\processallactionsinset -% [\combinationparameter\c!location] -% [ \v!top=>\let\next\tbox, -% \v!middle=>\let\next\halfwaybox]% -% \next{\copy0}% -% \ifdim\ht2>\zeropoint % beter dan \wd2, nu \strut mogelijk -% \combinationparameter\c!inbetween -% %\vtop % wrong code -% % {\nointerlineskip % recently added -% % \hsize\wd0 -% % \setupalign[\combinationparameter\c!align]% % \raggedcenter -% % \begstrut\unhbox2\endstrut}% -% \box2 -% \fi}% -% \ifnum\totcombination>\plusone -% \global\advance\totcombination\minusone -% \global\advance\horcombination\minusone -% \ifnum\horcombination=\zerocount -% \def\next -% {\cr\noalign -% {\forgetall % \setupwhitespace[\v!geen]% no -% \nointerlineskip -% \combinationparameter\c!before -% \combinationparameter\c!after -% \vss -% \nointerlineskip}% -% \global\horcombination\maxhorcombination\relax -% \docombination}% -% \else -% \def\next -% {&&&\hskip\combinationparameter\c!distance&\docombination}% -% \fi -% \else -% \def\next -% {\cr\egroup}% -% \fi -% \next} - -% \def\dodocombination -% {\vbox -% {\forgetall % \setupwhitespace[\v!none]% -% \let\next\vbox -% \ExpandFirstAfter\processallactionsinset -% [\combinationparameter\c!plaats] -% [ \v!top=>\let\next\tbox, -% \v!middle=>\let\next\halfwaybox]% -% \next{\copy0}% -% % we need to save the caption for a next alignment line -% \saveoncombinationstack2}% -% \ifnum\totcombination>\plusone -% \global\advance\totcombination\minusone -% \global\advance\horcombination\minusone -% \ifnum\horcombination=\zerocount -% \def\next -% {\cr -% \flushcombinationstack -% \noalign -% {\forgetall % \setupwhitespace[\v!none]% no -% \global\setbox\combinationstack\emptybox -% \nointerlineskip -% \combinationparameter\c!after -% \combinationparameter\c!before -% \vss -% \nointerlineskip}% -% \global\horcombination\maxhorcombination\relax -% \docombination}% -% \else -% \def\next -% {&&&\hskip\combinationparameter\c!distance&\docombination}% -% \fi -% \else -% \def\next -% {\cr -% \flushcombinationstack -% \egroup}% -% \fi -% \next} - \def\depthonlybox {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox} -% \def\boxwithstrutheight -% {\dowithnextbox -% {\scratchdimen\strutheight -% \advance\scratchdimen-\nextboxht -% \hbox{\raise\scratchdimen\box\nextbox}}% -% \vbox} - \def\dodocombination {\vbox {\forgetall % \setupwhitespace[\v!none]% @@ -2088,56 +2060,6 @@ \def\placeontopofeachother{\placerelativetoeachother\halign\hss} \def\placesidebyside {\placerelativetoeachother\valign\vss} -% this will be replaced or go away, never used - -\def\douseexternalfiles[#1][#2]% - {\getparameters - [\??fi#1] - [\c!file=, - \c!bodyfont=, - \c!option=, - #2]} - -\def\useexternalfiles - {\dodoubleargument\douseexternalfiles} - -\def\dostelexternefilesin[#1][#2]% - {\doifundefinedelse{\??fi#1\c!file} - {\useexternalfiles[#1][#2]} - {\getparameters[\??fi#1][#2]}} - -\def\stelexternefilesin - {\dodoubleargument\dostelexternefilesin} - -\def\verwerkexternefile#1#2#3% - {\bgroup - \getparameters[\??fi#1][\c!file=,#3]% - \doinputonce{\getvalue{\??fi#1\c!file}}% - \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!bodyfont}]% - \readsysfile{#2} % beter: loc of fix gebied - \donothing - {\showmessage\m!systems{41}{#2,#1}}% - \egroup} - -\def\douseexternalfile[#1][#2][#3][#4]% - {\stelexternefilesin[#1][]% - \doinputonce{\getvalue{\??fi#1\c!file}}% - \doifelsenothing{#2} - {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}} - {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}} - -\def\useexternalfile - {\doquadrupleargument\douseexternalfile} - -\useexternalfiles - [pictex] - [\c!bodyfont=\v!small, - \c!file=pictex] - -\useexternalfiles - [table] - [\c!file=table] - %D A couple of examples, demonstrating how the depth is %D taken care of: %D diff --git a/tex/context/base/core-par.tex b/tex/context/base/core-par.mkii index 0b283b294..0b283b294 100644 --- a/tex/context/base/core-par.tex +++ b/tex/context/base/core-par.mkii diff --git a/tex/context/base/core-spa.lua b/tex/context/base/core-spa.lua index 0f308b19c..0e33bf609 100644 --- a/tex/context/base/core-spa.lua +++ b/tex/context/base/core-spa.lua @@ -25,7 +25,7 @@ local trace_vspacing = false trackers.register("nodes.vspacing", local has_attribute = node.has_attribute local unset_attribute = node.unset_attribute local set_attribute = node.set_attribute -local slide_node_list = node.slide +local find_node_tail = node.tail local free_node = node.free local copy_node = node.copy local traverse_nodes = node.traverse @@ -35,6 +35,7 @@ local remove_node = nodes.remove local make_penalty_node = nodes.penalty local count_nodes = nodes.count local node_ids_to_string = nodes.ids_to_string +local hpack_node = node.hpack local glyph = node.id("glyph") local penalty = node.id("penalty") @@ -42,6 +43,7 @@ local kern = node.id("kern") local glue = node.id('glue') local hlist = node.id('hlist') local vlist = node.id('vlist') +local adjust = node.id('adjust') vspacing = vspacing or { } @@ -550,7 +552,7 @@ local function collapser(head,where,what,trace) -- maybe also pass tail current = current.next end end - local tail = slide_node_list(head) -- still needed, check previous code ? + local tail = find_node_tail(head) -- still needed, check previous code ? if trace then trace_info("stop analyzing",where,what) end --~ if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then --~ penalty_data = natural_penalty @@ -596,7 +598,7 @@ function nodes.handle_page_spacing(where) local newhead = texlists.contrib_head if newhead then statistics.starttiming(vspacing) - local newtail = slide_node_list(newhead) + local newtail = find_node_tail(newhead) local flush = false for n in traverse_nodes(newhead) do local id = n.id @@ -655,7 +657,7 @@ local ignore = table.tohash { function nodes.handle_vbox_spacing(head,where) if head and not ignore[where] and head.next then statistics.starttiming(vspacing) - head = collapser(slide_node_list(head),"vbox",where,trace_vbox_vspacing) + head = collapser(head,"vbox",where,trace_vbox_vspacing) statistics.stoptiming(vspacing) end return head @@ -679,3 +681,54 @@ function vspacing.disable() callback.register('vpack_filter', nil) callback.register('buildpage_filter', nil) end + +-- we will split this module + +local attribute = attributes.private('graphicvadjust') + +--~ local hlist = node.id('hlist') +--~ local vlist = node.id('vlist') + +--~ local remove_node = nodes.remove +--~ local hpack_node = node.hpack +--~ local has_attribute = node.has_attribute + +function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only + if groupcode == "" then -- mvl only + local h, p, done = head, nil, false + while h do + local id = h.id + if id == hlist or id == vlist then + local a = has_attribute(h,attribute) + if a then + if p then + local n + head, h, n = remove_node(head,h) + local pl = p.list + if n.width ~= 0 then + n = hpack_node(n,0,'exactly') + end + if pl then + pl.prev = n + n.next = pl + end + p.list = n + done = true + else + -- can't happen + end + else + p = h + h = h.next + end + else + h = h.next + end + end + return head, done + else + return head, false + end +end + +--~ tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust") diff --git a/tex/context/base/core-spa.mkii b/tex/context/base/core-spa.mkii index 356b2cbe3..7c97bcc9c 100644 --- a/tex/context/base/core-spa.mkii +++ b/tex/context/base/core-spa.mkii @@ -298,32 +298,34 @@ \def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}} -\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight} -\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight} -\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}} -\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}} -\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}} -\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}} -\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight} -\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight} -\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight} -\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight} - -\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount} -\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue} -\defineblankmethod [\v!disable] {\global\blankdisabletrue} -\defineblankmethod [\v!force] {\global\blankforcetrue} -\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi} -\defineblankmethod [\v!reset] {\global\blankresettrue} -\defineblankmethod [\v!flexible] {\global\localblankflexibletrue} -\defineblankmethod [\v!fixed] {\global\localblankfixedtrue} -\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko} -\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi - \global\advance\blankskip .5\lineheight} - -\defineblankmethod [\v!none] {\global\blankresettrue} -\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} - +\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight} +\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight} +\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}} +\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}} +\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}} +\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}} +\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight} +\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight} +\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight} +\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight} + +\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount} +\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue} +\defineblankmethod [\v!disable] {\global\blankdisabletrue} +\defineblankmethod [\v!force] {\global\blankforcetrue} +\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi} +\defineblankmethod [\v!reset] {\global\blankresettrue} +\defineblankmethod [\v!flexible] {\global\localblankflexibletrue} +\defineblankmethod [\v!fixed] {\global\localblankfixedtrue} +\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko} +\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi + \global\advance\blankskip .5\lineheight} +\defineblankmethod [\v!none] {\global\blankresettrue} +\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} +\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut} + +% \vtop{\blank[synchronize]\blank[line]test} + \defineblankmethod [\v!always] {\redowhitespace} % experimental % happens often, so we speed this up: @@ -4571,10 +4573,9 @@ \gdef\afterfirstobeyedline % tzt two pass, net als opsomming {\gdef\afterfirstobeyedline {\nobreak - \global\let\afterfirstobeyedline\relax}}% + \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}% \def\obeyedline {\par - \afterfirstobeyedline \futurelet\next\dobetweenthelines}% \activatespacehandler\@@rgspace \GotoPar} @@ -4585,10 +4586,13 @@ \@@rgafter} \def\dobetweenthelines - {\doifmeaningelse\next\obeyedline\@@rginbetween\donothing} + {\doifmeaningelse\next\obeyedline + {\@@rginbetween} + {\afterfirstobeyedline}} \setuplines - [\c!before=\blank, + [\c!option=, + \c!before=\blank, \c!after=\blank, \c!inbetween=\blank, \c!indenting=\v!no, diff --git a/tex/context/base/core-spa.mkiv b/tex/context/base/core-spa.mkiv index fbc949349..ad59f7779 100644 --- a/tex/context/base/core-spa.mkiv +++ b/tex/context/base/core-spa.mkiv @@ -30,13 +30,12 @@ \let \baselinecorrection \relax \let \offbaselinecorrection \relax -\appendtoks \spacing 1\to \everybodyfont +\appendtoks \spacing\plusone \to \everybodyfont \appendtoks \presetnormallineheight \to \everybodyfont \appendtoks \setnormalbaselines \to \everybodyfont % check if redundant \appendtoks \setstrut \to \everybodyfont % check if redundant \appendtoks \settopskip \to \everybodyfont \appendtoks \setmaxdepth \to \everybodyfont -%appendtoks \spacing 1\to \everybodyfont \appendtoks \simplesetupindenting \to \everybodyfont \appendtoks \simplesetupblank \to \everybodyfont \appendtoks \simplesetupwhitespace \to \everybodyfont @@ -87,7 +86,7 @@ \global\let\carriedoverpar\relax \def\carryoverpar#1% - {\expanded % \scratchtoks{#1}% + {\normalexpanded % \scratchtoks{#1}% {\noexpand#1% \the\scratchtoks \hangindent\the\hangindent \hangafter \the\hangafter @@ -284,32 +283,34 @@ \def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}} -\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight} -\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight} -\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}} -\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}} -\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}} -\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}} -\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight} -\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight} -\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight} -\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight} - -\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount} -\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue} -\defineblankmethod [\v!disable] {\global\blankdisabletrue} -\defineblankmethod [\v!force] {\global\blankforcetrue} -\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi} -\defineblankmethod [\v!reset] {\global\blankresettrue} -\defineblankmethod [\v!flexible] {\global\localblankflexibletrue} -\defineblankmethod [\v!fixed] {\global\localblankfixedtrue} -\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko} -\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi - \global\advance\blankskip .5\lineheight} - -\defineblankmethod [\v!none] {\global\blankresettrue} -\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} - +\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight} +\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight} +\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}} +\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}} +\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}} +\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}} +\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight} +\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight} +\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight} +\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight} + +\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount} +\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue} +\defineblankmethod [\v!disable] {\global\blankdisabletrue} +\defineblankmethod [\v!force] {\global\blankforcetrue} +\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi} +\defineblankmethod [\v!reset] {\global\blankresettrue} +\defineblankmethod [\v!flexible] {\global\localblankflexibletrue} +\defineblankmethod [\v!fixed] {\global\localblankfixedtrue} +\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko} +\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi + \global\advance\blankskip .5\lineheight} +\defineblankmethod [\v!none] {\global\blankresettrue} +\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} +\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut} + +% \vtop{\blank[synchronize]\blank[line]test} + \defineblankmethod [\v!always] {\redowhitespace} % experimental % happens often, so we speed this up: @@ -443,7 +444,7 @@ \else\ifcsname\??bo\ascii\endcsname % user def / slow \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax \else - \expanded{\rawprocesscommalist[#1]}\doblank + \rawprocesscommacommand[#1]\doblank \fi\fi % \relax % to be sure @@ -642,13 +643,11 @@ {\ifgridsnapping \blankflexiblefalse \else - \ExpandFirstAfter\processallactionsinset - [#1] + \normalexpanded{\noexpand\processallactionsinset[#1]} [ \v!flexible=>\blankflexibletrue, \v!fixed=>\blankflexiblefalse]% \fi - \ExpandFirstAfter\processallactionsinset - [#1] + \normalexpanded{\noexpand\processallactionsinset[#1]} [ \v!flexible=>\dosetupblank\appliedblankskip, \v!fixed=>\dosetupblank\appliedblankskip, \v!line=>\edef\appliedblankskip{\linedistance}% @@ -698,17 +697,22 @@ \def\defineblank {\dodoubleargument\dodefineblank} -\def\savecurrentblank - {\edef\restorecurrentblank - {\bigskipamount\the\bigskipamount - \medskipamount\the\medskipamount - \smallskipamount\the\smallskipamount - \noexpand\def\noexpand\currentblank{\currentblank}% - \ifblankflexible - \noexpand\blankflexibletrue - \else - \noexpand\blankflexiblefalse - \fi}} +% \def\savecurrentblank +% {\edef\restorecurrentblank +% {\bigskipamount\the\bigskipamount +% \medskipamount\the\medskipamount +% \smallskipamount\the\smallskipamount +% \noexpand\def\noexpand\currentblank{\currentblank}% +% \ifblankflexible +% \noexpand\blankflexibletrue +% \else +% \noexpand\blankflexiblefalse +% \fi}} + +\def\savecurrentblank {\edef\savedcurrentblank{\currentblank}} +\def\restorecurrentblank{\edef\currentblank{\savedcurrentblank}} + +\def\savedcurrentblank{\currentblank} %D Now. @@ -764,11 +768,12 @@ \toggleindentation}} \def\docomplexsetupindentingA#1% - {\edefconvertedargument\!!stringa{#1}% - \doifundefined{\??in:\!!stringa}% - {\edef\currentindentation{#1}% - \let\normalindentation\currentindentation - \simplesetupindenting}} + {\edefconvertedargument\!!stringa{#1}% can this be doen differently now? + \ifcsname\??in:\!!stringa\endcsname \else + \edef\currentindentation{#1}% + \let\normalindentation\currentindentation + \simplesetupindenting + \fi} \def\docomplexsetupindentingB#1% {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen @@ -1070,25 +1075,23 @@ \def\fixedspaces {\letcatcodecommand \ctxcatcodes `\~ \fixedspace} -\def\removeunwantedspaces - {\ifhmode % we also need to unskip 0pt skips - \unskip\unskip\unskip\unskip\unskip - \unskip\unskip\unskip\unskip\unskip - \fi} - \appendtoks\let~\space\to\simplifiedcommands -% still not fixed in aleph / luatex -% % \def\removeunwantedspaces -% {\ifhmode \ifnum\lastnodetype=\@@gluenode -% \unskip \@EAEAEA\removeunwantedspaces -% \fi \fi} +% {\ifhmode % we also need to unskip 0pt skips +% \unskip\unskip\unskip\unskip\unskip +% \unskip\unskip\unskip\unskip\unskip +% \fi} -%D For old time sake, will disappear soon. +\def\removeunwantedspaces + {\ifhmode + \expandafter \doremoveunwantedspace + \fi} -\let\hardespatie\fixedspace -\let\geenspatie \nospace +\def\doremoveunwantedspace + {\ifnum\lastnodetype=\@@gluenode + \unskip \expandafter\doremoveunwantedspace + \fi} % \startbuffer % \startlines \tt \fixedspaces @@ -1367,16 +1370,21 @@ \vskip\parskip \fi} -\def\savecurrentwhitespace - {\edef\restorecurrentwhitespace - {\ctxparskip\the\ctxparskip - \parskip\the\parskip - \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}% - \ifconditional\flexiblewhitespace - \noexpand\settrue\flexiblewhitespace - \else - \noexpand\setfalse\flexiblewhitespace - \fi}} +% \def\savecurrentwhitespace +% {\edef\restorecurrentwhitespace +% {\ctxparskip\the\ctxparskip +% \parskip\the\parskip +% \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}% +% \ifconditional\flexiblewhitespace +% \noexpand\settrue\flexiblewhitespace +% \else +% \noexpand\setfalse\flexiblewhitespace +% \fi}} + +\def\savecurrentwhitespace {\edef\savedcurrentwhitespace{\currentwhitespace}} +\def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}} + +\def\savedcurrentwhitespace{\currentwhitespace} % deze variant is nodig binnen \startopelkaar % steeds testen: @@ -1403,6 +1411,37 @@ \def\noblanko {\dosingleempty\nonoblanko} +% I'm not sure if the restore is still needed. Anyway, when we do +% restore, we get a parskip someplace in the output that will push +% the content off page (\vbox to pageheight{skip smashed-box}) so +% we have now disabled this hack. If it is introduced again it needs +% to be more controlled. Test case: +% +% \setupwhitespace[big] +% \starttext +% \startcolumns[n=2]\dorecurse{200}{test\crlf}\stopcolumns +% \stoptext +% +% \def\saveouterspacing +% {\savecurrentblank +% \savecurrentwhitespace +% \def\restoreouterspacing +% {\restorecurrentblank +% \restorecurrentwhitespace}} +% +% \let\restoreouterspacing\relax +% \let\saveouterspacing \relax % mult-ini: i will look into it when needed +% +% let's test this (restore before we restore the global bodyfont): + +\def\saveouterspacing + {\savecurrentblank + \savecurrentwhitespace} + +\def\restoreouterspacing + {\restorecurrentblank + \restorecurrentwhitespace} + % De onderstaande macro handelt ook de situatie dat er geen % tekst tussen \start ... \stop is geplaatst. Daartoe wordt de % laatste skip over de lege tekst heen gehaald. Dit komt goed @@ -1562,7 +1601,7 @@ \def\strutdepth {0pt} \def\strutwidth {0pt} -\def\spacingfactor {1} +\let\spacingfactor \plusone \def\topskipfactor {1.0} \def\maxdepthfactor {0.5} @@ -1653,13 +1692,11 @@ \def\spacing#1% {\ifgridsnapping - \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi - \edef\spacingfactor{1}% + %\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{\withoutpt\the\dimexpr#1\points\relax}\fi + \let\spacingfactor\plusone \else \edef\spacingfactor{#1}% \fi - %\setspacingfactor\systemtopskipfactor \topskipfactor {#1}% why no \spacingfactor ? - %\setspacingfactor\systemmaxdepthfactor\maxdepthfactor{#1}% why no \spacingfactor ? \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}% \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}% \setnormalbaselines @@ -1697,9 +1734,8 @@ \newbox\strutbox - \setbox\strutbox=\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} + \setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} - %\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} \fi @@ -1709,39 +1745,50 @@ % The double \hbox construction enables us to \backtrack % boxes. +\let\strutht\undefined \newdimen\strutht +\let\strutdp\undefined \newdimen\strutdp + \unexpanded\def\setstrut - {% height - \edef\strutheight - {\the\dimexpr\spacingfactor\dimexpr - \ifdim\minimumstrutheight>\zeropoint - \minimumstrutheight - \else - \strutheightfactor\dimexpr\normallineheight - \fi}% - % depth - \edef\strutdepth - {\the\dimexpr - \ifgridsnapping - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \normallineheight-\strutheight - \fi - \else - \spacingfactor\dimexpr - \ifdim\minimumstrutdepth>\zeropoint - \minimumstrutdepth - \else - \strutdepthfactor\dimexpr\normallineheight - \fi - \fi}% - % finish + {\ifgridsnapping + \setstrutgridyes + \else + \setstrutgridnop + \fi} + +\unexpanded\def\setstrutgridyes + {\strutht\spacingfactor\dimexpr + \ifdim\minimumstrutheight>\zeropoint + \minimumstrutheight + \else + \strutheightfactor\dimexpr\normallineheight + \fi + \strutdp\dimexpr + \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth + \else + \normallineheight-\strutht + \fi + \dosetstrut} + +\unexpanded\def\setstrutgridnop + {\strutht\spacingfactor\dimexpr + \ifdim\minimumstrutheight>\zeropoint + \minimumstrutheight + \else + \strutheightfactor\dimexpr\normallineheight + \fi + \strutdp\spacingfactor\dimexpr + \ifdim\minimumstrutdepth>\zeropoint + \minimumstrutdepth + \else + \strutdepthfactor\dimexpr\normallineheight + \fi \dosetstrut} \unexpanded\def\setcharstrut#1% {\setbox\strutbox\normalhbox{#1}% - \edef\strutheight{\the\strutht}% - \edef\strutdepth {\the\strutdp}% + \strutht\ht\strutbox + \strutdp\dp\strutbox \dosetstrut} \unexpanded\def\setfontstrut @@ -1771,28 +1818,50 @@ \def\dosetstrut {\let\strut\normalstrut + \edef\strutheight{\the\strutht}% + \edef\strutdepth {\the\strutdp}% \ifdim\strutwidth=\zeropoint - \setbox\strutbox\normalhbox - {\vrule - \!!width \zeropoint - \!!height\strutheight - \!!depth \strutdepth}% + \dosetstruthide \else - \setbox\strutbox\normalhbox - {\normalhbox to \zeropoint - {% \hss % new, will be option - \vrule - \!!width \strutwidth - \!!height\strutheight - \!!depth \strutdepth - \hss}}% + \dosetstrutvide \fi \struttotal\dimexpr\strutht+\strutdp\relax} +\def\dosetstruthide + {\setbox\strutbox\normalhbox + {\vrule + \!!width \zeropoint + \!!height\strutht + \!!depth \strutdp}} + +\def\dosetstrutvide + {\setbox\strutbox\normalhbox + {\normalhbox to \zeropoint + {% \hss % new, will be option + \vrule + \!!width \strutwidth + \!!height\strutht + \!!depth \strutdp + \hss}}} + %D The dimen \type {\struttotal} holds the exact size of the %D strut; occasionally a one scaled point difference can show %D up with the lineheight. +% experiment + +\newbox\emptystrutbox \setbox\emptystrutbox\hbox{} + +\def\dosetstruthide + {\setbox\strutbox\copy\emptystrutbox + \ht\strutbox\strutht + \dp\strutbox\strutdp} + +\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut} + + +\let\normalstrut\strut + %D Sometimes a capstrut comes in handy %D %D \starttabulate[|Tl|l|l|] @@ -1828,9 +1897,9 @@ {\begingroup \setbox\scratchbox\copy\strutbox \setstrut - \ifdim\ht\strutbox>\autostrutfactor\ht\scratchbox + \ifdim\strutht>\autostrutfactor\ht\scratchbox \endgroup \setstrut - \else\ifdim\dp\strutbox>\autostrutfactor\dp\scratchbox + \else\ifdim\strutdp>\autostrutfactor\dp\scratchbox \endgroup \setstrut \else \endgroup @@ -1938,15 +2007,21 @@ %D My own one: +\def\dopushinterlineskip + {\edef\oninterlineskip + {\baselineskip\the\baselineskip + \lineskip\the\lineskip + \lineskiplimit\the\lineskiplimit + \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}} + +\def\nopushinterlineskip + {\let\oninterlineskip\setnormalbaselines} + \def\offinterlineskip {\ifdim\baselineskip>\zeropoint - \edef\oninterlineskip - {\baselineskip\the\baselineskip - \lineskip\the\lineskip - \lineskiplimit\the\lineskiplimit - \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}% + \dopushinterlineskip \else - \let\oninterlineskip\setnormalbaselines + \nopushinterlineskip \fi \normaloffinterlineskip} @@ -2135,6 +2210,20 @@ \let\effectiveleftskip \@@effectiveleftskip \let\effectiverightskip\@@effectiverightskip} +% We will not use bodydir and pagedir so we disable them. That way we get +% normal hyperlink support. + +\let\@@bodydir\normalbodydir +\let\@@pagedir\normalpagedir + +\unexpanded\def\bodydir{\afterassignment\do@@bodydir\@@bodydir} \let\normalbodydir\bodydir +\unexpanded\def\pagedir{\afterassignment\do@@pagedir\@@pagedir} \let\normalpagedir\pagedir + +\def\do@@bodydir{\@@bodydir TLT\relax} +\def\do@@pagedir{\@@pagedir TLT\relax} + +% This will become a more advanced layout controller soon: + \unexpanded\def\lefttoright{\textdir TLT\pardir TLT\relax} \unexpanded\def\righttoleft{\textdir TRT\pardir TRT\relax} @@ -2185,7 +2274,7 @@ \v!center=>\def\raggedbox{\doalignedline\v!middle}]} \def\dosetraggedcommand#1% - {\expanded{\dodosetraggedcommand{#1}}} + {\normalexpanded{\noexpand\dodosetraggedcommand{#1}}} \newtoks\everyraggedcommand @@ -2369,7 +2458,7 @@ \appendtoks \forgetparindent \to \everyforgetall \appendtoks \forgetbothskips \to \everyforgetall \appendtoks \forgetspacing \to \everyforgetall % i.v.m. funny spacing in pagebody -\appendtoks \spacing\!!plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed +\appendtoks \spacing\plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed \appendtoks \everypar\emptytoks \to \everyforgetall % indeed! \def\localvbox#1#% @@ -3352,14 +3441,12 @@ \def\dosetuptolerance[#1]% {\doifinsetelse\v!vertical{#1}% - {\ExpandFirstAfter\processallactionsinset - [#1] + {\normalexpanded{\noexpand\processallactionsinset[#1]} [ \v!verystrict=>\def\bottomtolerance{}, \v!strict=>\def\bottomtolerance{.050}, \v!tolerant=>\def\bottomtolerance{.075}, \v!verytolerant=>\def\bottomtolerance{.100}]}% - {\ExpandFirstAfter\processallactionsinset - [#1] + {\normalexpanded{\noexpand\processallactionsinset[#1]} [ \v!stretch=>\emergencystretch\bodyfontsize, \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax, \v!verystrict=>\tolerance 200, @@ -3884,29 +3971,28 @@ \let\normalvadjust\vadjust -% test this prikkels/pascal margin text before heads (mode -% 1) as well as uitwerkingen (mode 2) - -%chardef\graphicvadjustmode=0 % fake -%chardef\graphicvadjustmode=1 % normal -\chardef\graphicvadjustmode=2 % normal + compensate (== default) - -\def\graphicvadjust % bad, those low level color calls here +% \def\graphicvadjust % bad, those low level color calls here +% {\dowithnextboxcontent +% {\forgetall} +% {\normalvadjust +% {\unvbox\nextbox +% % corrects for one line paragraphs +% \nointerlineskip +% \kern-\struttotal +% \nointerlineskip +% \verticalstrut}}% +% \vbox} + +\def\graphicvadjust % nasty bidi handling {\dowithnextboxcontent {\forgetall} - {\ifcase\graphicvadjustmode \@EA \fakedvadjust \else \@EA\normalvadjust \fi - {\dostartgraphicgroup % don't ask - \localstarttextcolor - \unvbox\nextbox - \localstoptextcolor % don't ask - \dostopgraphicgroup - \ifcase\graphicvadjustmode \or \or - % corrects for one line paragraphs - \nointerlineskip - \kern-\struttotal - \nointerlineskip - \verticalstrut - \fi}}% + {\vadjust{\vbox attr \graphicvadjustattribute \plusone + {\unvbox\nextbox + % corrects for one line paragraphs + \nointerlineskip + \kern-\struttotal + \nointerlineskip + \verticalstrut}}}% \vbox} %D This works only in a properly strutted line, and is meant @@ -4029,10 +4115,9 @@ \gdef\afterfirstobeyedline % tzt two pass, net als opsomming {\gdef\afterfirstobeyedline {\nobreak - \global\let\afterfirstobeyedline\relax}}% + \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}% \def\obeyedline {\par - \afterfirstobeyedline \futurelet\next\dobetweenthelines}% \activatespacehandler\@@rgspace \GotoPar} @@ -4043,10 +4128,13 @@ \@@rgafter} \def\dobetweenthelines - {\doifmeaningelse\next\obeyedline\@@rginbetween\donothing} + {\doifmeaningelse\next\obeyedline + {\@@rginbetween} + {\afterfirstobeyedline}} \setuplines - [\c!before=\blank, + [\c!option=, + \c!before=\blank, \c!after=\blank, \c!inbetween=\blank, \c!indenting=\v!no, diff --git a/tex/context/base/core-stg.tex b/tex/context/base/core-stg.mkii index 429e1e894..429e1e894 100644 --- a/tex/context/base/core-stg.tex +++ b/tex/context/base/core-stg.mkii diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv index 073c29b66..28ef1e520 100644 --- a/tex/context/base/core-sys.mkiv +++ b/tex/context/base/core-sys.mkiv @@ -283,6 +283,9 @@ %D processaction alternative on an string of average length. %D Since this feature is used in XML processing, it made sense %D to support this faster alternative. It's installable as well. +%D +%D We keep this around for \MKII\ \XML\ but it's not used in \MKIV\ +%D code as expansion is controlled in another way there. \def\installexpander#1#2#3% changed, no longer \convert..\to... {\setvalue{\s!do\c!expansion#1l}{#2}% @@ -315,12 +318,8 @@ \installexpander\v!strict \defreducedargument \gdefreducedargument \installexpander {utf} \defreducedtoutf \gdefreducedtoutf -%installexpander {xml} {see xtag-ext} - \def\dodefconvertedmeaning#1#2#3% watch the double expansion ! {\bgroup - \honorunexpanded - \convertencodedtokens % can be overloaded \xdef\@@globalexpanded{#3}% \xdef\@@globalexpanded{\@@globalexpanded}% \egroup @@ -337,44 +336,6 @@ \def\defreducedargument {\dodefreducedargument\edef} \def\gdefreducedargument{\dodefreducedargument\xdef} - -% \setupindex[expansion=utf]\index{\eacute} - -\def\dodefreducedtoutf#1#2#3% - {\begingroup - \reducetocoding[uc]% - \let\uchar\uchartoutf - \let\unicodechar\numbertoutf - \edef\ascii{#3}% - \expandafter\endgroup\expandafter#1\expandafter#2\expandafter{\ascii}} - -\def\defreducedtoutf {\dodefreducedtoutf\edef} -\def\gdefreducedtoutf{\dodefreducedtoutf\xdef} - -% old syntax: - -\def\convertmeaning#1\to#2% watch the double expansion ! - {\bgroup - \honorunexpanded - \convertencodedtokens % can be overloaded - \xdef\@@globalexpanded{#1}% - \xdef\@@globalexpanded{\@@globalexpanded}% - \egroup - \defconvertedcommand#2\@@globalexpanded} - -\def\reduceargument#1\to#2% - {\begingroup - \reducetocoding[raw]% - \edef\ascii{#1}% - \expandafter\endgroup\expandafter\edef\expandafter#2\expandafter{\ascii}} - -\def\reducetoutf#1\to#2% - {\begingroup - \reducetocoding[uc]% - \let\uchar\uchartoutf - \let\unicodechar\numbertoutf - \edef\ascii{#1}% - \expandafter\endgroup\expandafter\edef\expandafter#2\expandafter{\ascii}} \startruntimeluacode \ctxlua { diff --git a/tex/context/base/core-two.lua b/tex/context/base/core-two.lua index 5749d406d..50c356f7b 100644 --- a/tex/context/base/core-two.lua +++ b/tex/context/base/core-two.lua @@ -48,6 +48,14 @@ function jobpasses.savetagged(id,tag,str) jti[tag] = str end +function jobpasses.getcollected(id) + return collected[id] or { } +end + +function jobpasses.gettobesaved(id) + return allocate(id) +end + function jobpasses.get(id) local jti = collected[id] if jti and #jti > 0 then diff --git a/tex/context/base/core-two.mkiv b/tex/context/base/core-two.mkiv index f7dbd4c91..98d396d08 100644 --- a/tex/context/base/core-two.mkiv +++ b/tex/context/base/core-two.mkiv @@ -71,9 +71,6 @@ \unprotect -\let\alltwopasslists\empty -\let\twopassentry \empty -\let\twopassentry \gobblethreearguments % permits loading a MK II file \let\twopassdatalist\empty \newif\iftwopassdatafound diff --git a/tex/context/base/core-uti.mkii b/tex/context/base/core-uti.mkii index b348ba358..5b8f66f50 100644 --- a/tex/context/base/core-uti.mkii +++ b/tex/context/base/core-uti.mkii @@ -208,29 +208,32 @@ \fi \to \everybeforeutilityread -\edef\testbytesequence - {\rawcharacter{7}% - \rawcharacter{27}% - %rawcharacter{227}% invalid in xetex, which expects utf - \rawcharacter{195}\rawcharacter{128}} % valid utf code - -\def\thisisbytesequence#1% - {\ifx\testbytesequence\empty\else - \defconvertedcommand\testbytesequence\testbytesequence - \defconvertedargument\ascii{#1}% - \ifx\testbytesequence\ascii \else - \writestatus\m!systems{possible problem with 8 bit output}% - \fi - \fi - \global\let\thisisbytesequence\gobbleoneargument} - -\ifnum\texengine=\xetexengine - \let\testbytesequence\empty -\fi +% \edef\testbytesequence +% {\rawcharacter{7}% +% \rawcharacter{27}% +% %rawcharacter{227}% invalid in xetex, which expects utf +% \rawcharacter{195}\rawcharacter{128}} % valid utf code +% +% \def\thisisbytesequence#1% +% {\ifx\testbytesequence\empty\else +% \defconvertedcommand\testbytesequence\testbytesequence +% \defconvertedargument\ascii{#1}% +% \ifx\testbytesequence\ascii \else +% \writestatus\m!systems{possible problem with 8 bit output}% +% \fi +% \fi +% \global\let\thisisbytesequence\gobbleoneargument} +% +% \ifnum\texengine=\xetexengine +% \let\testbytesequence\empty +% \fi +% +% \appendtoks +% \immediatewriteutilitycommand{\thisisbytesequence{\testbytesequence}}% +% \to \everyopenutilities -\appendtoks - \immediatewriteutilitycommand{\thisisbytesequence{\testbytesequence}}% -\to \everyopenutilities +\let\testbytesequence \empty % keep this +\let\thisisbytesequence\gobbleoneargument % keep this \long\def\doutilities#1#2#3#4#5% % introduceren in utility file {\resetutilities diff --git a/tex/context/base/core-uti.mkiv b/tex/context/base/core-uti.mkiv index 77cf91dd9..29e6342be 100644 --- a/tex/context/base/core-uti.mkiv +++ b/tex/context/base/core-uti.mkiv @@ -11,8 +11,6 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D Most will disappear! - \writestatus{loading}{ConTeXt Core Macros / Utility File Handling} \unprotect @@ -22,23 +20,16 @@ \def\savecurrentvalue#1#2% {\ctxlua{jobvariables.save("\strippedcsname#1","#2")}} -\let\initializevariable\gobbletwoarguments % mkii/mkiv -\let\thisisbytesequence\gobbleoneargument - \appendtoks - \globallet\initializevariable\gobbletwoarguments -\to \everyafterutilityread - -\appendtoks - \ctxlua{storage.dump()}% + \ctxlua{storage.dump()}% will move to lua \to \everydump \appendtoks - \ctxlua{storage.finalize()}% + \ctxlua{storage.finalize()}% will move to lua \to \everyfinalizeluacode \appendtoks - \ctxlua{nodes.cleanup_reserved()}% + \ctxlua{nodes.cleanup_reserved()}% will move to lua \to \everydump \appendtoks @@ -60,37 +51,14 @@ % }% % \to \everystarttext -% keep this for a while - -\newif\ifutilitydone -\newif\ifdoinpututilities -\newif\ifunprotectutilities - -\let\writeutility \gobbleoneargument -\let\writeutilitycommand \gobbleoneargument -\let\immediatewriteutility \gobbleoneargument -\let\immediatewriteutilitycommand\gobbleoneargument -\let\cwriteutility \gobbleoneargument -\let\cwriteutilitycommand \gobbleoneargument -\let\checkedutility \secondoftwoarguments -\let\doutilities \gobblefivearguments -\let\abortutilitygeneration \relax - -\newtoks \everyopenutilities \let\openutilities \relax -\newtoks \everycloseutilities \let\closeutilities\relax -\newtoks \everycheckutilities \let\checkutilities\relax -\newtoks \utilityresetlist - -\def\addutilityreset#1{\@EA\appendtoks\csname\s!reset#1\endcsname\to\utilityresetlist} -\def\resetutilities {\the\utilityresetlist} - -\def\currentutilityfilename{\jobname} - -\prependtoks \resetutilities \to \everyjob +%D Some styles might use these use these commands: -\def\installprogram {\dosingleempty\doinstallprogram} -\def\doinstallprogram[#1]{\gobbleoneargument} -\def\installedprogram[#1]{} -\let\installplugin \gobblethreearguments +\newif \ifutilitydone +\let \checkutilities \relax +\let \currentutilityfilename \jobname +\def \installprogram {\dosingleempty\doinstallprogram} +\def \doinstallprogram [#1]{\gobbleoneargument} +\def \installedprogram [#1]{} +\let \installplugin \gobblethreearguments \protect \endinput diff --git a/tex/context/base/core-var.tex b/tex/context/base/core-var.mkii index 4de1b8718..4de1b8718 100644 --- a/tex/context/base/core-var.tex +++ b/tex/context/base/core-var.mkii diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv new file mode 100644 index 000000000..9a0b190d8 --- /dev/null +++ b/tex/context/base/core-var.mkiv @@ -0,0 +1,275 @@ +%D \module +%D [ file=core-var, +%D version=1998.02.21, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Variables, +%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 Core Macros / Variables} + +\unprotect + +%D We introduce a couple of variables that are used all over +%D \CONTEXT. Alternatively we could define them in each module +%D but as they are part of the bigger picture we prefer to do +%D it here. + +%D \macros +%D {every...} +%D +%D A few every's. Some are only used in \MKII\ or \MKIV. + +%D Output routine: + +\newtoks \everybeforeoutput +\newtoks \everyafteroutput + +%D Shipout: + +\newtoks \everyshipout +\newtoks \everybeforeshipout +\newtoks \everyaftershipout +\newtoks \everyfirstshipout +\newtoks \everylastshipout + +%D End of run: + +\newtoks \everybye +\newtoks \everygoodbye +\newtoks \everynotabene + +%D Document + +\newtoks \everysetupdocument +\newtoks \everyendoftextbody + +\newtoks \everystarttext +\newtoks \everystoptext + +%D Purity: + +\newtoks \everyforgetall +\newtoks \everycleanupfeatures + +\def\cleanupfeatures{\the\everycleanupfeatures} +\def\forgetall {\the\everyforgetall} + +%D Page building: + +\newtoks \everybeforepagebody +\newtoks \everyafterpagebody + +\let \everypagebody \everybeforepagebody % backward compatible + +%D Multipass: + +\newtoks \everybeforeutilityread +\newtoks \everyafterutilityread + +%D Floats: + +\newtoks \everyinsidefloat + +%D Sectioning: + +\newtoks \everyheadstart + +%D Par building (experimental, used in xml <p> .. </p>) + +\newtoks \everybeginofpar +\newtoks \everyendofpar +%newtoks \everyparflush + +\def\bpar{\the\everybeginofpar\ignorespaces} % may interfere with \everypar +\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi} % test prevents problems with \bpar\epar + +%D Lists: + +\newtoks \everylistentry +\newtoks \everysavesortkeys + +%D Marks: + +\newtoks \everymarking + +%D Fonts: + +\newtoks \everyfont +\newtoks \everyglobalbodyfont +\newtoks \everydefinedfont + +\newevery \everybodyfont \EveryBodyFont +\newevery \everyfontswitch \EveryFontSwitch + +%D Math: + +\newtoks \everybeforedisplayformula +\newtoks \everymathematics + +\prependtoks \the\everymathematics \to \everymath +\prependtoks \the\everymathematics \to \everydisplay + +%D Tables + +\newtoks \everytable + +%D State mess: + +\newtoks \everypushsomestate +\newtoks \everypopsomestate + +\def\pushsomestates{\the\everypushsomestate} +\def\popsomestates {\the\everypopsomestate } + +%D More generic (used to be pushcolor etc) + +\newtoks\everystarttextproperties +\newtoks\everystoptextproperties + +\def\starttextproperties{\the\everystarttextproperties} +\def\stoptextproperties {\the\everystoptextproperties} + +%D \macros +%D {defineinputmode,setinputmode} +%D +%D New. Some work needs to be done. + +% not in mkiv + +\def\defineinputmode[#1]{\@EA\newtoks\csname every#1inputmode\endcsname} +\def\setinputmode [#1]{\the\executeifdefined{every#1inputmode}\emptytoks} + +\defineinputmode [TEX] +\defineinputmode [XML] + +\setinputmode [TEX] + +%D \macros +%D {trialtypesetting} +%D +%D We disable trial typesetting in the output routine, +%D just to be sure. + +\newif\iftrialtypesetting + +\prependtoks \trialtypesettingfalse \to \everybeforepagebody + +%D \macros +%D {ifinpagebody,ifinsidecolumns,ifdoublesided,ifsinglesided} + +\newif \ifinpagebody +\newif \ifinsidecolumns +\newif \ifdoublesided \doublesidedfalse +\newif \ifsinglesided \singlesidedtrue +\newif \ifinsidefloat +\newif \ifdoingblocks +\newif \ifgridsnapping + +%D \macros +%D {ifprocessingXML} +%D +%D We need this one even if no \XML\ is supported. + +\newif\ifprocessingXML % old way + +%D \macros +%D {ifproductionrun} +%D +%D This boolean can be used to bypass certain +%D initializations. + +\ifx\protectionlevel\undefined \newcount\protectionlevel \fi + +\newif\ifproductionrun + +\appendtoks \productionruntrue \to \everydump + +\appendtoks \ifcase\protectionlevel\else\reportunprotection\fi \to \everydump + +%D \macros +%D {everyboxedcontent, ifboxedcontent, +%D startboxedcontent, stopboxedcontent} +%D +%D This one is relatively new and will be used as a more +%D robust test for inner situations. + +\newif \ifboxedcontent +\newtoks\everyboxedcontent + +\appendtoks \boxedcontenttrue \to \everyboxedcontent + +\def\startboxedcontent{\bgroup\the\everyboxedcontent} +\let\stopboxedcontent \egroup + +%D \macros +%D {fastmode,silentmode} +%D +%D These commands are obsolete. + +\let\fastmode \relax +\let\silentmode\relax + +%D \macros +%D {defineselector,setupselector} +%D +%D \starttyping +%D \defineselector[caption][max=2,n=2] +%D +%D \start +%D \setupselector[caption][n=1] +%D \placelist[figure][criterium=all] +%D \stop +%D +%D \starttext +%D \placefigure +%D {\select{caption}{zapf}{\input zapf \relax}} +%D {} +%D \stoptext +%D \stoptyping + +\def\defineselector{\dodoubleargument\dodefineselector} +\def\setupselector {\dodoubleargument\dosetupselector} + +\def\dodefineselector[#1][#2]{\getparameters[\??sx#1][\c!max=2,\c!n=1,#2]} +\def\dosetupselector [#1][#2]{\getparameters[\??sx#1][#2]} + +\unexpanded\def\select#1% + {\filterfromnext + {\executeifdefined{\??sx#1\c!max}1} + {\executeifdefined{\??sx#1\c!n }1}} + +%D We store some original meanings, maybe in \type +%D {math-ini}. + +\let\normalat \at +\let\normalin \in +\let\normalfrom \from +%let\normalover \over +\let\normalabout\about + +%D Add-ons: + +\let\startlayoutcomponent \gobbletwoarguments % obsolete +\let\stoplayoutcomponent \relax % obsolete +\let\setlayoutcomponentattribute \gobbletwoarguments +\let\resetlayoutcomponentattribute\relax +\let\layoutcomponentboxattribute \empty + +%D Concepts: + +\chardef\conceptmode\zerocount + +\def\doifconcepttracing + {\ifnum\conceptmode>\plustwo + \expandafter\firstofoneargument + \else + \expandafter\gobbleoneargument + \fi} + +\protect \endinput diff --git a/tex/context/base/enco-032.tex b/tex/context/base/enco-032.mkii index d7e15126c..d7e15126c 100644 --- a/tex/context/base/enco-032.tex +++ b/tex/context/base/enco-032.mkii diff --git a/tex/context/base/enco-037.tex b/tex/context/base/enco-037.mkii index d9fc653b2..d9fc653b2 100644 --- a/tex/context/base/enco-037.tex +++ b/tex/context/base/enco-037.mkii diff --git a/tex/context/base/enco-acc.tex b/tex/context/base/enco-acc.mkii index e02536be6..e02536be6 100644 --- a/tex/context/base/enco-acc.tex +++ b/tex/context/base/enco-acc.mkii diff --git a/tex/context/base/enco-agr.tex b/tex/context/base/enco-agr.mkii index cfd86dfd3..cfd86dfd3 100644 --- a/tex/context/base/enco-agr.tex +++ b/tex/context/base/enco-agr.mkii diff --git a/tex/context/base/enco-ans.tex b/tex/context/base/enco-ans.mkii index 7a48b5b55..7a48b5b55 100644 --- a/tex/context/base/enco-ans.tex +++ b/tex/context/base/enco-ans.mkii diff --git a/tex/context/base/enco-cas.tex b/tex/context/base/enco-cas.mkii index 38d12f9fa..38d12f9fa 100644 --- a/tex/context/base/enco-cas.tex +++ b/tex/context/base/enco-cas.mkii diff --git a/tex/context/base/enco-chi.tex b/tex/context/base/enco-chi.mkii index 9d77893a0..9d77893a0 100644 --- a/tex/context/base/enco-chi.tex +++ b/tex/context/base/enco-chi.mkii diff --git a/tex/context/base/enco-com.tex b/tex/context/base/enco-com.mkii index 42d0d4774..42d0d4774 100644 --- a/tex/context/base/enco-com.tex +++ b/tex/context/base/enco-com.mkii diff --git a/tex/context/base/enco-cyr.tex b/tex/context/base/enco-cyr.mkii index 36bca82b5..36bca82b5 100644 --- a/tex/context/base/enco-cyr.tex +++ b/tex/context/base/enco-cyr.mkii diff --git a/tex/context/base/enco-def.tex b/tex/context/base/enco-def.mkii index b6d66bb6c..b6d66bb6c 100644 --- a/tex/context/base/enco-def.tex +++ b/tex/context/base/enco-def.mkii diff --git a/tex/context/base/enco-ec.tex b/tex/context/base/enco-ec.mkii index 1ac41cadf..1ac41cadf 100644 --- a/tex/context/base/enco-ec.tex +++ b/tex/context/base/enco-ec.mkii diff --git a/tex/context/base/enco-ecm.tex b/tex/context/base/enco-ecm.mkii index b74473960..b74473960 100644 --- a/tex/context/base/enco-ecm.tex +++ b/tex/context/base/enco-ecm.mkii diff --git a/tex/context/base/enco-el.tex b/tex/context/base/enco-el.mkii index 24729967b..24729967b 100644 --- a/tex/context/base/enco-el.tex +++ b/tex/context/base/enco-el.mkii diff --git a/tex/context/base/enco-fde.tex b/tex/context/base/enco-fde.mkii index a7c11abfc..a7c11abfc 100644 --- a/tex/context/base/enco-fde.tex +++ b/tex/context/base/enco-fde.mkii diff --git a/tex/context/base/enco-ffr.tex b/tex/context/base/enco-ffr.mkii index c321153e8..c321153e8 100644 --- a/tex/context/base/enco-ffr.tex +++ b/tex/context/base/enco-ffr.mkii diff --git a/tex/context/base/enco-fpl.tex b/tex/context/base/enco-fpl.mkii index 14d102ff1..14d102ff1 100644 --- a/tex/context/base/enco-fpl.tex +++ b/tex/context/base/enco-fpl.mkii diff --git a/tex/context/base/enco-fro.tex b/tex/context/base/enco-fro.mkii index e5f5e1257..e5f5e1257 100644 --- a/tex/context/base/enco-fro.tex +++ b/tex/context/base/enco-fro.mkii diff --git a/tex/context/base/enco-fsl.tex b/tex/context/base/enco-fsl.mkii index 86a41c88a..86a41c88a 100644 --- a/tex/context/base/enco-fsl.tex +++ b/tex/context/base/enco-fsl.mkii diff --git a/tex/context/base/enco-grk.tex b/tex/context/base/enco-grk.mkii index 882a3c9b0..882a3c9b0 100644 --- a/tex/context/base/enco-grk.tex +++ b/tex/context/base/enco-grk.mkii diff --git a/tex/context/base/enco-heb.tex b/tex/context/base/enco-heb.mkii index 443745752..443745752 100644 --- a/tex/context/base/enco-heb.tex +++ b/tex/context/base/enco-heb.mkii diff --git a/tex/context/base/enco-ibm.tex b/tex/context/base/enco-ibm.mkii index 48695ca52..48695ca52 100644 --- a/tex/context/base/enco-ibm.tex +++ b/tex/context/base/enco-ibm.mkii diff --git a/tex/context/base/enco-il2.tex b/tex/context/base/enco-il2.mkii index 9fb87b2fd..9fb87b2fd 100644 --- a/tex/context/base/enco-il2.tex +++ b/tex/context/base/enco-il2.mkii diff --git a/tex/context/base/enco-ini.mkii b/tex/context/base/enco-ini.mkii index 9379c3a7f..1ac491e62 100644 --- a/tex/context/base/enco-ini.mkii +++ b/tex/context/base/enco-ini.mkii @@ -93,7 +93,7 @@ {\letvalue{\c!file\f!encodingprefix#1}\empty \makeshortfilename[\truefilename{\f!encodingprefix#1}]% \startreadingfile - \readsysfile\shortfilename + \readsysfile{\shortfilename.mkii} {\showmessage\m!encodings2{#1}} {\showmessage\m!encodings3{#1}}% \stopreadingfile}} @@ -747,11 +747,11 @@ %D can be used to check the correct loading of hyphenation %D patterns. -\fetchruntimecommand \showaccents {\f!encodingprefix\s!run} -\fetchruntimecommand \showcharacters {\f!encodingprefix\s!run} -\fetchruntimecommand \showcharacterbounds {\f!encodingprefix\s!run} -\fetchruntimecommand \showhyphenations {\f!encodingprefix\s!run} -\fetchruntimecommand \showmapping {\f!encodingprefix\s!run} +\fetchruntimecommand \showaccents {\f!encodingprefix\s!run.mkii} +\fetchruntimecommand \showcharacters {\f!encodingprefix\s!run.mkii} +\fetchruntimecommand \showcharacterbounds {\f!encodingprefix\s!run.mkii} +\fetchruntimecommand \showhyphenations {\f!encodingprefix\s!run.mkii} +\fetchruntimecommand \showmapping {\f!encodingprefix\s!run.mkii} %D \macros %D {everyuppercase, EveryUppercase, diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv index 5fd3d9cef..112c5596a 100644 --- a/tex/context/base/enco-ini.mkiv +++ b/tex/context/base/enco-ini.mkiv @@ -11,12 +11,12 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This is s stripped down version of th eoriginal enco-ini.tex +%D This is stripped down version of th eoriginal enco-ini.tex %D file. For more details you might want to study the \MKII\ file %D but since \LUATEX\ is unicode inside we need less code. -% When dealing with characters we have four cases to take into account when moving -% from mkii to mkiv: +% When dealing with characters we have four cases to take into account +% when moving from mkii to mkiv: % 1. <byte 200> => ref to slot 200 in current font % 2. \char 200 => ref to slot 200 in current font @@ -36,36 +36,19 @@ \unprotect -%D Quite some commands are now obsolete. These nillers will disappear soon. - -\def\currentencoding {utf} -\def\currentmapping {utf} - -\let\defaultencoding \s!default -\let\characterencoding \s!default -\let\nocharacterencoding\s!default - -\def\setupencoding [#1]{} -\def\startmapping [#1]{\gobbleuntil\stopmapping} -\def\startencoding [#1]{} -\let\stopencoding \relax -\let\startcoding \startencoding -\let\stopcoding \relax -\def\optimizemapping [#1]{} -\def\enablemapping [#1]{} -\def\enableencoding [#1]{} -\def\enablecoding [#1]{} -\def\fastenableencoding #1{} -\def\enablelanguagespecifics[#1]{} -\def\useencoding [#1]{} - -\let\dontexpandencoding \relax -\let\keepencodedtokens \relax -\let\literateencodedtokens \relax -\let\stringifyencodedtokens \relax -\let\dontexpandencodedtokens\relax -\let\convertencodedtokens \relax -\let\ignoreencoding \relax +%D Quite some commands are now obsolete. We keep only a few commands +%D around, just in case they are used in styles (and in for instance +%D symb and xtag files). + +\def\startencoding [#1]{} % used in symb +\let\stopencoding \relax +\def\setupencoding [#1]{} +\def\enablemapping [#1]{} +\def\enableencoding[#1]{} + +\def\currentencoding{utf} +\def\currentmapping {utf} +\let\defaultencoding\s!default % todo: @@ -78,14 +61,12 @@ %D \macros %D {defineaccent, definecharacter, definecommand} -\def\accentprefix{@acc@} - \def\defineaccent#1 #2 #3 % {\setevalue{\string#1}{\noexpand\dohandleaccent{\string#1}}% - \setvalue{\accentprefix\string#1\string#2}{#3}} + \setvalue{\??ac\string#1\string#2}{#3}} \def\dohandleaccent#1#2% - {\csname\accentprefix\string#1\string#2\endcsname} + {\csname\??ac\string#1\string#2\endcsname} \def\definecharacter#1 #2 % {\doifnumberelse{\string#2} @@ -102,7 +83,7 @@ \newevery \everyuppercase \EveryUppercase \newevery \everylowercase \EveryLowercase -\newevery \everysanitize \EverySanitize +\newevery \everysanitize \EverySanitize %D Some saved meanings (not really needed): @@ -371,21 +352,6 @@ \vrule \!!width\scratchdimen \!!height5.5\scratchdimen\!!depth3\scratchdimen \kern\scratchdimen}} -% what to do with these: -% -% \definecharacter mathacute "7013 -% \definecharacter mathgrave "7012 -% \definecharacter mathddot "707F -% \definecharacter mathtilde "707E -% \definecharacter mathbar "7016 -% \definecharacter mathbreve "7015 -% \definecharacter mathcheck "7014 -% \definecharacter mathhat "705E -% \definecharacter mathvec "017E -% \definecharacter mathdot "705F -% \definecharacter mathwidetilde "0365 -% \definecharacter mathwidehat "0362 - % from enco-acc: \defineaccent ^ A {\Acircumflex} \defineaccent ^ a {\acircumflex} @@ -412,6 +378,7 @@ \defineaccent ~ I {\Itilde} \defineaccent ~ i {\itilde} \defineaccent ~ {\i} {\itilde} \defineaccent ~ O {\Otilde} \defineaccent ~ o {\otilde} \defineaccent ~ U {\Utilde} \defineaccent ~ u {\utilde} +\defineaccent ~ N {\Ntilde} \defineaccent ~ n {\ntilde} \defineaccent " A {\Adiaeresis} \defineaccent " a {\adiaeresis} \defineaccent " E {\Ediaeresis} \defineaccent " e {\ediaeresis} @@ -512,7 +479,6 @@ \!!width \wd\scratchbox \!!height\zeropoint}} - \def\fakeunderscores{\let\_\fakeunderscore} \def\textunderscores{\let\_\textunderscore} diff --git a/tex/context/base/enco-lat.tex b/tex/context/base/enco-lat.mkii index 2623aae8d..2623aae8d 100644 --- a/tex/context/base/enco-lat.tex +++ b/tex/context/base/enco-lat.mkii diff --git a/tex/context/base/enco-mis.tex b/tex/context/base/enco-mis.mkii index 92dc61b3f..92dc61b3f 100644 --- a/tex/context/base/enco-mis.tex +++ b/tex/context/base/enco-mis.mkii diff --git a/tex/context/base/enco-pdf.tex b/tex/context/base/enco-pdf.mkii index a03e81df2..a03e81df2 100644 --- a/tex/context/base/enco-pdf.tex +++ b/tex/context/base/enco-pdf.mkii diff --git a/tex/context/base/enco-pfr.tex b/tex/context/base/enco-pfr.mkii index a90c62352..b279e40aa 100644 --- a/tex/context/base/enco-pfr.tex +++ b/tex/context/base/enco-pfr.mkii @@ -12,10 +12,12 @@ %C details. \ifnum\texengine>\pdftexengine - \endinput + \expandafter \endinput \fi -\ifx\pdffontresource\undefined\else\endinput\fi +\ifdefined\pdffontresource \else + \expandafter \endinput +\fi \writestatus{loading}{ConTeXt Encoding Macros / PDF Resources} @@ -58,14 +60,14 @@ \ifx\pdfglyphtounicode\undefined \else \appendtoks - \doif\jobsuffix{pdf}{\readfile{pdfr-def.tex}\donothing\donothing}% + \doif\jobsuffix{pdf}{\readfile{pdfr-def.mkii}\donothing\donothing}% \to \everystarttext \fi % somehow we cannot preload this beast; also, it's mk dependent % % \appendtoks -% \doifelse{\jobsuffix}{pdf}{\loadmkiifile{pdfr-def.tex}}% +% \doifelse{\jobsuffix}{pdf}{\loadmkiifile{pdfr-def.mkii}}% % \to \everystarttext % ugly, this should go to the driver spec-tpd @@ -251,7 +253,7 @@ \doifvaluesomething\pdffontfileresource {\startreadingfile \ignorelines % just in case \par is redefined; this thing can get called anywhere - \readsysfile{pdfr-\getvalue\pdffontfileresource}\donothing\donothing + \readsysfile{pdfr-\getvalue\pdffontfileresource.mkii}\donothing\donothing \stopreadingfile \letgvalue\pdffontfileresource\empty}% \egroup} diff --git a/tex/context/base/enco-pol.tex b/tex/context/base/enco-pol.mkii index a012f0370..a012f0370 100644 --- a/tex/context/base/enco-pol.tex +++ b/tex/context/base/enco-pol.mkii diff --git a/tex/context/base/enco-qx.tex b/tex/context/base/enco-qx.mkii index 407d60bd7..407d60bd7 100644 --- a/tex/context/base/enco-qx.tex +++ b/tex/context/base/enco-qx.mkii diff --git a/tex/context/base/enco-raw.tex b/tex/context/base/enco-raw.mkii index e3a46e3d7..e3a46e3d7 100644 --- a/tex/context/base/enco-raw.tex +++ b/tex/context/base/enco-raw.mkii diff --git a/tex/context/base/enco-run.tex b/tex/context/base/enco-run.mkii index 50fb52e15..50fb52e15 100644 --- a/tex/context/base/enco-run.tex +++ b/tex/context/base/enco-run.mkii diff --git a/tex/context/base/enco-t5.tex b/tex/context/base/enco-t5.mkii index 251c68765..251c68765 100644 --- a/tex/context/base/enco-t5.tex +++ b/tex/context/base/enco-t5.mkii diff --git a/tex/context/base/enco-tbo.tex b/tex/context/base/enco-tbo.mkii index 475be4602..475be4602 100644 --- a/tex/context/base/enco-tbo.tex +++ b/tex/context/base/enco-tbo.mkii diff --git a/tex/context/base/enco-uc.tex b/tex/context/base/enco-uc.mkii index 981eb6ae4..981eb6ae4 100644 --- a/tex/context/base/enco-uc.tex +++ b/tex/context/base/enco-uc.mkii diff --git a/tex/context/base/enco-vis.tex b/tex/context/base/enco-vis.mkii index 3c1fd7765..3c1fd7765 100644 --- a/tex/context/base/enco-vis.tex +++ b/tex/context/base/enco-vis.mkii diff --git a/tex/context/base/enco-vna.tex b/tex/context/base/enco-vna.mkii index 05753f37b..05753f37b 100644 --- a/tex/context/base/enco-vna.tex +++ b/tex/context/base/enco-vna.mkii diff --git a/tex/context/base/enco-win.tex b/tex/context/base/enco-win.mkii index 826371d8a..826371d8a 100644 --- a/tex/context/base/enco-win.tex +++ b/tex/context/base/enco-win.mkii diff --git a/tex/context/base/enco-x5.tex b/tex/context/base/enco-x5.mkii index f82ec6c5c..f82ec6c5c 100644 --- a/tex/context/base/enco-x5.tex +++ b/tex/context/base/enco-x5.mkii diff --git a/tex/context/base/filt-bas.tex b/tex/context/base/filt-bas.mkii index ca3bc3d70..ca3bc3d70 100644 --- a/tex/context/base/filt-bas.tex +++ b/tex/context/base/filt-bas.mkii diff --git a/tex/context/base/filt-ini.tex b/tex/context/base/filt-ini.mkii index 49b32bdd8..6e1a16e9a 100644 --- a/tex/context/base/filt-ini.tex +++ b/tex/context/base/filt-ini.mkii @@ -28,18 +28,6 @@ %D The real work starts here. -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - % We need the {\??ot::#1} check because otherwise aleph will crash. Taco's % torture test: % @@ -122,7 +110,7 @@ {\letvalue{\c!file\f!filterprefix#1}\empty \makeshortfilename[\truefilename{\f!filterprefix#1}]% \startreadingfile - \readsysfile\shortfilename + \readsysfile{\shortfilename.mkii} {\showmessage\m!filters1{#1}} {\showmessage\m!filters2{#1}}% \stopreadingfile}} diff --git a/tex/context/base/font-arb.tex b/tex/context/base/font-arb.mkii index 3ec0395f3..3ec0395f3 100644 --- a/tex/context/base/font-arb.tex +++ b/tex/context/base/font-arb.mkii diff --git a/tex/context/base/font-bfm.tex b/tex/context/base/font-bfm.mkii index 23e3176c4..23e3176c4 100644 --- a/tex/context/base/font-bfm.tex +++ b/tex/context/base/font-bfm.mkii diff --git a/tex/context/base/font-chi.tex b/tex/context/base/font-chi.mkii index 0acf710d5..0acf710d5 100644 --- a/tex/context/base/font-chi.tex +++ b/tex/context/base/font-chi.mkii diff --git a/tex/context/base/font-chk.lua b/tex/context/base/font-chk.lua index 61f3f8ab5..382f671d8 100644 --- a/tex/context/base/font-chk.lua +++ b/tex/context/base/font-chk.lua @@ -18,6 +18,7 @@ local chardata = characters.data local glyph = node.id('glyph') local traverse_id = node.traverse_id +local remove_node = nodes.remove -- maybe in fonts namespace -- deletion can be option @@ -44,7 +45,7 @@ function fonts.register_message(font,char,message) end end -function checkers.missing(head,tail) +function checkers.missing(head) if checkers.enabled then local lastfont, characters, found = nil, nil, nil for n in traverse_id(glyph,head) do @@ -67,14 +68,9 @@ function checkers.missing(head,tail) end if found and checkers.delete then for i=1,#found do - local n = found[i] - if n == tail then - head, tail = nodes.remove(head,n,true) - else - head, _ = nodes.remove(head,n,true) - end + head = remove_node(head,found[i],true) end end end - return head, tail, false + return head, false end diff --git a/tex/context/base/font-cid.lua b/tex/context/base/font-cid.lua index b8dfc4294..13e9cce89 100644 --- a/tex/context/base/font-cid.lua +++ b/tex/context/base/font-cid.lua @@ -93,6 +93,7 @@ local function locate(registry,ordering,supplement) logs.report("load otf","using cidmap file %s",filename) end fonts.cid.map[filename] = cidmap + cidmap.usedname = file.basename(filename) return cidmap end end diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua index 5d089fef2..f2ee3f1ae 100644 --- a/tex/context/base/font-col.lua +++ b/tex/context/base/font-col.lua @@ -187,7 +187,7 @@ function collections.message(message) end end -function collections.process(head,tail) +function collections.process(head) if active then local done = false for n in traverse_id(glyph,head) do @@ -211,5 +211,5 @@ function collections.process(head,tail) end end end - return head, tail, done + return head, done end diff --git a/tex/context/base/font-heb.tex b/tex/context/base/font-heb.mkii index 3ec0395f3..3ec0395f3 100644 --- a/tex/context/base/font-heb.tex +++ b/tex/context/base/font-heb.mkii diff --git a/tex/context/base/font-ini.mkii b/tex/context/base/font-ini.mkii index 658d06f70..f614a07cd 100644 --- a/tex/context/base/font-ini.mkii +++ b/tex/context/base/font-ini.mkii @@ -2457,7 +2457,7 @@ \fi \makeshortfilename[\truefilename{\f!fontprefix#2}]% \startreadingfile - \readsysfile\shortfilename + \readsysfile{\shortfilename.mkii} {\showmessage\m!fonts2{#2}} {\showmessage\m!fonts3{#2}}% \stopreadingfile}} @@ -3778,7 +3778,7 @@ %D The implementation is rather straightforward in using %D \type{\halign}. -\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run} +\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run.mkii} %D \macros %D {showfontstrip, testminimalbaseline, showminimalbaseline} @@ -3789,9 +3789,9 @@ %D %D \showfontstrip \blank \showminimalbaseline -\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run} -\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run} -\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run} +\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkii} %D \macros %D {showkerning} @@ -3800,7 +3800,7 @@ %D %D \showkerning{Can you guess what kerning is?} -\fetchruntimecommand \showkerning {\f!fontprefix\s!run} +\fetchruntimecommand \showkerning {\f!fontprefix\s!run.mkii} %D \macros %D {showbodyfontenvironment} @@ -3813,7 +3813,7 @@ %D %D \showsetup{showbodyfontenvironment} -\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run} +\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run.mkii} %D \macros %D {showfont,showfontstyle,showligatures} @@ -3834,11 +3834,11 @@ % to be internationalized -\fetchruntimecommand \showfont {\f!fontprefix\s!run} -\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run} -\fetchruntimecommand \showligature {\f!fontprefix\s!run} -\fetchruntimecommand \showligatures {\f!fontprefix\s!run} -\fetchruntimecommand \showcharratio {\f!fontprefix\s!run} +\fetchruntimecommand \showfont {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showligature {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkii} %D \macros %D {getglyph, symbolicfont} diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv index 5ce6248ea..339e521a9 100644 --- a/tex/context/base/font-ini.mkiv +++ b/tex/context/base/font-ini.mkiv @@ -405,7 +405,7 @@ %D defining it here, we have at least an safeguard for utility %D file reading. -\ifx\uchar\undefined \unexpanded\def\uchar#1#2{[#1,#2]} \fi +\ifdefined\uchar\else \unexpanded\def\uchar#1#2{[#1,#2]} \fi %D We define some (very private) constants to improve speed, %D memory usage and consistency. @@ -459,7 +459,10 @@ %D tests but it does not help us when no math is defined. \chardef\mrfam\zerocount % math regular -\chardef\mbfam\zerocount % math bold +\chardef\mbfam\plusone % math bold + +\unexpanded\def\mr{\ifmmode\fam\zerocount\else\setcurrentfontalternative\c!mr\fi} % \fam\csname\c!mr fam\endcsname +\unexpanded\def\mb{\ifmmode\fam\plusone \else\setcurrentfontalternative\c!mb\fi} % \fam\csname\c!mb fam\endcsname \def\mathtextsuffix {-text} \def\mathscriptsuffix {-script} @@ -508,7 +511,17 @@ \appendtoks \dosetmathfamily\mrfam\c!mr - %\dosetmathfamily\mbfam\c!mb % some day, only when defined, else equivalent to 0 +\to \mathstrategies + +% not official ! + +\chardef\boldmathmode\zerocount % might change ... maybe \mathfontsupport 1 (normal) 2 (bold too) + +\def\enableboldmath {\chardef\boldmathmode\plusone } % todo: \setupbodyfont[boldmath,...] +\def\disableboldmath{\chardef\boldmathmode\zerocount} + +\appendtoks + \ifcase\boldmathmode\or\dosetmathfamily\mbfam\c!mb\fi \to \mathstrategies %D All used styles, like rm, ss and tt, are saved in a comma @@ -825,7 +838,6 @@ \def \defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone \edef\nullfontname {\fontname\nullfont} -\edef\dummyfontname {font\strippedcsname\\} %D \macros %D {everyfont,everyfontswitch} @@ -1082,12 +1094,6 @@ \let\oldrawfontidentifier\rawfontidentifier \let\oldnewfontidentifier\newfontidentifier -% best we can add the style as well because otherwise we get math encoding mixups -% -% \setupbodyfont [8pt] [\currentencoding/\ccaron\scaron\zcaron] -% \blank -% \switchtobodyfont[7pt] [\currentencoding/\ccaron\scaron\zcaron] - \def\newfontidentifier{*\fontclass\lastfontidentifier\fontstyle\fontsize*} \def\dododefinefont#1#2% @@ -1176,7 +1182,7 @@ \let\fontalternativelist\empty \let\fontstylelist \empty -\def\checkfontnamecombinations +\def\checkfontnamecombinations % we need to split math and text here ... todo (math only has mr and mb) {\def\docommand##1% {\def\dodocommand####1% {\def\dododocommand########1{\checkbodyfont{########1}{####1}{##1}}% @@ -1508,7 +1514,7 @@ \doifnumberelse{#1} {\doifassignmentelse{#3} {% [12pt] [style] [settings] - \doifundefined{#2}{\normalexpanded{\noexpand\definefontstyle[#2][#2]}}% new + \ifcsname#2\endcsname\else\normalexpanded{\noexpand\definefontstyle[#2][#2]}\fi % new \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}} {% [12pt] [style] [identifier] \dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier @@ -1517,10 +1523,14 @@ \else\ifsecondargument \definebodyfont[#1][\c!rm][#2]% \else - \doifundefined{\@size@#1} % Maybe there are default dependancies - {\defineunknownfont{#1}}% defined which we can use ([unknown]) - \doifundefined{\@size@#1} % and if not, then we have at least to - {\definebodyfont[#1][\c!rm][]}% make sure some basics are set up. + % Maybe there are default dependencies defined which we can use ([unknown]) and + % if not, then we have at least to make sure some basics are set up. + \ifcsname\@size@#1\endcsname \else + \defineunknownfont{#1}% + \fi + \ifcsname\@size@#1\endcsname \else + \definebodyfont[#1][\c!rm][]% + \fi \fi\fi} \def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier @@ -1588,18 +1598,19 @@ \normalprotected\@EA\fcxdef\csname\fontclass#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}} \def\checkbodyfont#1% tests for ttsl mmbf - {\def\c!!mm{#1}% + {\edef\c!!mm{#1}% \ifx\c!!mm\c!mm % prevents \max and alike (re)defs \expandafter\checkmathbodyfont \else \expandafter\checktextbodyfont \fi{#1}} % no \c!!mm, not expanded later on +% some day we can do an auto-fam if needed + \def\checkmathbodyfont#1#2#3% style alt size / gdef % #3 can be empty {%\message{!m #1 #2 #3!}% % #1 #2 #3 = signal - %unexpanded\setgvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \mmsla - \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}% \sl + %unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}% \mr \mb \unexpanded\setgvalue {#1}{\setcurrentfontstyle {#1}}}% \mm \def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty @@ -1619,9 +1630,10 @@ {\def\dododefinedefaultbodyfont##1% {\def\dodododefinedefaultbodyfont####1% {\def\dododododefinedefaultbodyfont########1% - {\doifdefined{\s!default########1####1} - {% [12pt] [style] [identifier] - \getvalue{\s!default########1####1}{##1}{####1}}}% + {\ifcsname\s!default########1####1\endcsname + % [12pt] [style] [identifier] + \csname\s!default########1####1\endcsname{##1}{####1}% + \fi}% \processcommalist[#3]\dododododefinedefaultbodyfont}% \processcommalist[#2]\dodododefinedefaultbodyfont}% \processcommalist[#1]\dododefinedefaultbodyfont} @@ -1643,14 +1655,14 @@ \def\dodefineunknownbodyfont#1#2% see *** {\ifcsname\s!default\s!default#2\endcsname % somehow related to */* \donetrue - \getvalue{\s!default\s!default#2}{#1}{#2}% + \csname\s!default\s!default#2\endcsname{#1}{#2}% \fi} \def\dodefineunknownsubfont#1#2% - {\ifcsname\@size@\getvalue{\??ft#1#2}\endcsname + {\ifcsname\@size@\csname\??ft#1#2\endcsname\endcsname \else \donetrue - \defineunknownfont{\getvalue{\??ft#1#2}}% + \defineunknownfont{\csname\??ft#1#2\endcsname}% \fi} \def\defineunknownfont#1% @@ -1832,27 +1844,32 @@ % can be made faster (only used internally now) \def\doswitchpoints[#1]% - {\normalexpanded{\noexpand\dodoswitchpoints{#1}}} + {\normalexpanded{\dodoswitchpoints{#1}}} -\def\dodoswitchpoints#1% - {\doifundefined{\@size@#1} - {\defineunknownfont{#1}}% +\unexpanded \def\dodoswitchpoints#1% + {\ifcsname\@size@#1\endcsname \else + \defineunknownfont{#1}% + \fi% %\defineunknownfontstyles{#1}% - \doifdefinedelse{\@size@#1} - {\getvalue{\@size@#1}% - \localbodyfontsize#1\relax - \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize -% \edef\fontbody{\fontbody}% to be tested but we can clean up mkiv further - \checkbodyfontenvironment[\normalizedbodyfontsize]} - {\showmessage\m!fonts4{#1}}} - -\unprotected \def\doswitchstyle[#1]% - {\doifdefinedelse{\@style@#1} - {\getvalue{\@style@#1}% - \edef\fontstyle{#1}% - \ifmmode\mr\fi % in order to be compatible with \rm in math mode - }% \the\everybodyfont} % cleaner, in setting size as well as style - {\showmessage\m!fonts5{#1}}} + \ifcsname\@size@#1\endcsname + \csname\@size@#1\endcsname + \localbodyfontsize#1\relax + \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize + % \edef\fontbody{\fontbody}% to be tested but we can clean up mkiv further + \checkbodyfontenvironment[\normalizedbodyfontsize]% + \else + \showmessage\m!fonts4{#1}% + \fi} + +\unexpanded \def\doswitchstyle[#1]% + {\ifcsname\@style@#1\endcsname + \csname\@style@#1\endcsname + \edef\fontstyle{#1}% + \ifmmode\mr\fi % in order to be compatible with \rm in math mode + % \the\everybodyfont % cleaner, in setting size as well as style + \else + \showmessage\m!fonts5{#1}% + \fi} %D \TEX\ loads font metric files like \type{cmr10.tfm} and %D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files @@ -2450,9 +2467,11 @@ \unexpanded\def\switchtobodyfont[#1]% {\doifsomething{#1} - {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}} - {\setbodyfontstep{#1}} % so we have a fast [small] switch - {\dosetfont0{#1}}% + {\ifcsname\??ft\normalizedbodyfontsize\interfaced{#1}\endcsname + \setbodyfontstep{#1}% so we have a fast [small] switch + \else + \dosetfont0{#1}% + \fi \the\everybodyfont}} % indeed needed in case nothing is executed %D The following alternative is meant for math||to||text @@ -2513,6 +2532,10 @@ [%mode=node,% liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes +\definefontfeature % can be used for type1 fonts + [complete] + [liga=yes,kern=yes,compose=yes,tlig=yes,trep=yes] + \definefontfeature [arabic] [mode=node,language=dflt,script=arab,ccmp=yes, @@ -2633,10 +2656,10 @@ \definecomplexorsimple\switchstyleonly \def\simpleswitchstyleonly#1% stupid version - {\complexswitchstyleonly[\strippedcsname#1]} + {\complexswitchstyleonly[\checkedstrippedcsname#1]} \def\complexswitchstyleonly[#1]% todo : check - {\setcurrentfontstyle{\getvalue{\@shortstyle@#1}}% + {\setcurrentfontstyle{\csname\@shortstyle@#1\endcsname}% \the\everybodyfont} % needed ? %D \macros @@ -2814,7 +2837,7 @@ \def\dodefinealternativestyle[#1][#2][#3]% {\def\docommand##1% - {\doifundefined{##1}{\setvalue{##1}{\groupedcommand{#2}{}}}% + {\ifcsname##1\endcsname\else\setvalue{##1}{\groupedcommand{#2}{}}\fi \setvalue{\@letter@ ##1}{#2}% \setvalue{\@noletter@##1}{#3}}% \processcommalist[#1]\docommand} @@ -2947,37 +2970,37 @@ %D or even better: -\def\doemphasistypeface#1#2% slow - {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!slanted - {#1}% - {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!italic - {#2}% - {\doifelsevaluenothing{\??ft\fontclass\normalizedbodyfontsize\c!em} - {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!slanted - {#1}% - {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!italic - {#2}% - {\getvalue{\??ft\normalizedbodyfontsize\c!em}}}} - {\getvalue{\??ft\fontclass\normalizedbodyfontsize\c!em}}}}} - -% \def\doemphasistypeface#1#2% -% {\edef\emphasizedtypeface{\csname\??ft\fontclass\normalizedbodyfontsize\c!em\endcsname}% -% \ifx\emphasizedtypeface\v!slanted -% #1% -% \else\ifx\emphasizedtypeface\v!italic -% #2% -% \else\ifx\emphasizedtypeface\v!empty -% \edef\emphasizedtypeface{\csname\??ft\normalizedbodyfontsize\c!em\endcsname}% -% \ifx\emphasizedtypeface\v!slanted -% #1% -% \else\ifx\emphasizedtypeface\v!italic -% #2% -% \else -% \getvalue\emphasizedtypeface -% \fi\fi -% \else -% \getvalue\emphasizedtypeface -% \fi\fi\fi} +% \def\doemphasistypeface#1#2% slow +% {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!slanted +% {#1}% +% {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!italic +% {#2}% +% {\doifelsevaluenothing{\??ft\fontclass\normalizedbodyfontsize\c!em} +% {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!slanted +% {#1}% +% {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!italic +% {#2}% +% {\getvalue{\??ft\normalizedbodyfontsize\c!em}}}} +% {\getvalue{\??ft\fontclass\normalizedbodyfontsize\c!em}}}}} + +\def\doemphasistypeface#1#2% + {\edef\emphasizedtypeface{\csname\??ft\fontclass\normalizedbodyfontsize\c!em\endcsname}% + \ifx\emphasizedtypeface\v!slanted + #1% + \else\ifx\emphasizedtypeface\v!italic + #2% + \else\ifx\emphasizedtypeface\v!empty + \edef\emphasizedtypeface{\csname\??ft\normalizedbodyfontsize\c!em\endcsname}% + \ifx\emphasizedtypeface\v!slanted + #1% + \else\ifx\emphasizedtypeface\v!italic + #2% + \else + \getvalue\emphasizedtypeface + \fi\fi + \else + \getvalue\emphasizedtypeface + \fi\fi\fi} \def\emphasistypeface{\doemphasistypeface\sl\it} \def\emphasisboldface{\doemphasistypeface\bs\bi} @@ -3182,7 +3205,7 @@ %D The implementation is rather straightforward in using %D \type{\halign}. -\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run} +\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run.mkii} %D \macros %D {showfontstrip, testminimalbaseline, showminimalbaseline} @@ -3193,9 +3216,9 @@ %D %D \showfontstrip \blank \showminimalbaseline -\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run} -\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run} -\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run} +\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkii} %D \macros %D {showkerning} @@ -3204,7 +3227,7 @@ %D %D \showkerning{Can you guess what kerning is?} -\fetchruntimecommand \showkerning {\f!fontprefix\s!run} +\fetchruntimecommand \showkerning {\f!fontprefix\s!run.mkii} %D \macros %D {showbodyfontenvironment} @@ -3217,7 +3240,7 @@ %D %D \showsetup{showbodyfontenvironment} -\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run} +\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run.mkii} %D \macros %D {showfont,showfontstyle,showligatures} @@ -3233,11 +3256,11 @@ % to be internationalized -\fetchruntimecommand \showfont {\f!fontprefix\s!run} -\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run} -\fetchruntimecommand \showligature {\f!fontprefix\s!run} -\fetchruntimecommand \showligatures {\f!fontprefix\s!run} -\fetchruntimecommand \showcharratio {\f!fontprefix\s!run} +\fetchruntimecommand \showfont {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showligature {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkii} %D \macros %D {getglyph, symbolicfont} @@ -3746,7 +3769,7 @@ \def\dodefinestyleinstance[#1][#2][#3][#4]% [name] [rm|ss|tt|..] [sl|bf|...] [whatever] {\iffirstargument - \doifundefined{#1}{\definestylecollection[#1]}% + \ifcsname#1\endcsname\else\definestylecollection[#1]\fi \fi \iffourthargument \setvalue{\??sx#1:#2:#3}{#4}% @@ -3756,7 +3779,7 @@ \letvalue{\??sx#1::#2}\empty \fi\fi\fi} -\unexpanded\def\styleinstance[#1]% will be faster +\unexpanded\def\styleinstance[#1]% will be made faster {%\begingroup\normalexpanded{\noexpand\infofont[#1:\fontstyle:\fontalternative]}\endgroup \executeifdefined{\??sx#1:\fontstyle:\fontalternative}% {\executeifdefined{\??sx#1:\fontstyle:\s!default}% diff --git a/tex/context/base/font-jap.tex b/tex/context/base/font-jap.mkii index 42480df43..42480df43 100644 --- a/tex/context/base/font-jap.tex +++ b/tex/context/base/font-jap.mkii diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua index 35cfaf32f..c597d4855 100644 --- a/tex/context/base/font-map.lua +++ b/tex/context/base/font-map.lua @@ -6,13 +6,16 @@ if not modules then modules = { } end modules ['font-map'] = { license = "see context related readme files" } -local match, format, find = string.match, string.format, string.find +local match, format, find, concat = string.match, string.format, string.find, table.concat + +local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) local ctxcatcodes = tex.ctxcatcodes --[[ldx-- <p>Eventually this code will disappear because map files are kind of obsolete. Some code may move to runtime or auxiliary modules.</p> +<p>The name to unciode related code will stay of course.</p> --ldx]]-- fonts = fonts or { } @@ -123,3 +126,93 @@ function fonts.map.load_file(filename, entries, encodings) end return entries, encodings end + +function fonts.map.load_lum_table(filename) + local lumname = file.replacesuffix(file.basename(filename),"lum") + local lumfile = resolvers.find_file(lumname,"map") or "" + if lumfile ~= "" and lfs.isfile(lumfile) then + if trace_loading or trace_unimapping then + logs.report("load otf","enhance: loading %s ",lumfile) + end + lumunic = dofile(lumfile) + return lumunic, lumfile + end +end + +local hex = lpeg.R("AF","09") +local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end +local dec = (lpeg.R("09")^1) / tonumber +local period = lpeg.P(".") + +local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true)) +local index = lpeg.P("index") * dec * lpeg.Cc(false) + +local parser = unicode + index + +local parsers = { } + +function fonts.map.make_name_parser(str) + if not str or str == "" then + return parser + else + local p = parsers[str] + if not p then + p = lpeg.P(str) * period * dec * lpeg.Cc(false) + parsers[str] = p + end + return p + end +end + +--~ local parser = fonts.map.make_name_parser("Japan1") +--~ local function test(str) +--~ local b, a = parser:match(str) +--~ print((a and table.serialize(b)) or b) +--~ end +--~ test("uni1234") +--~ test("uni1234.xx") +--~ test("uni12349876") +--~ test("index1234") +--~ test("Japan1.123") + +function fonts.map.tounicode16(unicode) + if unicode < 0x10000 then + return format("%04X",unicode) + else + return format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00) + end +end + +function fonts.map.tounicode16sequence(unicodes) + local t = { } + for l=1,#unicodes do + local unicode = unicodes[l] + if unicode < 0x10000 then + t[l] = format("%04X",unicode) + else + t[l] = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00) + end + end + return concat(t) +end + +--~ This is quite a bit faster but at the cost of some memory but if we +--~ do this we will also use it elsewhere so let's not follow this route +--~ now. I might use this method in the plain variant (no caching there) +--~ but then I need a flag that distinguishes between code branches. +--~ +--~ local cache = { } +--~ +--~ function fonts.map.tounicode16(unicode) +--~ local s = cache[unicode] +--~ if not s then +--~ if unicode < 0x10000 then +--~ s = format("%04X",unicode) +--~ else +--~ s = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00) +--~ end +--~ cache[unicode] = s +--~ end +--~ return s +--~ end + diff --git a/tex/context/base/font-mis.lua b/tex/context/base/font-mis.lua index 520f9e7a6..cc20b9711 100644 --- a/tex/context/base/font-mis.lua +++ b/tex/context/base/font-mis.lua @@ -11,7 +11,7 @@ local lower, strip = string.lower, string.strip fonts.otf = fonts.otf or { } -fonts.otf.version = fonts.otf.version or 2.626 +fonts.otf.version = fonts.otf.version or 2.628 fonts.otf.pack = true fonts.otf.cache = containers.define("fonts", "otf", fonts.otf.version, true) diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 00ac596cc..f3b3f5481 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -12,12 +12,13 @@ local concat, getn, utfbyte = table.concat, table.getn, utf.byte local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip local type, next, tonumber, tostring = type, next, tonumber, tostring -local trace_private = false trackers.register("otf.private", function(v) trace_private = v end) -local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) -local trace_features = false trackers.register("otf.features", function(v) trace_features = v end) -local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end) -local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end) -local trace_math = false trackers.register("otf.math", function(v) trace_math = v end) +local trace_private = false trackers.register("otf.private", function(v) trace_private = v end) +local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) +local trace_features = false trackers.register("otf.features", function(v) trace_features = v end) +local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end) +local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end) +local trace_math = false trackers.register("otf.math", function(v) trace_math = v end) +local trace_unimapping = false trackers.register("otf.unimapping", function(v) trace_unimapping = v end) --~ trackers.enable("otf.loading") @@ -81,7 +82,7 @@ otf.features.default = otf.features.default or { } otf.enhancers = otf.enhancers or { } otf.glists = { "gsub", "gpos" } -otf.version = 2.626 -- beware: also sync font-mis.lua +otf.version = 2.628 -- beware: also sync font-mis.lua otf.pack = true -- beware: also sync font-mis.lua otf.syncspace = true otf.notdef = false @@ -464,15 +465,18 @@ otf.enhancers["analyse marks"] = function(data,filename) end end -local other = lpeg.C((1 - lpeg.S("_."))^0) -local ligsplitter = lpeg.Ct(other * (lpeg.P("_") * other)^0) +local separator = lpeg.S("_.") +local other = lpeg.C((1 - separator)^1) +local ligsplitter = lpeg.Ct(other * (separator * other)^0) ---~ print(splitter:match("this")) ---~ print(splitter:match("this.that")) ---~ print(splitter:match("such_so_more")) ---~ print(splitter:match("such_so_more.that")) +--~ print(table.serialize(ligsplitter:match("this"))) +--~ print(table.serialize(ligsplitter:match("this.that"))) +--~ print(table.serialize(ligsplitter:match("japan1.123"))) +--~ print(table.serialize(ligsplitter:match("such_so_more"))) +--~ print(table.serialize(ligsplitter:match("such_so_more.that"))) otf.enhancers["analyse unicodes"] = function(data,filename) + local tounicode16, tounicode16sequence = fonts.map.tounicode16, fonts.map.tounicode16sequence local unicodes = data.luatex.unicodes -- we need to move this code unicodes['space'] = unicodes['space'] or 32 -- handly later on @@ -482,53 +486,113 @@ otf.enhancers["analyse unicodes"] = function(data,filename) -- the tounicode mapping is sparse and only needed for alternatives local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?")) data.luatex.tounicode, data.luatex.originals = tounicode, originals + local lumunic, uparser, oparser + if false then -- will become an option + lumunic = fonts.map.load_lum_table(filename) + lumunic = lumunic and lumunic.tounicode + end + local cidinfo, cidnames, cidcodes = data.cidinfo + local usedmap = cidinfo and cidinfo.usedname + usedmap = usedmap and fonts.cid.map[usedmap] + if usedmap then + oparser = usedmap and fonts.map.make_name_parser(cidinfo.ordering) + cidnames = usedmap.names + cidcodes = usedmap.unicodes + end + uparser = fonts.map.make_name_parser() for index, glyph in next, data.glyphs do local name, unic = glyph.name, glyph.unicode or -1 -- play safe if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then - -- a.whatever or a_b_c.whatever or a_b_c - local split = ligsplitter:match(name) - if #split == 0 then - -- skip - elseif #split == 1 then - local u = unicodes[split[1]] - if u then - if type(u) == "table" then - u = u[1] - end - if u < 0x10000 then - originals[index], tounicode[index] = u, format("%04X",u) - else - originals[index], tounicode[index] = u, format("%04X%04X",u/1024+0xD800,u%1024+0xDC00) + local unicode = lumunic and lumunic[name] + if unicode then + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + end + -- cidmap heuristics, beware, there is no guarantee for a match unless + -- the chain resolves + if not unicode and usedmap then + local foundindex = oparser:match(name) + if foundindex then + unicode = cidcodes[foundindex] -- name to number + if not unicode then + local reference = cidnames[foundindex] -- number to name + if reference then + local foundindex = oparser:match(reference) + if foundindex then + unicode = cidcodes[foundindex] + if unicode then + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + end + end + if not unicode then + local foundcodes, multiple = uparser:match(reference) + if foundcodes then + if multiple then + originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true + else + originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes + end + end + end + end end - ns = ns + 1 - else - originals[index], tounicode[index] = 0xFFFD, "FFFD" end - else - local as = { } - for l=1,#split do - local u = unicodes[split[l]] - if not u then - as[l], split[l] = 0xFFFD, "FFFD" - else - if type(u) == "table" then - u = u[1] + end + -- a.whatever or a_b_c.whatever or a_b_c (no numbers) + if not unicode then + local split = ligsplitter:match(name) + local nplit = (split and #split) or 0 + if nplit == 0 then + -- skip + elseif nplit == 1 then + unicode = unicodes[split[1]] + if unicode then + if type(unicode) == "table" then + unicode = unicode[1] end - if u < 0x10000 then - as[l], split[l] = u, format("%04X",u) + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + end + else + local done = true + for l=1,nplit do + local u = unicodes[split[l]] + if not u then + done = false + break + elseif type(u) == "table" then + split[l] = u[1] else - as[l], split[l] = u, format("%04X%04X",u/1024+0xD800,u%1024+0xDC00) + split[l] = u end end + if done then + originals[index], tounicode[index], nl, unicode = split, tounicode16sequence(split), nl + 1, true + end end - split = concat(split) - if split ~= "" then - originals[index], tounicode[index] = as, split - nl = nl + 1 - else - originals[index], tounicode[index] = 0xFFFD, "FFFD" + end + -- last resort + if not unicode then + local foundcodes, multiple = uparser:match(name) + if foundcodes then + if multiple then + originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true + else + originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes + end end end + if not unicode then + originals[index], tounicode[index] = 0xFFFD, "FFFD" + end + end + end + if trace_unimapping then + for index, glyph in table.sortedpairs(data.glyphs) do + local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe + if toun then + logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun) + else + logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic) + end end end if trace_loading and (ns > 0 or nl > 0) then @@ -546,16 +610,14 @@ otf.enhancers["analyse subtables"] = function(data,filename) for _, g in next, { data.gsub, data.gpos } do for k=1,#g do local gk = g[k] - -local typ = gk.type -if typ == "gsub_contextchain" or typ == "gpos_contextchain" then - gk.chain = 1 -elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then - gk.chain = -1 -else - gk.chain = 0 -end - + local typ = gk.type + if typ == "gsub_contextchain" or typ == "gpos_contextchain" then + gk.chain = 1 + elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then + gk.chain = -1 + else + gk.chain = 0 + end local features = gk.features if features then sequences[#sequences+1] = gk @@ -610,8 +672,9 @@ otf.enhancers["merge cid fonts"] = function(data,filename) local cidinfo = data.cidinfo local verbose = fonts.verbose if cidinfo.registry then - local cidmap = fonts.cid.getmap and fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement) + local cidmap, cidname = fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement) if cidmap then + cidinfo.usedname = cidmap.usedname local glyphs, uni_to_int, int_to_uni, nofnames, nofunicodes = { }, { }, { }, 0, 0 local unicodes, names = cidmap.unicodes, cidmap.names for n, subfont in next, data.subfonts do @@ -1343,7 +1406,7 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th } -- indices maps from unicodes to indices for u, i in next, indices do - characters[u] = { } -- we need this because for instance we add protruding info + characters[u] = { } -- we need this because for instance we add protruding info and loop over characters descriptions[u] = glyphs[i] end -- math diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua index 719c0ca80..3c11b84f1 100644 --- a/tex/context/base/font-otn.lua +++ b/tex/context/base/font-otn.lua @@ -150,7 +150,7 @@ trackers.register("*otf.sample","otf.steps,otf.actions,otf.analyzing") local insert_node_after = node.insert_after local delete_node = nodes.delete local copy_node = node.copy -local slide_node_list = node.slide +local find_node_tail = node.tail or node.slide local set_attribute = node.set_attribute local has_attribute = node.has_attribute @@ -1905,7 +1905,7 @@ function fonts.methods.node.otf.features(head,font,attr) local handler = handlers[typ] local thecache = featuredata[typ] or { } -- we need to get rid of this slide ! - start = slide_node_list(head) -- slow (we can store tail because there's always a skip at the end): todo + start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo while start do local id = start.id if id == glyph then diff --git a/tex/context/base/font-run.tex b/tex/context/base/font-run.mkii index 0a0ddd057..0a0ddd057 100644 --- a/tex/context/base/font-run.tex +++ b/tex/context/base/font-run.mkii diff --git a/tex/context/base/font-run.mkiv b/tex/context/base/font-run.mkiv new file mode 100644 index 000000000..5dd8d6086 --- /dev/null +++ b/tex/context/base/font-run.mkiv @@ -0,0 +1,326 @@ +%D \module +%D [ file=font-run, +%D version=1998.09.11, % (second) +%D version=2001.02.20, % (third) +%D title=\CONTEXT\ Font Macros, +%D subtitle=Runtime Macros, +%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 code is hooked into the core macros and saves some +%D format space.] + +\unprotect + +\gdef\@@onlyenglish#1% + {\blank{\tttf \type {#1} is only available in the english interface}\blank} + +\gdef\dosetshowfonttitle#1% + {\tabskip\zeropoint + \parindent\zeropoint + \setlocalhsize + \doifelsenothing{#1} + {\def\title{[\the\bodyfontsize]}} + {\switchtobodyfont[#1]\def\title{[#1]}} + \doifsomething\fontclass + {\doifnot{[\fontclass]}\title + {\edef\title{[\fontclass]\space\title}}}} + +\gdef\showbodyfont + {\dosingleempty\doshowbodyfont} + +\gdef\doshowbodyfont[#1]% + {\ifinsidefloat\else\startbaselinecorrection\fi + \vbox + {\dosetshowfonttitle{#1}% + \def\bigstrut##1##2% + {\hbox{\vrule + \!!height##1\strutht + \!!depth ##2\strutdp + \!!width \zeropoint}} + \def\next##1##2##3% + {&&##1&&##2\tf##3&&##2\sc##3% + &&##2\sl##3&&##2\it##3&&##2\bf##3&&##2\bs##3&&##2\bi##3% + &&##2\tfx##3&&##2\tfxx##3% + &&##2\tfa##3&&##2\tfb##3&&##2\tfc##3&&##2\tfd##3&\cr}% + \halign to \localhsize + {\bigstrut{1.5}{2}##&\vrule## + \tabskip=\!!zeropoint \!!plus 1fill + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule + \tabskip=\!!zeropoint\cr + \noalign{\hrule} + &\multispan{29}{\vrule\hfil\tttf\strut\title\hfil + \llap{\string\mr\hbox to 1em{\hss:\hss}$\mr \languageparameter\c!text$\quad}\vrule}\cr + \noalign{\hrule}\next{}{\tt\string}{} + \noalign{\hrule}\next{\tt\string\rm}\rm{\languageparameter\c!text} + \noalign{\hrule}\next{\tt\string\ss}\ss{\languageparameter\c!text} + \noalign{\hrule}\next{\tt\string\tt}\tt{\languageparameter\c!text} + \noalign{\hrule}}} + \ifinsidefloat\else\stopbaselinecorrection\fi} + +\gdef\showbodyfontenvironment + {\dosingleempty\doshowbodyfontenvironment} + +\gdef\doshowbodyfontenvironment[#1]% + {\ifinsidefloat\else\startbaselinecorrection\fi + \vbox + {\dosetshowfonttitle{#1}% + \def\next##1% + {&&\getvalue{\bodyfontvariable{##1\s!text}}% + &&\getvalue{\bodyfontvariable{##1\s!script}}% + &&\getvalue{\bodyfontvariable{##1\s!scriptscript}}% + &&\getvalue{\bodyfontvariable{##1\c!x}}% + &&\getvalue{\bodyfontvariable{##1\c!xx}}% + &&\getvalue{\bodyfontvariable{##1\interfaced\v!small}}% + &&\getvalue{\bodyfontvariable{##1\interfaced\v!big}}% + &&\edef\next{\getvalue{\bodyfontvariable{##1\c!interlinespace}}}\ifx\next\empty not set\else\next\fi&\cr + \noalign{\hrule}} + \halign to \localhsize + {##&\vrule##\strut + \tabskip=\!!zeropoint \!!plus 1fill + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## + &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule + \tabskip\zeropoint\cr + \noalign{\hrule} + &\multispan{17}{\vrule\hfil\tttf\strut\title\hfil}\vrule\cr + \noalign{\hrule} + &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript + &&\tttf\tx\c!x&&\tttf\tx\c!xx&&\tttf\tx\v!small&&\tttf\tx\v!big + &&\tttf\tx\c!interlinespace&\cr + \noalign{\hrule} + \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}} + \ifinsidefloat\else\stopbaselinecorrection\fi} + +\gdef\showfont + {\dodoubleempty\doshowfont} + +\gdef\doshowfont[#1][#2]% + {\bgroup + \boxrulewidth=.1pt + \setupcolors[\c!state=\v!local]% + \iffirstargument + \definefont[\s!dummy][#1]\dummy + \else\ifdim2.5em>.05\hsize \tx + \ifdim2.5em>.05\hsize \txx + \fi\fi\fi + \ifinsidefloat\else\startbaselinecorrection\fi + \vbox\bgroup + \forgetall + \startoverlay + {\vbox + {\tf \setstrut \dummy + \offinterlineskip + \dostepwiserecurse{0}{15}{1} + {\let\row\recurselevel + \hbox + {\red + \dostepwiserecurse{0}{15}{1} + {\let\col\recurselevel + \@EA\scratchcounter\normaldblquote\hexnumber\row\hexnumber\col\relax + \edef\rowcol{\the\scratchcounter}% + \iffontchar\font\scratchcounter + \setbox\scratchbox\ruledhbox{\black\char\scratchcounter}% + \ifdim\wd\scratchbox>\zeropoint + \donetrue \else \donefalse + \fi + \else + \setbox\scratchbox\hbox{\gray\vrule\!!width1ex\!!height.5ex\!!depth.5ex}% + \fi + \startoverlay + {\tf\vbox to 2.5em + {\vss + \hbox to 2.5em + {\dummy\ifdim\interwordspace=\zeropoint + \setbox\scratchbox\hbox + {\raise.5\dp\scratchbox\hbox + {\lower.5\ht\scratchbox\copy\scratchbox}}% + \ht\scratchbox\zeropoint + \dp\scratchbox\zeropoint + \else + \ht\scratchbox\strutht + \dp\scratchbox\strutdp + \strut + \fi + \hss\copy\scratchbox\hss} + \vss}} + {\tf\vbox to 2.3em + {\ifdone + \hsize2.4em + \blue + \edef\theshowfontspecs + {\ifnum\hyphenchar\font=\rowcol hyph\else + \ifnum\skewchar \font=\rowcol skew\fi\fi}% + \tinyfont % after \edef, else wrong font analyzed + \doifnot\v!unknown{#2}{{\red\theshowfontspecs}}\hfill\number\rowcol + \vfill + \octnumber\rowcol\hfill\lchexnumbers\rowcol + \par + \fi}} + \stopoverlay}}} + \par}} + {\tf\basegrid[\c!nx=16,\c!ny=16,\c!dx=2.5,\c!dy=2.5,\c!unit=em]} + \stopoverlay + \nointerlineskip + \vskip2pt + % the \noexpand before \blank is needed for non etex + \edef\ascii{name: {\noexpand\black\fontname\font}} + \def\do##1##2{\ifx##1\undefined\else\ifx##1\empty\else##2\fi\fi}% + \doifelse\v!unknown{#2} + {\edef\theshowfontspecs + {name: {\noexpand\black\fontname\font}}} + {\edef\theshowfontspecs + {name: {\noexpand\black\fontname\font}\noexpand\quad + \do\currentencoding{encoding: {\noexpand\black\currentencoding\noexpand\quad}}% + \do\currentmapping {mapping: {\noexpand\black\currentmapping \noexpand\quad}}% + \do\fonthandling {handling: {\noexpand\black\fonthandling }}}}% + \tf % also sets em + \hbox to 40em{\blue\hfill\tinyfont\setstrut\strut\theshowfontspecs} + \egroup + \ifinsidefloat\else\stopbaselinecorrection\fi + \egroup} + +\gdef\showfontstyle + {\dotripleempty\doshowfontstyle} + +\gdef\doshowfontstyle[#1][#2][#3]% + {\ifthirdargument + \bgroup + \raggedright + \switchtobodyfont[#1] + \def\dodocommand##1##2% + {\starttextrule{\tttf #1 ##1 ##2} + \nobreak \getvalue{##2}% + \dorecurse{255} + {\iffontchar\font\recurselevel\relax + \char\recurselevel\relax\space + \fi} + \par \nobreak + \stoptextrule} + \def\docommand##1% + {\getvalue{##1}\processcommacommand[#3]{\dodocommand{##1}}} + \processcommalist[#2]\docommand + \egroup + \else\ifsecondargument + \showfontstyle[#1][#2][\fontalternativelist]% math is gone + \else + \showfontstyle[#1][\c!rm]\showfontstyle[#1][\c!ss] + \showfontstyle[#1][\c!tt]\showfontstyle[#1][\c!mm] + \fi\fi} + +\gdef\showligature#1% + {\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}} + +\gdef\showligatures[#1]% + {\ifx\starttabulate\undefined + \@@onlyenglish\showligatures + \else + \bgroup + \setupcolors[\c!state=\v!local]% + \def\show##1{\hbox{\red\ruledhbox{\black##1}}}% + \definefont[\s!dummy][#1]\dummy + \starttabulate[|*{9}{c|}] + \NC\type{ff}\NC\type{fi}\NC\type{fl}\NC\type{ffi}\NC\type{ffl}\NC + \type{``}\NC\type{''}\NC\type{--}\NC\type{---}\NC\NR + \NC\show{ff}\NC\show{fi}\NC\show{fl}\NC\show{ffi}\NC\show{ffl}\NC + \show{``}\NC\show{''}\NC\show{--}\NC\show{---}\NC\NR + \stoptabulate + \egroup + \fi} + +\gdef\showfontstrip + {\dosingleempty\doshowfontstrip} + +\gdef\doshowfontstrip[#1]% + {\ifx\starttabulate\undefined + \@@onlyenglish\showfontstrip + \else + \bgroup + \def\dofontstripa##1##2% + {\tttf\string##1} + \def\dofontstripb##1##2% + {\ruledhbox{\switchtobodyfont[#1]##1{##2}}} + \def\dofontstripc##1##2% + {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}% + \tt\tfx\the\ht\scratchbox}% + \def\dofontstripd##1##2% + {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}% + \tt\tfx\the\wd\scratchbox}% + \def\fontstrip##1##2##3% + {\NC##2\rm{##3}\NC + ##2\ss{##3}\NC + ##2\tt{##3}\NC + ##2\mathematics{##3}\NC + \tttf##1\NR} + \starttabulate[|c|c|c|c|c|] + \fontstrip\relax\dofontstripa\empty + \TB + \fontstrip\relax\dofontstripb{xxxx} + \fontstrip\relax\dofontstripb{12345} + \fontstrip\relax\dofontstripb{(Agw)} + \TB + \fontstrip{(x height)}\dofontstripc{x} + \fontstrip{(m width)}\dofontstripd{m} + \stoptabulate + \egroup + \fi} + +\ifx\databox\undefined \newbox\databox \fi + +\gdef\testminimalbaseline#1% + {\setbox\databox\ruledhbox{#1}% + \scratchdimen\ht\databox + \advance\scratchdimen\dp\databox + \scratchtoks{#1}% + \expanded + {\NC \ruledhbox{\the\scratchtoks} + \noexpand \NC -> + \noexpand \NC \the\scratchdimen + \noexpand \NC = + \noexpand \NC \the\ht\databox + \noexpand \NC + + \noexpand \NC \the\dp\databox + \noexpand \NC \ifdim\scratchdimen<\baselineskip < + \else\ifdim\scratchdimen=\baselineskip = + \else > \fi\fi + \noexpand \NC \the\baselineskip + \noexpand \NC (\ifdim\scratchdimen>\baselineskip not \fi ok) + \noexpand \NC \noexpand \NR }} + +\gdef\showminimalbaseline + {\ifx\starttabulate\undefined + \@@onlyenglish\showminimalbaseline + \else + \starttabulate[||T|T|T|T|T|T|T|T|T|] + \testminimalbaseline{\hbox to 1em{\hss\showstruts\strut\hss}}% + \testminimalbaseline{(/)}% + \testminimalbaseline{$\frac{1}{2}x^2_3$} + \stoptabulate + \fi} + +\gdef\showkerning#1% + {\bgroup + \let\MPfshowcommand\ruledhbox + \setMPtext\s!dummy{#1}% + \startMPcode draw textext(\MPstring\s!dummy);\stopMPcode + \egroup} + +\gdef\showcharratio + {\dowithnextboxcontent + {\switchtobodyfont[10pt]}% + {(\expanded{\withoutpt\the\nextboxht},% + \expanded{\withoutpt\the\nextboxdp})}% + \hbox} + +\protect \endinput diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua index 472f69c8c..8b799df5a 100644 --- a/tex/context/base/font-tfm.lua +++ b/tex/context/base/font-tfm.lua @@ -245,7 +245,7 @@ function tfm.do_scale(tfmtable, scaledpoints) end -- status local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized - local hasmath = tfmtable.math_parameters ~= nil or tfmtable.MathConstants ~= nil + local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= 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 @@ -293,6 +293,7 @@ function tfm.do_scale(tfmtable, scaledpoints) local scaledheight = defaultheight * delta local scaleddepth = defaultdepth * delta local stackmath = tfmtable.ignore_stack_math ~= true +local private = fonts.private for k,v in next, characters do local chr, description, index if ischanged then @@ -355,7 +356,7 @@ function tfm.do_scale(tfmtable, scaledpoints) -- logs.report("define font","t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-') -- end if tounicode then - local tu = tounicode[index] + local tu = tounicode[index] -- nb: index! if tu then chr.tounicode = tu end @@ -528,6 +529,7 @@ function tfm.do_scale(tfmtable, scaledpoints) end -- needed for \high cum suis local tpx = tp.x_height +if hasmath then if not tp[13] then tp[13] = .86*tpx end -- mathsupdisplay if not tp[14] then tp[14] = .86*tpx end -- mathsupnormal if not tp[15] then tp[15] = .86*tpx end -- mathsupcramped @@ -535,11 +537,22 @@ function tfm.do_scale(tfmtable, scaledpoints) if not tp[17] then tp[17] = .48*tpx end -- mathsubcombined if not tp[22] then tp[22] = 0 end -- mathaxisheight if t.MathConstants then t.MathConstants.AccentBaseHeight = nil end -- safeguard +end t.tounicode = 1 t.cidinfo = tfmtable.cidinfo -- we have t.name=metricfile and t.fullname=RealName and t.filename=diskfilename -- when collapsing fonts, luatex looks as both t.name and t.fullname as ttc files -- can have multiple subfonts + if hasmath then + if trace_defining then + logs.report("define font","math enabled for: %s %s %s",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename") + end + else + if trace_defining then + logs.report("define font","math disabled for: %s %s %s",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename") + end + t.nomath, t.MathConstants = true, nil + end return t, delta end @@ -714,7 +727,7 @@ function tfm.set_features(tfmdata) local value = features[f] if value and fi.tfm[f] then -- brr if tfm.trace_features then - logs.report("define tfm","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown') + logs.report("define font","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown') end fi.tfm[f](tfmdata,value) mode = tfmdata.mode or fonts.mode diff --git a/tex/context/base/font-uni.mkii b/tex/context/base/font-uni.mkii index 1b8ce8e43..02ab6ce2c 100644 --- a/tex/context/base/font-uni.mkii +++ b/tex/context/base/font-uni.mkii @@ -19,7 +19,7 @@ \ifnum\texengine=\xetexengine \unexpanded\def\uchar#1#2{\char\numexpr#2+#1*\pluscclvi\relax} \let\uc\uchar - \endinput + \expandafter \endinput \fi %D Now comes the more traditional 8 bit \TEX\ hackery. diff --git a/tex/context/base/font-xtx.tex b/tex/context/base/font-xtx.mkii index 5f4b85879..5f4b85879 100644 --- a/tex/context/base/font-xtx.tex +++ b/tex/context/base/font-xtx.mkii diff --git a/tex/context/base/grph-fig.mkiv b/tex/context/base/grph-fig.mkiv index 61f78f09e..415a2aa76 100644 --- a/tex/context/base/grph-fig.mkiv +++ b/tex/context/base/grph-fig.mkiv @@ -43,8 +43,7 @@ {\bgroup \pushmacro\textunderscore \edef\textunderscore{\string_}% brrr, temp hack, still needed? - \calculateexternalfigure [][#1][#2][#3][#4][#5]% [] is dummy dwcomp - \calculateexternalscreenfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp + \calculateexternalfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp \popmacro\textunderscore \box\foundexternalfigure \egroup} @@ -56,14 +55,16 @@ [\??ef] [\c!width=\figurewidth, \c!height=\figureheight, - \c!background=\v!screen, - \c!backgroundscreen=.8, + \c!background=\v!color, + \c!backgroundcolor=missingfigurecolor, \c!frame=\@@efframe]}% {\tt\tfxx \nohyphens name: \expanded{\verbatimstring{#1}}\\% file: \expanded{\verbatimstring{#2}}\\% state: \expanded{\verbatimstring{#3}}}} +\definecolor[missingfigurecolor][s=.8] + \def\externalfigureplaceholder#1#2#3% {\localframed [\??ef] @@ -186,89 +187,91 @@ %D Still undocumented! No one uses it I think, better be done with layers. -\newcount\efreference -\newdimen\efxsteps -\newdimen\efysteps - -\def\calculateefsteps - {\ifnum0\@@exxmax=\zerocount - \ifnum0\@@exymax=\zerocount - \def\@@exymax{24}% - \fi - \efysteps\figureheight \divide\efysteps \@@exymax - \efxsteps\efysteps - \dimen0=\figurewidth - \advance\dimen0 \efysteps - \divide \dimen0 \efysteps - \edef\@@exxmax{\number\dimen0}% - \else - \efxsteps\figurewidth \divide\efxsteps \@@exxmax - \efysteps\figureheight \divide\efysteps \@@exymax - \fi} - -\def\efcomment#1(#2,#3)#4(#5,#6)% {kader}(x,y)(h,b)[...]{tekst} - {\def\complexefdocomment[##1]##2% - {\position(#2,#3)% - {\setnostrut - \framed - [\c!width=#5\efxsteps, - \c!height=#6\exysteps, - \c!offset=\v!none, - \c!frame=#1, - ##1]% - {##2}}}% - \complexorsimpleempty\efdocomment} - -\def\efnocomment(#1,#2)#3(#4,#5)% (x,y)(h,b)[...]{tekst} - {\def\complexefdonocomment[##1]##2{}% - \complexorsimpleempty\efdonocomment} - -\def\efdomarker(#1,#2)#3#4% (h,b){kader}{tekst} - {\framed - [\c!width=#1\efxsteps, - \c!height=#2\efysteps, - \c!offset=\v!none, - \c!frame=#3]% - {#4}} - -\def\effigure#1% - {\position(0,0){\getvalue{#1}}} - -\def\efdoarea(#1,#2)#3#4% (h,b){kader}{tekst} - {\bgroup - \setnostrut - \framed - [\c!width=#1\efxsteps, - \c!height=#2\efysteps, - \c!offset=\!!zeropoint, - \c!frame=#3] - {#4}% - \egroup} - -\def\efgoto(#1,#2)#3[#4]% (h,b)kader[ref] - {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}% - \gotobox{\copy0}[#4]} - -\def\efmark(#1,#2)#3(#4,#5)#6[#7]% - {\advance\efreference \plusone - \position(#1,#2) - {\hbox{\the\efreference}}% - \position(#1,#2) - {\gotosomeinternal\s!vwb{#7}\realfolio - {\efdomarker(#4,#5)\v!on{\thisissomeinternal\s!vwa{#7}}}}} - -\def\eftext#1(#2,#3)#4(#5,#6)#7[#8]% - {\advance\efreference \plusone - \hbox - {\quad - \thisissomeinternal\s!vwb{#8}% - \gotosomeinternal \s!vwa{#8}\realfolio - {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}% - \quad#1 (#2,#3) (#5,#6) [#8]\hfill}% - \endgraf} - -\def\efthisis(#1,#2)#3[#4]% - {\efdoarea(#1,#2){#3}{\pagereference[#4]}} +% when there is need for this i'll reimplement it +% +% \newcount\efreference +% \newdimen\efxsteps +% \newdimen\efysteps +% +% \def\calculateefsteps +% {\ifnum0\@@exxmax=\zerocount +% \ifnum0\@@exymax=\zerocount +% \def\@@exymax{24}% +% \fi +% \efysteps\figureheight \divide\efysteps \@@exymax +% \efxsteps\efysteps +% \dimen0=\figurewidth +% \advance\dimen0 \efysteps +% \divide \dimen0 \efysteps +% \edef\@@exxmax{\number\dimen0}% +% \else +% \efxsteps\figurewidth \divide\efxsteps \@@exxmax +% \efysteps\figureheight \divide\efysteps \@@exymax +% \fi} +% +% \def\efcomment#1(#2,#3)#4(#5,#6)% {kader}(x,y)(h,b)[...]{tekst} +% {\def\complexefdocomment[##1]##2% +% {\position(#2,#3)% +% {\setnostrut +% \framed +% [\c!width=#5\efxsteps, +% \c!height=#6\exysteps, +% \c!offset=\v!none, +% \c!frame=#1, +% ##1]% +% {##2}}}% +% \complexorsimpleempty\efdocomment} +% +% \def\efnocomment(#1,#2)#3(#4,#5)% (x,y)(h,b)[...]{tekst} +% {\def\complexefdonocomment[##1]##2{}% +% \complexorsimpleempty\efdonocomment} +% +% \def\efdomarker(#1,#2)#3#4% (h,b){kader}{tekst} +% {\framed +% [\c!width=#1\efxsteps, +% \c!height=#2\efysteps, +% \c!offset=\v!none, +% \c!frame=#3]% +% {#4}} +% +% \def\effigure#1% +% {\position(0,0){\getvalue{#1}}} +% +% \def\efdoarea(#1,#2)#3#4% (h,b){kader}{tekst} +% {\bgroup +% \setnostrut +% \framed +% [\c!width=#1\efxsteps, +% \c!height=#2\efysteps, +% \c!offset=\!!zeropoint, +% \c!frame=#3] +% {#4}% +% \egroup} +% +% \def\efgoto(#1,#2)#3[#4]% (h,b)kader[ref] +% {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}% +% \gotobox{\copy0}[#4]} +% +% \def\efmark(#1,#2)#3(#4,#5)#6[#7]% +% {\advance\efreference \plusone +% \position(#1,#2) +% {\hbox{\the\efreference}}% +% \position(#1,#2) +% {\gotosomeinternal\s!vwb{#7}\realfolio +% {\efdomarker(#4,#5)\v!on{\thisissomeinternal\s!vwa{#7}}}}} +% +% \def\eftext#1(#2,#3)#4(#5,#6)#7[#8]% +% {\advance\efreference \plusone +% \hbox +% {\quad +% \thisissomeinternal\s!vwb{#8}% +% \gotosomeinternal \s!vwa{#8}\realfolio +% {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}% +% \quad#1 (#2,#3) (#5,#6) [#8]\hfill}% +% \endgraf} +% +% \def\efthisis(#1,#2)#3[#4]% +% {\efdoarea(#1,#2){#3}{\pagereference[#4]}} \newbox\colorbarbox @@ -402,41 +405,6 @@ \def\startfigure {\grabuntil{\e!stop\v!figure}\dostartfigure} -%D defining sound tracks: -%D -%D \starttyping -%D \useexternalsoundtrack[label][file] -%D \stoptyping -%D -%D associated actions: StartSound StopSound PauseSound ResumeSound -%D -%D Todo: like external figures, also search on path, -%D although, they need to be present ar viewing time, so ... - -\def\useexternalsoundtrack - {\dodoubleargument\douseexternalsoundtrack} - -\def\douseexternalsoundtrack[#1][#2]% - {\setgvalue{\??sd:#1}{#2}} - -\def\checksoundtrack#1% - {\iflocation - \doifdefined{\??sd:#1}{\doifvaluesomething{\??sd:#1} - {\doinsertsoundtrack{\getvalue{\??sd:#1}}{#1}\@@sdoption - % brr, \..empty not really needed and maybe even wrong; - % also, not here but in driver - % well, no: sounds need to be reinitialize each time (i.e., be on page), so no - }}% \letgvalueempty{\??sd:#1}}}% - \fi} - -\setexecutecommandcheck {startsound} \checksoundtrack - -\def\setupexternalsoundtracks - {\dodoubleargument\getparameters[\??sd]} - -\setupexternalsoundtracks - [\c!option=] - %D NEW: used in styledesign manual % \setbuffer[typeset-b]\endbuffer diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua index 5b3bff36c..3dfcee739 100644 --- a/tex/context/base/grph-inc.lua +++ b/tex/context/base/grph-inc.lua @@ -36,6 +36,7 @@ run TeX code from within Lua. Some more functionality will move to Lua. local texsprint, format, lower, find, match = tex.sprint, string.format, string.lower, string.find, string.match local ctxcatcodes = tex.ctxcatcodes +local variables = interfaces.variables local trace_figures = false trackers.register("figures.locating",function(v) trace_figures = v end) @@ -107,16 +108,16 @@ figures.order = { } figures.formats = { - ["pdf"] = { }, - ["mps"] = { patterns = { "%d+" } }, + ["pdf"] = { list = { "pdf" } }, + ["mps"] = { patterns = { "mps", "%d+" } }, ["jpg"] = { list = { "jpg", "jpeg" } }, - ["png"] = { } , + ["png"] = { list = { "png" } }, ["jbig"] = { list = { "jbig", "jbig2", "jb2" } }, ["svg"] = { list = { "svg", "svgz" } }, ["eps"] = { list = { "eps", "ai" } }, ["mov"] = { list = { "mov", "avi" } }, ["buffer"] = { list = { "tmp", "buffer", "buf" } }, - ["tex"] = { }, + ["tex"] = { list = { "tex" } }, } function figures.setlookups() @@ -142,16 +143,19 @@ end figures.setlookups() local function register(tag,target,what) - local data = figures.formats[target] - if data then - local d = data[tag] - if d and not table.contains(d,what) then - d[#d+1] = what - else - data[tag] = { what } - end + local data = figures.formats[target] -- resolver etc + if not data then + data = { } + figures.formats[target] = data + end + local d = data[tag] -- list or pattern + if d and not table.contains(d,what) then + d[#d+1] = what -- suffix or patternspec else - figures.formats[target] = { } + data[tag] = { what } + end + if not table.contains(figures.order,target) then + figures.order[#figures.order+1] = target end figures.setlookups() end @@ -208,7 +212,7 @@ end --~ end function figures.hash(data) - return tostring(data.status.private) -- the <img object> + return data.status.hash or tostring(data.status.private) -- the <img object> -- return data.status.fullname .. "+".. (data.status.page or data.request.page or 1) -- img is still not perfect end @@ -267,9 +271,9 @@ do --~ local w, h = tonumber(request.width), tonumber(request.height) request.page = math.max(tonumber(request.page) or 1,1) request.size = img.check_size(request.size) - request.object = iv[request.object] == "yes" - request["repeat"] = iv[request["repeat"]] == "yes" - request.preview = iv[request.preview] == "yes" + request.object = iv[request.object] == variables.yes + request["repeat"] = iv[request["repeat"]] == variables.yes + request.preview = iv[request.preview] == variables.yes request.cache = request.cache ~= "" and request.cache request.prefix = request.prefix ~= "" and request.prefix request.format = request.format ~= "" and request.format @@ -603,12 +607,15 @@ function figures.existers.generic(askedname) end function figures.checkers.generic(data) local dr, du, ds = data.request, data.used, data.status - local name, page, size = du.fullname or "unknown generic", du.page or dr.page, dr.size or "crop" - local hash = name .. "->" .. page .. "->" .. size + local name, page, size, color = du.fullname or "unknown generic", du.page or dr.page, dr.size or "crop", dr.color or "natural" + local hash = name .. "->" .. page .. "->" .. size .. "->" .. color local figure = figures.loaded[hash] if figure == nil then figure = img.new { filename = name, page = page, pagebox = dr.size } + backends.codeinjections.setfigurecolorspace(data,figure) figure = (figure and img.scan(figure)) or false + local f, d = backends.codeinjections.setfigurealternative(data,figure) + figure, data = f or figure, d or data figures.loaded[hash] = figure end if figure then @@ -616,6 +623,7 @@ function figures.checkers.generic(data) du.height = figure.height du.pages = figure.pages ds.private = figure + ds.hash = hash end return data end @@ -629,7 +637,6 @@ function figures.includers.generic(data) if figure == nil then figure = ds.private if figure then ---~ figure.page = dr.page or '1' figure = img.copy(figure) figure = (figure and img.clone(figure,data.request)) or false end diff --git a/tex/context/base/grph-inc.mkii b/tex/context/base/grph-inc.mkii index 231ce902e..acb5ae7e9 100644 --- a/tex/context/base/grph-inc.mkii +++ b/tex/context/base/grph-inc.mkii @@ -1212,4 +1212,28 @@ \setanalyzedfiguredimensions\plustwo \fi} +%D This is \MKII\ only and comes from cont-new (maybe used in a project). + +% maybe to be integrated (option=...) + +\def\directexternalfigure + {\dodoubleempty\dodirectexternalfigure} + +\def\dodirectexternalfigure[#1][#2]% + {\bgroup + \getparameters[\??ef][\c!type=\splitofftype,\c!page=1,#2]% + \sanitizefilename#1\to\expandedfigurename + \splitfilename\expandedfigurename + \let\@@DriverImageWidth \!!zeropoint + \let\@@DriverImageHeight \!!zeropoint + \let\@@DriverImageFile \splitofffull + \let\@@DriverImageType \@@eftype + \let\@@DriverImageMethod \@@eftype + \let\@@DriverImageLabel \empty + \let\@@DriverImagePage \@@efpage + \doinsertfile + \egroup} + +% \directexternalfigure[cow.pdf] + \protect \endinput diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv index 96ea2d74a..d5151c521 100644 --- a/tex/context/base/grph-inc.mkiv +++ b/tex/context/base/grph-inc.mkiv @@ -21,6 +21,7 @@ %D - a few more obscure things \registerctxluafile{grph-inc}{1.001} +\registerctxluafile{grph-u3d}{1.001} % this will change \unprotect @@ -198,12 +199,7 @@ % a transparent color is used \doifsomething\@@efforegroundcolor {\def\@@efbackground{\v!foreground,\v!color}% - \def\@@efbackgroundcolor{\@@efforegroundcolor}}% - \doifsomething\@@efcolor - {\doifcolorelse\@@efcolor - {\checkpredefinedcolor[\@@efcolor]% - \doregisterfigurecolor\@@efcolor}}% - \donothing} + \def\@@efbackgroundcolor{\@@efforegroundcolor}}} \appendtoks \checkfigureusersettings @@ -237,6 +233,9 @@ \resetfigurevariables \dosetefparameters{#4}{#5}{#6}% \checkfigurevariables +% \begingroup +% \color[\@@efcolor]{\xdef\globcolorattr{\internalspotcolorname}} +% \endgroup \ctxlua{figures.push { name="#3", label="#2", % todo: \@eflabel @@ -250,6 +249,7 @@ controls="\@@efcontrols", preview="\@@efpreview", display="\@@efdisplay", + color="\internalspotcolorparent\@@efcolor", % hack is needed ["repeat"]="\@@efrepeat", width="\@@efwidth", % can be crap height="\@@efheight", % can be crap @@ -361,25 +361,6 @@ \let\feedbackexternalfigure\relax % \gobblefourarguments \let\dowithfigure \relax -% \let\lastfigureobjectname\empty - -\def\calculateexternalscreenfigure[#1][#2][#3][#4][#5][#6]% - {\ifx\@@efdisplay\empty\else -% \doifnot\@@efobject\v!no -% {\doifobjectssupportedelse -% {\doifspecialavailableelse\doregisterfigure -% {\doshowfigurestate{screen alternative : start}% -% \bgroup -% \dosetefparameters{#4}{#5}{#6}% -% \doregisterfigure{FIG}{\lastfigureobjectname}% -% \let\@@ef@@scherm\@@efdisplay -% \calculateexternalfigure[#1][\@@ef@@scherm][\@@ef@@scherm][#4,\c!display=][#5][#6]% -% \doshowfigurestate{screen alternative : stop}% -% \egroup} -% {}} -% {}}% - \fi} - \def\getfiguredimensions {\dodoubleempty\dogetfiguredimensions} @@ -416,3 +397,49 @@ {\ctxlua{figures.bases.use("#1")}} \protect \endinput + +% \startbuffer +% \definecolor [blue] [c=1,m=.38,y=0,k=.64] +% \definecolor [yellow] [c=0,m=.28,y=1,k=.06] +% +% \definespotcolor [blue-100] [blue] [p=1] +% \definespotcolor [yellow-100] [yellow] [p=1] +% +% \definemultitonecolor [combicolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1] +% +% \definemultitonecolor [combicolor-b] [blue=1] [c=1,m=.38,y=0,k=.64] % force multitone +% \definemultitonecolor [combicolor-y] [yellow=1] [c=0,m=.28,y=1,k=.06] % force multitone +% +% \useexternalfigure[demo-a][mill.png] [object=no,width=.2\textwidth] +% \useexternalfigure[demo-b][hacker-bw.jpg][object=no,width=.2\textwidth] +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-a]} {no color} +% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-a][color=combicolor-b]} {spot color} +% {\externalfigure[demo-a][color=combicolor-y]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-b]} {no color} +% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-b][color=combicolor-b]} {spot color} +% {\externalfigure[demo-b][color=combicolor-y]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-a]} {no color} +% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-a][color=blue-100]} {spot color} +% {\externalfigure[demo-a][color=yellow-100]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-b]} {no color} +% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-b][color=blue-100]} {spot color} +% {\externalfigure[demo-b][color=yellow-100]} {spot color} +% \stopcombination \stopbaselinecorrection +% \stopbuffer +% +% \getbuffer \typebuffer diff --git a/tex/context/base/grph-u3d.lua b/tex/context/base/grph-u3d.lua new file mode 100644 index 000000000..e5944691c --- /dev/null +++ b/tex/context/base/grph-u3d.lua @@ -0,0 +1,45 @@ +if not modules then modules = { } end modules ['grph-u3d'] = { + version = 1.001, + comment = "companion to grph-inc.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- see lpdf-u3d.lua for comment + +local format = string.format + +local texsprint = tex.sprint +local ctxcatcodes = tex.ctxcatcodes + +function figures.checkers.u3d(data) + local dr, du, ds = data.request, data.used, data.status + local width = (dr.width or figures.defaultwidth):todimen() + local height = (dr.height or figures.defaultheight):todimen() + local foundname = du.fullname + dr.width, dr.height = width, height + du.width, du.height, du.foundname = width, height, foundname + texsprint(ctxcatcodes,format("\\startfoundexternalfigure{%ssp}{%ssp}",width,height)) + local annot, preview, ref = backends.pdf.helpers.insert3d { + foundname = foundname, + width = width, + height = height, + factor = number.dimenfactors.bp, + display = dr.display, + controls = dr.controls, + label = dr.label, + } + -- node.write(nodes.pdfannot(width,-height,0,annot())) + texsprint(ctxcatcodes,format("\\pdfannot width %ssp height %ssp {%s}",width,height,annot())) -- brrrr +--~ if ref then -- wrong ! a direct ref should work +--~ texsprint(ctxcatcodes,format("\\smash{\\pdfrefximage%s\\relax}",ref)) -- brrrr +--~ end + texsprint(ctxcatcodes,"\\stopfoundexternalfigure") + return data +end + +figures.includers.u3d = figures.includers.nongeneric + +figures.registersuffix("u3d","u3d") +figures.registersuffix("prc","u3d") diff --git a/tex/context/base/hand-def.tex b/tex/context/base/hand-def.mkii index 0a19ce270..0a19ce270 100644 --- a/tex/context/base/hand-def.tex +++ b/tex/context/base/hand-def.mkii diff --git a/tex/context/base/hand-ini.mkii b/tex/context/base/hand-ini.mkii index 42d248df6..ac8a94696 100644 --- a/tex/context/base/hand-ini.mkii +++ b/tex/context/base/hand-ini.mkii @@ -16,22 +16,6 @@ \unprotect -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - \newif\iftracefonthandling % \tracefonthandlingtrue \newif\ifskiphandlingdef \skiphandlingdeffalse @@ -452,7 +436,7 @@ {\letvalueempty{\c!file\f!handlingprefix#1}% \makeshortfilename[\truefilename{\f!handlingprefix#1}]% \startreadingfile - \readsysfile\shortfilename + \readsysfile{\shortfilename.mkii} {\showmessage\m!handlings2{#1}} {\showmessage\m!handlings3{#1}}% \stopreadingfile}} diff --git a/tex/context/base/java-fld.tex b/tex/context/base/java-fld.tex index e6e5ee03a..4fdf41ce4 100644 --- a/tex/context/base/java-fld.tex +++ b/tex/context/base/java-fld.tex @@ -19,15 +19,7 @@ function Sanitized_TeX_String (value) { var v = value ; - % v = v.replace(/\\\\\\/L/g,"\\225") ; % problematic - % v = v.replace( /\\\\OE/g,"\\226") ; % problematic - % v = v.replace( /\\\\vS/g,"\\227") ; % problematic - % v = v.replace( /\\\\"Y/g,"\\230") ; % problematic - % v = v.replace( /\\\\vZ/g,"\\231") ; % problematic - % v = v.replace(/\\\\\\/l/g,"\\233") ; % problematic v = v.replace( /\\\\oe/g,"\\234") ; - % v = v.replace( /\\\\vs/g,"\\235") ; % problematic - % v = v.replace( /\\\\vz/g,"\\236") ; % problematic v = v.replace( /\\\\<</g,"\\253") ; v = v.replace( /\\\\>>/g,"\\273") ; v = v.replace( /\\\\`A/g,"\\300") ; @@ -52,7 +44,6 @@ v = v.replace( /\\\\^O/g,"\\324") ; v = v.replace( /\\\\~O/g,"\\325") ; v = v.replace( /\\\\"O/g,"\\326") ; - % v = v.replace(/\\\\\\/O/g,"\\330") ; % problematic v = v.replace( /\\\\`U/g,"\\331") ; v = v.replace( /\\\\'U/g,"\\332") ; v = v.replace( /\\\\^U/g,"\\333") ; @@ -81,7 +72,6 @@ v = v.replace( /\\\\^o/g,"\\364") ; v = v.replace( /\\\\~o/g,"\\365") ; v = v.replace( /\\\\"o/g,"\\366") ; - % v = v.replace(/\\\\\\/o/g,"\\370") ; % problematic v = v.replace( /\\\\`u/g,"\\371") ; v = v.replace( /\\\\'u/g,"\\372") ; v = v.replace( /\\\\^u/g,"\\373") ; @@ -129,7 +119,7 @@ \startJSpreamble fields_1 used now -var visible_field = new Array() ; % no garbage collection ! +var visible_field = new Array() ; var visible_fields = 0 ; function PresetFields ( ) @@ -140,13 +130,11 @@ function Preset_Fields ( ) function Hide_When_Down ( ) { event.target.hidden = true } -% { event.target.display = display.hidden } function Hide_Field ( Name ) { var v = this.getField(Name) ; if (v) { v.hidden = true ; - % { v.display = display.hidden ; v.readonly = true ; this.dirty = false } } @@ -173,11 +161,11 @@ function Hide_Fields () { Hide_Field(visible_field[visible_fields]) ; --visible_fields } } -function Vide_Fields ( Name ) % show only one field +function Vide_Fields ( Name ) { Hide_Fields () ; Vide_Field ( Name) } -function Vide_Hide_Fields ( Name ) % show only one field +function Vide_Hide_Fields ( Name ) { Hide_Fields () ; Vide_Hide_Field ( Name) } @@ -185,10 +173,6 @@ function Toggle_Hide ( Name ) { var v = this.getField(Name) ; if (v) { v.hidden = !v.hidden ; - % if v.display == display.hidden - % { v.display = display.visible } - % else - % { v.display = display.hidden } this.dirty = false } } function Field_On ( Name ) @@ -218,10 +202,6 @@ function Flip_Fields ( Name ) { v = this.getField(Names[i]) ; if (v) { v.hidden = !v.hidden ; - % if v.display == display.hidden - % { v.display = display.visible } - % else - % { v.display = display.hidden } v.value = "On" } } } function Forget_Changes () @@ -229,7 +209,6 @@ function Forget_Changes () function ForgetChanges () { this.dirty = false } - \stopJSpreamble %\startJScode{Hide_When_Down} Hide_When_Down() \stopJScode diff --git a/tex/context/base/java-ini.lua b/tex/context/base/java-ini.lua new file mode 100644 index 000000000..0fe7d3d29 --- /dev/null +++ b/tex/context/base/java-ini.lua @@ -0,0 +1,112 @@ +if not modules then modules = { } end modules ['java-ini'] = { + version = 1.001, + comment = "companion to java-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +javascripts = javascripts or { } +javascripts.codes = javascripts.codes or { } +javascripts.preambles = javascripts.preambles or { } +javascripts.functions = javascripts.functions or { } + +local codes, preambles, functions = javascripts.codes, javascripts.preambles, javascripts.functions + +local preambled = { } + +local function storefunction(s) + functions[s] = true +end + +local uses = lpeg.P("uses") +local used = lpeg.P("used") +local left = lpeg.P("{") +local right = lpeg.P("}") +local space = lpeg.S(" \r\n") +local spaces = space^0 +local braced = left * lpeg.C((1-right-space)^1) * right +local unbraced = lpeg.C((1-space)^1) +local name = spaces * (braced + unbraced) * spaces +local any = lpeg.P(1) +local script = lpeg.C(any^1) +local funct = lpeg.P("function") +local leftp = lpeg.P("(") +local rightp = lpeg.P(")") +local fname = spaces * funct * spaces * (((1-space-left)^1)/storefunction) * spaces * leftp + +local parsecode = name * ((uses * name) + lpeg.Cc("")) * spaces * script +local parsepreamble = name * ((used * name) + lpeg.Cc("")) * spaces * script +local parsefunctions = (fname + any)^0 + +function javascripts.storecode(str) + local name, uses, script = parsecode:match(str) + if name and name ~= "" then + javascripts.codes[name] = { uses, script } + end +end + +function javascripts.storepreamble(str) -- now later + local name, used, script = parsepreamble:match(str) + if name and name ~= "" then + preambles[#preambles+1] = { name, used, script } + preambled[name] = #preambles + parsefunctions:match(script) + end +end + +function javascripts.setpreamble(name,script) -- now later + if name and name ~= "" then + preambles[#preambles+1] = { name, "now", script } + preambled[name] = #preambles + parsefunctions:match(script) + end +end + +function javascripts.addtopreamble(name,script) -- now later + if name and name ~= "" then + local p = preambled[name] + if p then + preambles[p] = { "now", preambles[p] .. " ;\n" .. script } + else + preambles[#preambles+1] = { name, "now", script } + preambled[name] = #preambles + parsefunctions:match(script) + end + end +end + +function javascripts.usepreamblenow(name) -- now later + if name and name ~= "" and preambled[name] then + preambles[preambled[name]][2] = "now" + end +end + +function javascripts.code(name,arguments) + local c = codes[name] + if c then + local u, code = c[1], c[2] + if u ~= "" then + local p = preambled[u] + if p then + preambles[p][1] = "now" + end + end + return code + end + local f = functions[name] + if f then + return string.format("%s(%s)",name,arguments or "") + end +end + +function javascripts.flushpreambles() + local t = { } + for i=1,#preambles do + local preamble = preambles[i] + if preamble[2] == "now" then + t[#t+1] = { preamble[1], preamble[3] } + end + end + return t +end diff --git a/tex/context/base/java-ini.mkiv b/tex/context/base/java-ini.mkiv index 53c36d65f..6536ced48 100644 --- a/tex/context/base/java-ini.mkiv +++ b/tex/context/base/java-ini.mkiv @@ -13,47 +13,10 @@ \writestatus{loading}{ConTeXt JavaScript Macros / Initialization} -% BUG: preamble zonder used/used en split - -% todo: lua sanitizer - -% JavaScript support is under development. In the near future -% a slightly different model will be used. The JScode stuff -% will probably become just auto function inclusion and the -% JS_* things will disappear. First I have to find a way to -% deal with global variables so the 'uses' thing will remain. - -% ook p{ref} -% documentation should be corrected to JS( - -% Also, obeylines will be supported. +\registerctxluafile{java-ini}{1.001} \unprotect -%D \JAVA\ support is not implemented as a generic support -%D module. The main reason for this is that passing system -%D variables to a \JAVASCRIPT\ is closely related to other core -%D macros. First some messages: - -%D \TEX\ is not the right tool to check the \JAVA\ code; the -%D most we can do is reporting some passed variables: - -\newif\iftraceJScode \traceJScodefalse - -\let\traceJScode\traceJScodetrue - -%D A bit out of place, but not dangerous: - -\bgroup -\catcode127=\@@letter -\gdef\delcharacter{^^7f} -\egroup - -%D The number of passed variables is minimalized by setting the -%D next switch. - -\newif\ifminimalizeJScode \minimalizeJScodetrue - %D \macros %D {JS*} %D @@ -74,50 +37,7 @@ %D \starttyping %D \goto{calculate total}[Sum(1.5,2.3)] %D \stoptyping -%D -%D References are passed by using the \type{R{}} classifier. -%D -%D \starttyping -%D \goto{calculate total}[Sum(1.5,2.3,R{overflow})] -%D \stoptyping -%D -%D The last call calls the script \type{Sum} and passes the -%D next set of variables: -%D -%D \starttyping -%D JS_S_1="1.5"; -%D JS_S_2="2.3"; -%D JS_R_3="overflow"; -%D JS_P_3=3; -%D \stoptyping -%D -%D The first two parameters are just strings, the third one -%D however is treated as a reference and results in passing the -%D reference (if needed this references is prefixed) and the -%D (real) page number. The alternative: -%D -%D \starttyping -%D \goto{calculate total}[JS(Sum{V{1.5},V{2.3},R{overflow}})] -%D \stoptyping -%D -%D does a verbose passing: -%D -%D \starttyping -%D JS_V_1=1.5; -%D JS_V_2=2.3; -%D JS_R_3="overflow"; -%D JS_P_3=3; -%D \stoptyping -% %D -% %D Finally we have a counter that tells\JAVA\ how many -% %D arguments were passed, -% %D -% %D \starttyping -% %D JS_N -% %D \stoptyping -%D We will also support direct function calls. In that case -%D no intermediate variables are used. %D \macros %D {startJScode} @@ -125,32 +45,12 @@ %D A piece of \JAVASCRIPT\ code is defined by saying: %D %D \starttyping -%D \startJScode{SomeScript} -%D var Item=this.getField("item"); -%D N=Item.getArray(); -%D Total=this.getField("total"); -%D Total.value=0; -%D for (j=0; j<N.length; j++) -%D { if (N[j].value!="") -%D { Total.value += N[j].value } } ; -%D if ((JS_N>0) && (JS_R_1!="")) -%D { gotoNamedDest(JS_R_1) }; -%D \stopJScode -%D \stoptyping -%D -%D Such a piece of code is closely related to the interpreter -%D used. Watch the last two lines, here the script adapts -%D itself to the presence of a reference. -%D -%D While -%D -%D \starttyping %D \startJScode{name} %D name = 4 ; %D \stopJScode %D \stoptyping %D -%D assumes uses no preamble or presumes that the preamble is +%D This assumes uses no preamble or presumes that the preamble is %D always loaded, the next definition also tells \CONTEXT\ to %D actually include the preamble needed. %D @@ -159,109 +59,9 @@ %D uses = 6 ; %D \stopJScode %D \stoptyping - -\long\def\startJScode#1 #2 - {\doifelse{#2}{uses} - {\dostartJScodeA{#1}} - {\dostartJScodeB{#1} #2 }} - -\long\def\dostartJScodeA#1#2 #3\stopJScode - {\long\setgvalue{\r!java#1}{\do{#2}{#3}}} - -\long\def\dostartJScodeB#1#2\stopJScode - {\long\setgvalue{\r!java#1}{\do{}{#2}}} - -\let\stopJScode\relax - -%D \macros -%D {presetJScode} -%D -%D The code can be retrieved by saying -%D -%D \starttyping -%D \presetJScode{SomeScript}{template} -%D \stoptyping %D -%D Such a template is a comma separated list, where -%D individual entries can optionally be transformed by -%D \type{R{}} and \type{V{}}. -%D -%D After this call, the code is available in \type{\JScode}. - -\newif\ifdirectJScode - -\def\presetJScode#1#2% #1=operation #2=arguments - {\setverbosecscharacters - \def\par{\delcharacter}% was: { } - \scratchcounter\zerocount - \globallet\JScode\empty - \def\do##1##2% - {\doifelse{##2}{!}\directJScodetrue\directJScodefalse}% - \getvalue{\r!java#1}% - \edef\!!stringa{#2}% - \ifx\!!stringa\empty \else - \processcommacommand[\!!stringa]\dopresetJSvariables - \fi - \def\docommand##1% - {\doifundefinedelse{\r!java\r!java##1} - {\showmessage\m!javascript2{##1}} - {\useJSpreamblenow{##1}}}% -% {\doglobal\increment\currentJSpreamble -% \doglobal\addtocommalist{##1}\allJSpreambles}}% - \def\do##1##2% - {\xdef\JScode{\ifdirectJScode#1(\JScode)\else\JScode##2\fi}% - %\xdef\JScode{JS\string_N=\the\scratchcounter;\JScode}% - \processcommalist[##1]\docommand}% - \getvalue{\r!java#1}} - -\def\dopresetJSvariables#1% - {\advance\scratchcounter \plusone - \donefalse - \dodopresetJSvariables#1\end}% - -\def\dodopresetJSvariables - {\doifnextcharelse R\dodopresetJSrefvariables - {\doifnextcharelse V\dodopresetJSvervariables - {\doifnextcharelse S\dodopresetJSstrvariables - \dodopresetJSrawvariables}}} - -\def\dodopresetJSrefvariables R#1\end - {\doifreferencefoundelse{#1} - {\donetrue \dododopresetJSvariables R{\referenceprefix#1}% - \donefalse\dododopresetJSvariables P{\currentrealreference}} - {\unknownreference{#1}}% - \ifminimalizeJScode \else - \donetrue\dododopresetJSvariables S{#1}% - \fi} - -\def\dodopresetJSvervariables V#1\end - {\donefalse\dododopresetJSvariables V{#1}% - \ifminimalizeJScode \else - \donetrue\dododopresetJSvariables S{#1}% - \fi} - -\def\dodopresetJSstrvariables S#1\end - {\donetrue\dododopresetJSvariables S{#1}} - -\def\dodopresetJSrawvariables #1\end - {\donetrue\dododopresetJSvariables S{#1}} - -\def\JSprefix#1% - {JS\string_#1\string_\the\scratchcounter} - -\def\dododopresetJSvariables#1#2% - {\iftraceJScode - \writestatus{JavaScript}{\JSprefix#1=#2} - \xdef\JScode{\JScode console.println("\JSprefix#1=#2"); }% - \fi - \ifdirectJScode - \xdef\JScode{\ifx\JScode\empty\else\JScode,\fi\ifdone"#2"\else#2\fi}% - \else - \xdef\JScode{\JScode\JSprefix#1=\ifdone"#2"\else#2\fi; }% - \fi} - %D \macros -%D {startJSpreamble, flushJSpreamble} +%D {startJSpreamble} %D %D One can define insert \JAVASCRIPT\ code at the document level %D by using: @@ -291,365 +91,40 @@ %D %D This command may be used more that once, but always before %D the first page is shipped out. - -\newif\ifoneJSpreamble \oneJSpreamblefalse - -\let\allJSpreambles\empty -\newcounter\nofJSpreambles -\newcounter\currentJSpreamble - -\long\def\startJSpreamble#1 #2 % - {\bgroup % we need to restore the catcodes - \restoreendofline % just in case it happens while reading lists - \doifelse{#2}{used} - {\dostartJSpreamble#1 } - {\dostartJSpreamble#1 now #2 }} - -\long\def\dostartJSpreamble#1 #2 % - {\processaction - [#2] - [ later=>\chardef\JSstatus\zerocount,% - now=>\chardef\JSstatus\plusone ,% - \s!default=>\chardef\JSstatus\plustwo ,% - \s!unknown=>\chardef\JSstatus\plustwo ]% - \ifaddJSlinebreaks - \obeylines \let\obeyedline \normalpar - \obeyspaces \let\obeyedspace\normalspace - \fi - \dodostartJSpreamble{#1}} - -\long\def\dodostartJSpreamble#1#2\stopJSpreamble - {\presetJSfunctions #2function ()\end - \long\setgvalue{\r!java\r!java#1}{#2}% - \ifcase\JSstatus \else - \useJSpreamblenow{#1}% - \fi - \egroup} - +%D %D \macros %D {setJSpreamble, addtoJSpreamble} %D %D In addition to the previous preamble definitions, we can %D set a preamble \quote {in||line} and add tokens to a %D preamble. - -\def\setJSpreamble#1#2% - {\doifundefined{\r!java\r!java#1} - {\setgvalue{\r!java\r!java#1}{#2;}% - \doglobal\increment\currentJSpreamble - \doglobal\addtocommalist{#1}\allJSpreambles}} - -\def\addtoJSpreamble#1#2% - {\doifdefinedelse{\r!java\r!java#1} - {\edef\!!stringa{\r!java\r!java#1}% - \edef\!!stringb{\csname\!!stringa\endcsname}% - \@EA\setgvalue\@EA\!!stringa\@EA{\!!stringb #2;}} - {\setJSpreamble{#1}{#2}}} - +%D %D \macros %D {useJSpreamblenow} %D -%D The next macro can be used to force inclusion of postponed +%D This macro can be used to force inclusion of postponed %D \JAVASCRIPT\ preambles. -\def\useJSpreamblenow#1% - {\doglobal\increment\currentJSpreamble - \doglobal\addtocommalist{#1}\allJSpreambles} - -%D Because we want to check for valid calls, we preload the -%D functions. This means that we can call them directly as -%D well as indirectly when defined by \type {\startJScode} etc. - -% \long\def\presetJSfunctions#1function #2(#3)% -% {\doifelsenothing{#2} -% {\long\def\presetJSfunctions##1\end{}} -% {\stripspaces\from#2\to\ascii -% \doifundefined{\r!java\ascii}{\setgvalue{\r!java\ascii}{\do{}{!}}}}% -% \presetJSfunctions} - -\long\def\presetJSfunctions#1function#2(#3)% - {\doifelse{#2}\space - {\long\def\presetJSfunctions##1\end{}} - {\stripspaces\from#2\to\ascii - \doifundefined{\r!java\ascii}{\setgvalue{\r!java\ascii}{\do{}{!}}}}% - \presetJSfunctions} - -\def\getJSpreamble#1% - {\getvalue{\r!java\r!java#1}} +\unexpanded\def\startJScode + {\begingroup\obeylualines\obeyluatokens\dostartJScode} -\def\presetJSpreamble - {\ifx\allJSpreambles\empty\else - \bgroup - \setverbosecscharacters - \obeyspaces \let\obeyedspace\normalspace - \def\par{\delcharacter}% was: { } - \globallet\JSpreamble\empty - \def\@@collectedJSpreamble{\r!java\r!java collected}% - \letvalue{\@@collectedJSpreamble}=\empty - \def\docommand##1% - {\xdef\JScode{\getvalue{\r!java\r!java##1}}% - \ifoneJSpreamble % \global\letcdcsname - \@EA\setxvalue\@EA\@@collectedJSpreamble\@EA - {\csname\@@collectedJSpreamble\endcsname\JScode}% - \else - \setxvalue{\r!java\r!java##1}{\JScode}% - \fi}% - \processcommacommand[\allJSpreambles]\docommand - \ifoneJSpreamble - \gdef\allJSpreambles{collected}% - \fi - \globallet\presetJSpreamble\relax - \egroup - \fi} +\long\def\dostartJScode#1\stopJScode + {\normalexpanded{\endgroup\ctxlua{javascripts.storecode(\!!bs#1\!!es)}}} -\def\flushJSpreamble - {\iflocation\ifx\allJSpreambles\empty\else - \ifcase\nofJSpreambles\else\ifnum\nofJSpreambles=\currentJSpreamble - \bgroup - \presetJSpreamble - \expanded{\doflushJSpreamble{\allJSpreambles}}% - \globallet\flushJSpreamble\relax - \globallet\allJSpreambles\empty - \egroup - \fi\fi - \fi\fi} - -\def\finalflushJSpreamble - {\iflocation - \flushJSpreamble - \ifcase\currentJSpreamble\relax\else - \savecurrentvalue\nofJSpreambles\currentJSpreamble - \globallet\currentJSpreamble\nofJSpreambles - \fi - \fi} - -%D \macros -%D {doPSsanitizeJScode} -%D -%D Before the code can be passed to the (\POSTSCRIPT\ or \PDF) -%D output file, some precautions must be made concerning the -%D use of \type{(} and~\type{)}. Here we use a beautiful -%D \type{\aftergroup} trick I discovered in the \TABLE\ format. - -\def\doPSsanitizeJScode#1\to#2% - {\begingroup - \scratchcounter\zerocount % \aftergroup counter - \aftergroup\xdef - \aftergroup#2% - \aftergroup{% - \expanded{\defconvertedargument\noexpand\JScode{#1}}% - \expandafter\handletokens\JScode\with\dodoPSsanitizeJScode - \aftergroup}% - \endgroup - \iftraceJScode - \writestatus{JS trace}{#2}% - \fi} - -%D I started with: -%D -%D \starttyping -%D \def\dodoPSsanitizeJScode#1% -%D {\aftergroup\string -%D \if#1(% -%D \expandafter\aftergroup\csname#1\endcsname -%D \else\if#1)% -%D \expandafter\aftergroup\csname#1\endcsname -%D \else\if#1;% -%D \aftergroup;\aftergroup\string\expandafter\aftergroup\ -%D \else -%D \expandafter\aftergroup#1% -%D \fi\fi\fi -%D \advance\scratchcounter by 1 -%D \ifnum\scratchcounter=500 -%D \expandafter\dododoPSsanitizeJScode -%D \fi} -%D \stoptyping -%D -%D For pretty printing purposes, we need some way to signal -%D \TEX\ macros. Therefore we introduce a special keyword -%D \type{TEX}. When followed by a space, this keyword is -%D ignored, that is, filtered from the stream. Now we have: - -\chardef\JSisTEX \zerocount -\chardef\JScomment\zerocount - -\newif\ifaddJSlinebreaks \addJSlinebreakstrue - -\def\flushJSisTEX - {\ifcase\JSisTEX - \or \aftergroup T% - \or \aftergroup T\aftergroup E% - \or \aftergroup T\aftergroup E\aftergroup X% - \fi - \chardef\JSisTEX\zerocount} - -% \def\doJSlinebreak -% {\ifaddJSlinebreaks -% \aftergroup\string\aftergroup\n% -% \fi} -% -% \def\dodoPSsanitizeJScode#1% % input stack>500 & TEX check -% {\if#1/% -% \ifnum\JScomment=0 -% \chardef\JScomment\plusone -% \else\ifnum\JScomment=1 -% \chardef\JScomment\plustwo -% \fi\fi -% \else -% \ifnum\JScomment=1 -% \aftergroup/% -% \chardef\JScomment\zerocount -% \fi -% \ifnum\JScomment=2 -% \if#1\delcharacter -% \chardef\JScomment\zerocount -% \fi -% \else -% \if#1\delcharacter -% \flushJSisTEX\doJSlinebreak -% \else\if#1(% -% \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname -% \else\if#1)% -% \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname -% \else\if#1;% -% \flushJSisTEX\aftergroup;\doJSlinebreak -% \else\if#1T% -% \ifnum\JSisTEX=0 \chardef\JSisTEX\plusone \else\flushJSisTEX\aftergroup T\fi -% \else\if#1E% -% \ifnum\JSisTEX=1 \chardef\JSisTEX\plustwo \else\flushJSisTEX\aftergroup E\fi -% \else\if#1X% -% \ifnum\JSisTEX=2 \chardef\JSisTEX\plusthree \else\flushJSisTEX\aftergroup X\fi -% \else\if#1\normalspace -% \ifnum\JSisTEX=3 \chardef\JSisTEX\zerocount \else\flushJSisTEX\aftergroup#1\fi -% \else -% \flushJSisTEX\aftergroup\string\expandafter\aftergroup#1% -% \fi\fi\fi\fi\fi\fi\fi\fi -% \fi -% \fi -% \dododoPSsanitizeJScode} - -% todo: "http:\\" -> simple. maar wel \" afvangen -% -% use new pdftex escape mechanism or make fully expandable version, not used that often btw - -\chardef\JSstring\zerocount - -\def\doJSlinebreak - {\chardef\JScomment\zerocount - \chardef\JSstring\zerocount - \ifaddJSlinebreaks - \aftergroup\string\aftergroup\n% - \fi} - -\def\dodoPSsanitizeJScode#1% % input stack>500 & TEX check - {\if#1/% - \ifnum\JSstring=0 - \ifnum\JScomment=0 - \chardef\JScomment\plusone - \else\ifnum\JScomment=1 - \chardef\JScomment\plustwo - \fi\fi - \else - \aftergroup/% - \fi - \else - \ifnum\JScomment=1 - \aftergroup/% - \chardef\JScomment\zerocount - \fi - % is the delchar trick still needed? - \ifnum\JScomment=2 - \ifnum`#1=13 % brrr - \doJSlinebreak - \else\if#1\par - \doJSlinebreak - \else\if#1\delcharacter - \doJSlinebreak - \fi\fi\fi - \else - \ifnum`#1=13 % brrr - \flushJSisTEX\doJSlinebreak - \else\if#1\par - \flushJSisTEX\doJSlinebreak - \else\if#1\delcharacter - \flushJSisTEX\doJSlinebreak - \else\if#1(% - \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname - \else\if#1)% - \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname - %\else\if#1;% - % \flushJSisTEX\aftergroup;\doJSlinebreak - \else\if#1T% - \ifnum\JSisTEX=0 \chardef\JSisTEX\plusone \else\flushJSisTEX\aftergroup T\fi - \else\if#1E% - \ifnum\JSisTEX=1 \chardef\JSisTEX\plustwo \else\flushJSisTEX\aftergroup E\fi - \else\if#1X% - \ifnum\JSisTEX=2 \chardef\JSisTEX\plusthree \else\flushJSisTEX\aftergroup X\fi - \else\if#1\normalspace - \ifnum\JSisTEX=3 \chardef\JSisTEX\zerocount \else\flushJSisTEX\aftergroup#1\fi - \else - % todo: "test\"test" - \if#1"% - \ifcase\JSstring - \chardef\JSstring\plusone - \else - \chardef\JSstring\zerocount - \fi - \fi - \flushJSisTEX\aftergroup\string\expandafter\aftergroup#1% - \fi\fi\fi\fi\fi\fi\fi\fi\fi % \fi - \fi - \fi - \dododoPSsanitizeJScode} - -%D Close reading learns that one line comments (\type{// ...}) -%D are removed from the stream. This permits switching in -%D pretty printing \JAVASCRIPT\ sources as well as saves -%D some bytes. - -%D The magic 500 in the next hack prevents the input stack from -%D overflowing when large scripts are sanitized. - -\def\dododoPSsanitizeJScode - {\ifcase\JSisTEX\ifcase\JScomment - \advance\scratchcounter \plusone - \fi\fi - \ifnum\scratchcounter=500 - \expandafter\dodododoPSsanitizeJScode - \fi} - -\def\dodododoPSsanitizeJScode - {\let\next={% - \aftergroup}% - \endgroup - \begingroup - \aftergroup\xdef - \aftergroup\sanitizedJScode - \aftergroup{% - \aftergroup\sanitizedJScode - \let\next=}} +\let\stopJScode\relax -%D The macro \type{\doPSsanitizeJScode} converts its argument -%D into the macro \type{\sanitizedJScode}, thereby prefixing -%D each \type{(} and \type{)} by a slash. +\unexpanded\def\startJSpreamble + {\begingroup\obeylualines\obeyluatokens\dostartJSpreamble} -%D Hooking this mechanism into the general \CONTEXT\ reference -%D mechanism does not take much effort: +\long\def\dostartJSpreamble#1\stopJSpreamble + {\normalexpanded{\endgroup\ctxlua{javascripts.storepreamble(\!!bs#1\!!es)}}} -\definespecialtest{JS}% - {\doifdefinedelse{\r!java\currentreferenceoperation}} +\let\stopJSpreamble\relax -\def\gotojavascriptspecial#1#2#3#4% special operation arguments data - {\begingroup - \iflocation - \bgroup - \presetJScode{#2}{#3}% - \egroup - \dohandlegoto{#4}{\dostartgotoJS\buttonwidth\buttonheight\JScode}{\dostopgotoJS}% - \else - #4% - \fi - \endgroup} +\def\setJSpreamble #1#2{\ctxlua{javascripts.storepreamble ("#1",\!!bs#2\!!es)}} +\def\addtoJSpreamble #1#2{\ctxlua{javascripts.addtopreamble ("#1",\!!bs#2\!!es)}} +\def\useJSpreamblenow #1{\ctxlua{javascripts.usepreamblenow("#1")}} +\def\finalflushJSpreamble{\iflocation\ctxlua{javascripts.flushpreambles()}\fi} %D \macros %D {useJSscripts} @@ -669,14 +144,15 @@ \def\dodouseJSscripts#1% {\doifelse{#1}\v!reset {\let\allJSpreambles\empty} - {\doifundefined{\c!file\f!javascriptprefix#1} - {\startnointerference - \letgvalueempty{\c!file\f!javascriptprefix#1}% - \makeshortfilename[\f!javascriptprefix#1]% - \startreadingfile - \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing - \stopreadingfile - \stopnointerference}}} + {\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 + \stopreadingfile + \stopnointerference + \fi}} \def\douseJSscripts[#1][#2]% {\processcommalist[#1]\dodouseJSscripts diff --git a/tex/context/base/java-stp.tex b/tex/context/base/java-stp.tex index fcb9d4f22..df4fbcc2f 100644 --- a/tex/context/base/java-stp.tex +++ b/tex/context/base/java-stp.tex @@ -11,13 +11,13 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\startJSpreamble Steps used now +% we define ocglist global, otherwise we quickly run into a memory hog (even +% out of memory in a 512 Meg machine) - % we define ocglist global, otherwise we quickly run into a memory hog (even - % out of memory in a 512 Meg machine) +% we cannot use doc_visited[this.pageNum] instead of doc_currentstep because +% of some funny side effect (i.e. dup or so) - % we cannot use doc_visited[this.pageNum] instead of doc_currentstep because - % of some funny side effect (i.e. dup or so) +\startJSpreamble Steps used now var doc_ocglist = this.getOCGs() ; var doc_stepname = "step" ; @@ -26,9 +26,6 @@ var doc_visited = new Array() ; var doc_busy = new Array() ; - % for some reason, this function is not seen in time (funny initialization - % order again?) ... - function SetupStepper ( layername, laststep ) { doc_stepname = layername ; doc_maxstep = laststep ; @@ -38,8 +35,6 @@ } } - % so, we do it the ugly way - for (var i=0; i<=this.numPages; i++) { doc_visited[i] = 0 ; doc_busy[i] = 0 ; @@ -96,7 +91,6 @@ function InvokeStepper ( ) { try { -% console.println("INVOKE "+doc_currentstep+" "+doc_busy[this.pageNum]) ; if (doc_currentstep<doc_busy[this.pageNum]) { doc_currentstep += 1 ; doc_visited[this.pageNum] = doc_currentstep ; diff --git a/tex/context/base/l-aux.lua b/tex/context/base/l-aux.lua index 6b1fd67ff..0e5babeeb 100644 --- a/tex/context/base/l-aux.lua +++ b/tex/context/base/l-aux.lua @@ -24,6 +24,7 @@ local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg. local key = lpeg.C((1-equal-comma)^1) local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C("")) +local pattern_c = (space+comma)^0 * (key * equal * value) local key = lpeg.C((1-space-equal-comma)^1) local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C(""))) @@ -38,19 +39,23 @@ end local pattern_a_s = (pattern_a/set)^1 local pattern_b_s = (pattern_b/set)^1 +local pattern_c_s = (pattern_c/set)^1 aux.settings_to_hash_pattern_a = pattern_a_s aux.settings_to_hash_pattern_b = pattern_b_s +aux.settings_to_hash_pattern_c = pattern_c_s -function aux.make_settings_to_hash_pattern(set,moretolerant) - if moretolerant then +function aux.make_settings_to_hash_pattern(set,how) + if how == "strict" then + return (pattern_c/set)^1 + elseif how == "tolerant" then return (pattern_b/set)^1 else return (pattern_a/set)^1 end end -function aux.settings_to_hash(str,moretolerant) +function aux.settings_to_hash(str) if str and str ~= "" then hash = { } if moretolerant then @@ -64,6 +69,26 @@ function aux.settings_to_hash(str,moretolerant) end end +function aux.settings_to_hash_tolerant(str) + if str and str ~= "" then + hash = { } + pattern_b_s:match(str) + return hash + else + return { } + end +end + +function aux.settings_to_hash_strict(str) + if str and str ~= "" then + hash = { } + pattern_c_s:match(str) + return next(hash) and hash + else + return nil + end +end + local seperator = comma * space^0 local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0) local pattern = lpeg.Ct(value*(seperator*value)^0) diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua index 399e51eab..90cb068e2 100644 --- a/tex/context/base/l-table.lua +++ b/tex/context/base/l-table.lua @@ -681,7 +681,7 @@ function table.insert_after_value(t,value,str) end local function are_equal(a,b,n,m) -- indexed - if #a == #b then + if a and b and #a == #b then n = n or 1 m = m or #a for i=n,m do diff --git a/tex/context/base/l-xml.lua b/tex/context/base/l-xml.lua index d6c48fe7b..8b8a6ce44 100644 --- a/tex/context/base/l-xml.lua +++ b/tex/context/base/l-xml.lua @@ -457,7 +457,7 @@ can speed up things a bit. The second argument is not to be used!</p> do - function copy(old,tables) + local function copy(old,tables) if old then tables = tables or { } local new = { } diff --git a/tex/context/base/lang-ara.tex b/tex/context/base/lang-ara.mkiv index 3c4d3c522..3c4d3c522 100644 --- a/tex/context/base/lang-ara.tex +++ b/tex/context/base/lang-ara.mkiv diff --git a/tex/context/base/lang-chi.tex b/tex/context/base/lang-chi.mkii index 278e10745..278e10745 100644 --- a/tex/context/base/lang-chi.tex +++ b/tex/context/base/lang-chi.mkii diff --git a/tex/context/base/lang-cjk.tex b/tex/context/base/lang-cjk.mkiv index 138f6d263..138f6d263 100644 --- a/tex/context/base/lang-cjk.tex +++ b/tex/context/base/lang-cjk.mkiv diff --git a/tex/context/base/lang-ctx.tex b/tex/context/base/lang-ctx.mkii index 09f28dda1..09f28dda1 100644 --- a/tex/context/base/lang-ctx.tex +++ b/tex/context/base/lang-ctx.mkii diff --git a/tex/context/base/lang-dis.tex b/tex/context/base/lang-dis.mkii index f081bf4a9..f081bf4a9 100644 --- a/tex/context/base/lang-dis.tex +++ b/tex/context/base/lang-dis.mkii diff --git a/tex/context/base/lang-ini.mkii b/tex/context/base/lang-ini.mkii index e5759bc84..a55748a78 100644 --- a/tex/context/base/lang-ini.mkii +++ b/tex/context/base/lang-ini.mkii @@ -265,7 +265,7 @@ \fi \egroup} -\fetchruntimecommand \showpatterns {\f!languageprefix\s!run} +\fetchruntimecommand \showpatterns {\f!languageprefix\s!run.mkii} %D Since we can only load patterns in ini\TeX, we nil the %D loading before dumping (which saves a bit of memory, but diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv index 7cb945ef9..f88281a60 100644 --- a/tex/context/base/lang-ini.mkiv +++ b/tex/context/base/lang-ini.mkiv @@ -76,14 +76,18 @@ \def\setupcurrentlanguage[#1]{\setcurrentlanguage\currentmainlanguage{#1}} \def\setcurrentlanguage#1#2% sets modes: **id (currentmain) *id (current) - {\doifsomething{#1} - {\ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi - \edef\currentmainlanguage{#1}% - \setsystemmode{\systemmodeprefix\currentmainlanguage}}% - \doifsomething{#2} - {\ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi - \edef\currentlanguage{#2}% - \setsystemmode\currentlanguage}} + {\edef\xaskedlanguage{#1}% otherwise clash with \askedlanguage + \ifx\xaskedlanguage\empty \else + \ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi + \let\currentmainlanguage\xaskedlanguage + \setsystemmode{\systemmodeprefix\currentmainlanguage}% + \fi + \edef\xaskedlanguage{#2}% + \ifx\xaskedlanguage\empty \else + \ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi + \let\currentlanguage\xaskedlanguage + \setsystemmode\currentlanguage + \fi} %D The internal macros will be defined later. @@ -120,9 +124,9 @@ %D preloaded format). \def\dodoinstalllanguage#1#2% #2 added - {\doifundefined{#1}{\setvalue{#1}{\complexlanguage[#2]}}% - \expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}% - \doifundefined\ascii{\setvalue\ascii{\complexlanguage[#2]}}} + {\expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}% + \ifcsname #1\endcsname\else\setvalue {#1}{\complexlanguage[#2]}\fi + \ifcsname\ascii\endcsname\else\setvalue\ascii{\complexlanguage[#2]}\fi} %D \macros %D {preloadlanguages} @@ -145,11 +149,6 @@ "\truefilename{\f!languageprefix#2.\f!hyphensextension }") }} -% \def\doloadlanguagefiles#1% -% {\doifelsevaluenothing{\??la#1\s!patterns} -% {\doloadpatterns{#1}{#1}} -% {\doloadpatterns{#1}{\getvalue{\??la#1\s!patterns}}}} - \def\doloadlanguagefiles#1% {\edef\languagesuffix{\specificlanguageparameter{#1}\s!patterns}% \ifx\languagesuffix\empty @@ -318,9 +317,6 @@ \newtoks \everylanguage -\def\disablelanguagespecifics - {\ignorecompoundcharacter} - \def\sethyphenationvariables {\lefthyphenmin 0\languageparameter\s!lefthyphenmin \relax \righthyphenmin0\languageparameter\s!righthyphenmin\relax @@ -331,21 +327,14 @@ {\edef\currentdefaultlanguage{\defaultlanguage\currentlanguage}% \setnormallanguage\currentlanguage\currentdefaultlanguage \the\everylanguage - \enablelanguagespecifics[\currentlanguage]% \sethyphenationvariables \relax % will be definable and move to core-spa ! \doifelse{\languageparameter\c!spacing}\v!broad\nonfrenchspacing\frenchspacing} -\ifx\enablelanguagespecifics\undefined \def\enablelanguagespecifics[#1]{} \fi - % The following may be a solution for the fact that one cannot % change catcodes of characters like : and ; inside an environment. -\appendtoks - \enablelanguagespecifics[\currentlanguage]% -\to \everystarttext - \def\complexlanguage[#1]% {\edef\askedlanguage{#1}% \ifx\askedlanguage\empty \else @@ -586,4 +575,6 @@ \uchyph=1 +\exhyphenchar=45 % to permit breaking at explicit hyphens + \protect \endinput diff --git a/tex/context/base/lang-ita.tex b/tex/context/base/lang-ita.tex index ae3b7a514..c714be775 100644 --- a/tex/context/base/lang-ita.tex +++ b/tex/context/base/lang-ita.tex @@ -478,12 +478,18 @@ %D Rather new \unknown -\setuplabeltext [\s!it] [\v!page=pagina ] -\setuplabeltext [\s!it] [\v!atpage=a pagina ] +\setuplabeltext [\s!it] [\v!page=pagina ] +\setuplabeltext [\s!it] [\v!atpage=a pagina ] \setuplabeltext [\s!it] [\v!hencefore=come mostrato sopra] \setuplabeltext [\s!it] [\v!hereafter=come mostrato sotto] \setuplabeltext [\s!it] [\v!see=cf. ] +\setuplabeltext [\s!fr] [\v!page=page ] +\setuplabeltext [\s!fr] [\v!atpage=à la page ] +\setuplabeltext [\s!fr] [\v!hencefore=ci-dessus] +\setuplabeltext [\s!fr] [\v!hereafter=ci-dessous] +\setuplabeltext [\s!fr] [\v!see=cf. ] + %D Ordinal converters: \def\frordinaldaynumber#1% date is masculine diff --git a/tex/context/base/lang-jap.tex b/tex/context/base/lang-jap.mkii index 05c9b1d41..05c9b1d41 100644 --- a/tex/context/base/lang-jap.tex +++ b/tex/context/base/lang-jap.mkii diff --git a/tex/context/base/lang-lab.mkiv b/tex/context/base/lang-lab.mkiv index 60408f787..0be27b4ca 100644 --- a/tex/context/base/lang-lab.mkiv +++ b/tex/context/base/lang-lab.mkiv @@ -37,41 +37,65 @@ %D \showsetup{setupheadtext} %D \showsetup{setuplabeltext} %D -%D In a few paragraphs we'll show quite a lot of examples -%D of its use. +%D A regular \CONTEXT\ stores some 1500 labels at most. \let\handletextprefix\relax -\def\setupheadtext {\dosetupsometextprefix[\c!title]} -\def\setuplabeltext{\dosetupsometextprefix[\c!label]} - -\def\dosetupsometextprefix - {\let\dodocommand\xdosetupsometextprefix - \dotripleempty\dodosetupsometextprefix} - -% \def\dodosetupsometextprefix[#1][#2][#3]% -% {\ifthirdargument -% \def\docommand##1{\dodocommand[#1#2][##1]}% -% \processcommalist[#3]\docommand -% \else -% \def\docommand##1{\dodocommand[#1\currentmainlanguage][##1]}% -% \processcommalist[#2]\docommand -% \fi} - -\def\dodosetupsometextprefix[#1][#2][#3]% - {\ifthirdargument - \def\docommand##1{\expanded{\dodocommand[#1\reallanguagetag{#2}]}[##1]}% - \processcommalist[#3]\docommand +\newconditional\protecttextprefixes + +\let\currenttextprefixtag \s!unknown +\let\currenttextprefixclass\s!unknown + +\def\setupheadtext {\setfalse\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix} +\def\setuplabeltext{\setfalse\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix} + +\def\dosetupsometextprefix[#1][#2]% + {\ifsecondargument + \edef\currenttextprefixtag{\reallanguagetag{#1}}% + \processcommalist[#2]\dodosetupsometextprefix \else - \def\docommand##1{\expanded{\dodocommand[#1\reallanguagetag\currentmainlanguage]}[##1]}% - \processcommalist[#2]\docommand + \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}% + \processcommalist[#1]\dodosetupsometextprefix \fi} -\def\doassignsometextprefix[#1][#2,#3,#4]% - {\setvalue{#1}{\handletextprefix{#2}{#3}}} +\def\dodosetupsometextprefix#1% + {\dododosetupsometextprefix[#1]} -\def\xdosetupsometextprefix[#1][#2=#3]% - {\doassignsometextprefix[#1#2][#3,,]} +\def\dododosetupsometextprefix[#1=#2]% + {\doassignsometextprefix{#1}[#2,,]} + +\def\doassignsometextprefix#1% + {\ifconditional\protecttextprefixes + \ifcsname\currenttextprefixclass\currenttextprefixtag#1\endcsname + \expandafter\expandafter\expandafter\doassignsometextprefixnop + \else + \expandafter\expandafter\expandafter\doassignsometextprefixyes + \fi + \else + \expandafter\doassignsometextprefixyes + \fi{#1}} + +\ifdefined\Word\else \let\Word\relax \fi + +% Checking saves some 8K in the compressed format and getting rid of the embedded +% \handletextprefix was good for another 6K. In the end the new solution is not +% even that inefficient. And the checking is done at format generation time anyway. + +\def\doassignsometextprefixyes#1[#2,#3,#4]% + {\edef\!!stringa{#2}% + \edef\!!stringb{#3}% + \ifx\!!stringb\empty + \ifx\!!stringa\empty + \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{\empty\empty}% + \else + \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}\empty}% + \fi + \else + \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}{#3}}% + \fi} + +\def\doassignsometextprefixnop[#1][#2]% + {} %D By changing the meaning of \type {\handletextprefix} we %D can filter the left and right labeltext as well as convert @@ -100,86 +124,61 @@ %D %D The latter one has an upcased alternative \type{\LABELTEXT}. -% \def\labellanguage{\currentmainlanguage} -% \def\headlanguage {\currentmainlanguage} - -% \def\labellanguage{\defaultlanguage\currentmainlanguage} -% \def\headlanguage {\defaultlanguage\currentmainlanguage} - \def\labellanguage{\reallanguagetag{\defaultlanguage\currentmainlanguage}} \def\headlanguage {\reallanguagetag{\defaultlanguage\currentmainlanguage}} \appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate -\unexpanded\def\headtext - {\let\handletextprefix\firstoftwoarguments - \let\reporttextprefixerror\doreporttextprefixerror - \global\labeltextdonetrue - \dogetupsometextprefix\headlanguage\c!title} - -\unexpanded\def\leftlabeltext - {\let\handletextprefix\firstoftwoarguments - \let\reporttextprefixerror\doreporttextprefixerror - \global\labeltextdonetrue - \dogetupsometextprefix\labellanguage\c!label} - -\unexpanded\def\rightlabeltext - {\let\handletextprefix\secondoftwoarguments - \let\reporttextprefixerror\doreporttextprefixerror - \global\labeltextdonetrue - \dogetupsometextprefix\labellanguage\c!label} - -\unexpanded\def\LEFTLABELTEXT - {\def\handletextprefix##1##2{\uppercase{##1}}\DOLABELTEXT} - -\unexpanded\def\RIGHTLABELTEXT - {\def\handletextprefix##1##2{\uppercase{##2}}\DOLABELTEXT} - -\def\DOLABELTEXT#1% - {\bgroup - \the\everyuppercase - \let\reporttextprefixerror\doreporttextprefixerror - \global\labeltextdonetrue - \dogetupsometextprefix\labellanguage\c!label{#1}% not \labeltext (see \MONTH) - \egroup} - -\let\labeltext \leftlabeltext -\let\LABELTEXT \LEFTLABELTEXT - -\unexpanded\def\labeltexts#1#2{\leftlabeltext{#1}#2\rightlabeltext{#1}} -\unexpanded\def\LABELTEXTS#1#2{\LEFTLABELTEXT{#1}#2\RIGHTLABELTEXT{#1}} - -\newif\iflabeltextdone % needs to be reset elsewhere -\newif\iftracelabels % shows missing labels - -\def\doreporttextprefixerror#1#2#3% - {\iftracelabels{\tttf[#2:~#3/#1]~}\fi} - -\def\dosetexpandedheadlabeltext#1#2#3% - {\bgroup - \let\handletextprefix\firstoftwoarguments - \let\reporttextprefixerror\gobblethreearguments - \keepencodedtokens % test on multilingual pascal, ok in stretched - %\dontexpandencodedtokens % not usable in token handler - \expanded - {\egroup\noexpand\def\noexpand#2% watch out, no \edef - {\dogetupsometextprefix{\headlanguage}{#1}{#3}}}} - -\def\setexpandedheadtext {\dosetexpandedheadlabeltext\c!title} -\def\setexpandedlabeltext{\dosetexpandedheadlabeltext\c!label} - -\def\dogetupsometextprefix#1#2#3% must be expandable ! #1 == language - {\ifcsname#2#1#3\endcsname - \csname#2#1#3\endcsname - \else\ifcsname\??la#1\s!default\endcsname - \expandafter\dogetupsometextprefix\csname\??la#1\s!default\endcsname{#2}{#3}% - \else\ifcsname#2#3\endcsname - \csname#2#3\endcsname - \else\ifcsname#1\s!en#3\endcsname - \csname#2\s!en#3\endcsname +\def\dummytextprefix{\empty\empty} + +\def\dogetupsomelabeltext#1% + {\ifcsname\??ml\labellanguage#1\endcsname + \expandafter\let\expandafter\thetextprefix\csname\??ml\labellanguage#1\endcsname + \else\ifcsname\??la\labellanguage\s!default\endcsname + \expandafter\dogetupsometextprefix\csname\??la\labellanguage\s!default\endcsname\??ml#1% + \else\ifcsname\??ml#1\endcsname + \expandafter\let\expandafter\thetextprefix\csname\??ml#1\endcsname + \else\ifcsname\??ml\s!en#1\endcsname + \expandafter\let\expandafter\thetextprefix\csname\??ml\s!en#1\endcsname \else - % \doreporttextprefixerror{#1}{#2}{#3}% + \let\thetextprefix\dummytextprefix \fi\fi\fi\fi} + +\def\dogetupsomeheadtext#1% + {\ifcsname\??mh\headlanguage#1\endcsname + \expandafter\let\expandafter\thetextprefix\csname\??mh\headlanguage#1\endcsname + \else\ifcsname\??la\headlanguage\s!default\endcsname + \expandafter\dogetupsometextprefix\csname\??la\headlanguage\s!default\endcsname\??mh#1% + \else\ifcsname\??mh#1\endcsname + \expandafter\let\expandafter\thetextprefix\csname\??mh#1\endcsname + \else\ifcsname\??mh\s!en#1\endcsname + \expandafter\let\expandafter\thetextprefix\csname\??mh\s!en#1\endcsname + \else + \let\thetextprefix\dummytextprefix + \fi\fi\fi\fi} + +% The WORD variants are a bit inefficient when #1/#2 are empty but they are +% seldom used (one can better set the style). + +\let\flushleftlabeltext \firstoftwoarguments +\let\flushrightlabeltext\secondoftwoarguments + +\def\flushleftlabelWORD #1#2{\WORD{#1}} +\def\flushrightlabelWORD#1#2{\WORD{#2}} + +\def\flushbothlabeltexts#1#2#3{#1#3#2} +\def\flushbothlabelTEXTS#1#2#3{\WORD{#1}#3\WORD{#2}} + +\unexpanded\def\headtext #1{\dogetupsomeheadtext {#1}\expandafter\flushleftlabeltext \thetextprefix} +\unexpanded\def\leftlabeltext #1{\dogetupsomelabeltext{#1}\expandafter\flushleftlabeltext \thetextprefix} +\unexpanded\def\rightlabeltext#1{\dogetupsomelabeltext{#1}\expandafter\flushrightlabeltext\thetextprefix} +\unexpanded\def\LEFTLABELTEXT #1{\dogetupsomelabeltext{#1}\expandafter\flushleftlabelWORD \thetextprefix} +\unexpanded\def\RIGHTLABELTEXT#1{\dogetupsomelabeltext{#1}\expandafter\flushrightlabelWORD\thetextprefix} +\unexpanded\def\labeltexts #1{\dogetupsomelabeltext{#1}\expandafter\flushbothlabeltexts\thetextprefix} % #2 +\unexpanded\def\LABELTEXTS #1{\dogetupsomelabeltext{#1}\expandafter\flushbothlabelTEXTS\thetextprefix} % #2 + +\let\labeltext\leftlabeltext +\let\LABELTEXT\LEFTLABELTEXT \ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi @@ -201,15 +200,8 @@ %D head and label texts without replacing predefined ones. %D These are internal macros. -\def\xdopresetsometextprefix[#1][#2=#3]% - {\ifundefined{#1#2}\doassignsometextprefix[#1\reallanguagetag{#2}][#3,,]\fi} - -\def\dopresetsometextprefix - {\let\dodocommand\xdopresetsometextprefix - \dotripleempty\dodosetupsometextprefix} - -\def\presetheadtext {\dopresetsometextprefix[\c!title]} -\def\presetlabeltext{\dopresetsometextprefix[\c!label]} +\def\presetheadtext {\settrue\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix} +\def\presetlabeltext{\settrue\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix} %D \macros %D {translate} diff --git a/tex/context/base/lang-mis.tex b/tex/context/base/lang-mis.mkii index eb7bb1a04..eb7bb1a04 100644 --- a/tex/context/base/lang-mis.tex +++ b/tex/context/base/lang-mis.mkii diff --git a/tex/context/base/lang-mis.mkiv b/tex/context/base/lang-mis.mkiv new file mode 100644 index 000000000..eb7bb1a04 --- /dev/null +++ b/tex/context/base/lang-mis.mkiv @@ -0,0 +1,683 @@ +%D \module +%D [ file=lang-mis, +%D version=1997.03.20, % used to be supp-lan.tex +%D title=\CONTEXT\ Language Macros, +%D subtitle=Compounds, +%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 Language Macros / Compounds} + +%D \gdef\starttest +%D {\blank +%D \noindent +%D \halign\bgroup\tt##\hskip2em&##\hskip2em&##\cr} +%D +%D \gdef\stoptest +%D {\egroup +%D \blank} +%D +%D \gdef\test#1% +%D {\defconvertedargument\ascii{#1}\ascii&\hyphenatedword{#1}\cr} + +\unprotect + +%D One of \TEX's strong points in building paragraphs is the way +%D hyphenations are handled. Although for real good hyphenation +%D of non||english languages some extensions to the program are +%D needed, fairly good results can be reached with the standard +%D mechanisms and an additional macro, at least in Dutch. + +%D \CONTEXT\ originates in the wish to typeset educational +%D materials, especially in a technical environment. In +%D production oriented environments, a lot of compound words +%D are used. Because the Dutch language poses no limits on +%D combining words, we often favor putting dashes between those +%D words, because it facilitates reading, at least for those +%D who are not that accustomed to it. +%D +%D In \TEX\ compound words, separated by a hyphen, are not +%D hyphenated at all. In spite of the multiple pass paragraph +%D typesetting this can lead to parts of words sticking into +%D the margin. The solution lays in saying \type +%D {spoelwater||terugwinunit} instead of \type +%D {spoelwater-terugwinunit}. By using a one character command +%D like \type {|}, delimited by the same character \type {|}, +%D we get ourselves both a decent visualization (in \TEXEDIT\ +%D and colored verbatim we color these commands yellow) and an +%D efficient way of combining words. +%D +%D The sequence \type{||} simply leads to two words connected by +%D a hyphen. Because we want to distinguish such a hyphen from +%D the one inserted when \TEX\ hyphenates a word, we use a bit +%D longer one. +%D +%D \hyphenation {spoel-wa-ter te-rug-win-unit} +%D +%D \starttest +%D \test {spoelwater||terugwinunit} +%D \stoptest +%D +%D As we already said, the \type{|} is a command. This commands +%D accepts an optional argument before it's delimiter, which is +%D also a \type{|}. +%D +%D \hyphenation {po-ly-meer che-mie} +%D +%D \starttest +%D \test {polymeer|*|chemie} +%D \stoptest +%D +%D Arguments like \type{*} are not interpreted and inserted +%D directly, in contrary to arguments like: +%D +%D \starttest +%D \test {polymeer|~|chemie} +%D \test {|(|polymeer|)|chemie} +%D \test {polymeer|(|chemie|)| } +%D \stoptest +%D +%D Although such situations seldom occur |<|we typeset thousands +%D of pages before we encountered one that forced us to enhance +%D this mechanism|>| we also have to take care of comma's. +%D +%D \hyphenation {uit-stel-len} +%D +%D \starttest +%D \test {op||, in|| en uitstellen} +%D \stoptest +%D +%D The next special case (concerning quotes) was brought to my +%D attention by Piet Tutelaers, one of the driving forces +%D behind rebuilding hyphenation patterns for the dutch +%D language.\footnote{In 1996 the spelling of the dutch +%D language has been slightly reformed which made this topic +%D actual again.} We'll also take care of this case. +%D +%D \starttest +%D \test {AOW|'|er} +%D \test {cd|'|tje} +%D \test {ex|-|PTT|'|er} +%D \test {rock|-|'n|-|roller} +%D \stoptest +%D +%D Tobias Burnus pointed out that I should also support +%D something like +%D +%D \starttest +%D \test {well|_|known} +%D \stoptest +%D +%D to stress the compoundness of hyphenated words. +%D +%D Of course we also have to take care of the special case: +%D +%D \starttest +%D \test {text||color and ||font} +%D \stoptest + +%D \macros +%D {installdiscretionaries} +%D +%D The mechanism described here is one of the older inner parts +%D of \CONTEXT. The most recent extensions concerns some +%D special cases as well as the possibility to install other +%D characters as delimiters. The prefered way of specifying +%D compound words is using \type{||}, which is installed by: +%D +%D \starttyping +%D \installdiscretionaries || - +%D \stoptyping +%D +%D Some alternative definitions are: +%D +%D \startbuffer +%D \installdiscretionaries ** - +%D \installdiscretionaries ++ - +%D \installdiscretionaries // - +%D \installdiscretionaries ~~ - +%D \stopbuffer +%D +%D \typebuffer +%D +%D after which we can say: +%D +%D \bgroup +%D \getbuffer +%D \starttest +%D \test {test**test**test} +%D \test {test++test++test} +%D \test {test//test//test} +%D \test {test~~test~~test} +%D \stoptest +%D \egroup + +%D \macros +%D {compoundhyphen, +%D beginofsubsentence,endofsubsentence} +%D +%D Now let's go to the macros. First we define some variables. +%D In the main \CONTEXT\ modules these can be tuned by a setup +%D command. Watch the (maybe) better looking compound hyphen. + +\ifx\compoundhyphen \undefined \def\compoundhyphen{\hbox{-\kern-.25ex-}} \fi + +\ifx\beginofsubsentence \undefined \def\beginofsubsentence{\hbox{---}} \fi +\ifx\endofsubsentence \undefined \def\endofsubsentence {\hbox{---}} \fi + +%D The last two variables are needed for subsentences +%D |<|like this one|>| which we did not yet mention. +%D +%D We want to enable breaking but at the same time don't want +%D compound characters like |-| or || to be separated from the +%D words. \TEX\ hackers will recognise the next two macro's: + +\ifx\prewordbreak \undefined \def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi +%ifx\postwordbreak \undefined \def\postwordbreak{\penalty\zerocount \prewordbreak } \fi +\ifx\postwordbreak \undefined \def\postwordbreak{\penalty\zerocount \hskip\zeropoint\relax} \fi + +\ifx\hspaceamount \undefined \def\hspaceamount#1#2{.16667em} \fi % language specific + +%D \macros +%D {beginofsubsentencespacing,endofsubsentencespacing} +%D +%D In the previous macros we provided two hooks which can be +%D used to support nested sub||sentences. In \CONTEXT\ these +%D hooks are used to insert a small space when needed. + +\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi +\ifx\endofsubsentencespacing \undefined \let\endofsubsentencespacing \relax \fi + +%D The following piece of code is a torture test compound +%D hndling. The \type {\relax} before the \type {\ifmmode} is +%D needed because of the alignment scanner (in \ETEX\ this +%D problem is not present because there a protected macro is +%D not expanded. Thanks to Tobias Burnus for providing this +%D example. +%D +%D \startformula +%D \left|f(x_n)-{1\over2}\right| = +%D {\cases{|{1\over2}-x_n| &for $0\le x_n < {1\over2}$\cr +%D |x_n-{1\over2}| &for ${1\over2}<x_n\le1$ \cr}} +%D \stopformula + +\def\@tmd@action@{@tmd@a@} +\def\@tmd@text@ {@tmd@t@} +\def\@tmd@math@ {@tmd@m@} +\def\@tmd@both@ {@tmd@b@} + +\def\installdiscretionary#1#2% + {\setevalue{\@tmd@math@\detokenize{#1}}{\detokenize{#1}}% + \setvalue {\@tmd@text@\detokenize{#1}}{#2}% + \setvalue {\@tmd@both@\detokenize{#1}}{\discretionarycommand#1}% + \scratchcounter\expandafter`\detokenize{#1}% + \@EA\uedcatcodecommand\@EA\ctxcatcodes\@EA\scratchcounter\csname\@tmd@both@\detokenize{#1}\endcsname} + +\def\handlemathmodediscretionary#1{\executeifdefined{\@tmd@math@\detokenize{#1}}\donothing} +\def\handletextmodediscretionary#1{\executeifdefined{\@tmd@text@\detokenize{#1}}\donothing} + +\def\installdiscretionaries#1#2{\writestatus\m!systems{use \string \installdiscretionary}} % obsolete + +\chardef\discretionarymode\plusone + +\def\ignorediscretionaries + {\chardef\discretionarymode\zerocount} + +\def\discretionarycommand + {% if direct if, we need \relax for lookahead in math mode + \csname + \ifcase\discretionarymode + \strippedcsname\dononemodediscretionary + \else\ifmmode + \strippedcsname\domathmodediscretionary + \else + \strippedcsname\dotextmodediscretionary + \fi\fi + \endcsname} + +\def\dononemodediscretionary#1% + {\detokenize{#1}} + +%D The macro \type{\checkbeforediscretionary} takes care of +%D loners like \type{||word}, while it counterpart +%D \type{\checkafterdiscretionary} is responsible for handling +%D the comma. + +\newsignal\compoundbreakpoint + +\newconditional\punctafterdiscretionary +\newconditional\spaceafterdiscretionary + +\def\checkbeforediscretionary + {\ifvmode\dontleavehmode\fi + \ifhmode + \begingroup + \setbox\scratchbox\lastbox + \ifzeropt\wd\scratchbox + \let\postwordbreak\prewordbreak + \fi + \box\scratchbox\relax + \endgroup + \fi} + +\def\checkafterdiscretionary + {\setfalse\punctafterdiscretionary + \setfalse\spaceafterdiscretionary + \ifx\blankspace\nextnext \settrue \spaceafterdiscretionary \else + \ifx\space \nextnext \settrue \spaceafterdiscretionary \else + \ifx .\nextnext \settrue \punctafterdiscretionary \else + \ifx ,\nextnext \settrue \punctafterdiscretionary \else + \ifx :\nextnext \settrue \punctafterdiscretionary \else + \ifx ;\nextnext \settrue \punctafterdiscretionary \fi\fi\fi\fi\fi\fi} + +\let\domathmodediscretionary\handlemathmodediscretionary + +\def\dotextmodediscretionary#1% + {\bgroup + \let\nextnextnext\egroup + \def\next##1#1% + {\def\next{\activedododotextmodediscretionary#1{##1}}% + \futurelet\nextnext\next}% + \next} + +\def\activedododotextmodediscretionary#1#2% + {\edef\discretionarytoken{\detokenize{#2}}% + \def\textmodediscretionary{\handletextmodediscretionary{#1}}% + \checkafterdiscretionary + \ifx\discretionarytoken\empty + \ifx#1\nextnext % takes care of ||| and +++ and ...... + \ifcsname\@tmd@action@\string#1\endcsname + \csname\@tmd@action@\string#1\endcsname + \else\ifconditional\spaceafterdiscretionary + \prewordbreak\hbox{\string#1}\relax + \else\ifconditional\punctafterdiscretionary + \prewordbreak\hbox{\string#1}\relax + \else + \prewordbreak\hbox{\string#1}\prewordbreak + \fi\fi\fi + \def\nextnextnext{\afterassignment\egroup\let\next=}% + \else + \checkbeforediscretionary + % the next line has been changed (20050203) + % \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak + % but an hbox blocks a possible \discretionary + \ifcsname\@tmd@action@\endcsname + \csname\@tmd@action@\endcsname + \else\ifconditional\spaceafterdiscretionary + \prewordbreak\textmodediscretionary\relax + \else\ifconditional\punctafterdiscretionary + \prewordbreak\textmodediscretionary\relax + \else + \prewordbreak\textmodediscretionary\prewordbreak + \fi\fi\fi + % \prewordbreak\textmodediscretionary\nextnext\allowbreak\postwordbreak + \fi + \else\ifcsname\@tmd@action@\discretionarytoken\endcsname + \csname\@tmd@action@\discretionarytoken\endcsname + \else + \checkbeforediscretionary + \ifconditional\spaceafterdiscretionary + \prewordbreak\hbox{#2}\relax + \else\ifconditional\punctafterdiscretionary + \prewordbreak\hbox{#2}\relax + \else + \prewordbreak\discretionary{\hbox{#2}}{}{\hbox{#2}}\allowbreak\postwordbreak + \fi\fi + \fi\fi + \nextnextnext} % lookahead in commands + +%D \macros +%D {directdiscretionary} +%D +%D In those situations where the nature of characters is +%D less predictable, we can use the more direct approach: + +\def\directdiscretionary + {\csname + \ifcase\discretionarymode + \strippedcsname\dononemodediscretionary + \else + \strippedcsname\dodirectdiscretionary + \fi + \endcsname} + +\def\indirectdiscretionary + {\csname + \ifcase\discretionarymode + \strippedcsname\dononemodediscretionary + \else + \strippedcsname\doindirectdiscretionary + \fi + \endcsname} + +\unexpanded\def\dodirectdiscretionary#1% + {\edef\discretionarytoken{\detokenize{#1}}% + \let\textmodediscretionary\compoundhyphen + \executeifdefined{\@tmd@action@\discretionarytoken}{\indirectdiscretionary{#1}}} + +\unexpanded\def\doindirectdiscretionary#1% + {\prewordbreak\discretionary{\hbox{#1}}{}{\hbox{#1}}\allowbreak\postwordbreak} + +\def\definetextmodediscretionary #1 + {\setvalue{\@tmd@action@\detokenize{#1}}} + +% \start \hsize 1mm +% test |||test test|||, test\blank +% test test|-|, test|-| and test|-|test\blank +% test test|_|, test|_| and test|_|test\blank +% test cd|'|tje\blank +% test |(|test test|)|, test\blank +% test test test|x|, test\blank +% test|~|test +% test|^|test +% \stop + +\def\hyphenliketextmodediscretionary#1#2% + {\ifconditional\spaceafterdiscretionary + \prewordbreak\hbox{#1}\relax + \else\ifconditional\punctafterdiscretionary + \prewordbreak\hbox{#1}\relax + \else + \prewordbreak#2\postwordbreak % was prewordbreak + \fi\fi} + +\definetextmodediscretionary {} + {\hyphenliketextmodediscretionary\textmodehyphen\textmodehyphendiscretionary} + +\definetextmodediscretionary - + {\hyphenliketextmodediscretionary\normalhyphen\normalhyphendiscretionary} + +\definetextmodediscretionary _ + {\hyphenliketextmodediscretionary\composedhyphen\composedhyphendiscretionary} + +\definetextmodediscretionary ) + {\hyphenliketextmodediscretionary{)}{\discretionary{-)}{}{)}}} + +\definetextmodediscretionary ( + {\ifdim\lastskip>\zeropoint + (\prewordbreak + \else + \prewordbreak\discretionary{}{(-}{(}\prewordbreak + \fi} + +\definetextmodediscretionary ~ + {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak} + +\definetextmodediscretionary ' + {\prewordbreak\discretionary{-}{}{'}\postwordbreak} + +\definetextmodediscretionary ^ + {\prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}% + \allowbreak\postwordbreak} % bugged + +\definetextmodediscretionary < + {\beginofsubsentence\prewordbreak\beginofsubsentencespacing} + +\definetextmodediscretionary > + {\endofsubsentencespacing\prewordbreak\endofsubsentence} + +\definetextmodediscretionary = + {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen} + +% french + +\definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{:}:} +\definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{;};} +\definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{?}?} +\definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{!}!} + +\definetextmodediscretionary * + {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak} + +% spanish + +\definetextmodediscretionary ?? {\prewordbreak\questiondown} +\definetextmodediscretionary !! {\prewordbreak\exclamdown} + +% \ifx\normalcompound\undefined \let\normalcompound=| \fi + +%D \installdiscretionary | + +%D \installdiscretionary + = + +\def\defaultdiscretionaryhyphen{\compoundhyphen} + +\installdiscretionary | \defaultdiscretionaryhyphen % installs in ctx and prt will fall back on it + +%D \macros +%D {fakecompoundhyphen} +%D +%D In headers and footers as well as in active pieces of text +%D we need a dirty hack. Try to imagine what is needed to +%D savely break the next text across a line and at the same +%D time make the words interactive. +%D +%D \starttyping +%D \goto{Some||Long||Word} +%D \stoptyping + +\def\fakecompoundhyphen + {\def\|{\mathortext\vert\dofakecompoundhyphen}} + +\def\dofakecompoundhyphen + {\def##1|% + {\doifelsenothing{##1}\compoundhyphen{##1}% + \kern\compoundbreakpoint\allowbreak}} + +%D \macros +%D {midworddiscretionary} +%D +%D If needed, one can add a discretionary hyphen using \type +%D {\midworddiscretionary}. This macro does the same as +%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented +%D earlier, this one also looks ahead for spaces and grouping +%D tokens. + +\def\midworddiscretionary + {\futurelet\next\domidworddiscretionary} + +\def\domidworddiscretionary + {\ifx\next\blankspace\else + \ifx\next\bgroup \else + \ifx\next\egroup \else + \discretionary{-}{}{}% + \fi\fi\fi} + +%D \macros +%D {installcompoundcharacter} +%D +%D When Tobias Burnus started translating the dutch manual of +%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support +%D the \type{german.sty} method of handling compound +%D characters, especially the umlaut. This package is meant for +%D use with \PLAIN\ \TEX\ as well as \LATEX. +%D +%D I decided to implement compound character support as +%D versatile as possible. As a result one can define his own +%D compound character support, like: +%D +%D \starttyping +%D \installcompoundcharacter "a {\"a} +%D \installcompoundcharacter "e {\"e} +%D \installcompoundcharacter "i {\"i} +%D \installcompoundcharacter "u {\"u} +%D \installcompoundcharacter "o {\"o} +%D \installcompoundcharacter "s {\SS} +%D \stoptyping +%D +%D or even +%D +%D \starttyping +%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}} +%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}} +%D \stoptyping +%D +%D The support is not limited to alphabetic characters, so the +%D next definition is also valid. +%D +%D \starttyping +%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}} +%D \stoptyping +%D +%D The implementation looks familiar and uses the same tricks as +%D mentioned earlier in this module. We take care of two +%D arguments, which complicates things a bit. + +\def\@nc@{@nc@} % normal character +\def\@cc@{@cc@} % compound character +\def\@cs@{@cs@} % compound characters +\def\@cx@{@cx@} % compound definition + +%D When we started working on MK IV code, we needed a different +%D approach for defining the active character itself. In MK II as +%D well as in MK IV we now use the catcode vectors. + +\chardef\compoundcharactermode\plusone + +\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping + {\ifcase\compoundcharactermode + % ignore mode + \else + \chardef\thecompoundcharacter`#1% + \@EA\chardef\csname\@nc@\string#1\endcsname\thecompoundcharacter + \def\!!stringa{#3}% + \@EA\def\csname\ifx\!!stringa\empty\@cc@\else\@cs@\fi\detokenize{#1#2#3}\endcsname{#4}% + \setevalue{\@cx@\detokenize{#1}}{\noexpand\handlecompoundcharacter{\detokenize{#1}}}% beter nr's +% \@EA\letcatcodecommand\@EA\prtcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname +% \@EA\letcatcodecommand\@EA\texcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname + \@EA\letcatcodecommand\@EA\ctxcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname + \fi} + +%D In order to serve the language specific well, we will introduce +%D a namespace: + +% \ifx\currentlanguage\undefined + \let\compoundcharacterclass\empty +% \else +% \def\compoundcharacterclass{\currentlanguage} +% \fi + +\def\@cc@{@cc@\compoundcharacterclass} % compound character +\def\@cs@{@cs@\compoundcharacterclass} % compound characters + +%D We can also ignore definitions (needed in for instance \XML). Beware, +%D this macro is supposed to be used grouped! + +\def\ignorecompoundcharacter + {\chardef\compoundcharactermode\zerocount} + +\let\restorecompoundcharacter \gobbleoneargument % obsolete +\let\enableactivediscretionaries\relax % obsolete + +%D In handling the compound characters we have to take care of +%D \type{\bgroup} and \type{\egroup} tokens, so we end up with +%D a multi||step interpretation macro. We look ahead for a +%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being +%D no user of this mechanism, the credits for testing them goes +%D to Tobias Burnus, the first german user of \CONTEXT. +%D +%D We define these macros as \type{\long} because we can +%D expect \type{\par} tokens. We need to look into the future +%D with \type{\futurelet} to prevent spaces from +%D disappearing. + +\def\handlecompoundcharacter#1% + {\def\xhandlecompoundcharacter{\dohandlecompoundcharacter{#1}}% + \futurelet\next\xhandlecompoundcharacter} + +\def\dohandlecompoundcharacter + {\ifx\next\bgroup + %\@EA\dodohandlecompoundcharacter % handle "{ee} -> \"ee + %\@EA\gobbleoneargument % forget "{ee} -> ee + \@EA\handlecompoundcharacterone % ignore "{ee} -> "ee + \else\ifx\next\egroup + \@EAEAEA\donohandlecompoundcharacter + \else\ifx\next\blankspace + \@EA\@EAEAEA\@EA\donohandlecompoundcharacter + \else + \@EA\@EAEAEA\@EA\dodohandlecompoundcharacter + \fi\fi\fi} + +\def\donohandlecompoundcharacter#1{\csname\@nc@\string#1\endcsname} + +\def\dododohandlecompoundcharacter + {\ifx\next\bgroup + \@EA\handlecompoundcharacterone + \else\ifx\next\egroup + \@EAEAEA\handlecompoundcharacterone + \else\ifx\next\blankspace + \@EA\@EAEAEA\@EA\handlecompoundcharacterone + \else + \@EA\@EAEAEA\@EA\handlecompoundcharactertwo + \fi\fi\fi} + +\def\dodohandlecompoundcharacter#1#2% preserve space + {\def\xdodohandlecompoundcharacter{\dododohandlecompoundcharacter#1#2}% + \futurelet\next\xdodohandlecompoundcharacter} + +%D Besides taken care of the grouping and space tokens, we have +%D to deal with three situations. First we look if the next +%D character equals the first one, if so, then we just insert +%D the original. Next we look if indeed a compound character is +%D defined. We either execute the compound character or just +%D insert the first. So we have +%D +%D \starttyping +%D <key><key> <key><known> <key><unknown> +%D \stoptyping +%D +%D In later modules we will see how these commands are used. + +\long\def\handlecompoundcharacterone#1#2% + {\if\string#1\string#2% was: \ifx#1#2% + \def\next{\csname\@nc@\string#1\endcsname}% + \else\ifcsname\@cc@\string#1\string#2\endcsname + \def\next{\csname\@cc@\string#1\string#2\endcsname}% + \else + \def\next{\csname\@nc@\string#1\endcsname#2}% + \fi\fi + \next} + +\long\def\handlecompoundcharactertwo#1#2#3% + {\if\string#1\string#2% + \def\next{\csname\@nc@\string#1\endcsname#3}% + \else\ifcsname\@cs@\string#1\string#2\string#3\endcsname + \def\next{\csname\@cs@\string#1\string#2\string#3\endcsname}% + \else\ifcsname\@cc@\string#1\string#2\endcsname + \def\next{\csname\@cc@\string#1\string#2\endcsname#3}% + \else + \def\next{\csname\@nc@\string#1\endcsname#2#3}% + \fi\fi\fi + \next} + +%D For very obscure applications (see for an application \type +%D {lang-sla.tex}) we provide: + +\def\simplifiedcompoundcharacter#1#2% + {\ifcsname\@cc@\string#1\string#2\endcsname + \@EA\@EA\@EA\firstofoneargument\csname\@cc@\string#1\string#2\endcsname + \else + #2% + \fi} + +%D \macros +%D {disablediscretionaries,disablecompoundcharacter} +%D +%D Occasionally we need to disable this mechanism. For the +%D moment we assume that \type {|} is used. + +\let\disablediscretionaries \ignorediscretionaries +\let\disablecompoundcharacters\ignorecompoundcharacter + +%D \macros +%D {normalcompound} +%D +%D Handy in for instance XML. (Kind of obsolete) + +\ifx\normalcompound\undefined \let\normalcompound=| \fi + +\protect \endinput diff --git a/tex/context/base/lang-run.tex b/tex/context/base/lang-run.mkii index 4b332cfb9..4b332cfb9 100644 --- a/tex/context/base/lang-run.tex +++ b/tex/context/base/lang-run.mkii diff --git a/tex/context/base/lang-sla.tex b/tex/context/base/lang-sla.tex index 0832e3f46..cd3c75b61 100644 --- a/tex/context/base/lang-sla.tex +++ b/tex/context/base/lang-sla.tex @@ -184,28 +184,6 @@ \installlanguage [cz] [\s!cs] -% If this is really needed we should make an enco-fhr. -% -% \startlanguagespecifics[\s!hr] -% -% %\installcompoundcharacter /, {\handlequotation\c!leftquotation} -% %\installcompoundcharacter /' {\handlequotation\c!rightquotation} -% -% \def\setupHRlanguage% -% {\setuplanguage -% [\s!hr] -% [\c!leftsentence=\leftguillemot, -% \c!rightsentence=\rightguillemot, -% \c!leftsubsentence=\leftsubguillemot, -% \c!rightsubsentence=\rightsubguillemot]} -% -% \installcompoundcharacter /< {{\setupHRlanguage|<|}} -% \installcompoundcharacter /> {{\setupHRlanguage|>|}} -% -% \installcompoundcharacter /- {|-|} -% -% \stoplanguagespecifics - % labels \setupheadtext [\s!pl] [\v!content=Spis tre\sacute ci] diff --git a/tex/context/base/lang-spe.mkiv b/tex/context/base/lang-spe.mkiv deleted file mode 100644 index 6f32888e6..000000000 --- a/tex/context/base/lang-spe.mkiv +++ /dev/null @@ -1,111 +0,0 @@ -%D \module -%D [ file=lang-spe, -%D version=2002.05.07, % 1996.01.25, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Specifics, -%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 Language Macros / Specifics} - -%D In \MKIV\ we will get away from this feature. See \MKII\ file -%D for comments. So, consider this a temporary feature. - -\unprotect - -%D \macros -%D {everyresetlanguagespecifics,resetlanguagespecifics} -%D -%D Cleanup macros. - -\newevery \everyresetlanguagespecifics \relax - -\def\resetlanguagespecifics - {\ifcase\protectionlevel - \the\everyresetlanguagespecifics - \fi} - -\appendtoks - \resetlanguagespecifics -\to \everycleanupfeatures - -%D \macros -%D {startlanguagespecifics,enablelanguagespecifics} - -\def\startlanguagespecifics - {\bgroup - \catcode`\^^I=\@@ignore - \catcode`\^^M=\@@ignore - \catcode`\^^L=\@@ignore - \dodoubleempty\dostartlanguagespecifics} % get rid of spaces - -\long\def\dostartlanguagespecifics[#1][#2]#3\stoplanguagespecifics - {\egroup - \processcommalist[#1]{\dosetlanguagespecifics{#3}}} - -\long\def\dosetlanguagespecifics#1#2% specifics language - {\ifcsname\??la#2\??la\endcsname \else - \expandafter\newtoks\csname\??la#2\??la\endcsname - \fi - \csname\??la#2\??la\endcsname\@EA{\the\csname\??la#2\??la\endcsname#1}% - \bgroup - \setbox\scratchbox\hbox{\enablelanguagespecifics[#2]}% - \ifdim\wd\scratchbox>\zeropoint - \showmessage\m!linguals7{#2,\the\wd\scratchbox\space}\wait - \else - \showmessage\m!linguals8{#2}% - \fi - \egroup - \doif{#2}\currentmainlanguage{\enablelanguagespecifics[#2]}} - -\def\forgetlanguagespecifics[#1]% - {\ifcsname\??la#1\??la\endcsname - \csname\??la#1\??la\endcsname\emptytoks - \fi} - -% \def\enablelanguagespecifics[#1]% no default language fallback (yet) -% {\ifcsname\??la#1\??la\endcsname -% \the\csname\??la#1\??la\endcsname\relax -% \fi} - -\def\enablelanguagespecifics[#1]% - {\edef\askedlanguagespecificslanguage{\defaultlanguage{#1}}% - \ifcsname\??la\askedlanguagespecificslanguage\??la\endcsname - \the\csname\??la\askedlanguagespecificslanguage\??la\endcsname - \fi} - -%D \macros -%D {ordinaldaynumber, highordinalstr, ordinalstr} -%D -%D Efficient general ordinal number converters are sometimes -%D difficult to implement. Fortunately dates never exceed the -%D number~31. - -\ifx\high \undefined \let\high \firstofoneargument \fi % todo -\ifx\notsmallcapped\undefined \let\notsmallcapped\firstofoneargument \fi % todo - -\def\highordinalstr#1{\high{\notsmallcapped{#1}}} -\def\ordinalstr #1{\notsmallcapped{#1}} - -\def\ordinaldaynumber#1% \strippedcsname\ordinaldaynumber - {\expanded{\executeifdefined{\currentlanguage ordinaldaynumber}% - \noexpand\firstofoneargument{\number#1}}} - -%D Language specific converters have definitions like: -%D -%D \starttyping -%D \def\enordinaldaynumber#1{...} -%D \stoptyping -%D -%D Examples can be found in the other \type {lang} modules. - -\appendtoks - \ifprocessingXML \else \resetlanguagespecifics \fi -\to \everylanguage - -\protect \endinput diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua new file mode 100644 index 000000000..4f136ad79 --- /dev/null +++ b/tex/context/base/lpdf-ano.lua @@ -0,0 +1,573 @@ +if not modules then modules = { } end modules ['lpdf-ano'] = { + version = 1.001, + comment = "companion to lpdf-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local tostring, format, rep = tostring, string.rep, string.format +local texcount = tex.count + +local trace_references = false trackers.register("references.references", function(v) trace_references = v end) +local trace_destinations = false trackers.register("references.destinations", function(v) trace_destinations = v end) +local trace_bookmarks = false trackers.register("references.bookmarks", function(v) trace_bookmarks = v end) + +local variables = interfaces.variables +local constants = interfaces.constants + +local nodeinjections = backends.pdf.nodeinjections +local codeinjections = backends.pdf.codeinjections +local registrations = backends.pdf.registrations + +jobreferences = jobreferences or { } +jobreferences.runners = jobreferences.runners or { } +jobreferences.specials = jobreferences.specials or { } +jobreferences.handlers = jobreferences.handlers or { } +jobreferences.executers = jobreferences.executers or { } + +local runners = jobreferences.runners +local specials = jobreferences.specials +local handlers = jobreferences.handlers +local executers = jobreferences.executers + +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfreference = lpdf.reference +local pdfunicode = lpdf.unicode +local pdfconstant = lpdf.constant + +local pdfreserveobj = pdf.reserveobj +local pdfimmediateobj = pdf.immediateobj +local pdfpageref = tex.pdfpageref + +local pdfannot = nodes.pdfannot +local pdfdest = nodes.pdfdest + +local pdf_uri = pdfconstant("URI") +local pdf_gotor = pdfconstant("GoToR") +local pdf_goto = pdfconstant("GoTo") +local pdf_launch = pdfconstant("Launch") +local pdf_javascript = pdfconstant("JavaScript") +local pdf_link = pdfconstant("Link") +local pdf_n = pdfconstant("N") +local pdf_t = pdfconstant("T") +local pdf_border = pdfarray { 0, 0, 0 } + +local cache = { } + +local function pagedest(n) + local pd = cache[n] + if not pd then + local a = pdfarray { + pdfreference(pdfpageref(n)), + pdfconstant("Fit") + } + pd = pdfreference(pdfimmediateobj(tostring(a))) + cache[n] = pd + end + return pd +end + +lpdf.pagedest = pagedest + +local function link(url,filename,destination,page,actions) + if filename and filename ~= "" then + if file.basename(filename) == tex.jobname then + return false + else + filename = file.addsuffix(filename,"pdf") + end + end + if url and url ~= "" then + if filename and filename ~= "" then + if destination and destination ~= "" then + url = file.join(url,filename).."#"..destination + else + url = file.join(url,filename) + end + end + return pdfdictionary { + S = pdf_uri, + URI = url, + } + elseif filename and filename ~= "" then + return pdfdictionary { + S = pdf_gotor, + F = pdffile, + D = destination and destination ~= "" and destination, + NewWindow = (actions.newwindow and true) or nil, + } + elseif destination and destination ~= "" then + local realpage, p = texcount.realpageno, tonumber(page) + if not p then + -- sorry + elseif p > realpage then + texcount.referencepagestate = 3 + elseif p < realpage then + texcount.referencepagestate = 2 + else + texcount.referencepagestate = 1 + end + return pdfdictionary { + S = pdf_goto, + D = destination, + } + elseif page and page ~= "" then + local realpage, p = texcount.realpageno, tonumber(page) + if p then + if p > realpage then + texcount.referencepagestate = 3 + elseif p < realpage then + texcount.referencepagestate = 2 + else + texcount.referencepagestate = 1 + end + return pdfdictionary { + S = pdf_goto, + D = pagedest(p), + } + else + commands.writestatus("references","invalid page reference: %s",page or "?") + end + end + return false +end + +lpdf.link = link + +function lpdf.launch(program,parameters) + if program and program ~= "" then + local d = pdfdictionary { + S = pdf_launch, + F = program, + D = ".", + } + if parameters and parameters ~= "" then + d.P = parameters + end + return d + end +end + +function lpdf.javascript(name,arguments) + local script = javascripts.code(name,arguments) -- make into object (hash) + if script then + return pdfdictionary { + S = pdf_javascript, + JS = script, + } + end +end + +local function pdfaction(actions) + local nofactions = #actions + texcount.referencepagestate = 0 -- goodie, as we do all in the backend, we need to set it here too + if nofactions > 0 then + local a = actions[1] + local action = runners[a.kind] + if action then + action = action(a,actions) + end + if action then + local first = action + for i=2,nofactions do + local a = actions[i] + local what = runners[a.kind] + if what then + what = what(a,actions) + end + if what then + action.next = what + action = what + else + -- error + return nil + end + end + return first + end + end +end + +lpdf.pdfaction = pdfaction + +function codeinjections.prerollreference(actions) + local main = actions and pdfaction(actions) + if main then + main = pdfdictionary { + Subtype = pdf_link, + Border = pdf_border, + H = (not actions.highlight and pdf_n) or nil, + A = main, + -- does not work at all in spite of specification + -- OC = (actions.layer and lpdf.layerreferences[actions.layer]) or nil, + -- OC = backends.pdf.layerreference(actions.layer), + } + return main("A") -- todo: cache this, maybe weak + end +end + +-- local cache = { } -- no real gain in thsi +-- +-- function codeinjections.prerollreference(actions) +-- local main = actions and pdfaction(actions) +-- if main then +-- main = pdfdictionary { +-- Subtype = pdf_link, +-- Border = pdf_border, +-- H = (not actions.highlight and pdf_n) or nil, +-- A = main, +-- } +-- local cm = cache[main] +-- if not cm then +-- cm = "/A ".. tostring(pdfreference(pdfimmediateobj(tostring(main)))) +-- cache[main] = cm +-- end +-- return cm +-- end +-- end + +function nodeinjections.reference(width,height,depth,prerolled) + if prerolled then + if swapdir then + width = - width + end + if trace_references then + logs.report("references","w=%s, h=%s, d=%s, a=%s",width,height,depth,prerolled) + end + return pdfannot(width,height,depth,prerolled) + end +end + +function nodeinjections.destination(width,height,depth,name,view) + if swapdir then + width = - width + end + if trace_destinations then + logs.report("destinations","w=%s, h=%s, d=%s, n=%s, v=%s",width,height,depth,name,view or "no view") + end + return pdfdest(width,height,depth,name,view) +end + +-- runners and specials + +local method = "internal" + +runners["inner"] = function(var,actions) + if method == "internal" then + local vir = var.i.references + local internal = vir and vir.internal + if internal then + var.inner = "aut:"..internal + end + end + return link(nil,nil,var.inner,var.r,actions) +end + +runners["inner with arguments"] = function(var,actions) + return false +end + +runners["outer"] = function(var,actions) + return link(nil,var.o,nil,nil,actions) -- var.o ? +end + +runners["outer with inner"] = function(var,actions) + -- todo: resolve url/file name + return link(nil,var.f,var.inner,var.r,actions) +end + +runners["special outer with operation"] = function(var,actions) + return false +end + +runners["special outer"] = function(var,actions) + return false +end + +runners["special"] = function(var,actions) + local handler = specials[var.special] + return handler and handler(var,actions) +end + +runners["outer with inner with arguments"] = function(var,actions) + return false +end + +runners["outer with special and operation and arguments"] = function(var,actions) + return false +end + +runners["outer with special"] = function(var,actions) + return false +end + +runners["outer with special and operation"] = function(var,actions) + return false +end + +runners["special operation"] = runners["special"] +runners["special operation with arguments"] = runners["special"] + +function specials.internal(var,actions) + local i = tonumber(var.operation) + local v = jobreferences.internals[i] + if not v then + -- error + elseif method == "internal" then + -- named + return link(nil,nil,"aut:"..i,v.references.realpage,actions) + else + -- page + return link(nil,nil,nil,v.references.realpage,actions) + end +end + +specials.i = specials.internal + +function specials.page(var,actions) + local p = jobreferences.pages[var.operation] + if type(p) == "function" then + p = p() + end + return link(nil,nil,nil,p or var.operation,actions) +end + +function specials.url(var,actions) + local url = var.operation + if url then + local u = urls[url] + if u then + local u, f = u[1], u[2] + if f and f ~= "" then + url = u .. "/" .. f + else + url = u + end + end + end + return link(url,nil,var.arguments,nil,actions) +end + +function specials.file(var,actions) + local file = var.operation + if file then + local f = files[file] + if f then + file = f[1] + end + end + return link(nil,file,var.arguments,nil,actions) +end + +function specials.program(var,content) + local program = var.operation + if program then + local p = programs[program] + if p then + program = p[1] + end + end + return lpdf.launch(program,var.arguments) +end + +function specials.javascript(var) + return lpdf.javascript(var.operation,var.arguments) +end + +specials.JS = specials.javascript + +local pdf_named = pdfconstant("Named") + +executers.importform = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ImportFDF") } +executers.exportform = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ExportFDF") } +executers.first = pdfdictionary { S = pdf_named, N = pdfconstant("FirstPage") } +executers.previous = pdfdictionary { S = pdf_named, N = pdfconstant("PrevPage") } +executers.next = pdfdictionary { S = pdf_named, N = pdfconstant("NextPage") } +executers.last = pdfdictionary { S = pdf_named, N = pdfconstant("LastPage") } +executers.backward = pdfdictionary { S = pdf_named, N = pdfconstant("GoBack") } +executers.forward = pdfdictionary { S = pdf_named, N = pdfconstant("GoForward") } +executers.print = pdfdictionary { S = pdf_named, N = pdfconstant("Print") } +executers.exit = pdfdictionary { S = pdf_named, N = pdfconstant("Quit") } +executers.close = pdfdictionary { S = pdf_named, N = pdfconstant("Close") } +executers.save = pdfdictionary { S = pdf_named, N = pdfconstant("Save") } +executers.savenamed = pdfdictionary { S = pdf_named, N = pdfconstant("SaveAs") } +executers.opennamed = pdfdictionary { S = pdf_named, N = pdfconstant("Open") } +executers.help = pdfdictionary { S = pdf_named, N = pdfconstant("HelpUserGuide") } +executers.toggle = pdfdictionary { S = pdf_named, N = pdfconstant("FullScreen") } +executers.search = pdfdictionary { S = pdf_named, N = pdfconstant("Find") } +executers.searchagain = pdfdictionary { S = pdf_named, N = pdfconstant("FindAgain") } +executers.gotopage = pdfdictionary { S = pdf_named, N = pdfconstant("GoToPage") } +executers.query = pdfdictionary { S = pdf_named, N = pdfconstant("AcroSrch:Query") } +executers.queryagain = pdfdictionary { S = pdf_named, N = pdfconstant("AcroSrch:NextHit") } +executers.fitwidth = pdfdictionary { S = pdf_named, N = pdfconstant("FitWidth") } +executers.fitheight = pdfdictionary { S = pdf_named, N = pdfconstant("FitHeight") } + +local function fieldset(arguments) + -- [\dogetfieldset{#1}] + return nil +end + +function executers.resetform(arguments) + arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments) + return pdfdictionary { + S = pdfconstant("ResetForm"), + Field = fieldset(arguments[1]) + } +end + +local formmethod = "post" -- "get" "post" +local formformat = "xml" -- "xml" "html" "fdf" + +-- bit 3 = html bit 6 = xml bit 4 = get + +local flags = { + get = { + html = 12, fdf = 8, xml = 40, + }, + post = { + html = 4, fdf = 0, xml = 32, + } +} + +function executers.submitform(arguments) + arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments) + local flag = flags[formmethod] or flags.post + flag = (flag and (flag[formformat] or flag.xml)) or 32 -- default: post, xml + return pdfdictionary { + S = pdfconstant("ResetForm"), + F = fieldset(arguments[1]), + Field = fieldset(arguments[2]), + Flags = flag, + -- \PDFsubmitfiller + } +end + +function executers.hide(arguments) + return pdfdictionary { + S = pdfconstant("Hide"), + H = true, + T = arguments, + } +end + +function executers.show(arguments) + return pdfdictionary { + S = pdfconstant("Hide"), + H = false, + T = arguments, + } +end + +local pdf_movie = pdfconstant("Movie") +local pdf_start = pdfconstant("Start") +local pdf_stop = pdfconstant("Stop") +local pdf_resume = pdfconstant("Resume") +local pdf_pause = pdfconstant("Pause") + +local function movie_or_sound(operation,arguments) + arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments) + return pdfdictionary { + S = pdf_movie, + T = format("movie %s",arguments[1] or "noname"), + Operation = operation, + } +end + +function executers.startmovie (arguments) return movie_or_sound(pdf_start ,arguments) end +function executers.stopmovie (arguments) return movie_or_sound(pdf_stop ,arguments) end +function executers.resumemovie(arguments) return movie_or_sound(pdf_resume,arguments) end +function executers.pausemovie (arguments) return movie_or_sound(pdf_pause ,arguments) end + +function executers.startsound (arguments) return movie_or_sound(pdf_start ,arguments) end +function executers.stopsound (arguments) return movie_or_sound(pdf_stop ,arguments) end +function executers.resumesound(arguments) return movie_or_sound(pdf_resume,arguments) end +function executers.pausesound (arguments) return movie_or_sound(pdf_pause ,arguments) end + +function specials.action(var) + local operation = var.operation + if var.operation and operation ~= "" then + local e = executers[operation] + if type(e) == "table" then + return e + elseif type(e) == "function" then + return e(var.arguments) + end + end +end + +--~ entry.A = pdfdictionary { +--~ S = pdfconstant("GoTo"), +--~ D = .... +--~ } + +local function build(levels,start,parent,method) + local startlevel = levels[start][1] + local i, n = start, 0 + local child, entry, m, prev, first, last, f, l +-- to be tested: i can be nil + while i and i <= #levels do + local li = levels[i] + local level, title, reference, open = li[1], li[2], li[3], li[4] + if level == startlevel then + if trace_bookmarks then + logs.report("bookmark","%3i %s%s %s",realpage,rep(" ",level-1),(open and "+") or "-",title) + end + local prev = child + child = pdfreserveobj() + if entry then + entry.Next = child and pdfreference(child) + pdfimmediateobj(prev,tostring(entry)) + end + entry = pdfdictionary { + Title = pdfunicode(title), + Parent = parent, + Prev = prev and pdfreference(prev), + } + if method == "internal" then + entry.Dest = "aut:" .. reference.internal + else -- if method == "page" then + entry.Dest = pagedest(reference.realpage) + end + if not first then first, last = child, child end + prev = child + last = prev + n = n + 1 + i = i + 1 + elseif level < startlevel then + pdfimmediateobj(child,tostring(entry)) + return i, n, first, last + elseif i < #levels and level > startlevel then + i, m, f, l = build(levels,i,pdfreference(child),method) + entry.Count = (open and m) or -m + if m > 0 then + entry.First, entry.Last = pdfreference(f), pdfreference(l) + end + else + -- missing intermediate level but ok + i, m, f, l = build(levels,i,pdfreference(child),method) + entry.Count = (open and m) or -m + if m > 0 then + entry.First, entry.Last = pdfreference(f), pdfreference(l) + end + pdfimmediateobj(child,tostring(entry)) + return i, n, first, last + end + end + pdfimmediateobj(child,tostring(entry)) + return _, n, first, last +end + +function codeinjections.addbookmarks(levels,method) + local parent = pdfreserveobj() + local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal") + local dict = pdfdictionary { + Type = pdfconstant("Outlines"), + First = pdfreference(first), + Last = pdfreference(last), + Count = m, + } + pdfimmediateobj(parent,tostring(dict)) + lpdf.addtocatalog("Outlines",lpdf.reference(parent)) +end diff --git a/tex/context/base/lpdf-col.lua b/tex/context/base/lpdf-col.lua new file mode 100644 index 000000000..219188369 --- /dev/null +++ b/tex/context/base/lpdf-col.lua @@ -0,0 +1,150 @@ +if not modules then modules = { } end modules ['lpdf-mis'] = { + version = 1.001, + comment = "companion to back-pdf.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local type = type +local format, gsub = string.format, string.gsub + +-- colors = colors or { } +-- transparencies = transparencies or { } + +local registercolor = colors.register +local registertransparancy = transparencies.register +local colorsvalue = colors.value +local transparenciesvalue = transparencies.value + +-- Literals needed to inject code in the mp stream, we cannot use attributes there +-- since literals may have qQ's, much may go away once we have mplib code in place. +-- +-- This module assumes that some functions are defined in the colors namespace +-- which mostlikely will be loaded later. + +function lpdf.color(model,ca,default) -- todo: use gray when no color + local cv = colorsvalue(ca) + if cv then + if model == 1 then + model = cv[1] + end + if model == 2 then + local s = cv[2] + return format("%s g %s G",s,s) + elseif model == 3 then + local r, g, b = cv[3], cv[4], cv[5] + return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b) + elseif model == 4 then + local c, m, y, k = cv[6],cv[7],cv[8],cv[9] + return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k) + else + local n,f,d,p = cv[10],cv[11],cv[12],cv[13] + if type(p) == "string" then + p = gsub(p,","," ") -- brr misuse of spot + end + return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p) + end + else + return format("%s g %s G",default or 0,default or 0) + end +end + +function lpdf.transparency(ct,default) + -- beware, we need this hack because normally transparencies are not + -- yet registered and therefore the number is not not known ... we + -- might use the attribute number itself in the future + local ct = transparenciesvalue(ct) + if ct then + return format("/Tr%s gs",registertransparancy(nil,ct[1],ct[2])) + else + return "/Tr0 gs" + end +end + +function lpdf.colorvalue(model,ca,default) + local cv = colorsvalue(ca) + if cv then + if model == 1 then + model = cv[1] + end + if model == 2 then + return format("%s",cv[2]) + elseif model == 3 then + return format("%s %s %s",cv[3],cv[4],cv[5]) + elseif model == 4 then + return format("%s %s %s %s",cv[6],cv[7],cv[8],cv[9]) + else + return format("%s",cv[13]) + end + else + return format("%s",default or 0) + end +end + +function lpdf.fdfcolor(model,ca,default) + local cv = colorsvalue(ca) + if cv then + if model == 1 then + model = cv[1] + end + if model == 2 then + return format("[%s]",cv[2]) + elseif model == 3 then + return format("[%s %s %s]",cv[3],cv[4],cv[5]) + elseif model == 4 then + return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9]) + elseif model == 4 then + return format("[%s]",cv[13]) + end + else + return format("[%s]",default or 0) + end +end + +function lpdf.colorspace(model,ca) + local cv = colorsvalue(ca) + if cv then + if model == 1 then + model = cv[1] + end + if model == 2 then + return "DeviceGray" + elseif model == 3 then + return "DeviceRGB" + elseif model == 4 then + return "DeviceCMYK" + end + end + return "DeviceGRAY" +end + +-- by registering we getconversion for free (ok, at the cost of overhead) + +local intransparency = false +local pdfcolor = lpdf.color + +function lpdf.rgbcode(model,r,g,b) + return pdfcolor(model,registercolor('color',nil,'rgb',r,g,b)) +end +function lpdf.cmykcode(model,c,m,y,k) + return pdfcolor(model,registercolor('color',nil,'cmyk',c,m,y,k)) +end +function lpdf.graycode(model,s) + return pdfcolor(model,registercolor('color',nil,'gray',s)) +end +function lpdf.spotcode(model,n,f,d,p) + return pdfcolor(model,registercolor('color',nil,'spot',n,f,d,p)) -- incorrect +end +function lpdf.transparencycode(a,t) + intransparency = true + return format("/Tr%s gs",registertransparancy(nil,a,t)) +end +function lpdf.finishtransparencycode() + if intransparency then + intransparency = false + return "/Tr0 gs" -- we happen to know this -) + else + return "" + end +end diff --git a/tex/context/base/lpdf-fld.lua b/tex/context/base/lpdf-fld.lua new file mode 100644 index 000000000..b9c63347f --- /dev/null +++ b/tex/context/base/lpdf-fld.lua @@ -0,0 +1,747 @@ +if not modules then modules = { } end modules ['lpdf-fld'] = { + version = 1.001, + comment = "companion to lpdf-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- cleaned up, e.g. no longer older viewers +-- always kids so no longer explicit main / clone / copy +-- some optimizations removed (will come bakc if needed) + +local gmatch, lower, format = string.gmatch, string.lower, string.format + +local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes + +local variables = interfaces.variables + +local nodeinjections = backends.pdf.nodeinjections +local codeinjections = backends.pdf.codeinjections +local registrations = backends.pdf.registrations + +local registeredsymbol = codeinjections.registeredsymbol + +local pdfstream = lpdf.stream +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfreference = lpdf.reference +local pdfunicode = lpdf.unicode +local pdfstring = lpdf.string +local pdfconstant = lpdf.constant +local pdftoeight = lpdf.toeight + +local pdfimmediateobj = pdf.immediateobj +local pdfreserveobj = pdf.reserveobj + +local submitoutputformat = 0 -- 0=unknown 1=HTML 2=FDF 3=XML => not yet used, needs to be checked + +local splitter = lpeg.splitat("=>") + +local formats = { + html = 1, fdf = 2, xml = 3, +} + +function codeinjections.setformsmethod(name) + submitoutputformat = formats[lower(name)] or 3 +end + +local flag = { + MultiLine = 4096, -- 13 + NoToggleToOff = 16384, -- 15 + Radio = 32768, -- 16 + PushButton = 65536, -- 17 + PopUp = 131072, -- 18 + Edit = 262144, -- 19 + RadiosInUnison = 33554432, -- 26 + DoNotSpellCheck = 4194304, -- 23 + DoNotScroll = 8388608, -- 24 + ReadOnly = 1, -- 1 + Required = 2, -- 2 + NoExport = 4, -- 3 + Password = 8192, -- 14 + Sort = 524288, -- 20 + FileSelect = 1048576, -- 21 +} + +local plus = { + Invisible = 1, -- 1 + Hidden = 2, -- 2 + Printable = 4, -- 3 + NoView = 32, -- 6 + ToggleNoView = 256, -- 9 + AutoView = 256, -- 288 (6+9) +} + +flag.readonly = flag.ReadOnly +flag.required = flag.Required +flag.protected = flag.Password +flag.sorted = flag.Sort +flag.unavailable = flag.NoExport +flag.nocheck = flag.DoNotSpellCheck +flag.fixed = flag.DoNotScroll +flag.file = flag.FileSelect + +plus.hidden = plus.Hidden +plus.printable = plus.Printable +plus.auto = plus.AutoView + +-- some day .. lpeg with function + +local function fieldflag(specification) + local o, n = specification.options, 0 + if o and o ~= "" then + for f in gmatch(o,"[^, ]+") do + n = n + (flag[f] or 0) + end + end + return n +end + +local function fieldplus(specification) + local o, n = specification.options, 0 + if o and o ~= "" then + for p in gmatch(o,"[^, ]") do + n = n + (plus[p] or 0) + end + end + return n +end + + +local function checked(what) + if what and what ~= "" then + local set, bug = jobreferences.identify("",what) + return not bug and #set > 0 and lpdf.pdfaction(set) + end +end + +local function fieldactions(specification) -- share actions + local d, a = { }, nil + a = specification.mousedown if a and a ~= "" then d.D = checked(a) end + a = specification.mouseup if a and a ~= "" then d.U = checked(a) end + a = specification.enterregion if a and a ~= "" then d.E = checked(a) end + a = specification.exitregion if a and a ~= "" then d.X = checked(a) end + a = specification.afterkeystroke if a and a ~= "" then d.K = checked(a) end + a = specification.formatresult if a and a ~= "" then d.F = checked(a) end + a = specification.validateresult if a and a ~= "" then d.V = checked(a) end + a = specification.calculatewhatever if a and a ~= "" then d.C = checked(a) end + a = specification.focusin if a and a ~= "" then d.Fo = checked(a) end + a = specification.focusout if a and a ~= "" then d.Bl = checked(a) end + -- a = specification.openpage if a and a ~= "" then d.PO = checked(a) end + -- a = specification.closepage if a and a ~= "" then d.PC = checked(a) end + -- a = specification.visiblepage if a and a ~= "" then d.PV = checked(a) end + -- a = specification.invisiblepage if a and a ~= "" then d.PI = checked(a) end + return next(d) and pdfdictionary(d) +end + +-- fonts and color + +local fontnames = { + rmtf = "Times-Roman", rmbf = "Times-Bold", + rmit = "Times-Italic", rmsl = "Times-Italic", + rmbi = "Times-BoldItalic", rmbs = "Times-BoldItalic", + sstf = "Helvetica", ssbf = "Helvetica-Bold", + ssit = "Helvetica-Oblique", sssl = "Helvetica-Oblique", + ssbi = "Helvetica-BoldOblique", ssbs = "Helvetica-BoldOblique", + tttf = "Courier", ttbf = "Courier-Bold", + ttit = "Courier-Oblique", ttsl = "Courier-Oblique", + ttbi = "Courier-BoldOblique", ttbs = "Courier-BoldOblique", +} + +local usedfonts = { } + +local function fieldsurrounding(specification) + local tag = (specification.fontstyle or "tt") .. (specification.fontalternative or "tf") + if not fontnames[tag] then + tag = "tttf" + end + local size = specification.fontsize + local stream = pdfstream { + pdfconstant(tag), + format("%s Tf",(size and (number.dimenfactors.bp * size)) or 12), + } + usedfonts[tag] = true + -- add color to stream: 0 g + -- move up with "x.y Ts" + return tostring(stream) +end + +local function registerfonts() + if next(usedfonts) then + local d = pdfdictionary() + for tag, _ in next, usedfonts do + local f = pdfdictionary { + Type = pdfconstant("Font"), + Subtype = pdfconstant("Type1"), -- todo + Name = pdfconstant(tag), + BaseFont = pdfconstant(fontnames[tag]), + } + d[tag] = pdfreference(pdfimmediateobj(tostring(f))) + end + return d + end +end + +-- cache + +local function fieldattributes(specification) +--~ return pdfarray { +--~ -- BG = -- backgroundcolor +--~ -- BC = -- framecolor +--~ } + return nil +end + +-- symbols + +local function fieldappearances(specification) + -- todo: caching + local values = specification.values + local default = specification.default + if not values then + -- error + return + end + local v = aux.settings_to_array(values) + local n, r, d + if #v == 1 then + n, r, d = v[1], v[1], v[1] + elseif #v == 2 then + n, r, d = v[1], v[1], v[2] + else + n, r, d = v[1], v[2], v[3] + end + local appearance = pdfdictionary { -- cache this one + N = registeredsymbol(n), R = registeredsymbol(r), D = registeredsymbol(d), + } + return lpdf.sharedobj(tostring(appearance)) +end + +local function fieldstates(specification) + -- splitter not needed, wil go + -- todo: caching + local values, default = specification.values, specification.default + if not values then + -- error + return + end + local v = aux.settings_to_array(values) + local yes, off + if #v == 1 then + yes, off = v[1], v[1] + else + yes, off = v[1], v[2] + end + local yesshown, yesvalue = splitter:match(yes) + if not (yesshown and yesvalue) then + yesshown = yes, yes + end + yes = aux.settings_to_array(yesshown) + local offshown, offvalue = splitter:match(off) + if not (offshown and offvalue) then + offshown = off, off + end + off = aux.settings_to_array(offshown) + if #yes == 1 then + yesn, yesr, yesd = yes[1], yes[1], yes[1] + elseif #yes == 2 then + yesn, yesr, yesd = yes[1], yes[1], yes[2] + else + yesn, yesr, yesd = yes[1], yes[2], yes[3] + end + if #off == 1 then + offn, offr, offd = off[1], off[1], off[1] + elseif #off == 2 then + offn, offr, offd = off[1], off[1], off[2] + else + offn, offr, offd = off[1], off[2], off[3] + end + if not yesvalue then + yesvalue = yesn + end + if not offvalue then + offvalue = offn + end + if default == yesn then + default = pdfconstant(yesn) + else + default = pdfconstant("Off") + end + local appearance = pdfdictionary { -- mayeb also cache components + N = pdfdictionary { [yesn] = registeredsymbol(yesn), Off = registeredsymbol(offn) }, + R = pdfdictionary { [yesr] = registeredsymbol(yesr), Off = registeredsymbol(offr) }, + D = pdfdictionary { [yesd] = registeredsymbol(yesd), Off = registeredsymbol(offd) } + } + local appearanceref = lpdf.sharedobj(tostring(appearance)) + return appearanceref, default +end + +local function fieldoptions(specification) + local values = specification.values + local default = specification.default + if values then + local v = aux.settings_to_array(values) + for i=1,#v do + local vi = v[i] + local shown, value = splitter:match(vi) + if shown and value then + v[i] = pdfarray { pdfunicode(value), shown } + else + v[i] = pdfunicode(v[i]) + end + end + return pdfarray(v) + end +end + +local function radiodefault(parent,field) + local default, values = parent.default, parent.values + if not default or default == "" then + values = aux.settings_to_array(values) + default = values[1] + end + local name = field.name + local fieldvalues = aux.settings_to_array(field.values) + local yes, off = fieldvalues[1], fieldvalues[2] or fieldvalues[1] + if not default then + return pdfconstant(yes) + elseif default == name then + return pdfconstant(default) + else + return pdfconstant("Off") + end +end + +-- layers + +local function fieldlayer(specification) -- we can move this in line + local layer = specification.layer + return (layer and lpdf.layerreferences[layer]) or nil +end + +-- defining + +local fields, radios, fieldsets, calculationset = { }, { }, { }, nil + +function codeinjections.definefieldset(tag,list) + fieldsets[tag] = list +end + +function codeinjections.getfieldset(tag) + return fieldsets[tag] +end + +local function fieldsetlist(tag) + if tag then + local ft = fieldsets[tag] + if ft then + local a = pdfarray() + for name in gmatch(list,"[^, ]+") do + local f = field[name] + if f and f.pobj then + a[#a+1] = pdfreference(f.pobj) + end + end + return a + end + end +end + +function codeinjections.setfieldcalculationset(tag) + calculationset = tag +end + +local function predefinesymbols(specification) + local values = specification.values + if values then + local a, b = splitter:match(values) + codeinjections.presetsymbollist(a or values) + end +end + +function codeinjections.getdefaultfieldvalue(name) + local f = fields[name] + if f then + local values = f.values + local default = f.default + if not default or default == "" then + local a, b = splitter:match(values) + values = a or values + for name in gmatch(list,"[^, ]+") do + default = name + break + end + end + if default then + tex.sprint(ctxcatcodes,default) + end + end +end + + +function codeinjections.definefield(specification) + local n = specification.name + local f = fields[n] + if not f then + local kind = specification.kind + if not kind then + -- name and kind are mandate + elseif kind == "radio" then + local values = specification.values + if values and values ~= "" then + values = aux.settings_to_array(values) + for v=1,#values do + radios[values[v]] = { parent = n } + end + fields[n] = specification + else + -- invalid radio specification + end + elseif kind == "sub" then + -- not in main field list ! + local radio = radios[n] + if radio then + -- merge specification + for key, value in next, specification do + radio[key] = value + end + end + predefinesymbols(specification) + else + fields[n] = specification + predefinesymbols(specification) + end + else + -- already done + end +end + +function codeinjections.clonefield(specification) + local p = specification.parent + local c = specification.children + if not p or not c then + -- parent and children are mandate + else + for n in gmatch(c,"[^, ]+") do + local f = fields[n] + if f and not f.done then + -- already done + else + fields[n] = specification + end + end + end +end + +function codeinjections.getfieldgroup(name) + local f = fields[name] + if f and f.group then + texsprint(ctxcatcodes,f.group) + end +end + +-- + +function codeinjections.doiffieldset(tag) + commands.testcase(fieldsets[tag]) +end + +function codeinjections.doiffieldelse(name) + commands.testcase(fields[name]) +end + +-- + +local alignments = { + flushleft = 0, right = 0, + center = 1, middle = 1, + flushright = 2, left = 2, +} + +local function fieldalignment(specification) + return alignments[specification.align] or 0 +end + +local function enhance(specification,option) + local so = specification.options + if so and so ~= "" then + specification.options = so .. "," .. option + else + specification.options = option + end + return specification +end + +-- finish + +local collected = pdfarray() + +function codeinjections.finishfields() + for name, field in next, fields do + local kids = field.kids + if kids then + pdfimmediateobj(field.kobj,tostring(kids)) + end + local pobj = field.pobj + end + for name, field in next, radios do + local kids = field.kids + if kids then + pdfimmediateobj(field.kobj,tostring(kids)) + end + end + if #collected > 0 then + local acroform = pdfdictionary { + NeedAppearances = true, + Fields = pdfreference(pdfimmediateobj(tostring(collected))), + DR = pdfdictionary { Font = registerfonts() }, + CO = fieldsetlist(calculationset), + DA = "/tttf 12 Tf 0 g", + } + lpdf.addtocatalog("AcroForm",pdfreference(pdfimmediateobj(tostring(acroform)))) + end + lpdf.finishfields = function() end +end + +local pdf_widget = pdfconstant("Widget") +local pdf_tx = pdfconstant("Tx") +local pdf_ch = pdfconstant("Ch") +local pdf_btn = pdfconstant("Btn") +local pdf_yes = pdfconstant("Yes") +local pdf_p = pdfconstant("P") -- None Invert Outline Push +local pdf_n = pdfconstant("N") -- None Invert Outline Push +-- +local pdf_no_rect = pdfarray { 0, 0, 0, 0 } + +local methods = { } + +function codeinjections.typesetfield(name,specification) + local field = fields[name] or radios[name] + if not field then + tex.write("error: " .. name) + -- unknown field + return + end + local method = methods[field.kind] + if method then + method(name,specification) + end +end + +-- can be optional multipass optimization (share objects) + +local function save_parent(field,specification,d) + local kn = pdfreserveobj() + d.Kids = pdfreference(kn) + field.kobj = kn + field.kids = pdfarray() + local pn = pdfimmediateobj(tostring(d)) + field.pobj = pn + collected[#collected+1] = pdfreference(pn) +end + +local function save_kid(field,specification,d) + local kn = pdfreserveobj() + field.kids[#field.kids+1] = pdfreference(kn) + node.write(nodes.pdfannot(specification.width,specification.height,0,d(),kn)) +end + +function methods.line(name,specification,extras) + local field = fields[name] + local kind = field.kind + if not field.pobj then + if extras then + enhance(specification,extras) + end + local text = pdfunicode(specification.default) + local d = pdfdictionary { + Subtype = pdf_widget, + T = pdfunicode(specification.title), + F = fieldplus(specification), + Ff = fieldflag(specification), + OC = fieldlayer(specification), + MK = fieldsurrounding(specification), + AA = fieldactions(specification), + FT = pdf_tx, + Q = fieldalignment(specification), + MaxLen = (specification.length == 0 and 1000) or specification.length, + DV = text, + V = text, + } + save_parent(field,specification,d) + field.specification = specification + end + specification = field.specification or { } -- todo: radio spec + local d = pdfdictionary { + Subtype = pdf_widget, + Parent = pdfreference(field.pobj), + F = fieldplus(specification), + DA = fieldattributes(specification), + OC = fieldlayer(specification), + MK = fieldsurrounding(specification), + AA = fieldactions(specification), + Q = fieldalignment(specification) + } + save_kid(field,specification,d) +end + +function methods.text(name,specification) + methods.line(name,specification,"MultiLine") +end + +function methods.choice(name,specification,extras) + local field = fields[name] + local kind = field.kind + local d + if not field.pobj then + if extras then + enhance(specification,extras) + end + local d = pdfdictionary { + Subtype = pdf_widget, + T = pdfunicode(specification.title), + F = fieldplus(specification), + Ff = fieldflag(specification), + OC = fieldlayer(specification), + AA = fieldactions(specification), + FT = pdf_ch, + Opt = fieldoptions(field), + } + save_parent(field,specification,d) + field.specification = specification + end + specification = field.specification or { } + local d = pdfdictionary { + Subtype = pdf_widget, + Parent = pdfreference(field.pobj), + F = fieldplus(specification), + DA = fieldattributes(specification), + OC = fieldlayer(specification), + AA = fieldactions(specification), + } + save_kid(field,specification,d) +end + +function methods.popup(name,specification) + methods.choice(name,specification,"PopUp") +end +function methods.combo(name,specification) + methods.choice(name,specification,"PopUp,Edit") +end + +-- probably no default appearance needed for first kid + +function methods.check(name,specification) + -- no /Opt because (1) it's messy - see pdf spec, (2) it discouples kids and + -- contrary to radio there is no way to associate then + local field = fields[name] + local kind = field.kind + local appearance, default = fieldstates(field) + if not field.pobj then + local d = pdfdictionary { + Subtype = pdf_widget, + T = pdfunicode(specification.title), + F = fieldplus(specification), + Ff = fieldflag(specification), + OC = fieldlayer(specification), + AA = fieldactions(specification), + FT = pdf_btn, + DV = default, + V = default, + AS = default, + AP = appearance, + H = pdf_n, + } + save_parent(field,specification,d) + field.specification = specification + end + specification = field.specification or { } -- todo: radio spec + local d = pdfdictionary { + Subtype = pdf_widget, + Parent = pdfreference(field.pobj), + F = fieldplus(specification), + DA = fieldattributes(specification), + OC = fieldlayer(specification), + AA = fieldactions(specification), + DV = default, + V = default, + AS = default, + AP = appearance, + H = pdf_n, + } + save_kid(field,specification,d) +end + +function methods.push(name,specification) + local field = fields[name] + local kind = field.kind + if not field.pobj then + enhance(specification,"PushButton") + local d = pdfdictionary { + Subtype = pdf_widget, + T = pdfunicode(specification.title), + F = fieldplus(specification), + Ff = fieldflag(specification), + OC = fieldlayer(specification), + AA = fieldactions(specification), + FT = pdf_btn, + AP = fieldappearances(field), + H = pdf_p, + } + save_parent(field,specification,d) + field.specification = specification + end + specification = field.specification or { } -- todo: radio spec + local d = pdfdictionary { + Subtype = pdf_widget, + Parent = pdfreference(field.pobj), + F = fieldplus(specification), + DA = fieldattributes(specification), + OC = fieldlayer(specification), + AA = fieldactions(specification), + AP = fieldappearances(field), + H = pdf_p, + } + save_kid(field,specification,d) +end + +function methods.sub(name,specification) + local field = radios[name] + if not field then + return + end + local parent = fields[field.parent] + if not parent then + return + end + if not parent.pobj then + local specification = parent.specification or { } + enhance(specification,"Radio,RadiosInUnison") + local d = pdfdictionary { + T = parent.name, + FT = pdf_btn, + Rect = pdf_no_rect, + F = fieldplus(specification), + Ff = fieldflag(specification), + H = pdf_n, + } + save_parent(parent,specification,d) + end + local appearance = fieldstates(field) + local default = radiodefault(parent,field) + local d = pdfdictionary { + Subtype = pdf_widget, + Parent = pdfreference(parent.pobj), + F = fieldplus(specification), + DA = fieldattributes(specification), + OC = fieldlayer(specification), + AA = fieldactions(specification), + DV = default, + V = default, + AS = default, + AP = appearance, + H = pdf_n, + } + save_kid(parent,specification,d) +end diff --git a/tex/context/base/lpdf-grp.lua b/tex/context/base/lpdf-grp.lua new file mode 100644 index 000000000..119d25ee4 --- /dev/null +++ b/tex/context/base/lpdf-grp.lua @@ -0,0 +1,70 @@ +if not modules then modules = { } end modules ['lpdf-grp'] = { + version = 1.001, + comment = "companion to lpdf-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local format = string.format + +local nodeinjections = backends.pdf.nodeinjections +local codeinjections = backends.pdf.codeinjections +local registrations = backends.pdf.registrations + +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfconstant = lpdf.constant +local pdfreference = lpdf.reference + +local pdfreserveobj = pdf.reserveobj +local pdfimmediateobj = pdf.immediateobj + +local function shade(stype,name,domain,color_a,color_b,n,colorspace,coordinates) + local f = pdfdictionary { + FunctionType = 2, + Domain = pdfarray(domain), -- domain is actually a string + C0 = pdfarray(color_a), + C1 = pdfarray(color_b), + N = tonumber(n), + } + local s = pdfdictionary { + ShadingType = stype, + ColorSpace = pdfconstant(colorspace), + Function = pdfreference(pdfimmediateobj(tostring(f))), + Coords = pdfarray(coordinates), + Extend = pdfarray { true, true }, + } + lpdf.adddocumentshade(name,pdfreference(pdfimmediateobj(tostring(s)))) +end + +function lpdf.circularshade(name,domain,color_a,color_b,n,colorspace,coordinates) + shade(3,name,domain,color_a,color_b,n,colorspace,coordinates) +end + +function lpdf.linearshade(name,domain,color_a,color_b,n,colorspace,coordinates) + shade(2,name,domain,color_a,color_b,n,colorspace,coordinates) +end + +function lpdf.colorspec(model,ca,default) + if ca and ca > 0 then + local cv = colors.value(ca) + if cv then + if model == 1 then + model = cv[1] + end + if model == 2 then + return pdfarray { cv[2] } + elseif model == 3 then + return pdfarray { cv[3],cv[4],cv[5] } + elseif model == 4 then + return pdfarray { cv[6],cv[7],cv[8],cv[9] } + elseif model == 5 then + return pdfarray { cv[13] } + end + end + end + if default then + return default + end +end diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua index 92207d728..bc89c4872 100644 --- a/tex/context/base/lpdf-ini.lua +++ b/tex/context/base/lpdf-ini.lua @@ -8,9 +8,11 @@ if not modules then modules = { } end modules ['back-pdf'] = { -- This code is very experimental ! -local setmetatable, getmetatable, type, next, tostring, tonumber = setmetatable, getmetatable, type, next, tostring, tonumber +local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setmetatable, getmetatable, type, next, tostring, tonumber, rawset local char, byte, format, gsub, concat = string.char, string.byte, string.format, string.gsub, table.concat local utfvalues = string.utfvalues +local texwrite = tex.write +local sind, cosd = math.sind, math.cosd lpdf = lpdf or { } @@ -31,6 +33,47 @@ local function tosixteen(str) end end +lpdf.tosixteen = tosixteen + +-- lpeg is some 5 times faster than gsub (in test) on escaping + +local escapes = { + ["\\"] = "\\\\", + ["/"] = "\\/", ["#"] = "\\#", + ["<"] = "\\<", [">"] = "\\>", + ["["] = "\\[", ["]"] = "\\]", + ["("] = "\\(", [")"] = "\\)", +} + +local escaped = lpeg.Cs(lpeg.Cc("(") * (lpeg.S("\\/#<>[]()")/escapes + lpeg.P(1))^0 * lpeg.Cc(")")) + +local function toeight(str) + -- if not str or str == "" then + -- return "()" + -- else + -- return escaped:match(str) + -- end + -- + -- no need for escaping .. just use unicode instead + return "(" .. str .. ")" +end + +lpdf.toeight = toeight + +local escapes = "-" + +local escaped = lpeg.Cs(lpeg.Cc("(") * (lpeg.S("\\/#<>[]()")/escapes + lpeg.P(1))^0 * lpeg.Cc(")")) + +local function cleaned(str) + if not str or str == "" then + return "()" + else + return escaped:match(str) + end +end + +lpdf.cleaned = cleaned + local function merge_t(a,b) local t = { } for k,v in next, a do t[k] = v end @@ -40,14 +83,20 @@ end local tostring_a, tostring_d -tostring_d = function(t) +tostring_d = function(t,contentonly,key) if not next(t) then - return "<< >>" + if contentonly then + return "" + else + return "<< >>" + end else - local r = { "<<" } + local r = { } for k, v in next, t do local tv = type(v) if tv == "string" then + r[#r+1] = format("/%s %s",k,toeight(v)) + elseif tv == "unicode" then r[#r+1] = format("/%s %s",k,tosixteen(v)) elseif tv == "table" then local mv = getmetatable(v) @@ -62,19 +111,30 @@ tostring_d = function(t) r[#r+1] = format("/%s %s",k,tostring(v)) end end - r[#r+1] = ">>" - return concat(r, " ") + if contentonly then + return concat(r, " ") + elseif key then + return format("/%s << %s >>", key, concat(r, " ")) + else + return format("<< %s >>", concat(r, " ")) + end end end -tostring_a = function(t) +tostring_a = function(t,contentonly,key) if #t == 0 then - return "[ ]" + if contentonly then + return "" + else + return "[ ]" + end else - local r = { "[" } + local r = { } for k, v in next, t do local tv = type(v) if tv == "string" then + r[#r+1] = toeight(v) + elseif tv == "unicode" then r[#r+1] = tosixteen(v) elseif tv == "table" then local mv = getmetatable(v) @@ -89,54 +149,82 @@ tostring_a = function(t) r[#r+1] = tostring(v) end end - r[#r+1] = "]" - return concat(r, " ") + if contentonly then + return concat(r, " ") + elseif key then + return format("/%s [ %s ]", key, concat(r, " ")) + else + return format("[ %s ]", concat(r, " ")) + end end end -local tostring_s = function(t) return tosixteen(t[1]) end +local tostring_x = function(t) return concat(t, " ") end +local tostring_s = function(t) return toeight(t[1]) end +local tostring_u = function(t) return tosixteen(t[1]) end local tostring_n = function(t) return tostring(t[1]) end -- tostring not needed local tostring_c = function(t) return t[1] end -- already prefixed (hashed) local tostring_z = function() return "null" end local tostring_t = function() return "true" end local tostring_f = function() return "false" end - -local function value_s(t) return t[1] end -- the call is experimental -local function value_n(t) return t[1] end -- the call is experimental -local function value_c(t) return sub(t[1],2) end -- the call is experimental -local function value_d(t) return t end -- the call is experimental -local function value_a(t) return t end -- the call is experimental -local function value_z() return nil end -- the call is experimental -local function value_t() return true end -- the call is experimental -local function value_b() return false end -- the call is experimental - +local tostring_r = function(t) return t[1] .. " 0 R" end +local tostring_v = function(t) return concat(t, "") end + +local function value_x(t) return t end -- the call is experimental +local function value_s(t,key) return t[1] end -- the call is experimental +local function value_u(t,key) return t[1] end -- the call is experimental +local function value_n(t,key) return t[1] end -- the call is experimental +local function value_c(t) return sub(t[1],2) end -- the call is experimental +local function value_d(t) return tostring_d(t,true,key) end -- the call is experimental +local function value_a(t) return tostring_a(t,true,key) end -- the call is experimental +local function value_z() return nil end -- the call is experimental +local function value_t() return true end -- the call is experimental +local function value_b() return false end -- the call is experimental +local function value_r() return t[1] end -- the call is experimental +local function value_v() return t end -- the call is experimental + +local function add_x(t,k,v) rawset(t,k,tostring(v)) end + +local mt_x = { __lpdftype = "stream", __tostring = tostring_x, __call = value_x, __newindex = add_x } local mt_d = { __lpdftype = "dictionary", __tostring = tostring_d, __call = value_d } local mt_a = { __lpdftype = "array", __tostring = tostring_a, __call = value_a } +local mt_u = { __lpdftype = "unicode", __tostring = tostring_u, __call = value_u } local mt_s = { __lpdftype = "string", __tostring = tostring_s, __call = value_s } local mt_n = { __lpdftype = "number", __tostring = tostring_n, __call = value_n } local mt_c = { __lpdftype = "constant", __tostring = tostring_c, __call = value_c } local mt_z = { __lpdftype = "null", __tostring = tostring_z, __call = value_z } local mt_t = { __lpdftype = "true", __tostring = tostring_t, __call = value_t } local mt_f = { __lpdftype = "false", __tostring = tostring_f, __call = value_f } +local mt_r = { __lpdftype = "reference", __tostring = tostring_r, __call = value_r } +local mt_v = { __lpdftype = "verbose", __tostring = tostring_v, __call = value_v } + +function lpdf.stream(t) + if t then + for i=1,#t do + t[i] = tostring(t[i]) + end + end + return setmetatable(t or { },mt_x) +end function lpdf.dictionary(t) return setmetatable(t or { },mt_d) end function lpdf.array(t) - return setmetatable(t or { },mt_a) + if type(t) == "string"then + return setmetatable({ t },mt_a) + else + return setmetatable(t or { },mt_a) + end end -local cache = { } -- can be weak - function lpdf.string(str,default) - str = str or default or "" - local c = cache[str] - if not c then - c = setmetatable({ str },mt_s) - cache[str] = c - end - return c + return setmetatable({ str or default or "" },mt_s) +end + +function lpdf.unicode(str,default) + return setmetatable({ str or default or "" },mt_u) end local cache = { } -- can be weak @@ -181,6 +269,14 @@ function lpdf.boolean(b,default) end end +function lpdf.reference(r) + return setmetatable({ r or 0 },mt_r) +end + +function lpdf.verbose(t) + return setmetatable(t or { },mt_v) +end + --~ local d = lpdf.dictionary() --~ local e = lpdf.dictionary { ["e"] = "abc" } --~ local f = lpdf.dictionary { ["f"] = "ABC" } @@ -266,3 +362,157 @@ function lpdf.limited(n,min,max,default) end end end + +-- there will be more of this + +local pdfreference = lpdf.reference +local pdfdictionary = lpdf.dictionary +local pdfreserveobj = pdf.reserveobj +local pdfimmediateobj = pdf.immediateobj + +local texset, texsprint, ctxcatcodes = tex.set, tex.sprint, tex.ctxcatcodes + +local pdfobjcache = { } + +function lpdf.sharedobj(content) + local r = pdfobjcache[content] + if not r then + r = pdfreference(pdfimmediateobj(content)) + pdfobjcache[content] = r + end + return r +end + +-- saves definitions later on + +backends = backends or { } +backends.pdf = backends.pdf or { + comment = "backend for directly generating pdf output", + nodeinjections = { }, + codeinjections = { }, + registrations = { }, + helpers = { }, +} + +-- + +local pagefinalizers, documentfinalizers = { }, { } + +local pageresources, pageattributes, pagesattributes + +local function resetpageproperties() + pageresources = pdfdictionary() + pageattributes = pdfdictionary() + pagesattributes = pdfdictionary() +end + +local function setpageproperties() + texset("global", "pdfpageresources", pageresources ()) + texset("global", "pdfpageattr", pageattributes ()) + texset("global", "pdfpagesattr", pagesattributes()) +end + +function lpdf.addtopageresources (k,v) pageresources [k] = v end +function lpdf.addtopageattributes (k,v) pageattributes [k] = v end +function lpdf.addtopagesattributes(k,v) pagesattributes[k] = v end + +local function set(where, f) + where[#where+1] = f +end + +local function run(where) + for i=1,#where do + where[i]() + end +end + +function lpdf.registerpagefinalizer(f) + set(pagefinalizers,f) +end + +function lpdf.registerdocumentfinalizer(f) + set(documentfinalizers,f) +end + +function lpdf.finalizepage() + if not environment.initex then + resetpageproperties() + run(pagefinalizers) + setpageproperties() + end +end + +function lpdf.finalizedocument() + if not environment.initex then + run(documentfinalizers) + end +end + +local c_template = "\\normalpdfcatalog{/%s %s}" +local i_template = "\\normalpdfinfo{/%s %s}" +local n_template = "\\normalpdfnames{/%s %s}" + +function lpdf.addtocatalog(k,v) if not environment.initex then texsprint(ctxcatcodes,format(c_template,k,tostring(v))) end end +function lpdf.addtoinfo (k,v) if not environment.initex then texsprint(ctxcatcodes,format(i_template,k,tostring(v))) end end +function lpdf.addtonames (k,v) if not environment.initex then texsprint(ctxcatcodes,format(n_template,k,tostring(v))) end end + +local r_extgstates, d_extgstates = pdfreserveobj(), pdfdictionary() local p_extgstates = pdfreference(r_extgstates) +local r_colorspaces, d_colorspaces = pdfreserveobj(), pdfdictionary() local p_colorspaces = pdfreference(r_colorspaces) +local r_patterns, d_patterns = pdfreserveobj(), pdfdictionary() local p_patterns = pdfreference(r_patterns) +local r_shades, d_shades = pdfreserveobj(), pdfdictionary() local p_shades = pdfreference(r_shades) + +local function checkextgstates () if next(d_extgstates ) then lpdf.addtopageresources("ExtGState", p_extgstates ) end end +local function checkcolorspaces() if next(d_colorspaces) then lpdf.addtopageresources("ColorSpace",p_colorspaces) end end +local function checkpatterns () if next(d_patterns ) then lpdf.addtopageresources("Pattern", p_patterns ) end end +local function checkshades () if next(d_shades ) then lpdf.addtopageresources("Shading", p_shades ) end end + +local function flushextgstates () pdfimmediateobj(r_extgstates, tostring(d_extgstates )) end +local function flushcolorspaces() pdfimmediateobj(r_colorspaces,tostring(d_colorspaces)) end +local function flushpatterns () pdfimmediateobj(r_patterns, tostring(d_patterns )) end +local function flushshades () pdfimmediateobj(r_shades, tostring(d_shades )) end + +--~ function lpdf.collectedresources() +--~ local collected = pdfdictionary { +--~ ExtGState = (next(d_extgstates) and p_extgstates ) or nil, +--~ ColorSpace = (next(d_colorspaces) and p_colorspaces) or nil, +--~ Pattern = (next(d_patterns) and p_patterns ) or nil, +--~ Shading = (next(d_shades) and p_shades ) or nil, +--~ } +--~ if next(collected) then +--~ tex.sprint(tex.ctxcatcodes,collected()) +--~ end +--~ end + +local collected = pdfdictionary { + ExtGState = p_extgstates, + ColorSpace = p_colorspaces, + Pattern = p_patterns, + Shading = p_shades, +} ; collected = collected() + +function lpdf.collectedresources() + tex.sprint(tex.ctxcatcodes,collected) +end + +function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end +function lpdf.adddocumentcolorspace(k,v) d_colorspaces[k] = v end +function lpdf.adddocumentpattern (k,v) d_patterns [k] = v end +function lpdf.adddocumentshade (k,v) d_shades [k] = v end + +lpdf.registerdocumentfinalizer(flushextgstates) +lpdf.registerdocumentfinalizer(flushcolorspaces) +lpdf.registerdocumentfinalizer(flushpatterns) +lpdf.registerdocumentfinalizer(flushshades) + +lpdf.registerpagefinalizer(checkextgstates) +lpdf.registerpagefinalizer(checkcolorspaces) +lpdf.registerpagefinalizer(checkpatterns) +lpdf.registerpagefinalizer(checkshades) + +-- + +function lpdf.rotationcm(a) + local s, c = sind(a), cosd(a) + texwrite(format("%s %s %s %s 0 0 cm",c,s,-s,c)) +end + diff --git a/tex/context/base/lpdf-ini.mkiv b/tex/context/base/lpdf-ini.mkiv index 23a81cfec..52ed6c383 100644 --- a/tex/context/base/lpdf-ini.mkiv +++ b/tex/context/base/lpdf-ini.mkiv @@ -14,5 +14,246 @@ \writestatus{loading}{ConTeXt Backend Macros / PDF} \registerctxluafile{lpdf-ini}{1.001} +\registerctxluafile{lpdf-nod}{1.001} +%registerctxluafile{lpdf-col}{1.001} % will be loaded later +\registerctxluafile{lpdf-mis}{1.001} +\registerctxluafile{lpdf-ano}{1.001} +\registerctxluafile{lpdf-ren}{1.001} +\registerctxluafile{lpdf-grp}{1.001} +\registerctxluafile{lpdf-wid}{1.001} +\registerctxluafile{lpdf-fld}{1.001} +\registerctxluafile{lpdf-u3d}{1.001} -\endinput +\unprotect + +% for the moment here + +%D \macros +%D {doovalbox} +%D +%D Drawing frames with round corners is inherited from the +%D main module. +%D +%D For drawing ovals we use quite raw \PDF\ code. The next +%D implementation does not differ that much from the one +%D implemented in the \POSTSCRIPT\ driver. + +\def\doPDFovalcalc#1#2#3% + {\PointsToBigPoints{\dimexpr#1+#2\relax}#3} + +\def\doovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox + {\forcecolorhack + \bgroup + \dimen0=#4\divide\dimen0 \plustwo + \doPDFovalcalc{0pt}{+\dimen0}\xmin + \doPDFovalcalc{#1}{-\dimen0}\xmax + \doPDFovalcalc{#2}{-\dimen0}\ymax + \doPDFovalcalc{-#3}{+\dimen0}\ymin + \advance\dimen0 by #5% + \doPDFovalcalc{0pt}{+\dimen0}\xxmin + \doPDFovalcalc{#1}{-\dimen0}\xxmax + \doPDFovalcalc{#2}{-\dimen0}\yymax + \doPDFovalcalc{-#3}{+\dimen0}\yymin + \doPDFovalcalc{#4}{\zeropoint}\stroke + \doPDFovalcalc{#5}{\zeropoint}\radius + \edef\dostroke{#6}% + \edef\dofill{#7}% + \edef\mode{\number#8 \space}% + % no \ifcase, else \relax in pdfcode + \setbox\scratchbox\hbox + {\ifnum\dostroke\dofill>\zerocount + \pdfliteral + {q + \stroke\space w + \ifcase\mode + \xxmin\space \ymin \space m + \xxmax\space \ymin \space l + \xmax \space \ymin \space \xmax \space \yymin\space y + \xmax \space \yymax\space l + \xmax \space \ymax \space \xxmax\space \ymax \space y + \xxmin\space \ymax \space l + \xmin \space \ymax \space \xmin \space \yymax\space y + \xmin \space \yymin\space l + \xmin \space \ymin \space \xxmin\space \ymin \space y + h + \or % 1 + \xxmin\space \ymin \space m + \xxmax\space \ymin \space l + \xmax \space \ymin \space \xmax \space \yymin\space y + \xmax \space \ymax \space l + \xmin \space \ymax \space l + \xmin \space \yymin\space l + \xmin \space \ymin \space \xxmin\space \ymin \space y + h + \or % 2 + \xxmin\space \ymin \space m + \xmax \space \ymin \space l + \xmax \space \ymax \space l + \xxmin\space \ymax \space l + \xmin \space \ymax \space \xmin \space \yymax\space y + \xmin \space \yymin\space l + \xmin \space \ymin \space \xxmin\space \ymin \space y + h + \or % 3 + \xmin \space \ymin \space m + \xmax \space \ymin \space l + \xmax \space \yymax\space l + \xmax \space \ymax \space \xxmax\space \ymax \space y + \xxmin\space \ymax \space l + \xmin \space \ymax \space \xmin \space \yymax\space y + \xmin \space \ymin \space l + h + \or % 4 + \xmin \space \ymin \space m + \xxmax\space \ymin \space l + \xmax \space \ymin \space \xmax \space \yymin\space y + \xmax \space \yymax\space l + \xmax \space \ymax \space \xxmax\space \ymax \space y + \xmin \space \ymax \space l + \xmin \space \ymin\space l + h + \or % 5 + \xmin \space \ymin \space m + \xmax \space \ymin \space l + \xmax \space \yymax\space l + \xmax \space \ymax \space \xxmax\space \ymax \space y + \xmin \space \ymax \space l + \xmin \space \ymin \space l + h + \or % 6 + \xmin \space \ymin \space m + \xxmax\space \ymin \space l + \xmax \space \ymin \space \xmax \space \yymin\space y + \xmax \space \ymax \space l + \xmin \space \ymax \space l + \xmin \space \ymin \space l + h + \or + \xxmin\space \ymin \space m + \xmax \space \ymin \space l + \xmax \space \ymax \space l + \xmin \space \ymax \space l + \xmin \space \yymin\space l + \xmin \space \ymin \space \xxmin\space \ymin \space y + h + \or + \xmin \space \ymin \space m + \xmax \space \ymin \space l + \xmax \space \ymax \space l + \xxmin\space \ymax \space l + \xmin \space \ymax \space \xmin \space \yymax\space y + \xmin \space \ymin \space l + h + \or % 9 top open + \xmin \space \ymax \space m + \xmin \space \yymin\space l + \xmin \space \ymin \space \xxmin\space \ymin \space y + \xxmax\space \ymin \space l + \xmax \space \ymin \space \xmax \space \yymin\space y + \xmax \space \ymax \space l + \or % 10 right open + \xmax \space \ymax \space m + \xxmin\space \ymax \space l + \xmin \space \ymax \space \xmin \space \yymax\space y + \xmin \space \yymin\space l + \xmin \space \ymin \space \xxmin\space \ymin \space y + \xmax\space \ymin \space l + \or % 11 bottom open + \xmax \space \ymin \space m + \xmax \space \yymax\space l + \xmax \space \ymax \space \xxmax \space \ymax\space y + \xxmin\space \ymax \space l + \xmin \space \ymax \space \xmin \space \yymax\space y + \xmin \space \ymin \space l + \or % 12 left open + \xmin \space \ymax \space m + \xxmax\space \ymax \space l + \xmax \space \ymax \space \xmax \space \yymax\space y + \xmax \space \yymin\space l + \xmax \space \ymin \space \xxmax\space \ymin \space y + \xmin \space \ymin \space l + \or % 13 + \xmin \space \ymax \space m + \xxmax\space \ymax \space l + \xmax \space \ymax \space \xmax \space \yymax\space y + \xmax\space \ymin \space l + \or % 14 + \xmax \space \ymax \space m + \xmax \space \yymin\space l + \xmax \space \ymin \space \xxmax\space \ymin \space y + \xmin \space \ymin \space l + \or % 15 + \xmax \space \ymin \space m + \xxmin\space \ymin \space l + \xmin \space \ymin \space \xmin \space \yymin\space y + \xmin \space \ymax \space l + \or % 16 + \xmin \space \ymin \space m + \xmin \space \yymax\space l + \xmin \space \ymax \space \xxmin\space \ymax \space y + \xmax \space \ymax \space l + \or % 17 + \xxmax\space \ymax \space m + \xmax \space \ymax \space \xmax \space \yymax\space y + \or % 18 + \xmax \space \yymin\space m + \xmax \space \ymin \space \xxmax\space \ymin \space y + \or % 19 + \xxmin\space \ymin \space m + \xmin \space \ymin \space \xmin \space \yymin\space y + \or % 20 + \xmin \space \yymax\space m + \xmin \space \ymax \space \xxmin\space \ymax \space y + \or % 21 + \xxmax\space \ymax \space m + \xmax \space \ymax \space \xmax \space \yymax\space y + \xmin \space \yymax\space m + \xmin \space \ymax \space \xxmin\space \ymax \space y + \or % 22 + \xxmax\space \ymax \space m + \xmax \space \ymax \space \xmax \space \yymax\space y + \xmax \space \yymin\space m + \xmax \space \ymin \space \xxmax\space \ymin \space y + \or % 23 + \xmax \space \yymin\space m + \xmax \space \ymin \space \xxmax\space \ymin \space y + \xxmin\space \ymin \space m + \xmin \space \ymin \space \xmin \space \yymin\space y + \or % 24 + \xxmin\space \ymin \space m + \xmin \space \ymin \space \xmin \space \yymin\space y + \xmin \space \yymax\space m + \xmin \space \ymax \space \xxmin\space \ymax \space y + \or % 25 + \xxmax\space \ymax \space m + \xmax \space \ymax \space \xmax \space \yymax\space y + \xmax \space \yymin\space m + \xmax \space \ymin \space \xxmax\space \ymin \space y + \xxmin\space \ymin \space m + \xmin \space \ymin \space \xmin \space \yymin\space y + \xmin \space \yymax\space m + \xmin \space \ymax \space \xxmin\space \ymax \space y + \or % 26 + \xmax \space \yymin\space m + \xmax \space \ymin \space \xxmax\space \ymin \space y + \xmin \space \yymax\space m + \xmin \space \ymax \space \xxmin\space \ymax \space y + \or % 27 + \xxmax\space \ymax \space m + \xmax \space \ymax \space \xmax \space \yymax\space y + \xxmin\space \ymin \space m + \xmin \space \ymin \space \xmin \space \yymin\space y + \or % 28 + \fi + \ifnum\mode>8 + S + \else + \ifnum\dostroke=\plusone S \fi + \ifnum\dofill =\plusone f \fi + \fi + Q}% + \fi}% + \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox + \egroup} + +\protect \endinput diff --git a/tex/context/base/lpdf-mis.lua b/tex/context/base/lpdf-mis.lua new file mode 100644 index 000000000..4a8a097ff --- /dev/null +++ b/tex/context/base/lpdf-mis.lua @@ -0,0 +1,230 @@ +if not modules then modules = { } end modules ['lpdf-mis'] = { + version = 1.001, + comment = "companion to back-pdf.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- Although we moved most pdf handling to the lua end, we didn't change +-- the overall approach. For instance we share all resources i.e. we +-- don't make subsets for each xform or page. The current approach is +-- quite efficient. A big difference between MkII and MkIV is that we +-- now use forward references. In this respect the MkII code shows that +-- it evolved over a long period, when backends didn't provide forward +-- referencing and references had to be tracked in multiple passes. Of +-- course there are a couple of more changes. + +local next, tostring = next, tostring +local format = string.format +local texsprint, texset = tex.sprint, tex.set +local ctxcatcodes = tex.ctxcatcodes + +local nodeinjections = backends.pdf.nodeinjections +local codeinjections = backends.pdf.codeinjections +local registrations = backends.pdf.registrations + +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfboolean = lpdf.boolean +local pdfconstant = lpdf.constant +local pdfreference = lpdf.reference +local pdfunicode = lpdf.unicode +local pdfstring = lpdf.string + +local pdfreserveobj = pdf.reserveobj +local pdfimmediateobj = pdf.immediateobj + +local tobasepoints = number.tobasepoints + +lpdf.addtoinfo ("Trapped", pdfboolean(false)) +lpdf.addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion))) + +-- we could do this selectively + +local function initializenegative() + local a = pdfarray { 0, 1 } + local g = pdfconstant("ExtGState") + local d = pdfdictionary { + FunctionType = 4, + Range = a, + Domain = a, + } + local negative = pdfdictionary { Type = g, TR = pdfreference(pdf.immediateobj("stream","1 exch sub",d())) } + local positive = pdfdictionary { Type = g, TR = pdfconstant("Identity") } + lpdf.adddocumentextgstate("GSnegative", pdfreference(pdfimmediateobj(tostring(negative)))) + lpdf.adddocumentextgstate("GSPositive", pdfreference(pdfimmediateobj(tostring(positive)))) +end + +local function initializeoverprint() + local g = pdfconstant("ExtGState") + local knockout = pdfdictionary { Type = g, OP = false, OPM = 0 } + local overprint = pdfdictionary { Type = g, OP = true, OPM = 1 } + lpdf.adddocumentextgstate("GSknockout", pdfreference(pdfimmediateobj(tostring(knockout )))) + lpdf.adddocumentextgstate("GSoverprint", pdfreference(pdfimmediateobj(tostring(overprint)))) +end + +lpdf.registerdocumentfinalizer(initializenegative) +lpdf.registerdocumentfinalizer(initializeoverprint) + +function codeinjections.addtransparencygroup() + -- png: /CS /DeviceRGB /I true + local d = tostring ( pdfdictionary { + S = pdfconstant("Transparency"), + I = true, + K = true, + } ) + lpdf.registerpagefinalizer(function() lpdf.addtopageattributes("Group",d) end) +end + +-- actions (todo: store and update when changed) + +local openpage, closepage, opendocument, closedocument + +function codeinjections.flushdocumentactions(open,close) + opendocument, closedocument = open, close +end + +function codeinjections.flushpageactions(open,close) + openpage, closepage = open, close +end + +local function flushdocumentactions() + if opendocument then + lpdf.addtocatalog("OpenAction",lpdf.pdfaction(opendocument)) + end + if closedocument then + lpdf.addtocatalog("CloseAction",lpdf.pdfaction(closedocument)) + end +end + +local function flushpageactions() + if openpage or closepage then + local d = pdfdictionary() + if openpage then + d.O = lpdf.pdfaction(openpage) + end + if closepage then + d.C = lpdf.pdfaction(closepage) + end + lpdf.addtopageattributes("AA",d) + end +end + +lpdf.registerpagefinalizer(flushpageactions) +lpdf.registerdocumentfinalizer(flushdocumentactions) + +--- info + +function codeinjections.setupidentity(specification) + local title = specification.title or "" if title ~= "" then + lpdf.addtoinfo("Title", pdfunicode(title)) + end + local subject = specification.subject or "" if subject ~= "" then + lpdf.addtoinfo("Subject", pdfunicode(subject)) + end + local author = specification.author or "" if author ~= "" then + lpdf.addtoinfo("Author", pdfunicode(author)) + end + local creator = specification.creator or "" if creator ~= "" then + lpdf.addtoinfo("Creator", pdfunicode(creator)) + end + local date = specification.date or "" if date ~= "" then + lpdf.addtoinfo("ModDate", pdfstring(date)) + end + local keywords = specification.keywords or "" if keywords ~= "" then + keywords = string.gsub("[%s,]+", " ") + lpdf.addtoinfo("Keywords",pdfunicode(keywords)) + end + lpdf.addtoinfo("ID", pdfstring(format("%s.%s",tex.jobname,os.date("%Y%m%d.%H%M")))) -- needed for pdf/x +end + +local function flushjavascripts() + local t = javascripts.flushpreambles() + local a = pdfarray() + local pdf_javascript = pdfconstant("JavaScript") + for i=1,#t do + local name, script = t[i][1], t[i][2] + local j = pdfdictionary { + S = pdf_javascript, + JS = pdfreference(pdfimmediateobj("stream",script)), + } + a[#a+1] = pdfstring(name) + a[#a+1] = pdfreference(pdfimmediateobj(tostring(j))) + end + lpdf.addtonames("JavaScript",pdfreference(pdfimmediateobj(tostring(pdfdictionary{ Names = a })))) +end + +lpdf.registerdocumentfinalizer(flushjavascripts) + +-- -- -- + +local pagespecs = { + max = { "FullScreen", false, false }, + bookmark = { "UseOutlines", false, false }, + fit = { "UseNone", false, true }, + doublesided = { "UseNone", "TwoColumnRight", true }, + default = { "UseNone", "auto", false }, +} + +local pagespec, topoffset, leftoffset, height, width, doublesided = "default", 0, 0, 0, 0, false + +function codeinjections.setupcanvas(specification) + local paperheight = specification.paperheight + local paperwidth = specification.paperwidth + local paperdouble = specification.doublesided + if paperheight then + texset('global','pdfpageheight',paperheight) + end + if paperwidth then + texset('global','pdfpagewidth',paperwidth) + end + pagespec = specification.mode or pagespec + topoffset = specification.topoffset or 0 + leftoffset = specification.leftoffset or 0 + height = specification.height or tex.pdfpageheight + width = specification.width or tex.pdfpagewidth + if paperdouble ~= nil then + doublesided = paperdouble + end +end + +local function documentspecification() + local spec = pagespecs[pagespec] or pagespecs.default + local mode, layout, fit = spec[1], spec[2], spec[3] + if layout == "auto" and doublesided then + spec = pagespecs.doublesided + mode, layout, fit = spec[1], spec[2], spec[3] + end + mode = mode and pdfconstant(mode) + layout = layout and pdfconstant(layout) + fit = fit and pdfdictionary { FitWindow = true } + if layout then + lpdf.addtocatalog("PageLayout",layout) + end + if mode then + lpdf.addtocatalog("PageMode",mode) + end + if fit then + lpdf.addtocatalog("ViewerPreferences",fit) + end +end + +local factor = number.dimenfactors.bp + +local function pagespecification() + local pageheight = tex.pdfpageheight + local box = pdfarray { -- can be cached + factor * (leftoffset), + factor * (pageheight-topoffset-height), + factor * (width-leftoffset), + factor * (pageheight-topoffset), + } + lpdf.addtopageattributes("CropBox",box) -- mandate for rendering + lpdf.addtopageattributes("TrimBox",box) -- mandate for pdf/x + -- lpdf.addtopageattributes("BleedBox",box) + -- lpdf.addtopageattributes("ArtBox",box) +end + +lpdf.registerpagefinalizer(pagespecification) +lpdf.registerdocumentfinalizer(documentspecification) diff --git a/tex/context/base/lpdf-nod.lua b/tex/context/base/lpdf-nod.lua new file mode 100644 index 000000000..f40039b94 --- /dev/null +++ b/tex/context/base/lpdf-nod.lua @@ -0,0 +1,53 @@ +if not modules then modules = { } end modules ['lpdf-nod'] = { + version = 1.001, + comment = "companion to lpdf-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local copy_node, new_node = node.copy, node.new + +local pdfliteral = nodes.register(new_node("whatsit", 8)) pdfliteral.mode = 1 +local pdfdest = nodes.register(new_node("whatsit",19)) pdfdest.named_id = 1 -- xyz_zoom untouched +local pdfannot = nodes.register(new_node("whatsit",15)) + +local variables = interfaces.variables + +local views = { -- beware, we do support the pdf keys but this is *not* official + xyz = 0, [variables.standard] = 0, + fit = 1, [variables.fit] = 1, + fith = 2, [variables.width] = 2, + fitv = 3, [variables.height] = 3, + fitb = 4, + fitbh = 5, [variables.minheight] = 5, + fitbv = 6, [variables.minheight] = 6, + fitr = 7, +} + +function nodes.pdfliteral(str) + local t = copy_node(pdfliteral) + t.data = str + return t +end + +function nodes.pdfannot(w,h,d,data,n) + local t = copy_node(pdfannot) + if w and w ~= 0 then t.width = w end + if h and h ~= 0 then t.height = h end + if d and d ~= 0 then t.depth = d end + if n then t.objnum = n end + if data and data ~= "" then t.data = data end + return t +end + +function nodes.pdfdest(w,h,d,name,view,n) + local t = copy_node(pdfdest) + if w and w ~= 0 then t.width = w end + if h and h ~= 0 then t.height = h end + if d and d ~= 0 then t.depth = d end + if n then t.objnum = n end + t.dest_id = name + t.dest_type = views[view] or view or 1 -- fit is default + return t +end diff --git a/tex/context/base/lpdf-ren.lua b/tex/context/base/lpdf-ren.lua new file mode 100644 index 000000000..05a6658e7 --- /dev/null +++ b/tex/context/base/lpdf-ren.lua @@ -0,0 +1,210 @@ +if not modules then modules = { } end modules ['lpdf-ren'] = { + version = 1.001, + comment = "companion to lpdf-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- rendering + +local tostring, tonumber, next = tostring, tonumber, next +local format = string.format +local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes + +local nodeinjections = backends.pdf.nodeinjections +local codeinjections = backends.pdf.codeinjections +local registrations = backends.pdf.registrations + +jobreferences = jobreferences or { } +--~ jobreferences.runners = jobreferences.runners or { } +--~ jobreferences.specials = jobreferences.specials or { } +--~ jobreferences.handlers = jobreferences.handlers or { } +jobreferences.executers = jobreferences.executers or { } + +--~ local runners = jobreferences.runners +--~ local specials = jobreferences.specials +--~ local handlers = jobreferences.handlers +local executers = jobreferences.executers + +local variables = interfaces.variables + +local pdfconstant = lpdf.constant +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfreference = lpdf.reference + +local pdfreserveobj = pdf.reserveobj +local pdfimmediateobj = pdf.immediateobj + +local pdf_ocg = pdfconstant("OCG") +local pdf_ocmd = pdfconstant("OCMD") +local pdf_off = pdfconstant("OFF") +local pdf_on = pdfconstant("ON") +local pdf_toggle = pdfconstant("Toggle") +local pdf_setocgstate = pdfconstant("SetOCGState") + +local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = pdfconstant("OFF") } } + +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 + + +function codeinjections.defineviewerlayer(specification) + if textlayers then + local tag = specification.tag + -- todo: reserve + local n = pdfdictionary { + Type = pdf_ocg, + Name = specification.title or "unknown", + Intent = ((specification.kind > 0) and pdf_design) or nil, -- disable layer hiding by user + Usage = ((specification.printable == variables.no) and lpdf_usage) or nil , -- printable or not + } + local nr = pdfreference(pdfimmediateobj(tostring(n))) + pdfln[tag] = nr -- was n + local d = pdfdictionary { + Type = pdf_ocmd, + OCGs = pdfarray { nr }, + } + local dr = pdfreference(pdfimmediateobj(tostring(d))) + pdfld[tag] = dr + textlayers[#textlayers+1] = nr + if specification.visible == variables.start then + videlayers[#videlayers+1] = nr + else + hidelayers[#hidelayers+1] = nr + end + pagelayers[tag] = dr -- check + end +end + +local function flushtextlayers() + if textlayers and #textlayers > 0 then + local d = pdfdictionary { + OCGs = textlayers, + D = pdfdictionary { + Order = textlayers, + ON = videlayers, + OFF = hidelayers, + }, + } + lpdf.addtocatalog("OCProperties",d) + textlayers = nil + end +end + +local function flushpagelayers() + if next(pagelayers) then + lpdf.addtopageresources("Properties",pagelayers) + end +end + +lpdf.registerpagefinalizer (flushpagelayers) +lpdf.registerdocumentfinalizer(flushtextlayers) + +local function setlayer(what,arguments) + -- maybe just a gmatch of even better, earlier in lpeg + arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments) + local state = pdfarray { what } + for i=1,#arguments do + local p = pdfln[arguments[i]] + if p then + state[#state+1] = p + end + end + return pdfdictionary { + S = pdf_setocgstate, + State = state, + } +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 + +-- transitions + +local pagetransitions = { + {"split","in","vertical"}, {"split","in","horizontal"}, + {"split","out","vertical"}, {"split","out","horizontal"}, + {"blinds","horizontal"}, {"blinds","vertical"}, + {"box","in"}, {"box","out"}, + {"wipe","east"}, {"wipe","west"}, {"wipe","north"}, {"wipe","south"}, + {"dissolve"}, + {"glitter","east"}, {"glitter","south"}, + {"fly","in","east"}, {"fly","in","west"}, {"fly","in","north"}, {"fly","in","south"}, + {"fly","out","east"}, {"fly","out","west"}, {"fly","out","north"}, {"fly","out","south"}, + {"push","east"}, {"push","west"}, {"push","north"}, {"push","south"}, + {"cover","east"}, {"cover","west"}, {"cover","north"}, {"cover","south"}, + {"uncover","east"}, {"uncover","west"}, {"uncover","north"}, {"uncover","south"}, + {"fade"}, +} + +local mapping = { + split = { "S" , pdfconstant("Split") }, + blinds = { "S" , pdfconstant("Blinds") }, + box = { "S" , pdfconstant("Box") }, + wipe = { "S" , pdfconstant("Wipe") }, + dissolve = { "S" , pdfconstant("Dissolve") }, + glitter = { "S" , pdfconstant("Glitter") }, + replace = { "S" , pdfconstant("R") }, + fly = { "S" , pdfconstant("Fly") }, + push = { "S" , pdfconstant("Push") }, + cover = { "S" , pdfconstant("Cover") }, + uncover = { "S" , pdfconstant("Uncover") }, + fade = { "S" , pdfconstant("Fade") }, + horizontal = { "Dm" , pdfconstant("H") }, + vertical = { "Dm" , pdfconstant("V") }, + ["in"] = { "M" , pdfconstant("I") }, + out = { "M" , pdfconstant("O") }, + east = { "Di" , 0 }, + north = { "Di" , 90 }, + west = { "Di" , 180 }, + south = { "Di" , 270 }, +} + +local last = 0 + +-- n: number, "stop", "reset", "random", "a,b,c" delay: number, "none" + +function codeinjections.setpagetransition(specification) + local n, delay = specification.n, specification.delay + if n == variables.auto then + if last >= #pagetransitions then + last = 0 + end + n = last + 1 + elseif n == variables.stop then + return + elseif n == variables.reset then + last = 0 + return + elseif n == variables.random then + n = math.random(1,#pagetransitions) + else + n = tonumber(n) + end + local t = n and pagetransitions[n] or pagetransitions[1] + if not t then + t = aux.settings_to_array(n) + end + if t and #t > 0 then + local d = pdfdictionary() + for i=1,#t do + local m = mapping[t[i]] + d[m[1]] = m[2] + end + delay = tonumber(delay) + if delay and delay > 0 then + lpdf.addtopageattributes("Dur",delay) + end + lpdf.addtopageattributes("Trans",d) + end +end diff --git a/tex/context/base/lpdf-u3d.lua b/tex/context/base/lpdf-u3d.lua new file mode 100644 index 000000000..5f7a770b1 --- /dev/null +++ b/tex/context/base/lpdf-u3d.lua @@ -0,0 +1,427 @@ +if not modules then modules = { } end modules ['lpdf-u3d'] = { + version = 1.001, + comment = "companion to lpdf-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- The following code is based on a working prototype provided +-- by Michael Vidiassov. It is rewritten using the lpdf library +-- and different checking is used. The macro calls are adapted +-- (and will eventually be removed). The user interface needs +-- an overhaul. There are some messy leftovers that will be +-- removed in future versions. + +local format = string.format +local cos, sin, sqrt, pi, atan2, abs = math.cos, math.sin, math.sqrt, math.pi, math.atan2, math.abs + +local pdfconstant = lpdf.constant +local pdfboolean = lpdf.boolean +local pdfunicode = lpdf.unicode +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfnull = lpdf.null +local pdfreference = lpdf.reference + +local checkedkey = lpdf.checkedkey +local limited = lpdf.limited + +local schemes = table.tohash { + "Artwork", "None", "White", "Day", "Night", "Hard", + "Primary", "Blue", "Red", "Cube", "CAD", "Headlamp", +} + +local modes = table.tohash { + "Solid", "SolidWireframe", "Transparent", "TransparentWireframe", "BoundingBox", + "TransparentBoundingBox", "TransparentBoundingBoxOutline", "Wireframe", + "ShadedWireframe", "HiddenWireframe", "Vertices", "ShadedVertices", "Illustration", + "SolidOutline", "ShadedIllustration", +} + +local function normalize(x, y, z) + local modulo = sqrt(x*x + y*y + z*z); + if modulo ~= 0 then + return x/modulo, y/modulo, z/modulo + else + return x, y, z + end +end + +local function rotate(vect_x,vect_y,vect_z, tet, axis_x,axis_y,axis_z) + -- rotate vect by tet about axis counterclockwise + local c, s = cos(tet*pi/180), sin(tet*pi/180) + local r = 1 - c + local n = sqrt(axis_x*axis_x+axis_y*axis_y+axis_z*axis_z) + axis_x, axis_y, axis_z = axis_x/n, axis_y/n, axis_z/n + return + (axis_x*axis_x*r+c )*vect_x + (axis_x*axis_y*r-axis_z*s)*vect_y + (axis_x*axis_z*r+axis_y*s)*vect_z, + (axis_x*axis_y*r+axis_z*s)*vect_x + (axis_y*axis_y*r+c )*vect_y + (axis_y*axis_z*r-axis_x*s)*vect_z, + (axis_x*axis_z*r-axis_y*s)*vect_x + (axis_y*axis_z*r+axis_x*s)*vect_y + (axis_z*axis_z*r+c )*vect_z +end + +local function make3dview(view) + + local name = viewname + local name = pdfunicode((view.name ~= "" and name) or "unknown view") + + local viewdict = pdfdictionary { + Type = pdfconstant("3DView"), + XN = name, + IN = name, + } + + local bg = checkedkey(view,"bg","table") + if bg then + viewdict.BG = pdfdictionary { + Type = pdfconstant("3DBG"), + C = pdfarray { limited(bg[1],1,1,1), limited(bg[2],1,1,1), limited(bg[3],1,1,1) }, + } + end + + local lights = checkedkey(view,"lights","string") + if lights and schemes[lights] then + viewdict.LS = pdfdictionary { + Type = pdfconstant("3DLightingScheme"), + Subtype = pdfconstant(lights), + } + end + + -- camera position is taken from 3d model + + local u3dview = checkedkey(view, "u3dview", "string") + if u3dview then + viewdict.MS = pdfconstant("U3D") + viewdict.U3DPath = u3dview + end + + -- position the camera as given + + local c2c = checkedkey(view, "c2c", "table") + local coo = checkedkey(view, "coo", "table") + local roo = checkedkey(view, "roo", "number") + local azimuth = checkedkey(view, "azimuth", "number") + local altitude = checkedkey(view, "altitude", "number") + + if c2c or coo or roo or azimuth or altitude then + + local pos = checkedkey(view, "pos", "table") + local dir = checkedkey(view, "dir", "table") + local upv = checkedkey(view, "upv", "table") + local roll = checkedkey(view, "roll", "table") + + local coo_x, coo_y, coo_z = 0, 0, 0 + local dir_x, dir_y, dir_z = 0, 0, 0 + local trans_x, trans_y, trans_z = 0, 0, 0 + local left_x, left_y, left_z = 0, 0, 0 + local up_x, up_y, up_z = 0, 0, 0 + + -- point camera is aimed at + + if coo then + coo_x, coo_y, coo_z = tonumber(coo[1]) or 0, tonumber(coo[2]) or 0, tonumber(coo[3]) or 0 + end + + -- distance from camera to target + + if roo then + roo = abs(roo) + end + if not roo or roo == 0 then + roo = 0.000000000000000001 + end + + -- set it via camera position + + if pos then + dir_x = coo_x - (tonumber(pos[1]) or 0) + dir_y = coo_y - (tonumber(pos[2]) or 0) + dir_z = coo_z - (tonumber(pos[3]) or 0) + if not roo then + roo = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z) + end + if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end + dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z) + end + + -- set it directly + + if dir then + dir_x, dir_y, dir_z = tonumber(dir[1] or 0), tonumber(dir[2] or 0), tonumber(dir[3] or 0) + if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end + dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z) + end + + -- set it movie15 style with vector from target to camera + + if c2c then + dir_x, dir_y, dir_z = - tonumber(c2c[1] or 0), - tonumber(c2c[2] or 0), - tonumber(c2c[3] or 0) + if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end + dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z) + end + + -- set it with azimuth and altitutde + + if altitude or azimuth then + dir_x, dir_y, dir_z = -1, 0, 0 + if altitude then dir_x, dir_y, dir_z = rotate(dir_x,dir_y,dir_z, -altitude, 0,1,0) end + if azimuth then dir_x, dir_y, dir_z = rotate(dir_x,dir_y,dir_z, azimuth, 0,0,1) end + end + + -- set it with rotation like in MathGL + + if rot then + if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_z = -1 end + dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[1]) or 0, 1,0,0) + dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[2]) or 0, 0,1,0) + dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[3]) or 0, 0,0,1) + end + + -- set it with default movie15 orientation looking up y axis + + if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end + + -- left-vector + -- up-vector + + if upv then + up_x, up_y, up_z = tonumber(upv[1]) or 0, tonumber(upv[2]) or 0, tonumber(upv[3]) or 0 + else + -- set default up-vector + if abs(dir_x) == 0 and abs(dir_y) == 0 then + if dir_z < 0 then + up_y = 1 -- top view + else + up_y = -1 -- bottom view + end + else + -- other camera positions than top and bottom, up-vector = up_world - (up_world dot dir) dir + up_x, up_y, up_z = - dir_z*dir_x, - dir_z*dir_y, - dir_z*dir_z + 1 + end + end + + -- normalize up-vector + + up_x, up_y, up_z = normalize(up_x,up_y,up_z) + + -- left vector = up x dir + + left_x, left_y, left_z = dir_z*up_y - dir_y*up_z, dir_x*up_z - dir_z*up_x, dir_y*up_x - dir_x*up_y + + -- normalize left vector + + left_x, left_y, left_z = normalize(left_x,left_y,left_z) + + -- apply camera roll + + if roll then + local sinroll = sin((roll/180.0)*pi) + local cosroll = cos((roll/180.0)*pi) + left_x = left_x*cosroll + up_x*sinroll + left_y = left_y*cosroll + up_y*sinroll + left_z = left_z*cosroll + up_z*sinroll + up_x = up_x*cosroll + left_x*sinroll + up_y = up_y*cosroll + left_y*sinroll + up_z = up_z*cosroll + left_z*sinroll + end + + -- translation vector + + trans_x, trans_y, trans_z = coo_x - roo*dir_x, coo_y - roo*dir_y, coo_z - roo*dir_z + + viewdict.MS = pdfconstant("M") + viewdict.CO = roo + viewdict.C2W = pdfarray { + left_x, left_y, left_z, + up_x, up_y, up_z, + dir_x, dir_y, dir_z, + trans_x, trans_y, trans_z, + } + + end + + local aac = tonumber(view.aac) -- perspective projection + local mag = tonumber(view.mag) -- ortho projection + + if aac and aac > 0 and aac < 180 then + viewdict.P = pdfdictionary { + Subtype = pdfconstant("P"), + PS = pdfconstant("Min"), + FOV = aac, + } + elseif mag and mag > 0 then + viewdict.P = pdfdictionary { + Subtype = pdfconstant("O"), + OS = mag, + } + end + + local mode = modes[view.rendermode] + if mode then + pdfdictionary { + Type = pdfconstant("3DRenderMode"), + Subtype = pdfconstant(mode), + } + end + + -- crosssection + + local crosssection = checkedkey(view,"crosssection","table") + if crosssection then + local crossdict = pdfdictionary { + Type = pdfconstant("3DCrossSection") + } + + local c = checkedkey(crosssection,"point","table") or checkedkey(crosssection,"center","table") + if c then + crossdict.C = pdfarray { tonumber(c[1]) or 0, tonumber(c[2]) or 0, tonumber(c[3]) or 0 } + end + + local normal = checkedkey(crosssection,"normal","table") + if normal then + local x, y, z = tonumber(normal[1] or 0), tonumber(normal[2] or 0), tonumber(normal[3] or 0) + if sqrt(x*x + y*y + z*z) == 0 then + x, y, z = 1, 0, 0 + end + crossdict.O = pdfarray { + pdfnull, + atan2(-z,sqrt(x*x + y*y))*180/pi, + atan2(y,x)*180/pi, + } + end + + local orient = checkedkey(crosssection,"orient","table") + if orient then + crossdict.O = pdfarray { + tonumber(orient[1]) or 1, + tonumber(orient[2]) or 0, + tonumber(orient[3]) or 0, + } + end + + crossdict.IV = cross.intersection or false + crossdict.ST = cross.transparent or false + + viewdict.SA = next(crossdict) and pdfarray { crossdict } -- maybe test if # > 1 + end + + local nodes = checkedkey(view,"nodes","table") + if nodes then + local nodelist = pdfarray() + for i=1,#nodes do + local node = checkedkey(nodes,i,"table") + if node then + local position = checkedkey(node,"position","table") + position = position and #position == 12 and pdfarray(position) + if position then + nodelist[#nodelist+1] = pdfdictionary { + Type = pdfconstant("3DNode"), + N = node.name or ("node_" .. i), -- pdfunicode ? + V = node.visible or true, + O = node.opacity or 0, + RM = pdfdictionary { + Type = pdfconstant("3DRenderMode"), + Subtype = pdfconstant(node.rendermode or "Solid"), + }, + M = position, + } + end + end + end + viewdict.NR = true + viewdict.NA = nodelist + end + + return viewdict + +end + +local stored_js, stored_3d, stored_pr, streams = { }, { }, { }, { } + +function backends.pdf.helpers.insert3d(spec) -- width, height, factor, display, controls, label, foundname + + local width, height, factor = spec.width, spec.height, spec.factor or number.dimenfactors.bp + local display, controls, label, foundname = spec.display, spec.controls, spec.label, spec.foundname + + local param = (display and parametersets[display]) or { } + local streamparam = (controls and parametersets[controls]) or { } + local name = "3D Artwork " .. (param.name or label or "Unknown") + + local activationdict = pdfdictionary { + TB = pdfboolean(param.toolbar,true), + NP = pdfboolean(param.tree,true), + } + + local stream = streams[label] + if not stream then + local attr = pdfdictionary { + Type = pdfconstant("3D"), + Subtype = pdfconstant("U3D"), + } + local streamviews = checkedkey(streamparam, "views", "table") + if streamviews then + local list = pdfarray() + for i=1,#streamviews do + local v = checkedkey(streamviews, i, "table") + if v then + list[#list+1] = make3dview(v) + end + end + attr.VA = list + end + if checkedkey(streamparam, "view", "table") then + attr.DV = make3dview(streamparam.view) + elseif checkedkey(streamparam, "view", "string") then + attr.DV = streamparam.view + end + local js = checkedkey(streamparam, "js", "string") + if js then + local jsref = stored_js[js] + if not jsref then + jsref = pdf.immediateobj("streamfile",js) + stored_js[js] = jsref + end + attr.OnInstantiate = pdfreference(jsref) + end + stored_3d[label] = pdf.immediateobj("streamfile",foundname,attr()) + stream = 1 + else + stream = stream + 1 + end + streams[label] = stream + + local name = pdfunicode(name) + + local annot = pdfdictionary { + Subtype = pdfconstant("3D"), + T = name, + Contents = name, + NM = name, + ["3DD"] = pdfreference(stored_3d[label]), + ["3DA"] = activationdict, + } + if checkedkey(param,"view","table") then + annot["3DV"] = make3dview(param.view) + elseif checkedkey(param,"view","string") then + annot["3DV"] = param.view + end + + local preview = checkedkey(param,"preview","string") + if preview then + activationdict.A = pdfconstant("XA") + local tag = format("%s:%s:%s",label,stream,preview) + local ref = stored_pr[tag] + if not ref then + -- weird, has to be a /Form and not an /Image so we need a wrap = true key + -- local figure = img.immediatewrite { filename = preview, width = width, height = height } + local figure = img.immediatewrite { stream = ".5 .75 .75 rg 0 0 20 10 re f", bbox = {0,0,20,10 } } + ref = figure.objnum + stored_pr[tag] = ref + end + annot.AP = ref and pdfdictionary { N = pdfreference(ref) } + return annot, figure, ref + else + activationdict.A = pdfconstant("PV") + return annot, nil, nil + end +end diff --git a/tex/context/base/lpdf-wid.lua b/tex/context/base/lpdf-wid.lua new file mode 100644 index 000000000..cc61a4f96 --- /dev/null +++ b/tex/context/base/lpdf-wid.lua @@ -0,0 +1,328 @@ +if not modules then modules = { } end modules ['lpdf-wid'] = { + version = 1.001, + comment = "companion to lpdf-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local format, gmatch, gsub, find = string.format, string.gmatch, string.gsub, string.find +local texsprint, ctxcatcodes, texbox, texcount = tex.sprint, tex.ctxcatcodes, tex.box, tex.count + +local nodeinjections = backends.pdf.nodeinjections +local codeinjections = backends.pdf.codeinjections +local registrations = backends.pdf.registrations + +local executers = jobreferences.executers +local variables = interfaces.variables + +local pdfconstant = lpdf.constant +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfreference = lpdf.reference +local pdfunicode = lpdf.unicode +local pdfcolorspec = lpdf.colorspec + +local pdfreserveobj = pdf.reserveobj +local pdfimmediateobj = pdf.immediateobj + +-- symbols + +local presets = { } -- xforms + +function codeinjections.registersymbol(name,n) + presets[name] = pdfreference(n) +end + +function codeinjections.registeredsymbol(name) + return presets[name] +end + +function codeinjections.presetsymbollist(list) + if list then + for s in gmatch(list,"[^, ]+") do + if not presets[s] then + texsprint(ctxcatcodes,format("\\predefinesymbol[%s]",s)) + end + end + end +end + +-- comments + +local symbols = { + New = pdfconstant("Insert"), + Insert = pdfconstant("Insert"), + Balloon = pdfconstant("Comment"), + Comment = pdfconstant("Comment"), + Text = pdfconstant("Note"), + Addition = pdfconstant("NewParagraph"), + NewParagraph = pdfconstant("NewParagraph"), + Help = pdfconstant("Help"), + Paragraph = pdfconstant("Paragraph"), + Key = pdfconstant("Key"), + Graph = pdfconstant("Graph"), + Paperclip = pdfconstant("Paperclip"), + Attachment = pdfconstant("Attachment"), + Tag = pdfconstant("Tag"), +} + +symbols[variables.normal] = pdfconstant("Note") + +local nofcomments, usepopupcomments, stripleading = 0, true, true + +local function analyzesymbol(symbol) + if not symbol or symbol == "" then + return symbols.normal, nil + elseif symbols[symbol] then + return symbols[symbol], nil + else + local set = aux.settings_to_array(symbol) + local normal, down = set[1], set[2] + if normal then + normal = codeinjections.registeredsymbol(down or normal) + end + if down then + down = codeinjections.registeredsymbol(normal) + end + if down or normal then + return nil, pdfdictionary { + N = normal, + D = down, + } + end + end +end + +local function analyzelayer(layer) + -- todo: (specification.layer ~= "" and pdfreference(specification.layer)) or nil, -- todo: ref to layer +end + +function codeinjections.registercomment(specification) + nofcomments = nofcomments + 1 + local text = buffers.collect(specification.buffer) + if stripleading then + text = gsub(text,"[\n\r] *","\n") + end + local name, appearance = analyzesymbol(specification.symbol) + local d = pdfdictionary { + Subtype = pdfconstant("Text"), + Open = specification.open, + Contents = pdfunicode(text), + T = (specification.title ~= "" and pdfunicode(specification.title)) or nil, + C = pdfcolorspec(specification.colormodel,specification.colorvalue), + OC = analyzelayer(specification.layer), + Name = name, + AP = appearance, + } + -- watch the nice feed back to tex hack + if usepopupcomments then + local nd = pdfreserveobj() + local nc = pdfreserveobj() + local c = pdfdictionary { + Subtype = pdfconstant("Popup"), + Parent = pdfreference(nd), + } + d.Popup = pdfreference(nc) + texbox["commentboxone"] = node.hpack(nodes.pdfannot(0,0,0,d(),nd)) + texbox["commentboxtwo"] = node.hpack(nodes.pdfannot(specification.width,specification.height,0,c(),nc)) + else + texbox["commentboxone"] = node.hpack(nodes.pdfannot(0,0,0,d())) + texbox["commentboxtwo"] = nil + end +end + +-- + +local nofattachments, attachments, filestreams = 0, { }, { } + +function codeinjections.attachfile(specification) + local attachment = interactions.attachment(specification.label) + if not attachment then + -- todo: message + return + end + local filename = attachment.filename + if not filename or filename == "" then + -- todo: message + return + end + nofattachments = nofattachments + 1 + local label = attachment.label or "" + local title = attachment.title or "" + local newname = attachment.newname or "" + if label == "" then label = filename end + if title == "" then title = label end + if newname == "" then newname = filename end + local aref = attachments[label] + if not aref then + if not lfs.isfile(filename) then + interfaces.showmessage("interactions",5,filename) + return -- todo: message + else + local f = pdf.immediateobj("streamfile",filename) + filestreams[filename] = f + local d = pdfdictionary { + Type = pdfconstant("Filespec"), + F = newname, + EF = pdfdictionary { F = pdfreference(d) }, + } + aref = pdfreference(pdfimmediateobj(tostring(d))) + attachments[label] = aref + end + end + local name, appearance = analyzesymbol(specification.symbol) + local d = pdfdictionary { + Subtype = pdfconstant("FileAttachment"), + FS = aref, + Contents = pdfunicode(title), + Name = name, + AP = appearance, + OC = analyzelayer(specification.layer), + C = pdfcolorspec(specification.colormodel,specification.colorvalue), + } + local width = specification.width or 0 + local height = specification.height or 0 + local depth = specification.depth or 0 + node.write(nodes.pdfannot(width,height,depth,d())) +end + +function codeinjections.attachmentid(filename) + return filestreams[filename] +end + +-- rendering stuff +-- +-- object_1 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >> +-- object_2 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >> +-- rendering -> <</Type /Rendition /S /MS [objref_1 objref_2]>> +-- +-- we only work foreward here +-- annotation is to be packed at the tex end + +-- aiff audio/aiff +-- au audio/basic +-- avi video/avi +-- mid audio/midi +-- mov video/quicktime +-- mp3 audio/x-mp3 (mpeg) +-- mp4 audio/mp4 +-- mp4 video/mp4 +-- mpeg video/mpeg +-- smil application/smil +-- swf application/x-shockwave-flash + +local ms, mu, mf = { }, { }, { } + +local delayed = { } + +local function insertrenderingwindow(label,width,height,specification) + if options == variables.auto then + if openpageaction then + -- \handlereferenceactions{\v!StartRendering{#2}} + end + if closepageaction then + -- \handlereferenceactions{\v!StopRendering {#2}} + end + end + local actions = nil + if openpage or closepage then + actions = pdfdictionary { + PO = (openpage and lpdf.pdfaction(openpage )) or nil, + PC = (closepage and lpdf.pdfaction(closepage)) or nil, + } + end + local page = tonumber(specification.page) or texcount.realpageno + local d = pdfdictionary { + Subtype = pdfconstant("Screen"), + P = pdfreference(tex.pdfpageref(page)), + A = mf[label], + Border = pdfarray { 0, 0, 0 } , + AA = actions, + } + local r = pdfreserveobj("annot") + node.write(nodes.pdfannot(label,width,height,d(),r)) -- save ref + return pdfreference(r) +end + +local function insertrendering(specification) + local label = specification.label + if not mf[label] then + local filename = specification.filename + local isurl = find(filename,"://") + local d = pdfdictionary { + Type = pdfconstant("Rendition"), + S = pdfconstant("MR"), + C = pdfdictionary { + Type = pdfconstant("MediaClip"), + S = pdfconstant("MCD"), + N = label, + CT = specification.mime, + Alt = pdfarray { + "", "file not found", -- language id + message + }, + D = pdfdictionary { + Type = pdfconstant("Filespec"), + F = filename, + FS = (isurl and pdfconstant("URL")) or nil, + } + } + } + mf[label] = pdfreference(pdfimmediateobj(tostring(d))) + if not ms[label] then + mu[label] = insertrenderingwindow(label,0,0,specification.options) + end + end +end + +local function insertrenderingobject(specification) + local label = specification.label + if not mf[label] then + local d = pdfdictionary { + Type = pdfconstant("Rendition"), + S = pdfconstant("MR"), + C = pdfdictionary { + Type = pdfconstant("MediaClip"), + S = pdfconstant("MCD"), + N = label, + D = pdfreference(unknown), -- not label but objectname, hm + } + } + mf[label] = pdfreference(pdfimmediateobj(tostring(d))) + if ms[label] then + insertrenderingwindow(label,0,0,specification) + end + end +end + +function codeinjections.insertrenderingwindow(specification) + local label = specification.label + codeinjections.processrendering(label) -- was check at tex end + ms[label] = insertrenderingwindow(label,specification.width,specification.height,specification) +end + +function codeinjections.processrendering(label) + local specification = interactions.rendering(label) + if specification then + if specification.kind == "external" then + insertrendering(specification) + else + insertrenderingobject(specification) + end + end +end + +local function set(operation,arguments) + codeinjections.processrendering(arguments) -- was check at the tex end + return pdfdictionary { + S = pdfconstant("Rendition"), + OP = operation, + R = mf[arguments], + AN = ms[arguments] or mu[arguments], + } +end + +function executers.startrendering (arguments) return set(0,arguments) end +function executers.stoprendering (arguments) return set(1,arguments) end +function executers.pauserendering (arguments) return set(2,arguments) end +function executers.resumerendering(arguments) return set(3,arguments) end diff --git a/tex/context/base/luat-bas.mkiv b/tex/context/base/luat-bas.mkiv index a78455173..581a5d95a 100644 --- a/tex/context/base/luat-bas.mkiv +++ b/tex/context/base/luat-bas.mkiv @@ -51,6 +51,7 @@ \registerctxluafile{l-dimen} {1.001} \registerctxluafile{l-url} {1.001} \registerctxluafile{l-set} {1.001} +\registerctxluafile{l-dimen} {1.001} % \registerctxluafile{socket.lua}{} % \registerctxluafile{ltn12.lua} {} diff --git a/tex/context/base/luat-cod.mkiv b/tex/context/base/luat-cod.mkiv index 07db36483..001cc2aa9 100644 --- a/tex/context/base/luat-cod.mkiv +++ b/tex/context/base/luat-cod.mkiv @@ -60,7 +60,7 @@ %D Here we operate in the \TEX\ catcode regime as we haven't yet defined %D catcode regimes. A chicken or egg problem. -\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init) +\normalprotected\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init) {\ifproductionrun \global\let\startruntimeluacode\relax \global\let\stopruntimeluacode \relax @@ -69,7 +69,7 @@ \fi #1} % maybe no interference -\long\def\startruntimectxluacode#1\stopruntimectxluacode +\normalprotected\long\def\startruntimectxluacode#1\stopruntimectxluacode {\startruntimeluacode\ctxlua{#1}\stopruntimeluacode} %D Next we load the initialization code. @@ -133,7 +133,7 @@ \def\ctxluabyteload#1#2% registers and compiles chunk {\global\advance\luabytecodecounter \plusone - \expanded{\startruntimectxluacode + \normalexpanded{\startruntimectxluacode lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" } \stopruntimectxluacode}% \ctxlua { diff --git a/tex/context/base/luat-ini.mkiv b/tex/context/base/luat-ini.mkiv index 2a132c38e..84214ea73 100644 --- a/tex/context/base/luat-ini.mkiv +++ b/tex/context/base/luat-ini.mkiv @@ -134,24 +134,12 @@ \obeyluatokens \csname dodostartnamed#1\v!code\endcsname} -\ifdefined\closelua - - \def\definenamedlua[#1]#2[#3]% no optional arg handling here yet - {\expanded{\long\def\csname dodostartnamed#1\v!code\endcsname####1\csname\e!stop#1\v!code\endcsname}% - {\normalexpanded{\endgroup\noexpand\directlua\!!name{#3}\zerocount{protect("#1\s!data")##1}}}% - \long\expandafter\def\csname\e!start#1\v!code\endcsname {\dostartnamedluacode{#1}}% - \long\expandafter\def\csname #1\v!code\endcsname##1{\directlua\!!name{#3}\zerocount{protect("#1\s!data")##1}}} - -\else - - \def\definenamedlua[#1]#2[#3]% no optional arg handling here yet - {\scratchcounter\ctxlua{lua.registername("#1","#3")}% - \expanded{\long\edef\csname dodostartnamed#1\v!code\endcsname####1\csname\e!stop#1\v!code\endcsname}% - {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}% - \long\expandafter\def \csname\e!start#1\v!code\endcsname {\dostartnamedluacode{#1}}% - \long\expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}} - -\fi +\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet + {\scratchcounter\ctxlua{lua.registername("#1","#3")}% + \normalexpanded{\long\edef\csname dodostartnamed#1\v!code\endcsname##1\csname\e!stop#1\v!code\endcsname}% + {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}% + \long\expandafter\def \csname\e!start#1\v!code\endcsname {\dostartnamedluacode{#1}}% + \long\expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}} %D We predefine a few. @@ -244,4 +232,8 @@ % % options=\luaparameterset{u3d:myset:display:1}{toolbar=false,tree=true} +%D A Handy helper: + +\def\luaconditional#1{\ifcase#1tru\else fals\fi e} + \protect \endinput diff --git a/tex/context/base/luat-lib.mkiv b/tex/context/base/luat-lib.mkiv index 1905ee67d..f8f71dd0a 100644 --- a/tex/context/base/luat-lib.mkiv +++ b/tex/context/base/luat-lib.mkiv @@ -42,7 +42,7 @@ \registerctxluafile{luat-ini} {1.001} \registerctxluafile{luat-env} {1.001} -\registerctxluafile{l-xml} {1.001} % we want tracking +\registerctxluafile{l-xml} {1.001} % we need to load lxml-tab earlier so this will change ! \startruntimeluacode \edef\asciia{\ctxlua{tex.sprint(logs.mode)}} diff --git a/tex/context/base/lxml-ini.tex b/tex/context/base/lxml-ini.mkiv index 494e4f0b7..494e4f0b7 100644 --- a/tex/context/base/lxml-ini.tex +++ b/tex/context/base/lxml-ini.mkiv diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua index 6ceadb678..77c28f8d3 100644 --- a/tex/context/base/lxml-tab.lua +++ b/tex/context/base/lxml-tab.lua @@ -445,7 +445,7 @@ generic table copier. Since we know what we're dealing with we can speed up things a bit. The second argument is not to be used!</p> --ldx]]-- -function copy(old,tables) +local function copy(old,tables) if old then tables = tables or { } local new = { } diff --git a/tex/context/base/m-format.tex b/tex/context/base/m-format.tex new file mode 100644 index 000000000..0f274b236 --- /dev/null +++ b/tex/context/base/m-format.tex @@ -0,0 +1,409 @@ +%D \module +%D [ file=m-formay, +%D version=ancient, +%D title=\CONTEXT\ Modules, +%D subtitle=Ancient Formatting Code, +%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 Here is some code that I had laying around and had forgotten +%D about. Let's make it a module and see if there is interest in +%D such things. + +% \defineformatblock [poem] +% \defineformatsegment [verse] % [poem] +% \defineformatline [line] % [verse] +% +% \startpoem [title] [author] +% \startverse [ref] +% \startline [ref] +% +% block : voor na tussen *tekstletter *tekstkleur +% +% segment : voor na tussen *tekstletter *tekstkleur +% : links rechts linkeroffset rechteroffset +% : ?marge *evenmarge *onevenmarge breedte +% : nummer *nummercommando *conversie +% : nummerletter nummerkleur *label +% +% line : voor na tussen *tekstletter *tekstkleur +% : nummer *nummercommando *conversie +% : nummerletter nummerkleur *label +% +% * = todo + +\unprotect + +\definesystemvariable {fx} % format block +\definesystemvariable {fy} % format segment +\definesystemvariable {fz} % format line + +\def\defineformatblock + {\dodoubleempty\dodefineformatblock} + +\def\dodefineformatblock[#1][#2]% + {\setupformatblock + [#1] + [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank, + \c!textstyle=,\c!textcolor=,#2]% + \setvalue{\e!start#1}{\startformatblock[#1]}% + \setvalue{\e!stop #1}{\stopformatblock}} + +\def\setupformatblock + {\dodoubleempty\dosetupformatblock} + +\def\setupformatblock[#1]% + {\getparameters[\??fx#1]} + +\def\startformatblock[#1]% + {\dotriplegroupempty\dostartformatblock{#1}} + +\def\dostartformatblock#1#2#3 + {\bgroup + \getvalue{\??fx#1\c!before} + \doglobal\newcounter\formatsegmentcounter + \doglobal\newcounter\formatlinecounter + \doglobal\newcounter\formatlinesubcounter + \doglobal\newcounter\formatlinemaxcounter + \doifsomething{#2}{\leftaligned{#2}\getvalue{\??fx#1\c!inbetween}} + \def\stopformatblock% + {\doifsomething{#3}{\getvalue{\??fx#1\c!inbetween}\leftaligned{#3}} + \getvalue{\??fx#1\c!after} + \egroup}} + +\def\defineformatsegment + {\dodoubleempty\dodefineformatsegment} + +\def\dodefineformatsegment[#1][#2]% + {\setupformatsegment + [#1] + [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank, + \c!textstyle=,\c!textcolor=,\c!left=,\c!right=, + \c!leftoffset=\!!zeropoint,\c!rightoffset=\!!zeropoint, + %\c!margin=\!!zeropoint,\c!evenmargin=\!!zeropoint,\c!oddmargin=\hsize, + \c!width=\hsize,\c!numberstyle=,\c!numbercolor=,\c!number=\v!no, + \c!numbercommand=,\c!conversion=,\c!label=, + #2]% + \setvalue{\e!start#1}{\startformatsegment[#1]}% + \setvalue{\e!stop #1}{\stopformatsegment}} + +\def\setupformatsegment + {\dodoubleempty\dosetupformatsegment} + +\def\setupformatsegment[#1]% + {\getparameters[\??fy#1]} + +\def\placeformatsegmentcounter + {\formatsegmentcounter\quad\hphantom{\placeformatlinecounter}} + +\def\placeformatlinecounter + {\formatlinecounter} + +\def\startformatsegment[#1]% + {\bgroup + \doifelsevalue{\??fy#1\c!number}\v!yes + {\def\doplaceformatsegmentcounter + {\inleftmargin + {\doattributes{\??fy#1}\c!numberstyle\c!numbercolor + {\placeformatsegmentcounter}}}} + {\let\doplaceformatsegmentcounter\relax}% + \getvalue{\??fy#1\c!before} + \doglobal\increment\formatsegmentcounter + \def\formatrightoffset{\getvalue{\??fy#1\c!rightoffset}} + \def\formatleftoffset {\getvalue{\??fy#1\c!leftoffset}} + \def\formatminwidth {\getvalue{\??fy#1\c!minwidth}} + \def\formatwidth {\getvalue{\??fy#1\c!width}} + %\def\formatmargin {\getvalue{\??fy#1\c!margin}} + \def\formatbefore {\getvalue{\??fy#1\c!before}} + \def\formatinbetween {\getvalue{\??fy#1\c!inbetween}} + \def\formatafter {\getvalue{\??fy#1\c!after}} + \def\formatleft {\getvalue{\??fy#1\c!left}} + \def\formatright {\getvalue{\??fy#1\c!right}} + \@@segmentvarianta + \getvalue{@@segmentvariant\getvalue{\??fy#1\c!alternative}} + \def\stopformatsegment + {\getvalue{\??fy#1\c!after} + \egroup}} + +\newif\iftraceformatblock + +\def\@@segmentvarianta % ragged right, symbols + {\let\formatraggedness\raggedright + \let\dostartformatline\dostartformatlineab + \let\formatleftfirst\relax \let\formatrightfirst\hfill + \let\formatleftnext \hfill \let\formatrightnext \relax} + +\def\@@segmentvariantb % ragged right, equal parts, symbols + {\let\formatraggedness\raggedcenter + \let\dostartformatline\dostartformatlineab + \let\formatleftfirst\relax \let\formatrightfirst\hfill + \let\formatleftnext \hfill \let\formatrightnext \relax} + +\def\@@segmentvariantc % ragged right + {\let\formatraggedness\veryraggedright + \let\dostartformatline\dostartformatlinecde + \let\formatleftnext\relax \let\formatrightnext\hfill} + +\def\@@segmentvariantd % ragged center + {\let\formatraggedness\veryraggedcenter + \let\dostartformatline\dostartformatlinecde + \let\formatleftnext\hfill \let\formatrightnext\hfill} + +\def\@@segmentvariante % ragged left + {\let\formatraggedness\veryraggedleft + \let\dostartformatline\dostartformatlinecde + \let\formatleftnext\hfill \let\formatrightnext\relax} + +\def\defineformatline + {\dodoubleempty\dodefineformatline} + +\def\dodefineformatline[#1][#2]% + {\setupformatline + [#1] + [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank, + \c!textstyle=,\c!textcolor=, + \c!number=\v!no,\c!numbercommand=,\c!conversion=, + \c!numberstyle=,\c!numbercolor=,\c!label=, + #2]% + \setvalue{\e!start#1}{\startformatline[#1]}% + \setvalue{\e!stop #1}{\stopformatline}} + +\def\setupformatline + {\dodoubleempty\dosetupformatline} + +\def\setupformatline[#1]% + {\getparameters[\??fz#1]} + +\newconditional\formatforcedbreak + +\def\startformatline[#1]% + {\bgroup + \doifelsevalue{\??fz#1\c!number}\v!yes + {\def\doplaceformatlinecounter + {\inleftmargin + {\doattributes{\??fz#1}\c!numberstyle\c!numbercolor + {\placeformatlinecounter}}}} + {\let\doplaceformatlinecounter\relax}% + \global\setfalse\formatforcedbreak + \def\\{\break\global\settrue\formatforcedbreak}% + \hsize\formatwidth + \doglobal\increment\formatlinecounter + \par + \nobreak + \def\stopformatline + {\unskip\unskip\unskip\unskip\unskip\egroup + \let\doplaceformatsegmentcounter\relax} + \postponenotes + \dowithnextbox{\dostartformatline}\hbox\bgroup\ignorespaces} + +\def\dostartformatlineab + {%\dosetleftskipadaption\formatmargin + %\advance\hsize-\leftskipadaption\relax + \ifdim\nextboxwd>\hsize + \beginofshapebox + \forgetall + \hangafter\plusone + \hangindent\formatleftoffset + \formatraggedness + \hskip\formatrightoffset + \unhbox\nextbox\par + \endofshapebox + %\advance\hsize \leftskipadaption + \doglobal\newcounter\formatlinesubcounter + \reshapebox + {\doglobal\increment\formatlinesubcounter} + \global\let\formatlinemaxcounter\formatlinesubcounter + \reshapebox + {\doglobal\decrement\formatlinesubcounter + \ifnum\formatlinesubcounter=\zerocount + \doplaceformatsegmentcounter + \doplaceformatlinecounter + \hskip-\formatrightoffset + %\hskip\leftskipadaption + \formatleftfirst + \unhbox\shapebox + \ifnum\formatlinemaxcounter>\plusone + \ifx\formatright\empty\else + \shapedhbox to \zeropoint{\formatright\hss}% + \fi + \fi + \formatrightfirst + \iftraceformatblock + \ruledhskip\formatrightoffset\hskip-\formatrightoffset + \fi + \else + %\hskip\leftskipadaption + \iftraceformatblock + \ruledhskip\formatleftoffset\hskip-\formatleftoffset + \fi + \formatleftnext + \ifx\formatleft\empty\else + \shapedhbox to \zeropoint{\hss\formatleft}% + \fi + \unhbox\shapebox + \formatrightnext + \fi} + \flushshapebox + \else + \dontleavehmode\hbox + {\doplaceformatsegmentcounter + \doplaceformatlinecounter + %\hskip\leftskipadaption + \formatleftfirst + \unhbox\nextbox + \formatrightfirst} + \fi + \par + \egroup} + +\def\dostartformatlinecde + {%\dosetleftskipadaption\formatmargin + %\advance\hsize -\leftskipadaption\relax + \dimen0=\hsize + \ifconditional\formatforcedbreak\else + \ifdim\formatminwidth>\zeropoint\relax + \ifdim\nextboxwd>\hsize + \doloop + {\global\dimen1=\dimen0 + \beginofshapebox + \hsize\dimen0 + \forgetall + \formatraggedness + \unhcopy\nextbox\par + \endofshapebox + \reshapebox + {\setbox\scratchbox=\hbox{\unhbox\shapebox}% + \ifdim\wd\scratchbox<\dimen1 + \global\dimen1=\wd\scratchbox + \fi} + \ifdim\dimen1<\formatminwidth\relax + \advance\dimen0 by -.25em + \else + \exitloop + \fi + \ifdim\dimen0<10em + \dimen0=\hsize + \exitloop + \fi} + \fi + \fi + \fi + \beginofshapebox + \hsize\dimen0 + \forgetall + \formatraggedness + \unhcopy\nextbox\par + \endofshapebox + %\advance\hsize \leftskipadaption + \doglobal\newcounter\formatlinesubcounter + \reshapebox + {\doglobal\increment\formatlinesubcounter}% + \global\let\formatlinemaxcounter\formatlinesubcounter + \reshapebox + {\doglobal\decrement\formatlinesubcounter + \ifnum\formatlinesubcounter=\zerocount + \doplaceformatsegmentcounter + \doplaceformatlinecounter + \fi + %\hskip\leftskipadaption + \formatleftnext + \unhbox\shapebox + \formatrightnext\strut}% strut prevents unskip + \flushshapebox + \par + \egroup} + +\defineformatblock[poem] + [\c!before=\blank, + \c!inbetween={\blank[\v!medium]}, + \c!after=\blank] + +\defineformatsegment[verse] + [\c!alternative=\v!left, + \c!width=\hsize, + %\c!margin=\!!zeropoint, + \c!before={\blank[\v!medium]}, + \c!after={\blank[\v!medium]}, + \c!inbetween={\blank[\v!medium]}, + \c!leftoffset=3em, + \c!rightoffset=2em, + \c!minwidth=5em, + \c!left={$[$\enspace}, + \c!right={\enspace$]$}] + +\defineformatline[line] + [] + +\protect \doifnotmode{demo} {\endinput} + +% evt defineblank[formatbefore,formatinbetween,formatafter] + +%\showframe \traceformatblocktrue + +\usemodule[visual] + +\setuplayout[height=middle,topspace=1cm,header=0pt,footer=0pt] +\setupbodyfont[10pt] + +% All interfaces supported, but testing with english; todo: +% more options, more alternatives, inheritance and mixed +% definitions, and so. + +\starttext + +\startbuffer +\startbuffer[poem] +\startpoem{A Random Poem}{Hans Hagen} + \startverse + \startline \fakewords{4}{8} \stopline + \startline \fakewords{4}{8} \stopline + \startline \fakewords{4}{8} \stopline + \startline \fakewords{4}{8} \stopline + \stopverse + \startverse + \startline \fakewords{4}{8} \stopline + \startline \fakewords{4}{8} \stopline + \startline \fakewords{4}{8} \stopline + \startline \fakewords{4}{8} \stopline + \stopverse +\stoppoem +\stopbuffer + +\setupformatsegment[verse][width=.4\hsize,number=yes,numberstyle=slanted] +\setupformatline [line] [number=yes,numberstyle=smallslanted] + +\startbuffer[x] +\setupformatsegment[verse][leftoffset=0pt,rightoffset=0pt,left=,right=] +\stopbuffer + +\section{Alternative A} + +\setupformatsegment[verse][alternative=a] {\getbuffer[poem]} +\setupformatsegment[verse][alternative=a] {\getbuffer[x,poem]} + +\section{Alternative B} + +\setupformatsegment[verse][alternative=b] {\getbuffer[poem]} +\setupformatsegment[verse][alternative=b] {\getbuffer[x,poem]} + +\section{Alternative C} + +\setupformatsegment[verse][alternative=c] {\getbuffer[poem]} + +\section{Alternative D} + +\setupformatsegment[verse][alternative=d] {\getbuffer[poem]} + +\section{Alternative E} + +\setupformatsegment[verse][alternative=e] {\getbuffer[poem]} +\stopbuffer + +\typebuffer \getbuffer + +\stoptext diff --git a/tex/context/base/math-ams.tex b/tex/context/base/math-ams.mkii index 83070d01a..83070d01a 100644 --- a/tex/context/base/math-ams.tex +++ b/tex/context/base/math-ams.mkii diff --git a/tex/context/base/math-cow.tex b/tex/context/base/math-cow.mkii index f0fc811c8..f0fc811c8 100644 --- a/tex/context/base/math-cow.tex +++ b/tex/context/base/math-cow.mkii diff --git a/tex/context/base/math-def.mkiv b/tex/context/base/math-def.mkiv index 9e6ad28c1..0438777fa 100644 --- a/tex/context/base/math-def.mkiv +++ b/tex/context/base/math-def.mkiv @@ -132,7 +132,7 @@ \def\setoperatorlimits#1#2% operator limits {\savenormalmeaning{#1}% - \def#1{\getvalue{normal\strippedcsname#1}#2}} + \def#1{\csname normal\strippedcsname#1\endcsname#2}} \setoperatorlimits\int \intlimits \setoperatorlimits\iint \intlimits diff --git a/tex/context/base/math-eul.tex b/tex/context/base/math-eul.mkii index 7552957a8..7552957a8 100644 --- a/tex/context/base/math-eul.tex +++ b/tex/context/base/math-eul.mkii diff --git a/tex/context/base/math-fou.tex b/tex/context/base/math-fou.mkii index 8a72f1288..8a72f1288 100644 --- a/tex/context/base/math-fou.tex +++ b/tex/context/base/math-fou.mkii diff --git a/tex/context/base/math-frc.mkiv b/tex/context/base/math-frc.mkiv index d40306199..2305cec30 100644 --- a/tex/context/base/math-frc.mkiv +++ b/tex/context/base/math-frc.mkiv @@ -126,21 +126,21 @@ % let's see who complains ... \mathstyle is now a primitive % % \unexpanded\def\ch#1% -% {\ifundefined\@@chemicalletter -% \mathstyle{\rm#1}% -% \else +% {\ifdefined\@@chemicalletter % \dosetsubscripts % \mathstyle{\@@chemicalletter{#1}}% % \doresetsubscripts +% \else +% \mathstyle{\rm#1}% % \fi} % \unexpanded\def\ch#1% -% {\ifundefined\@@chemicalletter -% \mathematics{\rm#1}% -% \else +% {\ifdefined\@@chemicalletter % \dosetsubscripts % \mathematics{\@@chemicalletter{#1}}% % \doresetsubscripts +% \else +% \mathematics{\rm#1}% % \fi} %D \macros diff --git a/tex/context/base/math-ini.mkii b/tex/context/base/math-ini.mkii index 7d87fb365..6713987f7 100644 --- a/tex/context/base/math-ini.mkii +++ b/tex/context/base/math-ini.mkii @@ -386,7 +386,7 @@ \else \edef\mathclass{#1}% \fi - \doinputonce{\truefilename{\f!mathprefix\mathclass}}% + \doinputonce{\truefilename{\f!mathprefix\mathclass}.mkii}% \doifsomething\fontclass{\setevalue{\@mc@\fontclass\@mc@}{\mathclass}}% \popmacro\mathclass \popmacro\fontclass} @@ -410,7 +410,7 @@ \def\resetmathcollection[#1]% {\def\mathcollection{#1}% - \forgetdoingonce{\f!mathprefix\mathcollection}% + \forgetdoingonce{\f!mathprefix\mathcollection.mkii}% \setmathtoks \ifx\mathtoks\relax\else\mathtoks\emptytoks\fi} diff --git a/tex/context/base/math-inl.mkiv b/tex/context/base/math-inl.mkiv index acbf02de7..93168b885 100644 --- a/tex/context/base/math-inl.mkiv +++ b/tex/context/base/math-inl.mkiv @@ -94,8 +94,7 @@ \setbox\nextbox\hbox{$#2$}% \iftracegridsnapping \setbox\nextbox\ruledhbox - {\incolortrue\localcolortrue - \backgroundline[gray]{\showstruts\strut\flushnextbox}}% + {\backgroundline[gray]{\showstruts\strut\flushnextbox}}% \fi \def\docommand##1% {\doif{##1}-{\settrue \halfcrazymathlines}% @@ -187,9 +186,7 @@ \forgetall \crazymathindent \iftracegridsnapping - \setbox\scratchbox\hbox - {\incolortrue\localcolortrue\green - \ruledhbox{\box\scratchbox}}% + \setbox\scratchbox\hbox{\green\ruledhbox{\box\scratchbox}}% \fi \box\scratchbox \endgraf @@ -240,8 +237,7 @@ {\forgetall \crazymathindent \iftracegridsnapping - \setbox\scratchbox\hbox - {\incolortrue\localcolortrue\color[blue]{\ruledhbox{\box\scratchbox}}}% + \setbox\scratchbox\hbox{\blue\ruledhbox{\box\scratchbox}}% \fi \box\scratchbox \endgraf diff --git a/tex/context/base/math-lbr.tex b/tex/context/base/math-lbr.mkii index 7ac7c3aff..7ac7c3aff 100644 --- a/tex/context/base/math-lbr.tex +++ b/tex/context/base/math-lbr.mkii diff --git a/tex/context/base/math-noa.lua b/tex/context/base/math-noa.lua index bbbd5285e..7985834f2 100644 --- a/tex/context/base/math-noa.lua +++ b/tex/context/base/math-noa.lua @@ -192,7 +192,7 @@ noads.processors.relocate[math_delim] = function(pointer) end end -function noads.relocate_characters(head,tail,style,penalties) +function noads.relocate_characters(head,style,penalties) process(head,noads.processors.relocate) return true end @@ -227,7 +227,7 @@ noads.processors.resize[math_fence] = function(pointer) end end -function noads.resize_characters(head,tail,style,penalties) +function noads.resize_characters(head,style,penalties) process(head,noads.processors.resize) return true end @@ -290,14 +290,14 @@ noads.processors.respace[math_noad] = function(pointer) end -function noads.respace_characters(head,tail,style,penalties) +function noads.respace_characters(head,style,penalties) noads.process(head,noads.processors.respace) return true end -- the normal builder -function noads.mlist_to_hlist(head,tail,style,penalties) +function noads.mlist_to_hlist(head,style,penalties) return mlist_to_hlist(head,style,penalties), true end @@ -309,12 +309,7 @@ tasks.new ( } ) ---~ tasks.appendaction("math", "normalizers", "noads.relocate_characters", nil, "nohead") ---~ tasks.appendaction("math", "normalizers", "noads.resize_characters", nil, "nohead") ---~ tasks.appendaction("math", "normalizers", "noads.respace_characters", nil, "nohead") ---~ tasks.appendaction("math", "builders", "noads.mlist_to_hlist", nil, "notail") - -local actions = tasks.actions("math",2) -- head, tail, style, penalties +local actions = tasks.actions("math",2) -- head, style, penalties local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming diff --git a/tex/context/base/math-tex.tex b/tex/context/base/math-tex.mkii index c833db956..c833db956 100644 --- a/tex/context/base/math-tex.tex +++ b/tex/context/base/math-tex.mkii diff --git a/tex/context/base/math-tim.tex b/tex/context/base/math-tim.mkii index 3b9aea103..3b9aea103 100644 --- a/tex/context/base/math-tim.tex +++ b/tex/context/base/math-tim.mkii diff --git a/tex/context/base/math-uni.tex b/tex/context/base/math-uni.mkii index e8fd3f05d..e8fd3f05d 100644 --- a/tex/context/base/math-uni.tex +++ b/tex/context/base/math-uni.mkii diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua index 35d18d77a..0e06d3757 100644 --- a/tex/context/base/math-vfu.lua +++ b/tex/context/base/math-vfu.lua @@ -240,6 +240,8 @@ function fonts.basecopy(tfmtable) return t end +local reported = { } + function fonts.vf.math.define(specification,set) if not reverse then reverse = { } @@ -335,9 +337,16 @@ function fonts.vf.math.define(specification,set) for unicode, index in next, vector do local fci = fc[index] if not fci then - -- if trace_virtual then - logs.report("math virtual", "unicode point U+%04X has no index %04X in %s",unicode,index,vectorname) - -- end + local fontname = fs.name + local rf = reported[fontname] + if not rf then rf = { } reported[fontname] = rf end + local rv = rf[vectorname] + if not rv then rv = { } rf[vectorname] = rv end + local ru = rv[unicode] + if not ru then + logs.report("math virtual", "unicode point U+%05X has no index %04X in vector %s for font %s",unicode,index,vectorname,fontname) + rv[unicode] = true + end else local ref = si[index] if not ref then @@ -503,6 +512,7 @@ function fonts.vf.math.define(specification,set) main.has_italic = true main.type = "virtual" -- not needed mathematics.scaleparameters(main,main,1) +main.nomath = false return main end @@ -1327,8 +1337,8 @@ mathematics.make_font ( "lmroman6-math", { { name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true }, - { name = "eufm6.tfm", vector = "tex-fraktur", optional=true }, - { name = "eufb6.tfm", vector = "tex-fraktur-bold", optional=true }, + { name = "eufm5.tfm", vector = "tex-fraktur", optional=true }, + { name = "eufb5.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr7 : LMMathRoman7-Regular @@ -1373,8 +1383,8 @@ mathematics.make_font ( "lmroman8-math", { { name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true }, - { name = "eufm8.tfm", vector = "tex-fraktur", optional=true }, - { name = "eufb8.tfm", vector = "tex-fraktur-bold", optional=true }, + { name = "eufm7.tfm", vector = "tex-fraktur", optional=true }, + { name = "eufb7.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr9 : LMMathRoman9-Regular @@ -1395,8 +1405,8 @@ mathematics.make_font ( "lmroman9-math", { { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans9-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono9-regular.otf", vector = "tex-tt", optional=true }, - { name = "eufm9.tfm", vector = "tex-fraktur", optional=true }, - { name = "eufb9.tfm", vector = "tex-fraktur-bold", optional=true }, + { name = "eufm10.tfm", vector = "tex-fraktur", optional=true }, + { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr10 : LMMathRoman10-Regular @@ -1424,6 +1434,24 @@ mathematics.make_font ( "lmroman10-math", { { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, } ) +mathematics.make_font ( "lmroman10-boldmath", { + { name = "lmroman10-bold.otf", features = "virtualmath", main = true }, + -- { name = "rm-lmr10.tfm", vector = "tex-mr" } , + { name = "lmmib10.tfm", vector = "tex-mi", skewchar=0x7F }, + { name = "lmbsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , + { name = "lmex10.tfm", vector = "tex-ex", extension = true } , +-- copied from roman: + { name = "msam10.tfm", vector = "tex-ma" }, + { name = "msbm10.tfm", vector = "tex-mb" }, + -- { name = "rm-lmbx10.tfm", vector = "tex-bf" } , + { name = "lmroman10-bold.otf", "tex-bf" } , + { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } , + { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true }, + { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true }, + { name = "eufm10.tfm", vector = "tex-fraktur", optional=true }, + { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, +} ) + -- rm-lmr12 : LMMathRoman12-Regular -- rm-lmbx12 : LMMathRoman12-Bold -- lmmi12 : LMMathItalic12-Italic @@ -1468,8 +1496,8 @@ mathematics.make_font ( "lmroman17-math", { mathematics.make_font ( "px-math", { { name = "texgyrepagella-regular.otf", features = "virtualmath", main = true }, - { name = "pxr.tfm", vector = "tex-mr" } , - { name = "pxmi.tfm", vector = "tex-mi", skewchar=0x7F }, + { name = "rpxr.tfm", vector = "tex-mr" } , + { name = "rpxmi.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "pxsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "pxex.tfm", vector = "tex-ex", extension = true } , { name = "pxsya.tfm", vector = "tex-ma" }, @@ -1478,8 +1506,8 @@ mathematics.make_font ( "px-math", { mathematics.make_font ( "tx-math", { { name = "texgyretermes-regular.otf", features = "virtualmath", main = true }, - { name = "txr.tfm", vector = "tex-mr" } , - { name = "txmi.tfm", vector = "tex-mi", skewchar=0x7F }, + { name = "rtxr.tfm", vector = "tex-mr" } , + { name = "rtxmi.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "txsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "txex.tfm", vector = "tex-ex", extension = true } , { name = "txsya.tfm", vector = "tex-ma" }, diff --git a/tex/context/base/meta-ini.mkii b/tex/context/base/meta-ini.mkii index ee7e8a38b..f9d097049 100644 --- a/tex/context/base/meta-ini.mkii +++ b/tex/context/base/meta-ini.mkii @@ -20,22 +20,6 @@ \unprotect -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - %D This module extends the functionality of the support module %D \type {supp-mps}, the module that is responsible for %D \METAPOST\ inclusion in \CONTEXT. Some basic macros will be @@ -151,6 +135,19 @@ \def\MPrawvar#1#2{\csname#1:#2\endcsname} +\def\presetMPvariable + {\dodoubleargument\dopresetMPvariable} + +\def\dopresetMPvariable[#1][#2=#3]% + {\doifundefined{#1:#2}{\setvalue{#1:#2}{#3}}} + +\def\useMPvariables + {\dodoubleargument\douseMPvariables} + +\def\douseMPvariables[#1][#2]% + {\def\@@meta{#1:}% + \prepareMPvariables{#2}} + %D \macros %D {startuniqueMPgraphic, uniqueMPgraphic} %D diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv index 0e0adc54f..042f7247e 100644 --- a/tex/context/base/meta-ini.mkiv +++ b/tex/context/base/meta-ini.mkiv @@ -74,10 +74,6 @@ {\doifnot{#1}{+}{\global\MPuserinclusions\emptytoks}% \global\MPuserinclusions\expandafter{\the\MPuserinclusions#2}} -% \ifx \overlaywidth \undefined \def \overlaywidth {4cm} \fi -% \ifx \overlayheight \undefined \def \overlayheight {3cm} \fi -% \ifx \overlaylinewidth \undefined \def \overlaylinewidth {0pt} \fi - \def\presetMPdefinitions {\edef\overlaywidth {\overlaywidth \space}% \edef\overlayheight {\overlayheight \space}% @@ -87,53 +83,6 @@ \def\currentMPformat{metafun} -% todo: -% -% \splitMPgraphicname[a::b] (\currentMPgraphicformat,\currentMPgraphicname) -% \splitMPgraphicname[a] (\currentMPgraphicformat,\currentMPgraphicname) -% \splitMPgraphicname[a::b::c] (\currentMPgraphicformat,\currentMPgraphicname) -% -% \resetMPformat[extrafun] -% -% MPinclusions etc only for metafun, randomseed for all -% -% todo: \resetMPformat[instance] -> unload and nil -% todo: geen page stats -% todo: textext in plain mp - -% \startMPdefinitions{metafun} -% color MyColor ; MyColor = red ; -% \stopMPdefinitions -% \startuseMPgraphic{test1} -% fill fullcircle scaled 1cm withcolor MyColor ; -% \stopuseMPgraphic -% \startuseMPgraphic{test2} -% color MyColor ; MyColor = green ; -% fill fullcircle scaled 1cm withcolor MyColor ; -% \stopuseMPgraphic -% \startuseMPgraphic{test3} -% fill fullcircle scaled 1cm withcolor MyColor ; -% \stopuseMPgraphic -% \startuseMPgraphic{test4} -% color MyColor ; MyColor = blue ; -% \stopuseMPgraphic -% -% \useMPgraphic{metafun::test1} -% \useMPgraphic{metafun::test2} -% \useMPgraphic{metafun::test3} -% \useMPgraphic{extrafun::test4} -% \useMPgraphic{extrafun::test3} -% \useMPgraphic{metafun::test3} -% \useMPgraphic{nofun::test4} -% \useMPgraphic{nofun::test3} -% -% \startMPcode -% fill fullsquare scaled 1cm ; -% \stopMPcode -% \startMPcode{metafun} -% fill fullsquare scaled 1cm withcolor MyColor ; -% \stopMPcode - \def\@@MPF{@MPF@} \def\MPinstancetoks{\csname\@@MPF::\currentMPgraphicinstance\endcsname} @@ -180,40 +129,13 @@ \def\endMPgraphicgroup {\endgroup} -% - \newconditional \METAFUNinitialized \def\MPaskedfigure{false} -% maybe we need to force black, i.e. fake nodes - -\long\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig - {\begingroup - \enableincludeMPgraphics - \the\everyMPgraphic - \presetMPdefinitions - \setMPrandomseed % this has to change - % we need to preexpand the token lists - \setbox\MPgraphicbox\hbox\bgroup - \ctxlua{metapost.graphic("\currentMPformat", "\currentMPformat", - \@EA\!!bs\the\MPinitializations;\theMPrandomseed;#1;\!!es, % code - \@EA\@EA\@EA\!!bs\@EA\the\@EA\MPextensions\@EA;\the\MPuserinclusions;\!!es, % optional preamble - \MPaskedfigure - )}% - \global\settrue\METAFUNinitialized - \global\MPextensions\emptytoks - \global\MPuserinclusions\emptytoks - \egroup - \placeMPgraphic - \endgroup} - -% ! ! ! ! begin temporary ! ! ! ! - -\let\normalprocessMPgraphic\processMPgraphic - \long\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig {\begingroup % needed? +\forgetall \enableincludeMPgraphics \the\everyMPgraphic \presetMPdefinitions @@ -223,7 +145,7 @@ {\settrue\includeMPextensions\letgvalue{\@@MPF\currentMPgraphicinstance\s!extensions}\v!no} {\setfalse\includeMPextensions}% \doifelsevalue{\@@MPF\currentMPgraphicinstance\s!initializations}\v!yes - {\settrue\includeMPinitializations}% \letgvalue{\@@MPF\currentMPgraphicinstance\s!initializations}\v!no} + {\settrue\includeMPinitializations }% {\setfalse\includeMPinitializations}% \setbox\MPgraphicbox\hbox\bgroup \normalexpanded{\noexpand\ctxlua{metapost.graphic("\currentMPgraphicinstance", "\currentMPgraphicformat", @@ -234,18 +156,9 @@ \egroup \global\MPinstancetoks\emptytoks \global\settrue\METAFUNinitialized % becomes obsolete - %\global\MPextensions\emptytoks % multipls instances - %\global\MPuserinclusions\emptytoks % multipls instances \placeMPgraphic \endgroup} -\let\extendedprocessMPgraphic\processMPgraphic - -% \let\processMPgraphic\normalprocessMPgraphic -\let\processMPgraphic\extendedprocessMPgraphic - -% ! ! ! ! end temporary ! ! ! ! - \newif\ifsetMPrandomseed \setMPrandomseedtrue % false by default \def\setMPrandomseed @@ -286,25 +199,6 @@ \def\getMPdrawing{\dosinglegroupempty\dogetMPdrawing} -% \def\nodogetMPdrawing#1% -% {\ifMPdrawingdone -% \expandafter\processMPgraphic\expandafter{\MPdrawingdata}% -% \fi} -% -% \def\dostartMPcode -% {\iffirstargument -% \expandafter\dodogetMPdrawing -% \else -% \expandafter\nodogetMPdrawing -% \fi} -% -% \def\dodogetMPdrawing#1% -% {\ifMPdrawingdone -% \beginMPgraphicgroup{#1::\s!dummy}% name does not matter -% \expandafter\processMPgraphic\expandafter{\MPdrawingdata}% -% \endMPgraphicgroup -% \fi} - \def\startMPdrawing {\dosingleempty\dostartMPdrawing} @@ -395,14 +289,6 @@ defaultfont:="rm-lmtt10"; \stopMPinitializations -%D In order to support fancy text features (like outline -%D fonts), we set: - -% \startMPextensions -% graphictextformat:="context"; -% graphictextdirective "\the\everyMPTEXgraphic"; -% \stopMPextensions - %D A signal that we're in combines \CONTEXT||\METAFUN mode: \startMPextensions @@ -423,16 +309,6 @@ \prependtoks \MPstaticgraphictrue \to \everyoverlay \prependtoks \MPstaticgraphictrue \to \everypagebody -% %D We save the number of graphics for the sake of \TEXEXEC. -% -% \newcounter\totalnofMPgraphics -% -% \def\thenofMPgraphics{\the\nofMPgraphics} % from supp-mps -% -% \appendtoks -% \savecurrentvalue\totalnofMPgraphics\thenofMPgraphics -% \to \everybye - %D \macros %D {setupMPvariables} %D @@ -472,6 +348,19 @@ \def\MPrawvar#1#2{\csname#1:#2\endcsname} +\def\presetMPvariable + {\dodoubleargument\dopresetMPvariable} + +\def\dopresetMPvariable[#1][#2=#3]% + {\ifcsname#1:#2\endcsname\else\setvalue{#1:#2}{#3}\fi} + +\def\useMPvariables + {\dodoubleargument\douseMPvariables} + +\def\douseMPvariables[#1][#2]% + {\def\@@meta{#1:}% + \prepareMPvariables{#2}} + %D \macros %D {startuniqueMPgraphic, uniqueMPgraphic} %D @@ -510,7 +399,6 @@ \newcount\MPobjectcounter \newbox \MPgraphicbox -%newif \ifMPshiftdrawing \MPshiftdrawingfalse \chardef\MPboxmode\zerocount @@ -555,7 +443,7 @@ \extendMPoverlaystamp{#2}% incl prepare \ifcsname\@@MPG\overlaystamp:#1\endcsname\else \enableincludeMPgraphics - \forgetall +% \forgetall \global\advance\MPobjectcounter\plusone \setobject{MP}{\number\MPobjectcounter}\hbox{\processMPgraphic{#3}}% was vbox, graphic must end up as hbox \setxvalue{\@@MPG\overlaystamp:#1}{\noexpand\reuseMPbox{\number\MPobjectcounter}{\MPllx}{\MPlly}{\MPurx}{\MPury}}% @@ -582,7 +470,7 @@ \long\def\handleuseMPgraphic#1#2#3% {\begingroup - \forgetall % check this +% \forgetall % check this \def\@@meta{#1:}% \prepareMPvariables{#2}% \enableincludeMPgraphics @@ -810,25 +698,6 @@ %D A more general way of passing environments is: -% \def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks -% {\bgroup -% \catcode`\^^M=\@@space -% \dodoubleempty\dostartMPenvironment} - -% \long\def\dostartMPenvironment[#1][#2]#3\stopMPenvironment -% {\egroup -% \doif{#1}\s!reset\resetMPenvironment % reset mp toks -% \doif{#1}\v!global{#3}% % use in main doc too -% \doif{#1}+{#3}% % use in main doc too -% \defconvertedargument\ascii{#3}% -% \expandafter\appendtoks\ascii\to\everyMPTEXgraphic} - -% \def\resetMPenvironment -% {\everyMPTEXgraphic\emptytoks % = is really needed ! -% \startMPenvironment -% \global\loadfontfileoncetrue -% \stopMPenvironment} - \def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks {\dodoubleempty\dostartMPenvironment} @@ -846,8 +715,6 @@ \def\useMPenvironmentbuffer[#1]% {\ctxlua{metapost.tex.set(buffers.content("#1"))}} -% \useMPenvironmentbuffer[mp] % hm, what is this? - %D This command takes \type {[reset]} as optional %D argument. %D @@ -892,20 +759,6 @@ \let\MPruninstance\defaultMPgraphicinstance -% \def\useMPrun#1#2% name n -% {\begingroup -% \def\MPaskedfigure{#2}% -% \doifelsenothing{#1} -% {\useMPgraphic{\MPruninstance::mprun}}% -% {\useMPgraphic{\MPruninstance::#1}}% -% \endgroup} -% \def\startMPrun -% {\dosinglegroupempty\dostartMPrun} -% \long\def\dostartMPrun#1#2\stopMPrun -% {\edef\MPruninstance{\iffirstargument#1\else\defaultMPgraphicinstance\fi}% -% \startuseMPgraphic{mprun}#2\stopuseMPgraphic} - - \def\useMPrun#1#2% name n {\begingroup \def\MPaskedfigure{#2}% @@ -1087,22 +940,11 @@ \let \} \letterclosebrace \to \everyMPgraphic -%D Alas, the prologue settings differ per driver. - -\ifx\undefined\MPprologues \def\MPprologues{0} \fi - -% hm, not needed more than once so can be extensions - \startMPinitializations - prologues:=\MPprologues; + prologues:=0; mpprocset:=1; \stopMPinitializations -\appendtoks - \def\MPprologues{0}% - \def\MPOSTdriver{dvips}% -\to \everyresetspecials - %D \macros %D {PDFMPformoffset} %D @@ -1112,63 +954,68 @@ \def\PDFMPformoffset{\objectoffset} -%D \macros -%D {insertMPfile} -%D -%D Bypassing the special driver and figure mechanism is not -%D that nice but saves upto 5\% time in embedding \METAPOST\ -%D graphics by using the low level \PDF\ converter directly, -%D given of course that we use \PDFTEX. As a result we need to -%D fool around with the object trigger. +% %D \macros +% %D {insertMPfile} +% %D +% %D Bypassing the special driver and figure mechanism is not +% %D that nice but saves upto 5\% time in embedding \METAPOST\ +% %D graphics by using the low level \PDF\ converter directly, +% %D given of course that we use \PDFTEX. As a result we need to +% %D fool around with the object trigger. \newtoks\everyinsertMPfile -\let\insertMPfileARG\insertMPfile - -\def\insertMPfile#1#2% in context #2 is empty - {\doifelsenothing{#2}{\doinsertMPfile{#1}}{\insertMPfileARG{#1}{#2}}} - -\def\includeMPasEPS#1% untested !! - {\bgroup - \message{[MP as EPS #1]}% - \the\everyinsertMPfile - \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb - \setbox\scratchbox\vbox to \!!heightb - {\vfill - \let \@@DriverImageType \c!mps - \def \@@DriverImageFile {#1}% - \edef\@@DriverImageWidth {\the\!!widthb }% - \edef\@@DriverImageHeight{\the\!!heightb}% - \doinsertfile}% - \wd\scratchbox\!!widthb - \dp\scratchbox\zeropoint - \box\scratchbox - \egroup} - -\def\includeMPasPDF#1% - {\bgroup - \the\everyinsertMPfile - \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed - \convertMPtoPDF{#1}{1}{1}% no \plusone ! - \egroup} - -%D So, using a low level approach (thereby avoiding the slower -%D figure analysis macros) pays off. This kind of -%D optimizations are a bit tricky since we must make sure that -%D special resources end up in the (PDF) files. Because the -%D \METAPOST\ to \PDF\ can handle objects itself, it is not -%D that complicated. - -%D We hook a couple of initializations into the graphic -%D macros. - -\appendtoks - \let\figuretypes\c!mps - \runutilityfilefalse - \consultutilityfilefalse -\to \everyinsertMPfile - -%D One more: (still needed?) +% removed in backend: +% +% \def\doinsertMPfile#1% +% {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}} +% +% \let\insertMPfileARG\insertMPfile +% +% \def\insertMPfile#1#2% in context #2 is empty +% {\doifelsenothing{#2}{\doinsertMPfile{#1}}{\insertMPfileARG{#1}{#2}}} +% +% \def\includeMPasEPS#1% untested !! +% {\bgroup +% \message{[MP as EPS #1]}% +% \the\everyinsertMPfile +% \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb +% \setbox\scratchbox\vbox to \!!heightb +% {\vfill +% \let \@@DriverImageType \c!mps +% \def \@@DriverImageFile {#1}% +% \edef\@@DriverImageWidth {\the\!!widthb }% +% \edef\@@DriverImageHeight{\the\!!heightb}% +% \doinsertfile}% +% \wd\scratchbox\!!widthb +% \dp\scratchbox\zeropoint +% \box\scratchbox +% \egroup} +% +% \def\includeMPasPDF#1% +% {\bgroup +% \the\everyinsertMPfile +% \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed +% \convertMPtoPDF{#1}{1}{1}% no \plusone ! +% \egroup} +% +% %D So, using a low level approach (thereby avoiding the slower +% %D figure analysis macros) pays off. This kind of +% %D optimizations are a bit tricky since we must make sure that +% %D special resources end up in the (PDF) files. Because the +% %D \METAPOST\ to \PDF\ can handle objects itself, it is not +% %D that complicated. +% +% %D We hook a couple of initializations into the graphic +% %D macros. +% +% \appendtoks +% \let\figuretypes\c!mps +% \runutilityfilefalse +% \consultutilityfilefalse +% \to \everyinsertMPfile +% +% %D One more: (still needed?) \startMPextensions def initialize_form_numbers = @@ -1343,12 +1190,6 @@ _special_div_ := 1000\ifconditional\manyMPspecials0\fi ; \to \MPextensions -%D Needed (will become default): - -\prependtoks - \resetlanguagespecifics -\to \everyMPgraphic - %D Needed too. \let\initializeMPgraphics\relax @@ -1395,8 +1236,11 @@ \chardef\MPcolormethod\zerocount +% can be faster, just + \appendtoks - \ctxlua{metapost.set_outer_color(\number\MPcolormethod,"\PDFcolor{\currentcolorname}","")}% +% \ctxlua{metapost.set_outer_color(\number\MPcolormethod,"\PDFcolor{\currentcolorname}","")}% + \ctxlua{metapost.set_outer_color(\number\MPcolormethod,\number\currentcolormodel,\number\dogetattribute{color},\number\dogetattribute{transparency})}% \to \everyMPgraphic \startMPinitializations diff --git a/tex/context/base/meta-pag.tex b/tex/context/base/meta-pag.mkii index 000e56a2e..000e56a2e 100644 --- a/tex/context/base/meta-pag.tex +++ b/tex/context/base/meta-pag.mkii diff --git a/tex/context/base/meta-pag.mkiv b/tex/context/base/meta-pag.mkiv new file mode 100644 index 000000000..ef3817721 --- /dev/null +++ b/tex/context/base/meta-pag.mkiv @@ -0,0 +1,223 @@ +%D \module +%D [ file=meta-pag, +%D version=1999.07.10, +%D title=\METAPOST\ Graphics, +%D subtitle=Initialization, +%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 These definitions used to be part of the old \type +%D {core-mps} file, later changed into \type {meta-ini}, but +%D keeping them separate is cleaner. + +\writestatus{loading}{MetaPost Graphics / Page Data Management} + +\unprotect + +\startMPextensions + if unknown context_page: input mp-page; fi; +\stopMPextensions + +%D The next few macros tell \METAPOST\ how the \CONTEXT\ +%D pagebody looks. + +\startMPextensions + boolean PageStateAvailable,OnRightPage,InPageBody; + PageStateAvailable:=true; +\stopMPextensions + +\startMPinitializations + OnRightPage:=true; + InPageBody:=\ifinpagebody true \else false \fi; +\stopMPinitializations + +\startMPinitializations + def LoadPageState = + OnRightPage:=\MPonrightpage; + OnOddPage:=\MPonoddpage; + RealPageNumber:=\the\realpageno; + PageNumber:=\the\pageno; + NOfPages:=\lastpage; + PaperHeight:=\the\paperheight; + PaperWidth:=\the\paperwidth; + PrintPaperHeight:=\the\printpaperheight; + PrintPaperWidth:=\the\printpaperwidth; + TopSpace:=\the\topspace; + BottomSpace:=\the\bottomspace; + BackSpace:=\the\backspace; + CutSpace:=\the\cutspace; + MakeupHeight:=\the\makeupheight; + MakeupWidth:=\the\makeupwidth; + TopHeight:=\the\topheight; + TopDistance:=\the\topdistance; + HeaderHeight:=\the\headerheight; + HeaderDistance:=\the\headerdistance; + TextHeight:=\the\textheight; + FooterDistance:=\the\footerdistance; + FooterHeight:=\the\footerheight; + BottomDistance:=\the\bottomdistance; + BottomHeight:=\the\bottomheight; + LeftEdgeWidth:=\the\leftedgewidth; + LeftEdgeDistance:=\the\leftedgedistance; + LeftMarginWidth:=\the\leftmarginwidth; + LeftMarginDistance:=\the\leftmargindistance; + TextWidth:=\the\textwidth ; + RightMarginDistance:=\the\rightmargindistance; + RightMarginWidth:=\the\rightmarginwidth; + RightEdgeDistance:=\the\rightedgedistance; + RightEdgeWidth:=\the\rightedgewidth; + InnerMarginDistance:=\the\innermargindistance; + InnerMarginWidth:=\the\innermarginwidth; + OuterMarginDistance:=\the\outermargindistance; + OuterMarginWidth:=\the\outermarginwidth; + InnerEdgeDistance:=\the\inneredgedistance; + InnerEdgeWidth:=\the\inneredgewidth; + OuterEdgeDistance:=\the\outeredgedistance; + OuterEdgeWidth:=\the\outeredgewidth; + PageOffset:=\the\pageoffset; + PageDepth:=\the\pagedepth; + LayoutColumns:=\the\layoutcolumns; + LayoutColumnDistance:=\the\layoutcolumndistance; + LayoutColumnWidth:=\the\layoutcolumnwidth; + enddef; +\stopMPinitializations + +\def\MPonrightpage{true} +\def\MPonoddpage {true} + +\def\freezeMPpagelayout + {\edef\MPonrightpage{\doifbothsides {tru}{tru}{fals}e}% + \edef\MPonoddpage {\doifoddpageelse {tru}{fals}e}} + +\let\freezeMPlayout\relax % obsolete + +%D We need to freeze the pagelayout before the backgrounds +%D are build, because the overlay will temporarily become +%D zero (overlay). + +\appendtoks + \freezeMPpagelayout +\to \everybeforepagebody + +%D By freezing these value every graphic, we can use layout +%D variables that change halfways a page, whatever use that +%D has. + +\prependtoks + \calculatereducedvsizes % this is really needed + \freezeMPpagelayout + \freezeMPlayout % to be used grouped +\to \everyMPgraphic + +%D The next feature provides information about for instance +%D column positions. This is an experimental feature, +%D introduced when we needed backgrounds in columns (fill||in +%D questions as implemented in a private module). +%D +%D See \type {mp-page.mp} for the definition of the macros: +%D +%D \starttabulate[|tl|l|p|] +%D \NC ResetTextAreas \NC no arguments \NC +%D reset areas on page \NC \NR +%D \NC RegisterTextArea \NC x, y, w, h \NC +%D adds area to the list \NC \NR +%D \NC TextAreaX,Y,W,H,XY,WH \NC x and/or y \NC +%D reports offsets and dimensions \NC \NR +%D \stoptabulate +%D +%D The \type {TextArea*} macros can be used to determine +%D overlap. + +\newcount\currentMPtextareadata + +\newtoks\MPsavedtextareadata +\newtoks\MPtextareadata +\newtoks\MPlocaltextareadata + +% optimaliseren voor herhaling + +\def\registerMPtextarea#1% + {\ifpositioning + \bgroup + \global\advance\currentMPtextareadata\plusone + %\hpos{gbd:\the\currentMPtextareadata}{#1}% + \hpos{gbd:\the\currentMPtextareadata}% + {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}% + \edef\!!stringa{gbd:\the\currentMPtextareadata}% + \edef\!!stringa{RegisterTextArea(% + \MPx\!!stringa,\MPy\!!stringa,% + \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}% + \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata + \egroup + \else + \hbox{#1}% + \fi} + +\def\registerMPlocaltextarea#1% + {\ifpositioning + \bgroup + \global\advance\currentMPtextareadata\plusone + %\hpos{gbd:\the\currentMPtextareadata}{#1}% + \hpos{gbd:\the\currentMPtextareadata}% + {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}% + \edef\!!stringa{gbd:\the\currentMPtextareadata}% + \edef\!!stringa{RegisterLocalTextArea(% + \MPx\!!stringa,\MPy\!!stringa,% + \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}% + \global\MPlocaltextareadata\@EA{\!!stringa}% + \egroup + \else + \hbox{#1}% + \fi} + +% better, so that we can force a key and share with e.g. renumbering +% +% \let\namedtextarea\empty +% +% \def\registerMPlocaltextarea#1% +% {\ifpositioning +% \bgroup +% \ifx\namedtextarea\empty +% \global\advance\currentMPtextareadata\plusone +% \edef\namedtextarea{gbd:\the\currentMPtextareadata}% +% \fi +% \hpos\namedtextarea{\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}% +% \edef\ascii{RegisterLocalTextArea(% +% \MPx\namedtextarea,\MPy\namedtextarea,% +% \MPw\namedtextarea,\MPh\namedtextarea,\MPd\namedtextarea);}% +% \global\MPlocaltextareadata\@EA{\ascii}% +% \egroup +% \else +% \hbox{#1}% +% \fi} + +\def\resetMPlocaltextarea + {\global\MPlocaltextareadata\emptytoks} + +\startMPextensions + path PlainTextArea; +\stopMPextensions + +\startMPinitializations + ResetTextAreas; + \the\MPsavedtextareadata; + SaveTextAreas; + ResetTextAreas; + \the\MPtextareadata; + \the\MPlocaltextareadata; + PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio} + shifted (\MPw{text:\realfolio},\MPh{text:\realfolio})); +\stopMPinitializations + +\appendtoks + \global\MPsavedtextareadata\MPtextareadata + \global\MPtextareadata \emptytoks + \global\MPlocaltextareadata\emptytoks +\to \everyshipout + +\protect \endinput diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua index 240778bfa..056d1052f 100644 --- a/tex/context/base/meta-pdf.lua +++ b/tex/context/base/meta-pdf.lua @@ -7,55 +7,77 @@ if not modules then modules = { } end modules ['meta-pdf'] = { } -- Finally we used an optimized version. The test code can be found in --- meta-pdh.lua but since we no longer want to overload functione we --- use more locals now. +-- meta-pdh.lua but since we no longer want to overload functione we use +-- more locals now. This module keeps changing as it is also a testbed. local concat, format, gsub, find = table.concat, string.format, string.gsub, string.find -local byte = string.byte +local byte, round = string.byte, math.round local texsprint = tex.sprint - local ctxcatcodes = tex.ctxcatcodes +local pdfrgbcode = lpdf.rgbcode +local pdfcmykcode = lpdf.cmykcode +local pdfgraycode = lpdf.graycode +local pdfspotcode = lpdf.spotcode +local pdftransparencycode = lpdf.transparencycode +local pdffinishtransparencycode = lpdf.finishtransparencycode + mptopdf = { } mptopdf.n = 0 local m_path, m_stack, m_texts, m_version, m_date, m_shortcuts = { }, { }, { }, 0, 0, false local m_stack_close, m_stack_path, m_stack_concat = false, { }, nil +local extra_path_code, ignore_path = nil, false +local specials = { } local function resetpath() - m_stack_close = false - m_stack_path = { } - m_stack_concat = nil + m_stack_close, m_stack_path, m_stack_concat = false, { }, nil end local function resetall() m_path, m_stack, m_texts, m_version, m_shortcuts = { }, { }, { }, 0, false + extra_path_code, ignore_path = nil, false + specials = { } resetpath() end resetall() --- code injection, todo: collect and flush packed using node injection +-- todo: collect and flush packed using pdfliteral node injection but we're +-- in no hurry as this kind of conversion does not happen that often in mkiv -local function pdfcode(str) -- not used - texsprint(ctxcatcodes,"\\MPScode{",str,"}") +local function pdfcode(str) + texsprint(ctxcatcodes,"\\pdfliteral{" .. str .. "}") end + local function texcode(str) texsprint(ctxcatcodes,str) end +function mpscode(str) + if ignore_path then + pdfcode("h W n") + if extra_path_code then + pdfcode(extra_path_code) + extra_path_code = nil + end + ignore_path = false + else + pdfcode(str) + end +end + -- auxiliary functions local function flushconcat() if m_stack_concat then - texsprint(ctxcatcodes,"\\MPScode{",concat(m_stack_concat," ")," cm}") + mpscode(concat(m_stack_concat," ") .. " cm") m_stack_concat = nil end end local function flushpath(cmd) - -- faster: no local function if #m_stack_path > 0 then local path = { } if m_stack_concat then @@ -63,9 +85,6 @@ local function flushpath(cmd) local rx, ry = m_stack_concat[2], m_stack_concat[3] local tx, ty = m_stack_concat[5], m_stack_concat[6] local d = (sx*sy) - (rx*ry) - -- local function mpconcat(px, py) -- move this inline - -- return (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d - -- end for k=1,#m_stack_path do local v = m_stack_path[k] local px, py = v[1], v[2] ; v[1], v[2] = (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d -- mpconcat(v[1],v[2]) @@ -81,11 +100,11 @@ local function flushpath(cmd) end end flushconcat() - texcode("\\MPSpath{" .. concat(path," ") .. "}") + pdfcode(concat(path," ")) if m_stack_close then - texcode("\\MPScode{h " .. cmd .. "}") + mpscode("h " .. cmd) else - texcode("\\MPScode{" .. cmd .."}") + mpscode(cmd) end end resetpath() @@ -132,7 +151,7 @@ function mps.rlineto(x,y) end function mps.translate(tx,ty) - texsprint(ctxcatcodes,"\\MPScode{1 0 0 0 1 ",tx," ",ty," cm}") + mpscode("1 0 0 0 1 " .. tx .. " " .. ty .. " cm") end function mps.scale(sx,sy) @@ -144,36 +163,36 @@ function mps.concat(sx, rx, ry, sy, tx, ty) end function mps.setlinejoin(d) - texsprint(ctxcatcodes,"\\MPScode{",d," j}") + mpscode(d .. " j") end function mps.setlinecap(d) - texsprint(ctxcatcodes,"\\MPScode{",d," J}") + mpscode(d .. " J") end function mps.setmiterlimit(d) - texsprint(ctxcatcodes,"\\MPScode{",d," M}") + mpscode(d .. " M") end function mps.gsave() - texsprint(ctxcatcodes,"\\MPScode{q}") + mpscode("q") end function mps.grestore() - texsprint(ctxcatcodes,"\\MPScode{Q}") + mpscode("Q") end function mps.setdash(...) -- can be made faster, operate on t = { ... } local n = select("#",...) - texsprint(ctxcatcodes,"\\MPScode{","[",concat({...}," ",1,n-1),"] ",select(n,...)," d}") + mpscode("[" .. concat({...}," ",1,n-1) .. "] " .. select(n,...) .. " d") end function mps.resetdash() - texsprint(ctxcatcodes,"\\MPScode{[ ] 0 d}") + mpscode("[ ] 0 d") end function mps.setlinewidth(d) - texsprint(ctxcatcodes,"\\MPScode{",d," w}") + mpscode(d .. " w") end function mps.closepath() @@ -206,31 +225,136 @@ function mps.textext(font, scale, str) -- old parser resetpath() end +local handlers = { } + +handlers[1] = function(s) + pdfcode(pdffinishtransparencycode()) + pdfcode(pdfcmykcode(mps.colormodel,s[3],s[4],s[5],s[6])) +end +handlers[2] = function(s) + pdfcode(pdffinishtransparencycode()) + pdfcode(pdfspotcode(mps.colormodel,s[3],s[4],s[5],s[6])) +end +handlers[3] = function(s) + pdfcode(pdfrgbcode(mps.colormodel,s[4],s[5],s[6])) + pdfcode(pdftransparencycode(s[2],s[3])) +end +handlers[4] = function(s) + pdfcode(pdfcmykcode(mps.colormodel,s[4],s[5],s[6],s[7])) + pdfcode(pdftransparencycode(s[2],s[3])) +end +handlers[5] = function(s) + pdfcode(pdfspotcode(mps.colormodel,s[4],s[5],s[6],s[7])) + pdfcode(pdftransparencycode(s[2],s[3])) +end + +-- todo: color conversion + +local nofshades, tn = 0, tonumber + +local function linearshade(colorspace,domain,ca,cb,coordinates) + pdfcode(pdffinishtransparencycode()) + nofshades = nofshades + 1 + local name = format("MpsSh%s",nofshades) + lpdf.linearshade(name,domain,ca,cb,1,colorspace,coordinates) + extra_path_code, ignore_path = format("/%s sh Q",name), true + pdfcode("q /Pattern cs") +end + +local function circularshade(colorspace,domain,ca,cb,coordinates) + pdfcode(pdffinishtransparencycode()) + nofshades = nofshades + 1 + local name = format("MpsSh%s",nofshades) + lpdf.circularshade(name,domain,ca,cb,1,colorspace,coordinates) + extra_path_code, ignore_path = format("/%s sh Q",name), true + pdfcode("q /Pattern cs") +end + +handlers[30] = function(s) + linearshade("DeviceRGB", { tn(s[ 2]), tn(s[ 3]) }, + { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]) }, { tn(s[10]), tn(s[11]), tn(s[12]) }, + { tn(s[ 8]), tn(s[ 9]), tn(s[13]), tn(s[14]) } ) +end + +handlers[31] = function(s) + circularshade("DeviceRGB", { tn(s[ 2]), tn(s[ 3]) }, + { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]) }, { tn(s[11]), tn(s[12]), tn(s[13]) }, + { tn(s[ 8]), tn(s[ 9]), tn(s[10]), tn(s[14]), tn(s[15]), tn(s[16]) } ) +end + +handlers[32] = function(s) + linearshade("DeviceCMYK", { tn(s[ 2]), tn(s[ 3]) }, + { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]), tn(s[ 8]) }, { tn(s[11]), tn(s[12]), tn(s[13]), tn(s[14]) }, + { tn(s[ 9]), tn(s[10]), tn(s[15]), tn(s[16]) } ) +end + +handlers[33] = function(s) + circularshade("DeviceCMYK", { tn(s[ 2]), tn(s[ 3]) }, + { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]), tn(s[ 8]) }, { tn(s[12]), tn(s[13]), tn(s[14]), tn(s[15]) }, + { tn(s[ 9]), tn(s[10]), tn(s[11]), tn(s[16]), tn(s[17]), tn(s[18]) } ) +end + +handlers[34] = function(s) -- todo (after further cleanup) + linearshade("DeviceGray", { tn(s[ 2]), tn(s[ 3]) }, { 0 }, { 1 }, { tn(s[9]), tn(s[10]), tn(s[15]), tn(s[16]) } ) +end + +handlers[35] = function(s) -- todo (after further cleanup) + circularshade("DeviceGray", { tn(s[ 2]), tn(s[ 3]) }, { 0 }, { 1 }, { tn(s[9]), tn(s[10]), tn(s[15]), tn(s[16]) } ) +end + +-- not supported in mkiv , use mplib instead + +handlers[10] = function() logs.report("mptopdf","skipping special %s",10) end +handlers[20] = function() logs.report("mptopdf","skipping special %s",20) end +handlers[50] = function() logs.report("mptopdf","skipping special %s",50) end + +--end of not supported + function mps.setrgbcolor(r,g,b) -- extra check r, g = tonumber(r), tonumber(g) -- needed when we use lpeg if r == 0.0123 and g < 0.1 then - texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}") + g, b = round(g*10000), round(b*10000) + local s = specials[b] + local h = round(s[#s]) + local handler = handlers[h] + if handler then + handler(s) + else + logs.report("mptopdf","unknown special handler %s (1)",h) + end elseif r == 0.123 and g < 0.1 then - texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}") + g, b = round(g*1000), round(b*1000) + local s = specials[b] + local h = round(s[#s]) + local handler = handlers[h] + if handler then + handler(s) + else + logs.report("mptopdf","unknown special handler %s (2)",h) + end else - texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}") + pdfcode(pdffinishtransparencycode()) + pdfcode(pdfrgbcode(mps.colormodel,r,g,b)) end end function mps.setcmykcolor(c,m,y,k) - texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}") + pdfcode(pdffinishtransparencycode()) + pdfcode(pdfcmykcode(mps.colormodel,c,m,y,k)) end function mps.setgray(s) - texcode("\\MPSgray{" .. s .. "}") + pdfcode(pdffinishtransparencycode()) + pdfcode(pdfgrayliteral(mps.colormodel,s)) end function mps.specials(version,signal,factor) -- 2.0 123 1000 end function mps.special(...) -- 7 1 0.5 1 0 0 1 3 - local n = select("#",...) - texcode("\\MPSbegin\\MPSset{" .. concat({...},"}\\MPSset{",2,n) .. "}\\MPSend") + local t = { ... } + local n = tonumber(t[#t-1]) + specials[n] = t end function mps.begindata() @@ -242,10 +366,6 @@ end function mps.showpage() end -function mps.attribute(id,value) - texcode("\\attribute " .. id .. "=" .. value .. " ") -end - -- lpeg parser -- The lpeg based parser is rather optimized for the kind of output @@ -350,9 +470,6 @@ local t = (lpegP("[") * (cnumber * sp^0)^6 * lpegP("]") * sp * lpegP("t") ) / -- experimental -local attribute = ((cnumber * sp)^2 * lpegP("attribute")) / mps.attribute -local A = ((cnumber * sp)^2 * lpegP("A")) / mps.attribute - local preamble = ( prolog + setup + boundingbox + highresboundingbox + specials + special + @@ -362,7 +479,6 @@ local preamble = ( local procset = ( lj + ml + lc + c + l + m + n + p + r + - A + R + C + G + S + F + B + W + vlw + hlw + @@ -376,7 +492,6 @@ local procset = ( local verbose = ( curveto + lineto + moveto + newpath + closepath + rlineto + setrgbcolor + setcmykcolor + setgray + - attribute + setlinejoin + setmiterlimit + setlinecap + stroke + fill + clip + both + setlinewidth_x + setlinewidth_y + @@ -390,7 +505,8 @@ local verbose = ( -- order matters in terms of speed / we could check for procset first local captures_old = ( space + verbose + preamble )^0 -local captures_new = ( space + procset + preamble + verbose )^0 +--~ local captures_new = ( space + procset + preamble + verbose )^0 +local captures_new = ( space + verbose + procset + preamble )^0 local function parse(m_data) if find(m_data,"%%%%BeginResource: procset mpost") then @@ -402,17 +518,25 @@ end -- main converter +local a_colorspace = attributes.private('colormodel') + function mptopdf.convertmpstopdf(name) resetall() local ok, m_data, n = resolvers.loadbinfile(name, 'tex') -- we need a binary load ! if ok then + mps.colormodel = tex.attribute[a_colorspace] statistics.starttiming(mptopdf) mptopdf.n = mptopdf.n + 1 + pdfcode(format("\\letterpercent\\space mptopdf begin: n=%s, file=%s",mptopdf.n,file.basename(name))) + pdfcode("q 1 0 0 1 0 0 cm") parse(m_data) + pdfcode(pdffinishtransparencycode()) + pdfcode("Q") + pdfcode("\\letterpercent\\space mptopdf end") resetall() statistics.stoptiming(mptopdf) else - tex.print("file " .. name .. " not found") + commands.writestatus("mptopdf","file '%s' not found",name) end end diff --git a/tex/context/base/meta-pdf.mkiv b/tex/context/base/meta-pdf.mkiv index 906633802..fa9627fbe 100644 --- a/tex/context/base/meta-pdf.mkiv +++ b/tex/context/base/meta-pdf.mkiv @@ -11,17 +11,6 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D Formerly known as supp-pdf.tex and supp-mpe.tex. - -% \useMPgraphic{1} -% \testfeatureonce{250}{\setbox0\hbox{\convertMPtoPDF{test-mps-mpgraph.1}{1}{1}}} -% -% 8.4 : mkii, direct parsing by tex -% 11.8 : mkiv, dirty conversion (10.8 with dirty tricks) -% 14.5 : mkiv, clean conversion -% 7.4 : mkiv, simulated clean direct lua from mp -% 0.3 : time taken by tex to handle converted code - \registerctxluafile{meta-pdf}{1.003} %D We will clean up the color mess later. @@ -30,13 +19,6 @@ \unprotect -\ifx\PDFcode \undefined \let\PDFcode \gobbleoneargument \fi -\ifx\PDFcomment\undefined \def\PDFcomment#1{\PDFcode{\letterpercent\space#1}} \fi - -%D First we define a handy constant: - -\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup - %D \macros %D {convertMPtoPDF} %D @@ -57,67 +39,25 @@ %D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5} %D \stoptyping -%D \macros -%D {makeMPintoPDFobject,lastPDFMPobject} -%D -%D For experts there are a few more options. When attributes -%D are to be added, the code must be embedded in an object -%D accompanied with the appropriate directives. One can -%D influence this process with \type {\makeMPintoPDFobject}. -%D -%D This option defaults to~0, because \CONTEXT\ takes care -%D of objects at another level, which saves some bytes. -%D -%D \starttabulate[|l|l|p|] -%D \NC 0 \NC never \NC don't use an object \NC\NR -%D \NC 1 \NC always \NC always use an object \NC\NR -%D \NC 2 \NC optional \NC use object when needed \NC\NR -%D \stoptabulate -%D -%D The last object number used is avaliable in the macro -%D \type {\lastPDFMPobject}. - -\ifx\makeMPintoPDFobject \undefined \chardef\makeMPintoPDFobject \zerocount \fi -\ifx\blackoutMPgraphic \undefined \chardef\blackoutMPgraphic \plusone \fi -\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion \fi - -\let\lastPDFMPobject \!!zerocount -\let\currentPDFresources\empty -\let\setMPextensions \relax - \def\PDFMPformoffset - {\ifx\objectoffset\undefined\zeropoint\else\objectoffset\fi} - -\def\resetMPvariables#1#2#3% - {\global\let\MPwidth \!!zeropoint - \global\let\MPheight\!!zeropoint - \global\let\MPllx \!!zerocount - \global\let\MPlly \!!zerocount - \global\let\MPurx \!!zerocount - \global\let\MPury \!!zerocount - \xdef\MPxscale {#2}\ifx\MPxscale\empty\let\MPxscale\!!plusone\fi - \xdef\MPyscale {#3}\ifx\MPyscale\empty\let\MPyscale\!!plusone\fi - \xdef\MPfilename {#1}} + {\ifdefined\objectoffset\objectoffset\else\zeropoint\fi} %D The main macro: -\def\convertMPtoPDF#1#2#3% watch the transparency reset - {\resetMPvariables{#1}{#2}{#3}% - \vbox\bgroup +\def\convertMPtoPDF#1#2#3% scaling no longer supported at this level (so #2 & #3 ignored) + {\vbox\bgroup + \message{[MP to PDF]}% + \xdef\MPfilename{#1}% + \glet\MPwidth \!!zeropoint + \glet\MPheight\!!zeropoint + \glet\MPllx \!!zerocount + \glet\MPlly \!!zerocount + \glet\MPurx \!!zerocount + \glet\MPury \!!zerocount \forgetall \offinterlineskip - %\ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi % fixed in mp \setbox\scratchbox\vbox\bgroup - \setnormalcatcodes % we can be in verbatim or so - \message{[MP to PDF]}% - \startMPresources - \PDFcomment{mps begin}% - \PDFcode{q 1 0 0 1 0 0 cm}% - \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces - \dohandleMPresettransparency % a bit messy here, should be a toks - \PDFcode{Q}% - \PDFcomment{mps end}% - \stopMPresources + \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces \egroup \setbox\scratchbox\hbox\bgroup \hskip-\MPllx\onebasepoint @@ -135,53 +75,33 @@ \dopackageMPgraphic\scratchbox \egroup} -\let\processMPtoPDFfile\convertMPtoPDF - -%D A common hook. - -\let\MPfshowcommand\empty - -%D Objects. - -\def\dopackageMPgraphic#1% #1 = boxregister - {\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else - % an existing value of 2 signals object support (set elsewhere) - \chardef\makeMPintoPDFobject\plusone - \fi\fi - \ifcase\makeMPintoPDFobject - \box#1% - \or - \scratchdimen\PDFMPformoffset\relax - \ifdim\scratchdimen>\zeropoint % compensate for error - \setbox#1\vbox spread 2\scratchdimen - {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}% - \fi - \setMPPDFobject{\currentPDFresources}{#1}% - \ifdim\scratchdimen>\zeropoint % compensate for error - \vbox to \MPheight - {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}% - \else - \getMPPDFobject - \fi - \global\let\currentPDFresources\empty - \else - \box#1% - \fi} +%D Objects (move all to backend) + +% \def\dopackageMPgraphic#1% #1 = boxregister +% {\scratchdimen\PDFMPformoffset\relax +% \ifdim\scratchdimen>\zeropoint % compensate for error +% \setbox#1\vbox spread 2\scratchdimen +% {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}% +% \fi +% \setMPPDFobject{#1}% +% \ifdim\scratchdimen>\zeropoint % compensate for error +% \vbox to \MPheight +% {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}% +% \else +% \getMPPDFobject +% \fi} +% +% \def\setMPPDFobject#1% boxnumber +% {\the\pdfbackendeveryxform +% \finalizeobjectbox{#1}% +% \immediate\pdfxform resources{\pdfcurrentresources}#1% +% \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}} +% +% \let\getMPPDFobject\relax -\def\setMPPDFobject#1#2% resources boxnumber - {\ifx\pdfxform\undefined - \def\getMPPDFobject{\box#2}% - \else\ifx\pdftexversion\undefined - \def\getMPPDFobject{\box#2}% - \else\ifnum\pdftexversion<14 - \def\getMPPDFobject{\box#2}% - \else - \ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi - \immediate\pdfxform resources{#1}#2% - \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}% - \fi\fi\fi} +% we don't need to package as each page has all resources anyway -\let\getMPPDFobject\relax +\let\dopackageMPgraphic\box %D \macros %D {deleteMPgraphic, @@ -243,32 +163,6 @@ \newconditional\manyMPspecials \settrue\manyMPspecials -%D In case of \PDF, we need to prepare resourcs. - -\newtoks\MPstartresources -\newtoks\MPstopresources - -\def\startMPresources - {\the\MPstartresources} - -\def\stopMPresources - {\the\MPstopresources} - -%D Some day we may consider collecting local resources. - -\appendtoks - \global\let\currentPDFresources\empty % kind of redundant -\to \MPstartresources - -% \appendtoks -% \collectPDFresources -% \global\let\currentPDFresources\collectedPDFresources -% \to \MPstopresources - -\appendtoksonce - \the\everyPDFxform -\to \MPstopresources - %D Since colors are not subjected to transformations, we can %D only use colors as signal. In our case, we use a dummy colored %D path with a red color component of \type {0.n}, so \type @@ -278,25 +172,11 @@ \newif\ifMPcmykcolors \newif\ifMPspotcolors -\def\dohandleMPrgb #1#2#3{\revokeMPtransparencyspecial\execcolorR #1:#2:#3:0:0\od} -\def\dohandleMPcmyk#1#2#3#4{\revokeMPtransparencyspecial\execcolorC#1:#2:#3:#4:0:0\od} -\def\dohandleMPgray #1{\revokeMPtransparencyspecial\execcolorS #1:0:0\od} -\def\dohandleMPspot#1#2#3#4{\revokeMPtransparencyspecial\execcolorP#1:#2:#3:#4:0:0\od} - -%D Specials: - -\settrue \manyMPspecials \newcount\nofMParguments \let\extraMPpathcode\empty - -\def\@@MP {@@MP} -\def\@@MPSK{@MPSK@} - -\def\MPspecial{\@@MPSK\@@MPSK\gMPs\nofMParguments} - -\def\defineMPspecial#1#2% - {\setvalue{\@@MPSK\@@MPSK#1}{#2}} - -%D Special number~1 is dedicated to \CMYK\ support. If you -%D want to know why: look at this: +%D We support specials but assume that the files are somewhat simple +%D ones wo we have dropped a few. The reason is that runtime \METAPOST\ +%D processing now uses \MPLIB\ so we only need to deal with the +%D conversion here. See meta-pdh.mkiv (and older files) for more +%D details. Here we just give a few examples. %D %D \startbuffer[mp] %D fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ; @@ -326,38 +206,11 @@ %D no conversion to \RGB, %D support in \METAPOST} %D {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]} - -\defineMPspecial{1} - {\ifMPcmykcolors - \setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPcmykcolor{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}}% - \fi} - -\defineMPspecial{2} - {\ifMPspotcolors - \setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPspotcolor{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}}% -% \checkMPspot{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}% - \fi} - -% \def\checkMPspot#1#2#3#4% -% {\normalexpanded{\noexpand\resolveMPspotcolor#1 #2 #3 #4}\end -% \ifx\MPspotspace\MPresolvedspace -% \edef\MPspotspacespec{/\MPspotspace\space}% -% \doifinstringelse\MPspotspacespec\currentMPcolorspaces -% \donothing\registerMPcolorspace -% \fi} - -\let\revokeMPtransparencyspecial\relax - -\def\dohandleMPrgbcolor #1#2#3{\revokeMPtransparencyspecial\execcolorR #1:#2:#3:0:0\od} -\def\dohandleMPcmykcolor#1#2#3#4{\revokeMPtransparencyspecial\execcolorC#1:#2:#3:#4:0:0\od} -\def\dohandleMPgraycolor #1{\revokeMPtransparencyspecial\execcolorS #1:0:0\od} -\def\dohandleMPspotcolor#1#2#3#4{\revokeMPtransparencyspecial\execcolorP#1:#2:#3:#4:0:0\od} - +%D %D Transparency support used specials 60 (rgb) and 61 %D (cmyk). %D -%D \startbufferFshade - +%D \startbuffer %D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0); %D %D fill p rotated 90 withcolor transparent(1,.5,yellow) ; @@ -390,28 +243,6 @@ %D %D \startlinecorrection \processMPbuffer \stoplinecorrection %D -%D We save all the three components needed in one macro, -%D just to save hash space. - -\def\dohandleMPrgbtransparency #1#2#3#4#5{\execcolorR #1:#2:#3:#4:#5\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial} -\def\dohandleMPcmyktransparency#1#2#3#4#5#6{\execcolorC#1:#2:#3:#4:#5:#6\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial} -\def\dohandleMPgraytransparency #1#2#3{\execcolorS #1:#2:#3\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial} -\def\dohandleMPspottransparency#1#2#3#4#5#6{\execcolorP#1:#2:#3:#4:#5:#6\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial} - -\def\dorevokeMPtransparencyspecial - {\PDFcode{\PDFtransparencyresetidentifier\space gs}% - \let\revokeMPtransparencyspecial\relax} - -\defineMPspecial{3} % rgb - {\setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPrgbtransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs1}{\gMPs2}}} - -\defineMPspecial{4} % cmyk - {\setxvalue{\@@MPSK\gMPs7}{\noexpand\dohandleMPcmyktransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs1}{\gMPs2}}} - -\defineMPspecial{5} % spot - {\setxvalue{\@@MPSK\gMPs7}{\noexpand\dohandleMPspottransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs1}{\gMPs2}}% - }%\checkMPspot{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}} - %D Shading is an example of a more advanced graphic feature, %D but users will seldom encounter those complications. Here %D we only show a few simple examples, but many other @@ -448,9 +279,7 @@ %D \stopuniqueMPgraphic %D \stopbuffer %D -%D \typebuffer -%D -%D \getbuffer +%D \typebuffer \getbuffer %D %D These graphics can be hooked into the overlay mechanism, %D which is available in many commands. @@ -461,9 +290,7 @@ %D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}] %D \stopbuffer %D -%D \typebuffer -%D -%D \getbuffer +%D \typebuffer \getbuffer %D %D These backgrounds can for instance be applied to \type %D {\framed}: @@ -506,8 +333,6 @@ %D \stopcombination %D \stoplinecorrection %D -%D \blank -%D %D \startlinecorrection %D \startcombination[5*1] %D {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0} @@ -518,8 +343,6 @@ %D \stopcombination %D \stoplinecorrection %D -%D \blank -%D %D \startlinecorrection %D \startcombination[4*1] %D {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0} @@ -545,96 +368,7 @@ %D \NC /C1 \NC outer shade \NC \NR %D \NC /N \NC smaller values, bigger inner circles \NC \NR %D \stoptabulate - -\newcount\currentPDFshade % 0 % global (document wide) counter - -\def\dosetMPsomePDFshade#1#2% - {\immediate\pdfobj - {<</FunctionType 2 - /Domain [\gMPs1 \gMPs2] - /C0 [\MPshadeA] - /C1 [\MPshadeB] - /N \gMPs3>>}% - \immediate\pdfobj - {<</ShadingType #1 - /ColorSpace /\MPresolvedspace - /Function \the\pdflastobj\space 0 R - /Coords [\MPshadeC] - /Extend [true true]>>}% - \global\advance\currentPDFshade \plusone - \appendtoPDFdocumentshades{/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }% - \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}} - -\def\dosetMPlinearshade {\dosetMPsomePDFshade2}% #1 -\def\dosetMPcircularshade{\dosetMPsomePDFshade3}% #1 - -\defineMPspecial{30} - {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA - \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{9}}{\gMPs{10}}{\gMPs{11}}}\to\MPshadeB - \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}}% - \dosetMPlinearshade{\gMPs{14}}} - -\defineMPspecial{31} - {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA - \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}}\to\MPshadeB - \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}}% - \dosetMPcircularshade{\gMPs{16}}} - -\defineMPspecial{32} - {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA - \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB - \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}% - \dosetMPlinearshade{\gMPs{16}}} - -\defineMPspecial{33} - {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA - \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB - \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}% - \dosetMPcircularshade{\gMPs{18}}} - -\defineMPspecial{34} - {\normalexpanded{\noexpand\resolveMPspotcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA - \normalexpanded{\noexpand\resolveMPspotcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB - \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}% - \dosetMPlinearshade{\gMPs{16}}} - -\defineMPspecial{35} - {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA - \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB - \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}% - \dosetMPcircularshade{\gMPs{18}}} - -\newconditional\ignoreMPpath - -\def\dohandleMPshade#1% - {\revokeMPtransparencyspecial - \settrue\ignoreMPpath - \def\extraMPpathcode{/Sh#1 sh Q}% - \chardef\finiMPpath\zerocount - \PDFcode{q /Pattern cs}} - -\defineMPspecial{10} - {\setxvalue{\@@MPSK\gMPs8}% - {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}} - -\def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig - {\global\letvalue{\@@MPSK#8}\empty - \vbox to \zeropoint - {\vss - \hbox to \zeropoint - {\ifcase\pdfoutput\or % will be hooked into the special driver - \doiffileelse{#7} - {\doifundefinedelse{mps:x:#7} - {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}% - \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}% - {\message{[reusing figure #7]}}% - \PDFcode{q #1 #2 #3 #4 #5 #6 cm}% - \rlap{\getvalue{mps:x:#7}}% - \PDFcode{Q}} - {\message{[unknown figure #7]}}% - \fi - \hss}}} - +%D %D An example of using both special features is the %D following. %D @@ -653,294 +387,88 @@ %D \stopMPpage %D \stoptyping -\defineMPspecial{20} - {\setxvalue{\@@MPSK\gMPs6}% - {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}} - -\def\handleMPhyperlink#1#2#3#4#5#6% - {\global\letvalue{\@@MPSK#6}\empty - \setbox\scratchbox\hbox - {\setbox\scratchbox\null - \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax - \ht\scratchbox\dimexpr-#2\onebasepoint+#4\onebasepoint\relax - \incolorfalse - \gotobox{\box\scratchbox}[#5]}% - \setbox\scratchbox\hbox - {\hskip\dimexpr\MPxoffset\onebasepoint+#1\onebasepoint\relax - \raise\dimexpr\MPyoffset\onebasepoint+#2\onebasepoint\relax - \box\scratchbox}% - \smashbox\scratchbox - \box\scratchbox} - -%D This special (number 50) passes positions to a tex file. -%D This method uses a two||pass approach an (mis|)|used the -%D context positioning macros. In \type {core-pos} we will -%D implement the low level submacro needed. -%D -%D \startbuffer -%D \definelayer[test] -%D -%D \setlayer -%D [test] -%D [x=\MPx{somepos-1},y=\MPy{somepos-1}] -%D {Whatever we want here!} -%D -%D \setlayer -%D [test] -%D [x=\MPx{somepos-2},y=\MPy{somepos-2}] -%D {Whatever we need there!} -%D -%D \startuseMPgraphic{oeps} -%D draw fullcircle scaled 6cm withcolor red ; -%D register ("somepos-1",1cm,2cm,center currentpicture) ; -%D register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ; -%D \stopuseMPgraphic -%D -%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}} -%D \stopbuffer -%D -%D \typebuffer -%D -%D Here the width and height are not realy used, but one can -%D imagine situations where tex has to work with values -%D calculated by \METAPOST. -%D -%D \startlinecorrection -%D \getbuffer -%D \stoplinecorrection -%D -%D Later we will implement a more convenient macro: -%D -%D \starttyping -%D \setMPlayer [test] [somepos-1] {Whatever we want here!} -%D \setMPlayer [test] [somepos-2] {Whatever we need there!} -%D \stoptyping - -\defineMPspecial{50} % x y width height label - {\dosavepositionwhd - {\gMPs5}% - {0}% - {\the\dimexpr-\MPllx\onebasepoint+\gMPs1\onebasepoint\relax} - {\the\dimexpr\gMPs2\onebasepoint-\scratchdimen+\MPury\onebasepoint\relax}% scratchdimen ? - {\the\dimexpr\gMPs3\onebasepoint\relax}% - {\the\dimexpr\gMPs4\onebasepoint\relax}% - {0pt}} - -%D A few auxiliary macros. This will move to colo-ini. - -\def\MPgrayspace{DeviceGray} -\def\MPrgbspace {DeviceRGB} -\def\MPcmykspace{DeviceCMYK} -\let\MPspotspace\MPgrayspace - -\def\MPcmykBlack{0 0 0 0} -\def\MPcmykWhite{0 0 0 1} - -\def\startMPcolorresolve - {\bgroup - \def\dostartgraycolormode##1% - {\global\let\MPresolvedspace\MPgrayspace - \xdef\MPresolvedcolor{##1}}% - \def\dostartrgbcolormode ##1##2##3% - {\global\let\MPresolvedspace\MPrgbspace - \xdef\MPresolvedcolor{##1 ##2 ##3}}% - \def\dostartcmykcolormode##1##2##3##4% - {\global\let\MPresolvedspace\MPcmykspace - \xdef\MPresolvedcolor{##1 ##2 ##3 ##4}}% - \def\dostartspotcolormode##1##2% - {\global\let\MPspotspace\empty % left over ? - \xdef\MPresolvedspace{##1}% - \xdef\MPresolvedcolor{##2}% - \global\let\MPspotspace\MPresolvedspace}% signal - \dostartgraycolormode\!!zerocount} % kind of hackery initialization - -\let\stopMPcolorresolve\egroup - -\def\resolveMPrgbcolor#1#2#3\to#4% - {\startMPcolorresolve - \execcolorR#1:#2:#3:0:0\od - \stopMPcolorresolve - \let#4\MPresolvedcolor} - -\def\resolveMPcmykcolor#1#2#3#4\to#5% - {\startMPcolorresolve - \execcolorC#1:#2:#3:#4:0:0\od - \stopMPcolorresolve - \let#5\MPresolvedcolor} - -\def\resolveMPgraycolor#1\end\to#2% - {\startMPcolorresolve - \execcolorS#1:0:0\od - \stopMPcolorresolve - \let#2\MPresolvedcolor} - -\def\resolveMPspotcolor#1#2#3#4\end\to#5% - {\startMPcolorresolve - \ifnum#2>\plusone - \checkmultitonecolor{#1}% - \fi - \execcolorP#1:#2:#3:#4:0:0\od - \stopMPcolorresolve - \let#5\MPresolvedcolor} - \startMPinitializations mp_shade_version := 2 ; \stopMPinitializations -% will be done better - -\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can - {\def\MPtextdata{#3}% % delegate the splitter to lua + redesign - \def\MPtextsize{#2}% - \def\lastMPmoveX{#4}% - \def\lastMPmoveY{#5}% - \defconvertedcommand\MPtextdata\MPtextdata % no edef - \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber - \executeifdefined{handleMPtext\MPtexttag} - {\setbox\scratchbox\hbox - {\font\temp=#1\space at #2\onebasepoint - \let\c\char - \temp - \MPfshowcommand{#3}}% - \setbox\scratchbox\hbox - {\hskip#4\onebasepoint - \raise#5\onebasepoint - \box\scratchbox}% - \smashbox\scratchbox - \box\scratchbox}} - -%D We save the special variables on a stack. It's not that -%D fast, but it make implementing the special more convenient. - -\def\MPSbegin - {\nofMParguments\zerocount} - -\def\MPSend - {\csname\MPspecial\endcsname} - -\def\MPSset - {\advance\nofMParguments\plusone - \expandafter\def\csname\@@MP\number\nofMParguments\endcsname} +%D This is done much cleaner in \MPLIB. -\def\gMPs#1{\csname\@@MP\number#1\endcsname} +% %D A common hook. +% +% \let\MPfshowcommand\empty +% +% \def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can +% {\def\MPtextdata{#3}% % delegate the splitter to lua + redesign +% \def\MPtextsize{#2}% +% \def\lastMPmoveX{#4}% +% \def\lastMPmoveY{#5}% +% \defconvertedcommand\MPtextdata\MPtextdata % no edef +% \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber +% \executeifdefined{handleMPtext\MPtexttag} +% {\setbox\scratchbox\hbox +% {\font\temp=#1\space at #2\onebasepoint +% \let\c\char +% \temp +% \MPfshowcommand{#3}}% +% \setbox\scratchbox\hbox +% {\hskip#4\onebasepoint +% \raise#5\onebasepoint +% \box\scratchbox}% +% \smashbox\scratchbox +% \box\scratchbox}} + +\unexpanded\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can + {\setbox\scratchbox\hbox + {\font\temp=#1\space at #2\onebasepoint \let\c\char \temp #3}% + \setbox\scratchbox\hbox + {\hskip#4\onebasepoint \raise#5\onebasepoint \box\scratchbox}% + \smashbox\scratchbox + \box\scratchbox} %D The boundingbox. \def\MPSboundingbox#1#2#3#4% - {\xdef\MPllx{#1}% - \xdef\MPlly{#2}% - \xdef\MPurx{#3}% - \xdef\MPury{#4}% + {\xdef\MPllx{#1}\xdef\MPlly{#2}\xdef\MPurx{#3}\xdef\MPury{#4}% \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}% \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}} \MPSboundingbox0000 -\def\MPSspecial#1#2% - {\csname\@@MPSK#2\endcsname} - -%D A path is (in most cases) just a sequence of \PDF\ commands. - -% \newcontitional\ignoreMPpath - -\def\MPSpath - {\PDFcode} - -\def\MPScode % hack, will be improved - {\ifconditional\ignoreMPpath - \PDFcode{h W n}% - \ifx\extraMPpathcode\empty\else - \PDFcode{\extraMPpathcode}% - \let\extraMPpathcode\empty - \fi - \setfalse\ignoreMPpath - \expandafter\gobbleoneargument - \else - \expandafter\PDFcode - \fi} - -\let\MPSrgb \dohandleMPrgb -\let\MPScmyk\dohandleMPcmyk -\let\MPSgray\dohandleMPgray -\let\MPSspot\dohandleMPspot - %D Test code: - -% \startMPcode -% fill fullcircle scaled 3cm withcolor red ; -% fill fullcircle scaled 2cm withcolor green ; -% fill fullcircle scaled 1cm withcolor blue ; -% currentpicture := currentpicture shifted (-4cm,0) ; -% fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ; -% fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ; -% fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ; -% currentpicture := currentpicture shifted (-4cm,0) ; -% draw fullcircle scaled 3cm dashed evenly ; -% draw fullcircle scaled 2cm dashed withdots ; -% draw origin withpen pencircle scaled 3mm; -% currentpicture := currentpicture shifted (-4cm,0) ; -% fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red); -% fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red); -% fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green); -% fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5)); -% currentpicture := currentpicture shifted (12cm,-4cm) ; -% draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ; -% currentpicture := currentpicture shifted (-4cm,0) ; -% % bug: shift -% draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30 ; -% draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ; -% filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ; -% currentpicture := currentpicture shifted (-4cm,0) ; -% % shade cannot handle shift -% circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ; -% circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ; -% filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ; -% \stopMPcode - -% We cannot use attributes for switching colors in mp literals because -% grouping (qQ) interferes. - -\ifx\colorversion\undefined \else \ifnum\colorversion>\plusone - - \def\dohandleMPgraycolor #1{\ctxlua{ctx.pdffinishtransparency() - ctx.pdfgrayliteral(\the\currentcolormodel,#1)}} - \def\dohandleMPrgbcolor #1#2#3{\ctxlua{ctx.pdffinishtransparency() - ctx.pdfrgbliteral (\the\currentcolormodel,#1,#2,#3)}} - \def\dohandleMPcmykcolor#1#2#3#4{\ctxlua{ctx.pdffinishtransparency() - ctx.pdfcmykliteral(\the\currentcolormodel,#1,#2,#3,#4)}} - \def\dohandleMPspotcolor#1#2#3#4{\ctxlua{ctx.pdffinishtransparency() - ctx.pdfspotliteral(\the\currentcolormodel,"#1",#2,"#3","#4")}} - - % we can combine the next calls - - \def\dohandleMPgraytransparency #1#2#3{\ctxlua{ctx.pdfgrayliteral(\the\currentcolormodel,#1) - ctx.pdftransparencyliteral(#2,#3)}} - \def\dohandleMPrgbtransparency #1#2#3#4#5{\ctxlua{ctx.pdfrgbliteral (\the\currentcolormodel,#1,#2,#3) - ctx.pdftransparencyliteral(#4,#5)}} - \def\dohandleMPcmyktransparency#1#2#3#4#5#6{\ctxlua{ctx.pdfcmykliteral(\the\currentcolormodel,#1,#2,#3,#4) - ctx.pdftransparencyliteral(#5,#6)}} - \def\dohandleMPspottransparency#1#2#3#4#5#6{\ctxlua{ctx.pdfspotliteral(\the\currentcolormodel,"#1",#2,"#3","#4") - ctx.pdftransparencyliteral(#5,#6)}} - - \def\dohandleMPresettransparency {\ctxlua{ctx.pdffinishtransparency()}} - - \def\resolveMPgraycolor #1\to#2{\ctxlua{ctx.resolvempgraycolor("\strippedcsname#2","MPresolvedspace",\number\currentcolormodel,#1)}} - \def\resolveMPrgbcolor #1#2#3\to#4{\ctxlua{ctx.resolvemprgbcolor ("\strippedcsname#4","MPresolvedspace",\number\currentcolormodel,#1,#2,#3)}} - \def\resolveMPcmykcolor#1#2#3#4\to#5{\ctxlua{ctx.resolvempcmykcolor("\strippedcsname#5","MPresolvedspace",\number\currentcolormodel,#1,#2,#3,#4)}} - - \def\resolveMPspotcolor#1#2#3#4\to#5% unchecked - {\ctxlua{ctx.resolvempspotcolor("\strippedcsname#5","MPresolvedspace",\number\currentcolormodel,"#1",#2,"#3","#4")}% - \xdef\MPresolvedspace{#1}% - \xdef\MPresolvedcolor{#4}% - \global\let\MPspotspace\MPresolvedspace} - - % used as callers - - \let\MPSgray\dohandleMPgraycolor - \let\MPSrgb \dohandleMPrgbcolor - \let\MPScmyk\dohandleMPcmykcolor - \let\MPspot \dohandleMPspotcolor - -\fi \fi +%D +%D \startbuffer +%D \startMPcode +%D fill fullcircle scaled 3cm withcolor red ; +%D fill fullcircle scaled 2cm withcolor green ; +%D fill fullcircle scaled 1cm withcolor blue ; +%D currentpicture := currentpicture shifted (-4cm,0) ; +%D fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ; +%D fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ; +%D fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ; +%D currentpicture := currentpicture shifted (-4cm,0) ; +%D draw fullcircle scaled 3cm dashed evenly ; +%D draw fullcircle scaled 2cm dashed withdots ; +%D draw origin withpen pencircle scaled 3mm; +%D currentpicture := currentpicture shifted (-4cm,0) ; +%D fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red); +%D fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red); +%D fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green); +%D fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5)); +%D currentpicture := currentpicture shifted (12cm,-4cm) ; +%D draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ; +%D currentpicture := currentpicture shifted (-4cm,0) ; +%D % bug: shift +%D draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30 ; +%D draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ; +%D filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ; +%D currentpicture := currentpicture shifted (-4cm,0) ; +%D % shade cannot handle shift +%D circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ; +%D circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ; +%D filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ; +%D \stopMPcode +%D \stopbuffer +%D +%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection \protect \endinput diff --git a/tex/context/base/meta-pdh.lua b/tex/context/base/meta-pdh.lua index e05529cc8..ef15c6a11 100644 --- a/tex/context/base/meta-pdh.lua +++ b/tex/context/base/meta-pdh.lua @@ -24,6 +24,7 @@ if not modules then modules = { } end modules ['meta-pdf'] = { local concat, format = table.concat, string.format +local texsprint = tex.sprint local ctxcatcodes = tex.ctxcatcodes mptopdf = { } @@ -148,11 +149,11 @@ end -- from lua to tex function mptopdf.pdfcode(str) - tex.sprint(ctxcatcodes,"\\PDFcode{" .. str .. "}") -- \\MPScode + texsprint(ctxcatcodes,"\\pdfliteral{" .. str .. "}") -- \\MPScode end function mptopdf.texcode(str) - tex.sprint(ctxcatcodes,str) + texsprint(ctxcatcodes,str) end -- auxiliary functions @@ -350,52 +351,23 @@ end --~ end --~ end -if false and ctx and ctx.aux and ctx.aux.definecolor then - - logs.report("mptopdf", "using attribute based mps colors") - - -- does not work due to Q-q mess-up - - function mps.setrgbcolor(r,g,b) -- extra check - r, g, b = tonumber(r), tonumber(g), tonumber(b) -- needed when we use lpeg - if r == 0.0123 and g < 0.1 then -- g is extra check - mptopdf.texcode("\\doresetattribute{transparency}\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}") - elseif r == 0.123 and g < 0.1 then -- g is extra check - mptopdf.texcode("\\doresetattribute{transparency}\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}") - else - mptopdf.texcode("\\doresetattribute{transparency}\\dosetattribute{color}{" .. colors.register('color',nil,'rgb',r,g,b) .. "}") - end - end - - function mps.setcmykcolor(c,m,y,k) - mptopdf.texcode("\\doresetattribute{transparency}\\dosetattribute{color}{" .. colors.register('color',nil,'cmyk',tonumber(c),tonumber(m),tonumber(y),tonumber(k)) .. "}") - end - - function mps.setgray(s) - mptopdf.texcode("\\doresetattribute{transparency}\\dosetattribute{color}{" .. colors.register('color',nil,'gray',tonumber(s)) .. "}") - end - -else - - function mps.setrgbcolor(r,g,b) -- extra check - r, g = tonumber(r), tonumber(g) -- needed when we use lpeg - if r == 0.0123 and g < 0.1 then - mptopdf.texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}") - elseif r == 0.123 and g < 0.1 then - mptopdf.texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}") - else - mptopdf.texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}") - end - end - - function mps.setcmykcolor(c,m,y,k) - mptopdf.texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}") +function mps.setrgbcolor(r,g,b) -- extra check + r, g = tonumber(r), tonumber(g) -- needed when we use lpeg + if r == 0.0123 and g < 0.1 then + mptopdf.texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}") + elseif r == 0.123 and g < 0.1 then + mptopdf.texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}") + else + mptopdf.texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}") end +end - function mps.setgray(s) - mptopdf.texcode("\\MPSgray{" .. s .. "}") - end +function mps.setcmykcolor(c,m,y,k) + mptopdf.texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}") +end +function mps.setgray(s) + mptopdf.texcode("\\MPSgray{" .. s .. "}") end function mps.specials(version,signal,factor) -- 2.0 123 1000 diff --git a/tex/context/base/meta-pdh.mkiv b/tex/context/base/meta-pdh.mkiv new file mode 100644 index 000000000..0736598cf --- /dev/null +++ b/tex/context/base/meta-pdh.mkiv @@ -0,0 +1,780 @@ +%D \module +%D [ file=meta-pdf, +%D version=2006.06.07, +%D title=\METAPOST\ Graphics, +%D subtitle=Conversion to \PDF, +%D author=Hans Hagen \& others (see text), +%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. + +%D Formerly known as supp-pdf.tex and supp-mpe.tex and meta-pdf.mkiv. +%D +%D Beware: this file is not used but kept for historic purposed! + +% \useMPgraphic{1} +% \testfeatureonce{250}{\setbox0\hbox{\convertMPtoPDF{test-mps-mpgraph.1}{1}{1}}} +% +% 8.4 : mkii, direct parsing by tex +% 11.8 : mkiv, dirty conversion (10.8 with dirty tricks) +% 14.5 : mkiv, clean conversion +% 7.4 : mkiv, simulated clean direct lua from mp +% 0.3 : time taken by tex to handle converted code +% +% timings may differ now that we revamped the backend + +\registerctxluafile{meta-pdf}{1.003} + +%D We will clean up the color mess later. + +\writestatus{loading}{MetaPost Graphics / MPS to PDF} + +\unprotect + +%D First we define a handy constant: + +\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup + +%D \macros +%D {convertMPtoPDF} +%D +%D The next set of macros implements \METAPOST\ to \PDF\ +%D conversion. The traditional method is in the MkII file. +%D +%D The main conversion command is: +%D +%D \starttyping +%D \convertMPtoPDF {filename} {x scale} {y scale} +%D \stoptyping +%D +%D The dimensions are derived from the bounding box. So we +%D only have to say: +%D +%D \starttyping +%D \convertMPtoPDF{mp-pra-1.eps}{1}{1} +%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5} +%D \stoptyping + +%D \macros +%D {makeMPintoPDFobject,lastPDFMPobject} +%D +%D For experts there are a few more options. When attributes +%D are to be added, the code must be embedded in an object +%D accompanied with the appropriate directives. One can +%D influence this process with \type {\makeMPintoPDFobject}. +%D +%D This option defaults to~0, because \CONTEXT\ takes care +%D of objects at another level, which saves some bytes. +%D +%D \starttabulate[|l|l|p|] +%D \NC 0 \NC never \NC don't use an object \NC\NR +%D \NC 1 \NC always \NC always use an object \NC\NR +%D \NC 2 \NC optional \NC use object when needed \NC\NR +%D \stoptabulate +%D +%D The last object number used is avaliable in the macro +%D \type {\lastPDFMPobject}. + +\ifx\makeMPintoPDFobject \undefined \chardef\makeMPintoPDFobject \zerocount \fi +\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion \fi + +\let\lastPDFMPobject \!!zerocount +\let\currentPDFresources\empty +\let\setMPextensions \relax + +\def\PDFMPformoffset + {\ifx\objectoffset\undefined\zeropoint\else\objectoffset\fi} + +\def\resetMPvariables#1#2#3% + {\global\let\MPwidth \!!zeropoint + \global\let\MPheight\!!zeropoint + \global\let\MPllx \!!zerocount + \global\let\MPlly \!!zerocount + \global\let\MPurx \!!zerocount + \global\let\MPury \!!zerocount + \xdef\MPxscale {#2}\ifx\MPxscale\empty\let\MPxscale\!!plusone\fi + \xdef\MPyscale {#3}\ifx\MPyscale\empty\let\MPyscale\!!plusone\fi + \xdef\MPfilename {#1}} + +%D The main macro: + +\def\convertMPtoPDF#1#2#3% watch the transparency reset + {\resetMPvariables{#1}{#2}{#3}% + \vbox\bgroup + \forgetall + \offinterlineskip + \setbox\scratchbox\vbox\bgroup + \setnormalcatcodes % we can be in verbatim or so + \message{[MP to PDF]}% + \startMPresources + \pdfliteral{\letterpercent\space mps begin}% + \pdfliteral{q 1 0 0 1 0 0 cm}% + \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces + \pdfliteral{Q}% + \pdfliteral{\letterpercent\space mps end}% + \stopMPresources + \egroup + \setbox\scratchbox\hbox\bgroup + \hskip-\MPllx\onebasepoint + \raise-\MPlly\onebasepoint + \box\scratchbox + \egroup + \setbox\scratchbox\vbox to \MPheight\bgroup + \vfill + \hsize\MPwidth + \smashbox\scratchbox + \box\scratchbox + \egroup + \wd\scratchbox\MPwidth + \ht\scratchbox\MPheight + \dopackageMPgraphic\scratchbox + \egroup} + +\let\processMPtoPDFfile\convertMPtoPDF + +%D A common hook. + +\let\MPfshowcommand\empty + +%D Objects. + +\def\dopackageMPgraphic#1% #1 = boxregister + {\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else + % an existing value of 2 signals object support (set elsewhere) + \chardef\makeMPintoPDFobject\plusone + \fi\fi + \ifcase\makeMPintoPDFobject + \box#1% + \or + \scratchdimen\PDFMPformoffset\relax + \ifdim\scratchdimen>\zeropoint % compensate for error + \setbox#1\vbox spread 2\scratchdimen + {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}% + \fi + \setMPPDFobject{\currentPDFresources}{#1}% + \ifdim\scratchdimen>\zeropoint % compensate for error + \vbox to \MPheight + {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}% + \else + \getMPPDFobject + \fi + \global\let\currentPDFresources\empty + \else + \box#1% + \fi} + +\def\setMPPDFobject#1#2% resources boxnumber + {\ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi + \immediate\pdfxform resources{#1}#2% + \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}} + +\let\getMPPDFobject\relax + +%D \macros +%D {deleteMPgraphic, +%D startMPresources, +%D stopMPresources} + +\ifx\deleteMPgraphic\undefined + \def\deleteMPgraphic#1{} +\fi + +\ifx\startMPresources\undefined + \let\startMPresources\relax + \let\stopMPresources\relax +\fi + +%D We implement extensions by using the \METAPOST\ special +%D mechanism. Opposite to \TEX's specials, the \METAPOST\ ones +%D are flushed before or after the graphic data, but thereby +%D are no longer connected to a position. +%D +%D We implement specials by overloading the \type {fill} +%D operator. By counting the fills, we can let the converter +%D treat the appropriate fill in a special way. The +%D specification of the speciality can have two forms, +%D determined by the setting of a boolean variable: +%D +%D \starttyping +%D _inline_specials_ := false ; % comment like code (default) +%D _inline_specials_ := true ; % command like code +%D \stoptyping +%D +%D When the specification is embedded as comment, it looks +%D like: +%D +%D \starttyping +%D %%MetaPostSpecial <size> <data> <number> <identifier> +%D \stoptyping +%D +%D The in||line alternative is more tuned for \POSTSCRIPT, +%D since it permits us to define a macro \type {special}. +%D +%D \starttyping +%D inline : <data> <number> <identifier> <size> special +%D \stoptyping +%D +%D The \type {identifier} determines what to do, and the data +%D can be used to accomplish this. A type~2 shading function +%D has identifier~2. Alltogether, the number of parameters is +%D specified in \type {size}. The \type {number} is the number +%D of the fill that needs the special treatment. For a type~2 +%D and~3 shaded fill, the datablock contains the following + +%D data: +%D +%D \starttyping +%D from to n inner_r g b x y outer_r g b x y +%D from to n inner_r g b x y radius outer_r g b x y radius +%D \stoptyping + +\newconditional\manyMPspecials \settrue\manyMPspecials + +%D In case of \PDF, we need to prepare resourcs. + +\newtoks\MPstartresources +\newtoks\MPstopresources + +\def\startMPresources + {\the\MPstartresources} + +\def\stopMPresources + {\the\MPstopresources} + +%D Some day we may consider collecting local resources. + +\appendtoks + \global\let\currentPDFresources\empty % kind of redundant +\to \MPstartresources + +% \appendtoks +% \collectPDFresources +% \global\let\currentPDFresources\collectedPDFresources +% \to \MPstopresources + +\appendtoksonce + \the\everyPDFxform +\to \MPstopresources + +%D Since colors are not subjected to transformations, we can +%D only use colors as signal. In our case, we use a dummy colored +%D path with a red color component of \type {0.n}, so \type +%D {0.001} is the first path and \type {0.010} the tenth. Since +%D \METAPOST strips trailing zeros, we have to padd the string. + +\newif\ifMPcmykcolors +\newif\ifMPspotcolors + +%D Specials: + +% \settrue \manyMPspecials \newcount\nofMParguments \let\extraMPpathcode\empty +% +% \def\@@MP {@@MP} +% \def\@@MPSK{@MPSK@} +% +% \def\MPspecial{\@@MPSK\@@MPSK\gMPs\nofMParguments} +% +% \def\defineMPspecial#1#2% +% {\setvalue{\@@MPSK\@@MPSK#1}{#2}} + +%D Special number~1 is dedicated to \CMYK\ support. If you +%D want to know why: look at this: +%D +%D \startbuffer[mp] +%D fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ; +%D \stopbuffer +%D +%D \startbuffer[cmyk] +%D \startcombination[4*1] +%D {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3} +%D {\definecolor[test][c=.9,y=.15] \processMPbuffer[mp]} {c=.9 y=.15} +%D {\definecolor[test][c=.25,y=.8] \processMPbuffer[mp]} {c=.25 y=.8} +%D {\definecolor[test][c=.45,y=.1] \processMPbuffer[mp]} {c=.45 y=.1} +%D \stopcombination +%D \stopbuffer +%D +%D \placefigure +%D {\CMYK\ support disabled, +%D conversion to \RGB.} +%D {\setupcolors[cmyk=nee,state=start]\getbuffer[cmyk]} +%D +%D \placefigure +%D {\CMYK\ support enabled, +%D no support in \METAPOST.} +%D {\setupcolors[cmyk=ja,mpcmyk=nee,state=start]\getbuffer[cmyk]} +%D +%D \placefigure +%D {\CMYK\ support enabled, +%D no conversion to \RGB, +%D support in \METAPOST} +%D {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]} + +% \let\revokeMPtransparencyspecial\relax + +%D Transparency support used specials 60 (rgb) and 61 +%D (cmyk). +%D +%D \startbuffer +%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0); +%D +%D fill p rotated 90 withcolor transparent(1,.5,yellow) ; +%D fill p rotated 210 withcolor transparent(1,.5,green) ; +%D fill p rotated 330 withcolor transparent(1,.5,blue) ; +%D \stopbuffer +%D +%D \typebuffer +%D +%D \startlinecorrection \processMPbuffer \stoplinecorrection +%D +%D One can also communicate colors between \CONTEXT\ and +%D \METAPOST: +%D +%D \startbuffer +%D \definecolor[tcyan] [c=1,k=.2,t=.5] +%D \definecolor[tmagenta][m=1,k=.2,t=.5] +%D \definecolor[tyellow] [y=1,k=.2,t=.5] +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D \startbuffer +%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0); +%D +%D fill p rotated 90 withcolor \MPcolor{tcyan} ; +%D fill p rotated 210 withcolor \MPcolor{tmagenta} ; +%D fill p rotated 330 withcolor \MPcolor{tyellow} ; +%D \stopbuffer +%D +%D \startlinecorrection \processMPbuffer \stoplinecorrection + +%D Shading is an example of a more advanced graphic feature, +%D but users will seldom encounter those complications. Here +%D we only show a few simple examples, but many other +%D alternatives are possible by setting up the functions built +%D in \PDF\ in the appropriate way. +%D +%D Shading has to do with interpolation between two or more +%D points or user supplied ranges. In \PDF, the specifications +%D of a shade has to be encapsulated in objects and passed on +%D as resources. This is a \PDF\ level 1.3. feature. One can +%D simulate three dimensional shades as well and define simple +%D functions using a limited set of \POSTSCRIPT\ primitives. +%D Given the power of \METAPOST\ and these \PDF\ features, we +%D can achieve superb graphic effects. +%D +%D Since everything is hidden in \TEX\ and \METAPOST\ graphics, +%D we can stick to high level \CONTEXT\ command, as shown in +%D the following exmples. +%D +%D \startbuffer +%D \startuniqueMPgraphic{CircularShade} +%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; +%D circular_shade(p,0,.2red,.9red) ; +%D \stopuniqueMPgraphic +%D +%D \startuniqueMPgraphic{LinearShade} +%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; +%D linear_shade(p,0,.2blue,.9blue) ; +%D \stopuniqueMPgraphic +%D +%D \startuniqueMPgraphic{DuotoneShade} +%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; +%D linear_shade(p,2,.5green,.5red) ; +%D \stopuniqueMPgraphic +%D \stopbuffer +%D +%D \typebuffer +%D +%D \getbuffer +%D +%D These graphics can be hooked into the overlay mechanism, +%D which is available in many commands. +%D +%D \startbuffer +%D \defineoverlay[demo 1][\uniqueMPgraphic{CircularShade}] +%D \defineoverlay[demo 2][\uniqueMPgraphic {LinearShade}] +%D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}] +%D \stopbuffer +%D +%D \typebuffer +%D +%D \getbuffer +%D +%D These backgrounds can for instance be applied to \type +%D {\framed}: +%D +%D \startbuffer +%D \setupframed[width=3cm,height=2cm,frame=off] +%D \startcombination[3*1] +%D {\framed[backgroundachtergrond=demo 1]{\bfd \white Demo 1}} {} +%D {\framed[backgroundachtergrond=demo 2]{\bfd \white Demo 2}} {} +%D {\framed[backgroundachtergrond=demo 3]{\bfd \white Demo 3}} {} +%D \stopcombination +%D \stopbuffer +%D +%D \typebuffer +%D +%D \startlinecorrection +%D \getbuffer +%D \stoplinecorrection +%D +%D There are a few more alternatives, determined by the second +%D parameter passed to \type {circular_shade} and alike. +%D +%D \def\SomeShade#1#2#3#4#5% +%D {\startuniqueMPgraphic{Shade-#1} +%D width := \overlaywidth ; +%D height := \overlayheight ; +%D path p ; p := unitsquare xscaled width yscaled height ; +%D #2_shade(p,#3,#4,#5) ; +%D \stopuniqueMPgraphic +%D \defineoverlay[Shade-#1][\uniqueMPgraphic{Shade-#1}]% +%D \framed[backgroundachtergrond=Shade-#1,width=2cm,height=2cm,frame=off]{}} +%D +%D \startlinecorrection +%D \startcombination[5*1] +%D {\SomeShade{10}{circular}{0}{.3blue}{.9blue}} {circular 0} +%D {\SomeShade{11}{circular}{1}{.3blue}{.9blue}} {circular 1} +%D {\SomeShade{12}{circular}{2}{.3blue}{.9blue}} {circular 2} +%D {\SomeShade{13}{circular}{3}{.3blue}{.9blue}} {circular 3} +%D {\SomeShade{14}{circular}{4}{.3blue}{.9blue}} {circular 4} +%D \stopcombination +%D \stoplinecorrection +%D +%D \blank +%D +%D \startlinecorrection +%D \startcombination[5*1] +%D {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0} +%D {\SomeShade{21}{circular}{1}{.9green}{.3green}} {circular 1} +%D {\SomeShade{22}{circular}{2}{.9green}{.3green}} {circular 2} +%D {\SomeShade{23}{circular}{3}{.9green}{.3green}} {circular 3} +%D {\SomeShade{24}{circular}{4}{.9green}{.3green}} {circular 4} +%D \stopcombination +%D \stoplinecorrection +%D +%D \blank +%D +%D \startlinecorrection +%D \startcombination[4*1] +%D {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0} +%D {\SomeShade{31}{linear}{1}{.3red}{.9red}} {linear 1} +%D {\SomeShade{32}{linear}{2}{.3red}{.9red}} {linear 2} +%D {\SomeShade{33}{linear}{3}{.3red}{.9red}} {linear 3} +%D \stopcombination +%D \stoplinecorrection +%D +%D These macros closely cooperate with the \METAPOST\ module +%D \type {mp-spec.mp}, which is part of the \CONTEXT\ +%D distribution. +%D +%D The low level (\PDF) implementation is based on the \TEX\ +%D based \METAPOST\ to \PDF\ converter. Shading is supported +%D by overloading the \type {fill} operator as implemented +%D earlier. In \PDF\ type~2 and~3 shading functions are +%D specified in terms of: +%D +%D \starttabulate[|Tl|l|] +%D \NC /Domain \NC sort of meeting range \NC \NR +%D \NC /C0 \NC inner shade \NC \NR +%D \NC /C1 \NC outer shade \NC \NR +%D \NC /N \NC smaller values, bigger inner circles \NC \NR +%D \stoptabulate + +% \newcount\currentPDFshade % 0 % global (document wide) counter +% +% \def\dosetMPsomePDFshade#1#2% +% {\immediate\pdfobj +% {<</FunctionType 2 +% /Domain [\gMPs1 \gMPs2] +% /C0 [\MPshadeA] +% /C1 [\MPshadeB] +% /N \gMPs3>>}% +% \immediate\pdfobj +% {<</ShadingType #1 +% /ColorSpace /\MPresolvedspace +% /Function \the\pdflastobj\space 0 R +% /Coords [\MPshadeC] +% /Extend [true true]>>}% +% \global\advance\currentPDFshade \plusone +% \ctxlua{lpdf.adddocumentshade("Sh\the\currentPDFshade",lpdf.reference(\the\pdflastobj))}% +% \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}} +% +% \def\dosetMPlinearshade {\dosetMPsomePDFshade2}% #1 +% \def\dosetMPcircularshade{\dosetMPsomePDFshade3}% #1 +% +% \defineMPspecial{30} +% {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA +% \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{9}}{\gMPs{10}}{\gMPs{11}}}\to\MPshadeB +% \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}}% +% \dosetMPlinearshade{\gMPs{14}}} +% +% \defineMPspecial{31} +% {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA +% \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}}\to\MPshadeB +% \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}}% +% \dosetMPcircularshade{\gMPs{16}}} +% +% \defineMPspecial{32} +% {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA +% \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB +% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}% +% \dosetMPlinearshade{\gMPs{16}}} +% +% \defineMPspecial{33} +% {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA +% \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB +% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}% +% \dosetMPcircularshade{\gMPs{18}}} +% +% \defineMPspecial{34} +% {\normalexpanded{\noexpand\resolveMPspotcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA +% \normalexpanded{\noexpand\resolveMPspotcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB +% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}% +% \dosetMPlinearshade{\gMPs{16}}} +% +% \defineMPspecial{35} +% {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA +% \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB +% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}% +% \dosetMPcircularshade{\gMPs{18}}} +% +% \newconditional\ignoreMPpath +% +% \def\dohandleMPshade#1% +% {\revokeMPtransparencyspecial +% \settrue\ignoreMPpath +% \def\extraMPpathcode{/Sh#1 sh Q}% +% \pdfliteral{q /Pattern cs}} +% +% \defineMPspecial{10} +% {\setxvalue{\@@MPSK\gMPs8}% +% {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}} +% +% \def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig +% {\global\letvalue{\@@MPSK#8}\empty +% \vbox to \zeropoint +% {\vss +% \hbox to \zeropoint +% {\ifcase\pdfoutput\or % will be hooked into the special driver +% \doiffileelse{#7} +% {\doifundefinedelse{mps:x:#7} +% {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}% +% \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}% +% {\message{[reusing figure #7]}}% +% \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}% +% \rlap{\getvalue{mps:x:#7}}% +% \pdfliteral{Q}} +% {\message{[unknown figure #7]}}% +% \fi +% \hss}}} + +%D An example of using both special features is the +%D following. +%D +%D \starttyping +%D \startMPpage +%D externalfigure "hakker1b.png" scaled 22cm rotated 10 shifted (-2cm,0cm); +%D externalfigure "hakker1b.png" scaled 10cm rotated -10 ; +%D externalfigure "hakker1b.png" scaled 7cm rotated 45 shifted (8cm,12cm) ; +%D path p ; p := unitcircle xscaled 15cm yscaled 20cm; +%D path q ; q := p rotatedaround(center p,90) ; +%D path r ; r := buildcycle(p,q) ; clip currentpicture to r ; +%D path s ; s := boundingbox currentpicture enlarged 5mm ; +%D picture c ; c := currentpicture ; currentpicture := nullpicture ; +%D circular_shade(s,0,.2red,.9red) ; +%D addto currentpicture also c ; +%D \stopMPpage +%D \stoptyping + +% \defineMPspecial{20} +% {\setxvalue{\@@MPSK\gMPs6}% +% {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}} +% +% \def\handleMPhyperlink#1#2#3#4#5#6% +% {\global\letvalue{\@@MPSK#6}\empty +% \setbox\scratchbox\hbox +% {\setbox\scratchbox\null +% \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax +% \ht\scratchbox\dimexpr-#2\onebasepoint+#4\onebasepoint\relax +% \gotobox{\box\scratchbox}[#5]}% +% \setbox\scratchbox\hbox +% {\hskip\dimexpr\MPxoffset\onebasepoint+#1\onebasepoint\relax +% \raise\dimexpr\MPyoffset\onebasepoint+#2\onebasepoint\relax +% \box\scratchbox}% +% \smashbox\scratchbox +% \box\scratchbox} + +%D This special (number 50) passes positions to a tex file. +%D This method uses a two||pass approach an (mis|)|used the +%D context positioning macros. In \type {core-pos} we will +%D implement the low level submacro needed. +%D +%D \startbuffer +%D \definelayer[test] +%D +%D \setlayer +%D [test] +%D [x=\MPx{somepos-1},y=\MPy{somepos-1}] +%D {Whatever we want here!} +%D +%D \setlayer +%D [test] +%D [x=\MPx{somepos-2},y=\MPy{somepos-2}] +%D {Whatever we need there!} +%D +%D \startuseMPgraphic{oeps} +%D draw fullcircle scaled 6cm withcolor red ; +%D register ("somepos-1",1cm,2cm,center currentpicture) ; +%D register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ; +%D \stopuseMPgraphic +%D +%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}} +%D \stopbuffer +%D +%D \typebuffer +%D +%D Here the width and height are not realy used, but one can +%D imagine situations where tex has to work with values +%D calculated by \METAPOST. +%D +%D \startlinecorrection +%D \getbuffer +%D \stoplinecorrection +%D +%D Later we will implement a more convenient macro: +%D +%D \starttyping +%D \setMPlayer [test] [somepos-1] {Whatever we want here!} +%D \setMPlayer [test] [somepos-2] {Whatever we need there!} +%D \stoptyping + +% \defineMPspecial{50} % x y width height label +% {\dosavepositionwhd +% {\gMPs5}% +% {0}% +% {\the\dimexpr-\MPllx\onebasepoint+\gMPs1\onebasepoint\relax} +% {\the\dimexpr\gMPs2\onebasepoint-\scratchdimen+\MPury\onebasepoint\relax}% scratchdimen ? +% {\the\dimexpr\gMPs3\onebasepoint\relax}% +% {\the\dimexpr\gMPs4\onebasepoint\relax}% +% {0pt}} + +\startMPinitializations + mp_shade_version := 2 ; +\stopMPinitializations + +%D This is done much cleaner in \MPLIB. + +\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can + {\def\MPtextdata{#3}% % delegate the splitter to lua + redesign + \def\MPtextsize{#2}% + \def\lastMPmoveX{#4}% + \def\lastMPmoveY{#5}% + \defconvertedcommand\MPtextdata\MPtextdata % no edef + \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber + \executeifdefined{handleMPtext\MPtexttag} + {\setbox\scratchbox\hbox + {\font\temp=#1\space at #2\onebasepoint + \let\c\char + \temp + \MPfshowcommand{#3}}% + \setbox\scratchbox\hbox + {\hskip#4\onebasepoint + \raise#5\onebasepoint + \box\scratchbox}% + \smashbox\scratchbox + \box\scratchbox}} + +%D We save the special variables on a stack. It's not that +%D fast, but it make implementing the special more convenient. + +% \def\MPSbegin +% {\nofMParguments\zerocount} +% +% \def\MPSend +% {\csname\MPspecial\endcsname} +% +% \def\MPSset +% {\advance\nofMParguments\plusone +% \expandafter\def\csname\@@MP\number\nofMParguments\endcsname} +% +% \def\gMPs#1{\csname\@@MP\number#1\endcsname} + +%D The boundingbox. + +\def\MPSboundingbox#1#2#3#4% + {\xdef\MPllx{#1}\xdef\MPlly{#2}\xdef\MPurx{#3}\xdef\MPury{#4}% + \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}% + \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}} + +\MPSboundingbox0000 + +% \def\MPSspecial#1#2% +% {\csname\@@MPSK#2\endcsname} + +%D A path is (in most cases) just a sequence of \PDF\ commands. + +% \newconditional\ignoreMPpath + +% \def\MPSpath +% {\pdfliteral} + +% \def\MPScode % hack, will be improved +% {\ifconditional\ignoreMPpath +% \pdfliteral{h W n}% +% \ifx\extraMPpathcode\empty\else +% \pdfliteral{\extraMPpathcode}% +% \let\extraMPpathcode\empty +% \fi +% \setfalse\ignoreMPpath +% \expandafter\gobbleoneargument +% \else +% \expandafter\pdfliteral +% \fi} + +%D Test code: + +% \startMPcode +% fill fullcircle scaled 3cm withcolor red ; +% fill fullcircle scaled 2cm withcolor green ; +% fill fullcircle scaled 1cm withcolor blue ; +% currentpicture := currentpicture shifted (-4cm,0) ; +% fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ; +% fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ; +% fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ; +% currentpicture := currentpicture shifted (-4cm,0) ; +% draw fullcircle scaled 3cm dashed evenly ; +% draw fullcircle scaled 2cm dashed withdots ; +% draw origin withpen pencircle scaled 3mm; +% currentpicture := currentpicture shifted (-4cm,0) ; +% fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red); +% fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red); +% fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green); +% fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5)); +% currentpicture := currentpicture shifted (12cm,-4cm) ; +% draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ; +% currentpicture := currentpicture shifted (-4cm,0) ; +% % bug: shift +% draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30 ; +% draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ; +% filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ; +% currentpicture := currentpicture shifted (-4cm,0) ; +% % shade cannot handle shift +% circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ; +% circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ; +% filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ; +% \stopMPcode + +% We cannot use attributes for switching colors in mp literals because +% grouping (qQ) interferes. + +% \def\dohandleMPshade#1% +% {\revokeMPtransparencyspecial +% \settrue\ignoreMPpath +% \def\extraMPpathcode{/#1 sh Q}% +% \pdfliteral{q /Pattern cs}} + +\protect \endinput diff --git a/tex/context/base/metatex.tex b/tex/context/base/metatex.tex index c7ceb005d..df674c11a 100644 --- a/tex/context/base/metatex.tex +++ b/tex/context/base/metatex.tex @@ -37,12 +37,12 @@ \def\loadcorefile#1{\normalinput#1\relax} -\loadcorefile{syst-ini.tex} % some basic commands and allocations that are expected down the line -\loadcorefile{syst-pln.tex} % plain tex initializations of internal registers (no further code) +\loadcorefile{syst-ini} % some basic commands and allocations that are expected down the line +\loadcorefile{syst-pln} % plain tex initializations of internal registers (no further code) -\loadcorefile{luat-cod.tex} % -\loadcorefile{luat-bas.tex} % -\loadcorefile{luat-lib.tex} % +\loadmarkfile{luat-cod} % +\loadmarkfile{luat-bas} % +\loadmarkfile{luat-lib} % % needs stripping: @@ -54,12 +54,12 @@ % helpers, maybe less -\loadcorefile{syst-aux.tex} % a whole lot of auxiliary macros -%loadcorefile{syst-lua.tex} % some helpers using lua instead -%loadcorefile{syst-con.mkiv} % some rather basic conversions -%loadcorefile{syst-fnt.mkiv} -%loadcorefile{syst-str.mkiv} -%loadcorefile{syst-rtp.mkiv} +\loadmarkfile{syst-aux} % a whole lot of auxiliary macros +%loadmarkfile{syst-lua} % some helpers using lua instead +%loadmarkfile{syst-con} % some rather basic conversions +%loadmarkfile{syst-fnt} +%loadmarkfile{syst-str} +%loadmarkfile{syst-rtp} % not needed @@ -68,24 +68,24 @@ % characters -\loadcorefile{char-utf.tex} -\loadcorefile{char-ini.tex} -\loadcorefile{char-enc.tex} % \registerctxluafile{char-enc}{1.001} +\loadmarkfile{char-utf} +\loadmarkfile{char-ini} +\loadmarkfile{char-enc} % \registerctxluafile{char-enc}{1.001} % nodes -\loadcorefile{node-ini.tex} -%loadcorefile{node-fin.tex} -%loadcorefile{node-par.tex} +\loadmarkfile{node-ini} +%loadmarkfile{node-fin} +%loadmarkfile{node-par} % attributes, not needed: -%loadcorefile{attr-ini.tex} +%loadmarkfile{attr-ini} % regimes -% \loadcorefile{regi-ini.mkiv} -% \loadcorefile{regi-syn.tex} +% \loadmarkfile{regi-ini} +% \loadcorefile{regi-syn} % languages @@ -132,10 +132,6 @@ %registerctxluafile{l-xml}{1.001} % needed for font database -% plain - -%loadcorefile{syst-stp.tex} % stripped plain - % why not ... \pdfoutput\plusone diff --git a/tex/context/base/mlib-ctx.lua b/tex/context/base/mlib-ctx.lua index 4d4e25a3d..2b16af28e 100644 --- a/tex/context/base/mlib-ctx.lua +++ b/tex/context/base/mlib-ctx.lua @@ -41,8 +41,15 @@ end statistics.register("metapost processing time", function() local n = metapost.n if n > 0 then - return format("%s seconds, loading: %s seconds, execution: %s seconds, n: %s", - statistics.elapsedtime(metapost), statistics.elapsedtime(mplib), statistics.elapsedtime(metapost.exectime),n) + local e = metapost.externals.n + local str = format("%s seconds, loading: %s seconds, execution: %s seconds, n: %s", + statistics.elapsedtime(metapost), statistics.elapsedtime(mplib), + statistics.elapsedtime(metapost.exectime), n) + if e > 0 then + return format("%s, external: %s seconds (%s calls)", str, statistics.elapsedtime(metapost.externals), e) + else + return str + end else return nil end diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua index 8dfa5e552..b0b4bfe4f 100644 --- a/tex/context/base/mlib-pdf.lua +++ b/tex/context/base/mlib-pdf.lua @@ -293,7 +293,6 @@ function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan co prescript = object.prescript, postscript = object.postscript, } - --~ print(table.serialize(currentobject)) -- local before, inbetween, after = nil, nil, nil -- @@ -457,34 +456,32 @@ function metapost.parse(result,askedfig) end end -do +-- tracing: - -- just tracing +local t = { } - local t = { } - - local flusher = { - startfigure = function() - t = { } - texsprint(ctxcatcodes,"\\startnointerference") - end, - flushfigure = function(literals) - for i=1, #literals do - t[#t+1] = literals[i] - end - end, - stopfigure = function() - texsprint(ctxcatcodes,"\\stopnointerference") +local flusher = { + startfigure = function() + t = { } + texsprint(ctxcatcodes,"\\startnointerference") + end, + flushfigure = function(literals) + for i=1, #literals do + t[#t+1] = literals[i] end - } - - function metapost.pdfliterals(result) - metapost.flush(result,flusher) - return t + end, + stopfigure = function() + texsprint(ctxcatcodes,"\\stopnointerference") end +} +function metapost.pdfliterals(result) + metapost.flush(result,flusher) + return t end +-- so far + function metapost.totable(result) local figure = result and result.fig and result.fig[1] if figure then @@ -510,6 +507,8 @@ function metapost.totable(result) end end +-- will be overloaded later + function metapost.colorconverter() return function(cr) local n = #cr diff --git a/tex/context/base/mlib-pdf.mkiv b/tex/context/base/mlib-pdf.mkiv index 92fcb28ae..2681b0810 100644 --- a/tex/context/base/mlib-pdf.mkiv +++ b/tex/context/base/mlib-pdf.mkiv @@ -15,8 +15,6 @@ \registerctxluafile{mlib-pdf}{1.001} -% \let\MPLIBtoPDF\pdfliteral - \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}} \def\MPLIBboundingbox#1#2#3#4% @@ -31,7 +29,7 @@ {\naturalhbox\bgroup \doactivatecolor\s!black\forcecolorhack \MPLIBboundingbox{#1}{#2}{#3}{#4}% - \forgetall + %\forgetall % done already elsewhere \setbox\scratchbox\vbox\bgroup \noindent % this is really needed in order to force tex into proper cm's \startMPresources} @@ -81,7 +79,7 @@ {\font\temp=#1\space at #2\onebasepoint \let\c\char \temp - \MPfshowcommand{#3}}% + #3}% \setbox\scratchbox\hbox {\hskip#4\onebasepoint \raise#5\onebasepoint diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua index 04a9ba230..d5ce9e869 100644 --- a/tex/context/base/mlib-pps.lua +++ b/tex/context/base/mlib-pps.lua @@ -27,6 +27,7 @@ local cmyktogray = colors.cmyktogray or function() return 0 end metapost = metapost or { } metapost.specials = metapost.specials or { } metapost.specials.data = metapost.specials.data or { } +metapost.externals = metapost.externals or { n = 0 } local data = metapost.specials.data @@ -40,21 +41,25 @@ local colordata = { {}, {}, {}, {}, {} } --~ => rest : r=123 g=n>10 b=whatever local nooutercolor = "0 g 0 G" -local nooutertransparency = "/Tr0 gs" +local nooutertransparency = "/Tr0 gs" -- only when set local outercolormode = 0 local outercolor = nooutercolor local outertransparency = nooutertransparency local innercolor = nooutercolor local innertransparency = nooutertransparency -function metapost.set_outer_color(mode,color,transparency) +local pdfcolor, pdftransparency = lpdf.color, lpdf.transparency +local registercolor, registerspotcolor = colors.register, colors.registerspotcolor +local registertransparencies = transparencies.register + +function metapost.set_outer_color(mode,colormodel,colorattribute,transparencyattribute) -- has always to be called before conversion -- todo: transparency (not in the mood now) outercolormode = mode if mode == 1 or mode == 3 then - -- inherit from outer - outercolor = color or nooutercolor - outertransparency = transparency or nooutertransparency + -- inherit from outer (registered color) + outercolor = pdfcolor(colormodel,colorattribute) or nooutercolor + outertransparency = pdftransparency(transparencyattribute) or nooutertransparency elseif mode == 2 then -- stand alone outercolor = "" @@ -63,8 +68,8 @@ function metapost.set_outer_color(mode,color,transparency) outercolor = nooutercolor outertransparency = nooutertransparency end - innercolor = outercolor - innertransparency = outertransparency + innercolor = outercolor + innertransparency = outertransparency -- not yet used end local function checked_color_pair(color) @@ -117,7 +122,12 @@ function metapost.specials.register(str) -- only colors --~ end end -function metapost.colorhandler(cs, object, result, colorconverter) +local function spotcolorconverter(parent, n, d, p) + registerspotcolor(parent) + return pdfcolor(colors.model,registercolor('color',nil,'spot',parent,n,d,p)) +end + +function metapost.colorhandler(cs, object, result, colorconverter) -- handles specials local cr = outercolor local what = round(cs[2]*10000) local data = colordata[what] @@ -129,16 +139,14 @@ function metapost.colorhandler(cs, object, result, colorconverter) elseif what == 1 then result[#result+1], cr = colorconverter({ data[2], data[3], data[4], data[5] }) elseif what == 2 then - ctx.registerspotcolor(data[2]) - result[#result+1] = ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[2],data[3],data[4],data[5])) + result[#result+1] = spotcolorconverter(data[2],data[3],data[4],data[5]) else if what == 3 then result[#result+1], cr = colorconverter({ data[3], data[4], data[5]}) elseif what == 4 then result[#result+1], cr = colorconverter({ data[3], data[4], data[5], data[6]}) elseif what == 5 then - ctx.registerspotcolor(data[3]) - result[#result+1] = ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[3],data[4],data[5],data[6])) + result[#result+1] = spotcolorconverter(data[3],data[4],data[5],data[6]) end object.prescript = "tr" object.postscript = data[1] .. "," .. data[2] @@ -147,30 +155,28 @@ function metapost.colorhandler(cs, object, result, colorconverter) return object, cr end -function metapost.colorspec(cs) +function metapost.colorspec(cs) -- used for shades ... returns table (for checking) or string (spot) local what = round(cs[2]*10000) local data = colordata[what][round(cs[3]*10000)] if not data then return { 0 } elseif what == 1 then - return { data[2], data[3], data[4], data[5] } + return { tonumber(data[2]), tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) } elseif what == 2 then - ctx.registerspotcolor(data[2]) - return ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[2],data[3],data[4],data[5])) + return spotcolorconverter(data[2],data[3],data[4],data[5]) elseif what == 3 then - return { data[3], data[4], data[5] } + return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) } elseif what == 4 then - return { data[3], data[4], data[5], data[6] } + return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]), tonumber(data[6]) } elseif what == 5 then - ctx.registerspotcolor(data[3]) - return ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[3],data[4],data[5],data[6])) + return spotcolorconverter(data[3],data[4],data[5],data[6]) end end function metapost.specials.tr(specification,object,result) local a, t = match(specification,"^(.+),(.+)$") local before = a and t and function() - result[#result+1] = format("/Tr%s gs",transparencies.register('mp',a,t)) + result[#result+1] = format("/Tr%s gs",registertransparencies('mp',a,t)) return object, result end local after = before and function() @@ -182,6 +188,7 @@ end local specificationsplitter = lpeg.Ct(lpeg.splitat(" ")) local colorsplitter = lpeg.Ct(lpeg.splitat(":")) +local colorsplitter = lpeg.Ct(lpeg.splitter(":",tonumber)) -- Unfortunately we cannot use cmyk colors natively because there is no -- generic color allocation primitive ... it's just an rgbcolor color.. This @@ -273,20 +280,12 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color local cb = colorsplitter:match(t[8]) if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end + local name = format("MplSh%s",nofshades) + local domain = { tonumber(t[1]), tonumber(t[2]) } + local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[7]), tonumber(t[9]), tonumber(t[10]), tonumber(t[11]) } if type(ca) == "string" then - -- spot color, not supported, maybe at some point use the fallbacks - sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s %s %s}", - nofshades, - t[1], t[2], 0, 1, 1, "DeviceGray", - t[5], t[6], t[7], t[9], t[10], t[11])) --- terrible hack, somehow does not work ---~ local a = ca:match("^([^ ]+)") ---~ local b = cb:match("^([^ ]+)") ---~ sprint(ctxcatcodes,format("\\xMPLIBcircularshade{%s}{%s %s}{%s}{%s}{%s}{%s}{%s %s %s %s %s %s}", ---~ nofshades, ---~ --~ t[1], t[2], a, b, 1, "DeviceN", ---~ 0, 1, a, b, 1, "DeviceN", ---~ t[5], t[6], t[7], t[9], t[10], t[11])) + -- backend specific (will be renamed) + lpdf.circularshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates) else if #ca > #cb then normalize(ca,cb) @@ -307,10 +306,8 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color ca[1], ca[2], ca[3] = a, a, a cb[1], cb[2], cb[3] = b, b, b end - sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f %.3f %.3f}{%.3f %.3f %.3f}{%s}{%s}{%s %s %s %s %s %s}", - nofshades, - t[1], t[2], ca[1], ca[2], ca[3], cb[1], cb[2], cb[3], 1, "DeviceRGB", - t[5], t[6], t[7], t[9], t[10], t[11])) + -- backend specific (will be renamed) + lpdf.circularshade(name,domain,ca,cb,1,"DeviceRGB",coordinates) elseif model == "cmyk" then if #ca == 3 then ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3]) @@ -319,10 +316,8 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1] cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1] end - sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f %.3f %.3f %.3f}{%.3f %.3f %.3f %.3f}{%s}{%s}{%s %s %s %s %s %s}", - nofshades, - t[1], t[2], ca[1], ca[2], ca[3], ca[4], cb[1], cb[2], cb[3], cb[4], 1, "DeviceCMYK", - t[5], t[6], t[7], t[9], t[10], t[11])) + -- backend specific (will be renamed) + lpdf.circularshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates) else if #ca == 4 then ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4]) @@ -331,10 +326,8 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color ca[1] = rgbtogray(ca[1],ca[2],ca[3]) cb[1] = rgbtogray(cb[1],cb[2],cb[3]) end - sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s %s %s}", - nofshades, - t[1], t[2], ca[1], cb[1], 1, "DeviceGray", - t[5], t[6], t[7], t[9], t[10], t[11])) + -- backend specific (will be renamed) + lpdf.circularshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates) end end local before = function() @@ -342,7 +335,7 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color return object, result end local after = function() - result[#result+1] = format("W n /MpSh%s sh Q", nofshades) + result[#result+1] = format("W n /%s sh Q", name) return object, result end object.color, object.type = nil, nil @@ -359,12 +352,12 @@ function metapost.specials.ls(specification,object,result,flusher) local cb = colorsplitter:match(t[7]) if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end + local name = format("MpSh%s",nofshades) + local domain = { tonumber(t[1]), tonumber(t[2]) } + local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[7]), tonumber(t[9]) } if type(ca) == "string" then - -- spot color, not supported, maybe at some point use the fallbacks - sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s}", - nofshades, - t[1], t[2], 0, 1, 1, "DeviceGray", - t[5], t[6], t[8], t[9])) + -- backend specific (will be renamed) + lpdf.linearshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates) else if #ca > #cb then normalize(ca,cb) @@ -384,10 +377,8 @@ function metapost.specials.ls(specification,object,result,flusher) ca[1], ca[2], ca[3] = a, a, a cb[1], cb[2], cb[3] = b, b, b end - sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f %.3f %.3f}{%.3f %.3f %.3f}{%s}{%s}{%s %s %s %s}", - nofshades, - t[1], t[2], ca[1], ca[2], ca[3], cb[1], cb[2], cb[3], 1, "DeviceRGB", - t[5], t[6], t[8], t[9])) + -- backend specific (will be renamed) + lpdf.linearshade(name,domain,ca,cb,1,"DeviceRGB",coordinates) elseif model == "cmyk" then if #ca == 3 then ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3]) @@ -396,10 +387,8 @@ function metapost.specials.ls(specification,object,result,flusher) ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1] cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1] end - sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f %.3f %.3f %.3f}{%.3f %.3f %.3f %.3f}{%s}{%s}{%s %s %s %s}", - nofshades, - t[1], t[2], ca[1], ca[2], ca[3], ca[4], cb[1], cb[2], cb[3], cb[4], 1, "DeviceCMYK", - t[5], t[6], t[8], t[9])) + -- backend specific (will be renamed) + lpdf.linearshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates) else if #ca == 4 then ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4]) @@ -408,10 +397,8 @@ function metapost.specials.ls(specification,object,result,flusher) ca[1] = rgbtogray(ca[1],ca[2],ca[3]) cb[1] = rgbtogray(cb[1],cb[2],cb[3]) end - sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s}", - nofshades, - t[1], t[2], ca[1], cb[1], 1, "DeviceGray", - t[5], t[6], t[8], t[9])) + -- backend specific (will be renamed) + lpdf.linearshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates) end end local before = function() @@ -419,7 +406,7 @@ function metapost.specials.ls(specification,object,result,flusher) return object, result end local after = function() - result[#result+1] = format("W n /MpSh%s sh Q", nofshades) + result[#result+1] = format("W n /%s sh Q", name) return object, result end object.color, object.type = nil, nil @@ -500,145 +487,146 @@ function metapost.specials.ts(specification,object,result,flusher) end end +-- rather generic pdf, so use this elsewhere too it no longer pays +-- off to distinguish between outline and fill (we now have both +-- too, e.g. in arrows) + metapost.reducetogray = true +local models = { } -function metapost.colorconverter() -- rather generic pdf, so use this elsewhere too - -- it no longer pays off to distinguish between outline and fill - -- (we now have both too, e.g. in arrows) - local model = colors.model - local reduce = metapost.reducetogray - if model == "all" then - return function(cr) - local n = #cr - if n == 0 then - return checked_color_pair() - elseif reduce then - if n == 1 then - local s = cr[1] - return checked_color_pair(format("%.3f g %.3f G",s,s)) - elseif n == 3 then - local r, g, b = cr[1], cr[2], cr[3] - if r == g and g == b then - return checked_color_pair(format("%.3f g %.3f G",r,r)) - else - return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) - end - else - local c, m, y, k = cr[1], cr[2], cr[3], cr[4] - if c == m and m == y and y == 0 then - k = 1 - k - return checked_color_pair(format("%.3f g %.3f G",k,k)) - else - return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) - end - end - elseif n == 1 then - local s = cr[1] - return checked_color_pair(format("%.3f g %.3f G",s,s)) - elseif n == 3 then - local r, g, b = cr[1], cr[2], cr[3] +function models.all(cr) + local n = #cr + if n == 0 then + return checked_color_pair() + elseif metapost.reducetogray then + if n == 1 then + local s = cr[1] + return checked_color_pair(format("%.3f g %.3f G",s,s)) + elseif n == 3 then + local r, g, b = cr[1], cr[2], cr[3] + if r == g and g == b then + return checked_color_pair(format("%.3f g %.3f G",r,r)) + else return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) + end + else + local c, m, y, k = cr[1], cr[2], cr[3], cr[4] + if c == m and m == y and y == 0 then + k = 1 - k + return checked_color_pair(format("%.3f g %.3f G",k,k)) else - local c, m, y, k = cr[1], cr[2], cr[3], cr[4] return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) end end - elseif model == "rgb" then - return function(cr) - local n = #cr - if n == 0 then - return checked_color_pair() - elseif reduce then - if n == 1 then - local s = cr[1] - checked_color_pair(format("%.3f g %.3f G",s,s)) - elseif n == 3 then - local r, g, b = cr[1], cr[2], cr[3] - if r == g and g == b then - return checked_color_pair(format("%.3f g %.3f G",r,r)) - else - return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) - end - else - local c, m, y, k = cr[1], cr[2], cr[3], cr[4] - if c == m and m == y and y == 0 then - k = 1 - k - return checked_color_pair(format("%.3f g %.3f G",k,k)) - else - local r, g, b = cmyktorgb(c,m,y,k) - return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) - end - end - elseif n == 1 then - local s = cr[1] - return checked_color_pair(format("%.3f g %.3f G",s,s)) + elseif n == 1 then + local s = cr[1] + return checked_color_pair(format("%.3f g %.3f G",s,s)) + elseif n == 3 then + local r, g, b = cr[1], cr[2], cr[3] + return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) + else + local c, m, y, k = cr[1], cr[2], cr[3], cr[4] + return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) + end +end + +function models.rgb(cr) + local n = #cr + if n == 0 then + return checked_color_pair() + elseif metapost.reducetogray then + if n == 1 then + local s = cr[1] + checked_color_pair(format("%.3f g %.3f G",s,s)) + elseif n == 3 then + local r, g, b = cr[1], cr[2], cr[3] + if r == g and g == b then + return checked_color_pair(format("%.3f g %.3f G",r,r)) else - local r, g, b - if n == 3 then - r, g, b = cmyktorgb(cr[1],cr[2],cr[3],cr[4]) - else - r, g, b = cr[1], cr[2], cr[3] - end return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) end - end - elseif model == "cmyk" then - return function(cr) - local n = #cr - if n == 0 then - return checked_color_pair() - elseif reduce then - if n == 1 then - local s = cr[1] - return checked_color_pair(format("%.3f g %.3f G",s,s)) - elseif n == 3 then - local r, g, b = cr[1], cr[2], cr[3] - if r == g and g == b then - return checked_color_pair(format("%.3f g %.3f G",r,r)) - else - local c, m, y, k = rgbtocmyk(r,g,b) - return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) - end - else - local c, m, y, k = cr[1], cr[2], cr[3], cr[4] - if c == m and m == y and y == 0 then - k = 1 - k - return checked_color_pair(format("%.3f g %.3f G",k,k)) - else - return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) - end - end - elseif n == 1 then - local s = cr[1] - return checked_color_pair(format("%.3f g %.3f G",s,s)) + else + local c, m, y, k = cr[1], cr[2], cr[3], cr[4] + if c == m and m == y and y == 0 then + k = 1 - k + return checked_color_pair(format("%.3f g %.3f G",k,k)) else - local c, m, y, k - if n == 3 then - c, m, y, k = rgbtocmyk(cr[1],cr[2],cr[3]) - else - c, m, y, k = cr[1], cr[2], cr[3], cr[4] - end - return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) + local r, g, b = cmyktorgb(c,m,y,k) + return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) end end + elseif n == 1 then + local s = cr[1] + return checked_color_pair(format("%.3f g %.3f G",s,s)) else - return function(cr) - local n, s = #cr, 0 - if n == 0 then - return checked_color_pair() - elseif n == 4 then - s = cmyktogray(cr[1],cr[2],cr[3],cr[4]) - elseif n == 3 then - s = rgbtogray(cr[1],cr[2],cr[3]) + local r, g, b + if n == 3 then + r, g, b = cmyktorgb(cr[1],cr[2],cr[3],cr[4]) + else + r, g, b = cr[1], cr[2], cr[3] + end + return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b)) + end +end + +function models.cmyk(cr) + local n = #cr + if n == 0 then + return checked_color_pair() + elseif metapost.reducetogray then + if n == 1 then + local s = cr[1] + return checked_color_pair(format("%.3f g %.3f G",s,s)) + elseif n == 3 then + local r, g, b = cr[1], cr[2], cr[3] + if r == g and g == b then + return checked_color_pair(format("%.3f g %.3f G",r,r)) else - s = cr[1] + local c, m, y, k = rgbtocmyk(r,g,b) + return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) end - return checked_color_pair(format("%.3f g %.3f G",s,s)) + else + local c, m, y, k = cr[1], cr[2], cr[3], cr[4] + if c == m and m == y and y == 0 then + k = 1 - k + return checked_color_pair(format("%.3f g %.3f G",k,k)) + else + return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) + end + end + elseif n == 1 then + local s = cr[1] + return checked_color_pair(format("%.3f g %.3f G",s,s)) + else + local c, m, y, k + if n == 3 then + c, m, y, k = rgbtocmyk(cr[1],cr[2],cr[3]) + else + c, m, y, k = cr[1], cr[2], cr[3], cr[4] end + return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k)) end end +function models.gray(cr) + local n, s = #cr, 0 + if n == 0 then + return checked_color_pair() + elseif n == 4 then + s = cmyktogray(cr[1],cr[2],cr[3],cr[4]) + elseif n == 3 then + s = rgbtogray(cr[1],cr[2],cr[3]) + else + s = cr[1] + end + return checked_color_pair(format("%.3f g %.3f G",s,s)) +end + +function metapost.colorconverter() + return models[colors.model] or gray +end + do local P, S, V, Cs = lpeg.P, lpeg.S, lpeg.V, lpeg.Cs @@ -829,6 +817,9 @@ end function metapost.intermediate.actions.makempy() if #graphics > 0 then + local externals = metapost.externals + externals.n = externals.n + 1 + statistics.starttiming(externals) local mpofile = tex.jobname .. "-mpgraph" local mpyfile = file.replacesuffix(mpofile,"mpy") local pdffile = file.replacesuffix(mpofile,"pdf") @@ -846,6 +837,7 @@ function metapost.intermediate.actions.makempy() io.savedata(mpyfile,concat(result,"")) end end - graphics = { } + statistics.stoptiming(externals) + graphics = { } -- ? end end diff --git a/tex/context/base/mlib-pps.mkiv b/tex/context/base/mlib-pps.mkiv index beaef044e..83880994b 100644 --- a/tex/context/base/mlib-pps.mkiv +++ b/tex/context/base/mlib-pps.mkiv @@ -15,15 +15,7 @@ \registerctxluafile{mlib-pps}{1.001} -\def\MPLIBcircularshade#1#2#3#4#5#6#7% nr domain color-a color-b ? colorspace oordinates - {\immediate\pdfobj{<</FunctionType 2 /Domain [#2] /C0 [#3] /C1 [#4] /N #5>>}% - \immediate\pdfobj{<</ShadingType 3 /ColorSpace /#6 /Function \the\pdflastobj\space 0 R /Coords [#7] /Extend [true true]>>}% - \appendtoPDFdocumentshades{/MpSh#1 \the\pdflastobj\space0 R }} - -\def\MPLIBlinearshade#1#2#3#4#5#6#7% nr domain color-a color-b ? colorspace oordinates - {\immediate\pdfobj{<</FunctionType 2 /Domain [#2] /C0 [#3] /C1 [#4] /N #5>>}% - \immediate\pdfobj{<</ShadingType 2 /ColorSpace /#6 /Function \the\pdflastobj\space 0 R /Coords [#7] /Extend [true true]>>}% - \appendtoPDFdocumentshades{/MpSh#1 \the\pdflastobj\space0 R }} +% this will move ! \def\MPLIBfigure#1#2#3#4#5#6#7% todo: move Q q to lua {\setbox\scratchbox\hbox{\externalfigure[#7]}% @@ -38,13 +30,7 @@ \def\MPLIBfreetext#1% {\global\setbox#1\emptybox} -% \def\MPLIBgettext#1#2#3#4#5#6#7% we can also use this for the figure and pass sx/sy -% {\ctxlua{metapost.edefsxsy(\number\wd#7,\number\ht#7,\number\dp#7)}% -% \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}% -% \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[sx=\sx,sy=\sy]{\raise\dp#7\box#7}\hss}}% -% \pdfliteral{Q}} - -\def\MPLIBgettextscaled#1#2#3% +\def\MPLIBgettextscaled#1#2#3% why a copy {\vbox to \zeropoint{\vss\hbox to \zeropoint{\black\scale[sx=#2,sy=#3]{\raise\dp#1\copy#1}\hss}}} \def\MPLIBallocate#1% diff --git a/tex/context/base/mlib-run.lua b/tex/context/base/mlib-run.lua index d22e0d742..b155dd344 100644 --- a/tex/context/base/mlib-run.lua +++ b/tex/context/base/mlib-run.lua @@ -116,7 +116,7 @@ function metapost.load(name) ini_version = false, mem_name = file.replacesuffix(name,"mem"), find_file = finder, ---~ job_name = "mplib", + -- job_name = "mplib", } ) ) local result diff --git a/tex/context/base/mult-chk.lua b/tex/context/base/mult-chk.lua index 1c74d2e38..2c1ab3c78 100644 --- a/tex/context/base/mult-chk.lua +++ b/tex/context/base/mult-chk.lua @@ -53,7 +53,7 @@ local function set(key,value) end end -local pattern = aux.make_settings_to_hash_pattern(set,true) +local pattern = aux.make_settings_to_hash_pattern(set,"tolerant") function commands.getcheckedparameters(k,p,s) if s and s ~= "" then diff --git a/tex/context/base/mult-chk.mkii b/tex/context/base/mult-chk.mkii index 6299d0cda..60f568a1e 100644 --- a/tex/context/base/mult-chk.mkii +++ b/tex/context/base/mult-chk.mkii @@ -15,6 +15,9 @@ %D No checking in \MKII. +\def\gobbleparameters{\doquadrupleempty\dogobbleparameters} % todo: 1,2,3,4 case +\def\dogobbleparameters[#1][#2][#3][#4]{} + \def\setvalidparameterkeys{\gobbleparameters} % forward reference, so no \let \def\addvalidparameterkeys{\gobbleparameters} % forward reference, so no \let diff --git a/tex/context/base/mult-cld.lua b/tex/context/base/mult-cld.lua new file mode 100644 index 000000000..c9e922afe --- /dev/null +++ b/tex/context/base/mult-cld.lua @@ -0,0 +1,174 @@ +if not modules then modules = { } end modules ['mult-cld'] = { + version = 1.001, + comment = "companion to mult-cld.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- This is an experiment: generating context code at the lua end. After all +-- it is surprisingly simple to implement due to metatables. I was wondering +-- if there was a more natural way to deal with commands at the lua end. +-- Of course it's a bit slower but often more readable when mixed with lua +-- code. It can also be handy when generating documents from databases or +-- when constructing large tables or so. +-- +-- Todo: optional checking against interface! + +context = context or { } + +local format, concat = string.format, table.concat +local next, type = next, type +local texsprint, texiowrite = tex.sprint, texio.write + +local flush = texsprint +local cache + +local function cached_flush(c,...) + local tt = { ... } + for i=1,#tt do + cache[#cache+1] = tt[i] + end +end + +local function writer(k,...) + flush(ctxcatcodes,k) + local t = { ... } + if next(t) then + for i=1,#t do + local ti = t[i] + local typ, force = type(ti), nil + while typ == "function" do + local saved_flush = flush + cache = { } + flush = cached_flush + ti, force = ti() + if force then + typ = false -- force special cases + elseif typ == "nil" then + typ = "string" + ti = concat(cache) + elseif typ == "string" then + ti = concat(cache) + end + flush = saved_flush + end + if ti == nil then + -- next + elseif typ == "string" or typ == "number" then + flush(ctxcatcodes,"{",ti,"}") + elseif typ == "table" then + flush(ctxcatcodes,"[") + local c = concat(ti,",") + if c ~= "" then + flush(ctxcatcodes,c) + else + local done = false + for k, v in next, ti do + if done then + flush(ctxcatcodes,",",k,'=',v) + else + flush(ctxcatcodes,k,'=',v) + done = true + end + end + end + flush(ctxcatcodes,"]") + -- elseif typ == "boolean" then + -- flush(ctxcatcodes,"\n") + elseif ti == true then + flush(ctxcatcodes,"\n") + elseif typ == false then + if force == "direct" then + flush(ctxcatcodes,tostring(ti)) + end + else + logs.report("interfaces","error: %s gets a weird argument %s",k,tostring(ti)) + end + end + end +end + +local function indexer(t,k) + local f = function(...) return writer("\\"..k.." ",...) end -- building the cs here saves time + t[k] = f + return f +end + +local function caller(t,f,...) + if f then + flush(ctxcatcodes,format(f,...)) + else + flush(ctxcatcodes,"\n") + end +end + +setmetatable(context, { __index = indexer, __call = caller } ) + +-- the only non macro: + +local trace_cld = false + +function context.runfile(filename) + filename = resolvers.findtexfile(filename) or "" + if filename ~= "" then + local ok = dofile(filename) + if ok then + if trace_cld then + commands.writestatus("cld","begin of file '%s'",filename) + end + ok() + if trace_cld then + commands.writestatus("cld","end of file '%s'",filename) + end + else + commands.writestatus("cld","invalid file '%s'",filename) + end + else + commands.writestatus("cld","unknown file '%s'",filename) + end +end + +-- tracking is using the regular mechanism; we need to define +-- these 'macro' functions explictly as otherwise they are are +-- delayed (as all commands print back to tex, so that tracing +-- would be enabled afterwards) + +trackers.register("cld.print", function(v) + trace_cld = v + if v then + flush = function(c,...) + texiowrite(...) + texsprint(c,...) + end + else + flush = texsprint + end +end) + +function context.enabletrackers (str) trackers.enable (str) end +function context.disabletrackers(str) trackers.disable(str) end + +-- see demo-lud.lud for an example + +-- context.starttext(true) +-- context.chapter({ "label" }, "title", true) +-- context.chapter(function() return { "label" } end, "title", true) +-- +-- context.startchapter({ title = "test" }, { more = "oeps" }, true) +-- +-- context.bTABLE(true) +-- for i=1,10 do +-- context.bTR() +-- for i=1,10 do +-- context.bTD() +-- context("%#2i",math.random(99)) +-- context.eTD() +-- end +-- context.eTR(true) +-- end +-- context.eTABLE(true) +-- +-- context.stopchapter(true) +-- +-- context.stoptext(true) diff --git a/tex/context/base/mult-cld.mkiv b/tex/context/base/mult-cld.mkiv new file mode 100644 index 000000000..050928658 --- /dev/null +++ b/tex/context/base/mult-cld.mkiv @@ -0,0 +1,20 @@ +%D \module +%D [ file=mult-ini, +%D version=2008.10.22, % 1996.06.01, +%D title=\CONTEXT\ Multilingual Macros, +%D subtitle=Initialization, +%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 just an idea, maybe a bad one. + +\writestatus{loading}{ConTeXt Multilingual Macros / Lua} + +\registerctxluafile{mult-cld}{1.001} + +\endinput diff --git a/tex/context/base/mult-de.tex b/tex/context/base/mult-de.tex index c73223658..3213fa7de 100644 --- a/tex/context/base/mult-de.tex +++ b/tex/context/base/mult-de.tex @@ -233,6 +233,7 @@ \setinterfacevariable{lastpage}{letzteseite} \setinterfacevariable{lastpagenumber}{lastpagenumber} \setinterfacevariable{lastsubpage}{letzteunterseite} +\setinterfacevariable{layer}{layer} \setinterfacevariable{left}{links} \setinterfacevariable{leftedge}{linkekante} \setinterfacevariable{lefthanging}{lefthanging} @@ -843,6 +844,7 @@ \setinterfaceconstant{sectionconversion}{sectionconversion} \setinterfaceconstant{sectionconversionset}{sectionconversionset} \setinterfaceconstant{sectionnumber}{abschnittsnummer} +\setinterfaceconstant{sectionresetset}{sectionresetset} \setinterfaceconstant{sectionsegments}{sectionsegments} \setinterfaceconstant{sectionseparatorset}{sectionseparatorset} \setinterfaceconstant{sectionset}{sectionset} diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua index dff747db1..2fea7dfe7 100644 --- a/tex/context/base/mult-def.lua +++ b/tex/context/base/mult-def.lua @@ -9766,6 +9766,9 @@ return { ["pe"]="شماره‌بخش", ["ro"]="numarsectiune", }, + ["sectionresetset"]={ + ["en"]="sectionresetset", + }, ["sectionsegments"]={ ["en"]="sectionsegments", }, @@ -13352,6 +13355,16 @@ return { ["pe"]="زیرصÙØه‌آخر", ["ro"]="ultimasubpagina", }, + ["layer"]={ + ["cs"]="layer", + ["de"]="layer", + ["en"]="layer", + ["fr"]="layer", + ["it"]="layer", + ["nl"]="layer", + ["pe"]="layer", + ["ro"]="layer", + }, ["left"]={ ["cs"]="vlevo", ["de"]="links", diff --git a/tex/context/base/mult-en.tex b/tex/context/base/mult-en.tex index d9ece5dfd..50997b1d8 100644 --- a/tex/context/base/mult-en.tex +++ b/tex/context/base/mult-en.tex @@ -233,6 +233,7 @@ \setinterfacevariable{lastpage}{lastpage} \setinterfacevariable{lastpagenumber}{lastpagenumber} \setinterfacevariable{lastsubpage}{lastsubpage} +\setinterfacevariable{layer}{layer} \setinterfacevariable{left}{left} \setinterfacevariable{leftedge}{leftedge} \setinterfacevariable{lefthanging}{lefthanging} @@ -843,6 +844,7 @@ \setinterfaceconstant{sectionconversion}{sectionconversion} \setinterfaceconstant{sectionconversionset}{sectionconversionset} \setinterfaceconstant{sectionnumber}{sectionnumber} +\setinterfaceconstant{sectionresetset}{sectionresetset} \setinterfaceconstant{sectionsegments}{sectionsegments} \setinterfaceconstant{sectionseparatorset}{sectionseparatorset} \setinterfaceconstant{sectionset}{sectionset} diff --git a/tex/context/base/mult-fr.tex b/tex/context/base/mult-fr.tex index cfc56cb5c..16f22ec7f 100644 --- a/tex/context/base/mult-fr.tex +++ b/tex/context/base/mult-fr.tex @@ -233,6 +233,7 @@ \setinterfacevariable{lastpage}{dernierepage} \setinterfacevariable{lastpagenumber}{derniernumeropage} \setinterfacevariable{lastsubpage}{dernieresouspage} +\setinterfacevariable{layer}{layer} \setinterfacevariable{left}{gauche} \setinterfacevariable{leftedge}{bordgauche} \setinterfacevariable{lefthanging}{lefthanging} @@ -843,6 +844,7 @@ \setinterfaceconstant{sectionconversion}{sectionconversion} \setinterfaceconstant{sectionconversionset}{sectionconversionset} \setinterfaceconstant{sectionnumber}{numerosection} +\setinterfaceconstant{sectionresetset}{sectionresetset} \setinterfaceconstant{sectionsegments}{sectionsegments} \setinterfaceconstant{sectionseparatorset}{sectionseparatorset} \setinterfaceconstant{sectionset}{sectionset} diff --git a/tex/context/base/mult-his.tex b/tex/context/base/mult-his.tex deleted file mode 100644 index fe87d4bcf..000000000 --- a/tex/context/base/mult-his.tex +++ /dev/null @@ -1,1155 +0,0 @@ -%D \module -%D [ file=mult-ini, -%D version=1996.06.01, -%D title=\CONTEXT\ Multilingual Macros, -%D subtitle=Initialization, -%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 module implements the multi||lingual interface to -%D \CONTEXT. These capabilities concern messages, commands and -%D parameters. Currently the following interfaces are -%D supported: -%D -%D \starttabulate[|l|l|c|c|] -%D \NC\bf language\NC\bf translator \NC\bf messages\NC \bf interface\NC\NR -%D \NC dutch \NC Hans Hagen \NC yes \NC yes \NC\NR -%D \NC english \NC Hans Hagen \& SPQR \NC yes \NC yes \NC\NR -%D \NC german \NC Tobias Burnus \NC yes \NC yes \NC\NR -%D \NC czech \NC Tom Hudec \NC yes \NC yes \NC\NR -%D \NC italian \NC Giuseppe Bilotta \NC yes \NC yes \NC\NR -%D \NC french \NC Renaud Aubin \NC yes \NC yes \NC\NR -%D \NC romanian \NC .... \NC yes \NC yes \NC\NR -%D \NC norwegian \NC Hans Fredrik Nordhaug \NC yes \NC no \NC\NR -%D \stoptabulate - -%D to be translated: -%D -%D message : floatblocks/13 -%D variables : sorttype compress autohang - -\writestatus{loading}{ConTeXt Multilingual Macros / Initialization} - -\unprotect - -%D \macros -%D [constanten,variabelen,commands] -%D {v!,c!,k!,s!,e!,m!,l!,r!,f!,p!,x!,y!} -%D -%D In the system modules we introduced some prefixed constants, -%D variables (both macros) and registers. Apart from a -%D tremendous saving in terms of memory and a gain in speed we -%D use from now on prefixes when possible for just another -%D reason: consistency and multi||linguality. Systematically -%D using prefixed macros enables us to implement a -%D multi||lingual user interface. Redefining these next set of -%D prefixes therefore can have desastrous results. -%D -%D \startlinecorrection -%D \starttable[|c|c|c|] -%D \HL -%D \NC \bf prefix \NC \bf meaning \NC \bf application \NC\SR -%D \HL -%D \NC \type{\c!prefix!} \NC c! \NC constant (direct) \NC\FR -%D \NC \type{\e!prefix!} \NC e! \NC element \NC\MR -%D \NC \type{\f!prefix!} \NC f! \NC file \NC\MR -%D \NC \type{\k!prefix!} \NC k! \NC constant (indirect) \NC\MR -%D \NC \type{\l!prefix!} \NC l! \NC language \NC\MR -%D \NC \type{\m!prefix!} \NC m! \NC message \NC\MR -%D \NC \type{\p!prefix!} \NC p! \NC procedure \NC\MR -%D \NC \type{\r!prefix!} \NC r! \NC reference \NC\MR -%D \NC \type{\s!prefix!} \NC s! \NC system \NC\MR -%D \NC \type{\v!prefix!} \NC v! \NC variable \NC\MR -%D \NC \type{\x!prefix!} \NC x! \NC setup constant \NC\MR -%D \NC \type{\y!prefix!} \NC y! \NC setup variable \NC\LR -%D \HL -%D \stoptable -%D \stoplinecorrection -%D -%D In the single||lingual version we used \type{!}, \type{!!}, -%D \type{!!!} and \type{!!!!}. - -\def\c!prefix!{c!} \def\e!prefix!{e!} \def\f!prefix!{f!} -\def\k!prefix!{k!} \def\l!prefix!{l!} \def\m!prefix!{m!} -\def\p!prefix!{p!} \def\r!prefix!{r!} \def\s!prefix!{s!} -\def\v!prefix!{v!} \def\t!prefix!{t!} - -% \def\x!prefix!{x!} % obsolete -% \def\y!prefix!{y!} % obsolete - -%D \macros -%D [constants,variables,commands] -%D {@@,??} -%D -%D Variables generated by the system can be recognized on their -%D prefix \type{@@}. They are composed of a command (class) -%D specific tag, which can be recognized on \type{??}, and a -%D system constant, which has the prefix \type{c!}. We'll se -%D some more of this. - -\def\??prefix {??} -\def\@@prefix {@@} - -%D Just to be complete we repeat some of the already defined -%D system constants here. Maybe their prefix \type{\s!} now -%D falls into place. - -\def\s!next {next} \def\s!default {default} -\def\s!dummy {dummy} \def\s!unknown {unknown} - -\def\s!do {do} \def\s!dodo {dodo} - -\def\s!complex {complex} \def\s!start {start} -\def\s!simple {simple} \def\s!stop {stop} - -%D The word \type{height} takes 6~token memory cells. The -%D control sequence \type{\height} on the other hand uses only -%D one. Knowing this, we can improve the performance of \TEX, -%D both is terms of speed and memory usage, by using control -%D sequences instead of the words written in full. -%D -%D Where in the \ASCII\ file the second lines takes nine extra -%D characters, \TEX\ saves us 13~tokens. -%D -%D \starttyping -%D \hrule width 10pt height 2pt depth 1pt -%D \hrule \!!width 10pt \!!height 2pt \!!depth 1pt -%D \stoptyping -%D -%D One condition is that we have defined \type{\!!height}, -%D \type{\!!width} and \type{\!!depth} as respectively -%D \type{height}, \type{width} and \type{depth}. Using this -%D scheme therefore only makes sense when a token sequence is -%D used more than once. Savings like this should of course be -%D implemented in english, just because \TEX\ is english. - -\def\!!width {width} -\def\!!height {height} -\def\!!depth {depth} -\def\!!plus {plus} -\def\!!minus {minus} -\def\!!fill {fill} -\def\!!to {to} - -%D \macros -%D {defineinterfaceconstant, -%D defineinterfacevariable, -%D defineinterfaceelement, -%D definesystemvariable, -%D definesystemconstant, -%D definemessageconstant, -%D definereferenceconstant, -%D definefileconstant} -%D -%D The first part of this module is dedicated to dealing with -%D multi||lingual constants and variables. When \CONTEXT\ grew -%D bigger and bigger in terms of bytes and used string space, -%D we switched to predefined constants. At the cost of more -%D hash table entries, the macros not only becase more compact, -%D they became much faster too. Maybe an even bigger advantage -%D was that mispelling could no longer lead to problems. Even a -%D multi||lingual interface became possible. -%D -%D Constants --- we'll introduce the concept of variables later -%D on --- are preceded by a type specific prefix, followed by a -%D \type{!}. To force consistency, we provide a few commands -%D for defining such constants. -%D -%D \starttyping -%D \defineinterfaceconstant {name} {meaning} -%D \defineinterfacevariable {name} {meaning} -%D \defineinterfaceelement {name} {meaning} -%D \stoptyping -%D -%D Which is the same as: -%D -%D \starttyping -%D \def\c!name{meaning} -%D \def\v!name{meaning} -%D \def\e!name{meaning} -%D \stoptyping - -\def\defineinterfaceconstant #1#2{\setvalue{\c!prefix!#1}{#2}} -\def\defineinterfacevariable #1#2{\setvalue{\v!prefix!#1}{#2}} -\def\defineinterfaceelement #1#2{\setvalue{\e!prefix!#1}{#2}} - -%D Next come some interface independant constants: -%D -%D \starttyping -%D \definereferenceconstant {name} {meaning} -%D \definefileconstant {name} {meaning} -%D \stoptyping - -\def\definereferenceconstant #1#2{\setvalue{\r!prefix!#1}{#2}} -\def\definefileconstant #1#2{\setvalue{\f!prefix!#1}{#2}} - -%D A new one: - -\def\definetypescriptconstant#1#2{\setvalue{\t!prefix!#1}{#2}} - -%D And finaly we have the one argument, space saving constants -%D -%D \starttyping -%D \definesystemconstant {name} -%D \definemessageconstant {name} -%D \stoptyping - -\def\definesystemconstant #1{\setvalue{\s!prefix!#1}{#1}} -\def\definemessageconstant #1{\setvalue{\m!prefix!#1}{#1}} - -%D In a parameter driven system, some parameters are shared -%D by more system components. In \CONTEXT\ we can distinguish -%D parameters by a unique prefix. Such a prefix is defined -%D with: -%D -%D \starttyping -%D \definesystemvariable {name} -%D \stoptyping - -\def\definesystemvariable#1{\setevalue{\??prefix#1}{\@@prefix#1}} - -\definesystemvariable{ms} - -%D \macros -%D {selectinterface, -%D defaultinterface, currentinterface, currentresponses} -%D -%D With \type{\selectinterface} we specify the language we are -%D going to use. The system asks for the language wanted, and -%D defaults to \type{\currentinterface} when we just give -%D \type{enter}. By default the message system uses the -%D current interface language, but \type{\currentresponses} -%D can specify another language too. -%D -%D Because we want to generate formats directly too, we do -%D not ask for interface specifications when these are already -%D defined (like in cont-nl.tex and alike). - -\ifx\undefined\scratchwrite \newwrite\scratchwrite \fi -\ifx\undefined\scratchread \newwrite\scratchread \fi - -\immediate\openin\scratchread=mult-def.tex % may overload the defaults - -\ifeof\scratchread % no high level commands yet - \immediate\closein\scratchread -\else - \immediate\closein\scratchread \input mult-def.tex -\fi - -\ifx\defaultinterface\undefined - - \def\defaultinterface{english} - - \def\selectinterface - {\def\docommand##1##2% - {\bgroup - \endlinechar\minusone - \global\read16 to ##1 - \egroup - \doifnothing\currentinterface{\let##1=##2}% - \doifundefined{\s!prefix!##1}{\let##1=##2}}% - \docommand\currentinterface\defaultinterface - \writestatus{interface}{defining \currentinterface\space interface}% - \writeline - \docommand\currentresponses\currentinterface - \writestatus{interface}{using \currentresponses\space messages}% - \writeline - \let\selectinterface\relax} - -\else - - \def\selectinterface - {\writestatus{interface}{defining \currentinterface\space interface}% - \writeline - \writestatus{interface}{using \currentresponses\space messages}% - \writeline - \let\selectinterface\relax} - -\fi - -\ifx\currentinterface\undefined \let\currentinterface=\defaultinterface \fi -\ifx\currentresponses\undefined \let\currentresponses=\defaultinterface \fi - -%D \macros -%D {startinterface} -%D -%D Sometimes we want to define things only for specific -%D interface languages. This can be done by means of the -%D selector: -%D -%D \starttyping -%D \startinterface language -%D -%D language specific definitions & commands -%D -%D \stopinterface -%D \stoptyping - -\def\startinterface #1 - {\doifnotinset\currentinterface{#1}{\gobbleuntil\stopinterface}} - -\let\stopinterface\relax - -%D \macros -%D {startmessages, -%D getmessage, -%D showmessage, -%D makemessage} -%D -%D A package as large as \CONTEXT\ can hardly function without -%D a decent message mechanism. Due to its multi||lingual -%D interface, the message subsystem has to be multi||lingual -%D too. A major drawback of this feature is that we have to -%D code messages. As a result, the source becomes less self -%D documented. On the other hand, consistency will improve. -%D -%D Because the overhead in terms of entries in the (already -%D exhausted) hash table has to be minimal, messages are packed -%D in libraries. We can extract a message from such a library -%D in three ways: -%D -%D \starttyping -%D \getmessage {library} {tag} -%D \showmessage {library} {tag} {data} -%D \makemessage {library} {tag} {data} -%D \stoptyping -%D -%D The first command gets the message \type{tag} from the -%D \type{library} specified. The other commands take an extra -%D argument: a list of items to be inserted in the message -%D text. While \type{\showmessage} shows the message at the -%D terminal, the other commands generate the message as text. -%D Before we explain the \type{data} argument, we give an -%D example of a library. -%D -%D \starttyping -%D % messages moved -%D \stoptyping -%D -%D The first message is a simple one and can be shown with: -%D -%D \starttyping -%D \showmessage {alfa} {1} {} -%D \stoptyping -%D -%D The second message on the other hand needs some extra data: -%D -%D \starttyping -%D \showmessage {alfa} {2} {and last,to you} -%D \stoptyping -%D -%D This message is shown as: -%D -%D \starttyping -%D something : second (and last) message to you -%D \stoptyping -%D -%D As we can see, the title entry is shown with the message. -%D The data fields are comma separated and are specified in the -%D message text by \type{--}. -%D -%D It is not required to define all messages in a library at -%D once. We can add messages to a library in the following way: -%D -%D \starttyping -%D % messages moved -%D \stoptyping -%D -%D Because such definitions can take place in different -%D modules, the system gives a warning when a tag occurs more -%D than once. The first occurrence takes preference over later -%D ones, so we had better use a save offset, as shown in the -%D example. As we can see, the title field is specified only -%D the first time! -%D -%D Because we want to check for duplicate tags, the macros -%D are a bit more complicated than neccessary. The \NEWLINE\ -%D token is used as message separator. -%D -%D For internal purposes one can use \type {\setmessagetext}, -%D which puts the message text asked for in \type -%D {\currentmessagetext}. - -\loadmarkfile{mult-ini} - -%D \macros -%D {ifshowwarnings, ifshowmessages} -%D -%D Sometimes displaying message can slow down processing -%D considerably. We therefore introduce warnings. Users can -%D turn of warnings and messages by saying: -%D -%D \starttyping -%D \showwarningstrue -%D \showmessagestrue -%D \stoptyping -%D -%D Turning off messages also turns off warnings, which is -%D quote logical because they are less important. - -% not yet mkiv - -\newif\ifshowwarnings \showwarningstrue -\newif\ifshowmessages \showmessagestrue - -\let\normalshowmessage\showmessage - -\def\showwarning - {\ifshowwarnings - \expandafter\showmessage - \else - \expandafter\gobblethreearguments - \fi} - -\def\showmessage - {\ifshowmessages - \expandafter\normalshowmessage - \else - \expandafter\gobblethreearguments - \fi} - -%D \macros -%D {dosetvalue,dosetevalue,dosetgvalue,dosetxvalue,docopyvalue,doresetvalue} % dogetvalue -%D -%D We already defined these auxiliary macros in the system -%D modules. Starting with this module however, we have to take -%D multi||linguality a bit more serious. -%D -%D First we show a well||defined (simplified) alternative: -%D -%D \starttyping -%D \def\dosetvalue#1#2#3% -%D {\doifdefinedelse{\c!prefix!#2} -%D {\setvalue{#1\getvalue{\c!prefix!#2}}{#3}} -%D {\setvalue{#1#2}{#3}}} -%D -%D \def\docopyvalue#1#2#3% -%D {\doifdefinedelse{\c!prefix!#3} -%D {\setvalue{#1\getvalue{\c!prefix!#3}}% -%D {\getvalue{#2\getvalue{\c!prefix!#3}}}} -%D {\setvalue{#1#3}% -%D {\getvalue{#2#3}}}} -%D \stoptyping -%D -%D These macros are called upon quite often and so we optimized -%D them a bit. -%D -%D \starttyping -%D \def\dosetvalue#1#2#3% -%D {\let\c!internal!\c!internal!n -%D \p!doifundefined{\k!prefix!#2}% -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest -%D \@EA\def\csname#1#2\endcsname{#3}% -%D \else -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest -%D \@EA\def\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}% -%D \fi} -%D -%D \def\dosetevalue#1#2#3% -%D {\let\c!internal!\c!internal!n -%D \p!doifundefined{\k!prefix!#2}% -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest -%D \@EA\edef\csname#1#2\endcsname{#3}% -%D \else -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest -%D \@EA\edef\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}% -%D \fi} -%D -%D \def\dosetgvalue#1#2#3% -%D {\let\c!internal!\c!internal!n -%D \p!doifundefined{\k!prefix!#2}% -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest -%D \@EA\gdef\csname#1#2\endcsname{#3}% -%D \else -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest -%D \@EA\gdef\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}% -%D \fi} -%D -%D \def\docopyvalue#1#2#3% -%D {\let\c!internal!\c!internal!n -%D \p!doifundefined{\k!prefix!#3}% -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest % still needed ? -%D \@EA\def\csname#1#3\endcsname% -%D {\csname#2#3\endcsname}% -%D \else -%D \let\c!internal!\c!internal!y -%D \let\donottest\doprocesstest % still needed ? -%D \@EA\def\csname#1\csname\k!prefix!#3\endcsname\endcsname% -%D {\csname#2\csname\k!prefix!#3\endcsname\endcsname}% -%D \fi} -%D \stoptyping - -\def\doresetvalue#1#2% - {\dosetvalue{#1}{#2}{}} - -\def\doignorevalue#1#2#3% - {\dosetvalue{#1}{#2}{}} - -% \def\dogetvalue#1#2% -% {\csname#1\csname\k!prefix!#2\endcsname\endcsname} - -%D Although maybe not clearly visible, there is a -%D considerable profit in further optimization. By expanding -%D the embedded \type {\csname} we can reduce the format file -%D by about 5\% (60~KB out of 1.9~MB). -%D -%D \starttyping -%D \def\docopyvalue#1#2#3% c -> k -%D {\p!doifundefined{\k!prefix!#3}% -%D \let\donottest\doprocesstest -%D \@EAEAEA\def\@EA -%D \csname\@EA#1\@EA#3\@EA -%D \endcsname\@EA{\csname#2#3\endcsname}% -%D \else -%D \let\donottest\doprocesstest -%D \@EAEAEA\def\@EA -%D \csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA -%D \endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}% -%D \fi} -%D \stoptyping -%D -%D The next alternatives are slightly faster. - -\def\dosetvalue#1#2% - {\let\c!internal!\c!internal!n - \ifcsname\k!prefix!#2\endcsname - \let\c!internal!\c!internal!y - \@EA\def\csname#1\csname\k!prefix!#2\endcsname%\endcsname - \else - \let\c!internal!\c!internal!y - \@EA\def\csname#1#2%\endcsname - \fi\endcsname} - -\def\dosetevalue#1#2% - {\let\c!internal!\c!internal!n - \ifcsname\k!prefix!#2\endcsname - \let\c!internal!\c!internal!y - \@EA\edef\csname#1\csname\k!prefix!#2\endcsname%\endcsname - \else - \let\c!internal!\c!internal!y - \@EA\edef\csname#1#2%\endcsname - \fi\endcsname} - -\def\dosetgvalue#1#2% - {\let\c!internal!\c!internal!n - \ifcsname\k!prefix!#2\endcsname - \let\c!internal!\c!internal!y - \@EA\gdef\csname#1\csname\k!prefix!#2\endcsname%\endcsname - \else - \let\c!internal!\c!internal!y - \@EA\gdef\csname#1#2%\endcsname - \fi\endcsname} - -\def\dosetxvalue#1#2% - {\let\c!internal!\c!internal!n - \ifcsname\k!prefix!#2\endcsname - \let\c!internal!\c!internal!y - \@EA\xdef\csname#1\csname\k!prefix!#2\endcsname%\endcsname - \else - \let\c!internal!\c!internal!y - \@EA\xdef\csname#1#2%\endcsname - \fi\endcsname} - -\def\docopyvalue#1#2#3% real tricky expansion, quite unreadable - {\let\c!internal!\c!internal!n - \ifcsname\k!prefix!#3\endcsname - \let\c!internal!\c!internal!y - \@EA\def\csname#1\csname\k!prefix!#3\endcsname - \@EA\endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}% - \else - \let\c!internal!\c!internal!y - \@EA\def\csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}% - \fi} - -%D We can now redefine some messages that will be -%D introduced in the multi||lingual system module. - -\def\showassignerror #1#2{\showmessage\m!check1{#1,#2}\waitonfatalerror} -\def\showargumenterror#1#2{\showmessage\m!check2{#1,#2}\waitonfatalerror} -\def\showdefinederror #1#2{\showmessage\m!check3{#1,#2}\waitonfatalerror} - -%D \CONTEXT\ is a parameter driven package. This means that -%D users instruct the system by means of variables, values and -%D keywords. These instructions take the form: -%D -%D \starttyping -%D \setupsomething[some variable=some value, another one=a keyword] -%D \stoptyping -%D -%D or by keyword only: -%D -%D \starttyping -%D \dosomething[this way,that way,no way] -%D \stoptyping -%D -%D Because the same variables can occur in more than one setup -%D command, we have to be able to distinguish them. This is -%D achieved by assigning them a unique prefix. -%D -%D Imagine a setup command for boxed text, that enables us to -%D specify the height and width of the box. Behide the scenes -%D the command -%D -%D \starttyping -%D \setupbox [width=12cm, height=3cm] -%D \stoptyping -%D -%D results in something like -%D -%D \starttyping -%D \<box><width> {12cm} -%D \<box><height> {3cm} -%D \stoptyping -%D -%D while a similar command for specifying the page dimensions -%D of an \cap{A4} page results in: -%D -%D \starttyping -%D \<page><width> {21.0cm} -%D \<page><height> {27.9cm} -%D \stoptyping -%D -%D The prefixes \type{<box>} and \type{<page>} are hidden from -%D users and can therefore be language independant. Variables -%D on the other hand, differ for each language: -%D -%D \starttyping -%D \<box><color> {<blue>} -%D \<box><kleur> {<blauw>} -%D \<box><couleur> {<blue>} -%D \stoptyping -%D -%D In this example we can see that the assigned values or -%D keywords are language dependant too. This will be a -%D complication when defining multi||lingual setup files. -%D -%D A third phenomena is that variables and values can have a -%D similar meaning. -%D -%D \starttyping -%D \<pagenumber><location> {<left>} -%D \<skip><left> {12cm} -%D \stoptyping -%D -%D A (minor) complication is that where in english we use -%D \type{<left>}, in dutch we find both \type{<links>} and -%D \type{<linker>}. This means that when we use some sort of -%D translation table, we have to distinguish between the -%D variables at the left side and the fixed values at the -%D right. -%D -%D The same goes for commands that are composed of different -%D user supplied and/or language specific elements. In english -%D we can use: -%D -%D \starttyping -%D \<empty><figure> -%D \<empty><intermezzo> -%D \stoptyping -%D -%D But in dutch we have the following: -%D -%D \starttyping -%D \<lege><figuur> -%D \<leeg><intermezzo> -%D \stoptyping -%D -%D These subtle differences automatically lead to a solution -%D where variables, values, elements and other components have -%D a similar logical name (used in macro's) but a different -%D meaning (supplied by the user). -%D -%D Our solution is one in which the whole system is programmed -%D in terms of identifiers with language specific meanings. In -%D such an implementation, each fixed variable is available as: -%D -%D \starttyping -%D \<prefix><variable> -%D \stoptyping -%D -%D This means that for instance: -%D -%D \starttyping -%D \setupbox[width=12cm] -%D \stoptyping -%D -%D expands to something like: -%D -%D \starttyping -%D \def\boxwidth{12cm} -%D \stoptyping -%D -%D because we don't want to recode the source, a setup command -%D in another language has to expand to this variable, so: -%D -%D \starttyping -%D \setupblock[width=12cm] -%D \stoptyping -%D -%D has to result in the definition of \type{\boxwidth} too. -%D This method enables us to build compact, fast and readable -%D code. -%D -%D An alternative method, which we considered using, uses a -%D more indirect way. In this case, both calls generate a -%D different variable: -%D -%D \starttyping -%D \def\boxwidth {12cm} -%D \def\boxbreedte {12cm} -%D \stoptyping -%D -%D And because we don't want to recode those megabytes of -%D already developed code, this variable has to be called with -%D something like: -%D -%D \starttyping -%D \valueof\box\width -%D \stoptyping -%D -%D where \type{\valueof} takes care of the translation of -%D \type{width} or \type{breedte} to \type{width} and -%D combining this with \type{box} to \type{\boxwidth}. -%D -%D One advantage of this other scheme is that, within certain -%D limits, we can implement an interface that can be switched -%D to another language at will, while the current approach -%D fixes the interface at startup. There are, by the way, -%D other reasons too for not choosing this scheme. Switching -%D user generated commands is for instance impossible and a -%D dual interface would therefore give a strange mix of -%D languages. -%D -%D Now let's work out the first scheme. Although the left hand -%D of the assignment is a variable from the users point of -%D view, it is a constant in terms of the system. Both -%D \type{width} and \type{breedte} expand to \type{width} -%D because in the source we only encounter \type{width}. Such -%D system constants are presented as -%D -%D \starttyping -%D \c!width -%D \stoptyping -%D -%D This constant is always equivalent to \type{width}. As we -%D can see, we use \type{c!} to mark this one as constant. Its -%D dutch counterpart is: -%D -%D \starttyping -%D breedte -%D \stoptyping -%D -%D When we interpret a setup command each variable is -%D translated to it's \type{c!} counterpart. This means that -%D \type{breedte} and \type{width} expand to \type{breedte} -%D and \type{\c!width} which both expand to \type{width}. That -%D way user variables become system constants. -%D -%D The interpretation is done by means of a general setup -%D command \type{\getparameters} that we introduced in the -%D system module. Let us define some simple setup command: -%D -%D \starttyping -%D \def\setupbox[#1]% -%D {\getparameters[\??bx][#1]} -%D \stoptyping -%D -%D This command can be used as: -%D -%D \starttyping -%D \setupbox [width=3cm, height=1cm] -%D \stoptyping -%D -%D Afterwards we have two variables \type{\@@bxwidth} and -%D \type{\@@bxheight} which have the values \type{3cm} and -%D \type{1cm} assigned. These variables are a combinatiom of -%D the setup prefix \type{\??bx}, which expands to \type{@@bx} -%D and the translated user supplied variables \type{width} and -%D \type{height} or \type{breedte} and \type{hoogte}, -%D depending on the actual language. In dutch we just say: -%D -%D \starttyping -%D \setupblock [width=3cm, height=1cm] -%D \stoptyping -%D -%D and get ourselves \type{\@@bxwidth} and \type{\@@bxheight} -%D too. In the source of \CONTEXT, we can recognize constants -%D and variables on their leading \type{c!}, \type{v!} etc., -%D prefixes on \type{??} and composed variables on \type{@@}. -%D -%D We already saw that user supplied keywords need some -%D special treatment too. This time we don't translate the -%D keyword, but instead use in the source a variable which -%D meaning depends on the interface language. -%D -%D \starttyping -%D \v!left -%D \stoptyping -%D -%D Which can be used in macro's like: -%D -%D \starttyping -%D \processaction -%D [\@@bxlocation] -%D [ \v!left=>\dosomethingontheleft, -%D \v!middle=>\dosomthinginthemiddle, -%D \v!right=>\dosomethingontheright] -%D \stoptyping -%D -%D Because variables like \type{\@@bxlocation} can have a lot -%D of meanings, including tricky expandable tokens, we cannot -%D translate this meaning when we compare. This means that -%D \type{\@@bxlocation} can be \type{left} of \type{links} of -%D whatever meaning suits the language. But because -%D \type{\v!left} also has a meaning that suits the language, -%D we are able to compare. -%D -%D Although we know it sounds confusing we want to state two -%D important characteristics of the interface as described: -%D -%D \startnarrower \em -%D user variables become system constants -%D \stopnarrower -%D -%D and -%D -%D \startnarrower \em -%D user constants (keywords) become system variables -%D \stopnarrower -%D - -%D \macros -%D {startconstants,startvariables} -%D -%D It's time to introduce the macro's that are responsible for -%D this translations process, but first we show how constants -%D and variables are defined. We only show two languages and -%D a few words. -%D -%D \starttyping -%D \startconstants english dutch -%D -%D width: width breedte -%D height: height hoogte -%D -%D \stopconstants -%D \stoptyping -%D -%D Keep in mind that what users see as variables, are constants -%D for the system. -%D -%D \starttyping -%D \startvariables english dutch -%D -%D location: left links -%D text: text tekst -%D -%D \stopvariables -%D \stoptyping -%D -%D The macro's responsible for interpreting these setups are -%D shared. They take care of empty lines and permit a more or -%D less free format. All setups accept the keyword \type{all} -%D which equals every language. - -%D The next few macros come into action when we generate -%D interface log files: - -\newif\iflogginginterface - -\def\flushinterfaceelementline - {\iflogginginterface - \immediate\write\scratchwrite{\interfaceelementline}% - \let\interfaceelementline\empty - \fi} - -\def\saveinterfaceelementline#1% - {\iflogginginterface - \edef\interfaceelementline{\interfaceelementline#1\space}% - \fi} - -\def\startlogginginterface #1 % - {\logginginterfacetrue - \let\interfaceelementline\empty - \immediate\openout\scratchwrite=./#1\relax} - -\def\stoplogginginterface - {\flushinterfaceelementline - \immediate\closeout\scratchwrite - \logginginterfacefalse} - -%D By default we don't log at all. - -\def\startlogginginterface #1 {} -\def\stoplogginginterface {} - -%D These logging commands are used in the next macros. - -\def\nointerfaceobject{-} - -\def\startinterfaceobjects#1#2% - {\!!counta\plusone - \let\dogetinterfaceobject\dogetinterfacetemplate - \let\dowithinterfaceelement#1% - \def\dodogetinterfaceobjects - {\ifx\next#2% - \flushinterfaceelementline - \flushinterfaceelementline - \def\next####1{#2}% was: \let\next\gobbleoneargument - \else\ifx\next\par - \long\def\next####1{\dogetinterfaceobjects}% - \else\ifx\next\empty - \def\next####1{\dogetinterfaceobjects}% - \else - \def\next####1 {\dogetinterfaceobject[####1:\relax]\dogetinterfaceobjects}% - \fi\fi\fi - \next}% - \def\dogetinterfaceobjects{\futurelet\next\dodogetinterfaceobjects}% - \dogetinterfaceobjects} - -\def\dogetinterfacetemplate[#1:#2]% - {\saveinterfaceelementline{#1}% - \doifinsetelse{#1}{\currentinterface,all} - {\let\dogetinterfaceobject\doskipinterfaceobject} - {\advance\!!counta\plusone}} - -\def\doskipinterfaceobject[#1:#2#3]% - {\if#2:% - \let\dogetinterfaceobject\dogetinterfaceelement - \dogetinterfaceobject[#1:#2#3]% - \else - \saveinterfaceelementline{#1}% - \fi} - -\let\interfaceelementline\empty - -\def\dogetinterfaceelement[#1:#2#3]% - {\ifx#2:% - \!!countb\zerocount - \def\!!stringa{#1}% - \flushinterfaceelementline - \else - \advance\!!countb\plusone - \saveinterfaceelementline{#1}% - \ifnum\!!countb=\!!counta - \@EA\dowithinterfaceelement\@EA{\!!stringa}{#1}% - \let\dogetinterfaceobject\doskipinterfaceobject - \fi - \fi} - -%D The constants and variables are defined as described. When -%D \type {\interfacetranslation} is \type{true}, we also -%D generate a reverse translation. Because we don't want to put -%D too big a burden on \TEX's hash table, this is no default -%D behavior. Reverse translation is used in the commands that -%D generate the quick reference cards. We are going to define -%D the real \CONTEXT\ commands in an abstract way and generate -%D those reference cards for each language without further -%D interference. (Part of this (the translation stuff) is gone -%D now that we've moved to \XML\ completely and have separate -%D key mapping files. - -%D Anno 2003 I've forgotten why the \type {\c!internal} is -%D still in there; it's probably a left over from an experiment. - -%D Once we're gone XML we can drop some of the extra mappings. - -\let\c!internal!y \string -\def\c!internal!n {-} -\let\c!internal! \c!internal!y - -% temporary mkiv hack - -\ifx\dowithinterfaceconstant\undefined \let\dowithinterfaceconstant\gobbletwoarguments \fi -\ifx\dowithinterfacevariable\undefined \let\dowithinterfacevariable\gobbletwoarguments \fi - -\def\setinterfaceconstant#1#2% - {\dowithinterfaceconstant{#1}{#2}% - \setvalue{\c!prefix!#1}{\c!internal!#1}% - \doifelse{#2}\nointerfaceobject % ? - {\debuggerinfo{constant}{#1 defined as #1 by default}}% - {\debuggerinfo{constant}{#1 defined as #2}% - \checksetvalue{\k!prefix!#2}{#1}% - \setvalue{\k!prefix!#2}{#1}}} - -\def\setinterfacevariable#1#2% - {\dowithinterfacevariable{#1}{#2}% - \doifelse{#2}\nointerfaceobject - {\debuggerinfo{variable}{#1 defined as #1 by default}% - \checksetvalue{\v!prefix!#1}{#1}% - \setvalue{\v!prefix!#1}{#1}} - {\debuggerinfo{variable}{#1 defined as #2}% - \checksetvalue{\v!prefix!#1}{#2}% - \setvalue{\v!prefix!#1}{#2}}} - -\def\checksetvalue#1#2% - {\doifdefined{#1}{\doifvaluesomething{#1}{\doifnotvalue{#1}{#2} - {\writestatus{problems}{set #1 to #2 overloads \getvalue{#1}}}}}} - -\def\startvariables{\startinterfaceobjects\setinterfacevariable\stopvariables} -\def\startconstants{\startinterfaceobjects\setinterfaceconstant\stopconstants} - -\let\stopvariables\relax -\let\stopconstants\relax - -%D \macros -%D {defineinterfaceconstant} -%D -%D Next we redefine a previously defined macro to take care of -%D interface translation too. It's a bit redundant, because -%D in these situations we could use the c||version, but for -%D documentation purposes the x||alternative comes in handy. - -\def\defineinterfaceconstant#1#2% - {\setvalue{\c!prefix!#1}{#2}} - -%D \macros -%D {startelements} -%D -%D Due to the object oriented nature of \CONTEXT, we also need -%D to define the elements that are used to build commands: -%D -%D \starttyping -%D \startelements english dutch -%D -%D beginvan: begin beginvan -%D eindvan: end eindvan -%D start: start start -%D stop: stop stop -%D -%D \stopelements -%D \stoptyping -%D -%D Such elements sometimes are the same in diferent -%D languages, but mostly they differ. Things can get even -%D confusing when we look at for instance the setup commands. -%D In english we say \type{\setup<something>}, but in dutch we -%D have: \type{\stel<iets>in}. Such split elements are no -%D problem, because we just define two elements. When no second -%D part is needed, we use a \type{-}: -%D -%D \starttyping -%D \startelements english dutch -%D -%D setupa: setup stel -%D setupb: - in -%D -%D \stopelements -%D \stoptyping -%D -%D Element translation is realized by means of: - -\def\setinterfaceelement#1#2% - {\doifelse{#2}\nointerfaceobject - {\debuggerinfo{element}{#1 defined as <empty>}% - \resetvalue{\e!prefix!#1}} - {\doifdefinedelse{\e!prefix!#1} - {\doifnotvalue{\e!prefix!#1}{#2} - {\debuggerinfo{element}{#1 redefined as #2}% - \setvalue{\e!prefix!#1}{#2}}} - {\debuggerinfo{element}{#1 defined as #2}% - \setvalue{\e!prefix!#1}{#2}}}} - -\def\startelements{\startinterfaceobjects\setinterfaceelement\stopelements} - -\let\stopelements\relax - -%D \macros -%D {startcommands} -%D -%D The last setup has to do with the commands themselve. -%D Commands are defined as: -%D -%D \starttyping -%D \startcommands english dutch -%D -%D starttekst: starttext starttekst -%D stoptekst: stoptext stoptekst -%D omlijnd: framed omlijnd -%D margewoord: marginword margewoord -%D -%D \stopcommands -%D \stoptyping - -\def\setinterfacecommand#1#2% - {\doifelse{#2}\nointerfaceobject - {\debuggerinfo{command}{no link to #1}} - {\doifelse{#1}{#2} - {\debuggerinfo{command}{#1 remains #1}} - {\doifdefinedelse{#2} - {\debuggerinfo{command}{core command #2 redefined as #1}}% - {\debuggerinfo{command}{#2 defined as #1}}% - \@EA\def\csname#2\@EA\endcsname\@EA{\csname#1\endcsname}}}} - -\def\startcommands{\startinterfaceobjects\setinterfacecommand\stopcommands} - -\let\stopcommands\relax - -%D \macros -%D {interfaced} -%D -%D The setup commands translate the constants automatically. -%D When we want to translate 'by hand' we can use the simple -%D but effective command: -%D -%D \starttyping -%D \interfaced {something} -%D \stoptyping -%D -%D Giving \type{\interfaced{breedte}} results in \type{width} -%D or, when not defined, in \type{breedte} itself. This -%D macro is used in the font switching mechanism. - -\def\interfaced#1% - {\ifcsname\k!prefix!#1\endcsname - \csname\k!prefix!#1\endcsname - \else - #1% - \fi} - -%D So much for the basic multi||lingual interface commands. The -%D macro's can be enhanced with more testing facilities, but -%D for the moment they suffice. - -%D Out of convenience we define the banners here. - -\def\contextbanner - {ConTeXt \space - ver: \contextversion \space \contextmark \space \space - fmt: \formatversion \space \space - int: \currentinterface/\currentresponses} - -\def\showcontextbanner - {\writeline\writebanner{\contextbanner}\writeline} - -\edef\formatversion - {\the\normalyear.\the\normalmonth.\the\normalday} - -\ifx\contextversion\undefined - \def\contextversion {unknown} - \def\contextversionnumber{0} -\else - \def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi#2\ifnum#3<10 0\fi#3 #4:#5} - \edef\contextversionnumber{\expandafter\contextversionnumber\contextversion\relax\space\contextmark} -\fi - -\ifx\undefined\everydump - \newtoks\everydump - \def\dump{\the\everydump\normaldump} -\fi - -\appendtoks \showcontextbanner \to \everydump - -\protect \endinput diff --git a/tex/context/base/mult-ini.lua b/tex/context/base/mult-ini.lua index 1eee9a656..06707adf8 100644 --- a/tex/context/base/mult-ini.lua +++ b/tex/context/base/mult-ini.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['mult-ini'] = { license = "see context related readme files" } -local format, gmatch = string.format, string.gmatch +local format, gmatch, gsub = string.format, string.gmatch, string.gsub interfaces = interfaces or { } interfaces.messages = interfaces.messages or { } @@ -17,32 +17,34 @@ storage.register("interfaces/messages", interfaces.messages, "interfaces.messa storage.register("interfaces/constants", interfaces.constants, "interfaces.constants") storage.register("interfaces/variables", interfaces.variables, "interfaces.variables") +local messages, constants, variables = interfaces.messages, interfaces.constants, interfaces.variables + function interfaces.setmessages(category,str) - local m = interfaces.messages[category] or { } + local m = messages[category] or { } for k, v in gmatch(str,"(%S+) *: *(.-) *[\n\r]") do - m[k] = v:gsub("%-%-","%%s") + m[k] = gsub(v,"%-%-","%%s") end - interfaces.messages[category] = m + messages[category] = m end function interfaces.setmessage(category,tag,message) - local m = interfaces.messages[category] + local m = messages[category] if not m then m = { } - interfaces.messages[category] = m + messages[category] = m end m[tag] = message:gsub("%-%-","%%s") end function interfaces.getmessage(category,tag) - local m = interfaces.messages[category] + local m = messages[category] return (m and m[tag]) or "unknown message" end local messagesplitter = lpeg.splitat(",") function interfaces.makemessage(category,tag,arguments) - local m = interfaces.messages[category] + local m = messages[category] m = (m and m[tag] ) or format("unknown message, category '%s', tag '%s'",category,tag) if not m then return m .. " " .. tag @@ -54,14 +56,15 @@ function interfaces.makemessage(category,tag,arguments) end function interfaces.showmessage(category,tag,arguments) - local m = interfaces.messages[category] + local m = messages[category] commands.writestatus((m and m.title) or "unknown title",interfaces.makemessage(category,tag,arguments)) end function interfaces.setvariable(variable,given) - interfaces.variables[given] = variable +--~ variables[given] = variable + variables[variable] = given end function interfaces.setconstant(constant,given) - interfaces.constants[given] = constant + constants[given] = constant end diff --git a/tex/context/base/mult-ini.mkiv b/tex/context/base/mult-ini.mkiv index 2d1e2cc0e..5033a5233 100644 --- a/tex/context/base/mult-ini.mkiv +++ b/tex/context/base/mult-ini.mkiv @@ -86,6 +86,9 @@ \def\s!complex {complex} \def\s!start {start} \def\s!simple {simple} \def\s!stop {stop} +\def\s!true {true} +\def\s!false {false} + %D The word \type{height} takes 6~token memory cells. The %D control sequence \type{\height} on the other hand uses only %D one. Knowing this, we can improve the performance of \TEX, diff --git a/tex/context/base/mult-it.tex b/tex/context/base/mult-it.tex index f5d009b32..530a49152 100644 --- a/tex/context/base/mult-it.tex +++ b/tex/context/base/mult-it.tex @@ -233,6 +233,7 @@ \setinterfacevariable{lastpage}{ultimapagina} \setinterfacevariable{lastpagenumber}{lastpagenumber} \setinterfacevariable{lastsubpage}{ultimasottopagina} +\setinterfacevariable{layer}{layer} \setinterfacevariable{left}{sinistra} \setinterfacevariable{leftedge}{bordosinistro} \setinterfacevariable{lefthanging}{lefthanging} @@ -843,6 +844,7 @@ \setinterfaceconstant{sectionconversion}{sectionconversion} \setinterfaceconstant{sectionconversionset}{sectionconversionset} \setinterfaceconstant{sectionnumber}{numerosezione} +\setinterfaceconstant{sectionresetset}{sectionresetset} \setinterfaceconstant{sectionsegments}{sectionsegments} \setinterfaceconstant{sectionseparatorset}{sectionseparatorset} \setinterfaceconstant{sectionset}{sectionset} diff --git a/tex/context/base/mult-nl.tex b/tex/context/base/mult-nl.tex index d84512ae7..492220961 100644 --- a/tex/context/base/mult-nl.tex +++ b/tex/context/base/mult-nl.tex @@ -233,6 +233,7 @@ \setinterfacevariable{lastpage}{laatstepagina} \setinterfacevariable{lastpagenumber}{laatstepaginanummer} \setinterfacevariable{lastsubpage}{laatstesubpagina} +\setinterfacevariable{layer}{layer} \setinterfacevariable{left}{links} \setinterfacevariable{leftedge}{linkerrand} \setinterfacevariable{lefthanging}{linkshangend} @@ -843,6 +844,7 @@ \setinterfaceconstant{sectionconversion}{sectionconversion} \setinterfaceconstant{sectionconversionset}{sectionconversionset} \setinterfaceconstant{sectionnumber}{sectienummer} +\setinterfaceconstant{sectionresetset}{sectionresetset} \setinterfaceconstant{sectionsegments}{sectionsegments} \setinterfaceconstant{sectionseparatorset}{sectionseparatorset} \setinterfaceconstant{sectionset}{sectionset} diff --git a/tex/context/base/mult-ro.tex b/tex/context/base/mult-ro.tex index bcb4d5256..ece67fead 100644 --- a/tex/context/base/mult-ro.tex +++ b/tex/context/base/mult-ro.tex @@ -233,6 +233,7 @@ \setinterfacevariable{lastpage}{ultimapagina} \setinterfacevariable{lastpagenumber}{lastpagenumber} \setinterfacevariable{lastsubpage}{ultimasubpagina} +\setinterfacevariable{layer}{layer} \setinterfacevariable{left}{stanga} \setinterfacevariable{leftedge}{bordurastanga} \setinterfacevariable{lefthanging}{lefthanging} @@ -843,6 +844,7 @@ \setinterfaceconstant{sectionconversion}{sectionconversion} \setinterfaceconstant{sectionconversionset}{sectionconversionset} \setinterfaceconstant{sectionnumber}{numarsectiune} +\setinterfaceconstant{sectionresetset}{sectionresetset} \setinterfaceconstant{sectionsegments}{sectionsegments} \setinterfaceconstant{sectionseparatorset}{sectionseparatorset} \setinterfaceconstant{sectionset}{sectionset} diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex index b24c11d58..e5f9f1c1a 100644 --- a/tex/context/base/mult-sys.tex +++ b/tex/context/base/mult-sys.tex @@ -99,6 +99,7 @@ \definemessageconstant {encodings} \definemessageconstant {regimes} \definemessageconstant {figures} +\definemessageconstant {fields} \definemessageconstant {files} \definemessageconstant {floatblocks} \definemessageconstant {fonts} @@ -383,11 +384,13 @@ % vervallen : hd hr hm vt vr vm tr tn te br bm bo on om or \definesystemvariable {ab} % AlignedBoxes +\definesystemvariable {ac} % ACcent \definesystemvariable {ag} % AchterGrond \definesystemvariable {al} % ALinea's \definesystemvariable {am} % interActieMenu \definesystemvariable {an} % ANchor \definesystemvariable {as} % AlignmentSwitch +\definesystemvariable {at} % ATtachments \definesystemvariable {ba} % synchronisatieBAlk \definesystemvariable {be} % startstop (BeginEnd) \definesystemvariable {bj} % BlokJe @@ -501,7 +504,9 @@ \definesystemvariable {mb} % MargeBlokken \definesystemvariable {md} % MoDule \definesystemvariable {mg} % Metapost paGe +\definesystemvariable {mh} % MultilingualHead \definesystemvariable {mk} % MarKering +\definesystemvariable {ml} % MultilingualLabel \definesystemvariable {mt} % inline MaTh \definesystemvariable {mo} % Math Options \definesystemvariable {mp} % MetaPost @@ -686,7 +691,7 @@ \definefileconstant {filfilename} {cont-fil} \definefileconstant {modfilename} {cont-mod} -%D Handy for typescripts: +%D Handy for typescripts (we could use s! instead: \definetypescriptconstant {name} {name} \definetypescriptconstant {default} {default} @@ -797,31 +802,6 @@ \selectinterface -%D And only after this selection is done, we can define -%D messages, otherwise the default language is in use. - -% \ifinterfacetranslation \else % interfacetranslation is obsolete - -% messages moved - -% messages moved - -% 1: to be adapted - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% \fi - %D Ok, here are some more, because we've got ouselves some %D extensions to \CONTEXT. diff --git a/tex/context/base/node-dum.lua b/tex/context/base/node-dum.lua index 274e0cdd6..b210d0adb 100644 --- a/tex/context/base/node-dum.lua +++ b/tex/context/base/node-dum.lua @@ -9,16 +9,16 @@ if not modules then modules = { } end modules ['node-dum'] = { nodes = nodes or { } function nodes.simple_font_dummy(head,tail) - return tail + -- ligaturing, kerning + return head, tail end function nodes.simple_font_handler(head) - local tail = node.slide(head) --- lang.hyphenate(head,tail) - head = nodes.process_characters(head,tail) +-- lang.hyphenate(head) + head = nodes.process_characters(head) nodes.inject_kerns(head) nodes.protect_glyphs(head) - tail = node.ligaturing(head,tail) - tail = node.kerning(head,tail) + head = node.ligaturing(head) + head = node.kerning(head) return head end diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua index 3810b7a85..a801e9acb 100644 --- a/tex/context/base/node-fin.lua +++ b/tex/context/base/node-fin.lua @@ -41,31 +41,32 @@ function states.disabletriggering() triggering = false end +-- the following code is no longer needed due to the new backend +-- but we keep it around for a while as an example -- - -states.collected = states.collected or { } - -storage.register("states/collected", states.collected, "states.collected") - -local collected = states.collected - -function states.collect(str) - collected[#collected+1] = str -end - -function states.flush() - if #collected > 0 then - for i=1,#collected do - texsprint(ctxcatcodes,collected[i]) -- we're in context mode anyway - end - collected = { } - states.collected = collected - end -end - -function states.check() - texio.write_nl(concat(collected,"\n")) -end +-- states.collected = states.collected or { } +-- +-- storage.register("states/collected", states.collected, "states.collected") +-- +-- local collected = states.collected +-- +-- function states.collect(str) +-- collected[#collected+1] = str +-- end +-- +-- function states.flush() +-- if #collected > 0 then +-- for i=1,#collected do +-- texsprint(ctxcatcodes,collected[i]) -- we're in context mode anyway +-- end +-- collected = { } +-- states.collected = collected +-- end +-- end +-- +-- function states.check() +-- texio.write_nl(concat(collected,"\n")) +-- end -- we used to do the main processor loop here and call processor for each node -- but eventually this was too much a slow down (1 sec on 23 for 120 pages mk) @@ -82,7 +83,7 @@ local function process_attribute(head,plugin) -- head,attribute,enabled,initiali if processor then local initializer = plugin.initializer local resolver = plugin.resolver - local inheritance = (resolver and resolver()) or -0x7FFFFFFF -- we can best use nil and skip ! + local inheritance = (resolver and resolver()) or nil -- -0x7FFFFFFF -- we can best use nil and skip ! if initializer then initializer(namespace,attribute,head) end @@ -94,8 +95,7 @@ local function process_attribute(head,plugin) -- head,attribute,enabled,initiali if used then local flusher = plugin.flusher if flusher then - local h, d = flusher(namespace,attribute,head,used) - head = h + head = flusher(namespace,attribute,head,used) end end end @@ -115,76 +115,54 @@ function nodes.install_attribute_handler(plugin) end end --- a few handlers +-- the injectors -local current, current_selector, used, done = 0, 0, { }, false +local insert_node_before = node.insert_before +local insert_node_after = node.insert_after -local function insert(n,stack,previous,head) -- there is a helper, we need previous because we are not slided - if n then - if type(n) == "function" then - n = n() - end - if n then - n = copy_node(n) - n.next = stack - if previous then - previous.next = n - else - head = n - end - previous = n -- ? - else - -- weird - end - end - return stack, head -end +local nsdata, nsdone, nsforced, nsselector, nstrigger +local current, current_selector, done = 0, 0, false -- nb, stack has a local current ! -function states.initialize(what, attribute, stack) - current, current_selector, used, done = 0, 0, { }, false +function states.initialize(namespace,attribute,head) + nsdata, nsnone = namespace.data, namespace.none + nsforced, nsselector = namespace.forced, namespace.selector + nstrigger = triggering and namespace.triggering and trigger + current, current_selector, done = 0, 0, false -- todo: done cleanup end function states.finalize(namespace,attribute,head) -- is this one ok? - if current > 0 then - local nn = namespace.none - if nn then - local id = head.id - if id == hlist or id == vlist then - local list = head.list - if list then - local _, h = insert(nn,list,nil,list) - head.list = h - end - else - stack, head = insert(nn,head,nil,head) + if current > 0 and nsnone then + local id = head.id + if id == hlist or id == vlist then + local list = head.list + if list then + head.list = insert_node_before(list,list,copy_node(nsnone)) end - return head, true, true + else + head = insert_node_before(head,head,copy_node(nsnone)) end + return head, true, true end return head, false, false end local function process(namespace,attribute,head,inheritance,default) -- one attribute - local trigger = triggering and namespace.triggering and trigger - local stack, previous, done = head, nil, false - local nsdata, nsreviver, nsnone = namespace.data, namespace.reviver, namespace.none + local stack, done = head, false while stack do local id = stack.id -- we need to deal with literals too (reset as well as oval) ---~ if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc + -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc local c = has_attribute(stack,attribute) if c then if default and c == inheritance then if current ~= default then - local data = nsdata[default] or nsreviver(default) - stack, head = insert(data,stack,previous,head) - current, done, used[default] = default, true, true + head = insert_node_before(head,stack,copy_node(nsdata[default])) + current, done = default, true end elseif current ~= c then - local data = nsdata[c] or nsreviver(c) - stack, head = insert(data,stack,previous,head) - current, done, used[c] = c, true, true + head = insert_node_before(head,stack,copy_node(nsdata[c])) + current, done = c, true end -- here ? compare selective if id == glue then --leader @@ -200,7 +178,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr current = 0 end local ok = false - if trigger and has_attribute(stack,trigger) then + if nstrigger and has_attribute(stack,nstrigger) then local outer = has_attribute(stack,attribute) if outer ~= inheritance then stack.leader, ok = process(namespace,attribute,content,inheritance,outer) @@ -216,19 +194,18 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr end elseif default and inheritance then if current ~= default then - local data = nsdata[default] or nsreviver(default) - stack, head = insert(data,stack,previous,head) - current, done, used[default] = default, true, true + head = insert_node_before(head,stack,copy_node(nsdata[default])) + current, done = default, true end elseif current > 0 then - stack, head = insert(nsnone,stack,previous,head) - current, done, used[0] = 0, true, true + head = insert_node_before(head,stack,copy_node(nsnone)) + current, done = 0, true end elseif id == hlist or id == vlist then local content = stack.list if content then local ok = false - if trigger and has_attribute(stack,trigger) then + if nstrigger and has_attribute(stack,nstrigger) then local outer = has_attribute(stack,attribute) if outer ~= inheritance then stack.list, ok = process(namespace,attribute,content,inheritance,outer) @@ -241,15 +218,8 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr done = done or ok end end - previous = stack stack = stack.next end - -- we need to play safe --- i need a proper test set for this, maybe controlled per feature ---~ if current > 0 then ---~ stack, head = insert(nsnone,stack,previous,head) ---~ current, current_selector, done, used[0] = 0, 0, true, true ---~ end return head, done end @@ -262,40 +232,37 @@ states.process = process -- each other with the same color but different color spaces e.g. \showcolor) local function selective(namespace,attribute,head,inheritance,default) -- two attributes - local trigger = triggering and namespace.triggering and trigger - local stack, previous, done = head, nil, false - local nsforced, nsselector = namespace.forced, namespace.selector - local nsdata, nsreviver, nsnone = namespace.data, namespace.reviver, namespace.none + local stack, done = head, false while stack do local id = stack.id -- we need to deal with literals too (reset as well as oval) ---~ if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc + -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc local c = has_attribute(stack,attribute) if c then if default and c == inheritance then if current ~= default then - local data = nsdata[default] or nsreviver(default) - stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head) - current, done, used[default] = default, true, true + local data = nsdata[default] + head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) + current, done = default, true end else local s = has_attribute(stack,nsselector) if current ~= c or current_selector ~= s then - local data = nsdata[c] or nsreviver(c) - stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head) - current, current_selector, done, used[c] = c, s, true, true + local data = nsdata[c] + head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) + current, current_selector, done = c, s, true end end elseif default and inheritance then if current ~= default then - local data = nsdata[default] or nsreviver(default) - stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head) - current, done, used[default] = default, true, true + local data = nsdata[default] + head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) + current, done = default, true end elseif current > 0 then - stack, head = insert(nsnone,stack,previous,head) - current, current_selector, done, used[0] = 0, 0, true, true + head = insert_node_before(head,stack,copy_node(nsnone)) + current, current_selector, done = 0, 0, true end if id == glue then -- leader -- same as *list @@ -310,7 +277,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at current = 0 end local ok = false - if trigger and has_attribute(stack,trigger) then + if nstrigger and has_attribute(stack,nstrigger) then local outer = has_attribute(stack,attribute) if outer ~= inheritance then stack.leader, ok = selective(namespace,attribute,content,inheritance,outer) @@ -328,7 +295,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at local content = stack.list if content then local ok = false - if trigger and has_attribute(stack,trigger) then + if nstrigger and has_attribute(stack,nstrigger) then local outer = has_attribute(stack,attribute) if outer ~= inheritance then stack.list, ok = selective(namespace,attribute,content,inheritance,outer) @@ -341,21 +308,75 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at done = done or ok end end - previous = stack stack = stack.next end - -- we need to play safe, this is subptimal since now we end each box - -- even if it's not needed --- i need a proper test set for this, maybe controlled per feature ---~ if current > 0 then ---~ stack, head = insert(nsnone,stack,previous,head) ---~ current, current_selector, done, used[0] = 0, 0, true, true ---~ end return head, done end states.selective = selective +-- todo: each line now gets the (e.g. layer) property, hard to avoid (and not needed too) + +local function stacked(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise + local stack, done = head, false +--~ local current, depth = 0, 0 +local current, depth = default or 0, 0 + while stack do + local id = stack.id + if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc + local c = has_attribute(stack,attribute) + if c then + if current ~= c then + head = insert_node_before(head,stack,copy_node(nsdata[c])) + depth = depth + 1 + current, done = c, true + end + if id == glue then + local content = stack.leader + if content then -- unchecked + local ok = false + stack.leader, ok = stacked(namespace,attribute,content,current) + done = done or ok + end + end + elseif default then + -- + elseif current > 0 then + head = insert_node_before(head,stack,copy_node(nsnone)) + depth = depth - 1 + current, done = 0, true + end + elseif id == hlist or id == vlist then + local content = stack.list + if content then + local c = has_attribute(stack,attribute) + if c and current ~= c then + local p = current + current, done = c, true + head = insert_node_before(head,stack,copy_node(nsdata[c])) + stack.list = stacked(namespace,attribute,content,current) + head, stack = insert_node_after(head,stack,copy_node(nsnone)) + current = p + else + local ok = false + stack.list, ok = stacked(namespace,attribute,content,current) + done = done or ok + end + end + end + stack = stack.next + end + while depth > 0 do + head = insert_node_after(head,stack,copy_node(nsnone)) + depth = depth -1 + end + return head, done +end + +states.stacked = stacked + +-- -- -- + statistics.register("attribute processing time", function() if statistics.elapsedindeed(attributes) then return format("%s seconds",statistics.elapsedtime(attributes)) diff --git a/tex/context/base/node-fin.mkiv b/tex/context/base/node-fin.mkiv index 787706ff2..8c15eb57d 100644 --- a/tex/context/base/node-fin.mkiv +++ b/tex/context/base/node-fin.mkiv @@ -22,14 +22,8 @@ \definesystemattribute[trigger] % feature inheritance -\newbox\finalizedshipoutbox - -\def\finalizeobjectbox#1{\ctxlua{nodes.process_page(tex.box[\number#1])}} - -\def\finalizeshipoutbox#1% % hack till we have access to pdf backend - {\global\setbox\finalizedshipoutbox\hbox{#1}% - \finalizeobjectbox\finalizedshipoutbox - \hbox{\ctxlua{states.flush()}\box\finalizedshipoutbox}} +\def\finalizeobjectbox #1{\ctxlua{nodes.process_page(tex.box[\number#1])}} +\def\finalizeshipoutbox#1{\ctxlua{nodes.process_page(tex.box[\number#1])}} % tricky stuff: diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua index 8185e3033..3ff73c62f 100644 --- a/tex/context/base/node-ini.lua +++ b/tex/context/base/node-ini.lua @@ -110,7 +110,6 @@ local whatsit = node.id('whatsit') local traverse_id = node.traverse_id local traverse = node.traverse -local slide_nodes = node.slide local free_node = node.free local remove_node = node.remove @@ -132,10 +131,10 @@ function nodes.delete(head,current) return nodes.remove(head,current,true) end -nodes.before = node.insert_before -- broken +nodes.before = node.insert_before nodes.after = node.insert_after --- we need to test this, as it might be fixed +-- we need to test this, as it might be fixed now function nodes.before(h,c,n) if c then diff --git a/tex/context/base/node-inj.lua b/tex/context/base/node-inj.lua index 2e8b5ae81..dc676a412 100644 --- a/tex/context/base/node-inj.lua +++ b/tex/context/base/node-inj.lua @@ -114,7 +114,7 @@ end function nodes.trace_injection(head) local function dir(n) - return (n<0 and "r-to-l") or (n>0 and "l-to-r") or ("unset") + return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or ("unset") end local function report(...) logs.report("nodes finisher",...) @@ -132,9 +132,9 @@ function nodes.trace_injection(head) if kp then local k = kerns[kp] if k[3] then - report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2],k[3],k[4],k[5]) + report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?") else - report(" kern: dir=%s, dx=%s",dir(k[1]),k[2]) + report(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?") end end if mb then @@ -145,13 +145,13 @@ function nodes.trace_injection(head) if mb then local m = m[mb] if m then - report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,j,m[1],m[2]) + report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?") else report(" markmark: bound=%s, missing index",mm) end else m = m[1] - report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1],m[2]) + report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?") end end if cb then @@ -159,7 +159,7 @@ function nodes.trace_injection(head) end if cc then local c = cursives[cc] - report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2],c[3]) + report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?") end end end @@ -168,18 +168,24 @@ end -- todo: reuse tables (i.e. no collection), but will be extra fields anyway -function nodes.inject_kerns(head,tail,where,keep) - if trace_injections then - nodes.trace_injection(head) - end +function nodes.inject_kerns(head,where,keep) local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns) if has_marks or has_cursives then + if trace_injections then + nodes.trace_injection(head) + end -- in the future variant we will not copy items but refs to tables - local done, ky, rl, valid, cx, wx = false, { }, { }, { }, { }, { } + local done, ky, rl, valid, cx, wx, mk = false, { }, { }, { }, { }, { }, { } if has_kerns then -- move outside loop + local nf, tm = nil, nil for n in traverse_id(glyph,head) do if n.subtype < 256 then valid[#valid+1] = n + if n.font ~= nf then + nf = n.font + tm = fontdata[nf].marks + end + mk[n] = tm[n.char] local k = has_attribute(n,kernpair) if k then local kk = kerns[k] @@ -198,9 +204,15 @@ function nodes.inject_kerns(head,tail,where,keep) end end else + local nf, tm = nil, nil for n in traverse_id(glyph,head) do if n.subtype < 256 then valid[#valid+1] = n + if n.font ~= nf then + nf = n.font + tm = fontdata[nf].marks + end + mk[n] = tm[n.char] end end end @@ -214,22 +226,15 @@ function nodes.inject_kerns(head,tail,where,keep) end -- todo: reuse t and use maxt if has_cursives then - local n_cursbase, n_curscurs, p_cursbase, n, p, nf, tm = nil, nil, nil, nil, nil, nil, nil + local p_cursbase, p = nil, nil -- since we need valid[n+1] we can also use a "while true do" local t, d, maxt = { }, { }, 0 for i=1,#valid do -- valid == glyphs - n = valid[i] - if n.font ~= nf then - nf = n.font ---~ print(n.font,nf,fontdata[nf]) - tm = fontdata[nf].marks - -- maybe flush - maxt = 0 - end - if not tm[n.char] then - n_cursbase = has_attribute(n,cursbase) - n_curscurs = has_attribute(n,curscurs) + local n = valid[i] + if not mk[n] then + local n_cursbase = has_attribute(n,cursbase) if p_cursbase then + local n_curscurs = has_attribute(n,curscurs) if p_cursbase == n_curscurs then local c = cursives[n_curscurs] if c then @@ -257,7 +262,8 @@ function nodes.inject_kerns(head,tail,where,keep) local ny = n.yoffset for i=maxt,1,-1 do ny = ny + d[i] - t[i].yoffset = t[i].yoffset + ny + local ti = t[i] + ti.yoffset = ti.yoffset + ny end maxt = 0 end @@ -265,7 +271,8 @@ function nodes.inject_kerns(head,tail,where,keep) local ny = n.yoffset for i=maxt,1,-1 do ny = ny + d[i] - t[i].yoffset = ny + local ti = t[i] + ti.yoffset = ny end maxt = 0 end @@ -276,7 +283,8 @@ function nodes.inject_kerns(head,tail,where,keep) local ny = n.yoffset for i=maxt,1,-1 do ny = ny + d[i] - t[i].yoffset = ny + local ti = t[i] + ti.yoffset = ny end maxt = 0 end @@ -285,14 +293,13 @@ function nodes.inject_kerns(head,tail,where,keep) end end if has_marks then - local p_markbase, n_markmark = nil, nil for i=1,#valid do local p = valid[i] - p_markbase = has_attribute(p,markbase) + local p_markbase = has_attribute(p,markbase) if p_markbase then local mrks = marks[p_markbase] for n in traverse_id(glyph,p.next) do - n_markmark = has_attribute(n,markmark) + local n_markmark = has_attribute(n,markmark) if p_markbase == n_markmark then local index = has_attribute(n,markdone) or 1 local d = mrks[index] @@ -301,9 +308,17 @@ function nodes.inject_kerns(head,tail,where,keep) -- if rlmode and rlmode < 0 then -- n.xoffset = p.xoffset + d[1] -- else - n.xoffset = p.xoffset - d[1] + n.xoffset = p.xoffset - d[1] +--~ local k = wx[p] +--~ if k then +--~ wx[n] = k +--~ end -- end - n.yoffset = p.yoffset + d[2] + if mk[p] then + n.yoffset = p.yoffset + d[2] + else + n.yoffset = n.yoffset + p.yoffset + d[2] + end end else break @@ -358,224 +373,9 @@ function nodes.inject_kerns(head,tail,where,keep) kerns, cursives, marks = { }, { }, { } end elseif has_kerns then - -- we assume done is true because there are kerns - for n in traverse_id(glyph,head) do - local k = has_attribute(n,kernpair) - if k then - local kk = kerns[k] - if kk then - -- only w can be nil, can be sped up when w == nil - local rl, x, y, w = kk[1], kk[2] or 0, kk[3] or 0, kk[4] or 0 - if y ~= 0 then - n.yoffset = y -- todo: h ? - end - local wx = w - x - if rl < 0 then - if wx ~= 0 then - insert_node_before(head,n,newkern(wx)) - end - if x ~= 0 then - insert_node_after (head,n,newkern(x)) - end - else - -- if wx ~= 0 then - -- insert_node_after(head,n,newkern(wx)) - -- end - if x ~= 0 then - insert_node_before(head,n,newkern(x)) - end - end - end - end + if trace_injections then + nodes.trace_injection(head) end - if not keep then - kerns = { } - end - return head, true - end - return head, false -end - --- -- -- KEEP OLD ONE, THE NEXT IS JUST OPTIMIZED -- -- -- - -function nodes.XXXXXXXxinject_kerns(head,tail,keep) - if trace_injections then - nodes.trace_injection(head) - end - local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns) - if has_marks or has_cursives then - -- in the future variant we will not copy items but refs to tables - local done, ky, valid, cx, wx = false, { }, { }, { }, { } - for n in traverse_id(glyph,head) do - if n.subtype < 256 then - valid[#valid+1] = n - if has_kerns then -- move outside loop - local k = has_attribute(n,kernpair) - if k then - local kk = kerns[k] - if kk then - local x, y, w, h = kk[2], kk[3], kk[4], kk[5] - local dy = y - h - if dy ~= 0 then - ky[n] = dy - end - if w ~= 0 or x ~= 0 then - wx[n] = kk - end - end - end - end - end - end - if #valid > 0 then - -- we can assume done == true because we have cursives and marks - local cx = { } - if has_kerns and next(ky) then - for n, k in next, ky do - n.yoffset = k - end - end - -- todo: reuse t and use maxt - if has_cursives then - local n_cursbase, n_curscurs, p_cursbase, n, p, nf, tm = nil, nil, nil, nil, nil, nil, nil - -- since we need valid[n+1] we can also use a "while true do" - local t, d, maxt = { }, { }, 0 - for i=1,#valid do -- valid == glyphs - n = valid[i] - if n.font ~= nf then - nf = n.font - tm = fontdata[nf].marks - -- maybe flush - maxt = 0 - end - if not tm[n.char] then - n_cursbase = has_attribute(n,cursbase) - n_curscurs = has_attribute(n,curscurs) - if p_cursbase then - if p_cursbase == n_curscurs then - local c = cursives[n_curscurs] - if c then - local rlmode, dx, dy, ws, wn = c[1], c[2], c[3], c[4], c[5] - if rlmode >= 0 then - dx = dx - ws - else - dx = dx + wn - end - if dx ~= 0 then -if rlmode < 0 then - cx[n] = -dx -else - cx[n] = dx -end - end - -- if rlmode and rlmode < 0 then - dy = -dy - -- end - maxt = maxt + 1 - t[maxt] = p - d[maxt] = dy - else - maxt = 0 - end - end - elseif maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - t[i].yoffset = t[i].yoffset + ny - end - maxt = 0 - end - if not n_cursbase and maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - t[i].yoffset = ny - end - maxt = 0 - end - p_cursbase, p = n_cursbase, n - end - end - if maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - t[i].yoffset = ny - end - maxt = 0 - end - if not keep then - cursives = { } - end - end - if has_marks then - local p_markbase, n_markmark = nil, nil - for i=1,#valid do - local p = valid[i] - p_markbase = has_attribute(p,markbase) - if p_markbase then - local mrks = marks[p_markbase] - for n in traverse_id(glyph,p.next) do - n_markmark = has_attribute(n,markmark) - if p_markbase == n_markmark then - local index = has_attribute(n,markdone) or 1 - local d = mrks[index] - if d then - local d1, d2 = d[1], d[2] - if d1 ~= 0 then - n.xoffset = p.xoffset - d[1] - end - if d2 ~= 0 then - n.yoffset = p.yoffset + d[2] - end - end - else - break - end - end - end - end - if not keep then - marks = { } - end - end - -- todo : combine - if next(wx) then - for n, k in next, wx do - -- only w can be nil, can be sped up when w == nil - local rl, x, w = k[1], k[2] or 0, k[4] or 0 - local wx = w - x - if rl < 0 then - if wx ~= 0 then - insert_node_before(head,n,newkern(wx)) - end - if x ~= 0 then - insert_node_after (head,n,newkern(x)) - end - else - -- if wx ~= 0 then - -- insert_node_after(head,n,newkern(wx)) - -- end - if x ~= 0 then - insert_node_before(head,n,newkern(x)) - end - end - end - end - if next(cx) then - for n, k in next, cx do - insert_node_before(head,n,newkern(k)) - end - end - if not keep then - kerns = { } - end - return head, true - elseif not keep then - kerns, cursives, marks = { }, { }, { } - end - elseif has_kerns then -- we assume done is true because there are kerns for n in traverse_id(glyph,head) do local k = has_attribute(n,kernpair) @@ -610,6 +410,8 @@ end kerns = { } end return head, true + else + -- no tracing needed end return head, false end diff --git a/tex/context/base/node-pro.lua b/tex/context/base/node-pro.lua index 708237838..acc3f1676 100644 --- a/tex/context/base/node-pro.lua +++ b/tex/context/base/node-pro.lua @@ -11,13 +11,8 @@ local format, concat = string.format, table.concat local trace_callbacks = false trackers.register("nodes.callbacks", function(v) trace_callbacks = v end) -local hlist = node.id('hlist') -local vlist = node.id('vlist') local glyph = node.id('glyph') -local disc = node.id('disc') -local mark = node.id('mark') -local slide_nodes = node.slide local free_node = node.free local first_character = node.first_character @@ -30,7 +25,7 @@ lists = lists or { } chars = chars or { } words = words or { } -- not used yet -local actions = tasks.actions("processors",2) -- head, tail, where, boolean +local actions = tasks.actions("processors",2) -- head, where, boolean local n = 0 @@ -65,12 +60,12 @@ end nodes.processors.enabled = true -- thsi will become a proper state (like trackers) -function nodes.processors.pre_linebreak_filter(head,groupcode) -- todo: tail +function nodes.processors.pre_linebreak_filter(head,groupcode) local first, found = first_character(head) if found then if trace_callbacks then local before = nodes.count(head,true) - local head, tail, done = actions(head,slide_nodes(head),groupcode) + local head, done = actions(head,groupcode) local after = nodes.count(head,true) if done then tracer("pre_linebreak","changed",head,groupcode,before,after,true) @@ -79,7 +74,7 @@ function nodes.processors.pre_linebreak_filter(head,groupcode) -- todo: tail end return (done and head) or true else - local head, tail, done = actions(head,slide_nodes(head),groupcode) + local head, done = actions(head,groupcode) return (done and head) or true end elseif trace_callbacks then @@ -89,12 +84,12 @@ function nodes.processors.pre_linebreak_filter(head,groupcode) -- todo: tail return true end -function nodes.processors.hpack_filter(head,groupcode) -- todo: tail +function nodes.processors.hpack_filter(head,groupcode) local first, found = first_character(head) if found then if trace_callbacks then local before = nodes.count(head,true) - local head, tail, done = actions(head,slide_nodes(head),groupcode) + local head, done = actions(head,groupcode) local after = nodes.count(head,true) if done then tracer("hpack","changed",head,groupcode,before,after,true) @@ -103,7 +98,7 @@ function nodes.processors.hpack_filter(head,groupcode) -- todo: tail end return (done and head) or true else - local head, tail, done = actions(head,slide_nodes(head),groupcode) + local head, done = actions(head,groupcode) return (done and head) or true end elseif trace_callbacks then @@ -116,17 +111,19 @@ end callback.register('pre_linebreak_filter', nodes.processors.pre_linebreak_filter) callback.register('hpack_filter' , nodes.processors.hpack_filter) -local actions = tasks.actions("finalizers",2) -- head, tail, where, boolean +local actions = tasks.actions("finalizers",2) -- head, where, boolean -- beware, these are packaged boxes so no first_character test -- maybe some day a hash with valid groupcodes +-- +-- beware, much can pass twice, for instance vadjust passes two times -function nodes.processors.post_linebreak_filter(head,groupcode) -- todo: tail +function nodes.processors.post_linebreak_filter(head,groupcode) --~ local first, found = first_character(head) --~ if found then if trace_callbacks then local before = nodes.count(head,true) - local head, tail, done = actions(head,slide_nodes(head),groupcode) + local head, done = actions(head,groupcode) local after = nodes.count(head,true) if done then tracer("finalizer","changed",head,groupcode,before,after,true) @@ -135,7 +132,7 @@ function nodes.processors.post_linebreak_filter(head,groupcode) -- todo: tail end return (done and head) or true else - local head, tail, done = actions(head,slide_nodes(head),groupcode) + local head, done = actions(head,groupcode) return (done and head) or true end --~ elseif trace_callbacks then diff --git a/tex/context/base/node-ref.lua b/tex/context/base/node-ref.lua new file mode 100644 index 000000000..571ba3dd7 --- /dev/null +++ b/tex/context/base/node-ref.lua @@ -0,0 +1,496 @@ +if not modules then modules = { } end modules ['node-bck'] = { + version = 1.001, + comment = "companion to node-bck.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- We supported pdf right from the start and in mkii this has resulted in +-- extensive control over the links. Nowadays pdftex provides a lot more +-- control over margins but as mkii supports multiple backends we stuck to +-- our own mechanisms. In mkiv again we implement our own handling. Eventually +-- we will even disable the pdf primitives. + +-- helper, will end up in luatex + +local cleanupreferences, cleanupdestinations = false, true + +local nodeinjections = backends.nodeinjections +local codeinjections = backends.codeinjections + +local hpack_list = node.hpack +local copy_list = node.copy_list +local flush_list = node.flush_list + +local function dimensions(parent,start,stop) -- so we need parent for glue_set info + local n = stop.next + stop.next = nil + local p = hpack_list(copy_list(start)) + stop.next = n + local w, h, d = p.width, p.height, p.depth + flush_list(p) + return w, h, d +end + +-- current.glue_set current.glue_sign + +local trace_backend = false trackers.register("nodes.backend", function(v) trace_backend = v end) +local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end) +local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end) + +local hlist = node.id("hlist") +local vlist = node.id("vlist") +local glue = node.id("glue") +local whatsit = node.id("whatsit") + +local new_kern = nodes.kern + +local has_attribute = node.has_attribute +local traverse = node.traverse +local find_node_tail = node.tail or node.slide +local tosequence = nodes.tosequence + +local function inject_range(head,first,last,reference,make,stack,parent,pardir,txtdir) + local width, height, depth = dimensions(parent,first,last) + if pardir == "TRT" or txtdir == "+TRT" then + width = - width + end + local result, resolved = make(width,height,depth,reference) + if result and resolved then + if head == first then + if trace_backend then + logs.report("backend","head: %04i %s %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved) + end + result.next = first + first.prev = result + return result, last + else + if trace_backend then + logs.report("backend","middle: %04i %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved) + end + local prev = first.prev + if prev then + result.next = first + result.prev = prev + prev.next = result + first.prev = result + else + result.next = first + first.prev = result + end + if first == head.next then + head.next = result -- hm, weird + end + return head, last + end + else + return head, last + end +end + +local function inject_list(id,current,reference,make,stack,pardir,txtdir) + local width, height, depth, correction = current.width, current.height, current.depth, 0 + local moveright = false + local first = current.list + if id == hlist then + -- can be either an explicit hbox or a line and there is no way + -- to recognize this; anyway only if ht/dp (then inline) + local sr = stack[reference] + if first then + if sr and sr[2] then + local last = find_node_tail(first) + if last.id == glue and last.subtype == 9 then + local prev = last.prev + moveright = first.id == glue and first.subtype == 8 + if prev.id == glue and prev.subtype == 15 then + width = dimensions(current,first,prev.prev) -- maybe not current as we already take care of it + else + if moveright and first.spec then + width = width - first.spec.stretch*current.glue_set * current.glue_sign + end + if last.spec then + width = width - last.spec.stretch*current.glue_set * current.glue_sign + end + end + end + else + -- also weird + end + else + -- ok + end + correction = width + else + correction = height + depth + height, depth = depth, height -- ugly hack, needed because pdftex backend does something funny + end + if pardir == "TRT" then + width = - width + end + local result, resolved = make(width,height,depth,reference) + if result and resolved then + if trace_backend then + logs.report("backend","box: %04i %s %s: w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",width,height,depth,resolved) + end + if not first then + current.list = result + elseif moveright then -- brr no prevs done + -- result after first + local n = first.next + result.next = n + first.next = result + result.prev = first + if n then n.prev = result end + else + -- first after result + result.next = first + first.prev = result + current.list = result + end + end +end + +local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir) -- main + if head then + local current, first, last, firstdir, reference = head, nil, nil, nil, nil + pardir = pardir or "===" + txtdir = txtdir or "===" + while current do + local id = current.id + local r = has_attribute(current,attribute) + if id == whatsit then + local subtype = current.subtype + if subtype == 6 then + pardir = current.dir + elseif subtype == 7 then + txtdir = current.dir + end + elseif id == hlist or id == vlist then + if r and (not skip or r > skip) then + inject_list(id,current,r,make,stack,pardir,txtdir) + done[r] = true + end + local list = current.list + if list then + local pd + current.list, _, pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir) + end + elseif not r then + -- just go on, can be kerns + elseif not reference then + reference, first, last, firstdir = r, current, current, txtdir + elseif r == reference then + last = current + elseif not done[reference] then + if not skip or r > skip then + head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) + reference, first, last, firstdir = nil, nil, nil, nil + end + else + reference, first, last, firstdir = r, current, current, txtdir + end + current = current.next + end + if reference and not done[reference] then + head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) + end + end + return head, true, pardir, txtdir +end + +local function inject_area(head,attribute,make,stack,done,pardir,txtdir) -- singular ! + if head then + pardir = pardir or "===" + txtdir = txtdir or "===" + local current = head + while current do + local id = current.id + local r = has_attribute(current,attribute) + if id == whatsit then + local subtype = current.subtype + if subtype == 6 then + pardir = current.dir + elseif subtype == 7 then + txtdir = current.dir + end + elseif id == hlist or id == vlist then + if r and not done[r] then + done[r] = true + inject_list(id,current,r,make,stack,pardir,txtdir) + end + current.list = inject_area(current.list,attribute,make,stack,done,pardir,txtdir) + elseif r and not done[r] then + done[r] = true + head, current = inject_range(head,current,current,r,make,stack,pardir,txtdir) + end + current = current.next + end + end + return head, true +end + +-- tracing + +local new_rule = nodes.rule +local new_kern = nodes.kern +local set_attribute = node.set_attribute +local register_color = colors.register + +local a_colormodel = attributes.private('colormodel') +local a_color = attributes.private('color') +local a_transparency = attributes.private('transparency') +local u_transparency = nil +local u_colors = { } +local force_gray = true + +local function colorize(width,height,depth,n) + if force_gray then n = 0 end + u_transparency = u_transparency or transparencies.register(nil,2,.65) + local ucolor = u_colors[n] + if not ucolor then + if n == 1 then + u_color = register_color('color',nil,'rgb',.75,0,0) + elseif n == 2 then + u_color = register_color('color',nil,'rgb',0,.75,0) + elseif n == 3 then + u_color = register_color('color',nil,'rgb',0,0,.75) + else + n = 0 + u_color = register_color('color',nil,'gray',.5) + end + u_colors[n] = u_color + end + local rule = new_rule(width,height,depth) + set_attribute(rule,a_colormodel,1) -- gray color model + set_attribute(rule,a_color,u_color) + set_attribute(rule,a_transparency,u_transparency) + if width < 0 then + local kern = new_kern(width) + rule.width = -width + kern.next = rule + rule.prev = kern + return kern + else + return rule + end +end + +local new_kern = nodes.kern +local texattribute = tex.attribute +local texcount = tex.count + +-- references: + +nodes.references = { + attribute = attributes.private('reference'), + stack = { }, + done = { }, +} + +local stack, done, attribute = nodes.references.stack, nodes.references.done, nodes.references.attribute + +local nofreferences, topofstack = 0, 0 + +local function setreference(n,h,d,r) -- n is just a number, can be used for tracing + topofstack = topofstack + 1 + stack[topofstack] = { n, h, d, codeinjections.prerollreference(r) } -- the preroll permits us to determine samepage (but delayed also has some advantages) +--~ texattribute[attribute] = topofstack -- todo -> at tex end + texcount.lastreferenceattribute = topofstack +end + +nodes.setreference = setreference + +local function makereference(width,height,depth,reference) + local sr = stack[reference] + if sr then + local resolved, ht, dp, set = sr[1], sr[2], sr[3], sr[4] + if ht then + if height < ht then height = ht end + if depth < dp then depth = dp end + end + local annot = nodeinjections.reference(width,height,depth,set) + if annot then + nofreferences = nofreferences + 1 + local result, current + if trace_references then + local step = 65536 + result = hpack_list(colorize(width,height-step,depth-step,2)) -- step subtracted so that we can see seperate links + result.width = 0 + current = result + end + if current then + current.next = annot + else + result = annot + end + result = hpack_list(result,0) + result.width, result.height, result.depth = 0, 0, 0 + if cleanupreferences then stack[reference] = nil end + return result, resolved + else + logs.report("backends","unable to resolve reference annotation %s",reference) + end + else + logs.report("backends","unable to resolve reference attribute %s",reference) + end +end + +function nodes.add_references(head) + if topofstack > 0 then + return inject_areas(head,attribute,makereference,stack,done) + else + return head, false + end +end + +-- destinations (we can clean up once set!) + +nodes.destinations = { + attribute = attributes.private('destination'), + stack = { }, + done = { }, +} + +local stack, done, attribute = nodes.destinations.stack, nodes.destinations.done, nodes.destinations.attribute + +local nofdestinations, topofstack = 0, 0 + +local function setdestination(n,h,d,name,view) -- n = grouplevel, name == table + topofstack = topofstack + 1 + stack[topofstack] = { n, h, d, name, view } + return topofstack +end + +nodes.setdestination = setdestination + +local function makedestination(width,height,depth,reference) + local sr = stack[reference] + if sr then + local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5] + if ht then + if height < ht then height = ht end + if depth < dp then depth = dp end + end + local result, current + if trace_destinations then + local step = 0 + if width == 0 then + step = 4*65536 + width, height, depth = 5*step, 5*step, 0 + end + for n=1,#name do + local rule = hpack_list(colorize(width,height,depth,3)) + rule.width = 0 + if not result then + result, current = rule, rule + else + current.next = rule + rule.prev = current + current = rule + end + width, height = width - step, height - step + end + end + nofdestinations = nofdestinations + 1 + for n=1,#name do + local annot = nodeinjections.destination(width,height,depth,name[n],view) + if not result then + result, current = annot, annot + else + current.next = annot + annot.prev = current + current = annot + end + end + result = hpack_list(result,0) + result.width, result.height, result.depth = 0, 0, 0 + if cleanupdestinations then stack[reference] = nil end + return result, resolved + else + logs.report("backends","unable to resolve destination attribute %s",reference) + end +end + +function nodes.add_destinations(head) + if topofstack > 0 then + return inject_area(head,attribute,makedestination,stack,done) -- singular + else + return head, false + end +end + +-- will move + +function jobreferences.mark(reference,h,d,view) + return setdestination(tex.currentgrouplevel,h,d,reference,view) +end + +function jobreferences.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible + local set, bug = jobreferences.identify(prefix,reference) + if bug or #set == 0 then + -- unknown ref, just don't set it and issue an error + else + -- check + set.highlight, set.newwindow,set.layer = highlight, newwindow, layer + setreference(tex.currentgrouplevel,h,d,set) -- sets attribute / todo: for set[*].error + end +end + +function jobreferences.injectcurrentset(h,d) -- used inside doifelse + local currentset = jobreferences.currentset + if currentset then + setreference(tex.currentgrouplevel,h,d,currentset) -- sets attribute / todo: for set[*].error + end +end + +-- + +local function checkboth(open,close) + if open and open ~= "" then + local set, bug = jobreferences.identify("",open) + open = not bug and #set > 0 and set + end + if close and close ~= "" then + local set, bug = jobreferences.identify("",close) + close = not bug and #set > 0 and set + end + return open, close +end + +-- expansion is temp hack + +local opendocument, closedocument, openpage, closepage + +local function check(what) + if what and what ~= "" then + local set, bug = jobreferences.identify("",what) + return not bug and #set > 0 and set + end +end + +function jobreferences.checkopendocumentactions (open) opendocument = check(open) end +function jobreferences.checkclosedocumentactions(close) closedocument = check(close) end +function jobreferences.checkopenpageactions (open) openpage = check(open) end +function jobreferences.checkclosepageactions (close) closepage = check(close) end + +function jobreferences.flushdocumentactions() + if opendocument or closedocument then + backends.codeinjections.flushdocumentactions(opendocument,closedocument) -- backend + end +end +function jobreferences.flushpageactions() + if openpage or closepage then + backends.codeinjections.flushpageactions(openpage,closepage) -- backend + end +end + +-- end temp hack + +statistics.register("interactive elements", function() + if nofreferences > 0 or nofdestinations > 0 then + return string.format("%s references, %s destinations",nofreferences,nofdestinations) + else + return nil + end +end) diff --git a/tex/context/base/node-res.lua b/tex/context/base/node-res.lua index b84e5b105..4f2cf5a05 100644 --- a/tex/context/base/node-res.lua +++ b/tex/context/base/node-res.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['node-res'] = { } local gmatch, format = string.gmatch, string.format -local copy_node, free_node, new_node = node.copy, node.free, node.new +local copy_node, free_node, free_list, new_node = node.copy, node.free, node.flush_list, node.new --[[ldx-- <p>The next function is not that much needed but in <l n='context'/> we use @@ -51,7 +51,6 @@ function nodes.usage() return t end -local pdfliteral = nodes.register(new_node("whatsit",8)) pdfliteral.mode = 1 local disc = nodes.register(new_node("disc")) local kern = nodes.register(new_node("kern",1)) local penalty = nodes.register(new_node("penalty")) @@ -60,6 +59,7 @@ local glue_spec = nodes.register(new_node("glue_spec")) local glyph = nodes.register(new_node("glyph",0)) local textdir = nodes.register(new_node("whatsit",7)) local rule = nodes.register(new_node("rule")) +local latelua = nodes.register(new_node("whatsit",35)) function nodes.glyph(fnt,chr) local n = copy_node(glyph) @@ -91,11 +91,6 @@ end function nodes.disc() return copy_node(disc) end -function nodes.pdfliteral(str) - local t = copy_node(pdfliteral) - t.data = str - return t -end function nodes.textdir(dir) local t = copy_node(textdir) t.dir = dir @@ -108,6 +103,11 @@ function nodes.rule(w,h,d) if d then n.depth = d end return n end +function nodes.latelua(code) + local n = copy_node(latelua) + n.data = code + return n +end statistics.register("cleaned up reserved nodes", function() return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"])) diff --git a/tex/context/base/node-seq.lua b/tex/context/base/node-seq.lua index b8c432223..43ca8a99b 100644 --- a/tex/context/base/node-seq.lua +++ b/tex/context/base/node-seq.lua @@ -115,12 +115,18 @@ function sequencer.tostring(t,n) -- n not done return format(template,concat(vars,"\n"),concat(calls,"\n")) end +-- we used to deal with tail as well but now that the lists are always +-- double linked and the kernel function no longer expect tail as +-- argument we stick to head and done (done can probably also go +-- as luatex deals with return values efficiently now .. in the +-- past there was some copying involved, but no longer) + local template = [[ %s -return function(head,tail%s) +return function(head%s) local ok, done = false, false %s - return head, tail, done + return head, done end]] function sequencer.nodeprocessor(t,n) @@ -142,11 +148,9 @@ function sequencer.nodeprocessor(t,n) local localized = localize(action) vars[#vars+1] = format("local %s = %s",localized,action) if kind[action] == "nohead" then - calls[#calls+1] = format(" ok = %s(head,tail%s) done = done or ok -- %s %i",localized,args,group,i) - elseif kind[action] == "notail" then - calls[#calls+1] = format(" head, ok = %s(head,tail%s) done = done or ok -- %s %i",localized,args,group,i) + calls[#calls+1] = format(" ok = %s(head%s) done = done or ok -- %s %i",localized,args,group,i) else - calls[#calls+1] = format(" head, tail, ok = %s(head,tail%s) done = done or ok -- %s %i",localized,args,group,i) + calls[#calls+1] = format(" head, ok = %s(head%s) done = done or ok -- %s %i",localized,args,group,i) end end end @@ -177,7 +181,7 @@ end --~ sequencer.prependaction(t,"taco","taco.j") --~ sequencer.removeaction(t,"hans","hans.x") ---~ sequencer.setkind(t,"hans.b","notail") +--~ sequencer.setkind(t,"hans.b") --~ sequencer.setkind(t,"taco.j","nohead") --~ print(sequencer.tostring(t)) diff --git a/tex/context/base/node-shp.lua b/tex/context/base/node-shp.lua index 48dd8c5c7..22b97ca6e 100644 --- a/tex/context/base/node-shp.lua +++ b/tex/context/base/node-shp.lua @@ -62,5 +62,5 @@ end local actions = tasks.actions("shipouts",0) -- no extra arguments function nodes.process_page(head) -- problem, attr loaded before node, todo ... - return actions(head) -- no tail + return actions(head) end diff --git a/tex/context/base/node-tex.lua b/tex/context/base/node-tex.lua index 563e6a397..1995f4aa2 100644 --- a/tex/context/base/node-tex.lua +++ b/tex/context/base/node-tex.lua @@ -13,40 +13,25 @@ kernel = kernel or { } local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming local hyphenate, ligaturing, kerning = lang.hyphenate, node.ligaturing, node.kerning -function kernel.hyphenation(head,tail) -- lang.hyphenate returns done - if head == tail then - return head, tail, false - else +function kernel.hyphenation(head) -- starttiming(kernel) - -- local done = hyphenate(head,tail) + local done = hyphenate(head) -- stoptiming(kernel) - -- return head, tail, done - return head, tail, hyphenate(head,tail) - end + return head, done end -function kernel.ligaturing(head,tail) -- node.ligaturing returns head,tail,done - if head == tail then - return head, tail, false - else +function kernel.ligaturing(head) -- starttiming(kernel) - -- local head, tail, done = ligaturing(head,tail) + local head, tail, done = ligaturing(head) -- todo: check what is returned -- stoptiming(kernel) - -- return head, tail, done - return ligaturing(head,tail) - end + return head, done end -function kernel.kerning(head,tail) -- node.kerning returns head,tail,done - if head == tail then - return head, tail, false - else +function kernel.kerning(head) -- starttiming(kernel) - -- local head, tail, done = kerning(head,tail) + local head, tail, done = kerning(head) -- todo: check what is returned -- stoptiming(kernel) - -- return head, tail, done - return kerning(head,tail) - end + return head, done end callback.register('hyphenate' , false) diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua index 50f8287ee..aeaa6769e 100644 --- a/tex/context/base/node-tra.lua +++ b/tex/context/base/node-tra.lua @@ -388,9 +388,9 @@ function nodes.pack_list(head) return t end -function nodes.ids_to_string(head) +function nodes.ids_to_string(head,tail) local t, last_id, last_n = { }, nil, 0 - for n in traverse_nodes(head) do + for n in traverse_nodes(head,tail) do local id = n.id if not last_id then last_id, last_n = id, 1 diff --git a/tex/context/base/node-tsk.lua b/tex/context/base/node-tsk.lua index bfa9f1196..d2ac57d6b 100644 --- a/tex/context/base/node-tsk.lua +++ b/tex/context/base/node-tsk.lua @@ -76,7 +76,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no .. local data = tasks.data[name] if data then if n == 0 then - return function(head,tail) + return function(head) local runner = data.runner total = total + 1 -- will go away if not runner then @@ -87,10 +87,10 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no .. runner = sequencer.compile(data.list,sequencer.nodeprocessor,0) data.runner = runner end - return runner(head,tail) + return runner(head) end elseif n == 1 then - return function(head,tail,one) + return function(head,one) total = total + 1 -- will go away local runner = data.runner if not runner then @@ -101,10 +101,10 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no .. runner = sequencer.compile(data.list,sequencer.nodeprocessor,1) data.runner = runner end - return runner(head,tail,one) + return runner(head,one) end elseif n == 2 then - return function(head,tail,one,two) + return function(head,one,two) total = total + 1 -- will go away local runner = data.runner if not runner then @@ -115,10 +115,10 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no .. runner = sequencer.compile(data.list,sequencer.nodeprocessor,2) data.runner = runner end - return runner(head,tail,one,two) + return runner(head,one,two) end else - return function(head,tail,...) + return function(head,...) total = total + 1 -- will go away local runner = data.runner if not runner then @@ -129,7 +129,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no .. runner = sequencer.compile(data.list,sequencer.nodeprocessor,3) data.runner = runner end - return runner(head,tail,...) + return runner(head,...) end end else diff --git a/tex/context/base/node-tst.lua b/tex/context/base/node-tst.lua index e8b1146f8..4fb6b4bca 100644 --- a/tex/context/base/node-tst.lua +++ b/tex/context/base/node-tst.lua @@ -6,6 +6,17 @@ if not modules then modules = { } end modules ['node-tst'] = { license = "see context related readme files" } +local glue = node.id("glue") +local penalty = node.id("penalty") +local kern = node.id("kern") +local glyph = node.id("glyph") +local whatsit = node.id("whatsit") +local hlist = node.id("hlist") + +local find_node_tail = node.tail or node.slide + +local chardata = characters.data + function nodes.leftskip(n) while n do local id = n.id @@ -28,7 +39,7 @@ end function nodes.rightskip(n) if n then - n = slide_nodes(n) + n = find_node_tail(n) while n do local id = n.id if id == glue then diff --git a/tex/context/base/pack-bar.mkiv b/tex/context/base/pack-bar.mkiv new file mode 100644 index 000000000..05afd32d0 --- /dev/null +++ b/tex/context/base/pack-bar.mkiv @@ -0,0 +1,67 @@ +%D \module +%D [ file=pack-bar, +%D version=2009.06.26, +%D title=\CONTEXT\ Packaging Macros, +%D subtitle=Bars, +%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 Packaging Macros / Bars} + +%D This code has been moved from scrn-int to here (was some old +%D experimental code). It could be in scrn-bar but it's static. + +\unprotect + +%D \startbuffer +%D \dorecurse{10} +%D {\horizontalpositionbar +%D \pos\recurselevel \min1 \max10 +%D \token\framed{\recurselevel}% +%D \\} +%D +%D \hbox to 15em +%D {\hss +%D \dorecurse{10} +%D {\verticalpositionbar\pos\recurselevel\min1\max10\token\blackrule\\ +%D \hss}} +%D \stopbuffer + +\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\% + {\hbox to \hsize + {\hskip\zeropoint\!!plus #1\!!fill + \hskip\zeropoint\!!plus-#2\!!fill + #4\relax + \hskip\zeropoint\!!plus #3\!!fill + \hskip\zeropoint\!!plus-#1\!!fill}} + +\def\verticalpositionbar\pos#1\min#2\max#3\token#4\\% + {\vbox to \vsize + {\vskip\zeropoint\!!plus #1\!!fill + \vskip\zeropoint\!!plus-#2\!!fill + \hbox{#4}\relax + \vskip\zeropoint\!!plus #3\!!fill + \vskip\zeropoint\!!plus-#1\!!fill}} + +\def\horizontalgrowingbar\pos#1\min#2\max#3\height#4\depth#5\\% + {\hbox to \hsize + {\scratchcounter\numexpr#1-#2+\plusone\relax + \leaders\vrule\hskip\zeropoint\!!plus \scratchcounter\!!fill + \vrule\!!width\zeropoint\!!height#4\!!depth#5% + \hskip\zeropoint\!!plus #3\!!fill + \hskip\zeropoint\!!plus-#1\!!fill}} + +\def\verticalgrowingbar\pos#1\min#2\max#3\width#4\\% + {\vbox to \vsize + {\scratchcounter\numexpr#1-#2+\plusone\relax + \leaders\hrule\vskip\zeropoint\!!plus\scratchcounter\!!fill + \hrule\!!width#4\!!height\zeropoint\!!depth\zeropoint + \vskip\zeropoint\!!plus #3\!!fill + \vskip\zeropoint\!!plus-#1\!!fill}} + +\protect \endinput diff --git a/tex/context/base/pack-box.mkiv b/tex/context/base/pack-box.mkiv index 1be840552..a12ab0263 100644 --- a/tex/context/base/pack-box.mkiv +++ b/tex/context/base/pack-box.mkiv @@ -60,10 +60,10 @@ {\dosingleargument\doanchor} \def\doanchor[#1]% - {\ifundefined{\??an#1}\@EA\dodoanchor\else\@EA\nonoanchor\fi[#1]} + {\ifcsname\??an#1\endcsname\@EA\nonoanchor\else\@EA\dodoanchor\fi[#1]} \def\nonoanchor[#1]% - {\getvalue{\??an#1}} + {} \def\dodoanchor[#1]% {\dotripleempty\dododoanchor[#1]} @@ -127,7 +127,7 @@ {\dodoubleargument\dodefinecollector} \def\dodefinecollector[#1][#2]% - {\ifundefined{\@@collectorbox#1}% + {\ifcsname\@@collectorbox#1\endcsname \else \expandafter\newbox\csname\@@collectorbox#1\endcsname \fi \resetcollector[#1]% @@ -154,10 +154,10 @@ \forgetall \dontcomplain \dowithnextbox - {\ifundefined{\@@collectorbox#1}% - \writestatus{collector}{unknown layer #1}% - \else + {\ifcsname\@@collectorbox#1\endcsname \dodosetcollector[#1][#2]% + \else + \writestatus{collector}{unknown layer #1}% \fi \egroup} \hbox} @@ -188,12 +188,12 @@ \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi}% - {\ExpandBothAfter\doifinset\v!bottom{\collectorparameter\c!corner} + {\normalexpanded{\noexpand\doifinset{\v!bottom}{\collectorparameter\c!corner}} {\ifdim\@@layerysiz>\zeropoint \advance\@@layerypos-\@@layerysiz \@@layerypos-\@@layerypos \fi}% - \ExpandBothAfter\doifinset\v!right{\collectorparameter\c!corner} + \normalexpanded{\noexpand\doifinset{\v!right}{\collectorparameter\c!corner}} {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos-\@@layerxsiz \@@layerxpos-\@@layerxpos @@ -238,9 +238,7 @@ \fi} \def\flushcollector[#1]% - {\ifundefined{\@@collectorbox#1}% - \writestatus{collector}{unknown collector #1}% - \else + {\ifcsname\@@collectorbox#1\endcsname \doifnotvalue{\??cb#1\c!state}\v!stop {\vbox {\hbox @@ -248,12 +246,14 @@ {\let\next\copy}{\let\next\box}% \raise\dp\csname\@@collectorbox#1\endcsname \next\csname\@@collectorbox#1\endcsname}}}% + \else + \writestatus{collector}{unknown collector #1}% \fi} \def\composedcollector#1{\flushcollector[#1]} \def\resetcollector[#1]% - {\ifundefined{\@@collectorbox#1}\else + {\ifcsname\@@collectorbox#1\endcsname \global\setbox\csname\@@collectorbox#1\endcsname\emptybox \fi} @@ -264,8 +264,7 @@ {\bgroup \def\currentcollector{#1}% \mathchardef\collectorbox\csname\@@collectorbox#1\endcsname - \getparameters - [\??cb#1][\c!voffset=\zeropoint,\c!hoffset=\zeropoint,#2]% + \getparameters[\??cb#1][\c!voffset=\zeropoint,\c!hoffset=\zeropoint,#2]% \scratchdimen\wd\collectorbox \advance\scratchdimen\collectorparameter\c!hoffset \global\wd\collectorbox\scratchdimen @@ -574,13 +573,9 @@ \hbox\framed[#3]} \def\dosetlayerframedS[#1][#2][#3]% - {\dowithnextbox - {\setlayer - [#1] - [\c!width=\nextboxwd,\c!height=\nextboxht, - \c!offset=\!!zeropoint,#2] - {\flushnextbox}}% - \hbox\framed[\c!location=\v!normal,#2]} + {\dowithnextbox % we could use a local setlayer command (no doif..empty) which also saves a nextbox + {\setlayer[#1][\c!width=\nextboxwd,\c!height=\nextboxht,\c!offset=\!!zeropoint,#2]{\flushnextbox}}% + \hbox\framed[\c!location=\v!normal,#2]} \def\setlayertext {\dotripleempty\dosetlayertext} diff --git a/tex/context/base/pack-lyr.mkiv b/tex/context/base/pack-lyr.mkiv index 768b1e0c9..5bb89fccf 100644 --- a/tex/context/base/pack-lyr.mkiv +++ b/tex/context/base/pack-lyr.mkiv @@ -13,8 +13,6 @@ \writestatus{loading}{ConTeXt Packaging Macros / Layers} -%D This module is now etex dependent. - % todo : first / last / next / +... => page key % test on left/right box when no doublesided option given % use \ifcsname instead of doifvalue @@ -36,8 +34,6 @@ %D will go in. This means that we can move an overlay from one %D background to the other using the dimensions of the parent. -%D ! ! ! ! to be documented ! ! ! ! - \ifx\undefined\defineoverlay \message{loaded to early} \wait \fi \def\defineoverlay @@ -45,7 +41,7 @@ \def\dodefineoverlay[#1][#2][#3]% overlay [layer] content {\ifthirdargument - \writestatus{BEWARE}{This (overlay definition) has changed!}% temp + %\writestatus{BEWARE}{This (overlay definition) has changed!}% temp \def\docommand##1{\setvalue{\??ov##1}{\setlayer[#2]{\executedefinedoverlay{##1}{#3}}}} \else \def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}% @@ -95,10 +91,10 @@ \defineoverlay[#1][\composedlayer{#1}]} \def\dopresetlayerbox#1% - {\ifundefined{\@@layerbox#1}% - \expandafter\newbox\csname\@@layerbox#1\endcsname - \else + {\ifcsname\@@layerbox#1\endcsname \resetlayer[#1]% + \else + \expandafter\newbox\csname\@@layerbox#1\endcsname \fi} %D \macros @@ -155,36 +151,35 @@ \def\dodosetlayer[#1][#2][#3]% #2 = links/rechts {\bgroup - \recalculatebackgrounds - \recalculatelogos + \recalculatebackgrounds % brrr \global\advance\currentlayerdata\plusone \forgetall \dontcomplain \doifvalue{\??ll#1\c!option}\v!test\tracelayerstrue \iftracelayers\traceboxplacementtrue\fi - \dowithnextbox % sneller als aparte macro - {\ifcsname\@@layerbox#1\endcsname % nb: odd/even discard, left/right not - \edef\@@layerloc{#2}% - \ifx\@@layerloc\v!even - \ifodd\realpageno - % discard nextbox - \else - \dododosetlayer[#1][\v!left][#3]% - \fi - \else\ifx\@@layerloc\v!odd - \ifodd\realpageno - \dododosetlayer[#1][\v!right][#3]% - %\else - % discard nextbox - \fi - \else - \dododosetlayer[#1][#2][#3]% - \fi\fi - \else - \writestatus{layer}{unknown layer #1}% - \fi - \egroup}% - \hbox} + \dowithnextbox{\dodosetlayerindeed{#1}{#2}{#3}\egroup}\hbox} + +\def\dodosetlayerindeed#1#2#3% #2 = links/rechts + {\ifcsname\@@layerbox#1\endcsname % nb: odd/even discard, left/right not + \edef\@@layerloc{#2}% + \ifx\@@layerloc\v!even + \ifodd\realpageno + % discard nextbox + \else + \dododosetlayer[#1][\v!left][#3]% + \fi + \else\ifx\@@layerloc\v!odd + \ifodd\realpageno + \dododosetlayer[#1][\v!right][#3]% + %\else + % discard nextbox + \fi + \else + \dododosetlayer[#1][#2][#3]% + \fi\fi + \else + \writestatus{layer}{unknown layer #1}% + \fi} \newbox\layerbox @@ -219,7 +214,7 @@ \def\dodefinelayerpreset[#1][#2]% {\doifassignmentelse{#2} {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}} - {\setvalue{\??ll\??ll#1}{\getvalue{\??ll\??ll#2}}}} + {\setvalue{\??ll\??ll#1}{\csname\??ll\??ll#2\endcsname}}} \def\dopresetlayer#1#2#3% #1=list #2=tag #3=list {\getparameters[\??ll#2][#1,#3]} @@ -242,34 +237,24 @@ \layerheight\@@layerysiz % preroll \getparameters[\??ll\currentlayer][#3]% - % presets and real roll -% maybe todo: -% \doif{\layerparameter\c!method}\v!fit -% {\@@layerxsiz\thelayerwidth \currentlayer -% \@@layerysiz\thelayerheight\currentlayer -% \layerwidth \@@layerxsiz -% \layerheight\@@layerysiz -% }% - % etc - \executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}% - % that was real slow + % + % \executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}% + % + \edef\@@currentlayerpreset{\layerparameter\c!preset}% + \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{#3}\fi + % \doif{\layerparameter\c!position}\v!overlay % slow, use \dosetvalue instead {\getparameters[\??ll\currentlayer][\c!width=\zeropoint,\c!height=\zeropoint,\c!position=\v!yes]}% - \doifsomething{\layerparameter\c!rotation} - {\setbox\nextbox\hbox - {\rotate % to be checked with new rotation - [\c!location=\v!high,\c!rotation=\layerparameter\c!rotation] - {\flushnextbox}}}% + \doifsomething{\layerparameter\c!rotation}% todo: use direct lowlevel call + {\setbox\nextbox\hbox{\rotate[\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]{\flushnextbox}}}% % no, not local % \@@layerxsiz\layerparameter\c!width % \@@layerysiz\layerparameter\c!height % never change that \@@layerxpos\layerparameter\c!x \@@layerypos\layerparameter\c!y - \doifelse{\layerparameter\c!hoffset}\v!max - {\@@layerxoff\@@layerxsiz}{\@@layerxoff\layerparameter\c!hoffset}% - \doifelse{\layerparameter\c!voffset}\v!max - {\@@layeryoff\@@layerysiz}{\@@layeryoff\layerparameter\c!voffset}% + \doifelse{\layerparameter\c!hoffset}\v!max{\@@layerxoff\@@layerxsiz}{\@@layerxoff\layerparameter\c!hoffset}% + \doifelse{\layerparameter\c!voffset}\v!max{\@@layeryoff\@@layerysiz}{\@@layeryoff\layerparameter\c!voffset}% % dx/dy are internal context ones and can be used in preset \advance\@@layerxoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dx\relax \advance\@@layeryoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dy\relax @@ -277,47 +262,30 @@ \@@layerypos\layerparameter\c!sy\@@layerypos \@@layerxoff\layerparameter\c!sx\@@layerxoff \@@layeryoff\layerparameter\c!sy\@@layeryoff - \doifelse{\layerparameter\c!position}\v!yes % combine ^ - {\setlastlayerpos{#2\currentlayer}% todo l/r %%%%%%%%%%%% - \@@layerxpos\lastlayerxpos - \@@layerypos\lastlayerypos - \letgvalue{\??ll\currentlayer\layerpage\c!position}\v!yes - \letgvalue{\??ll\currentlayer\c!state}\v!start % needed ? - \setbox\layerbox\vbox to \@@layerysiz - {\hbox to \@@layerxsiz{\xypos{lyr:\the\currentlayerdata}\hss}\vss}} - {\setbox\layerbox\emptybox - \globallet\lastlayerxpos\!!zeropoint - \globallet\lastlayerypos\!!zeropoint - \ExpandBothAfter\doifinset\v!bottom{\layerparameter\c!corner} - {\ifnum\layerparameter\c!line=\zerocount\else % can be < 0 - \setevalue{\??ll\currentlayer\c!line}% - {\the\numexpr-\layerparameter\c!line+\layoutlines+\plusone\relax}% - \fi - \ifdim\@@layerysiz>\zeropoint - \advance\@@layerypos-\@@layerysiz - \@@layerypos-\@@layerypos - \@@layeryoff-\@@layeryoff - \fi}% - \ExpandBothAfter\doifinset\v!right{\layerparameter\c!corner} - {\ifnum\layerparameter\c!column=\zerocount\else % can be < 0 - \setevalue{\??ll\currentlayer\c!column}% - {\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}% - \fi - \ifdim\@@layerxsiz>\zeropoint - \advance\@@layerxpos-\@@layerxsiz - \@@layerxpos-\@@layerxpos - \@@layerxoff-\@@layerxoff - \fi}% - \ExpandBothAfter\doif\v!middle{\layerparameter\c!corner} - {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos.5\@@layerxsiz \fi - \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi}% - \edef\layerpage{\layerparameter\c!page}}% - \doifsomething\layerpage - {\edef\layerpage{:\layerpage}% - \doifundefined{\@@layerbox#2\currentlayer\layerpage} - {\global\expandafter\newbox\csname\@@layerbox#2\currentlayer\layerpage\endcsname}}% - \dontcomplain % more comfortable - \mathchardef\layerpagebox\csname\@@layerbox#2\currentlayer\layerpage\endcsname + \edef\@@currentlayerposition{\layerparameter\c!position}% + \ifx\@@currentlayerposition\v!yes % combine ^ + \setlastlayerpos{#2\currentlayer}% sets \layerpage; todo l/r %%%%%%%%%%%% + \@@layerxpos\lastlayerxpos + \@@layerypos\lastlayerypos + \letgvalue{\??ll\currentlayer\layerpage\c!position}\v!yes + \letgvalue{\??ll\currentlayer\c!state}\v!start % needed ? + \setbox\layerbox\vbox to \@@layerysiz{\hbox to \@@layerxsiz{\xypos{lyr:\the\currentlayerdata}\hss}\vss}% + \else + \setbox\layerbox\emptybox + \globallet\lastlayerxpos\!!zeropoint + \globallet\lastlayerypos\!!zeropoint + \normalexpanded{\noexpand\doifinset{\v!bottom}{\layerparameter\c!corner}}\dosetlayerbottompositions + \normalexpanded{\noexpand\doifinset{\v!right }{\layerparameter\c!corner}}\dosetlayerrightpositions + \normalexpanded{\noexpand\doifinset{\v!middle}{\layerparameter\c!corner}}\dosetlayermiddlepositions + \edef\layerpage{\layerparameter\c!page}% + \fi + \ifx\layerpage\empty \else % is expanded + \edef\layerpage{:\layerpage}% + \ifcsname\@@layerbox#2\currentlayer\layerpage\endcsname \else + \expandafter\newbox\csname\@@layerbox#2\currentlayer\layerpage\endcsname + \fi + \fi + \chardef\layerpagebox\csname\@@layerbox#2\currentlayer\layerpage\endcsname \ifvoid\layerpagebox \gsetboxllx\layerpagebox\zeropoint \gsetboxlly\layerpagebox\zeropoint @@ -368,8 +336,7 @@ \advance\scratchdimen\nextboxwd \nextboxwd\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi \fi - \scratchdimen\@@layerypos - \advance\scratchdimen\@@layeryoff + \scratchdimen\dimexpr\@@layerypos+\@@layeryoff\relax \ifdim\scratchdimen<\getboxlly\layerpagebox \gsetboxlly\layerpagebox\scratchdimen \fi @@ -398,6 +365,30 @@ % to be placed; never change this ! \ifvoid\layerbox\else\box\layerbox\fi} +\def\dosetlayerbottompositions + {\ifnum\layerparameter\c!line=\zerocount\else % can be < 0 + \setevalue{\??ll\currentlayer\c!line}{\the\numexpr-\layerparameter\c!line+\layoutlines+\plusone\relax}% + \fi + \ifdim\@@layerysiz>\zeropoint + \advance\@@layerypos-\@@layerysiz + \@@layerypos-\@@layerypos + \@@layeryoff-\@@layeryoff + \fi} + +\def\dosetlayerrightpositions + {\ifnum\layerparameter\c!column=\zerocount\else % can be < 0 + \setevalue{\??ll\currentlayer\c!column}{\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}% + \fi + \ifdim\@@layerxsiz>\zeropoint + \advance\@@layerxpos-\@@layerxsiz + \@@layerxpos-\@@layerxpos + \@@layerxoff-\@@layerxoff + \fi} + +\def\dosetlayermiddlepositions + {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos.5\@@layerxsiz \fi + \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi} + %D Given the task to be accomplished, the previous macro is %D not even that complicated. It mainly comes down to skipping %D to the right place and placing a box on top of or below the @@ -406,16 +397,17 @@ %D \macros %D {doifelselayerdata} -%D \def\doifelselayerdata#1% - {\ifundefined{\@@layerbox#1}% - \@EA\secondoftwoarguments - \else\ifvoid\csname\@@layerbox#1\endcsname - \@EAEAEA\secondoftwoarguments + {\ifcsname\@@layerbox#1\endcsname + \ifvoid\csname\@@layerbox#1\endcsname + \@EAEAEA\secondoftwoarguments + \else + \@EAEAEA\firstoftwoarguments + \fi \else - \@EAEAEA\firstoftwoarguments - \fi\fi} + \@EA\secondoftwoarguments + \fi} %D \macros %D {flushlayer} @@ -427,95 +419,127 @@ % todo: setups before flush, handy hook -\unexpanded\def\flushlayer[#1]% - {\doifelsevalue{\??ll#1\c!state}\v!next - {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up - {\doifelsevalue{\??ll#1\c!state}\v!continue - {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up - {\doifelsevalue{\??ll#1\c!doublesided}\v!yes - {\doifundefinedelse{\@@layerbox#1}% - {\dodoflushlayerA[#1]} - {\doifbothsidesoverruled - {\dodoflushlayerB\v!left [#1]}% left - {\dodoflushlayerB\v!right[#1]}% right - {\dodoflushlayerB\v!left [#1]}}}% left - {\dodoflushlayerA[#1]}}}} - -\def\dodoflushlayerA[#1]% - {\doifnotvalue{\??ll#1\c!state}\v!stop - {\startoverlay - {\dodoflushlayer1{#1}{#1}} - {\dodoflushlayer0{#1}{#1:\realfolio}} - \stopoverlay}} - -\def\dodoflushlayerB#1[#2]% - {\doifnotvalue{\??ll#2\c!state}\v!stop - {\startoverlay - {\dodoflushlayer1{#2}{#2}} - {\dodoflushlayer0{#2}{#2:\realfolio}} - {\dodoflushlayer1{#2}{#1#2}} - {\dodoflushlayer0{#2}{#1#2:\realfolio}} - \stopoverlay}} - -\def\dodoflushlayer#1#2#3% - {\ifundefined{\@@layerbox#3}% - \ifcase#1\else\writestatus{layer}{unknown layer #3}\fi +% \unexpanded\def\flushlayer[#1]% +% {\doifelsevalue{\??ll#1\c!state}\v!next +% {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up +% {\doifelsevalue{\??ll#1\c!state}\v!continue +% {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up +% {\doifelsevalue{\??ll#1\c!doublesided}\v!yes +% {\doifundefinedelse{\@@layerbox#1}% +% {\dodoflushlayerA[#1]} +% {\doifbothsidesoverruled +% {\dodoflushlayerB\v!left [#1]}% left +% {\dodoflushlayerB\v!right[#1]}% right +% {\dodoflushlayerB\v!left [#1]}}}% left +% {\dodoflushlayerA[#1]}}}} + +\unexpanded\def\flushlayer[#1]% quite core, so optimized + {\begingroup + \forgetall + \edef\currentlayer{#1}% + \edef\@@currentlayerstate{\csname\??ll\currentlayer\c!state\endcsname}% + \ifx\@@currentlayerstate\v!stop + % nothing + \else\ifx\@@currentlayerstate\v!next + \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!start % dangerous, stack-built-up + \else\ifx\@@currentlayerstate\v!continue + \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!repeat % dangerous, stack-built-up \else - \bgroup - \forgetall - \offinterlineskip - % needed because we need to handle method - \executeifdefined{\??ll\??ll\getvalue{\??ll#2\c!preset}}\gobbletwoarguments{#2}{}% - % - \doifvalue{\??ll#2\c!option}\v!test\tracelayerstrue - \iftracelayers\traceboxplacementtrue\fi - \!!doneafalse - \!!donebfalse - \doifvalue{\??ll#2\c!method}\v!overlay\!!doneatrue - \doifvalue{\??ll#2\c!method}\v!fit\!!donebtrue - \!!donectrue - \ifcase#1\else - \doifnotvalue{\??ll#2\c!position}\v!yes - {\doifvalue{\??ll#2\c!repeat}\v!yes\!!donecfalse - \doifvalue{\??ll#2\c!state}\v!repeat\!!donecfalse}% - \fi - \mathchardef\layerbox\csname\@@layerbox#3\endcsname - % we need to copy in order to retain the negative offsets for a next - % stage of additions, i.e. llx/lly accumulate in repeat mode and the - % compensation may differ each flush depending on added content - \setbox\nextbox \if!!doneb -% \vbox -% {\scratchdimen\getboxlly\layerbox -% \vskip-\scratchdimen -% \scratchdimen\getboxllx\layerbox -% \hskip-\scratchdimen -% \advance\scratchdimen-\wd\layerbox -% \hsize-\scratchdimen -% \if!!donec\box\else\copy\fi\layerbox}% - \vbox - {\vskip-\getboxlly\layerbox - \hskip-\getboxllx\layerbox - \hsize-\dimexpr\getboxllx\layerbox-\wd\layerbox\relax - \if!!donec\box\else\copy\fi\layerbox}% + \edef\@@currentlayerdoublesided{\csname\??ll\currentlayer\c!doublesided\endcsname}% + \ifx\@@currentlayerdoublesided\v!yes + \ifcsname\@@layerbox#1\endcsname + % we can make a dedicated one for this + \doifbothsidesoverruled{\dodoflushlayerB\v!left}{\dodoflushlayerB\v!right}{\dodoflushlayerB\v!left}% + \else + \dodoflushlayerA + \fi \else - \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying + \dodoflushlayerA \fi - % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset) - \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi - {\hbox \if!!donea to \overlaywidth \fi - {% klopt dit? #3 en niet #2 ? - \doifvalue{\??ll#3\realfolio\c!position}\v!yes{\xypos{lyr:#3:\realfolio}}% - \doifoverlayelse{#3} - {\box\nextbox} - {\startlayoutcomponent{l:#3}{layer #3}\box\nextbox\stoplayoutcomponent}% - \hss}% - \vss}% - \if!!donec - \gsetboxllx\layerbox\zeropoint - \gsetboxlly\layerbox\zeropoint + \fi\fi\fi + \endgroup} + +% \ifcase#1\else\writestatus{layer}{unknown layer #3}\fi + +\def\dodoflushlayerA + {\startoverlay + {\ifcsname\@@layerbox\currentlayer \endcsname\dodoflushlayer\plusone \currentlayer \fi}% + {\ifcsname\@@layerbox\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{\currentlayer:\realfolio}\fi}% + \stopoverlay} + +\def\dodoflushlayerB#1% + {\startoverlay + {\ifcsname\@@layerbox \currentlayer \endcsname\dodoflushlayer\plusone \currentlayer \fi}% + {\ifcsname\@@layerbox \currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount {\currentlayer:\realfolio}\fi}% + {\ifcsname\@@layerbox#1\currentlayer \endcsname\dodoflushlayer\plusone {#1\currentlayer }\fi}% + {\ifcsname\@@layerbox#1\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{#1\currentlayer:\realfolio}\fi}% + \stopoverlay} + +\def\dodoflushlayer#1#2% quite core, so optimized + {\begingroup % already grouped + \offinterlineskip + \edef\@@currentlayermethod{\csname\??ll\currentlayer\c!method\endcsname}% + \edef\@@currentlayeroption{\csname\??ll\currentlayer\c!option\endcsname}% + % needed because we need to handle method but we should find a way to + % speed this up + \edef\@@currentlayerpreset{\csname\??ll\currentlayer\c!preset\endcsname}% + \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{}\fi + % + \ifx\@@currentlayeroption\v!test + \tracelayerstrue + \fi + \iftracelayers + \traceboxplacementtrue + \fi + \!!doneafalse + \!!donebfalse + \ifx\@@currentlayermethod\v!overlay\!!doneatrue\fi + \ifx\@@currentlayermethod\v!fit \!!donebtrue\fi + \!!donectrue + \ifcase#1\else + \edef\@@currentlayerposition{\csname\??ll\currentlayer\c!position\endcsname}% + \ifx\@@currentlayerposition\v!yes + \edef\@@currentlayerrepeat{\csname\??ll\currentlayer\c!repeat\endcsname}% + % \edef\@@currentlayerstate {\csname\??ll\currentlayer\c!state\endcsname}% actually this is already set + \ifx\@@currentlayerrepeat\v!yes + \!!donecfalse + \else\ifx\@@currentlayerstate\v!repeat + \!!donecfalse + \fi\fi \fi - \egroup - \fi} + \fi + \chardef\layerbox\csname\@@layerbox#2\endcsname % mathchardef no longer needed can be chardef or just let +% \chardef\layerbox\csname\@@layerbox\currentlayer\endcsname % mathchardef no longer needed can be chardef or just let + % we need to copy in order to retain the negative offsets for a next + % stage of additions, i.e. llx/lly accumulate in repeat mode and the + % compensation may differ each flush depending on added content + \setbox\nextbox + \if!!doneb + \therepositionededlayerbox + \else + \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying + \fi + % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset) + \doifoverlayelse{#2}{\setlayoutcomponentattribute\v!layer{#2}}\resetlayoutcomponentattribute + \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi \layoutcomponentboxattribute + {\hbox \if!!donea to \overlaywidth \fi + {\edef\@@currentlayerpageposition{\csname\??ll#2\realfolio\c!position\endcsname}% + \ifx\@@currentlayerpageposition\v!yes\xypos{lyr:#2:\realfolio}\fi + \box\nextbox + \hss}% + \vss}% + \if!!donec + \gsetboxllx\layerbox\zeropoint + \gsetboxlly\layerbox\zeropoint + \fi + \endgroup} + +\def\therepositionededlayerbox % assumes that \if!!donec is set (todo: use dedicated flags) + {\vbox + {\vskip-\getboxlly\layerbox + \hskip-\getboxllx\layerbox + \hsize-\dimexpr\getboxllx\layerbox-\wd\layerbox\relax + \if!!donec\box\else\copy\fi\layerbox}} % \definelayer[test][method=fit] \setupcolors[state=start] \tracelayerstrue % @@ -550,7 +574,7 @@ %D needed as well). \def\doresetlayer#1% - {\ifundefined{\@@layerbox#1}\else + {\ifcsname\@@layerbox#1\endcsname \global\setbox\csname\@@layerbox#1\endcsname\emptybox \fi} @@ -599,8 +623,7 @@ \def\MPlayerheight{\vsize} \def\dosetMPlayer[#1][#2][#3]% - {\checkpositions % new, else only support after \starttext - \edef\MPlayerwidth {\MPw{#2}}% + {\edef\MPlayerwidth {\MPw{#2}}% \edef\MPlayerheight{\MPh{#2}}% \setlayer[#1][\c!x=\MPx{#2},\c!y=\MPy{#2},\c!position=\v!no,#3]} @@ -613,12 +636,12 @@ \c!frame=\v!off, \c!offset=\v!overlay,#2]} -% Some day this (old) mechanism will be combined/integrated -% in overlays +% The next mechanism is obsolete and will be removed in \MKIV\ (or move to +% the compatibility module. -\newskip\xposition \newskip\yposition -\newskip\xdimension \newskip\ydimension -\newskip\xoffset \newskip\yoffset +% \newskip\xposition \newskip\yposition +% \newskip\xdimension \newskip\ydimension +% \newskip\xoffset \newskip\yoffset % already defined \newbox\positionbox diff --git a/tex/context/base/pack-obj.lua b/tex/context/base/pack-obj.lua index 3256b3702..ce1c520ce 100644 --- a/tex/context/base/pack-obj.lua +++ b/tex/context/base/pack-obj.lua @@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['pack-obj'] = { reusable components.</p> --ldx]]-- -local texsprint = tex.sprint +local texsprint, texcount = tex.sprint, tex.count jobobjects = jobobjects or { } jobobjects.collected = jobobjects.collected or { } diff --git a/tex/context/base/pack-obj.mkiv b/tex/context/base/pack-obj.mkiv index 6c1e54758..562b15e94 100644 --- a/tex/context/base/pack-obj.mkiv +++ b/tex/context/base/pack-obj.mkiv @@ -19,6 +19,170 @@ \registerctxluafile{pack-obj}{1.001} +% \startluacode +% local texbox, texdimen, texcount, texwrite = tex.box, tex.dimen, tex.count, tex.write +% local pdfxform, pdfrefxform = pdf.xform, pdf.refxform +% +% function pdf.xform (l) texbox["objectbox"] = nil return l end +% function pdf.refxform(l) return node.copy_list(l) end +% +% backends.codeinjections.register = pdf.xform +% backends.codeinjections.restore = pdf.refxform +% +% local codeinjections = backends.codeinjections +% +% objects = objects or { } +% +% local data = { } +% +% objects.data = data +% objects.n = 0 +% +% function objects.register(name) +% objects.n = objects.n + 1 +% local list = texbox.objectbox +% nodes.process_page(list) +% data[name] = { +% codeinjections.restore(list), +% texdimen.objectwd, +% texdimen.objectht, +% texdimen.objectdp, +% texdimen.objectoff, +% } +% end +% +% function objects.restore(name) +% local d = data[name] +% if d then +% texbox .objectbox = codeinjections.restore(d[1]) +% texdimen.objectwd = d[2] +% texdimen.objectht = d[3] +% texdimen.objectdp = d[4] +% texdimen.objectoff = d[5] +% else +% texbox .objectbox = nil +% texdimen.objectwd = 0 +% texdimen.objectht = 0 +% texdimen.objectdp = 0 +% texdimen.objectoff = 0 +% end +% end +% +% function objects.reference(name) +% local d = data[name] +% texwrite((d and d[1]) or 0) +% end +% +% function objects.enhance(name) +% local d = data[name] +% if d then +% d[6] = texcount.realpageno +% end +% end +% +% function objects.page(name) +% local d = data[name] +% texwrite((d and d[6]) or texcount.realpageno) +% end +% +% function objects.doifelse(name) +% commands.testcase(data[name]) +% end +% \stopluacode +% +% \newbox \objectbox +% \newtoks \everyobject +% \newif \ifinobject +% +% \newdimen\objectoff \def\objectmargin{\the\objectoff} +% \newdimen\objectwd \def\objectwidth {\the\objectwd } +% \newdimen\objectht \def\objectheight{\the\objectht } +% \newdimen\objectdp \def\objectdepth {\the\objectdp } +% +% \def\objectoffset{1cm} +% +% \everyobject{\the\everyPDFxform} +% +% \let\doresetobjects\relax +% +% \def\setobject #1#2{\begingroup\objectoff\objectoffset\inobjecttrue\the\everyobject\dowithnextbox{\dosetobject{#1}{#2}}} +% \def\settightobject#1#2{\begingroup\objectoff\zeropoint \inobjecttrue\the\everyobject\dowithnextbox{\dosetobject{#1}{#2}}} +% +% \let\objectsetvbox\vbox %\def\objectsetvbox{\ruledvbox} +% \let\objectgetvbox\vbox %\def\objectgetvbox{\ruledvbox} +% \let\objectsethbox\hbox %\def\objectsethbox{\ruledhbox} +% \let\objectgethbox\hbox %\def\objectgethbox{\ruledhbox} +% +% \def\dosetobject#1#2% +% {\objectwd\wd\nextbox +% \objectht\ht\nextbox +% \objectdp\dp\nextbox +% \ifdim\objectoff=\zeropoint\relax +% \setbox\objectbox\box\nextbox +% \else +% \setbox\objectbox\objectsetvbox spread 2\objectoff{\vss\objectsethbox spread 2\objectoff{\hss\flushnextbox\hss}\vss}% +% \fi +% \ctxlua{objects.register("#1::#2")}% +% \endgroup} +% +% \def\getobject#1#2% +% {\begingroup +% \ctxlua{objects.restore("#1::#2")}% +% \ifdim\objectoff=\zeropoint\relax \else +% \setbox\objectbox\objectgetvbox to \dimexpr\objectht+\objectdp\relax +% {\vss\objectgethbox to \objectwd{\hss\box\objectbox\hss}\vss}% +% \wd\objectbox\objectwd +% \ht\objectbox\objectht +% \dp\objectbox\objectdp +% \fi +% \box\objectbox +% \endgroup} +% +% \def\getpageobject#1#2% +% {\begingroup +% \ctxlua{objects.restore("#1::#2")}% +% \ifdim\objectoff=\zeropoint\relax +% \setbox\objectbox\objectgethbox{\ctxlatelua{objects.enhance("#1::#2")}\box\objectbox} +% \else +% \setbox\objectbox\objectgetvbox to \dimexpr\objectht+\objectdp\relax +% {\vss\objectgethbox to \objectwd{\ctxlatelua{objects.enhance("#1::#2")}\hss\box\objectbox\hss}\vss}% +% \wd\objectbox\objectwd +% \ht\objectbox\objectht +% \dp\objectbox\objectdp +% \fi +% \box\objectbox +% \endgroup} +% +% \def\setobjectdirectly #1#2{\ctxlua{objects.register("#1::#2")}} +% \def\getobjectdirectly #1#2{\ctxlua{objects.restore ("#1::#2")}} +% \def\getobjectdimensions #1#2{\ctxlua{objects.restore ("#1::#2")}} +% \def\doifobjectfoundelse #1#2{\ctxlua{objects.doifelse("#1::#2")}} +% \def\doifobjectreferencefoundelse#1#2{\ctxlua{objects.doifelse("#1::#2")}} +% +% \let\objectreferenced\relax +% \let\driverreferenced\relax +% +% \def\doregisterobjectreference{\writestatus{objects}{obsolete: register object reference}\gobblethreearguments} +% \def\dooverloadobjectreference{\writestatus{objects}{obsolete: overload object reference}\gobblethreearguments} +% \def\dosetobjectreference {\writestatus{objects}{obsolete: set object reference}\gobblethreearguments} +% \def\dosetdriverreference {\writestatus{objects}{obsolete: set driver reference}\gobblethreearguments} +% +% \def\defaultobjectreference{0} +% \def\defaultobjectpage {\realfolio} +% +% \def\dogetobjectreference #1#2#3{\xdef#3{\ctxlua{objects.reference("#1::#2)}}} +% \def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxlua{objects.page("#1::#2))}}} +% +% \protect +% +% \starttext +% test \setobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test +% \vskip3cm +% test \settightobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test +% test \settightobject{a}{c}\ruledhbox{xxx}\getobject{a}{c} test +% \dorecurse{5000}{test \setobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test } +% \stoptext + %D \macros %D {setobject,getobject,ifinobject} %D @@ -63,7 +227,7 @@ \fi} \def\dosetobject#1#2#3% \initializepaper this will move to \everyshipout - {\initializepaper + {% \initializepaper \ifcsname\r!object#2::#3\endcsname \expandafter\gobblefivearguments \else % tzt, overload internal referenced objects to save entries @@ -125,7 +289,7 @@ \csname\r!object#1::#2\endcsname} \def\dogetobject#1#2#3#4#5#6#7% don't change this, should work for dvi & pdf - {\initializepaper + {% \initializepaper \forgetall \dontshowcomposition \setbox\scratchbox\vbox diff --git a/tex/context/base/pack-rul.lua b/tex/context/base/pack-rul.lua index 11995bfed..6bbd3c856 100644 --- a/tex/context/base/pack-rul.lua +++ b/tex/context/base/pack-rul.lua @@ -7,36 +7,47 @@ if not modules then modules = { } end modules ['pack-rul'] = { } --[[ldx-- -<p>An explanation is given in <t>mk.pdf</t>.</p> +<p>An explanation is given in the history document <t>mk</t>.</p> --ldx]]-- +local texdimen, texcount, texbox, texwd = tex.dimen, tex.count, tex.box, tex.wd +local hpack, free, copy, traverse_id = node.hpack, node.free, node.copy_list, node.traverse_id + function commands.doreshapeframedbox(n) local noflines, lastlinelength = 0, 0 - if tex.wd[n] ~= 0 then - local hpack, free, copy = node.hpack, node.free, node.copy_list - local noflines, width, done = 0, 0, false - local list = tex.box[n].list - for h in node.traverse_id('hlist',list) do - done = true - local p = hpack(copy(h.list)) - lastlinelength = p.width - if lastlinelength > width then - width = lastlinelength + if texwd[n] ~= 0 then + local list = texbox[n].list + if list then + local width, done = 0, false + for h in traverse_id('hlist',list) do + local l = h.list + if l then + done = true + local p = hpack(copy(l)) + lastlinelength = p.width + if lastlinelength > width then + width = lastlinelength + end + free(p) + end end - free(p) - end - if done then - if width ~= 0 then - for h in node.traverse_id('hlist',list) do - if h.width ~= width then - h.list = hpack(h.list,width,'exactly') - h.width = width + if done then + if width ~= 0 then + for h in traverse_id('hlist',list) do + local l = h.list + if l then + -- if h.width ~= width then -- else no display math handling (uses shift) + h.list = hpack(l,width,'exactly') + h.shift = 0 -- needed for display math + h.width = width + -- end + end end end + texwd[n] = width end - tex.wd[n] = width end end - tex.dimen["framedlastlength"] = lastlinelength - tex.count["framednoflines"] = noflines + texdimen["framedlastlength"] = lastlinelength + texcount["framednoflines"] = noflines end diff --git a/tex/context/base/pack-rul.mkii b/tex/context/base/pack-rul.mkii index 042e8805d..055094547 100644 --- a/tex/context/base/pack-rul.mkii +++ b/tex/context/base/pack-rul.mkii @@ -2777,6 +2777,19 @@ \setfalse\framedtextlocationnone +\def\checkframedtext % messy dependency + {\ifinsidefloat + \localhsize\hsize + \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle + % \strut % rather clean way to invoke the sidefloat OTR + % \setbox0=\lastbox % and get the widths set, so from now on we + % \setlocalhsize % can have framed texts alongside sidefloats + \checksidefloat + \setlocalhsize + \else + \localhsize\hsize + \fi\fi} + \def\dododostartframedtext[#1][#2][#3]% #3 only passed to framed, not to framedtext {\doifsomething{#2}{\setvalue{\??kd#1\c!location}{#2}}% does not listen to #3 \setfalse\framedtextlocationnone diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index 574175dde..26fdaadea 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -26,7 +26,12 @@ \unprotect %D We have removed the rather old and out dated raster methods. They -%D have not been used for ages. +%D have not been used for ages. You can still find the old code in +%D the \MKII\ counterpart of this module. + +%D This module is rather optimized so sometimes readability has been +%D sacrisfied for speed. This is because the framing mechanism is used +%D all over the place. %D \macros %D {linewidth, setuplinewidth} @@ -58,81 +63,6 @@ \newdimen\ruledlinewidth \newif\ifinheritruledlinewidth -% %D \TEX\ lacks support for color and even gray scales. The next -% %D macros can provide a sort of poor mans gray scales as well -% %D as give access to more suitable methods of rendering. Such a -% %D method looks like: -% %D -% %D \starttyping -% %D \def\methodegraybox#1#2#3#4#5#6% -% %D { ... } -% %D \stoptyping -% %D -% %D The string \type{graybox} is a common element in the name, -% %D so we can have for instance \type {\postscriptgraybox} or -% %D \type {\texgraybox}. The first three arguments take a -% %D dimension, the fourth one takes a number between~0 and~1, -% %D and the last argument specifies a radius of the box when -% %D rounded corners are used, so: -% %D -% %D \startbuffer -% %D \dotgraybox{.5\hsize}{1cm}{0cm}{.85}{\v!no}{0pt} -% %D \stopbuffer -% %D -% %D \typebuffer -% %D -% %D becomes: -% %D -% %D %\startlinecorrection -% %D % \vbox to 1cm{\getbuffer} -% %D %\stoplinecorrection -% %D -% %D \startlinecorrection -% %D \unprotect -% %D \vbox to 1cm{\dotgraybox{.5\hsize}{1cm}{0cm}{.85}{\v!no}{0pt}} -% %D \protect -% %D \stoplinecorrection -% %D -% %D There are two predefined methodes, one uses periods and the -% %D other uses small rules. The second method is less -% %D efficient, but sometimes give better results. The dimensions -% %D of the resullting box are set to zero. -% -% \setvalue{\v!dot graybox}{\processraster\symbol\rasterdot} -% \setvalue{\v!rule graybox}{\processraster\symbol\rasterbox} -% -% \def\rasterdot{\rasterfont.} -% \def\rasterbox{\hss\vrule\!!width.4pt\!!height.4pt\!!depth\zeropoint} -% -% %D Now of course we need: -% -% \ifx\rasterfont\undefined \def\rasterfont{\fivepoint} \fi -% -% %D We implement two pure \TEX\ based generators, that use -% %D \type{\leaders} to quickly gerenate the gray pattern. One -% %D should beware of \DIMENSION\ conflicts, so we use some -% %D registers above~8. These macros are memory hungry and byte -% %D spoiling. -% -% \def\processraster#1#2#3#4#5#6#7% -% {\bgroup -% \forgetall -% \dontcomplain -% \dimen10=\onepoint -% \dimen10=\@@rsfactor\dimen10 -% \dimen10=#5\dimen10 -% \setbox2\hbox to #2 -% {\cleaders\hbox to 2\dimen10{#1\hss}\hss}% -% \dimen12=#3% -% \advance\dimen12 #4% -% % \setbox0\vbox to \dimen12 -% {\cleaders\vbox to 2\dimen10{\box2\vss}\vss}% -% \setbox0\hbox -% {\hskip-.5\dimen10\lower0.5\dimen10\copy0 -% \hskip-\wd0\hskip\dimen10\lower1.5\dimen10\box0}% -% \box0 -% \egroup} - %D \macros %D {setupscreens} %D @@ -144,25 +74,6 @@ \def\setupscreens {\dodoubleargument\getparameters[\??rs]} -% %D The most appropriate way to call for this feature is -% %D using \type{\graybox}, which is defined as: -% -% \def\graybox{\getvalue{\@@rsmethod graybox}} -% -% %D We just introduced two pure \TEX\ methods for generating -% %D rasters. However, it's far more efficient and comfortable in -% %D terms of speed, memory usage and file size, to use a driver -% %D supported method. -% -% \setvalue{\v!external graybox}{\setgraybox} -% -% %D For compatibility reasons we also define the original one: -% -% \setvalue{\v!postscript graybox}{\getvalue{\v!external graybox}} -% -% %D A quite valid way of letting drivers do the job, is giving -% %D a solid rule a gray texture. - %D We will communicate through module specific variables, current %D framed parameters and some reserved dimension registers. @@ -176,13 +87,14 @@ \def\dofilledbox {\bgroup - \doifelse{\framedparameter\c!backgroundcorner}\v!rectangular - {\dofilledlinedbox} - {\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize - \dofilledlinedbox - \else - \dofilledroundbox - \fi}% + \edef\@@framedfilledmod{\framedparameter\c!backgroundcorner}% + \ifx\@@framedfilledmod\v!rectangular + \dofilledlinedbox + \else\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize + \dofilledlinedbox + \else + \dofilledroundbox + \fi\fi \egroup} \def\dophantombox @@ -197,7 +109,11 @@ \def\dodostrokedroundbox {\bgroup \edef\ovalmod{\framedparameter\c!framecorner}% - \doifelse\ovalmod\v!round{\let\ovalmod\!!zerocount}{\edef\ovalmod{\number\ovalmod}}% + \ifx\ovalmod\v!round + \let\ovalmod\!!zerocount + \else + \edef\ovalmod{\number\ovalmod}% + \fi \edef\ovalwid{\the\frameddimenwd}% \edef\ovalhei{\the\frameddimenht}% \edef\ovaldep{\the\frameddimendp}% @@ -212,7 +128,11 @@ \def\dofilledroundbox {\bgroup \edef\ovalmod{\framedparameter\c!backgroundcorner}% - \doifelse\ovalmod\v!round{\let\ovalmod\!!zerocount}{\edef\ovalmod{\number\ovalmod}}% + \ifx\ovalmod\v!round + \let\ovalmod\!!zerocount + \else + \edef\ovalmod{\number\ovalmod}% + \fi \edef\ovalwid{\the\frameddimenwd}% \edef\ovalhei{\the\frameddimenht}% \edef\ovaldep{\the\frameddimendp}% @@ -387,6 +307,7 @@ \long\def\executedefinedoverlay#1#2% {\bgroup + \setlayoutcomponentattribute\v!overlay{#1}% \edef\overlaywidth {\the\frameddimenwd\space}% \edef\overlayheight{\the\dimexpr\frameddimenht+\frameddimendp\relax\space}% \edef\overlaydepth {\the\frameddimendp\space}% @@ -395,16 +316,14 @@ %\edef\overlayradius{\framedparameter\c!backgroundradius}% \let\overlayoffset\backgroundoffset % we steal this one \setbox\scratchbox\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}% - \setbox\scratchbox\hbox + \setbox\scratchbox\hbox \layoutcomponentboxattribute {\hskip-.5\dimexpr\wd\scratchbox-\overlaywidth \relax \raise-.5\dimexpr\ht\scratchbox-\frameddimenht\relax % not overlayheight ! \box\scratchbox}% - \wd\scratchbox\overlaywidth - \ht\scratchbox\overlayheight - \dp\scratchbox\overlaydepth - \startlayoutcomponent{o:#1}{overlay #1}% - \box\scratchbox - \stoplayoutcomponent + \wd\scratchbox\frameddimenwd + \ht\scratchbox\frameddimenht + \dp\scratchbox\frameddimendp + \box\scratchbox \egroup} %D The empty case is: @@ -414,7 +333,11 @@ %D For testing we provide: \def\doifoverlayelse#1% - {\doifdefinedelse{\??ov#1}} + {\ifcsname\??ov#1\endcsname + \expandafter\firstoftwoarguments + \else + \expandafter\secondoftwoarguments + \fi} %D We predefine two already familiar backgrounds: @@ -447,31 +370,6 @@ \let\currentbackground\empty -% \def\dodobackgroundbox#1% also less passing, we can get rid of the old method -% {\bgroup -% \def\currentbackground{#1}% -% \the\everybackgroundbox -% \setbox\extraframebox\hbox -% {\vbox{\moveleft\backgroundoffset\hbox{\executeifdefined{\??ov\currentbackground}\donothing}}}% -% \wd\extraframebox\zeropoint % \backgroundwidth -% \ht\extraframebox\backgroundheight -% \dp\extraframebox\backgrounddepth -% \box\extraframebox % \hskip-\backgroundwidth -% \egroup} - -% \def\dodobackgroundbox#1% also less passing, we can get rid of the old method -% {\bgroup -% \def\currentbackground{#1}% -% \ifcsname\??ov\currentbackground\endcsname -% \the\everybackgroundbox -% \setbox\extraframebox\hbox{\vbox{\moveleft\backgroundoffset\hbox{\csname\??ov\currentbackground\endcsname}}}% -% \wd\extraframebox\zeropoint % \backgroundwidth -% \ht\extraframebox\backgroundheight -% \dp\extraframebox\backgrounddepth -% \box\extraframebox % \hskip-\backgroundwidth -% \fi -% \egroup} - \def\dodobackgroundbox {\bgroup \ifcsname\??ov\currentbackground\endcsname @@ -486,7 +384,7 @@ \def\dododobackgroundbox#1,#2% #2 gobbles spaces {\edef\currentbackground{#1}% - \ifx\currentbackground\s!unknown\else + \ifx\currentbackground\s!unknown\else % use $ instead of s!unknown \dodobackgroundbox\expandafter\dododobackgroundbox \fi#2} @@ -495,60 +393,30 @@ \def\backgroundwidth {\the\hsize} \def\backgroundheight{\the\vsize} -% todo: also \def\theforegroundbox{#1} - -% \def\dobackgroundbox#1% -% {\setbox\framebox\vbox -% {\forgetall -% \boxmaxdepth\maxdimen -% \scratchdimen \framedparameter{#1}\relax -% \frameddimenwd\dimexpr\wd\framebox+2\scratchdimen\relax -% \frameddimenht\dimexpr\ht\framebox+ \scratchdimen\relax -% \frameddimendp\dimexpr\dp\framebox+ \scratchdimen+\framedparameter\c!backgrounddepth\relax -% \edef\backgroundoffset{\the\scratchdimen}% -% \edef\backgroundwidth {\the\wd\framebox}% -% \edef\backgroundheight{\the\ht\framebox}% -% \edef\backgrounddepth {\the\dp\framebox}% -% %\edef\foregroundbox{\box#1}% -% \def\foregroundbox% fuzzy but needed hack, this \vss, otherwise -% {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift -% \edef\component{\framedparameter\c!component}% -% \hbox to \backgroundwidth % in case 'foreground' is used as overlay -% {\ifx\component\empty -% \rawprocesscommalist[\framedbackground]\dodobackgroundbox -% \else -% \startlayoutcomponent{b:\component}{\s!background\space\component}% -% \rawprocesscommalist[\framedbackground]\dodobackgroundbox -% \stoplayoutcomponent -% \fi -% \box\framebox\hss}}} - \def\normalforegroundbox% fuzzy but needed hack, this \vss, otherwise {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift -\def\dobackgroundbox#1% +\def\dobackedbox {\setbox\framebox\vbox - {\forgetall + {\framedforgetall \boxmaxdepth\maxdimen - \scratchdimen \framedparameter{#1}\relax - \frameddimenwd\dimexpr\wd\framebox+2\scratchdimen\relax - \frameddimenht\dimexpr\ht\framebox+ \scratchdimen\relax - \frameddimendp\dimexpr\dp\framebox+ \scratchdimen+\framedparameter\c!backgrounddepth\relax - \edef\backgroundoffset{\the\scratchdimen}% + \frameddimenwd\dimexpr\wd\framebox+2\!!framedbackgroundoffset\relax + \frameddimenht\dimexpr\ht\framebox+ \!!framedbackgroundoffset\relax + \frameddimendp\dimexpr\dp\framebox+ \!!framedbackgroundoffset+\framedparameter\c!backgrounddepth\relax + \edef\backgroundoffset{\the\!!framedbackgroundoffset}% \edef\backgroundwidth {\the\wd\framebox}% \edef\backgroundheight{\the\ht\framebox}% \edef\backgrounddepth {\the\dp\framebox}% %\edef\foregroundbox{\box#1}% \edef\component{\framedparameter\c!component}% + \ifx\component\empty + \resetlayoutcomponentattribute + \else + \setlayoutcomponentattribute\v!background\component + \fi \let\foregroundbox\normalforegroundbox - \hbox to \backgroundwidth % in case 'foreground' is used as overlay - {\ifx\component\empty - \normalexpanded{\noexpand\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax - \else - \startlayoutcomponent{b:\component}{background \component}% - \normalexpanded{\noexpand\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax - \stoplayoutcomponent - \fi + \hbox to \backgroundwidth \layoutcomponentboxattribute % width in case 'foreground' is used as overlay + {\expandafter\dododobackgroundbox\framedbackground,\s!unknown,\relax % hm, messy .. look into it \box\framebox\hss}}} %D One can explictly insert the foreground box. For that @@ -565,14 +433,11 @@ %D by \TEX\ itself, the latter one depends on the driver. This %D macro also support a negative offset. -\ifx\scratchoffset\undefined \newdimen\scratchoffset \fi - \def\dooutlinebox % we needed to move the color command in order to apply attributes properly {\setbox\framebox\vbox % rules on top of box - {\scratchoffset \framedparameter\c!frameoffset\relax - \frameddimenwd\dimexpr\wd\framebox+2\scratchoffset\relax - \frameddimenht\dimexpr\ht\framebox+ \scratchoffset\relax - \frameddimendp\dimexpr\dp\framebox+ \scratchoffset+\framedparameter\c!framedepth\relax + {\frameddimenwd\dimexpr\wd\framebox+2\!!framedframeoffset\relax + \frameddimenht\dimexpr\ht\framebox+ \!!framedframeoffset\relax + \frameddimendp\dimexpr\dp\framebox+ \!!framedframeoffset+\framedparameter\c!framedepth\relax \ifdim\frameddimendp<\zeropoint \advance\frameddimenht \frameddimendp \scratchdimen-\frameddimendp @@ -584,7 +449,7 @@ {\doifsomething{\framedparameter\c!framecolor}{\color[\framedparameter\c!framecolor]}{\dostrokedbox}}% \setbox\extraframebox\hbox {\raise\scratchdimen\vbox - {\moveleft\scratchoffset + {\moveleft\!!framedframeoffset \box\extraframebox}}% \wd\extraframebox\wd\framebox \ht\extraframebox\ht\framebox @@ -592,13 +457,14 @@ \hbox{\box\framebox\hskip-\wd\extraframebox\box\extraframebox}}} \def\dostrokedbox - {\doifelse{\framedparameter\c!framecorner}\v!rectangular - {\dostrokedlinedbox} - {\ifzeropt\dimexpr\framedparameter\c!frameradius\relax % just in case of .x\bodyfontsize - \dostrokedlinedbox - \else - \dostrokedroundbox - \fi}} + {\edef\@@framedcornermod{\framedparameter\c!framecorner}% + \ifx\@@framedcornermod\v!rectangular + \dostrokedlinedbox + \else\ifzeropt\dimexpr\framedparameter\c!frameradius\relax % just in case of .x\bodyfontsize + \dostrokedlinedbox + \else + \dostrokedroundbox + \fi\fi} \def\dostrokedlinedbox {\setbox\scratchbox\null @@ -746,16 +612,12 @@ \presetlocalframed[\??ol] -% \unexpanded\def\framed -% {\bgroup -% \dodoubleempty\startlocalframed[\??ol]} - \newcount\framednesting \unexpanded\def\framed {\bgroup \advance\framednesting\plusone - \letvalue{\??ol:\the\framednesting\s!parent}\??ol + \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol \dodoubleempty\startlocalframed[\??ol:\the\framednesting]} \def\setupframed @@ -820,19 +682,19 @@ {\bgroup \inframedtrue \edef\@@framed{#1}% - % some hackery (no \dimexpr) - \scratchdimen\framedparameter\c!frameoffset - \setevalue{\@@framed\c!frameoffset}{\the\scratchdimen}% - \doifnot{\framedparameter\c!backgroundoffset}\v!frame - {\scratchdimen\framedparameter\c!backgroundoffset - \setevalue{\@@framed\c!backgroundoffset}{\the\scratchdimen}}% - % so far \setbox\framebox\hbox{#4}% \getparameters[\@@framed][#3]% no \expanded ! + \!!framedframeoffset\framedparameter\c!frameoffset + \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% + \ifx\@@framedbackgroundoffset\v!frame + \!!framedbackgroundoffset\!!framedframeoffset + \else + \!!framedbackgroundoffset\@@framedbackgroundoffset + \fi % not here, in calling macro: setups \removeframedboxdepth - \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}% - \ifx\framedforegroundcolor\empty\else\docolorframebox\fi +% \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}% +% \ifx\framedforegroundcolor\empty\else\docolorframebox\fi \edef\overlaylinecolor{\framedparameter\c!framecolor}% \edef\overlaylinewidth{\the\ruledlinewidth}% \edef\@@localframing {\framedparameter\c!frame}% @@ -850,6 +712,44 @@ \box\framebox \egroup} +%D Here is another fast one: + +\def\localbackgroundframed#1#2#3#4% tag box wd ht + {\setbox#2\vbox\bgroup + \inframedtrue + \edef\@@framed{\??ma#1}% + \expandafter\def\csname\??ma#1\c!component\endcsname{#1}% + \expandafter\def\csname\??ma#1\c!width \endcsname{#3}% + \expandafter\def\csname\??ma#1\c!height \endcsname{#4}% + \!!framedframeoffset\framedparameter\c!frameoffset + \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% + \ifx\@@framedbackgroundoffset\v!frame + \!!framedbackgroundoffset\!!framedframeoffset + \else + \!!framedbackgroundoffset\@@framedbackgroundoffset + \fi + \setbox\framebox\box#2% + \dp\framebox\zeropoint +% \removeframedboxdepth +% \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}% +% \ifx\framedforegroundcolor\empty\else\docolorframebox\fi + \edef\overlaylinecolor{\framedparameter\c!framecolor}% + \edef\overlaylinewidth{\the\ruledlinewidth}% + \edef\@@localframing {\framedparameter\c!frame}% + \ifx\@@localframing\v!overlay \else \ifx\@@localframing\v!none \else + \edef\framedrulethickness{\framedparameter\c!rulethickness}% + \ifx\framedrulethickness\empty\else + \ruledlinewidth\framedrulethickness\relax + \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi + \fi + \dooutlinebox % real or invisible frame + \fi \fi + \edef\framedbackground{\framedparameter\c!background}% + \ifx\framedbackground\empty\else\dobackedbox\fi +% \restoreframedboxdepth + \box\framebox + \egroup} + %D Before we go into details, we present (and implement) the %D main framing routine. I saw no real reason for splitting the %D next two macros into smaller pieces. The content will be @@ -907,15 +807,15 @@ \c!radius=.5\bodyfontsize, \c!rulethickness=\linewidth, \c!corner=\v!rectangular, - \c!depth=\!!zeropoint, + \c!depth=\zeropoint, %\c!foregroundcolor=, %\c!foregroundstyle=, %\c!background=, %\c!backgroundscreen=, %\c!backgroundcolor=, - \c!backgroundoffset=\!!zeropoint, + \c!backgroundoffset=\zeropoint, %\c!framecolor=, - \c!frameoffset=\!!zeropoint, + \c!frameoffset=\zeropoint, \c!backgroundcorner=\framedparameter\c!corner, \c!backgroundradius=\framedparameter\c!radius, \c!backgrounddepth=\framedparameter\c!depth, @@ -943,8 +843,8 @@ \c!radius=.5\bodyfontsize, \c!rulethickness=\linewidth, \c!corner=\v!rectangular, - \c!backgroundoffset=\!!zeropoint, - \c!frameoffset=\!!zeropoint, + \c!backgroundoffset=\zeropoint, + \c!frameoffset=\zeropoint, \c!backgroundcorner=\framedparameter\c!corner, \c!backgroundradius=\framedparameter\c!radius, \c!backgrounddepth=\framedparameter\c!depth, @@ -958,29 +858,33 @@ \newdimen\!!framedwidth \newdimen\!!framedheight \newdimen\!!framedscratch % so that users can use \scratchdimen +\newdimen\!!framedframeoffset +\newdimen\!!framedbackgroundoffset \let\setextraframedoffsets \relax \let\applyextraframedoffsets\relax +% todo: protect local \framednames + \def\startlocalframed[#1][#2]% {\bgroup \inframedtrue \edef\@@framed{#1}% - % this piece of pre expansion is needed (sometimes used circular) - \!!framedscratch\framedparameter\c!frameoffset - \setevalue{\@@framed\c!frameoffset}{\the\!!framedscratch}% - \doifnot{\framedparameter\c!backgroundoffset}\v!frame - {\!!framedscratch\framedparameter\c!backgroundoffset - \setevalue{\@@framed\c!backgroundoffset}{\the\!!framedscratch}}% - % to prevent deadlock in case of self refering \ifsecondargument % faster \getparameters[\@@framed][#2]% here ! \fi + \!!framedframeoffset\framedparameter\c!frameoffset + \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% + \ifx\@@framedbackgroundoffset\v!frame + \!!framedbackgroundoffset\!!framedframeoffset + \else + \!!framedbackgroundoffset\@@framedbackgroundoffset + \fi % new, experimental dirty hook \framedparameter\c!extras % to get the right spacing - \doifsomething{\framedparameter\c!foregroundstyle} - {\@EA\doconvertfont\csname\@@framed\c!foregroundstyle\endcsname\empty}% + \edef\fontattributehash{\framedparameterhash\c!foregroundstyle}% + \ifx\fontattributehash\empty\else\dosetfontattribute \fontattributehash\c!foregroundstyle\fi % beware, both the frame and background offset can be overruled % \edef\doframedsetups{\framedparameter\c!setups}% @@ -1043,7 +947,7 @@ \boxisoverlaidfalse \ifx\localoffset\v!default % new per 2-6-2000 \let\localoffset\defaultframeoffset - \letvalue{\@@framed\c!offset}\defaultframeoffset + \expandafter\let\csname\@@framed\c!offset\endcsname\defaultframeoffset \else \let\defaultframeoffset\localoffset \fi @@ -1087,12 +991,14 @@ \ifboxhasheight % obey user set height, also downward compatible \else - \doifsomething{\framedparameter\c!lines} - {\ifcase\framedparameter\c!lines\else - \!!framedheight\framedparameter\c!lines\lineheight + \edef\@@framedlines{\framedparameter\c!lines}% + \ifx\@@framedlines\empty\else + \ifcase\@@framedlines\else + \!!framedheight\@@framedlines\lineheight \edef\localheight{\the\!!framedheight}% \boxhasheighttrue - \fi}% + \fi + \fi \fi % this is now an option: width=local % @@ -1173,24 +1079,15 @@ \fi \fi \setextraframedoffsets - \edef\framedwidth % a new feature, visible for user - {\ifdim\!!framedwidth >\zeropoint\the\!!framedwidth \else\zeropoint\fi}% - \edef\framedheight% a new feature, visible for user - {\ifdim\!!framedheight>\zeropoint\the\!!framedheight\else\zeropoint\fi}% - % we need to register the (outer) color - \startregistercolor[\framedparameter\c!foregroundcolor]% - % first alternative - %\def\dowithframedbox% - % {\let\postprocessframebox\relax %new - % \aftergroup\stoplocalframed}% - % \afterassignment\dowithframedbox - % \setbox\framebox=\next} - % second alternative - %\dowithnextbox - % {\setbox\framebox\flushnextbox - % \let\postprocessframebox\relax %new - % \stoplocalframed} - % \next} + \edef\framedbackground{\framedparameter\c!background}% + \ifx\framedbackground\empty + \let\framedforgetall\forgetall + \else + \let\framedforgetall\relax + \forgetall + \fi + \edef\framedwidth {\ifdim\!!framedwidth >\zeropoint\the\!!framedwidth \else\!!zeropoint\fi}% a new feature, visible for user + \edef\framedheight{\ifdim\!!framedheight>\zeropoint\the\!!framedheight\else\!!zeropoint\fi}% a new feature, visible for user \@@startframedorientation \afterassignment\dodowithframebox \setbox\framebox\next} @@ -1240,7 +1137,6 @@ \def\stoplocalframed {\dontshowcomposition \@@stopframedorientation % hm, wrong place ! should rotate the result (after reshape) - \stopregistercolor \handleframedlocator\c!before\@@locallocation \ifboxhasformat \ifx\@@localautowidth\v!force @@ -1258,9 +1154,9 @@ \resetshapeframebox \fi\fi \fi -\ifconditional\boxcontentneedsprocessing - \mkdoprocessboxcontents\framebox -\fi + \ifconditional\boxcontentneedsprocessing + \mkdoprocessboxcontents\framebox + \fi \else \resetshapeframebox \fi @@ -1270,14 +1166,7 @@ \ifboxhasheight \ht\framebox\!!framedheight \fi - \doif{\framedparameter\c!empty}\v!yes - {\setbox\scratchbox\null - \wd\scratchbox\wd\framebox - \ht\scratchbox\ht\framebox - \dp\scratchbox\dp\framebox - \setbox\framebox\box\scratchbox}% - \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}% - \ifx\framedforegroundcolor\empty\else\docolorframebox\fi + \doif{\framedparameter\c!empty}\v!yes\dosetfakedframebox \ifboxhasextraoffset \applyextraframedoffsets \fi @@ -1297,19 +1186,35 @@ \ifboxhasframe % real or invisible frame \dooutlinebox \fi - \edef\framedbackground{\framedparameter\c!background}% \ifx\framedbackground\empty\else\dobackedbox\fi \handleframedlocator\c!after\@@locallocation \box\framebox \egroup \egroup} +\def\dosetfakedframebox + {\setbox\scratchbox\null + \wd\scratchbox\wd\framebox + \ht\scratchbox\ht\framebox + \dp\scratchbox\dp\framebox + \setbox\framebox\box\scratchbox} + +% test: (saves one forgetall) +% +% \edef\framedbackground{\framedparameter\c!background}% +% \ifx\framedbackground\empty +% \let\framedforgetall\forgetall +% \else +% \let\framedforgetall\relax +% \forgetall +% \fi + \def\installframedlocator#1#2#3% {\setvalue{\??oi:\c!location:\c!before:#1}{#2}% \setvalue{\??oi:\c!location:\c!after :#1}{#3}} \def\handleframedlocator#1#2% - {\getvalue{\??oi:\c!location:#1:#2}} + {\csname\??oi:\c!location:#1:#2\endcsname} \def\doprelocframedbox#1% {\scratchdimen\dimexpr#1+\ruledlinewidth\relax @@ -1688,14 +1593,6 @@ %D additional offset capabilities. The lot of calls to other %D macros makes this mechanism not that easy to comprehend. -%D Getting the backgrounds right takes less code. Again we -%D have to take care of additional offsets. - -\def\dobackedbox - {\doifelsevalue{\@@framed\c!backgroundoffset}\v!frame % new - {\dobackgroundbox\c!frameoffset} - {\dobackgroundbox\c!backgroundoffset}} - %D We handle left, right or middle alignment as well as fixed %D or free widths and heights. Each combination gets its own %D macro. @@ -1728,11 +1625,18 @@ %D The handlers: +\def\framedforgetall{\forgetall} + +\def\setframedforegroundcolor + {\edef\colorattributehash{\framedparameterhash\c!foregroundcolor}% + \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash\c!foregroundcolor\fi} + \def\doformatboxSomeFormat {\vbox to \!!framedheight \bgroup \let\postprocessframebox\relax - \forgetall + \framedforgetall + \setframedforegroundcolor \oninterlineskip \hsize\!!framedwidth \vsize\!!framedheight @@ -1750,7 +1654,8 @@ {\vbox to \!!framedheight \bgroup \let\postprocessframebox\relax - \forgetall + \framedforgetall + \setframedforegroundcolor \oninterlineskip \hsize\!!framedwidth \vsize\!!framedheight @@ -1768,7 +1673,8 @@ {\vbox to \!!framedheight \bgroup \let\postprocessframebox\relax - \forgetall + \framedforgetall + \setframedforegroundcolor \oninterlineskip \doframedsetups \raggedcommand @@ -1784,7 +1690,8 @@ {\vbox \bgroup \let\postprocessframebox\relax - \forgetall + \framedforgetall + \setframedforegroundcolor \oninterlineskip \hsize\!!framedwidth \doframedsetups @@ -1801,7 +1708,8 @@ {\vbox to \!!framedheight \bgroup \let\postprocessframebox\relax - \forgetall + \framedforgetall + \setframedforegroundcolor \vsize\!!framedheight \doframedsetups \vss @@ -1818,7 +1726,8 @@ {\hbox to \!!framedwidth \bgroup \let\postprocessframebox\relax - \forgetall + \framedforgetall + \setframedforegroundcolor \doframedsetups \hss \localstrut @@ -1830,6 +1739,7 @@ \def\doformatboxNoSize {\hbox \bgroup + \setframedforegroundcolor \let\postprocessframebox\relax \doframedsetups \localstrut @@ -1895,10 +1805,6 @@ %D of a centered box automatically (\type {fit}). When %D doing so, we need to reshape the box: -% The next implementation is frozen! It preserves the depth, -% otherwise we get problems with framed display math and auto -% width. - \newcount\framednoflines \newdimen\framedlastlength @@ -1910,15 +1816,6 @@ \let\framedboxheight\!!zeropoint \let\framedboxdepth \!!zeropoint -\chardef\reshapeframeboxmethod\plusone % 0=no flush, 1=old method 2=no depth messing - -% \newbox\luashapebox -% -% \def\doreshapeframedbox -% {\setbox\luashapebox\box\framebox -% \ctxlua{commands.doreshapeframedbox(\number\luashapebox)}% -% \setbox\framebox\box\luashapebox} - \def\doreshapeframedbox{\ifvbox\framebox\ctxlua{commands.doreshapeframedbox(\number\framebox)}\fi} %D The two variables \type {\framednoflines} and \type @@ -2164,23 +2061,24 @@ %D %D \showsetup{blackrule} -\def\doblackrule[#1]% - {\hbox\bgroup - \getparameters[\??bj][#1]% - \setstrut - \doif\@@bjwidth \v!max{\def\@@bjwidth {1em}}% - \doif\@@bjheight\v!max{\def\@@bjheight{\strutht}}% - \doif\@@bjdepth \v!max{\def\@@bjdepth {\strutdp}}% - \localstartcolor[\@@bjcolor]% +\def\complexblackrule[#1]% + {\hbox\bgroup\getparameters[\??bj][#1]\domakeblackrule\egroup} + +\def\simpleblackrule + {\hbox\bgroup\domakeblackrule\egroup} + +\def\domakeblackrule + {\doif\@@bjwidth \v!max{\def\@@bjwidth {1em}}% + \doif\@@bjheight\v!max{\setstrut\let\setstrut\relax\def\@@bjheight{\strutht}}% + \doif\@@bjdepth \v!max{\setstrut\def\@@bjdepth {\strutdp}}% + \startcolor[\@@bjcolor]% can be made faster, just direct attr \vrule \!!width \@@bjwidth \!!height\@@bjheight \!!depth \@@bjdepth - \localstopcolor - \egroup} + \stopcolor} -\unexpanded\def\blackrule - {\dosingleempty\doblackrule} +\definecomplexorsimple\blackrule %D \macros %D {blackrules} @@ -2225,7 +2123,7 @@ \advance\!!widtha -\scratchcounter\!!widthb \divide \!!widtha \@@bjn \fi}% - \localstartcolor[\@@bjcolor]% + \startcolor[\@@bjcolor]% \dorecurse\@@bjn {\vrule \!!width \!!widtha @@ -2233,7 +2131,7 @@ \!!depth \@@bjdepth \hskip\!!widthb}% \unskip - \localstopcolor + \stopcolor \egroup} \unexpanded\def\blackrules @@ -2774,6 +2672,19 @@ \setfalse\framedtextlocationnone +\def\checkframedtext % messy dependency + {\ifinsidefloat + \localhsize\hsize + \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle + % \strut % rather clean way to invoke the sidefloat OTR + % \setbox0=\lastbox % and get the widths set, so from now on we + % \setlocalhsize % can have framed texts alongside sidefloats + \checksidefloat + \setlocalhsize + \else + \localhsize\hsize + \fi\fi} + \def\dododostartframedtext[#1][#2][#3]% #3 only passed to framed, not to framedtext {\doifsomething{#2}{\setvalue{\??kd#1\c!location}{#2}}% does not listen to #3 \setfalse\framedtextlocationnone @@ -2829,7 +2740,7 @@ \vskip-\struttotal \verticalstrut \egroup - \forgetall + \forgetall % brrr too often \vskip-\lineheight % will be an option, not default % \setbaselinecorrections @@ -3322,7 +3233,6 @@ \fi \setbox2\vbox \ifcase\backgroundsplit\or to \textheight \fi % max split {\vskip\@@agtopoffset - \popsplitproperties \unvcopy2 \prevdepth\dp2 \obeydepth @@ -3430,14 +3340,15 @@ \def\startframedcontent[#1]% {\bgroup - \let\stopframedcontent\egroup - \doifnot{#1}\v!off - {\doifdefined{\??fc#1\c!frame} - {\def\stopframedcontent{\dostopframedcontent{#1}}% - \dostartframedcontent{#1}}}} + \doifelse{#1}\v!off + {\let\stopframedcontent\egroup} + {\ifcsname\??fc#1\c!frame\endcsname + \dostartframedcontent{#1}% + \fi}} \def\dostartframedcontent#1% - {\setbox\framebox\hbox\bgroup + {\def\stopframedcontent{\dostopframedcontent{#1}}% + \setbox\framebox\hbox\bgroup \setlocalhsize \hsize\localhsize \advance\hsize\dimexpr-\getvalue{\??fc#1\c!leftoffset}-\getvalue{\??fc#1\c!rightoffset} \relax @@ -3487,8 +3398,7 @@ \def\dobackgroundline#1% {\dowithnextbox {\hbox - {\localcolortrue - \startcolor[#1]% + {\startcolor[#1]% \vrule \!!width \nextboxwd \!!height\nextboxht @@ -3525,15 +3435,15 @@ \c!radius=.5\bodyfontsize, \c!rulethickness=\linewidth, \c!corner=\v!rectangular, - \c!depth=\!!zeropoint, + \c!depth=\zeropoint, \c!foregroundcolor=, \c!foregroundstyle=, \c!background=, \c!backgroundscreen=\@@rsscreen, \c!backgroundcolor=, - \c!backgroundoffset=\!!zeropoint, + \c!backgroundoffset=\zeropoint, \c!framecolor=, - \c!frameoffset=\!!zeropoint, + \c!frameoffset=\zeropoint, \c!backgroundcorner=\framedparameter\c!corner, \c!backgroundradius=\framedparameter\c!radius, \c!backgrounddepth=\framedparameter\c!depth, diff --git a/tex/context/base/page-app.tex b/tex/context/base/page-app.mkii index e5c149aa0..e5c149aa0 100644 --- a/tex/context/base/page-app.tex +++ b/tex/context/base/page-app.mkii diff --git a/tex/context/base/page-app.mkiv b/tex/context/base/page-app.mkiv new file mode 100644 index 000000000..e5c149aa0 --- /dev/null +++ b/tex/context/base/page-app.mkiv @@ -0,0 +1,225 @@ +%D \module +%D [ file=page-app, % from meta-fig +%D version=1998.01.15, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Independent page building, +%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 Page Macros / Applications} + +%D The fitting page code is moved from \type {meta-fig} to +%D here. + +\unprotect + +\definepapersize + [\??fp\s!dummy] + [\c!width=\fittingwd, + \c!height=\fittinght] + +\definelayout + [\??fp\s!dummy] + [\c!width=\fittingwd,\c!height=\fittinght,\c!location=\v!middle, + \c!topspace=\!!zeropoint,\c!backspace=\!!zeropoint, + \c!cutspace=\!!zeropoint,\c!bottomspace=\!!zeropoint, + \c!textdistance=\!!zeropoint,\c!lines=0,\c!grid=\v!no, + \c!top=\!!zeropoint,\c!bottom=\!!zeropoint, + \c!margin=\!!zeropoint,\c!edge=\!!zeropoint, + \c!leftmargin=\!!zeropoint,\c!leftedge=\!!zeropoint, + \c!rightmargin=\!!zeropoint,\c!rightedge=\!!zeropoint, + \c!header=\!!zeropoint,\c!footer=\!!zeropoint] + + +\def\dostartfittingpage[#1][#2]% + {\page % this is kind of tricky! there can be preceding page refs + \autostarttext + \bgroup % resulting in a zero height page; test fig-make ! + \def\currentfittingpage{#1}% + \dontcomplain + % runs under current page regime, i.e. page variables passed to mp + \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing + \setbox\scratchbox\hbox + \bgroup + % needed later \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing + \doifvalue{\currentfittingpage\c!margin}\v!page % undocumented + {\offsetbox + [\c!leftoffset=\backspace, + \c!rightoffset=\cutspace, + \c!topoffset=\topspace, + \c!bottomoffset=\bottomspace]\hbox}% + \bgroup + \scale[\c!scale=\getvalue{\currentfittingpage\c!scale}]% + \bgroup\localframed[\currentfittingpage]% + \bgroup} + +\def\dostopfittingpage + {\egroup % localframed + \egroup % scale + \egroup % offsetbox + \egroup % scratchbox + \edef\fittingwd{\the\wd\scratchbox}% + \edef\fittinght{\the\ht\scratchbox}% + \startlocallayout + \ifdim\fittinght<\lineheight + % write status : too small + \setbox\scratchbox\vbox to \lineheight{\vss\box\scratchbox\vss}% + \edef\fittinght{\the\lineheight}% + \fi + \let\checkcurrentlayout\relax % else interference with odd/even layout + \processaction + [\getvalue{\currentfittingpage\c!paper}] + [ \v!auto=>\let\fittingpapersize\printpapersize, + \s!unknown=>\let\fittingpapersize\commalistelement, + \s!default=>\def\fittingpapersize{\??fp\s!dummy}]% + \expanded{\setuppapersize[\??fp\s!dummy][\fittingpapersize]}% + \definelayout + [\v!page]% + [\c!location=\v!middle, + \c!width=\fittingwd, + \c!height=\fittinght]% + \setuplayout + [\v!page]% + \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!page=]% + \centerbox{\box\scratchbox}% + \stopmakeup + \stoplocallayout + \egroup + \autostoptext} + +%D \TEX\ pages (for \METAPOST\ pages, see \type {meta-fig}): + +\presetlocalframed[\??tg] + +\def\setupTEXpage + {\dodoubleargument\getparameters[\??tg]} + +\def\startTEXpage + {\dosingleempty\dostartTEXpage} + +\def\dostartTEXpage[#1]% + {\dostartfittingpage[\??tg][#1]\gobblespacetokens} + +\def\stopTEXpage + {\removelastspace + \dostopfittingpage} + +\setupTEXpage + [\c!scale=1000, + \c!strut=\v!no, + \c!align=\v!normal, % needed, else problems ! + \c!offset=\v!overlay, + \c!width=\v!fit, + \c!height=\v!fit, + \c!frame=\v!off] + +%D For Mojca: +%D +%D \starttyping +%D \startTEXstream \chapter{Bla} Hello world!\crlf Hello world! \stopTEXstream +%D \startTEXpage \chapter{Bla} Hello world!\crlf Hello world! \stopTEXpage +%D \stoptyping +%D +%D maybe I should support stream=yes in framed. + +\def\startTEXstream + {\dosingleempty\dostartTEXstream} + +\def\dostartTEXstream[#1]% + {\page + \defineoutputstream[tex]% + \enableoutputstream[tex]% + \def\stopTEXstream + {\disableoutputstream + \startTEXpage + \outputstreamunvbox[tex]% + \stopTEXpage}} + +%D Application pages (for an example, see \type {m-pstric}): + +\def\@@texapp{texapp} +\def\@@texdim{texdim} + +\def\saveTEXapplication#1#2% + {\immediate\openout\scratchwrite=\bufferprefix\@@texdim.tmp + \immediate\write\scratchwrite{\dimen#1=\the\ht\scratchbox}% + \immediate\write\scratchwrite{\dimen#2=\the\wd\scratchbox}% + \immediate\closeout\scratchwrite} + +\def\restoreTEXapplication + {\readlocfile{\bufferprefix\@@texdim.tmp}\donothing\donothing} + +\def\startTEXapplication + {\dosingleempty\dostartTEXapplication} + +\long\def\dostartTEXapplication[#1]#2#3\stopTEXapplication + {\bgroup + \bgroup + \let\f!temporaryextension\c!tex + \setbuffer[\@@texapp]% + \starttext + #2% preamble + \startTEXpage[#1]% + \topskip\zeropoint + \setbox\scratchbox\hbox{#3}% + \saveTEXapplication02% dimensions + \box\scratchbox + \stopTEXpage + \stoptext + \endbuffer + \egroup + \doifelse\jobsuffix{dvi}\donetrue\donefalse + \executesystemcommand{texexec \bufferprefix\@@texapp.tex --once --batch}% + \ifdone % eps + \executesystemcommand{dvips -E* -o \@@texapp.eps \@@texapp}% + \else % pdf + \executesystemcommand{dvips \bufferprefix\@@texapp}% + \executesystemcommand{ps2pdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}% +% \executesystemcommand{texmfstart pstopdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}% + \fi + \restoreTEXapplication % dimensions + \doifelse\jobsuffix{dvi}\donetrue\donefalse + \setbox\scratchbox\hbox + {\expanded{\externalfigure + [\bufferprefix\@@texapp.\ifdone eps\else pdf\fi] + [\c!object=\v!no]}}% + \setbox\scratchbox\hbox + {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}% + \wd\scratchbox\dimen0 + \ht\scratchbox\dimen2 + \dp\scratchbox\zeropoint + \box\scratchbox + \egroup} + +%D \macros +%D {startpagefigure} +%D +%D \starttyping +%D \starttext \pagefigure[two.1] \stoptext +%D \stoptyping + +\def\startpagefigure + {\dodoubleempty\dostartpagefigure} + +\def\dostartpagefigure[#1][#2]% + {\bgroup + \getparameters[\??ex][\c!offset=\v!overlay,#2]% + \startTEXpage[\c!offset=\@@exoffset]% + \externalfigure[#1][#2]\ignorespaces} % so we can put some text below the graphic + +\def\stoppagefigure + {\stopTEXpage + \egroup} + +\def\pagefigure + {\dodoubleempty\dopagefigure} + +\def\dopagefigure[#1][#2]% + {\dostartpagefigure[#1][#2]\stoppagefigure} + +\protect \endinput diff --git a/tex/context/base/page-bck.mkiv b/tex/context/base/page-bck.mkiv index 2522c882d..fae091c6a 100644 --- a/tex/context/base/page-bck.mkiv +++ b/tex/context/base/page-bck.mkiv @@ -15,6 +15,8 @@ % \chardef\kindofpagetextareas=1 will isolate graphics from backgrounds +% todo \fastlocalframed -> \localbackgroundframed + \unprotect %D \macros @@ -70,6 +72,45 @@ %D (On the 824 pages maps bibliography runtime went down from %D 309 to 299 seconds.) +% \let\currentotrbackground\empty +% +% \def\@@docheckbackground#1#2% +% {\ifcsname\currentotrbackground#1\endcsname +% \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\!!doneatrue\fi +% \fi} +% +% \def\@@nocheckbackground#1#2% +% {\ifcsname\currentotrbackground#1\endcsname +% \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\else\!!doneatrue\fi +% \fi} +% +% \def\checkbackground#1% +% {\edef\currentotrbackground{\??ma#1}% +% \begingroup +% \!!doneafalse +% \if!!donea\else\@@nocheckbackground\c!background \empty +% \if!!donea\else\@@docheckbackground\c!frame \v!on +% \if!!donea\else\@@nocheckbackground\c!foregroundcolor\empty +% \if!!donea\else\@@docheckbackground\c!leftframe \v!on +% \if!!donea\else\@@docheckbackground\c!rightframe \v!on +% \if!!donea\else\@@docheckbackground\c!topframe \v!on +% \if!!donea\else\@@docheckbackground\c!bottomframe \v!on \fi\fi\fi\fi\fi\fi\fi +% \if!!donea +% \endgroup\setusage \currentotrbackground +% \else +% \endgroup\resetusage\currentotrbackground +% \fi} +% +% \def\ifsomebackgroundfound#1% +% {\ifusage{\??ma#1}} +% +% \def\doifsomebackgroundelse#1% +% {\ifusage{\??ma#1}% +% \expandafter\firstoftwoarguments +% \else +% \expandafter\secondoftwoarguments +% \fi} + \let\currentotrbackground\empty \def\@@docheckbackground#1#2% @@ -82,7 +123,7 @@ \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\else\!!doneatrue\fi \fi} -\def\checkbackground#1% +\def\checkbackground#1% here we need an \ifempty primitive {\edef\currentotrbackground{\??ma#1}% \begingroup \!!doneafalse @@ -94,34 +135,49 @@ \if!!donea\else\@@docheckbackground\c!topframe \v!on \if!!donea\else\@@docheckbackground\c!bottomframe \v!on \fi\fi\fi\fi\fi\fi\fi \if!!donea - \endgroup\setusage \currentotrbackground + \endgroup\expandafter\let\csname\currentotrbackground\endcsname\relax \else - \endgroup\resetusage\currentotrbackground + \endgroup\expandafter\let\csname\currentotrbackground\endcsname\undefined \fi} \def\ifsomebackgroundfound#1% - {\ifusage{\??ma#1}} + {\ifcsname\??ma#1\endcsname} \def\doifsomebackgroundelse#1% - {\ifusage{\??ma#1}% + {\ifcsname\??ma#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} +\def\doifsomebackground#1% + {\ifcsname\??ma#1\endcsname + \expandafter\firstofoneargument + \else + \expandafter\gobbleoneargument + \fi} + %D The background mechanism falls back on the \type {\framed} %D macro. This means that all normal frame and overlay %D features can be used. +% \def\addsomebackground#1#2#3#4% area box width height / zero test added +% {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint +% \ifcsname\??ma#1\c!setups\endcsname % to be done +% \doifvaluesomething{\??ma#1\c!setups}{\setups[\csname\??ma#1\c!setups\endcsname]}% should not produce funny spaces ! +% \fi +% \setbox#2\vbox\fastlocalframed % maybe \superfastlocalframed{tag}{w}{h} +% [\??ma#1]% +% [\c!component=#1,\c!width=#3,\c!height=#4]% are width and height used? +% {\dp#2\zeropoint\box#2}% +% \fi\fi\fi} + \def\addsomebackground#1#2#3#4% area box width height / zero test added {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint \ifcsname\??ma#1\c!setups\endcsname % to be done - \doifvaluesomething{\??ma#1\c!setups}{\setups[\getvalue{\??ma#1\c!setups}]}% should not produce funny spaces ! + \doifvaluesomething{\??ma#1\c!setups}{\setups[\csname\??ma#1\c!setups\endcsname]}% should not produce funny spaces ! \fi - \setbox#2\vbox\fastlocalframed - [\??ma#1] - [\c!component=#1,\c!width=#3,\c!height=#4]% are width and height used? - {\dp#2\zeropoint\box#2}% + \localbackgroundframed{#1}{#2}{#3}{#4}% \fi\fi\fi} %D There are quite some backgrounds. At the bottom layer, @@ -179,10 +235,6 @@ \newdimen\pageoffset % bleed \newdimen\pagedepth -\let\pagebackgroundhoffset\!!zeropoint -\let\pagebackgroundvoffset\!!zeropoint -\let\pagebackgrounddepth \!!zeropoint - % \def\setbackgroundboxes % {\showmessage\m!layouts8\empty % \setbackgroundbox\leftbackground\relax @@ -204,30 +256,36 @@ \def\setbackgroundboxes {\ifnewbackground - \global\chardef\newrightbackground\plusone - \global\chardef\newleftbackground\plusone - \global\setbox\leftbackground\emptybox - \global\setbox\rightbackground\emptybox + \dosetbackgroundboxesr \fi - \doifbothsides - {\ifcase\newleftbackground \else - % \showmessage\m!layouts8\empty - \setbackgroundbox\leftbackground\relax - \global\chardef\newleftbackground\zerocount - \global\chardef\newrightbackground\zerocount - \fi} - {\ifcase\newleftbackground \else - % \showmessage\m!layouts8\empty - \setbackgroundbox\leftbackground\relax - \global\chardef\newleftbackground\zerocount - \fi} - {\ifcase\newrightbackground \else - % \showmessage\m!layouts8\empty - \setbackgroundbox\rightbackground\doswapmargins - \global\chardef\newrightbackground\zerocount - \fi}% + \doifbothsides\dosetbackgroundboxesa\dosetbackgroundboxesb\dosetbackgroundboxesc \ifx\@@mastate\v!repeat\else\global\newbackgroundfalse\fi} +\def\dosetbackgroundboxesr + {\global\chardef\newrightbackground\plusone + \global\chardef\newleftbackground\plusone + \global\setbox\leftbackground\emptybox + \global\setbox\rightbackground\emptybox} +\def\dosetbackgroundboxesa + {\ifcase\newleftbackground \else + % \showmessage\m!layouts8\empty + \setbackgroundbox\leftbackground\relax + \global\chardef\newleftbackground\zerocount + \global\chardef\newrightbackground\zerocount + \fi} +\def\dosetbackgroundboxesb + {\ifcase\newleftbackground \else + % \showmessage\m!layouts8\empty + \setbackgroundbox\leftbackground\relax + \global\chardef\newleftbackground\zerocount + \fi} +\def\dosetbackgroundboxesc + {\ifcase\newrightbackground \else + % \showmessage\m!layouts8\empty + \setbackgroundbox\rightbackground\doswapmargins + \global\chardef\newrightbackground\zerocount + \fi} + \def\addmainbackground#1% todo: dimension spec {\ifsomebackground \setbackgroundboxes @@ -237,25 +295,29 @@ \box#1}% \fi} -\def\setbackgroundoffsets +\newdimen\pagebackgroundhoffset +\newdimen\pagebackgroundvoffset +\newdimen\pagebackgrounddepth +\newdimen\pagebackgroundoffset + +\def\setbackgroundoffsets % used in menus (we can use ifcsname's here) {\ifsomebackground \ifnewbackground - \global\let\pagebackgroundhoffset\!!zeropoint - \global\let\pagebackgroundvoffset\!!zeropoint - \global\let\pagebackgrounddepth \!!zeropoint + \global\pagebackgroundhoffset\zeropoint + \global\pagebackgroundvoffset\zeropoint + \global\pagebackgrounddepth \zeropoint \doifsomebackgroundelse{\v!text\v!text}\donetrue\donefalse \ifdone\else\doifsomebackgroundelse\v!text\donetrue\donothing\fi \ifdone - \bgroup - \scratchdimen\getvalue{\??ma\v!page\c!offset}% + \begingroup + \scratchdimen\csname\??ma\v!page\c!offset\endcsname \doifsomebackgroundelse{\v!top\v!text}\donothing {\doifsomebackgroundelse{\v!bottom\v!text}\donothing - {\xdef\pagebackgroundhoffset{\the\scratchdimen}}}% + {\global\pagebackgroundhoffset\scratchdimen}}% \doifsomebackgroundelse{\v!text\v!rightedge}\donothing {\doifsomebackgroundelse{\v!text\v!leftedge}\donothing - {\xdef\pagebackgroundvoffset{\the\scratchdimen}% - \scratchdimen\getvalue{\??ma\v!page\c!depth}% - \xdef\pagebackgrounddepth{\the\scratchdimen}}}% - \egroup + {\global\pagebackgroundvoffset\scratchdimen + \global\pagebackgrounddepth\csname\??ma\v!page\c!depth\endcsname}}% + \endgroup \fi \fi \fi} @@ -288,7 +350,7 @@ \vfilll}% \smashbox#1} -\def\dodopagebodybackground#1#2% +\def\dodopagebodybackground#1#2% maybe helper {\ifdim#2>\zeropoint % added, faster \setbox\scratchbox\vbox to #2 \bgroup\hbox\bgroup @@ -308,17 +370,17 @@ \box\scratchbox\relax \fi} -\def\dododopagebodybackground#1#2#3#4% width height pos pos +\def\dododopagebodybackground#1#2#3#4% width height pos pos % maybe helper {\ifsomebackgroundfound{#3#4}% \ifdim#2>\zeropoint\relax \ifdim#1>\zeropoint\relax \ifcsname\??ma#3#4\c!setups\endcsname % to be done - \doifvaluesomething{\??ma#3#4\c!setups}{\setups[\getvalue{\??ma#3#4\c!setups}]}% should not produce funny spaces ! + \doifvaluesomething{\??ma#3#4\c!setups}{\setups[\csname\??ma#3#4\c!setups\endcsname]}% should not produce funny spaces ! \fi \fastlocalframed - [\??ma#3#4] - [\c!component=#3-#4] - {\vbox to #2{\vss\hbox to#1{\hss\getvalue{\??ma#3#4\c!command}\hss}\vss}}% + [\??ma#3#4]% + [\c!component=#3-#4]% + {\vbox to #2{\vss\hbox to#1{\hss\csname\??ma#3#4\c!command\endcsname\hss}\vss}}% \else \hskip#1% \fi @@ -371,17 +433,14 @@ \fi\fi\fi \doifelsevalue{\??ma\v!page\c!offset}\v!overlay {\global\pageoffset\zeropoint} - {\global\pageoffset\getvalue{\??ma\v!page\c!offset}}% - \global\pagedepth\getvalue{\??ma\v!page\c!depth}% - \xdef\pagebackgroundoffset{\the\pageoffset}% - \xdef\pagebackgrounddepth {\the\pagedepth }% + {\global\pageoffset\csname\??ma\v!page\c!offset\endcsname}% + \global\pagedepth\csname\??ma\v!page\c!depth\endcsname + \global\pagebackgroundoffset\pageoffset + \global\pagebackgrounddepth\pagedepth \doifelse\@@mastate\v!stop {\global\newbackgroundfalse} {\global\newbackgroundtrue }} -\let\pagebackgroundoffset\!!zeropoint -\let\pagebackgrounddepth \!!zeropoint - %D Each areas (currently there are $1+3+25+1=30$ of them) %D has its own low level framed object associated. @@ -426,8 +485,8 @@ \getparameters [\??ma\v!page] - [\c!offset=\!!zeropoint, % hm, so we need to force overlay elsewhere - \c!depth=\!!zeropoint] + [\c!offset=\zeropoint, % hm, so we need to force overlay elsewhere + \c!depth=\zeropoint] %D General setup: @@ -502,20 +561,3 @@ \somebackgroundfalse \protect \endinput - -%D Removed \quote {features}: -%D -%D \starttyping -%D \startinteraction -%D \doifmarginswapelse -%D {\copy\leftbackground} -%D {\copy\rightbackground}% -%D \stopinteraction -%D \stoptyping -%D -%D \starttyping -%D \edef\setpagebackgrounddepth% -%D {\dp#2=\the\dp#2}% -%D \setbox#2=\vbox\localframed[\??ma#1]{...} -%D \setpagebackgrounddepth -%D \stoptyping diff --git a/tex/context/base/page-flw.tex b/tex/context/base/page-flw.mkii index 3eb867a78..3eb867a78 100644 --- a/tex/context/base/page-flw.tex +++ b/tex/context/base/page-flw.mkii diff --git a/tex/context/base/page-flw.mkiv b/tex/context/base/page-flw.mkiv new file mode 100644 index 000000000..3eb867a78 --- /dev/null +++ b/tex/context/base/page-flw.mkiv @@ -0,0 +1,107 @@ +%D \module +%D [ file=page-flw, +%D version=2003.04.19, % from test-002 (1997) profile experiment +%D title=\CONTEXT\ Page Macros, +%D subtitle=Text Flows, +%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. + +\writestatus{loading}{ConTeXt Page Macros / Text Flows} + +%D This is high experimental and especially flushing may change (proper +%D spacing is the driving force here). + +\unprotect + +\def\definetextflow + {\dodoubleempty\dodefinetextflow} + +\def\dodefinetextflow[#1][#2]% flow settings + {\iffirstargument + \doiftextflowcollectorelse{#1} + {\setbox\textflowcollector{#1}\emptybox} + {\@EA\newbox\csname\??tx:c:#1\endcsname}% + \getparameters[\??tx:p:#1] + [\c!width=\hsize,\c!style=,#2]% + \fi} + +\def\textflowparameter#1#2{\csname\??tx:p:#1#2\endcsname} +\def\textflowcollector #1{\csname\??tx:c:#1\endcsname} + +\def\doiftextflowcollectorelse#1{\doifdefinedelse{\??tx:c:#1}} + +\def\doiftextflowelse#1% + {\doiftextflowcollectorelse{#1} + {\ifvoid\textflowcollector{#1}% + \expandafter\secondoftwoarguments + \else + \expandafter\firstoftwoarguments + \fi} + {\secondoftwoarguments}} + +\def\doiftextflow#1% + {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument} + +\def\starttextflow[#1]% + {\doiftextflowcollectorelse{#1} + {\global\setbox\textflowcollector{#1}\vbox + \bgroup + \unvbox\textflowcollector{#1}% + \hsize\textflowparameter{#1}\c!width + \doifsomething{\textflowparameter{#1}\c!style}% + {\doconvertfont{\textflowparameter{#1}\c!style}}% + \def\stoptextflow{\endgraf\egroup}} + {\let\stoptextflow\relax}} + +\def\flushtextflow#1% + {\doiftextflow{#1} + {\ifdim\ht\textflowcollector{#1}>\vsize + \setbox\scratchbox\vsplit\textflowcollector{#1} to \vsize + \unvbox\scratchbox + \else + \unvbox\textflowcollector{#1}% + \fi}} + +\protect \endinput + +% Example (dutch) +% +% \stelpapierformaatin [S6] +% \steltolerantiein [soepel,rek] +% \stelkleurenin [status=start] +% \stelvoetin [strut=nee] +% \stelwitruimtein [groot] +% +% \stellayoutin +% [rechterrand=5cm,breedte=passend,marge=0pt,randafstand=1cm, +% voet=4cm,voetafstand=1cm,hoofd=0cm] +% +% \stelteksttekstenin[rand][][\vbox{\flushtextflow{alpha}}] +% \stelvoettekstenin [rand][][\vbox{\flushtextflow{beta}}] +% \stelvoettekstenin [\vbox{\flushtextflow{gamma}}][] +% +% \definetextflow [alfa] [breedte=\rechterrandbreedte] +% \definetextflow [beta] [breedte=\rechterrandbreedte] +% \definetextflow [gamma] [breedte=\voethoogte] +% +% \starttekst +% +% \dorecurse{50} +% {\getrandomnumber{\funny}{0}{8} +% \ifcase\funny \starttextflow[alfa] \input tufte.tex \stoptextflow +% \or \starttextflow[beta] \input knuth.tex \stoptextflow +% \or \starttextflow[gamma] \input materie.tex \stoptextflow +% \or {\bf TUFTE}\quad \input tufte \par +% \or {\bf TUFTE}\quad \input tufte \par +% \or {\bf KNUTH}\quad \input knuth \par +% \or {\bf KNUTH}\quad \input knuth \par +% \or {\bf MATERIE}\quad \input materie \par +% \else {\bf MATERIE}\quad \input materie \par +% \fi} +% +% \stoptekst diff --git a/tex/context/base/page-imp.tex b/tex/context/base/page-imp.mkii index e4ece04a6..e4ece04a6 100644 --- a/tex/context/base/page-imp.tex +++ b/tex/context/base/page-imp.mkii diff --git a/tex/context/base/page-imp.mkiv b/tex/context/base/page-imp.mkiv new file mode 100644 index 000000000..fd0482585 --- /dev/null +++ b/tex/context/base/page-imp.mkiv @@ -0,0 +1,1298 @@ +%D \module +%D [ file=page-imp, % was: core-pag, +%D version=1998.01.15, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Pagebody Building (Imposition), +%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. + +% much of this can more to run time loading ! + +\writestatus{loading}{ConTeXt Page Macros / Pagebody Building} + +\unprotect + +% sizing bug: +% +% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe +% +% \starttext \dorecurse{10}{\input tufte \par} \stoptext + +% to be moved code: + +\newif\ifclipprintbox \clipprintboxtrue +%newif\ifclippagebox \clippageboxtrue + +\def\clippedprintbox#1#2% can be made more efficient, see other clipper + {\ifclipprintbox + \!!widthc \pagebackgroundoffset + \!!widtha \dimexpr\paperwidth + \!!widthc\relax + \!!heighta\dimexpr\paperheight+2\!!widthc\relax + \setbox#2\vbox to \paperheight{\vfill\box#2}% + \ht#2\paperheight + \wd#2\paperwidth + \setbox#2\vbox + {\framed + [\c!offset=\!!widthc,\c!strut=\v!no,\c!frame=\v!off] + {\box#2}}% + \setbox#2\hbox to \paperwidth + {\ifcase#1\relax + \!!widthb\zeropoint + \hskip-\!!widthc + \else + \!!widthb\!!widthc + \fi + \lower\!!widthc\hbox + {\clip + [\c!width=\!!widtha,\c!height=\!!heighta, + \c!hoffset=\!!widthb,\c!voffset=\zeropoint] + {\box#2}}}% + \wd#2\paperwidth + \ht#2\paperheight + \fi + \box#2\relax} + +\let\clippagebox \gobbleoneargument +\let\clipprintbox\gobbleoneargument + +% \setuppagenumbering[alternative=doublesided] +% \setupcolors[state=start] +% \setuppapersize[A4][A4,oversized] +% \setuplayout[location=middle,clipoffset=5mm] +% \setupbackgrounds +% [page] +% [frame=on,rulethickness=1mm, +% backgroundoffset=10mm,background=color,backgroundcolor=red] +% \starttext \dorecurse{10}{\input tufte \par} \stoptext + +\def\clippagebox % skip fast over false + {\ifdim\@@lyclipoffset>\zeropoint + \expandafter\doclippagebox + \else + \expandafter\gobbleoneargument + \fi} + +\def\doclippagebox#1% + {\!!widtha \wd#1% + \!!heighta\ht#1% + \!!deptha \dp#1% + \setbox#1\hbox + {\!!widthb \@@lyclipoffset + \advance\!!heighta\dimexpr\!!deptha+2\!!widthb\relax + \advance\!!widtha \!!widthb + \doifbothsides + {\advance\!!widtha\!!widthb \!!widthc-\!!widthb \hskip\!!widthc}% + {\!!widthc\zeropoint} + {\!!widthc-\!!widthb \hskip\!!widthc}% + \lower\!!widthb\hbox + {\clip + [\c!hoffset=\!!widthc, + \c!voffset=-\!!widthb, + \c!width=\!!widtha, + \c!height=\!!heighta]% + {\box#1}}}% + \wd#1\!!widtha + \ht#1\!!heighta + \dp#1\!!deptha} + +%D \macros +%D {starttextdata} +%D +%D This is a user macro (appending to every last shipout is not +%D really user friendly. + +\newtoks \collectedtextdata + +\long\def\starttextdata#1\stoptextdata + {\doglobal\appendtoks#1\to\collectedtextdata} + +\def\flushtextdata + {\vsmashed{\the\collectedtextdata}% all dimensions zero + \global\collectedtextdata\emptytoks + \globallet\flushtextdata\donothing} + +\prependtoks \flushtextdata \to \everylastshipout + +\def\installpagehandler#1#2% % a handler takes one argument: something to be boxed + {\setgvalue{\??pp:\c!method:#1}##1{#2{##1}}} % and shipped out (don't depend on the exact package) + +\installpagehandler\v!normal + {\ifarrangingpages\expandafter\actualarrange\else\expandafter\actualshipout\fi} + +\def\myshipout#1% + {\beforeshipout % voor de pagebody dus ! + \dontshowcomposition + \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{#1}% + \setnextrealpageno + \aftershipout} + +\newbox\postponedcontent + +\def\flushatshipout + {\dowithnextbox + {\global\setbox\postponedcontent\hbox to \zeropoint + {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt) + \unhbox\postponedcontent\unhbox\nextbox}% was \box + \global\ht\postponedcontent\zeropoint + \global\dp\postponedcontent\zeropoint + \global\wd\postponedcontent\zeropoint}% + \hbox} + +% \starttypen +% \def\pagestoshipout{1,3,5} +% \stoptypen + +\newcount\shippedoutpages + +\let\pagestoshipout\empty % {1,3,6} +\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even + +\def\actualshipout#1% + {\global\advance\shippedoutpages\plusone + % this is not resource safe! + \ifx\pagestoshipout\empty + \ifcase\whichpagetoshipout\relax + \donetrue + \or % 1 + \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi + \or % 2 + \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi + \else + \donetrue + \fi + \else % testen, aangepast / expanded nodig ? + \normalexpanded{\noexpand\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}% + \donetrue\donefalse + \fi + \ifdone + \shipout\vbox + {%\forgetall + \offinterlineskip + \dontcomplain + \scratchdimen-1in + \vskip\scratchdimen + \hskip\scratchdimen + \setbox0\hbox{#1}% just in case there are objects there, hook for testing + \finalizeshipoutbox0% + \setbox\scratchbox\hbox + {% before the main one ! + \ifcase\realfolio \or + \the\everyfirstshipout + \global\everyfirstshipout\emptytoks + \fi + % the main one + \the\everyshipout\relax + % always last (and after the main one) + \ifnum\realpageno=\lastpage\relax + \the\everylastshipout + \global\everylastshipout\emptytoks + \fi}% + \smashbox\scratchbox + \hbox % \setbox0=\box.. is nicer + {\box\scratchbox + \ifvoid\postponedcontent\else\box\postponedcontent\fi % evt ver naar links ! + \box0}}% + \else + \message + {[\ifarrangingpages arranged \fi page + \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace + not flushed]}% + \setbox0\hbox{#1}% + \deadcycles\zerocount + \fi} + +\def\actualarrange#1% + {\setbox0\hbox{#1}% + \pusharrangedpage0% + \deadcycles\zerocount} + +%D We need a couple of boxes for duplex printing \unknown + +\newbox\arrangedpageA \newbox\arrangedpageB + +%D \unknown\ and some for simulating big sheets. + +\newbox\arrangedpageC \newbox\arrangedpageD +\newbox\arrangedpageE \newbox\arrangedpageF +\newbox\arrangedpageG \newbox\arrangedpageH + +\newif\ifswaparranged +\newif\ifnegatearranged +\newif\ifmirrorarranged +\newif\ifdoublearranged + +\newif\ifarrangingdisabled + +\def\arrangedrotationO{0} +\def\arrangedrotationE{0} + +\newcounter\arrangedpageN +\newcounter\arrangedpageM + +\chardef\arrangedpageT=1 +\chardef\arrangedpageX=1 +\chardef\arrangedpageY=1 + +\def\calculatepaperoffsets#1% + {\scratchdimen\getvalue{\??pp#1\c!offset}% + \divide\scratchdimen \arrangedpageX + \global\advance\paperwidth -2\scratchdimen + \scratchdimen\getvalue{\??pp#1\c!offset}% + \divide\scratchdimen \arrangedpageY + \global\advance\paperheight-2\scratchdimen} + +\newconditional\arrangedbackgroundokay % more ifs -> conditionals + +\def\setuparranging[#1]% + {\ifarrangingdisabled \else + \doifelse{#1}\v!disable + {\global\arrangingdisabledtrue} + {\global\arrangingdisabledfalse}% + \global\arrangingpagestrue + \global\negatearrangedfalse + \global\mirrorarrangedfalse + \global\doublearrangedfalse + \gdef\arrangedrotationO{0}% + \gdef\arrangedrotationE{180}% + \processallactionsinset + [#1] + [ \v!mirrored=>\global\mirrorarrangedtrue, + \v!doublesided=>\global\doublearrangedtrue, + \v!negative=>\global\negatearrangedtrue, + \v!rotated=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270}, + 90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270}, + 180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0}, + 270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90}, + \s!reset=>\global\arrangingpagesfalse, + \v!background=>\global\settrue\arrangedbackgroundokay, + \s!unknown=>\checkinstalledpagearrangement\commalistelement]% + % no \s!default=> we can have aaa,,bbb + \ifx\handlearrangedpage\undefined + \global\arrangingpagesfalse + \fi + \doifcommonelse{#1}{90,270,\v!rotated} + {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution + \setuppapersize + \fi} + +\def\installpagearrangement #1 % + {\setgvalue{\??pp\??pp#1}} + +\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb + {\executeifdefined{\??pp\??pp#1}\donothing} + +\def\dosetuparrangement#1#2#3#4#5#6#7#8% + {\global\chardef\arrangedpageX #1% + \global\chardef\arrangedpageY #2% + \global\chardef\arrangedpageT #3% + \global\chardef\horizontalcutmarks#4% + \global\chardef\verticalcutmarks #5% + \global\let \pusharrangedpage #6% + \global\let \poparrangedpages #7% + \global\let \handlearrangedpage#8} + +\installpagearrangement {\v!normal} + {\global\arrangingpagesfalse} + +\installpagearrangement 2*16 + {\dosetuparrangement{4}{4}{16}{5}{5}% + \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax} + +\installpagearrangement 2*8 + {\dosetuparrangement{4}{2}{8}{5}{3}% + \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax} + +\installpagearrangement 2*4 + {\dosetuparrangement{2}{2}{4}{3}{3}% + \pusharrangedpageEIGHT\poparrangedpagesAB\relax} + +\installpagearrangement 2*2 + {\dosetuparrangement{2}{1}{2}{3}{2}% + \pusharrangedpageFOURA\poparrangedpagesAB\relax} + +\installpagearrangement 2**2 + {\dosetuparrangement{2}{1}{2}{3}{2}% + \pusharrangedpageFOURB\poparrangedpagesAB\relax} + +\installpagearrangement 2SIDE + {\dosetuparrangement{2}{1}{2}{3}{2}% + \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE} + +\installpagearrangement 2TOP + {\dosetuparrangement{1}{2}{2}{2}{3}% + \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP} + +\installpagearrangement 2UP + {\dosetuparrangement{2}{1}{4}{3}{2}% + \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP} + +\installpagearrangement 2DOWN + {\dosetuparrangement{1}{2}{4}{2}{3}% + \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN} + +\installpagearrangement 2*4*2 % one defined by Willy Egger: + {\dosetuparrangement{2}{2}{4}{3}{2}% + \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax} + +\installpagearrangement 2*2*4 % onother one of Willy Egger + {\dosetuparrangement{2}{1}{8}{3}{2}% + \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax} + +\installpagearrangement 2TOPSIDE + {\dosetuparrangement{1}{2}{4}{2}{3}% + \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP} + +% \def\filluparrangedpages % beware: \realpageno is 1 ahead +% {\ifarrangingpages +% \scratchcounter-\realpageno +% \divide\scratchcounter \arrangedpageT +% \multiply\scratchcounter \arrangedpageT +% \advance\scratchcounter \realpageno +% \advance\scratchcounter \minusone +% \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}% +% \fi} + +\def\filluparrangedpages % beware: \realpageno is 1 ahead + {\ifarrangingpages + \scratchcounter\numexpr\realpageno-\plusone\relax + \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter + \ifcase\scratchcounter\else + \advance\scratchcounter \plusone + \dostepwiserecurse\scratchcounter\arrangedpageT\plusone + {\noheaderandfooterlines\ejectdummypage}% + \fi + \fi} + +\def\handlearrangedpageXandY#1#2#3#4#5% + {\global\setbox#5\hbox to \arrangedpageX\paperwidth + {\setbox\scratchbox\vbox to \arrangedpageY\paperheight + {%\forgetall + \offinterlineskip + \dontcomplain + \vskip#4\paperheight + \hskip#3\paperwidth + \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}% + \vfill}% + \wd\scratchbox\zeropoint + \box\scratchbox\box#5\hss}} + +\def\gotonextarrangepage + {\global\advance\arrangeno \plusone + \def\pagecutmarksymbol{\the\arrangeno}} + +\def\outputarrangedbox#1% + {\bgroup + \gotonextarrangepage + \ifnum\arrangedrotationO\arrangedrotationE>\zerocount + \setbox#1\vbox + {\ifdoublearranged + \ifodd\arrangeno + \dorotatebox\arrangedrotationO\hbox{\box#1}% + \else + \dorotatebox\arrangedrotationE\hbox{\box#1}% + \fi + \else + \dorotatebox\arrangedrotationO\hbox{\box#1}% + \fi}% + \fi + \ifmirrorarranged + \setbox#1\vbox{\domirrorbox\vbox{\box#1}}% + \fi + \ifnegatearranged + \negatecolorbox{#1}% + \fi + \finishpagebox#1% + \ifconditional\arrangedbackgroundokay\addprintbackground#1\fi + \actualshipout{\box#1}% + \egroup} + +%D The format file can be 16K smaller when we postpone the +%D real arrangments. Some day ... + +% TOP + +% 32/16/8/4/SIDE + +\def\poparrangedpagesAB + {\ifnum\arrangedpageN>\zerocount + \dontcomplain + \paperwidth\arrangedpageX\paperwidth + \paperheight\arrangedpageY\paperheight + \outputarrangedbox\arrangedpageA + \outputarrangedbox\arrangedpageB + \doglobal\newcounter\arrangedpageN + \fi} + +\def\pusharrangedpageTHIRTYTWO#1% taco's challenge + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#1}033\arrangedpageA % 1 + \or \handlearrangedpageXandY{#1}003\arrangedpageB % 2 + \or \handlearrangedpageXandY{#1}100\arrangedpageB % 3 + \or \handlearrangedpageXandY{#1}130\arrangedpageA % 4 + \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5 + \or \handlearrangedpageXandY{#1}130\arrangedpageB % 6 + \or \handlearrangedpageXandY{#1}033\arrangedpageB % 7 + \or \handlearrangedpageXandY{#1}003\arrangedpageA % 8 + \or \handlearrangedpageXandY{#1}102\arrangedpageA % 9 + \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10 + \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11 + \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12 + \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13 + \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14 + \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15 + \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16 + \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17 + \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18 + \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19 + \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20 + \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21 + \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22 + \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23 + \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24 + \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25 + \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26 + \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27 + \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28 + \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29 + \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30 + \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31 + \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32 + \poparrangedpages + \fi} + +\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#1}031\arrangedpageA % 1 + \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2 + \or \handlearrangedpageXandY{#1}031\arrangedpageB % 3 + \or \handlearrangedpageXandY{#1}001\arrangedpageA % 4 + \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5 + \or \handlearrangedpageXandY{#1}130\arrangedpageB % 6 + \or \handlearrangedpageXandY{#1}100\arrangedpageB % 7 + \or \handlearrangedpageXandY{#1}130\arrangedpageA % 8 + \or \handlearrangedpageXandY{#1}120\arrangedpageA % 9 + \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10 + \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11 + \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12 + \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13 + \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14 + \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15 + \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16 + \poparrangedpages + \fi} + +\def\pusharrangedpageEIGHT#1% changed to match the official way of doing + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#1}011\arrangedpageA % 1 + \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2 + \or \handlearrangedpageXandY{#1}100\arrangedpageB % 3 + \or \handlearrangedpageXandY{#1}110\arrangedpageA % 4 + \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5 + \or \handlearrangedpageXandY{#1}110\arrangedpageB % 6 + \or \handlearrangedpageXandY{#1}011\arrangedpageB % 7 + \or \handlearrangedpageXandY{#1}001\arrangedpageA % 8 + \poparrangedpages + \fi} + +\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01} +\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10} + +\def\pusharrangedpageFOURdo#1#2#3% + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#3}010\arrangedpageA % 1 + \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB % 2/3 not {1} + \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB % 3/2 not {1} + \or \handlearrangedpageXandY{#3}000\arrangedpageA % 4 + \poparrangedpages + \fi} + +\def\pusharrangedpageSIDETOP#1% + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1 + \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2 + \poparrangedpages + \fi} + +\def\handlearrangedpageSIDE + {\global\wd\arrangedpageA\paperwidth + \global\wd\arrangedpageB\paperwidth + \global\setbox\arrangedpageA\hbox + {\box\arrangedpageA\box\arrangedpageB}% + \global\ht\arrangedpageA\paperheight} + +\def\handlearrangedpageTOP + {\global\ht\arrangedpageA\paperheight + \global\ht\arrangedpageB\paperheight + \global\setbox\arrangedpageA\vbox + {%\forgetall + \offinterlineskip\vskip\paperheight + \box\arrangedpageA\box\arrangedpageB}% + \global\setbox\arrangedpageB\box\scratchbox} % ? + +% 2UP/2DOWN / 1pt prevents overflow + +\def\splitoffarrangedpagesTWO + {\splittopskip\zeropoint + \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint + \scratchdimen\dimexpr\ht\arrangedpageB-\onepoint\relax + \ifdim\scratchdimen>\onepoint + \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen + \fi} + +\def\handlearrangedpageTWOUP + {\splitoffarrangedpagesTWO + \ifswaparranged + \global\setbox\arrangedpageA\hbox + {\clippedprintbox0\arrangedpageA + \clippedprintbox1\arrangedpageB}% + \swaparrangedfalse + \else + \global\setbox\arrangedpageA\hbox + {\clippedprintbox0\arrangedpageB + \clippedprintbox1\arrangedpageA}% + \swaparrangedtrue + \fi + \global\ht\arrangedpageA\paperheight + \global\setbox\arrangedpageB\box\scratchbox} + +\def\handlearrangedpageTWODOWN + {\splitoffarrangedpagesTWO + \global\ht\arrangedpageA\paperheight + \global\ht\arrangedpageB\paperheight + \ifswaparranged + \global\setbox\arrangedpageA\vbox + {%\forgetall + \offinterlineskip\vskip\paperheight + \box\arrangedpageA\box\arrangedpageB}% + \swaparrangedfalse + \else + \global\setbox\arrangedpageA\vbox + {%\forgetall + \offinterlineskip\vskip\paperheight + \box\arrangedpageB\box\arrangedpageA}% + \swaparrangedtrue + \fi + \global\setbox\arrangedpageB\box\scratchbox} + +\def\poparrangedpagesTWO + {\ifnum\arrangedpageN>\zerocount + \dontcomplain + \swaparrangedfalse + \doloop + {\handlearrangedpage + \bgroup + \paperwidth\arrangedpageX\paperwidth + \paperheight\arrangedpageY\paperheight + \ht\arrangedpageA\paperheight + \wd\arrangedpageA\paperwidth + \outputarrangedbox\arrangedpageA + \egroup + \ifdim\ht\arrangedpageB=\zeropoint + \exitloop + \fi}% + \doglobal\newcounter\arrangedpageN + \fi} + +\def\pusharrangedpageTWO#1% + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \global\setbox\arrangedpageB\vbox + {%\forgetall + \offinterlineskip + \unvbox\arrangedpageB + \allowbreak + \ht#1\onepoint + \dp#1\zeropoint + \vbox{\box#1}}} + +\def\poparrangedpagesTWOTOPSIDE + {\ifnum\arrangedpageN>\zerocount + \bgroup + \gdef\arrangedpageN{2}\poparrangedpagesTWO + \let\arrangedpageA\arrangedpageC + \let\arrangedpageB\arrangedpageD + \gdef\arrangedpageN{2}\poparrangedpagesTWO + \doglobal\newcounter\arrangedpageN + \egroup + \fi} + +\def\pusharrangedpageTWOTOPSIDE#1% + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1 + \or \handlearrangedpageXandY{#1}000\arrangedpageC % 2 + \or \handlearrangedpageXandY{#1}000\arrangedpageB % 1 + \or \handlearrangedpageXandY{#1}000\arrangedpageD % 2 + \poparrangedpages + \fi} + +%D Willy Egger's sheet simulations: + +\def\poparrangedpagesAtoH + {\ifnum\arrangedpageN>\zerocount + \dontcomplain + \paperwidth\arrangedpageX\paperwidth + \paperheight\arrangedpageY\paperheight + \outputarrangedbox\arrangedpageA + \outputarrangedbox\arrangedpageB + \outputarrangedbox\arrangedpageC + \outputarrangedbox\arrangedpageD + \outputarrangedbox\arrangedpageE + \outputarrangedbox\arrangedpageF + \outputarrangedbox\arrangedpageG + \outputarrangedbox\arrangedpageH + \doglobal\newcounter\arrangedpageN + \fi} + +% to arrange 16 pages on 2 sheets to form one booklet + +\def\poparrangedpagesAtoD + {\ifnum\arrangedpageN>\zerocount + \dontcomplain + \paperwidth\arrangedpageX\paperwidth + \paperheight\arrangedpageY\paperheight + \outputarrangedbox\arrangedpageA + \outputarrangedbox\arrangedpageB + \outputarrangedbox\arrangedpageC + \outputarrangedbox\arrangedpageD + \doglobal\newcounter\arrangedpageN + \fi} + +% to arrange 16 pages on 4 sheets to form one booklet + +\def\pusharrangedpageSIXTEENFOUR#1% + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1 + \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2 + \or \handlearrangedpageXandY{#1}010\arrangedpageC % 3 + \or \handlearrangedpageXandY{#1}000\arrangedpageD % 4 + \or \handlearrangedpageXandY{#1}010\arrangedpageE % 5 + \or \handlearrangedpageXandY{#1}000\arrangedpageF % 6 + \or \handlearrangedpageXandY{#1}010\arrangedpageG % 7 + \or \handlearrangedpageXandY{#1}000\arrangedpageH % 8 + \or \handlearrangedpageXandY{#1}010\arrangedpageH % 9 + \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10 + \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11 + \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12 + \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13 + \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14 + \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15 + \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16 + \poparrangedpages + \fi} + +% to arrange 16 pages on 2 sheets to form one booklet + +\def\pusharrangedpageSIXTEENTWO#1% + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \ifcase\arrangedpageN + \or \handlearrangedpageXandY{#1}011\arrangedpageA % 1 + \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2 + \or \handlearrangedpageXandY{#1}011\arrangedpageC % 3 + \or \handlearrangedpageXandY{#1}001\arrangedpageD % 4 + \or \handlearrangedpageXandY{#1}100\arrangedpageD % 5 + \or \handlearrangedpageXandY{#1}110\arrangedpageC % 6 + \or \handlearrangedpageXandY{#1}100\arrangedpageB % 7 + \or \handlearrangedpageXandY{#1}110\arrangedpageA % 8 + \or \handlearrangedpageXandY{#1}100\arrangedpageA % 9 + \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10 + \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11 + \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12 + \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13 + \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14 + \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15 + \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16 + \poparrangedpages + \fi} + +% % handy for stickers etc, this way we can treat them as page +% +% \setuppapersize [XY][A4] +% \setuppaper [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6] +% \setuplayout [page] [topspace=5mm,backspace=5mm] +% \setuplayout [page] +% \setuplayout [location=middle] +% \setuparranging [XY] +% \showframe +% +% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext + +\def\pusharrangedpageXY#1% + {\doglobal\increment\arrangedpageN + \reportarrangedpage\arrangedpageN + \doglobal\increment\arrangedpageM + \global\setbox\arrangedpageB\hbox + \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi + {\ifvoid\arrangedpageB\else + \unhbox\arrangedpageB + \ifdim\@@ppdx>\zeropoint \else \hss\fi + \hskip\@@ppdx + \ifdim\@@ppdx>\zeropoint \else \hss\fi + \fi + \box#1}% + \ifnum\arrangedpageM<\arrangedpageX\else + \global\setbox\arrangedpageA\vbox + \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi + {\offinterlineskip + \ifvoid\arrangedpageA\else + \unvbox\arrangedpageA + \ifdim\@@ppdy>\zeropoint \else \vss\fi + \vskip\@@ppdy + \ifdim\@@ppdy>\zeropoint \else \vss\fi + \fi + \box\arrangedpageB}% + \doglobal\newcounter\arrangedpageM + \fi + \ifnum\arrangedpageN<\arrangedpageT\else + \poparrangedpages + \fi} + +\def\poparrangedpagesXY + {\ifnum\arrangedpageN>\zerocount + \dontcomplain + \paperwidth\arrangedpageX\paperwidth + \paperheight \arrangedpageY\paperheight + \outputarrangedbox\arrangedpageA + \doglobal\newcounter\arrangedpageN + \doglobal\newcounter\arrangedpageM + \fi} + +\installpagearrangement XY + {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount + \pusharrangedpageXY\poparrangedpagesXY\relax} + +%D A crazy definition, don't guess who pushed me for the landscape option. + +\definepapersize + [XY] + [\c!height=\dimexpr\dimexpr\@@ppheight-\numexpr\@@ppny-1\relax\dimexpr\@@ppdy\relax\relax/\@@ppny\relax, + \c!width =\dimexpr\dimexpr\@@ppwidth -\numexpr\@@ppnx-1\relax\dimexpr\@@ppdx\relax\relax/\@@ppnx\relax] + +\setuppaper + [\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax, + \c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax] + +% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt] +% \definepageshift[test][vertical] [10pt,20pt,30pt,40pt,50pt] +% +% \setuppageshift[test] +% \setuppageshift[test][test] +% \setuppageshift[test][none] +% \setuppageshift[none][test] +% \setuppageshift[paper][test][test] % arrange only +% \setuppageshift[paper][test] % arrange only +% \setuppageshift[print][test][test] +% +% \showframe \dorecurse{100}{\input tufte \par} + +% #1=name #2=horizontal|vertical #3=shiftlist + +\def\definepageshift + {\dotripleargument\dodefinepageshift} + +\def\dodefinepageshift[#1][#2][#3]% + {\setvalue{\??pt#2:#1}{#3}} + +\letempty \hpageshifts \newcounter\nofhpageshifts +\letempty \vpageshifts \newcounter\nofvpageshifts + +% \let\shiftprintpagebox\gobbleoneargument +% \let\shiftpaperpagebox\gobbleoneargument + +\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts + {\ifx#2\empty + #1\zeropoint + \else + \doglobal\increment#3% + \getfromcommacommand[#2][#3]% + \ifx\commalistelement\empty + \globallet#3\!!plusone + \getfromcommacommand[#2][#3]% + \fi + \ifx\commalistelement\empty + #1\zeropoint + \else + #1=\commalistelement + \donetrue + \fi + \fi} + +\def\shiftpagebox#1% + {\donefalse + \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts + \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts + \ifdone % see also layout offsets, maybe \movebox + \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}% + \setbox#1\vbox + {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}% + \next + \fi} + +\def\setuppageshift + {\dotripleempty\dosetuppageshift} + +\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical + {\ifthirdargument % paper=arrange + \let\hpageshifts\empty + \let\vpageshifts\empty + \let\shiftprintpagebox\gobbleoneargument + \let\shiftpaperpagebox\gobbleoneargument + \doifdefined{\??pt\v!horizontal:#2} + {\edef\hpageshifts{\getvalue{\??pt\v!horizontal:#2}}}% + \doifdefined{\??pt\v!vertical :#3} + {\edef\vpageshifts{\getvalue{\??pt\v!vertical :#3}}}% + \doif{#1}\v!page{\let\shiftprintpagebox\shiftpagebox}% + \doif{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}% + \else\ifsecondargument + \doifinsetelse{#1}{\v!page,\v!paper} + {\setuppageshift[#1][#2][#2]} + {\setuppageshift[\v!page][#1][#2]}% + \else\iffirstargument + \setuppageshift[\v!page][#1][#1]% + \fi\fi\fi} + +%D One can (mis)use this mechanism, in close cooperation +%D with \PDFTEX\ to arrange pages of already produced files. +%D +%D \starttyping +%D \insertpages[file.pdf][1,3][n=30,width=18cm] +%D \stoptyping +%D +%D The pages are inserted in the text area, and even pages +%D are repositioned according to the width. In this example +%D empty pages are added after page 1 and 3. +%D +%D Selecting pages can be accomplished by: +%D +%D \starttyping +%D \filterpages[file.pdf][1,3,5][n=30,width=18cm] +%D \stoptyping +%D +%D One may pass \type {odd} or \type {even} instead of a +%D comma separated list. A third alternative is: +%D +%D \starttyping +%D \copypages[file.pdf][n=30,scale=950] +%D \stoptyping +%D +%D This macros inserts the page, according to the settings +%D provided. + +\def\insertpages + {\dotripleempty\doinsertpages} + +\def\doinsertpages[#1][#2][#3]% + {\doifassignmentelse{#2} + {\dodoinsertpages[#1][][#2]} + {\dodoinsertpages[#1][#2][#3]}} + +\def\dodoinsertpages[#1][#2][#3]% + {\bgroup + \dontcomplain + \getfiguredimensions[#1]% + \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]% + \doifinset0{#2}{\null\page}% + \dorecurse\@@ipn + {\dofilterpage{#1}\recurselevel + \doifinset\recurselevel{#2}{\null\page}}% + \egroup} + +\def\filterpages + {\dotripleempty\dofilterpages} + +\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported + {\bgroup + \dontcomplain + \getfiguredimensions[#1]% + \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]% + \doifelse{#2}\v!even + {\dorecurse\@@ipn + {\ifodd\recurselevel\relax\else\dofilterpage{#1}\recurselevel\fi}} + {\doifelse{#2}\v!odd + {\dorecurse\@@ipn + {\ifodd\recurselevel\relax\dofilterpage{#1}\recurselevel\fi}} + {\def\dodocommand##1% + {\ifnum##1>\@@ipn\else\dofilterpage{#1}{##1}\fi}% + \def\docommand##1% + {\dowithrange{##1}\dodocommand}% + \processcommalist[#2]\docommand}}% + \egroup} + +\def\dofilterpage#1#2% + {\hbox to \textwidth + {\ifdoublesided\ifdim\@@ipwidth>\zeropoint\relax\ifodd\realpageno\else + \hfill + \def\dowithfigure{\hskip-\@@ipwidth}% + \fi\fi\fi + \setbox0\hbox + {\externalfigure[#1][\c!page=#2,\c!height=\textheight]}% + \wd0\zeropoint + \box0} + \page} + +\def\copypages + {\dodoubleempty\docopypages} + +\def\docopypages[#1][#2]% + {\bgroup + \getfiguredimensions[#1]% + \getparameters[\??ip] + [\c!n=\noffigurepages, + \c!marking=\v!off, + \c!scale=\!!thousand, + \c!offset=\!!zeropoint, + #2]% + \dorecurse\@@ipn + {\vbox to \textheight + {\hsize\textwidth + \scratchdimen\@@ipoffset + \centeredbox + {\doifelse\@@ipmarking\v!on\cuthbox\hbox + {\ifdim\scratchdimen>\zeropoint\relax + \advance\vsize -2\scratchdimen + \advance\hsize -2\scratchdimen + \externalfigure[#1][\c!page=\recurselevel,#2,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]% + \else + \externalfigure[#1][\c!page=\recurselevel,#2,\c!offset=\v!overlay]% + \fi}}} + \page} + \egroup} + +%D \macros +%D {combinepages} +%D +%D Yet another way of postprocessing is handles by \type +%D {\combinepages}. This macro builds a matrix of pages from a +%D file, for example: +%D +%D \starttyping +%D \setuppapersize +%D [A4][A4] % or [A4,landscape][A4,landscape] +%D +%D \setuplayout +%D [header=0pt,footer=1cm, +%D backspace=1cm,topspace=1cm, +%D width=middle,height=middle] +%D +%D \setupfootertexts +%D [presentation---\currentdate\space---\space\pagenumber] +%D +%D \starttext +%D \combinepages[slides][nx=2,ny=3,frame=on] +%D \stoptext +%D \stoptyping +%D +%D One can influence the way the pages are combined. (This +%D will be explained some time.) + +\def\combinepages + {\dodoubleempty\docombinepages} + +\def\docombinepages[#1][#2]% a=perpag b=free + {\bgroup + \dontcomplain + \getfiguredimensions[#1]% + \getparameters + [\??ip] + [\c!alternative=\v!a, + \c!n=\noffigurepages,\c!nx=2,\c!ny=2,\c!start=1,\c!stop=\!!maxcard, + \c!distance=\bodyfontsize, + \c!bottom=\vfill,\c!top=\vss, + \c!left=\hss,\c!right=\hss, + \c!before=\page,\c!after=\page,\c!inbetween=\blank, + \c!frame=,\c!background=,\c!backgroundcolor=, + #2]% + \def\@@ipname{#1}% + \@@ipbefore + \expandcheckedcsname{\??ip::\c!alternative:}\@@ipalternative\v!b + \@@ipafter + \egroup} + +\setvalue{\??ip::\c!alternative:\v!a}% + {\globallet\combinedpagescounter\@@ipstart + \doloop + {\vbox to \textheight + {\hsize\textwidth % ? ? + \scratchdimen\@@ipdistance + \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax + \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax + \dorecurse\@@ipny + {\hbox to \hsize + {\dorecurse\@@ipnx + {\vbox to \!!heighta + {\hsize\!!widtha + \vsize\!!heighta + \@@iptop + \hbox to \hsize + {\@@ipleft + \ifnum\combinedpagescounter>\@@ipstop\relax + \globallet\@@ipn\!!zerocount + \else\ifnum\combinedpagescounter>\@@ipn \else + \externalfigure[\@@ipname] + [\c!object=\v!no, + \c!page=\combinedpagescounter, + \c!factor=\v!max, + \c!background=\@@ipbackground, + \c!backgroundcolor=\@@ipbackgroundcolor, + \c!frame=\@@ipframe]% + \fi\fi + \@@ipright} + \@@ipbottom}% + \doglobal\increment\combinedpagescounter + \hfil}% + \hfilneg} + \vfil}% + \vfilneg}% + \page + \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}} + +\setvalue{\??ip::\c!alternative:\v!c}% + {\globallet\combinedpagescounter\@@ipstart + \doloop + {\vbox to \textheight + {\hsize\textwidth % ? ? + \scratchdimen\@@ipdistance + \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax + \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax + \hbox to \hsize + {\dorecurse\@@ipnx + {\@@ipleft + \vbox to \textheight + {\hsize\!!widtha + {\dorecurse\@@ipny + {\@@iptop + \hbox to \hsize + {\vbox to \!!heighta + {\hsize\!!widtha + \vsize\!!heighta + \ifnum\combinedpagescounter>\@@ipstop\relax + \globallet\@@ipn\!!zerocount + \else\ifnum\combinedpagescounter>\@@ipn \else + \externalfigure[\@@ipname] + [\c!object=\v!no, + \c!page=\combinedpagescounter, + \c!factor=\v!max, + \c!background=\@@ipbackground, + \c!backgroundcolor=\@@ipbackgroundcolor, + \c!frame=\@@ipframe]% + \fi\fi}} + \doglobal\increment\combinedpagescounter + \@@ipbottom}% + \vfil}% + \vfilneg} + \hfil}% + \hfilneg}} + \page + \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}} + +\setvalue{\??ip::\c!alternative:\v!horizontal}{\getvalue{\??ip::\c!alternative:\v!a}} +\setvalue{\??ip::\c!alternative:\v!vertical }{\getvalue{\??ip::\c!alternative:\v!c}} + +\setvalue{\??ip::\c!alternative:\v!b}% + {\globallet\combinedpagescounter\@@ipstart + \doloop + {\startbaselinecorrection + \scratchdimen\@@ipdistance + \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax + \hbox to \hsize + {\dorecurse\@@ipnx + {\doglobal\increment\combinedpagescounter + \ifnum\combinedpagescounter>\@@ipn \else + \normalexpanded{\noexpand\externalfigure[\@@ipname] + [\c!page=\combinedpagescounter, + \c!width=\the\!!widtha,% todo \freezedimenmacro + \c!background=\@@ipbackground, + \c!backgroundcolor=\@@ipbackgroundcolor, + \c!frame=\@@ipframe]}% + \hfill + \fi}\hfillneg}% + \stopbaselinecorrection + \ifnum\combinedpagescounter<\@@ipn\relax + \@@ipinbetween + \else + \exitloop + \fi}} + +%D \macros +%D {setuppagecomment,startpagecomment} +%D +%D This command is not yet documented. Usage: +%D +%D \starttyping +%D \setuppagecomment[state=start,location=right] +%D +%D \startpagecomment +%D \input knuth +%D \stoppagecomment +%D \stoptyping + +\def\setuppagecomment + {\dosingleempty\dosetuppagecomment} + +\def\dosetuppagecomment[#1]% + {\getparameters[\??pc][#1]% + \doifelse\@@pcstate\v!start + {\doifinsetelse\@@pclocation{\v!bottom,\v!top} + {\setuppapersize[\c!left=\hskip\@@pcoffset]% + \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcheight\relax}% + \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset\relax}% + \defineoverlay[\v!pagecomment][\placepagecommentTB]} + {\setuppapersize[\c!top=\vskip\@@pcoffset]% + \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}% + \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}% + \defineoverlay[\v!pagecomment][\placepagecommentLR]}% + \processaction + [\@@pclocation] + [ \v!bottom=>{\setuppapersize[\c!bottom =\vss,\c!top =\vskip\@@pcoffset]}, + \v!top=>{\setuppapersize[\c!top =\vss,\c!bottom =\vskip\@@pcoffset]}, + \v!left=>{\setuppapersize[\c!left =\hss,\c!right=\hskip\@@pcoffset]}, + \v!right=>{\setuppapersize[\c!right=\hss,\c!left =\hskip\@@pcoffset]}]% + \definepapersize + [\v!pagecomment] + [\c!height=\@@pcpaperheight, + \c!width=\@@pcpaperwidth]% + \let\@@pcprintpapersize\printpapersize + \setuppapersize[\papersize][\v!pagecomment]% + \setupbackgrounds[\v!paper][\c!background=\v!pagecomment]} + {\doif\@@pcstate\v!stop % else initialization invokes backgrounds + {% this should be tested first + % \normalexpanded{\noexpand\setuppapersize[\papersize][\@@pcprintpapersize]}% + \setupbackgrounds[\v!paper][\c!background=]}}} + +\def\@@pcprintpapersize{\printpapersize} + +\def\placepagecommentTB + {\vbox to \printpaperheight + {%\forgetall + \hsize\printpaperwidth + \vskip\@@pcoffset + \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss + \hskip\@@pcoffset + \vbox to \@@pcheight + {%\forgetall + \hsize\paperwidth + \ifpagecomment + \getbuffer[\v!pagecomment]% + \global\pagecommentfalse + \fi}% + \hfill + \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}% + \vskip\@@pcoffset}} + +\def\placepagecommentLR + {\hbox to \printpaperwidth + {\hskip\@@pcoffset + \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss + \vbox to \printpaperheight + {%\forgetall + \vskip\@@pcoffset + \hsize\@@pcwidth + \ifpagecomment + \getbuffer[\v!pagecomment]% + \global\pagecommentfalse + \fi + \vss}% + \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}% + \hskip\@@pcoffset}} + +\newif\ifpagecomment + +\setvalue{\e!start\v!pagecomment}% + {\global\pagecommenttrue + \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]} + +\setuppagecomment + [\c!state=, % \v!stop would invoke background calculation + \c!location=\v!bottom, + \c!offset=.5cm, + \c!distance=.5cm, + \c!height=5cm, + \c!width=10cm] + +% This macro cuts a page into n parts that can be pasted +% together. + +\def\slicepages + {\dotripleempty\doslicepages} + +\def\doslicepages[#1][#2][#3]% + {\ifthirdargument + \dodoslicepages[#1][#2][#3]% + \else + \dodoslicepages[#1][#2][#2]% + \fi} + +\newcounter\slicedpagenumber + +\def\dodoslicepages[#1][#2][#3]% + {\bgroup + \dontcomplain + \globallet\slicedpagenumber\!!zerocount + \getfiguredimensions[#1] + \getparameters + [\??ip] + [\c!n=1, + \c!offset=\!!zeropoint, + \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint, + \c!width=\figurewidth,\c!height=\figureheight,#2] + \ifnum\@@ipn>\zerocount + \definepapersize + [\s!dummy][\c!height=\@@ipheight,\c!width=\@@ipwidth] + \setuppapersize + [\s!dummy][\s!dummy] + \setuplayout + [\c!backspace=\!!zeropoint,\c!topspace=\!!zeropoint, + \c!height=\v!middle,\c!width=\v!middle, + \c!textdistance=\!!zeropoint, + \c!header=\!!zeropoint,\c!footer=\!!zeropoint] + \fi + \dorecurse\noffigurepages + {\global\let\slicedpagenumber\recurselevel + \ifnum\@@ipn>\plusone + \dorecurse\@@ipn + {\let\xslice\recurselevel + \dorecurse\@@ipn + {\let\yslice\recurselevel + \clip + [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice] + {\scale + [\c!scale=\@@ipn000] + {\externalfigure[#1][\c!page=\slicedpagenumber]}} + \page}} + \else + \ifodd\slicedpagenumber\relax + \getparameters[\??ip][#2] + \else + \getparameters[\??ip][#3] + \fi + \hskip\@@ipoffset + \clip + [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset, + \c!height=\@@ipheight,\c!width=\@@ipwidth] + {\externalfigure[#1][\c!page=\slicedpagenumber]} + \page + \fi} + \egroup} + +% \starttext \slicepages[slice1.pdf][n=3] \stoptext + +\protect \endinput diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv index 4c230c1fd..249b6eca6 100644 --- a/tex/context/base/page-ini.mkiv +++ b/tex/context/base/page-ini.mkiv @@ -38,13 +38,6 @@ \fi -\ifx\recalculatelogos\undefined - - \let \recalculatelogos \relax - \let \addlogobackground \gobbleoneargument % <box> - -\fi - \ifx\recalculatebackgrounds\undefined \let \recalculatebackgrounds \relax @@ -132,22 +125,6 @@ % floats: % % tricky in balancing mode, a la huidige multi columns - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved \ifx\dosetuplayout\undefined % overloaded in page-lay ! @@ -455,17 +432,9 @@ \ifx\bye\undefined \def\bye{\par\vfill\supereject\end} \fi % plain tex command % floats -% -% \def\ejectinsert -% {\flushnotes -% \bgroup -% \noftopfloats\plusthousand -% \nofbotfloats\zerocount -% \doflushfloats -% \egroup} \def\ejectinsert - {\flushnotes + {%\flushnotes already done \bgroup \noftopfloats\plusthousand \nofbotfloats\zerocount @@ -481,7 +450,7 @@ \def\ejectdummypage {\endgraf \ifvmode \ejectinsert - \hardespatie % will be different + \fixedspace \vfill \gotonextpage \fi} @@ -490,7 +459,7 @@ {} \def\afterfinaloutput - {\forgetall + {%\forgetall \vskip\zeropoint\relax \ifvoid\normalpagebox \else \unvbox\normalpagebox @@ -507,36 +476,32 @@ \adaptfuzzypagegoal} % watch this hack! \def\dofinaloutput#1#2% \vbox: prevents spurious spaces in every..pagebody - {\beforefinaloutput + {\forgetall + \beforefinaloutput \the\everybeforeshipout % brrr not in shipout \the\pageboundsettings - \myshipout{\hbox{\vbox{\dopagebody#1#2\setpagecounters}}}% + \myshipout{\hbox{\vbox{\dopagebody#1#2}}}% is this hbox needed \the\everyaftershipout - \afterfinaloutput - \popproperties} % ... and here ... + \afterfinaloutput} \def\donofinaloutput#1#2% - {\beforefinaloutput + {\forgetall + \beforefinaloutput \the\everybeforeshipout \setpagecounters \message{[-\the\realpageno]}% - \setbox\scratchbox\hbox - {%\the\everyshipout % still needed here ? - \dopagebody#1#2}% + \setbox\scratchbox\hbox{\dopagebody#1#2}% \deadcycles\zerocount - \gotonextrealpage + \setnextrealpageno \the\everyaftershipout - \afterfinaloutput - \popproperties} % ... and here + \afterfinaloutput} % beware: \ifprocessingpages is in use -\ifx\checkpageversion\undefined \let\checkpageversion\relax \fi % todo: hook into \everybeforeshipout -\ifx\doflushspread \undefined \let\doflushspread \relax \fi % todo +\ifdefined\doflushspread\else \let\doflushspread\relax \fi % todo \def\finaloutput#1#2% - {\checkpageversion - \ifprocessingpages + {\ifprocessingpages \ifpageselected \@EAEAEA\dofinaloutput \else @@ -624,9 +589,8 @@ \offinterlineskip \vskip\topspace \hsize\paperwidth - \hfill\hbox{\placetestinfo\hskip.5cm}\vss + %\hfill\hbox{\placetestinfo\hskip.5cm}\vss % obsolete \settexthoffset\hskip\texthoffset % brrrr - %\tlap{\placeversioninfo}\vskip.5cm \vbox to 1cm{\vss\placeversioninfo\vss}}} \def\dotestinfo#1#2#3% @@ -651,44 +615,6 @@ \fi \fi\fi} -% this will be inserts some day - -% \installinsertion\referenceinfobox -% \installinsertion\registerinfobox -% \installinsertion\floatinfobox - -\newbox\referenceinfobox -\newbox\registerinfobox -\newbox\floatinfobox - -\def\referenceinfo{\dotestinfo\referenceinfobox} -\def\registerinfo {\dotestinfo\registerinfobox} -\def\floatinfo {\dotestinfo\floatinfobox} - -\def\placetestinfo - {\vbox to \makeupheight - {\forgetall - \infofont - \hsize10em - \ifvoid\floatinfobox\else - \strut \getmessage\m!systems{24}% - \vskip\!!sixpoint - \unvbox\floatinfobox - \vskip\!!twelvepoint - \fi - \ifvoid\referenceinfobox\else - \strut \getmessage\m!systems{25}% - \vskip\!!sixpoint - \unvbox\referenceinfobox - \vskip\!!twelvepoint - \fi - \ifvoid\registerinfobox\else - \strut \getmessage\m!systems{26}% - \vskip\!!sixpoint - \unvbox\registerinfobox - \fi - \vss}} - \version[\v!final] % bewaren tvb documentatie @@ -803,7 +729,7 @@ {\ifsavepagebody\global\setbox\savedpagebody\fi \vbox {\beginrestorecatcodes - \forgetall % igv problemen, check: \boxmaxdepth\maxdimen +% \forgetall % igv problemen, check: \boxmaxdepth\maxdimen \boxmaxdepth\maxdimen % new \dontcomplain % the following plugin uses and sets pagebox; beware: this @@ -854,7 +780,6 @@ \getmainbox#1#2}% including footnotes \ifcase\pageornamentstate \addmainbackground \pagebox - \addlogobackground \pagebox \fi \buildpagebox \pagebox \addstatusinfo \pagebox} @@ -870,8 +795,9 @@ \negateprintbox #1% \fi} +\appendtoks \restoreouterspacing \to \everybeforepagebody \appendtoks \restoreglobalbodyfont \to \everybeforepagebody -\appendtoks \restorecolumnsettings \to \everybeforepagebody +%appendtoks \restoreouterspacing \to \everybeforepagebody \ifx\nestednewbox\undefined \newbox\nestednextbox \fi @@ -881,14 +807,14 @@ {%\getallmarks % now in following token register \the\everybeforepagebody \starttextproperties - \gotonextsubpage % nog eens: als in pagina (tbv standaard opmaak) - \dontshowboxes % dan hier blokkeren en verderop resetten + \setnextsubpageno % nog eens: als in pagina (tbv standaard opmaak) + \dontshowboxes % dan hier blokkeren en verderop resetten % \shipoutfacingpage \checkmargeblokken \the\beforeeverypage - \flushtoks\beforepage + \normalexpanded{\global\beforepage\emptytoks\the\beforepage}% \scratchtoks\beforepage\global\beforepage\emptytoks\the\scratchtoks % was \flushtoks\beforepage \inpagebodytrue\buildpagebody#1#2% - \flushtoks\afterpage + \normalexpanded{\global\afterpage \emptytoks\the\afterpage }% \scratchtoks\afterpage \global\afterpage \emptytoks\the\scratchtoks % was \flushtoks\afterpage \the\aftereverypage \resetpagebreak %updatelistreferences % now in aftereverypage @@ -898,65 +824,12 @@ \newtoks\pageboundsettings -\prependtoks \initializepaper \to \pageboundsettings +% \prependtoks \initializepaper \to \pageboundsettings % not here \newif\ifpagebreakdisabled \pagebreakdisabledfalse -% \chardef\testpagemethod=0 % todo: \testnewpage[method=,lines=,voffset=] -% -% \def\testpage {\dotripleempty\dotestpage[\plusone]} -% \def\testpageonly{\dotripleempty\dotestpage[\plustwo]} -% -% \def\dotestpage[#1][#2][#3]% -% {%\relax % needed before \if -% \endgraf -% \ifpagebreakdisabled -% % do nothing -% \else -% %ifnum#1=\plusone\synchronizeoutput\fi -% \ifdim\pagegoal<\maxdimen \relax -% \ifdim\pagetotal<\pagegoal \relax -% \scratchdimen\lineheight -% \multiply\scratchdimen#2\relax -% \advance\scratchdimen \pagetotal -% \ifdim\lastskip<\parskip -% \advance\scratchdimen \parskip -% \fi -% \ifthirdargument -% \advance\scratchdimen#3\relax -% \fi -% \ifcase\testpagemethod -% \ifdim\scratchdimen>.99\pagegoal -% \vfill\eject % \penalty-\!!tenthousand\relax -% \fi -% \or -% \advance\scratchdimen-\pagegoal -% \ifdim\scratchdimen>-\lineheight -% \vfill\eject % \penalty-\!!tenthousand\relax -% \fi -% \or -% \getnoflines\pagegoal -% \advance\scratchdimen-\noflines\lineheight \relax -% \ifdim\scratchdimen>-\lineheight -% \vfill\eject % \penalty-\!!tenthousand\relax -% \fi -% \or % same as 0 but more accurate -% \advance\scratchdimen-10\s!sp\relax -% \ifdim\scratchdimen>\pagegoal -% \vfill\eject % \penalty-\!!tenthousand\relax -% \fi -% \fi -% \else -% % force page break / new -% % \vfill\eject % \penalty-\!!tenthousand\relax -% \fi -% \else -% \ifnum#1=\plusone\goodbreak\fi -% \fi -% \fi} - \chardef\testpagemethod \zerocount % todo: \testnewpage[method=,lines=,voffset=] \chardef\testpagetrigger\zerocount @@ -1075,38 +948,32 @@ \def\executepagebreakhandler#1% {\edef\@@pagespecification{#1}% - \doifdefinedelse{\??pe:\@@pagespecification} - {\getvalue{\??pe:\@@pagespecification}} - {\doifdefinedelse{\??pe::\@@pagespecification} - {\executepagebreakhandlers{\getvalue{\??pe::\@@pagespecification}}} - {\getvalue{\??pe:\s!unknown}}}} + \ifcsname\??pe:\@@pagespecification\endcsname + \csname\??pe:\@@pagespecification\endcsname + \else\ifcsname\??pe::\@@pagespecification\endcsname + \executepagebreakhandlers{\csname\??pe::\@@pagespecification\endcsname}% + \else + \csname\??pe:\s!unknown\endcsname + \fi\fi} \long\def\installpagebreakhandler#1#2% {\long\setvalue{\??pe:#1}{#2}} -% \definecomplexorsimple\pagebreak - -% \def\simplepagebreak -% {\executepagebreakhandler\v!ja} - -% \def\complexpagebreak[#1]% if empty, do nothing and avoid processing, -% {\flushnotes % see head's; watch how we group -% \doifsomething{#1}{\bgroup\executepagebreakhandlers{#1}\egroup}} - \unexpanded\def\pagebreak {\dosingleempty\dopagebreak} \def\dopagebreak[#1]% so, page ornaments are reset after a pagebreak command, unless set {\bgroup + \flushnotes \edef\prevrealpageno{\the\realpageno}% \ifcase\pageornamentstate \or % disable reset after shipout \global\chardef\pageornamentstate\plustwo \fi \iffirstargument % or if empty i.e. [] - \flushnotes\executepagebreakhandlers{#1}% + \executepagebreakhandlers{#1}% \else % so, no pagebreak when \pagebreak[] ! ! ! - \flushnotes\executepagebreakhandler\v!yes + \executepagebreakhandler\v!yes \fi \ifnum\prevrealpageno<\realpageno \global\chardef\pageornamentstate\zerocount @@ -1375,7 +1242,7 @@ \def\dodobeforeshipout#1% {\global\let\beforeshipout\relax - \getvalue{\??pg#1\c!before}} + \csname\??pg#1\c!before\endcsname} \def\dobeforeshipout {\doifsomething\currentpageselection @@ -1384,7 +1251,7 @@ \def\dododoaftershipout#1% {\global\let\aftershipout\relax \global\let\currentpageselection\empty - \getvalue{\??pg#1\c!after}} + \csname\??pg#1\c!after\endcsname} \def\dodoaftershipout#1% {\doifelsevalue{\??pg#1\c!option}\v!doublesided diff --git a/tex/context/base/core-ins.tex b/tex/context/base/page-ins.mkii index 069153434..069153434 100644 --- a/tex/context/base/core-ins.tex +++ b/tex/context/base/page-ins.mkii diff --git a/tex/context/base/page-ins.mkiv b/tex/context/base/page-ins.mkiv new file mode 100644 index 000000000..3e12bfcf0 --- /dev/null +++ b/tex/context/base/page-ins.mkiv @@ -0,0 +1,94 @@ +%D \module +%D [ file=core-ins, +%D version=2002.04.16, +%D title=\CONTEXT\ Insertion Macros, +%D subtitle=Insertions, +%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 Core Macros / Insertions} + +%D Insertions are special data collections that are associated +%D to \TEX's internal page builder. When multiple footnote +%D classes were introduced, I decided to isolate some of the +%D functionality in a module. + +\unprotect + +\newtoks\@@insertionlist + +\def\processinsertions{\the\@@insertionlist} + +\let\doprocessinsert\gobbleoneargument + +\def\installinsertion#1% + {\ifdefined#1\else + \let#1\relax + \fi + \ifx#1\relax % permits \csname...\endcsname + \newinsert#1% + \count#1\plusthousand + \skip #1\zeropoint + \dimen#1\maxdimen + \appendtoks\doprocessinsert#1\to\@@insertionlist + \fi} + + +\def\synchronizeinsertions + {\def\doprocessinsert##1{\ifvoid##1\else\insert##1{\unvbox##1}\fi}% + \processinsertions} + +%D For instance, when we postpone footnotes, we need to save +%D some data related to the inserts. The next methods are +%D far from ideal, but better than nothing. We save and +%D restore box content and associated data independently. +%D The box content is only restores when non||void. + +\def\backupinsertion#1% + {\csname\string#1\endcsname} + +\def\installbackupinsertion#1% + {\expandafter\newinsert\csname\string#1\endcsname + \count\backupinsertion#1\zerocount + \skip \backupinsertion#1\zeropoint + \dimen\backupinsertion#1\maxdimen} + +\def\saveinsertionbox#1% + {\ifdim\ht#1>\zeropoint % hm, actually unknown + \global\setbox\backupinsertion#1\box#1% + \else + \global\setbox\backupinsertion#1\emptybox + \fi} + +\def\restoreinsertionbox#1% + {\ifvoid\backupinsertion#1\else % if void, we keep the content + \global\setbox#1\box\backupinsertion#1% + \fi} + +\def\eraseinsertionbackup#1% + {\global\setbox\backupinsertion#1\emptybox} + +\def\saveinsertiondata#1% + {\global\skip \backupinsertion#1\skip #1% + \global\count\backupinsertion#1\count#1% + \global\dimen\backupinsertion#1\dimen#1} + +\def\restoreinsertiondata#1% + {\global\skip #1\skip \backupinsertion#1% + \global\count#1\count\backupinsertion#1% + \global\dimen#1\dimen\backupinsertion#1} + +%D Auxiliary macros: + +\def\addinsertionheight#1\to#2% + {\ifvoid#1\else + \advance#2 1\skip#1\relax + \advance#2 \ht #1\relax + \fi} + +\protect \endinput diff --git a/tex/context/base/page-lay.tex b/tex/context/base/page-lay.mkii index c8525643f..de1194c2a 100644 --- a/tex/context/base/page-lay.tex +++ b/tex/context/base/page-lay.mkii @@ -1150,11 +1150,11 @@ %D \showsetup{showsetups} %D %showsetup{showmargins} -\fetchruntimecommand \showprint {page-run} -\fetchruntimecommand \showframe {page-run} -\fetchruntimecommand \showlayout {page-run} -\fetchruntimecommand \showsetups {page-run} -\fetchruntimecommand \showmargins {page-run} +\fetchruntimecommand \showprint {page-run.mkii} +\fetchruntimecommand \showframe {page-run.mkii} +\fetchruntimecommand \showlayout {page-run.mkii} +\fetchruntimecommand \showsetups {page-run.mkii} +\fetchruntimecommand \showmargins {page-run.mkii} %D The default dimensions are quite old and will not change. %D The funny fractions were introduced when we went from fixed diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv new file mode 100644 index 000000000..5d0b06418 --- /dev/null +++ b/tex/context/base/page-lay.mkiv @@ -0,0 +1,1404 @@ +%D \module +%D [ file=page-lay, +%D version=2000.10.20, % copied from main-001 +%D title=\CONTEXT\ Page Macros, +%D subtitle=Layout Specification, +%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 Page Macros / Layout Specification} + +%D This module is now etex dependent. + +% to be translated into english + +% hoofdhoogte wordt bij status=hoog niet aangepast op outer +% level, wel binnen bepaalde berekeningen + +%D Before you start wondering why some of the page related +%D modules skip upward or left in order to place elements, you +%D must realize that the reference point is the top left +%D corner of the main typesetting area. One reason for this +%D choice is that it suited some viewers that displayed page +%D areas. Another reason is that margins, edges and top and +%D bottom areas are kind of virtual, while the header, text +%D and footer areas normally determine the text flow. + +\unprotect + +%D First we get rid of the funny \TEX\ offset defaults of one +%D inch by setting them to zero. + +\voffset = 0pt % setting this to -1in let's go metapost crazy +\hoffset = 0pt % setting this to -1in let's go metapost crazy + +%D The dimensions related to layout areas are represented by +%D real dimensions. + +\newdimen\paperheight \paperheight = 297mm +\newdimen\paperwidth \paperwidth = 210mm + +\newdimen\printpaperheight \printpaperheight = \paperheight +\newdimen\printpaperwidth \printpaperwidth = \paperwidth + +\newdimen\makeupheight % calculated +\newdimen\makeupwidth % calculated + +\newdimen\textheight % calculated +\newdimen\textwidth % calculated + +\newdimen\topspace \topspace = 2cm +\newdimen\backspace \backspace = \topspace +\newdimen\cutspace \cutspace = 0pt +\newdimen\bottomspace \bottomspace = 0pt + +\newdimen\headerheight \headerheight = 2cm +\newdimen\footerheight \footerheight = \headerheight + +\newdimen\topoffset \topoffset = 0pt +\newdimen\backoffset \backoffset = \topoffset + +\newdimen\leftmarginwidth \leftmarginwidth = 3cm +\newdimen\rightmarginwidth \rightmarginwidth = \leftmarginwidth + +\newdimen\leftedgewidth \leftedgewidth = 3cm +\newdimen\rightedgewidth \rightedgewidth = \leftedgewidth + +\newdimen\topheight \topheight = 0cm +\newdimen\bottomheight \bottomheight = \topheight + +\newcount\layoutlines \layoutlines = 0 +\newcount\layoutcolumns \layoutcolumns = 0 +\newdimen\layoutcolumndistance \layoutcolumndistance = 0pt +\newdimen\layoutcolumnwidth \layoutcolumnwidth = 0pt + +%D We can save some tokens and fuzzy parameters by using a +%D symbolic name for the current set of layout parameters. + +\let\currentlayout\empty + +\def\layoutparameter#1% + {\csname\??ly\ifcsname + \??ly\currentlayout#1\endcsname\currentlayout + \fi#1\endcsname} + +\def\namedlayoutparameter#1#2% + {\csname\??ly\ifcsname\??ly #1#2\endcsname#1\else + \ifcsname\??ly\currentlayout#2\endcsname\currentlayout + \fi\fi#2\endcsname} + +%D Beause normal \TEX\ has at most 256 dimensions (of which a +%D substantial part is already in use), we provide a way to +%D generate a format with macro based alternatives. For a long +%D time, this used to be the default case. Beware: only fixed +%D dimensions can be used in calculations! By the way, the +%D gain in speed can hardly be called impressive and is roughly +%D 1 second on a 35 second run of 850 empty pages with a +%D couple of backgrounds only (which is far less than one +%D percent on a normal document). + +%D The next series of dimensions are complemented by left +%D and rights ones. + +\newdimen \margindistance +\newdimen \edgedistance +\newdimen \marginwidth +\newdimen \edgewidth + +%D Because a distance does not really makes sense when there +%D is no area, we use a zero distance in case there is no +%D area. + +\def\layoutdistance#1#2% + {\ifdim\zeropoint<#1\layoutparameter#2\else\zeropoint\fi} + +%D The horizontal distances are: + +\newdimen \leftedgedistance +\newdimen \rightedgedistance +\newdimen \leftmargindistance +\newdimen \rightmargindistance + +%D The vertical distances are: + +\newdimen \topdistance +\newdimen \headerdistance +\newdimen \footerdistance +\newdimen \bottomdistance + +%D We need to calculate the extra distances: + +\def\setlayoutdimensions + {\global\marginwidth \layoutparameter\c!margin + \global\edgewidth \layoutparameter\c!edge + \global\margindistance \layoutparameter\c!margindistance + \global\edgedistance \layoutparameter\c!edgedistance + \global\leftedgedistance \layoutdistance \leftedgewidth \c!leftedgedistance + \global\rightedgedistance \layoutdistance \rightedgewidth \c!rightedgedistance + \global\leftmargindistance \layoutdistance \leftmarginwidth \c!leftmargindistance + \global\rightmargindistance\layoutdistance \rightmarginwidth \c!rightmargindistance + \global\topdistance \layoutdistance \topheight \c!topdistance + \global\headerdistance \layoutdistance \headerheight \c!headerdistance + \global\footerdistance \layoutdistance \footerheight \c!footerdistance + \global\bottomdistance \layoutdistance \bottomheight \c!bottomdistance} + +\def\setlayoutdistances % local in \setreducedvsize + {\headerdistance\layoutdistance\headerheight\c!headerdistance + \footerdistance\layoutdistance\footerheight\c!footerdistance} + +% these are wrong in the running text, assumes some swapping, needs a cleanup + +\def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth } +\def\innermarginwidth {\rightorleftpageaction\leftmarginwidth \rightmarginwidth} +\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance } +\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance} + +\def\outeredgewidth {\rightorleftpageaction\rightedgewidth \leftedgewidth } +\def\inneredgewidth {\rightorleftpageaction\leftedgewidth \rightedgewidth} +\def\outeredgedistance {\rightorleftpageaction\rightedgedistance\leftedgedistance } +\def\inneredgedistance {\rightorleftpageaction\leftedgedistance \rightedgedistance} + +\def\outerspacewidth {\rightorleftpageaction\cutspace\backspace} +\def\innerspacewidth {\rightorleftpageaction\backspace\cutspace} + +\newtoks\extralayoutcalculations \def\calculatelayoutextras{\the\extralayoutcalculations} + +% \appendtoks +% non etex calculations used to go here +% \to \extralayoutcalculations + +\newtoks\everyswapmargins % watch the order ! + +\appendtoks + \swapdimens\leftmargindistance\rightmargindistance + \swapdimens\leftedgedistance \rightedgedistance + \swapdimens\leftmarginwidth \rightmarginwidth + \swapdimens\leftedgewidth \rightedgewidth +\to \everyswapmargins + +\appendtoks + \swapmacros\leftmargintotal \rightmargintotal + \swapmacros\leftedgetotal \rightedgetotal + \swapmacros\leftsidetotal \rightsidetotal + \swapmacros\leftcombitotal \rightcombitotal + \swapmacros\innermargintotal\outermargintotal + \swapmacros\inneredgetotal \outeredgetotal + \swapmacros\innercombitotal \outercombitotal + \swapmacros\innersidetotal \outersidetotal +\to \everyswapmargins + +%D \macros +%D {definepapersize} +%D +%D Before we start calculating layout dimensions, we will +%D first take care of paper sizes. The first argument can be +%D either an assignment (for defaults) or an identifier, in +%D which case the second argument is an assignment. +%D +%D \showsetup{definepapersize} + +\def\definepapersize + {\dodoubleempty\dodefinepapersize} + +\def\definepapersize + {\dotripleempty\dodefinepapersize} + +\def\dodefinepapersize[#1][#2][#3]% + {\ifsecondargument + \doifsomething{#1} % to be sure + {\doifassignmentelse{#2} + {\getparameters + [\??pp#1] % geen \c!scale, scheelt hash ruimte + [\c!width=\@@ppwidth,\c!height=\@@ppheight,\c!offset=\@@ppoffset,#2]} + {\setvalue{\??pp:1:#1}{#2}% + \setvalue{\??pp:2:#1}{#3}}}% + \else + \getparameters[\??pp][#1]% + \setuppapersize % hm. this will freeze ! + \fi} + +%D For the moment we need to fake this macro. + +\ifx\setuppapersize\undefined + \let\setuppapersize\relax +\fi + +%D We set the defaults to the dimensions of an A4 sheet of +%D paper. + +\definepapersize + [\c!width=210mm,\c!height=297mm,\c!offset=\zeropoint] + +%D Yet undocumented, let's see if it gets noticed. +%D +%D \starttyping +%D \definepapersize[main] [A4] [A4] +%D \definepapersize[extra][A4,landscape][A4,landscape] +%D +%D \starttext +%D \setuppapersize[main] +%D Page 1. \page +%D Page 2. \page +%D \setuppapersize[extra] +%D Page 2 \page +%D \setuppapersize[main] +%D Page 3. \page +%D Page 4. \page +%D \adaptpapersize[extra] +%D Page 5. \page +%D Page 6. \page +%D \stoptext +%D \stoptyping + +%D \macros +%D {setuppaper,setuppapersize} +%D +%D When setting up the papersize on which to typeset and +%D print, we can also determine some more characteristics. +%D +%D \showsetup{setuppapersize} +%D +%D We keep track of these features with the following +%D variables. + +\chardef\papermirror =0 \chardef\printmirror =0 +\chardef\paperorientation=0 \chardef\printorientation=0 % beware: later no chardef +\chardef\paperreverse =0 \chardef\printreverse =0 +\chardef\paperlandscape =0 \chardef\printlandscape =0 + +\let\papersize\empty \let\printpapersize\empty + +\def\paperscale{1} \newif\ifnegateprintbox + +\def\setuppaper[#1]% + {\getparameters[\??pp][\c!paper=,\c!page=,#1]% + \edef\@@ppxy{\the\numexpr\@@ppnx*\@@ppny\relax}% + \doifelsenothing\@@pppage + {\doifelsenothing\@@pppaper + {} % {\setuppapersize} % added, removed, no need for, too tricky, mag-01 (fixed by freezing pp's) + {\dodosetuppapersize[\papersize][\@@pppaper]}} + {\doifelsenothing\@@pppaper + {\dodosetuppapersize[\@@pppage][\printpapersize]} + {\dodosetuppapersize[\@@pppage][\@@pppaper]}}} + +\def\setuppapersize + {\dodoubleempty\dosetuppapersize} + +\def\dosetuppapersize[#1][#2]% + {\doifassignmentelse{#1} + {\setuppaper[#1]} + {\doifelsenothing{#2} + {\expanded{\dodosetuppapersize + [\executeifdefined{\??pp:1:#1}{#1}]% + [\executeifdefined{\??pp:2:#1}{}]}} + {\doifassignmentelse{#2} + {\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]} + {\expanded{\dodosetuppapersize + [\executeifdefined{\??pp:1:#1}{#1}]% + [\executeifdefined{\??pp:1:#2}{#2}]}}}}} + +\let\reinstatepapersize\relax + +\def\adaptpapersize + {\global\let\reinstatepapersize\restorepapersize + \setuppapersize} + +\appendtoks + \reinstatepapersize + \global\let\reinstatepapersize\relax +\to \everyaftershipout + +\def\dodosetuppapersize[#1][#2]% + {\ifsecondargument + \expanded{\dododosetuppapersize[#1][#2]}% + \calculatehsizes + \calculatevsizes + \recalculatebackgrounds + \recalculatelayout + \else\iffirstargument + \setuppapersize[#1][#2]% + \else\ifx\papersize\undefined\else + \restorepapersize + \fi\fi\fi} + +% dimen freeze is a bit tricky, but catches local redundant calls +% with values where e.g width is defined in terms of \paperwidth + +\def\dododosetuppapersize[#1][#2]% + {\xdef\restorepapersize{\noexpand\setuppapersize[#1][#2]}% + \dosetuppaperorientation{#1}\paperlandscape\paperorientation\paperreverse\papermirror + \dosetuppaperorientation{#2}\printlandscape\printorientation\printreverse\printmirror + \def\docommand##1% + {\doifsomething{##1}{\doifdefined{\??pp##1\c!width} + {\global\paperwidth \getvalue{\??pp##1\c!width}% + \global\paperheight\getvalue{\??pp##1\c!height}% + \ifinpagebody + \setevalue{\??pp##1\c!height}{\the\paperheight}% + \setevalue{\??pp##1\c!width }{\the\paperwidth }% + \fi + \calculatepaperoffsets{##1}% + \xdef\papersize{##1}}}}% + \processcommacommand[#1]\docommand + \doifdefinedelse{\??pp#1\c!scale} + {\edef\paperscale{\getvalue{\??pp#1\c!scale}}} + {\edef\paperscale{1}}% + \def\docommand##1% + {\doifsomething{##1}{\doifdefined{\??pp##1\c!width} + {\global\printpaperwidth \getvalue{\??pp##1\c!width}% + \global\printpaperheight\getvalue{\??pp##1\c!height}% + \ifinpagebody + \setevalue{\??pp##1\c!height}{\the\printpaperheight}% + \setevalue{\??pp##1\c!width }{\the\printpaperwidth}% + \fi + \xdef\printpapersize{##1}}}}% + \processcommacommand[#2]\docommand + \global\setdimentoatleast\paperwidth \onepoint + \global\setdimentoatleast\paperheight \onepoint + \global\setdimentoatleast\printpaperwidth \onepoint + \global\setdimentoatleast\printpaperheight\onepoint + \ifcase\paperlandscape\else + \doglobal\swapdimens\paperwidth\paperheight + \fi + \ifcase\printlandscape\else + \doglobal\swapdimens\printpaperwidth\printpaperheight + \fi + % this check can be confusing, so we've added the possibility + % to bypass this test: \setuppapersize[option=fit] + \doif\@@ppoption\v!max % \v!fit is + {\bgroup + % we need to pre-swap else we get the wrong paper size + \ifcase\paperorientation\else + \doifinset\paperorientation{90,270}{\swapdimens\paperwidth\paperheight}% + \fi + \ifcase\printorientation\else + \doifinset\printorientation{90,270}{\swapdimens\printpaperwidth\printpaperheight}% + \fi + \ifdim\paperheight>\printpaperheight + \global\printpaperheight\paperheight + \writestatus\m!systems{print height forced to paper height}% + \fi + \ifdim\paperwidth>\printpaperwidth + \global\printpaperwidth\paperwidth + \writestatus\m!systems{print width forced to paper width}% + \fi + \egroup}} + +\def\dosetuppaperorientation#1#2#3#4#5% + {\global\chardef#2\zerocount + \global\chardef#5\zerocount + \globallet#3\!!zerocount + \globallet#4\!!zerocount + \global\negateprintboxfalse + \processallactionsinset + [#1] + [ \v!landscape=>\global\chardef#2\plusone, + \v!mirrored=>\global\chardef#5\plusone, + \v!rotated=>\gdef#3{90}\gdef#4{270}, + \v!negative=>\global\negateprintboxtrue, + 90=>\gdef#3{90}\gdef#4{270}, + 180=>\gdef#3{180}\gdef#4{0}, + 270=>\gdef#3{270}\gdef#4{90}]} + +\ifx\calculatepaperoffsets\undefined + + \def\calculatepaperoffsets#1% + {\scratchdimen\getvalue{\??pp#1\c!offset}% + \global\advance\paperwidth -2\scratchdimen + \global\advance\paperheight-2\scratchdimen} + +\fi + +\let\restorepapersize\relax + +% \def\docheckforems#1% +% {\beforesplitstring#1\at em\to\asciia +% \doifnot\asciia{#1} +% {\aftersplitstring\asciia\at=\to\asciia +% \doifsomething\asciia{\showmessage\m!systems{10}{#1}}}} +% +% \def\checkforems[#1]% +% {\processcommalist[#1]\docheckforems} + +\ifx\setups\undefined \def\setups[#1]{\setdefaultpenalties} \fi + +% \newtoks \everybeforelayout \relax +% \newtoks \everyafterlayout \relax + +\def\recalculatelayout + {\doifsomething{\layoutparameter\c!page\layoutparameter\c!paper} + {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}% + \dorecalculatelayout} + +\def\dorecalculatelayout + {%\the\everybeforelayout + \setups[\layoutparameter\c!preset]% + \global\leftmarginwidth \layoutparameter\c!leftmargin + \global\rightmarginwidth\layoutparameter\c!rightmargin + \global\leftedgewidth \layoutparameter\c!leftedge + \global\rightedgewidth \layoutparameter\c!rightedge + \global\headerheight \layoutparameter\c!header + \global\footerheight \layoutparameter\c!footer + \global\bottomheight \layoutparameter\c!bottom + \global\topheight \layoutparameter\c!top + \global\backspace \layoutparameter\c!backspace + \global\topspace \layoutparameter\c!topspace + \setlayoutdimensions % the rest of the `dimensions' + \doifelse\@@lygrid\v!yes\gridsnappingtrue\gridsnappingfalse + \ifgridsnapping + \setsystemmode\v!grid + \else + \resetsystemmode\v!grid + \fi + \setups[\layoutparameter\c!setups]% depends on gridsnapping ! + \simplesetupwhitespace + \simplesetupblank + \global\cutspace\layoutparameter\c!cutspace + \relax + \doifelse{\layoutparameter\c!width}\v!middle + {\ifdim\cutspace=\zeropoint + \global\cutspace\backspace + \fi + \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax} + {\doifelse{\layoutparameter\c!width}\v!fit + {\ifdim\cutspace=\zeropoint + \global\cutspace\backspace + \fi + \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax + \scratchdimen\dimexpr\backspace + -\leftedgewidth -\leftedgedistance + -\leftmarginwidth-\leftmargindistance\relax + \ifdim\scratchdimen<\zeropoint + \scratchdimen\zeropoint + \fi + \global\advance\makeupwidth\dimexpr + -\rightmargindistance-\rightmarginwidth + -\rightedgedistance -\rightedgewidth + -\scratchdimen\relax} + {\global\makeupwidth\layoutparameter\c!width\relax + \ifdim\cutspace=\zeropoint + \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax + % \else + % A kind of inconsistent specification, but used + % in for instance s-pre-19.tex; the cutspace is + % used only for determining some kind of right + % margin; don't use this in doublesided mode + \fi}}% + \scratchdimen\layoutparameter\c!bottomspace\relax + %\ifdim\scratchdimen=\zeropoint + % \scratchdimen\topspace + %\fi + \global\bottomspace\layoutparameter\c!bottomspace\relax + \global\layoutlines0\number\layoutparameter\c!lines\relax % may be empty + \ifcase\layoutlines + \doifelse{\layoutparameter\c!height}\v!middle + {\ifdim\bottomspace=\zeropoint + \global\bottomspace\topspace + \fi + \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax} + {\doifelse{\layoutparameter\c!height}\v!fit + {\ifdim\bottomspace=\zeropoint + \global\bottomspace\topspace + \fi + \global\makeupheight\dimexpr\paperheight-\bottomspace\relax + \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax + \ifdim\scratchdimen<\zeropoint + \scratchdimen\zeropoint + \fi + \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax} + {\global\makeupheight\layoutparameter\c!height\relax + \ifdim\bottomspace=\zeropoint + \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax + \else + % inconsistent specification + \fi}}% + \else + % beware, when the bodyfont changes (switched) this will change as well; implementing + % a global lineheight is tricky: should we take the bodyfont interlinespace or the one set + % independent of the bodyfont (before or after a layout spec); way too fuzzy, so we + % stick to the current method (after a night of experimenting ...2003/10/13) + \global\makeupheight\dimexpr + \layoutparameter\c!lines\lineheight-\strutheight+\topskip+ + \headerdistance+\headerheight+\footerdistance+\footerheight\relax + \fi + \backoffset\layoutparameter\c!horoffset + \topoffset \layoutparameter\c!veroffset + \global\setdimentoatleast\makeupwidth\onepoint + \global\setdimentoatleast\makeupheight \onepoint + % \checkcurrentlayout % here ? + % \the\everyafterlayout + \calculatelayoutextras + \calculatehsizes + \calculatevsizes + \calculatepseudocolumns + \checkgridsnapping + \recalculatebackgrounds} + +\def\calculatepseudocolumns + {\global\layoutcolumns\layoutparameter\c!columns + \global\layoutcolumndistance\layoutparameter\c!columndistance + \global\layoutcolumnwidth\dimexpr\makeupwidth-\layoutcolumns\layoutcolumndistance+\layoutcolumndistance\relax + \global\divide\layoutcolumnwidth\layoutcolumns + \dorecurse\layoutcolumns + {\setxvalue{\??ly:c:\recurselevel}% + {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}}} + +%\dorecurse\layoutcolumns +% {\setxvalue{\??ly:c:\recurselevel}{\the\dimexpr +% (\numexpr(\recurselevel-1)\dimexpr(\layoutcolumnwidth+\layoutcolumndistance))}} + +\def\layoutcolumnoffset#1% + {\executeifdefined{\??ly:c:#1}\zeropoint} + +\def\checklayout + {\ifdim\makeupheight=\layoutlines\lineheight \else \recalculatelayout \fi} + +\appendtoks \checklayout \to \everystarttext + +% document: +% +% \setuplayout[odd][state=stop] \setuplayout[even][state=stop] \setuplayout[page] +% +% \startstandardmakeup[page=blank] ... \stopstandardmakeup + +\def\changetolayout#1% + {%\writestatus\m!layouts{changing to layout #1}% + \xdef\currentlayout{#1}\recalculatelayout} + +\def\checkcurrentoddlayout + {\ifcsname\??ly\v!odd\c!state\endcsname + \doifvalue{\??ly\v!odd\c!state}\v!start{\changetolayout\v!odd}% + \fi} + +\def\checkcurrentevenlayout + {\ifcsname\??ly\v!even\c!state\endcsname + \doifvalue{\??ly\v!even\c!state}\v!start{\changetolayout\v!even}% + \fi} + +\ifx\lastpage\undefined \def\lastpage{1} \fi + +\def\reverserealfolio + {\ifnum\lastpage>\plusone + \ifnum\lastpage=\realfolio + \v!last + \else\ifnum\plusone=\realfolio + \v!first + \else + \the\numexpr\realfolio-\lastpage\relax + \fi\fi + \else + \!!zerocount + \fi} + +\def\checkcurrentlayout % public and used in naw, so keep this name + {\ifcsname\??ly\realfolio\c!state\endcsname + \doifvalue{\??ly\realfolio\c!state}\v!start{\changetolayout\realfolio}% + \else\ifcsname\??ly\reverserealfolio\c!state\endcsname + \doifvalue{\??ly\reverserealfolio\c!state}\v!start{\changetolayout\reverserealfolio}% + \else\ifcsname\??ly\v!current\c!state\endcsname + \changetolayout\v!current % no start test ? + \else + \doifoddpageelse\checkcurrentoddlayout\checkcurrentevenlayout + \fi\fi\fi} + +% testcase +% +% \setuppagenumbering[alternative=doublesided] +% +% \setuplayout [width=11cm] +% \definelayout [odd] [backspace=1cm] +% \definelayout [even] [backspace=4cm] +% \definelayout [5] [backspace=5cm] +% \definelayout [6] [backspace=5cm] +% \definelayout [-2] [backspace=0cm,cutspace=0cm] +% \definelayout [last] [backspace=0cm,cutspace=0cm] +% +% \checkcurrentlayout \showframe +% +% \starttext +% \dorecurse{20} {\input knuth \endgraf \input tufte \endgraf} +% \stoptext + +%appendtoks \checkcurrentlayout \to \everyaftershipout % no +\appendtoks \checkcurrentlayout \to \everystarttext + +\appendtoks + \dochecknextlayout +\to \everyaftershipout + +% \def\dochecknextlayout +% {\ifx\currentlayout\v!current +% % prevent redundant calculations +% \else +% \globallet\currentlayout\empty +% \global\letbeundefined{\??ly\v!current\c!state}% +% \checkcurrentlayout +% \fi} +% +% this breaks after a standardmakeup + +\def\dochecknextlayout{\checkcurrentlayout} + +\newif\ifdoublesidedprint + +\def\presetcenterpagebox % in \setuplayout !!!!!!!!!!!!!!!! + {\doublesidedprintfalse + \normalexpanded{\noexpand\processallactionsinset[\@@lylocation]} + [ \v!middle=>{\setuppapersize[\c!left=\hss,\c!right=\hss,\c!top=\vss,\c!bottom=\vss]}, + \v!left=>{\setuppapersize[\c!left=,\c!right=\hss]}, + \v!right=>{\setuppapersize[\c!left=\hss,\c!right=]}, + \v!bottom=>{\setuppapersize[\c!top=\vss,\c!bottom=]}, + \v!top=>{\setuppapersize[\c!top=,\c!bottom=\vss]},% + \v!doublesided=>\doublesidedprinttrue, + \v!singlesided=>\doublesidedprintfalse]} + +\def\definelayout + {\dodoubleargument\dodefinelayout} + +\def\dodefinelayout[#1][#2]% + {\getparameters[\??ly#1][\c!state=\v!start,#2]} + +% \def\dodosetuplayout[#1][#2]% +% {\ConvertToConstant\doifnot{#2}\v!reset % #2 ? +% {\getparameters[\??ly#1][#2]% +% \checkforems[#2]}} + +\def\dodosetuplayout[#1][#2]% + {\doifnot{#2}\v!reset{\getparameters[\??ly#1][#2]}} + +% global needed for non-doublesided standardmakeup + +\def\dosetuplayout[#1][#2]% + {\globallet\currentlayout\empty % new, global + \ifsecondargument + \dodosetuplayout[#1][#2]% + \else\iffirstargument + \doifassignmentelse{#1} + {\dodosetuplayout[][#1]} + {\doifnot{#1}\v!reset{\xdef\currentlayout{#1}}}% new, global + \fi\fi + \recalculatelayout + \checkcurrentlayout % here ? + \presetcenterpagebox} + +\def\setuplayout + {\dodoubleempty\dosetuplayout} + +\let\@@zaheight\!!zeropoint + +\def\dopushpagedimensions + {\xdef\oldtextheight {\the\textheight }% + \xdef\oldfooterheight{\the\footerheight}% + \global\let\@@zaheight\@@zaheight} + +\def\dopoppagedimensions + {\global\textheight \oldtextheight + \global\footerheight\oldfooterheight + \recalculatelayout + \global\let\pushpagedimensions\dopushpagedimensions + \global\let\poppagedimensions\relax} + +\let\poppagedimensions \relax +\let\pushpagedimensions\dopushpagedimensions + +% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook +% in een test met \doifdefined. Bij veel bladzijden kan dit +% te veel macro's kosten. Vandaar de set \adaptedpages. Het +% kost tijd, maar scheelt macro's. + +\let\adaptedpages\empty + +\def\adaptpagedimensions + {\ifx\adaptedpages\empty\else + \adaptpagedimensionsindeed + \fi} + +\def\adaptpagedimensionsindeed + {\rawdoifinsetelse\realfolio\adaptedpages + {\removefromcommalist\realfolio\adaptedpages + \getvalue{\??za\realfolio}% + \letbeundefined{\??za\realfolio}}} + +\def\checkpagedimensions + {\poppagedimensions + \adaptpagedimensions} + +\def\reportpagedimensions + {\ifx\poppagedimensions\relax \else + \space\the\dimexpr\@@zaheight\relax\space-\space + \fi + \realfolio} + +\def\dodoadaptlayout[#1]% + {\getparameters[\??za][\c!height=,\c!lines=0,#1]% + \pushpagedimensions + \ifcase\@@zalines\relax + \showmessage\m!layouts1{\@@zaheight,\realfolio}% + \else + \showmessage\m!layouts1{\@@zalines\space\v!lines,\realfolio}% + \def\@@zaheight{\@@zalines\openlineheight}% + \fi + \doifelse\@@zaheight\v!max + {\balancedimensions\textheight\footerheight\footerheight} + {\balancedimensions\textheight\footerheight\@@zaheight}% + \ifdim\footerheight<\zeropoint + \global\advance\textheight \footerheight + \global\footerheight\zeropoint + \global\xdef\@@zaheight{\layoutparameter\c!footer\space(\v!max)}% + \fi + \setvsize + \global\pagegoal\vsize % nog corrigeren voor insertions ? + \recalculatebackgrounds + \global\let\pushpagedimensions\relax + \global\let\poppagedimensions\dopoppagedimensions} + +\def\doadaptlayout[#1][#2]% + {\doifelsenothing{#2} + {\dodoadaptlayout[#1]} + {\def\docommand##1% + {\addtocommalist{##1}\adaptedpages + \setgvalue{\??za##1}{\dodoadaptlayout[#2]}}% + \processcommalist[#1]\docommand + \adaptpagedimensions}} + +\def\adaptlayout + {\dodoubleempty\doadaptlayout} + +% describe interface + +%D Centering the paper area on the print area is determined +%D by the \type {top}, \type {bottom}, \type {left} and \type +%D {right} parameters. + +\def\centerpagebox#1% + {\printpaperwidth \paperscale\printpaperwidth + \printpaperheight\paperscale\printpaperheight + \setbox#1\vbox to \printpaperheight + {\@@pptop + \hbox to \printpaperwidth + {\ifdoublesidedprint + \doifbothsides + {\@@ppleft \box#1\@@ppright} + {\@@ppleft \box#1\@@ppright} + {\@@ppright\box#1\@@ppleft }% + \else + \@@ppleft \box#1\@@ppright + \fi}% + \par + \@@ppbottom}} + +\def\offsetprintbox#1% + {\ifdim\topoffset=\zeropoint % \relax + \ifdim\backoffset=\zeropoint + \donefalse + \else + \donetrue + \fi + \else + \donetrue + \fi + \ifdone + \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}% + \setbox#1\vbox + {\offinterlineskip + \vskip\topoffset + \hskip\doifbothsides\backoffset\backoffset{-\backoffset}% + \box#1}% + \next + \fi} + +\def\replicatepagebox#1% + {\ifnum\@@lynx>\plusone + \donetrue + \else\ifnum\@@lyny>\plusone + \donetrue + \else + \donefalse + \fi\fi + \ifdone + \setbox#1\vbox + {\offinterlineskip + \dorecurse\@@lyny + {\hbox{\dorecurse\@@lynx{\copy#1\hskip\@@lydx}\unskip}% + \vskip\@@lydy} + \unskip}% + \fi} + +\def\orientpagebodybox#1#2#3% + {\ifnum#2#3>\zerocount + \setbox#1\vbox + {\edef\somerotation{\ifdoublesided\ifodd\realpageno#2\else#3\fi\else#2\fi}% + \dorotatebox\somerotation\hbox{\box#1}}% + \fi} + +\def\orientpaperbox#1% + {\orientpagebodybox{#1}\paperorientation\paperreverse} + +\def\orientprintbox#1% + {\orientpagebodybox{#1}\printorientation\printreverse} + +\def\mirrorpagebodybox#1#2% + {\ifcase#2\or + \setbox#1\vbox{\domirrorbox\vbox{\box#1}}% + \fi} + +\def\mirrorpaperbox#1% + {\mirrorpagebodybox{#1}\papermirror} + +\def\mirrorprintbox#1% + {\mirrorpagebodybox{#1}\printmirror} + +\def\scalepagebox#1% + {\ifdim\@@lyscale\points=\onepoint \else + \setbox#1\vbox{\scale[\c!sx=\@@lyscale,\c!sy=\@@lyscale]{\box#1}}% + \paperwidth \@@lyscale\paperwidth + \paperheight\@@lyscale\paperheight + \fi} + +\def\negateprintbox#1% + {\ifnegateprintbox + \negatecolorbox{#1}% + \fi} + +\def\pagecutmarksymbol {\the\realpageno} +\def\pagecutmarklength {.5cm} +\let\pagecutmarktoptext \empty +\let\pagecutmarkbottomtext \empty + +\def\extrapagecutmarkbottomtext + {\rlap{\jobname}\hfill\currentdate\space-\space\currenttime\hfill\llap{\realfolio}} + +\def\makepagecutbox % #1 + {\let\cutmarksymbol \pagecutmarksymbol + \let\cutmarklength \pagecutmarklength + \let\cutmarktoptext \pagecutmarktoptext + \let\cutmarkbottomtext\pagecutmarkbottomtext + \makecutbox} + +\setvalue{\??ly:n:\c!marking:\v!on}% + {\makepagecutbox} + +\setvalue{\??ly:n:\c!marking:\v!page}% only at outer when nx/ny > 0 + {\makepagecutbox} + +\setvalue{\??ly:n:\c!marking:\v!empty}% + {\let\pagecutmarksymbol\empty + \let\pagecutmarktoptext\empty + \let\pagecutmarkbottomtext\empty + \makepagecutbox} + +\setvalue{\??ly:n:\c!marking:\v!text}% + {\let\pagecutmarksymbol\empty + \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext + \makepagecutbox} + +\setvalue{\??ly:c:\c!marking:\v!color}% + {\doaddpagecolormarks\colormarkbox} + +\setvalue{\??ly:c:\c!marking:\v!screen}% + {\doaddpagecolormarks\rastermarkbox} + +\letvalue{\??ly:c:\c!marking:\v!unknown}\gobbleoneargument +\letvalue{\??ly:n:\c!marking:\v!unknown}\gobbleoneargument + +% \def\addpagecutmarks {\executeifdefined{\??ly:n:\c!marking:\@@lymarking}\gobbleoneargument} +% \def\addpagecolormarks{\executeifdefined{\??ly:c:\c!marking:\@@lymarking}\gobbleoneargument} + +\def\addpagecutmarks {\expandcheckedcsname{\??ly:n:\c!marking:}\@@lymarking\s!unknown} +\def\addpagecolormarks{\expandcheckedcsname{\??ly:c:\c!marking:}\@@lymarking\s!unknown} + +\def\doaddpagecolormarks#1#2% + {\makepagecutbox{#2}% + \ifnum\horizontalcutmarks>\plustwo \chardef\colormarkoffset\plusfour \fi + \ifnum\verticalcutmarks >\plustwo \chardef\colormarkoffset\plusfour \fi + #1{#2}} + +% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET + +\ifx\doifelselayoutsomeline\undefined % defined in page-txt + \let\doifelselayoutsomeline\secondofthreearguments +\fi + +\def\compensatevsizeheader {\advance\textheight-\dimexpr\headerheight+\headerdistance\relax} +\def\compensatevsizefooter {\advance\textheight-\dimexpr\footerheight+\footerdistance\relax} +\def\globalcompensatevsizeheader{\global\advance\textheight-\dimexpr\headerheight+\headerdistance\relax} +\def\globalcompensatevsizefooter{\global\advance\textheight-\dimexpr\footerheight+\footerdistance\relax} + +\def\compensatevsizeheaderzero{\headerheight\zeropoint\setlayoutdistances} +\def\compensatevsizefooterzero{\footerheight\zeropoint\setlayoutdistances} + +\def\calculatevsizes + {\textheight\makeupheight + \doifelselayoutsomeline\v!header\compensatevsizeheader\donothing + \doifelselayoutsomeline\v!footer\compensatevsizefooter\donothing + \setvsizemodes + \resetglobal + \setvsize} + +\def\calculateglobalvsizes + {\global\textheight\makeupheight + \doifelselayoutsomeline\v!header\globalcompensatevsizeheader\donothing + \doifelselayoutsomeline\v!footer\globalcompensatevsizefooter\donothing + \setvsizemodes + \setvsize} + +\def\setvsizemodes + {\ifzeropt\headerheight + \resetsystemmode\v!header + \else + \setsystemmode\v!header + \fi + \ifzeropt\footerheight + \resetsystemmode\v!footer + \else + \setsystemmode\v!footer + \fi} + +\def\calculatereducedvsizes + {\textheight\makeupheight + \doifelselayoutsomeline\v!header\compensatevsizeheader\compensatevsizeheaderzero + \doifelselayoutsomeline\v!footer\compensatevsizefooter\compensatevsizefooterzero} + +\newdimen\innermakeupwidth % special purpose +\newdimen\innermakeupmargin % special purpose + +\chardef\innermakeupcompensation\plusone + +\def\compensatedinnermakeupmargin + {\dimexpr\ifnum\innermakeupcompensation=\plusone+\innermakeupmargin\else\zeropoint\fi\relax} + +\def\freezetextwidth % \makeupwidth may be set to \textwidth + {\textwidth\makeupwidth % which is a tricky but valid value + \doifsomething{\layoutparameter\c!textwidth} + {\textwidth\layoutparameter\c!textwidth}% % local + \global\innermakeupwidth\textwidth + \doifelsenothing{\layoutparameter\c!textmargin} + {\global\innermakeupmargin\zeropoint} + {\global\innermakeupmargin\layoutparameter\c!textmargin}% + \global\advance\innermakeupwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax + \advance\textwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax} % local + +\def\calculatehsizes + {\freezetextwidth + \sethsize} + +% De onderstaande macro voert commando's uit, afhankelijk van +% het karakter van het paginanummer. +% +% \doifoddpageelse{then-commando}{else-commando} + +%D When we start at an even page, we need to swap the layout +%D differently. We cannot adapt the real page number, since +%D it is used in cross referencing. The next switch is set +%D when we start at an even page. + +\newif\ifshiftedrealpageno + +% We could use nested if here plu ssone \@EAEAEA's but but the +% next variant has less expansion which is nicer in tracing. + +\def\doifoddpageelse {\ifshiftedrealpageno\expandafter\doifoddpageelseyes\else\expandafter\doifoddpageelsenop\fi} +\def\doifoddpageelseyes{\ifodd\realpageno\expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments\fi} +\def\doifoddpageelsenop{\ifodd\realpageno\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi} + +\let\doifonevenpaginaelse\doifoddpageelse + +\def\redoifoddpageelse#1{\doifoddpageelse} + +\def\doifbothsidesoverruled + {\ifdoublesided + \expandafter\redoifoddpageelse + \else + \expandafter\firstofthreearguments + \fi} + +\def\doifbothsides% #1 #2 #3 + {\ifdoublesided + \expandafter\doifbothsidesindeed + \else + \expandafter\firstofthreearguments + \fi} + +\def\doifbothsidesindeed + {\ifsinglesided + \expandafter\firstofthreearguments + \else + \expandafter\redoifoddpageelse + \fi} + +\def\settexthoffset + {\texthoffset\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}} + +\def\goleftonpage + {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax} + +\def\doifmarginswapelse#1#2% + {\doifbothsides{#1}{#1}{#2}} + +\def\swapmargins + {\doifmarginswapelse\relax\doswapmargins} + +\def\doswapmargins + {\let\swapmargins \relax % to prevent local swapping + \let\doswapmargins\relax % to prevent local swapping + \the\everyswapmargins} + +\def\rightorleftpageaction + {\ifdoublesided + \expandafter\rightorleftpageactionindeed + \else + \expandafter\firstoftwoarguments + \fi} + +\def\rightorleftpageactionindeed + {\ifsinglesided + \expandafter\firstoftwoarguments + \else + \expandafter\doifoddpageelse + \fi} + +\def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth } +\def\innermarginwidth {\rightorleftpageaction\leftmarginwidth \rightmarginwidth} +\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance } +\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance} + +\def\outeredgewidth {\rightorleftpageaction\rightedgewidth \leftedgewidth } +\def\inneredgewidth {\rightorleftpageaction\leftedgewidth \rightedgewidth} +\def\outeredgedistance {\rightorleftpageaction\rightedgedistance\leftedgedistance } +\def\inneredgedistance {\rightorleftpageaction\leftedgedistance \rightedgedistance} + +\def\outerspacewidth {\rightorleftpageaction\cutspace \backspace} +\def\innerspacewidth {\rightorleftpageaction\backspace\cutspace } + +\def\leftmargintotal {\dimexpr\leftmarginwidth +\leftmargindistance \relax} +\def\rightmargintotal {\dimexpr\rightmarginwidth+\rightmargindistance\relax} +\def\leftedgetotal {\dimexpr\leftedgewidth +\leftedgedistance \relax} +\def\rightedgetotal {\dimexpr\rightedgewidth +\rightedgedistance \relax} + +\def\leftsidetotal {\dimexpr\leftmarginwidth +\leftedgetotal \relax} +\def\rightsidetotal {\dimexpr\rightmarginwidth+\rightedgetotal\relax} +\def\leftcombitotal {\dimexpr\leftmargintotal +\leftedgetotal \relax} +\def\rightcombitotal {\dimexpr\rightmargintotal+\rightedgetotal\relax} + +\def\innermargintotal {\dimexpr\innermarginwidth+\innermargindistance\relax} +\def\outermargintotal {\dimexpr\outermarginwidth+\outermargindistance\relax} +\def\inneredgetotal {\dimexpr\inneredgewidth +\inneredgedistance \relax} +\def\outeredgetotal {\dimexpr\outeredgewidth +\outeredgedistance \relax} + +\def\innercombitotal {\dimexpr\innermargintotal+\inneredgetotal\relax} +\def\outercombitotal {\dimexpr\outermargintotal+\outeredgetotal\relax} +\def\innersidetotal {\dimexpr\innermarginwidth+\inneredgetotal\relax} +\def\outersidetotal {\dimexpr\outermarginwidth+\outeredgetotal\relax} + +%D \macros +%D {startlocallayout} +%D +%D These macros should be used with care. They permit local +%D layouts (as used in fitting pages, see \type {page-app.tex}). + +%D This is kind of obsolete now that we have \type +%D {\definelayout}, so this hack will disappear in future +%D versions. + +\def\startlocallayout + {\globalpushmacro\restorepapersize + \globalpushmacro\currentlayout} + +\def\stoplocallayout + {\globalpopmacro\currentlayout + \globalpopmacro\restorepapersize + \restorepapersize + \setuplayout} + +%D \macros +%D {showprint, showframe, showlayout, showsetups} +%D +%D We predefine a couple of tracing macros. +%D +%D \showsetup{showprint} +%D \showsetup{showframe} +%D \showsetup{showlayout} +%D \showsetup{showsetups} +%D %showsetup{showmargins} + +\fetchruntimecommand \showprint {page-run.mkii} +\fetchruntimecommand \showframe {page-run.mkii} +\fetchruntimecommand \showlayout {page-run.mkii} +\fetchruntimecommand \showsetups {page-run.mkii} +\fetchruntimecommand \showmargins {page-run.mkii} + +%D The default dimensions are quite old and will not change. +%D The funny fractions were introduced when we went from fixed +%D dimensions to relative ones. Since \CONTEXT\ is a dutch +%D package, the dimensions are based on the metric system. The +%D asymmetrical layout is kind of handy for short +%D quick||and||dirty stapled documents. +%D +%D Although valid, it is not a real good idea to use +%D dimensions based on the \type {em} unit. First of all, +%D since there are no fonts loaded yet, this dimension makes +%D no sense, and second, you would loose track of values, +%D since they could change while going to a new page, +%D depending on the current font setting. + +\setuplayout + [ \c!topspace=.08417508418\paperheight, % 2.5cm + \c!top=\zeropoint, + \c!topdistance=\zeropoint, + \c!header=.06734006734\paperheight, % 2.0cm + \c!headerdistance=\zeropoint, + \c!height=.84175084175\paperheight, % 25.0cm + \c!footerdistance=\layoutparameter\c!headerdistance, + \c!footer=.06734006734\paperheight, % 2.0cm + \c!bottomdistance=\layoutparameter\c!topdistance, + \c!bottom=\zeropoint, + \c!backspace=.11904761905\paperwidth, % 2.5cm + \c!edge=\zeropoint, + \c!edgedistance=\layoutparameter\c!margindistance, + \c!margin=.12649983170\paperwidth, % snijwit-2*afstand + \c!margindistance=.02008341748\paperwidth, % 12.0pt + \c!leftedge=\layoutparameter\c!edge, + \c!leftedgedistance=\layoutparameter\c!edgedistance, + \c!leftmargin=\layoutparameter\c!margin, + \c!leftmargindistance=\layoutparameter\c!margindistance, + \c!width=.71428571429\paperwidth, % 15.0cm + \c!rightmargindistance=\layoutparameter\c!margindistance, + \c!rightmargin=\layoutparameter\c!margin, + \c!rightedgedistance=\layoutparameter\c!edgedistance, + \c!rightedge=\layoutparameter\c!edge, + \c!veroffset=\zeropoint, + \c!bottomspace=\zeropoint, + \c!horoffset=\zeropoint, + \c!cutspace=\zeropoint, + \c!textwidth=, % dangerous option -> centered / local + \c!textmargin=, % dangerous option -> both sides + \c!textdistance=\zeropoint, % shift down on grid + \c!style=, + \c!color=, + \c!marking=\v!off, + \c!location=, % \v!singlesided, but empty is signal + \c!scale=1, + \c!nx=1, + \c!ny=1, + \c!dx=\zeropoint, + \c!dy=\zeropoint, + \c!grid=\v!no, + \c!preset=, + \c!setups=\systemsetupsprefix\s!default, + \c!clipoffset=\zeropoint, + \c!lines=0, + \c!paper=, % for foxet + \c!page=, % for foxet + \c!columns=1, + \c!columndistance=\zeropoint] + +%D First we define a whole range of (DIN) papersizes, +%D of which the A-series makes most sense. We enable checking. + +%D We also set some of the parameters that will be used when +%D positioning the typeset paper onto the print paper. + +\setuppaper % (size) % only used in XY imposition + [\c!width=\zeropoint, + \c!height=\zeropoint, + \c!topspace=\zeropoint, + \c!backspace=\zeropoint, + \c!dx=\zeropoint, + \c!dy=\zeropoint, + \c!nx=1, + \c!ny=1, + \c!method=\v!normal] + +\setuppapersize + [\c!option=\v!max, + \c!top=, + \c!bottom=\vss, + \c!left=, + \c!right=\hss] + +\definepapersize [A0] [\c!width=841mm,\c!height=1189mm] +\definepapersize [A1] [\c!width=594mm,\c!height=841mm] +\definepapersize [A2] [\c!width=420mm,\c!height=594mm] +\definepapersize [A3] [\c!width=297mm,\c!height=420mm] +\definepapersize [A4] [\c!width=210mm,\c!height=297mm] +\definepapersize [A5] [\c!width=148mm,\c!height=210mm] +\definepapersize [A6] [\c!width=105mm,\c!height=148mm] +\definepapersize [A7] [\c!width=74mm,\c!height=105mm] +\definepapersize [A8] [\c!width=52mm,\c!height=74mm] +\definepapersize [A9] [\c!width=37mm,\c!height=52mm] +\definepapersize [A10] [\c!width=26mm,\c!height=37mm] + +\definepapersize [B0] [\c!width=1000mm,\c!height=1414mm] +\definepapersize [B1] [\c!width=707mm,\c!height=1000mm] +\definepapersize [B2] [\c!width=500mm,\c!height=707mm] +\definepapersize [B3] [\c!width=353mm,\c!height=500mm] % [\c!width=354mm,\c!height=500mm] +\definepapersize [B4] [\c!width=250mm,\c!height=353mm] % [\c!width=250mm,\c!height=354mm] +\definepapersize [B5] [\c!width=176mm,\c!height=250mm] % [\c!width=177mm,\c!height=250mm] +\definepapersize [B6] [\c!width=125mm,\c!height=176mm] % [\c!width=125mm,\c!height=177mm] +\definepapersize [B7] [\c!width=88mm,\c!height=125mm] +\definepapersize [B8] [\c!width=62mm,\c!height=88mm] % [\c!width=63mm,\c!height=88mm] +\definepapersize [B9] [\c!width=44mm,\c!height=62mm] % [\c!width=44mm,\c!height=63mm] +\definepapersize [B10] [\c!width=31mm,\c!height=44mm] + +\definepapersize [C0] [\c!width=917mm,\c!height=1297mm] +\definepapersize [C1] [\c!width=648mm,\c!height=917mm] % [\c!width=649mm,\c!height=917mm] +\definepapersize [C2] [\c!width=458mm,\c!height=648mm] % [\c!width=459mm,\c!height=649mm] +\definepapersize [C3] [\c!width=324mm,\c!height=458mm] % [\c!width=324mm,\c!height=459mm] +\definepapersize [C4] [\c!width=229mm,\c!height=324mm] +\definepapersize [C5] [\c!width=162mm,\c!height=229mm] +\definepapersize [C6] [\c!width=114mm,\c!height=162mm] % [\c!width=115mm,\c!height=162mm] +\definepapersize [C7] [\c!width=81mm,\c!height=114mm] % [\c!width=81mm,\c!height=115mm] +\definepapersize [C8] [\c!width=57mm,\c!height=81mm] +\definepapersize [C9] [\c!width=40mm,\c!height=57mm] +\definepapersize [C10] [\c!width=28mm,\c!height=40mm] + +%D Per August 2004 the rounding of some (seldom used) sizes +%D were corrected top the latest DIN specifications. Peter +%D Rolf came up with these and a few more missing sizes. +%D Watch out: spaces and slashes! + +\definepapersize [4 A0] [\c!width=1682mm,\c!height=2378mm] +\definepapersize [2 A0] [\c!width=1189mm,\c!height=1682mm] +\definepapersize [C6/C5] [\c!width=114mm,\c!height=229mm] + +%D Because there are no standardized screen sizes, we define +%D a bunch of sizes with $4:3$ ratios. The \type {S6} size is +%D nearly as wide as a sheet of \type {A4} paper. + +\definepapersize [S3] [\c!width=300pt,\c!height=225pt] +\definepapersize [S4] [\c!width=400pt,\c!height=300pt] +\definepapersize [S5] [\c!width=500pt,\c!height=375pt] +\definepapersize [S6] [\c!width=600pt,\c!height=450pt] +\definepapersize [S8] [\c!width=800pt,\c!height=600pt] +\definepapersize [SW] [\c!width=800pt,\c!height=450pt] +\definepapersize [SM] [\c!width=720pt,\c!height=450pt] + +%D These are handy too: + +\definepapersize [S33] [\c!width=300pt,\c!height=300pt] +\definepapersize [S44] [\c!width=400pt,\c!height=400pt] +\definepapersize [S55] [\c!width=500pt,\c!height=500pt] +\definepapersize [S66] [\c!width=600pt,\c!height=600pt] + +%D One may wonder if \TEX\ should be used for typesetting +%D \CDROM\ covers, but it does not hurt to have the paper size +%D ready. + +\definepapersize [CD] [\c!width=120mm,\c!height=120mm] + +%D The next series is for our English speaking friends who +%D decided to stick to non metric values. Thanks to Nelson +%D Beebe for completing the inch based list. + +\definepapersize [letter] [\c!width=8.5in,\c!height=11in] +\definepapersize [ledger] [\c!width=11in,\c!height=17in] +\definepapersize [tabloid] [\c!width=17in,\c!height=11in] + +\definepapersize [legal] [\c!width=8.5in,\c!height=14in] +\definepapersize [folio] [\c!width=8.5in,\c!height=13in] +\definepapersize [executive] [\c!width=7.25in,\c!height=10.5in] + +\definepapersize [A] [\c!width=8.5in,\c!height=11in] % 1 sheet +\definepapersize [B] [\c!width=11in,\c!height=17in] % 2 sheets +\definepapersize [C] [\c!width=17in,\c!height=22in] % 4 sheets + +%D The next set is for Tobias Burnus, who gave me the sizes. + +\definepapersize [envelope 9] [\c!width=8.88in,\c!height=3.88in] +\definepapersize [envelope 10] [\c!width=9.5in,\c!height=4.13in] +\definepapersize [envelope 11] [\c!width=10.38in,\c!height=4.5in] +\definepapersize [envelope 12] [\c!width=11.0in,\c!height=4.75in] +\definepapersize [envelope 14] [\c!width=11.5in,\c!height=5.0in] +\definepapersize [monarch] [\c!width=7.5in,\c!height=3.88in] +\definepapersize [check] [\c!width=8.58in,\c!height=3.88in] +\definepapersize [DL] [\c!width=110mm,\c!height=220mm] % [\c!width=220mm,\c!height=110mm] +\definepapersize [E4] [\c!width=280mm,\c!height=400mm] + +%D The next three sets are supplied by Taco: + +\definepapersize [RA0] [\c!width=860mm,\c!height=1220mm] +\definepapersize [RA1] [\c!width=610mm,\c!height=860mm] +\definepapersize [RA2] [\c!width=430mm,\c!height=610mm] +\definepapersize [RA3] [\c!width=305mm,\c!height=430mm] +\definepapersize [RA4] [\c!width=215mm,\c!height=305mm] + +%D ISO SRA (supplementary raw A) sizes: + +\definepapersize [SRA0] [\c!width=900mm,\c!height=1280mm] +\definepapersize [SRA1] [\c!width=640mm,\c!height=900mm] +\definepapersize [SRA2] [\c!width=450mm,\c!height=640mm] +\definepapersize [SRA3] [\c!width=320mm,\c!height=450mm] +\definepapersize [SRA4] [\c!width=225mm,\c!height=320mm] + +%D Swedish thesis formats: + +\definepapersize [G5] [\c!width=169mm,\c!height=239mm] +\definepapersize [E5] [\c!width=155mm,\c!height=220mm] + +%D Industry invention: + +\definepapersize [A3plus] [\c!width=329mm,\c!height=483mm] + +%D We can now default to a reasonable size. We match the print +%D paper size with the typeset paper size. This setting should +%D come after the first layout specification (already done). + +\setuppapersize + [A4][A4] + +%D A few goodies: + +\definepapersize + [oversized] + [ \c!width=\dimexpr\paperwidth +1.5cm\relax, + \c!height=\dimexpr\paperheight+1.5cm\relax] + +\definepapersize + [doublesized] + [ \c!width=\dimexpr \paperwidth \relax, + \c!height=\dimexpr2\paperheight\relax] + +\definepapersize + [doubleoversized] + [ \c!width=\dimexpr \paperheight+1.5cm\relax, + \c!height=\dimexpr2\paperwidth +1.5cm\relax] + +%D For orthogonality: + +\definepapersize + [undersized] + [ \c!width=\dimexpr\paperwidth -1.5cm\relax, + \c!height=\dimexpr\paperheight-1.5cm\relax] + +\definelayout + [\v!page] + [\c!backspace=\zeropoint, + \c!cutspace=\zeropoint, + \c!topspace=\zeropoint, + \c!bottomspace=\zeropoint, + \c!margin=\zeropoint, + \c!edge=\zeropoint, + \c!header=\zeropoint, + \c!footer=\zeropoint, + \c!top=\zeropoint, + \c!bottom=\zeropoint, + \c!leftmargin=\zeropoint, + \c!rightmargin=\zeropoint, + \c!leftedge=\zeropoint, + \c!rightedge=\zeropoint, + \c!textdistance=\zeropoint, + \c!width=\v!middle, + \c!height=\v!middle, + \c!lines=0, + \c!grid=\v!no] + +\definelayout + [\v!middle] + [\c!width=\v!middle, + \c!height=\v!middle] + +\protect \endinput diff --git a/tex/context/base/page-lin.mkiv b/tex/context/base/page-lin.mkiv index ad84fc8b2..c82d4d520 100644 --- a/tex/context/base/page-lin.mkiv +++ b/tex/context/base/page-lin.mkiv @@ -99,7 +99,8 @@ {\dontleavehmode\begingroup \global\advance\linerefcounter\plusone \dosetattribute{line-reference}\linerefcounter - #3\rawtextreference\s!lin{#2}{\noexpand\ctxlua{tex.sprint(nodes.lines.number(\the\linerefcounter))}}% + % this will change and is troublesome anyway + #3\textreference[#2]{\noexpand\ctxlua{tex.sprint(nodes.lines.number(\the\linerefcounter))}}% \endgroup} \def\mkstartlinereference#1{\mksomelinereference{#1}{lr:b:#1}{}\ignorespaces} @@ -391,8 +392,8 @@ \doifreferencefoundelse{lr:e:#1} {\let\tline\currenttextreference \ifx\fline\tline#2\else#3\fi} - {#2}} - {#2}} + {\unknownreference{#1}#2}} + {\unknownreference{#1}#2}} \def\inline#1[#2]% {\doifelsenothing{#1} diff --git a/tex/context/base/page-log.tex b/tex/context/base/page-log.mkii index e52c36288..18c7991b1 100644 --- a/tex/context/base/page-log.tex +++ b/tex/context/base/page-log.mkii @@ -15,22 +15,6 @@ \unprotect -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - %D Although logos can conveniently be implemented on top of %D background and text areas, we provide a dedicated mechanism %D here. One reason is that such a separate mechanism cannot diff --git a/tex/context/base/page-mak.tex b/tex/context/base/page-mak.mkii index 040feb1d2..040feb1d2 100644 --- a/tex/context/base/page-mak.tex +++ b/tex/context/base/page-mak.mkii diff --git a/tex/context/base/page-mak.mkiv b/tex/context/base/page-mak.mkiv new file mode 100644 index 000000000..45a1f1167 --- /dev/null +++ b/tex/context/base/page-mak.mkiv @@ -0,0 +1,233 @@ +%D \module +%D [ file=page-mak, % copied from main-001, +%D version=1997.03.31, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Simple MakeUp, +%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 Page Macros / MakeUp} + +\unprotect + +%D \macros +%D {definemakeup, setupmakeup, startmakeup} +%D +%D A makeup is a separate page, like a title page or colofon. +%D There is one standard makeup page, but you can define more +%D if needed. +%D +%D \starttyping +%D \startstandardmakeup +%D My Fancy Title +%D \stopstandardmakeup +%D \stoptyping +%D +%D The associated commands are: +%D +%D \showsetup{definemakeup} +%D \showsetup{setupmakeup} +%D \showsetup{startmakeup} + +\def\definemakeup + {\dodoubleargument\dodefinemakeup} + +\def\dodefinemakeup[#1][#2]% + {\getparameters + [\??do#1]% + [\c!width=\innermakeupwidth, % example in manual / was \makeupwidth + \c!height=\textheight, % example in manual + \c!voffset=\!!zeropoint, % example in manual + \c!hoffset=\!!zeropoint, % example in manual + \c!commands=, + \c!setups=, + \c!page=\v!right, + \c!doublesided=\v!empty, + \c!before=, + \c!top=\vss, + \c!bottom=\vss, + \c!after=, + \c!bottomstate=\v!normal, + \c!topstate=\v!normal, + \c!textstate=\v!normal, + \c!headerstate=\v!stop, + \c!footerstate=\v!stop, + \c!pagestate=\v!stop, % in manual ! ! ! + \c!color=, + \c!align=, + #2]% + \setvalue{\e!start#1\e!makeup}{\startmakeup[#1]}% + \setvalue{\e!stop #1\e!makeup}{\stopmakeup}} + +\def\setupmakeup + {\dodoubleargument\dosetupmakeup} + +\def\dosetupmakeup[#1]% + {\getparameters[\??do#1]} + +%D This will save us some 375 bytes in the format file. + +\def\makeupparameter#1{\getvalue{\??do\currentmakeup#1}} + +%D The \type{\start}||\type{\stop} macros are used for both +%D the direct and indirect way. The parameterless call will +%D build a simple box. + +\newtoks\everymakeup + +\appendtoks \postponemarks \to \everymakeup + +\let\currentmakeup\empty + +\def\startmakeup + {\dodoubleempty\dostartmakeup} + +\def\dostartmakeup[#1][#2]% + {\bgroup + \edef\currentmakeup{#1}% + \the\everymakeup + \iffirstargument + \setupmakeup[\currentmakeup][#2]% + \let\stopmakeup\dodostopmakeup + \expandafter \dodostartmakeup + \else + \let\stopmakeup\donostopmakeup + \expandafter \donostartmakeup + \fi} + +%D The simple case: + +\def\donostartmakeup % textwidth ? + {\page + \setupheader[\c!state=\v!empty]% + \setupfooter[\c!state=\v!empty]% + \setsystemmode\v!makeup + \vbox to \textheight\bgroup\hsize\textwidth} + +\def\donostopmakeup + {\egroup + \flushmarks % new, here, else empty pages + \page + \egroup} + +%D The normal one: + +\newbox\makeupbox + +\def\dodostartmakeup + {\doifvaluesomething{\??do\currentmakeup\c!page} + {\ExpandFirstAfter\page[\makeupparameter\c!page]}% + \pagetype[\currentmakeup]% + \setsystemmode\v!makeup + \setupmakeuplayout + \makeupparameter\c!commands % hm, what is this one doing here ? + \startregistercolor[\makeupparameter\c!color]% + \forgetall % else indented flush + \global\setbox\makeupbox\vbox to \makeupparameter\c!height + \bgroup + \setups[\makeupparameter\c!setups]% + \hsize\makeupparameter\c!width + \doifsomething{\makeupparameter\c!align} + {\setupalign[\makeupparameter\c!align]}% + \makeupparameter\c!top} + +\def\dodostopmakeup + {\endgraf + \makeupparameter\c!bottom + \egroup + \flushmarks % new, here, else empty pages + \stopregistercolor + \doflushmakeup + \egroup + \calculatehsizes + \calculatevsizes} + +%D Selective page processing is handled here. (Why?) + +\def\doflushmakeup + {\ifprocessingpages + \ifpageselected + \doshipoutmakeup + \fi + \else + \ifpageselected \else + \doshipoutmakeup + \fi + \fi + \ifselectingpages + \global\pageselectedfalse + \fi} + +% \def\pushpagestate{\globalpushmacro\@@pnstate} +% \def\poppagestate {\globalpopmacro \@@pnstate} + +\def\doshipoutmakeup + {\pushpagestate % new + \makeupparameter\c!before + \setbox\makeupbox\vbox{\hbox{\color[\makeupparameter\c!color]{\box\makeupbox}}}% + % \ifgridsnapping + % new per 22/6/2006 + \ifdim\ht\makeupbox>\vsize + \ht\makeupbox\vsize + \fi + % \fi + \box\makeupbox + \setuppagenumber[\c!state=\makeupparameter\c!pagestate]% + \setupmakeuplayout + \page + \makeupparameter\c!after + \relax % voor fi + \ifdoublesided \ifodd\realpageno\else + \processaction + [\makeupparameter\c!doublesided] + [ \v!yes=>\null + \page, + \v!empty=>{\setupmakeuplayout + \page[\v!blank]% + \null + \page}]% + \fi \fi + \poppagestate} % new + +%D The text surrounding the main body text can be influenced +%D by setting their associated status variables. The +%D connection between them is made by the following macro + +\def\setupmakeuplayout + {\setupfooter[\c!state=\makeupparameter\c!footerstate]% + \setupheader[\c!state=\makeupparameter\c!headerstate]% + \setuptext [\c!state=\makeupparameter\c!textstate]% + \setupbottom[\c!state=\makeupparameter\c!bottomstate]% + \setuptop [\c!state=\makeupparameter\c!topstate]% + % this is needed, but no \setuplayout here; fails in texexec --fig=c + \recalculatelayout} + +%D The standard page template is defined as follows: + +\definemakeup + [\v!standard] + [\c!width=\innermakeupwidth, + \c!height=\textheight, + \c!voffset=\!!zeropoint, + \c!hoffset=\!!zeropoint, + \c!page=\v!right, + \c!doublesided=\v!empty] + +\definemakeup + [\v!text] + [\c!topstate=\v!start, + \c!headerstate=\v!start, + \c!textstate=\v!start, + \c!footerstate=\v!start, + \c!bottomstate=\v!start, + \c!doublesided=\v!no, + \c!page=\v!yes, + \c!top=\pseudostrut\ignorespaces, + \c!bottom=\obeydepth\vss] + +\protect \endinput diff --git a/tex/context/base/page-mar.tex b/tex/context/base/page-mar.mkii index f7c5328f3..f7c5328f3 100644 --- a/tex/context/base/page-mar.tex +++ b/tex/context/base/page-mar.mkii diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv new file mode 100644 index 000000000..28f82efe5 --- /dev/null +++ b/tex/context/base/page-mar.mkiv @@ -0,0 +1,838 @@ +%D \module +%D [ file=page-mar, % moved here from main-001 +%D version=1997.03.31, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Marginal Things, +%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 Support for margin words is one of the reasons for writing +%D \CONTEXT. Over time support for marginal content has been +%D extended en enhanced. Therefore it's always good to watch +%D out for unexpected side effects. + +\writestatus{loading}{ConTeXt Page Macros / Maginal Things} + +\unprotect + +%D There are three categories and their historically grown meaning is +%D as follows: +%D +%D marginlines: these are flushed relative to the start of a line and +%D need to be invoked there. +%D +%D marginwords: these can be issued in the text flow and will migrate +%D sidewards; in spite of the name, it can be a paragraph of text as +%D well, but normally it's words. +%D +%D margintexts: these can be set beforehand and are flushed at the +%D next paragraph of text (of header) +%D +%D While these mechanisms were rather separated, they now are slightly +%D more integrated. Instead of low level instances we now have a mechanism +%D for defining additional ones. + +%D \macros +%D {inleftedge,inleftmargin,inrightmargin,inrightedge} +%D +%D The fast and clean way of putting things in the margin is +%D using \type{\rlap} or \type{\llap}. Unfortunately these +%D macro's don't handle indentation, left and right skips. We +%D therefore embed them in some macro's that (force and) +%D remove the indentation and restore it afterwards. + +\def\definemarginline + {\dodoubleargument\dodefinemarginline} + +\def\dodefinemarginline[#1][#2]% + {\getparameters + [\??im\??im#1] + [\c!location=\v!left, + \c!distance=\zeropoint, + \c!width=\leftmarginwidth, + \c!hoffset=\leftmargindistance, + \c!command=, + #2]% + \unexpanded\setvalue{#1}{\dohandlemarginline{#1}}} + +\def\marginlineparameter #1{\csname\??im\??im\currentmarginline#1\endcsname} +\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}} + +\def\dohandlemarginline#1% #2 + {\def\currentmarginline{#1}% + \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}} % {#2} + +\def\doleftmarginline#1#2% #1 is redundant (we can remove it when we group dohandlemarginline; maybe ... + {\pushindentation + \llap + {\def\currentmarginline{#1}% + \postsignalrightpage + \hsize\marginlineparameter\c!width\relax + \marginlineexecuter\c!command\firstofoneargument{#2}\relax + \hskip\dimexpr + +\leftskip + +\compensatedinnermakeupmargin + +\marginlineparameter\c!hoffset + +\marginlineparameter\c!distance + \relax}% + \popindentation + \ignorespaces} + +\def\dorightmarginline#1#2% #1 is redundant + {\pushindentation + \rlap + {\def\currentmarginline{#1}% + \postsignalrightpage + \hskip\dimexpr + +\hsize + -\rightskip + +\compensatedinnermakeupmargin + +\marginlineparameter\c!hoffset + +\marginlineparameter\c!distance + \relax + \hsize\marginlineparameter\c!width + \marginlineexecuter\c!command\firstofoneargument{#2}}% + \popindentation + \ignorespaces} + +\long\def\installmarginlinehandler#1#2{\setvalue{\s!do\??im\??im#1}{#2}} + +\installmarginlinehandler \v!left {\doleftmarginline} +\installmarginlinehandler \v!right {\dorightmarginline} +\installmarginlinehandler \v!inner {\presignalrightpage\doifrightpageelse\doleftmarginline \dorightmarginline} +\installmarginlinehandler \v!outer {\presignalrightpage\doifrightpageelse\dorightmarginline\doleftmarginline } + +\definemarginline[inleftmargin] [\c!location=\v!left, \c!width=\leftmarginwidth, \c!distance=\leftmargindistance, \c!hoffset=\zeropoint] +\definemarginline[inrightmargin][\c!location=\v!right,\c!width=\rightmarginwidth,\c!distance=\rightmargindistance,\c!hoffset=\zeropoint] +\definemarginline[inleftedge] [\c!location=\v!left, \c!width=\leftedgewidth, \c!distance=\leftedgedistance, \c!hoffset=\leftmargintotal] +\definemarginline[inrightedge] [\c!location=\v!right,\c!width=\rightedgewidth, \c!distance=\rightedgedistance, \c!hoffset=\rightmargintotal] + +\definemarginline[inoutermargin][\c!location=\v!outer,\c!width=\outermarginwidth,\c!distance=\outermargindistance,\c!hoffset=\zeropoint] +\definemarginline[ininnermargin][\c!location=\v!inner,\c!width=\innermarginwidth,\c!distance=\innermargindistance,\c!hoffset=\zeropoint] +\definemarginline[inouteredge] [\c!location=\v!outer,\c!width=\outeredgewidth, \c!distance=\outeredgedistance, \c!hoffset=\outermargintotal] +\definemarginline[ininneredge] [\c!location=\v!inner,\c!width=\inneredgewidth, \c!distance=\inneredgedistance, \c!hoffset=\innermargintotal] + +\definemarginline[atleftmargin] [\c!location=\v!left, \c!command=\lrlap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint] +\definemarginline[atrightmargin][\c!location=\v!right,\c!command=\rllap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint] + +\ifx\lrlap\undefined \def\lrlap#1{\llap{\rlap{#1}}} \fi +\ifx\rllap\undefined \def\rllap#1{\rlap{\llap{#1}}} \fi + +\def\lrlap#1{\llap{\rlap{#1}}} +\def\rllap#1{\rlap{\hskip\hsize\llap{#1}}} + +%D We want to keep things efficient and therefore only handle +%D situations like: +%D +%D \startbuffer +%D \inleftedge {fine} some text \par +%D \strut \inleftmargin {fine} some text \par +%D \noindent \inrightmargin {fine} some text \par +%D \noindent \strut \inrightedge {fine} some text \par +%D \stopbuffer +%D +%D \typebuffer +%D +%D which looks like: +%D +%D \bgroup +%D \getbuffer +%D \parindent 30pt +%D \getbuffer +%D \egroup +%D +%D A torture test: +%D +%D \starttyping +%D \def\TestLine#1#2{\backgroundline[#1]{\strut\white\tttf#2~\recurselevel}} +%D +%D \startbuffer +%D \inleftmargin {\TestLine{red} {lm}} test test test \par +%D \inrightmargin{\TestLine{green} {rm}} test test test \par +%D \inleftedge {\TestLine{red} {le}} test test test \par +%D \inrightedge {\TestLine{green} {re}} test test test \par +%D \inoutermargin{\TestLine{blue} {om}} test test test \par +%D \ininnermargin{\TestLine{yellow}{im}} test test test \par +%D \inouteredge {\TestLine{blue} {oe}} test test test \par +%D \ininneredge {\TestLine{yellow}{ie}} test test test \par +%D \atleftmargin {\TestLine{red} {alm}} \hfill test \par +%D \atrightmargin{\TestLine{green} {arm}} test \hfill \par +%D \stopbuffer +%D +%D \dorecurse{40}\getbuffer \page +%D \stoptyping + +%D New, yet undocumented: +%D +%D used for pascal: +%D +%D \starttyping +%D \index {test} test \index {west} west \index {rest} rest +%D +%D \startnarrower +%D \placeregister[index][alternative=b,command=\atleftmargin] +%D \stopnarrower +%D \stoptyping + +% todo: compensate distance when setuplayout[textwidth=..] +% todo: generalize margin/edge model, now too much duplication + +%D The next bunch of macros looks messy which is due to its +%D multi-purpose character. + +\chardef\margincontentdisplacement \zerocount +\let \margincontentdistance \!!zeropoint +\let \margincontenthoffset \!!zeropoint +\def \margincontentlines {1} +\def \margincontenttag {0} +\let \margincontentseparator \empty +\def \margincontentstrutheight {\strutht} + +\newcount\margincontentlevel +\newdimen\margincontentheight + +\def\setupinmargin + {\dodoubleempty\dosetupinmargin} + +\def\dosetupinmargin[#1][#2]% + {\ifsecondargument + \processcommalist[#1]{\dodosetupinmargin[#2]}% becomes [#2]{##1} + \else + \getparameters[\??im][#1]% + \fi} + +% \def\dodosetupinmargin[#1]#2% [settings]{class} +% {\checkinmargin[#2]% +% \getparameters[\??im#2][#1]} + +\def\dodosetupinmargin[#1]#2% [settings]{class} + {\checkinmargin[#2]% + \getparameters[\??im#2][#1]% + % will become an \everyinmarginsetup thing + \ifcase\executeifdefined{\??im#2\c!sidemethod}{0}\else + \positioningtrue \positioningpartrue % global ? + \fi} + +\def\checkinmargin[#1]% + {\ifcsname\??im#1\c!offset\endcsname\else % this offset is related to framed ! + \addtocommalist{#1}\inmargintaglist + \presetmargintext[#1]% + \fi} + +\def\presetmargintext[#1]% + {\presetlocalframed + [\??im#1]% + \getparameters + [\??im#1] + [\c!frame=\v!off, + \c!offset=\v!overlay, + \c!line=1, + \c!separator=, + \c!width=\v!broad, + \c!distance=, % empty = signal + \c!hoffset=\zeropoint, + \c!style=\@@imstyle, + \c!color=\@@imcolor, + \c!strut=\@@imstrut, + \c!location=\@@imlocation, + \c!align=\@@imalign, + \c!before=\@@imbefore, + \c!after=\@@imafter]} + +\newdimen\naturalmargincontentheight + +\def\makemargintextblock#1#2#3% width l r content + {\bgroup + \forgetall % added, else problems with 'center' and nested itemize + \dontcomplain + \hsize\getvalue{\??im#1\c!width}\relax + \doifnumberelse\margincontenttag + {\ifcase\margincontenttag\relax + \edef\margincontenttag{#1}% first one is setups id as well + \fi} + \donothing + \doifnumberelse\margincontenttag + {\ifnum\margincontenttag>25 % to be translated + \writestatus\m!systems{potential margin stack overflow (\margincontenttag)}% + \fi} + \donothing + % we need to preserve {a,b,c} kind of settings + \let\margincontentalign#1% + \processallactionsinset + [\getvalue{\??im\margincontenttag\c!align}] + [ \v!yes=>\let\margincontentalign#1, + \v!no=>\let\margincontentalign\v!normal, + \v!inner=>\let\margincontentalign#1, + \v!outer=>\let\margincontentalign#2, + \v!left=>\let\margincontentalign\v!left, + \v!middle=>\let\margincontentalign\v!middle, + \v!right=>\let\margincontentalign\v!right]% + \doifvaluesomething{\??im\margincontenttag\c!align} % watch {} around set + {\edef\margincontentalign{{\getvalue{\??im\margincontenttag\c!align},\margincontentalign}}}% + % + \expanded{\getparameters[\??im\margincontenttag][\c!align=\margincontentalign]}% + % + \edef\margincontentstrut{\getvalue{\??im\margincontenttag\c!strut}}% + \savestrut % + \setbox\scratchbox\vbox\localframed + [\??im\margincontenttag] + [\c!strut=\v!no,\c!offset=\v!overlay] % strut handled internally + {\decrement\margincontentlines + \dorecurse\margincontentlines{\savedstrut\endgraf\nointerlineskip}% ! savedstrut + \@@imbefore + \dostartattributes{\??im\margincontenttag}\c!style\c!color\empty + \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no + \begstrut#3\endstrut\endgraf + \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed + \dostopattributes + \@@imafter}% + \global \naturalmargincontentheight\ht\scratchbox + \global\advance\naturalmargincontentheight\dp\scratchbox + \doif\@@imstack\v!yes + {\def\overlappingmargin{-20\scaledpoint}% test value, maybe .25\strutboxdp, maybe configurable + \setbox\scratchbox\vbox{\stackeddown\vbox{\box\scratchbox}}}% new + \ht\scratchbox\strutht + \dp\scratchbox\strutdp % nieuw + \box\scratchbox + \egroup} + +%D The stacker permits constructs like: +%D +%D \starttyping +%D \setupinmargin[stack=yes] +%D +%D \inleft{test 1}test\break +%D \inleft{test 2}test\break +%D \inleft{test 1} +%D \input tufte +%D \inleft{test 1} +%D \inleft{test 2} +%D \inleft{test 3} +%D \input tufte +%D \inleft{test 1} +%D \inleft{test 2\endgraf test 3} +%D \inleft{test 4} +%D \input tufte +%D \inleft{test 1} +%D \inleft{test 2\endgraf test 3} +%D \inleft{test 4\endgraf test 5\endgraf test 6} +%D \inleft{test 7\endgraf test 8\endgraf test 9} +%D \input tufte +%D \stoptyping + +%D This approach permits us to implement a better mechanism +%D later. We need the \type {\graphicvadjust} in order to +%D handle: +%D +%D \starttyping +%D \inleft{test} {\red \dorecurse{40}{test }\par} +%D {\red \inleft{test} \dorecurse{40}{test }\par} +%D \stoptyping +%D +%D The outer margin color is either black or color set as +%D main text color. + +\newif\ifrightmargin % documenteren + +\ifx\dopositionmarginbox\undefined + \def\dopositionmarginbox#1{\graphicvadjust{\box#1}} +\fi + +% watch out, margin dimensions are swapped locally (\swapmargins) + +% with \margincontentmethod one can control pagebreaks +% +% 0 no break +% 1 each entry is one line +% 2 only natural height +% 3 also stack height + +\chardef\margincontentmethod \plusthree % beware: 1 = old method +\chardef\marginpagecheckmethod\plusone + +\def\margincontentextralines{1} % old method, play safe +\def\nofmargincontentlines {0} + +\def\doplacemargintext#1#2#3#4% + {\dontcomplain + \strut + \doifsomething{#1} + {\def\margincontenttag{#1}}% + \doifinsetelse{\margincontenttag}{\v!left,\v!right} % ugly hack + {\let \margincontentdistance \empty % signal + \let \margincontenthoffset \zeropoint} + {\edef\margincontentdistance{\executeifdefined{\??im\margincontenttag\c!distance }\empty }% signal + \edef\margincontenthoffset {\executeifdefined{\??im\margincontenttag\c!hoffset }\zeropoint}}% + \edef\margincontentlines {\executeifdefined{\??im\margincontenttag\c!line }\plusone }% + \edef\margincontentseparator {\executeifdefined{\??im\margincontenttag\c!separator}\donothing}% + \setbox\scratchbox\hbox{#4}% % todo: make sure that color stack works + \ifcase\margincontentmethod + \scratchdimen\zeropoint + \or % old method + \scratchdimen\ht\scratchbox + \advance\scratchdimen\dp\scratchbox + \or + \scratchdimen\naturalmargincontentheight + \or + \scratchdimen\naturalmargincontentheight + \ifx\laststackvmove\undefined\else\global\advance\scratchdimen\laststackvmove\fi + \fi + \ifdim\scratchdimen>\margincontentheight + \global\margincontentheight\scratchdimen + \fi + \setbox\scratchbox\hbox + {#2{\hskip#3\strut + \ifcase\margincontentdisplacement + % normal, move strutheight up + \scratchdimen\strutdp + \advance\scratchdimen \margincontentstrutheight + \advance\scratchdimen -\strutht + \raise\scratchdimen + \or + % low, obey vadjust + \fi + \box\scratchbox}}% + \ht\scratchbox\zeropoint + \dp\scratchbox\zeropoint + \gdef\margincontentstrutheight{\the\strutht}% + %\graphicvadjust{\box\scratchbox}} % fails in high math lines, let it be + %\hbox{\lower\strutdp\box\scratchbox}} % alas, wrong lapping, therefore useless + \dopositionmarginbox\scratchbox} + +% \def\domarginblockskip#1% +% {\hskip\margincontenthoffset +% \hskip\compensatedinnermakeupmargin\relax +% \doifelsenothing\margincontentdistance +% {\hskip\getvalue{\??im#1\c!distance}} +% {\hskip\margincontentdistance}% +% \relax} + +\def\domarginblockskip#1% + {\doifelsenothing\margincontentdistance + {\hskip\dimexpr + +\margincontenthoffset + +\compensatedinnermakeupmargin + +\csname\??im#1\c!distance\endcsname + \relax} + {\dimexpr + +\margincontenthoffset + +\compensatedinnermakeupmargin + +\margincontentdistance + \relax}% + \relax} + +\def\doleftmarginblock#1#2% + {\doplacemargintext{#1}\llap\zeropoint + {\llap{\placemargincontentseparator}% + \makemargintextblock\v!left\v!right{#2}% + \domarginblockskip\v!left}} + +\def\dorightmarginblock#1#2% + {\doplacemargintext{#1}\rlap\hsize + {\hskip\textwidth\hskip-\hsize % new: hsize correction + \domarginblockskip\v!right + \makemargintextblock\v!right\v!left{#2}% + \rlap{\placemargincontentseparator}}} + +\def\placemargincontentseparator + {\ifnum\margincontentlevel>\zerocount + \ifx\margincontentseparator\empty\else + \bgroup + \scratchdimen\margincontentlines\lineheight + \advance\scratchdimen -\lineheight + \lower\scratchdimen\hbox{\margincontentseparator}% + \egroup + \fi + \fi} + +\newbox\marginconstructbox + +\def\doinmarginswapped#1#2#3#4% + {\iffirstsidefloatparagraph\nowhitespace\fi % zo laat mogelijk + \setbox\marginconstructbox\hbox\bgroup % prevents page break in the middle of construction + \startsignalrightpage + \doifswappedrightpageelse + {\rightmargintrue #2} + {\rightmarginfalse#1} + {#3}% setups + {#4}% content + \stopsignalrightpage + \egroup + \unhbox\marginconstructbox} + +% history made this a bit complicated, the +/- was needed before +% we had enough mem/hash to do the page correction + +\edef\inmargintaglist{+,-,\v!low,\v!left,\v!right,\v!inner,\v!outer} + +% the old one: +% +% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7 +% {\doifcommonelse{+,-,\v!laag}{#4} +% {\dodoinmargin[#1][#2][#3][#4][#5]} +% {\dodoinmargin[#1][#2][#3][][#4]}} +% +% an alternative: +% +% \letvalue{\??im\v!laag\c!offset}\empty +% \letvalue{\??im +\c!offset}\empty +% \letvalue{\??im -\c!offset}\empty +% +% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7 +% {\doifnumberelse{#4} +% {\dodoinmargin[#1][#2][#3][#4][#5]} +% {\doifdefinedelse{\??im#4\c!offset} +% {\dodoinmargin[#1][#2][#3][#4][#5]} +% {\dodoinmargin[#1][#2][#3][][#4]}}} +% +% the problem is that we need to keep downward compatibility +% with respect to the first argument thing a reference or a +% directive; the alternative is to force users to pass a +% directive along with a reference; anyhow, as long as one +% does not use references that have the same name as a +% directive we can use the (slow) alternative + +\def\doinmargin[#1][#2][#3][#4][#5]% #6 #7 + {\expanded{\doifinsetelse{#4}{\inmargintaglist}} + {\dodoinmargin[#1][#2][#3][#4][#5]} + {\dodoinmargin[#1][#2][#3][][#4]}} + +\def\defineinmargin + {\doquadrupleempty\dodefineinmargin} + +\def\dodefineinmargin[#1][#2][#3][#4]% + {\doifassignmentelse{#4} + {\setupinmargin[#1][#4]% + \setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#1]}} + {\setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#4]}}} + +\defineinmargin [inleft] [\v!left] [\v!normal] % takes left settings +\defineinmargin [inright] [\v!right] [\v!normal] % takes right settings +\defineinmargin [ininner] [\v!inner] [\v!normal] % takes left/right settings +\defineinmargin [inouter] [\v!outer] [\v!normal] % takes left/right settings +\defineinmargin [inmargin] [\@@imlocation] [\v!normal] % takes left/right settings +\defineinmargin [inother] [\@@imlocation] [\v!reverse] % takes left/right settings + +\def\inothermargin{\inother} + +%D This permits definitions like: +%D +%D \starttyping +%D \defineinmargin [SomePlace] [inner] [normal] [distance=1cm] +%D \defineinmargin [SomePlace] [inner] [normal] [SomePlace] \setupinmargin[SomePlace][distance=1cm] +%D \defineinmargin [MyPlace] [inner] [normal] [SomePlace] +%D \defineinmargin [YourPlace] [inner] [normal] [SomePlace] +%D \stoptyping +%D +%D A torture test: +%D +%D \starttyping +%D \startbuffer +%D \inleft {\TestLine{red} {l}} test test test \par +%D \inright {\TestLine{green} {r}} test test test \par +%D \inmargin {\TestLine{blue} {m}} test test test \par +%D \inothermargin{\TestLine{yellow} {x}} test test test \par +%D \ininner {\TestLine{cyan} {i}} test test test \par +%D \inouter {\TestLine{magenta}{o}} test test test \par +%D \stopbuffer +%D +%D \dorecurse{80}\getbuffer \page +%D \stoptyping +%D +%D and +%D +%D \starttyping +%D \defineinmargin [InOuterA] [outer] [normal] [distance=0cm] +%D \defineinmargin [InOuterB] [outer] [normal] [distance=1cm] +%D \defineinmargin [InOuterC] [outer] [normal] [distance=2cm,line=2] +%D +%D \startbuffer +%D \InOuterA{\TestLine{red} {A}} test test test \par +%D \InOuterB{\TestLine{green}{B}} test test test \par +%D \InOuterC{\TestLine{blue} {C}} test test test \par +%D \stopbuffer +%D +%D \dorecurse{80}\getbuffer \page +%D +%D \dorecurse{10}{\inleft {one} test \inleft {two} test } \page +%D +%D \start +%D \margintext {one} \margintext {two} \input thuan \par +%D \setupinmargin[1][line=3,distance=1cm] +%D \margintext [1]{one} +%D \margintext [2]{two} +%D \input thuan \page +%D \stop +%D +%D \setupinmargin[3][location=inner,distance=1cm] +%D \setupinmargin[4][location=outer,distance=2cm] +%D +%D % \setupinmargin[left] [line=2] +%D % \setupinmargin[right][line=2] +%D +%D \dorecurse +%D {10} +%D {\margintext {\kern3cm\TestLine{blue}{none}} +%D \margintext[3] {\TestLine{darkgray}{3}} +%D \margintext[4] {\TestLine{darkgray}{4}} +%D \margintext[left] {\TestLine{red} {left}} +%D \margintext[right]{\TestLine{green} {right}} +%D \margintext[inner]{\TestLine{cyan} {inner}} +%D \margintext[outer]{\TestLine{magenta} {outer}} +%D \input thuan \endgraf} +%D +%D \dorecurse{10}{\margintext{test\\test\\test} \input thuan \endgraf} +%D \stoptyping + +% Test case: +% +% \setuppagenumbering[alternative=doublesided] \setupwhitespace[medium] +% +% \placefigure[right]{}{\externalfigure[dummy][width=2cm]} +% \input tufte \inothermargin{test} \input tufte + +% test first +% +% setupsystem[random=1235] +% +% \setupinmargin[left][sidemethod=3] +% \dorecurse{10}{test \fakewords{20}{40} test \inleft{test\\test} test \fakewords{20}{40} \par} +% \page +% \setupinmargin[left][sidemethod=4] +% \dorecurse{40}{test \fakewords{50}{80} test \inleft{test\\test} \par} +% \page + +\def\dodoinmargin[#1][#2][#3][#4][#5]#6% + {\bgroup + % old stuff, a bit tricky, but now interfaced + \edef\currentmargincontent{#1}% + \chardef\marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone + \chardef\margincontentmethod \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree + \chardef\marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone + % so far + \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous + \postponenotes % group is (somehow) needed + \doifinsetelse\v!low{#4} + {\chardef\margincontentdisplacement\plusone} + {\chardef\margincontentdisplacement\zerocount}% + \doif\v!reverse{#2} + {\swapmacros\dorightmarginblock\doleftmarginblock}% + \processaction + [#1] + [ \v!left=>\let\next\doleftmarginblock, % no swapping + \v!right=>\let\next\dorightmarginblock, % no swapping + \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }, + \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}, + \s!unknown=>\ifdoublesided + \doifcommonelse{+,-}{#4} + {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }} + {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}% + \else + \let\next\doleftmarginblock + \fi]% + \next{#3}{#6}% + \pagereference[#5]% naar binnen ! ! ! ! + \flushnotes + \egroup % don't forget the group + \ignorespaces} + +% dit zijn voorlopig lokale commando's / vervallen +% +% \def\woordinmarge {\indentation\doquintupleempty\doinmargin[\@@implaats][\inleftmargin][\inrightmarge]} +% +% \def\woordinlinker {\inleftmargin } % vervallen +% \def\woordinrechter{\inrechtermarge} % vervallen + +% Some day: \definemarking[\v!margetitel] + +%D Now come the margin text collectors. The collected content is +%D flushed at every paragraph by the following macro. Note for +%D myself: here the location (plaats) is no longer a tag (number). + +% gone: \def\doflushmargincontent{\doinmargin[\@@implaats][\v!normaal][]} % + [#1][#2]{#3}} + +%D These are now all the same (long ago they had different +%D implementations, somewhere in Sork time if I remember +%D right). + +\def\margintext {\dodoubleempty\domargincontent} +\def\marginword {\margintext} +\def\margintitle{\margintext} % txt mark as well + +\newtoks\collectedmargintexts % so .. delayed! +\chardef\margintextcollected \zerocount + +\def\domargincontent[#1][#2]#3% we used to check for #2/#1 being number, no longer now + {\global\chardef\margintextcollected\plusone + \edef\margincontenttag{#1}% + \ifx\margincontenttag\empty + \global\advance\margincontentlevel\plusone + \edef\margincontenttag{\number\margincontentlevel}% + \fi + \checkinmargin[\margincontenttag]% + \doglobal \appendetoks + \noexpand \checkinmargin[\margincontenttag]% + \noexpand \doinmargin[\executeifdefined{\??im\margincontenttag\c!location}\@@imlocation][\v!normal][\margincontenttag][\margincontenttag][#2]% + \to \collectedmargintexts + \doglobal \appendtoks + {#3}% + \to \collectedmargintexts} + +\let\restoreinterlinepenalty\relax + +\def\flushmargincontents % plural + {\restoreinterlinepenalty % here? + \ifcase\margintextcollected\else % called quite often, so we + \expandafter\doflushmargincontents % speed up the \fi scan by + \fi} % using a \do.. + +\def\doflushmargincontents % links + rechts + {\bgroup + \forgetall + \global\margincontentheight\zeropoint + \startsignalrightpage + \the\collectedmargintexts + \signalrightpage + \stopsignalrightpage + \resetmargincontent + % dirty tricks + \ifcase\margincontentmethod + \donefalse + \else\ifinsidecolumns % brrrr + \donetrue % how fuzzy + \else\ifdim\margincontentheight>\lineheight\relax + \donetrue % how dirty + \else + \donefalse % how needed + \fi\fi\fi + \savemargincontentlines + \ifdone + \advance\margincontentheight \margincontentextralines\lineheight + \ifdim\pagegoal>\pagetotal + \bgroup % preserve \margincontentheight + \advance\margincontentheight \pagetotal + \ifdim\margincontentheight>\pagegoal + \egroup + \ifcase\marginpagecheckmethod + % disabled + \or + \setmargincontentpenalties + \or + % potentially dangerous, maybe better a \goodbreak; the problem is that + % there can be a penalty there, which we then overload and we also introduce + % nasty side effects, so, we drop this option + % \vadjust pre {\page}% + \fi + \else + \egroup + \fi + \fi + \else % We need the above because interlinepenalties overrule vadjusted \nobreaks. + % a bit dangerous + \vadjust{\nobreak}% + \fi + \egroup} + +\def\setmargincontentpenalties + {\getnoflines\margincontentheight + \keeplinestogether\noflines} + +\def\savemargincontentlines + {\bgroup + \advance\margincontentheight \margincontentextralines\lineheight % 1 by default + \getnoflines\margincontentheight + \xdef\nofmargincontentlines{\the\noflines}% + \egroup} + +\def\fillupmargincontentlines % etex ! ! ! + {\endgraf + \begingroup + \scratchcounter\numexpr\nofmargincontentlines-\prevgraf\relax\relax + \ifnum\scratchcounter>\zerocount + \forgetall\dorecurse\scratchcounter{\nobreak\crlf}% + \fi + \endgroup} + +% Yet undocumented, for a manual flush in for instance headers. + +\def\resetmargincontent + {\global\margincontentlevel\zerocount + \global\chardef\margintextcollected\zerocount + \global\collectedmargintexts\emptytoks} + +% \def\placemargincontent +% {\ifcase\margintextcollected\else +% \bgroup +% \chardef\graphicvadjustmode\zerocount +% \doflushmargincontents +% \egroup +% \fi} +% +% font fix: + +\def\placemargincontent + {\ifcase\margintextcollected\else % was level check + \bgroup + \redoconvertfont % !! + \chardef\graphicvadjustmode\zerocount + \doflushmargincontents + \egroup + \fi} + +% For old times sake (i use it in project styles) we provide + +\def\placemargintexts {\placemargincontent} +\def\resetmargetitels {\resetmargincontent} +\def\margewoordpositie{\margewoord} % obsolete, now no longer range + +% but never use them yourself since they may disappear. + +\def\oplinker#1% + {\strut + \graphicvadjust + {\dontcomplain + \setbox\scratchbox\vtop{\forgetall\strut#1}% + \getboxheight\scratchdimen\of\box\scratchbox + \vskip-\scratchdimen % waarom stond hier een \ ? + \box\scratchbox}} + +\setupinmargin + [\c!style=\v!bold, + \c!color=, + \c!strut=\v!auto, + \c!location=\v!both, + \c!align=\v!inner, + \c!stack=\v!no, + \c!before=, + \c!after=] + +\setupinmargin + [\v!left] + [\c!distance=\leftmargindistance, + \c!width=\leftmarginwidth, + %\c!align=\v!left, % no + \c!location=\v!left] + +\setupinmargin + [\v!right] + [\c!distance=\rightmargindistance, + \c!width=\rightmarginwidth, + %\c!align=\v!right, % no + \c!location=\v!right] + +% bonus needed when [inner/outer] is used as tag + +\setupinmargin[\v!inner][\c!location=\v!inner,\c!align=\v!inner] +\setupinmargin[\v!outer][\c!location=\v!outer,\c!align=\v!inner] + +% more efficient (5K less fotmat file) +% +% \letvalue{\??im\v!inner\c!location}\v!inner \letvalue{\??im\v!inner\c!align}\v!inner +% \letvalue{\??im\v!outer\c!location}\v!outer \letvalue{\??im\v!outer\c!align}\v!inner + +\protect \endinput diff --git a/tex/context/base/page-mis.tex b/tex/context/base/page-mis.mkii index bd029f896..bd029f896 100644 --- a/tex/context/base/page-mis.tex +++ b/tex/context/base/page-mis.mkii diff --git a/tex/context/base/page-mis.mkiv b/tex/context/base/page-mis.mkiv new file mode 100644 index 000000000..a620835e4 --- /dev/null +++ b/tex/context/base/page-mis.mkiv @@ -0,0 +1,266 @@ +%D \module +%D [ file=page-mis, +%D version=2008.11.17, % was part of page-flt.tex / 2000.10.20 +%D title=\CONTEXT\ Page Macros, +%D subtitle=Misc Float Things, +%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 Page Macros / Misc Float Things} + +\unprotect + +\newif\ifmargeblokken + +\def\dosetupmarginblocks[#1]% + {\getparameters[\??mb][#1]% + \doifelse\@@mbstate\v!start + {\showmessage\m!layouts4\empty + \margeblokkentrue + \let\somenextfloat\dosomenextfloat + \let\startmarginblock\dostartmarginblock + \let\stopmarginblock\dostopmarginblock}% + {\showmessage\m!layouts5\empty + \margeblokkenfalse + \def\somenextfloat[##1]% + {\someelsefloat[##1,\v!here]}% + \let\startmarginblock\dontstartmargeblok + \let\stopmarginblock\dontstopmargeblok}} + +\def\setupmarginblocks + {\dosingleargument\dosetupmarginblocks} + +\newbox\marginbox + +\def\dosomenextfloat[#1]% + {\global\setbox\marginbox\vbox + {\hsize\@@mbwidth + \unvcopy\marginbox + \ifvoid\marginbox\else\expandafter\@@mbinbetween\fi + \box\floatbox\filbreak}% + \ifdim\ht\marginbox>\textheight + \dosavefloatinfo + \else + \doinsertfloatinfo + \fi} + +\newbox\preparedmarginbox + +\def\reshapemargin + {\ifdim\ht\preparedmarginbox>\zeropoint + \beginofshapebox + \unvbox\preparedmarginbox + \endofshapebox + \reshapebox + {\box\shapebox}% + \setbox\preparedmarginbox\vbox to \textheight + {\@@mbtop + \flushshapebox + \@@mbbottom}% + \fi} + +\def\plaatsrechtermargeblok + {\hskip\rightmarginwidth} + +\def\plaatslinkermargeblok + {\hskip\leftmarginwidth} + +\def\checkmargeblokken + {\ifvoid\marginbox\else\docheckmargeblokken\fi} + +\def\docheckmargeblokken % erg inefficient + {\setbox\preparedmarginbox\vbox + {\forgetall + \splittopskip\topskip + \ifvoid\marginbox\else + \ifdim\ht\marginbox>\textheight + \vsplit\marginbox to \textheight + \else + \unvbox\marginbox + \fi + \fi}% + \reshapemargin + \setbox\preparedmarginbox\vbox + {\@@mbbefore\box\preparedmarginbox\@@mbafter}% + \def\rightmarginbox + {\def\plaatsrechtermargeblok + {\setbox\preparedmarginbox\hbox to \rightmarginwidth + {\@@mbleft\box\preparedmarginbox\@@mbright}% + \vsmashbox\preparedmarginbox + \box\preparedmarginbox}}% + \def\leftmarginbox + {\def\plaatslinkermargeblok + {\setbox\preparedmarginbox\hbox to \leftmarginwidth + {\@@mbright\box\preparedmarginbox\@@mbleft}% + \vsmashbox\preparedmarginbox + \box\preparedmarginbox}}% + \processaction % traag + [\@@mblocation] + [ \v!inmargin=>\doifbothsidesoverruled\rightmarginbox\rightmarginbox\leftmarginbox, + \v!middle=>\doifbothsidesoverruled\rightmarginbox\leftmarginbox\rightmarginbox, + \v!left=>\leftmarginbox, + \v!right=>\rightmarginbox, + \s!unknown=>\setbox\preparedmarginbox\hbox{}]} + +\def\dostartmarginblock % 2 maal \vbox ivm \unvbox elders + {\global\setbox\marginbox\vtop\bgroup\vbox\bgroup + \hsize\@@mbwidth + \ifvoid\marginbox\else + \unvbox\marginbox + \@@mbinbetween + \fi + \setupalign[\@@mbalign]% + \dostartattributes\??mb\c!style\c!color{}% + \begstrut\ignorespaces} + +\def\dostopmarginblock + {\unskip\endstrut + \dostopattributes + \egroup + \egroup} + +\def\dontstartmargeblok + {\@@mbbefore + \bgroup + \dostartattributes\??mb\c!style\c!color\empty} + +\def\dontstopmargeblok + {\dostopattributes + \egroup + \@@mbafter} + +\newcounter\nofpostponedblocks + +\newif\ifinpostponing + +\newevery\everytopofpage\relax + +\appendtoks \the\everytopofpage \to\everystarttext +\appendtoks\global\everytopofpage\emptytoks\to\everystoptext + +% \startpostponing [pagenumber] [+pageoffset] +% +% \startpostponing[2] +% PAGE 2 \blank +% \stoppostponing +% +% \startpostponing[+1] +% PAGE +1 \blank +% \stoppostponing +% +% \startpostponing[+2] +% PAGE +2 \blank +% \stoppostponing +% +% \starttext \dorecurse{4}{\input tufte \page} \stoptext + +\newtoks \postponedpageblocks +\newcounter\nofpostponedpageblocks + +% \ifinpostponing: handhaven, want gebruikt in stijlen ! ! ! ! ! + +\def\flushpagefloats + {\doifoddpageelse + {\ifvoid\collectedleftpagefloats + \ifvoid\collectedrightpagefloats\else + \unvbox\collectedrightpagefloats + \page + %\the\everytopofpage + \fi + \fi} + {\ifvoid\collectedleftpagefloats\else + \unvbox\collectedleftpagefloats + \page + %\the\everytopofpage + \fi + \ifvoid\collectedrightpagefloats\else + \unvbox\collectedrightpagefloats + \page + %\the\everytopofpage + \fi}% + \ifvoid\collectedpagefloats\else + % message + \unvbox\collectedpagefloats + \fi} + +% \def\flushrestfloats +% {\doif{\floatsharedparameter\c!cache}\v!no\doflushfloats} + +% \let\flushrestfloats\relax + +\def\dopostponeblock + {\bgroup % new may 2004 + \setsystemmode\v!postponing % new may 2004 + \the\everytopofpage + %\flushrestfloats + \flushpagefloats + \donefalse + \ifinpostponing \else + \ifcase\nofpostponedblocks \else \donetrue \fi + \ifcase\nofpostponedpageblocks \else \donetrue \fi + \fi + \ifdone + \bgroup % we need the color/font switch, else problems inside split verbatim + \setnormalcatcodes % postponing in verbatim + \restoreglobalbodyfont % The \nof-test is + \global\pagetotal\zeropoint % recently added and + \global\inpostponingtrue % definitely needed else + \the\postponedpageblocks % we can loose or disorder + \dorecurse\nofpostponedblocks % floats; anyhow, this + {\getbuffer[pbuf-\recurselevel]}% % mechanism is still + \doflushfloats % new but potential dangerous % suboptimal and needs a + \doglobal\newcounter\nofpostponedblocks % proper analysis + \global\inpostponingfalse + \egroup + \fi + \egroup} % new may 2004 + +\def\getpostponedblock#1#2% + {\doif{#1}\realfolio{\getbuffer[rbuf-#2]}} % no \ifnum, avoid \fi + +% beware, \dosingleempty conflicts with buffers (feeds back the \par) + +\setvalue{\e!start\v!postponing}% + {\bgroup + \obeylines + \doifnextoptionalelse{\egroup\nodostartpostponing}{\egroup\dodostartpostponing}} + +\def\nodostartpostponing[#1]% + {\doglobal\increment\nofpostponedpageblocks + \bgroup % a little bit of misusing grouping + \doifinstring{+}{#1}\advance \realpageno#1\relax % ugly but efficient + \doglobal\appendetoks\noexpand\getpostponedblock + {\realfolio}{\nofpostponedpageblocks}\to\postponedpageblocks + \egroup + \showmessage\m!layouts3\nofpostponedpageblocks + \dostartbuffer[rbuf-\nofpostponedpageblocks]% + [\e!start\v!postponing][\e!stop\v!postponing]} + +\def\dodostartpostponing + {\doglobal\increment\nofpostponedblocks + \showmessage\m!layouts3\nofpostponedblocks + \expanded{\dostartbuffer[pbuf-\nofpostponedblocks][\e!start\v!postponing][\e!stop\v!postponing]}} + +% Setups: + +\setupmarginblocks + [\c!state=\v!start, + \c!location=\v!inmargin, + \c!width=\rightmarginwidth, + \c!style=, + \c!color=, + \c!align=, + \c!left=, + \c!right=, + \c!top=, + \c!inbetween=\blank, + \c!bottom=\vfill, + \c!before=, + \c!after=] + +\protect \endinput diff --git a/tex/context/base/page-mul.tex b/tex/context/base/page-mul.mkii index c78af074a..c78af074a 100644 --- a/tex/context/base/page-mul.tex +++ b/tex/context/base/page-mul.mkii diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv new file mode 100644 index 000000000..789cfbe43 --- /dev/null +++ b/tex/context/base/page-mul.mkiv @@ -0,0 +1,1755 @@ +%D \module +%D [ file=page-mul, % was: core-mul +%D version=1998.03.15, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Multi Column Output, +%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 Page Macros / Simple Multi Column} + +%D This module is mostly a copy from the original multi column +%D routine as implemented in \type {core-mul}. When the main +%D OTR macro's were isolated in modules and column sets were +%D introduced, this module became part of the OTR modules. As +%D a result this module is no longer generic. It also needs +%D an overhaul. + +\unprotect + +% TO DO ! + +\let\OTRMULsetvsize \OTRONEsetvsize +\let\OTRMULsethsize \OTRONEsethsize +\let\OTRMULdopagecontents \OTRONEdopagecontents +\let\OTRMULfinalsidefloatoutput\OTRONEfinalsidefloatoutput % ??? +\let\OTRMULflushfloatbox \OTRONEflushfloatbox + +\let\OTRMULdosettopinserts \relax +\let\OTRMULdosetbotinserts \relax +\let\OTRMULdotopinsertions \relax +\let\OTRMULdobotinsertions \relax +\let\OTRMULdosetbothinserts \relax +\let\OTRMULflushsavedfloats \relax + +\let\OTRMULflushsidefloats \forgetsidefloats % \relax +\let\OTRMULsynchronizesidefloats\forgetsidefloats % \relax + +\newtoks \OTRMULoutput + +\def\OTRMULgotonextpage + {\ejectpage} + +\def\OTRMULgotonextpageX % will become obsolete + {\superejectpage} + +% check \count<insert> multiplications + +% some day try this in balancing routine +% +% \ifdim\pagetotal>\pagegoal +% \eject +% \else +% \goodbreak +% \fi + +%D The following macro's implement a multi||column output +%D routine. The original implementation was based on Donald +%D Knuth's implementation, which was adapted by Craig Platt to +%D support balancing of the last page. I gradually adapted +%D Platt's version to our needs but under certain +%D circumstances things still went wrong. I considered all +%D calls to Platt's \type{\balancingerror} as undesirable. + +%D This completely new implementation can handle enough +%D situations for everyday documents, but is still far from +%D perfect. While at the moment the routine doesn't support +%D all kind of floats, it does support: +%D +%D \startitemize[packed] +%D \item an unlimitted number of columns +%D \item ragged or not ragged bottoms +%D \item optional balancing without \type{\balancingerrors} +%D \item different \type{\baselineskips}, \type{\spacing}, +%D \type{\topskip} and \type{\maxdepth} +%D \item left- and right indentation, e.g. within lists +%D \item moving columns floats to the next column or page +%D \item handling of floats that are to wide for a columns +%D \stopitemize +%D +%D One could wonder why single and multi||columns modes are +%D still separated. One reason for this is that \TeX\ is not +%D suited well for handling multi||columns. As a result, the +%D single columns routines are more robust. Handling one +%D column as a special case of multi||columns is posible but at +%D the cost of worse float handling, worse page breaking, +%D worse etc. Complicated multi||column page handling should +%D be done in \cap{DTP}||systems anyway. +%D +%D There are three commands provided for entering and leaving +%D multi||column mode and for going to the next column: +%D +%D \interface \type{\beginmulticolumns} \\ \\ +%D \interface \type{\endmulticolumns} \\ \\ +%D \interface \type{\ejectcolumn} \\ \\ +%D +%D This routines are sort of stand||alone. They communicate +%D with the rest of \CONTEXT\ by means of some interface +%D macro's, which we only mention. +%D +%D \interface \type{\nofcolumns} \\ +%D the number of columns \\ +%D \interface \type{\minbalancetoplines} \\ +%D the minimum number op balanced top lines \\ +%D \interface \type{\betweencolumns} \\ +%D the stuff between columns \\ +%D \interface \type{\finaloutput{action}{box}} \\ +%D some kind of \type{\pagebody} and \type{\shipout} \\ +%D +%D \interface \type{\ifbalancecolumns} \\ +%D balancing the colums or not \\ +%D \interface \type{\ifstretchcolumns} \\ +%D ragging the bottom or not \\ +%D +%D \interface \type{\ifheightencolumns} \\ +%D fix the heigh tor not \\ +%D \interface \type{\fixedcolumnheight} \\ +%D the optional fixed height \\ +%D +%D \interface \type{\ifinheritcolumns} \\ +%D handle ragging or not \\ +%D \interface \type{\ifr@ggedbottom} \\ +%D use ragged bottoms \\ +%D \interface \type{\ifb@selinebottom} \\ +%D put the bottom line on the baseline \\ +%D \interface \type{\ifnormalbottom} \\ +%D put the bottom line at the baseline \\ +%D +%D \interface \type{\ifreversecolumns} \\ +%D reverse the order in wich columns are flushed \\ +%D +%D \interface \type{\usercolumnwidth} \\ +%D the calculated width of a column \\ +%D \interface \type{\columntextwidth} \\ +%D the maximum width of a column \\ +%D \interface \type{\columntextheight} \\ +%D the minimum width of a column \\ +%D +%D \interface \type{\spacingfactor} \\ +%D the spacing factor \\ +%D \interface \type{\bodyfontsize} \\ +%D the (local) bodyfontsize \\ +%D \interface \type{\openlineheight} \\ +%D the lineheight (including \type{\spacing}) \\ +%D +%D \interface \type{\EveryBodyFont} \\ +%D communication channel to font switching routines \\ +%D +%D \interface \type{\global\settopskip} \\ +%D set \type{\topskip} \\ +%D \interface \type{\setvsize} \\ +%D set \type{\vsize} and \type{\pagegoal} \\ +%D \interface \type{\sethsize} \\ +%D set \type{\hsize} \\ +%D +%D \interface \type{\flushcolumnfloats} \\ +%D push saved column floats (next page) \\ +%D \interface \type{\flushcolumnfloat} \\ +%D push saved column floats (next column) \\ +%D \interface \type{\setcolumnfloats} \\ +%D initialize column floats \\ +%D +%D \interface \type{\finishcolumnbox} \\ +%D do something special (a hook) \\ +%D \interface \type{\postprocesscolumnpagebox} \\ +%D do something with each columnbox (also a hook) \\ +%D \interface \type{\postprocesscolumnbox} \\ +%D do something with each columnbox (also a hook) \\ +%D \interface \type{\postprocesscolumnline} \\ +%D do something with each columnline (also a hook) \\ +%D \interface \type{\currentcolumn} \\ +%D the current column \\ +%D +%D These interface macro's are called upon or initialized +%D by the multi||column macro's. + +%D A lot of footnote stuff added! + +\def\finalcolumntextwidth {\makeupwidth} +\def\finalcolumntextheight {\textheight} +\def\columntextwidth {\makeupwidth} +\def\columntextheight {\textheight} +\def\usercolumnwidth {\textwidth} +\def\columntextoffset {\!!zeropoint} + +\def\fixedcolumnheight {\textheight} +\def\betweencolumns {\hskip\bodyfontsize} + +\let\setcolumnfloats \relax % in CONTEXT used for floats +\let\flushcolumnfloats \relax % in CONTEXT used for floats +\let\flushcolumnfloat \relax % in CONTEXT used for floats +\let\finishcolumnbox \relax % in CONTEXT used for backgrounds + +% %D In fact, the column height and width are set by means of +% %D two macro's. One can change their meaning if needed: +% +% \def\setcolumntextheight +% {\def\columntextheight{\teksthoogte}} +% +% \def\setcolumntextwidth +% {\def\columntextwidth{\zetbreedte}} + +%D Both macros are redefined in \CONTEXT\ when backgrounds +%D are applied to columns. The final values are used when +%D flushing the columns. + +\newtoks\singlecolumnout % remove that one + +%D It's more convenient to use \type {\columnwidth} instead +%D of messing around with boxes each time. + +\newdimen\columnwidth +\newdimen\gutterwidth + +\def\determinecolumnwidth + {\bgroup + \setbox\scratchbox\hbox + {\setcolumnhsize + \global\columnwidth\usercolumnwidth + \global\gutterwidth\intercolumnwidth}% + \egroup} + +%D Going to a new columns is done by means of a +%D \type{\ejectcolumn}. The following definition does not +%D always work. + +\def\ejectcolumn + {\goodbreak\showmessage\m!columns2\empty} + +%D The next macro should never be called so let's deal with it. +%D There were several solutions to these kind of errors. First +%D we check for a good breakpoint before firing up the +%D multi||column routine (\type{\break} or \type{\allowbreak}). +%D We do the same at the end of the routine +%D (\type{\allowbreak}). These allowances are definitely +%D needed! +%D +%D Some on first sight redundant calls to for instance +%D \type{\setvsize} in the flushing, splitting and balancing +%D macro's can definitely not be omitted! Some are just there +%D to handle situations that only few times arise. One of +%D those can be that the output routine is invoked before +%D everything is taken care of. This happens when we +%D flush (part of) the current page with an \type{\unvbox} +%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One +%D simply cannot balance columns that are just balanced. +%D +%D I hope one never sees the following message. Because it +%D took me a lot of time to develop the multi||columns +%D routines, every (although seldom) warning gives me the +%D creeps! + +\def\balancingerror + {\showmessage\m!columns3\empty + \finaloutput\unvbox\normalpagebox} + +\def\OTRMULsometopsfloat{\showmessage\m!columns4\empty \someherefloat} +\def\OTRMULsomebotsfloat{\showmessage\m!columns5\empty \someherefloat} + +\def\OTRMULsomeherefloat{\OTRONEsomeherefloat} + +%D The local column width is available in the dimension +%D register \type{\localcolumnwidth}, which is calculated as: + +\def\setcolumnhsize % beware, this one is available for use in macros + {\setbox\scratchbox\hbox{\parindent\zeropoint\betweencolumns}% + \intercolumnwidth\wd\scratchbox + \localcolumnwidth\columntextwidth + \advance\localcolumnwidth -\leftskip + \advance\localcolumnwidth -\rightskip + % new + \advance\localcolumnwidth -\colleftskip + \advance\localcolumnwidth -\colrightskip + % + \advance\localcolumnwidth -\nofcolumns\intercolumnwidth + \advance\localcolumnwidth \intercolumnwidth + \divide \localcolumnwidth \nofcolumns + \scratchdimen\columntextoffset + \multiply\scratchdimen \plustwo + \advance\localcolumnwidth -\scratchdimen + \usercolumnwidth\localcolumnwidth + \hsize\localcolumnwidth} % we don't do it \global + +%D Torture test: +%D +%D \startbuffer +%D \startbuffer[b] +%D \startcolumns +%D \input tufte +%D \stopcolumns +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D +%D \startbuffer[b] +%D \startnarrower +%D \input tufte +%D \stopnarrower +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D +%D \startbuffer[b] +%D \startcolumns \startnarrower +%D \input tufte +%D \stopnarrower \stopcolumns +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D +%D \startbuffer[b] +%D \startnarrower \startcolumns +%D \input tufte +%D \stopcolumns \stopnarrower +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D +%D \startbuffer[b] +%D \startcolumns \startnarrower[left] +%D \input tufte +%D \stopnarrower \stopcolumns +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D +%D \startbuffer[b] +%D \startnarrower[left] \startcolumns +%D \input tufte +%D \stopcolumns \stopnarrower +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D +%D \startbuffer[b] +%D \startnarrower \startcolumns \startnarrower +%D \input tufte +%D \stopnarrower\stopcolumns \stopnarrower +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D +%D \startbuffer[b] +%D \startnarrower[left] \startcolumns \startnarrower +%D \input tufte +%D \stopnarrower\stopcolumns \stopnarrower +%D \stopbuffer +%D \typebuffer[b] \getbuffer[b] +%D \stopbuffer +%D +%D \start +%D \def\postprocesscolumnline#1{\ruledhbox{\strut\box#1}\hss} +%D \getbuffer +%D \stop + +%D One should be aware that when font related dimensions are +%D used in typesetting the in||between material, these +%D dimensions are influenced by bodyfont switches inside +%D multi||column mode. + +\newdimen\mcscratchdimen +\newcount\nofcolumnlines + +\chardef\multicolumnlinemethod\zerocount % 0: overshoot (old default), 1: tight +% \chardef\multicolumnlinemethod\plusone + +\def\getmulticolumnlines + {\mcscratchdimen-\columntextoffset + \multiply\mcscratchdimen \plustwo + \advance\mcscratchdimen \columntextheight + \ifdim\precolumnboxheight>\zeropoint + \advance\mcscratchdimen -\precolumnboxheight + \fi + \settotalinsertionheight + \advance\mcscratchdimen -\totalinsertionheight + \ifcase\multicolumnlinemethod \getnoflines\mcscratchdimen + \or \getrawnoflines\mcscratchdimen + \else \getrawnoflines\mcscratchdimen + \fi + % added 30/7/2004 + \ifnum\layoutlines>\zerocount \ifnum\noflines>\layoutlines + \noflines\layoutlines + \fi \fi + \nofcolumnlines\noflines} + +\def\multicolumnovershootratio{.5} % {\ifgridsnapping0\else.5\fi} + +\def\setcolumnvsize + {\getmulticolumnlines + \mcscratchdimen\nofcolumnlines\openlineheight + \advance\mcscratchdimen \multicolumnovershootratio\openlineheight % collect enough data + \global\vsize\nofcolumns\mcscratchdimen + \global\pagegoal\vsize} % let's do it only here + +%D It really starts here. After some checks and initializations +%D we change the output routine to continous multi||column +%D mode. This mode handles columns that fill the current and +%D next full pages. The method used is (more or less) +%D multiplying \type{\vsize} and dividing \type{\hsize} by +%D \type{\nofcolumns}. More on this can be found in the +%D \TeX book. We save the top of the current page in box +%D \type{\precolumnbox}. +%D +%D We manipulate \type{\topskip} a bit, just to be shure that +%D is has no flexibility. This has te be done every time a +%D font switch takles place, because \type{\topskip} can depend +%D on this. +%D +%D Watch the trick with the \type{\vbox}. This way we get the +%D right interlining and white space. + +\def\beginmulticolumns + {\par + \flushnotes + \xdef\precolumndepth{\the\prevdepth}% + \begingroup + % new + \leftskip1\leftskip + \rightskip1\rightskip + \edef\colleftskip {\the\leftskip}% + \edef\colrightskip{\the\rightskip}% + \leftskip\zeropoint + \rightskip\zeropoint + % + \dontshowcomposition + %\setcolumntextwidth\relax + %\setcolumntextheight\relax + \widowpenalty\zerocount % is gewoon beter + \clubpenalty \zerocount % zeker bij grids + \ifsomefloatwaiting + \showmessage\m!columns6{\the\savednoffloats}% + \global\setbox\savedfloatlist\box\floatlist + \xdef\restoresavedfloats + {\global\savednoffloats\the\savednoffloats + \global\setbox\floatlist\box\savedfloatlist + \global\noexpand\somefloatwaitingtrue}% + \global\savednoffloats\zerocount + \global\somefloatwaitingfalse + \else + \global\let\restoresavedfloats\relax + \fi + \dimen0\dimexpr\pagetotal+\parskip+\openlineheight\relax + \ifdim\dimen0<\pagegoal + \allowbreak + \else + \break % Sometimes fails + \fi + \appendtoks\topskip1\topskip\to\everybodyfont + \the\everybodyfont % ugly here + \saveinterlinespace % ugly here + \initializecolumns\nofcolumns + \hangafter\zerocount + \hangindent\zeropoint + \everypar\emptytoks + \ifdim\pagetotal=\zeropoint \else + \verticalstrut + \vskip-\struttotal + \fi + \global\savedpagetotal\pagetotal + \global\singlecolumnout\output + %\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}% + \global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}% + \eject % no \holdinginserts=1, can make footnote disappear ! + \global\precolumnboxheight\ht\precolumnbox + \global\output{\continuousmulticolumnsout}% + \setcolumnfloats + \dohandleallcolumns + {\global\setbox\currenttopcolumnbox\emptybox}% + \checkbegincolumnfootnotes + \activateotr{MUL}{ONE}% todo ! ! ! ! + \let\sethsize\setcolumnhsize + \let\setvsize\setcolumnvsize + \sethsize + \setvsize + \showcomposition} + +%D When we leave the multi||column mode, we have to process the +%D not yet shipped out part of the columns. When we don't +%D balance, we simply force a continuous output, but a balanced +%D output is more tricky. + +%D First we try to fill up the page and when all or something +%D is left we try to balance things. This is another useful +%D adaption of the ancesters of these macro's. It takes some +%D reasoning to find out what happens and maybe I'm making +%D some mistake, but it works. +%D +%D Voiding box \type{\precolumnbox} is sometimes necessary, +%D e.g. when there is no text given between \type{\begin..} +%D and \type{\end..}. The \type{\par} is needed! + +\chardef\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! ! + +\def\endmulticolumns + {%\par + \ifnum\multicolumnendsyncmethod=\plustwo + \synchronizeoutput + \else + % don't combine these + \vskip\lineheight + \vskip-\lineheight % take footnotes into account + \fi + \dontshowcomposition + \doflushcolumnfloat % added recently + %\doflushcolumnfloats % no, since it results in wrong top floats + \flushnotes % before start of columns + \par + \ifbalancecolumns + \ifnum\multicolumnendsyncmethod=\plusone + \global\output{\continuousmulticolumnsout}% + \goodbreak + \fi + \global\output{\balancedmulticolumnsout}% + \else + \goodbreak + \fi + \eject % the prevdepth is important, try e.g. toclist in + \prevdepth\zeropoint % columns before some noncolumned text text + \global\output\singlecolumnout + \global\output{\the\mainoutput}% % % % % todo + \ifvoid\precolumnbox\else + \unvbox\precolumnbox + \fi + \global\precolumnboxheight\zeropoint + \endgroup % here + \nofcolumns\plusone + \setvsize % the outer one! + \synchronizeoutput % new may 2004 / we need to: \pagegoal\vsize + \checkendcolumnfootnotes + \dosomebreak\allowbreak + \restoresavedfloats} + +%D Because some initializations happen three times, we +%D defined a macro for them. Erasing \type{\everypar} is +%D needed because we don't want anything to interfere. + +\def\setmulticolumnsout + {\everypar\emptytoks + \dontcomplain + \settopskip + \setmaxdepth + \topskip1\topskip + \splittopskip\topskip + \splitmaxdepth\maxdepth + \boxmaxdepth\maxdepth % dangerous + \emergencystretch\zeropoint\relax} % sometimes needed ! + +%D Flushing the page comes to pasting the columns together and +%D appending the result to box \type{\precolumnbox}, if not +%D void. I've seen a lot of implementations in which some skip +%D was put between normal text and multi||column text. When we +%D don't want this, the baselines can be messed up. I hope the +%D seemingly complicated calculation of a correction +%D \type{\kern} is adequate to overcome this. Although not +%D watertight, spacing is taken into account and even multiple +%D mode changes on one page go well. But cross your fingers and +%D don't blame me. +%D +%D One of the complications of flushing out the boxes is that +%D \type{\precolumnbox} needs to be \type{\unvbox}'ed, otherwise +%D there is too less flexibility in the page when using +%D \type{\r@ggedbottom}. It took a lot of time before these +%D kind of problems were overcome. Using \type{\unvbox} at the +%D wrong moment can generate \type{\balancingerror}'s. +%D +%D One can use the macros \type {\maxcolumnheight} and \type +%D {\maxcolumndepth} when generating material between columns +%D as well as postprocessing column lines. + +\let\maxcolumnheight=\zeropoint +\let\maxcolumndepth =\zeropoint + +\newbox\columnpagebox + +\def\setmaxcolumndimensions + {\let\maxcolumnheight\!!zeropoint + \let\maxcolumndepth \!!zeropoint + \dohandleallcolumns + {\ifdim\ht\currentcolumnbox>\maxcolumnheight + \edef\maxcolumnheight{\the\ht\currentcolumnbox}% + \fi + \ifdim\dp\currentcolumnbox>\maxcolumndepth + \edef\maxcolumndepth{\the\dp\currentcolumnbox}% + \fi}} + +\chardef\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++ +\chardef\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid + +\def\flushprecolumnboxnogrid + {\unvbox\precolumnbox} + +\def\flushprecolumnboxongrid + {\scratchdimen\savedpagetotal + \advance\scratchdimen -\ht\precolumnbox + \advance\scratchdimen -\dp\precolumnbox + \advance\scratchdimen -\topskip + \box\precolumnbox + \kern\scratchdimen} + +\newconditional\someprecolumncontent + +\def\flushcolumnedpage#1% + {\bgroup + \ifvoid\precolumnbox + \setfalse\someprecolumncontent % will be set elsewhere + \else + \settrue\someprecolumncontent +\mkprocessboxcontents\precolumnbox + \fi + \forgetall + \setmulticolumnsout + \showcomposition + \setmaxcolumndimensions + \dohandleallcolumns + {\mkprocesscolumncontents\currentcolumnbox}% + \postprocesscolumns + \dohandleallcolumns % \hbox i.v.m. \showcomposition + {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth + {\box\currentcolumnbox + \global\wd\currentcolumnbox\localcolumnwidth + \ifheightencolumns + \global\ht\currentcolumnbox\fixedcolumnheight + \fi}}% + \setmaxcolumndimensions + \overlaycolumnfootnotes + \setbox\columnpagebox\vbox + {\hbox to \finalcolumntextwidth + {\hskip\colleftskip\relax % new, \relax needed + \ifreversecolumns + \@EA\dohandlerevcolumns + \else + \@EA\dohandleallcolumns + \fi + {\finishcolumnbox{\hbox + {\ifx\finishcolumnbox\relax\else\strut\fi + \box\currentcolumnbox}}% + \hfil}% + \unskip + \hskip\colrightskip}}% new + \scratchdimen\zeropoint + \dohandleallcolumns + {\ifdim-\ht\currenttopcolumnbox<\scratchdimen + \scratchdimen-\ht\currenttopcolumnbox + \fi + \global\setbox\currenttopcolumnbox\emptybox}% + \advance\scratchdimen \ht\columnpagebox + \setbox\scratchbox\hbox to \columntextwidth + {\vrule + \!!width\zeropoint + \!!height\scratchdimen + \!!depth\dp\columnpagebox + \dostepwiserecurse2\nofcolumns1{\hfil\betweencolumns}\hfil}% + \setbox\columnpagebox\hbox + {\box\columnpagebox + \hskip-\columntextwidth + \box\scratchbox}% + \postprocesscolumnpagebox % new, acts upon \box\columnpagebox + \ifconditional\someprecolumncontent + \settrue\someprecolumncontent + % next some incredible crappy code + \ifcase\multicolumntopalignmethod + \flushprecolumnboxnogrid % not on grid + \or + \flushprecolumnboxongrid % force on grid + \else\ifgridsnapping % somehow this junk fails in pascal + \flushprecolumnboxongrid % obey grid settings, force on grid + \else + \flushprecolumnboxnogrid % ignore grid settings, not on grid + \fi \fi + \fi + \global\precolumnboxheight\zeropoint + \setvsize + \dosomebreak\nobreak % hm, only needed when topstuff + \ifgridsnapping + \else + \ifcase\multicolumntopflushmethod + % sometimes method 1 goes wrong, so we need a way out; best sort this out + % when we run into it again + \or + % \input tufte \startcolumns \showbaselines \input tufte \stopcolumns \input tufte + \ifconditional\someprecolumncontent +% \scratchdimen\topskip +% \advance\scratchdimen -\openstrutheight +% \nointerlineskip +% \vskip-\scratchdimen + \nointerlineskip + \vskip\dimexpr\openstrutheight-\topskip\relax + \fi + \or +% \scratchdimen\topskip +% \advance\scratchdimen -\openstrutheight +% \nointerlineskip +% \vskip-\scratchdimen + \nointerlineskip + \vskip\dimexpr\openstrutheight-\topskip\relax + \or + % untested but maybe handy +% \scratchdimen\topskip +% \advance\scratchdimen -\openstrutheight +% \nointerlineskip +% \vskip-\scratchdimen +% \vskip-\lineheight +% \vbox{\strut}% + \nointerlineskip + \vskip\dimexpr\openstrutheight-\topskip-\lineheight\relax + \vbox{\strut}% + \fi + \fi + \prevdepth\openstrutdepth + \nointerlineskip + \dp\columnpagebox\zeropoint + \global\finalcolumnheights\ht\columnpagebox + \getnoflines\finalcolumnheights + \global\finalcolumnlines\noflines + \ifcase#1\else + % messy correction, we need to rewrite this module (newcolumns) + \setbox\columnpagebox\vbox + {\offinterlineskip + \scratchdimen\ht\columnpagebox + \advance\scratchdimen\dp\columnpagebox % we probably lost that one already + \box\columnpagebox + \vskip-\scratchdimen}% + \scratchdimen\noflines\openlineheight + \advance\scratchdimen-\openstrutdepth + \advance\scratchdimen-\openlineheight + \advance\scratchdimen\topskip + \ht\columnpagebox\scratchdimen + \dp\columnpagebox\openstrutdepth + % end of mess + \fi + \box\columnpagebox + \egroup} + +%D In case one didn't notice, finaly \type{\finishcolumnbox} is +%D applied to all boxes. One can use these hooks for special +%D purposes. +%D +%D Once upon a time I wanted to manipulate the individual lines +%D in a column. This feature is demonstrated in the two examples +%D below. +%D +%D \startbuffer +%D \def\postprocesscolumnline#1% or \postprocesscolumnbox +%D {\ruledhbox{\box#1}\hss} +%D +%D \startcolumns[n=4] +%D \dorecurse{25}{line: \recurselevel\par} +%D \stopcolumns +%D \stopbuffer +%D +%D \typebuffer +%D +%D Here we show the natural width of the lines: +%D +%D {\getbuffer} +%D +%D The next example does a bit more advanced manipulation: +%D +%D \startbuffer +%D \def\postprocesscolumnline#1% +%D {\ifodd\currentcolumn +%D \hfill\unhbox#1\relax +%D \else +%D \relax\unhbox#1\hfill +%D \fi} +%D +%D \startcolumns[n=4] +%D \dorecurse{25}{line \recurselevel\par} +%D \stopcolumns +%D \stopbuffer +%D +%D \typebuffer +%D +%D Here we also see an application of \type{\currentcolumn}: +%D +%D {\getbuffer} +%D +%D This feature is implemented using the reshape macros +%D presented in \type{supp-box}. + +\def\postprocesscolumns + {\ifx\postprocesscolumnline\undefined \else + \dohandleallcolumns + {\global\setbox\currentcolumnbox\vtop + {\beginofshapebox + \unvbox\currentcolumnbox + \unskip\unskip + \endofshapebox + \reshapebox + {\dimen0\ht\shapebox + \dimen2\dp\shapebox + \setbox\shapebox\hbox to \hsize + {\postprocesscolumnline\shapebox}% + \ht\shapebox\dimen0 + \dp\shapebox\dimen2 + \box\shapebox}% + \flushshapebox + \everypar\emptytoks + \parskip\zeropoint % = \forgetall + \verticalstrut + \vskip-\struttotal + \vfil}}% + \fi + \ifx\postprocesscolumnbox\undefined \else + \dohandleallcolumns + {\global\setbox\currentcolumnbox\hbox + {\postprocesscolumnbox\currentcolumnbox}} + \fi} + +%D We default to doing nothing! + +\let\postprocesscolumnline =\undefined +\let\postprocesscolumnbox =\undefined +\let\postprocesscolumnpagebox=\relax + +%D \macros +%D {reversecolumnstrue} +%D +%D We can force the macro that takes care of combining +%D the columns, to flush them in the revere order. Of +%D course, by default we don't reverse. + +\newif\ifreversecolumns + +%D Here comes the simple splitting routine. It's a bit +%D longer than expected because of ragging bottoms or not. +%D This part can be a bit shorter but I suppose that I will +%D forget what happens. The splitting takes some already +%D present material (think of floats) into account! +%D +%D First we present some auxiliary routines. Any material, +%D like for instance floats, that is already present in the +%D boxes is preserved. + +\def\splitcolumn#1from \box#2to \dimen#3 top \box#4% + {\bgroup + \ifdim\ht#4>\zeropoint + \dimen0\dimen#3\relax + \dimen2\dimen0 + \advance\dimen0 -\ht#4% + \columnfootnotecorrection{#1}{\dimen0}% + \setbox0\vsplit#2 to \dimen0 + \global\setbox#1\vbox to \dimen2 + {\ifgridsnapping + \dimen0-\openstrutheight + \advance\dimen0 \topskip + \vskip\dimen0\copy#4\vskip-\dimen0 + \else + \unvcopy#4% + \fi + \fuzzysnappedbox\unvbox0 + \fakecolumnfootnotes{#1}}% + \else + \ifcase\clevernotes + \global\setbox#1\vsplit#2 to \dimen#3% + \global\setbox#1\vbox + {\fuzzysnappedbox\unvbox{#1}}% % or \box ? + \else + \columnfootnotecorrection{#1}{\dimen#3}% + \setbox0\vsplit#2 to \dimen#3% + \global\setbox#1\vbox to \dimen#3% + {\fuzzysnappedbox\unvbox0 + \fakecolumnfootnotes{#1}}% + \fi + \fi + \egroup} + +\def\splitcurrentcolumn from \box#1to \dimen#2% + {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox} + +\def\splitfirstcolumn from \box#1to \dimen#2% + {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox} + +\def\splitlastcolumn from \box#1to \dimen#2% + {\global\setbox\lastcolumnbox\vbox + {\unvcopy\lasttopcolumnbox + \fuzzysnappedbox\unvbox{#1}% + \fakecolumnfootnotes\lastcolumnbox}} + +%D NEW: still to be documented. + +\def\fakecolumnfootnotes#1% + {\relax + \ifcase\clevernotes\else + \ifnum#1=\lastcolumnbox + \fakenotes + \fi + \fi} + +\def\columnfootnotecorrection#1#2% + {\relax + \ifcase\clevernotes + % page notes + \or + \ifnum#1=\firstcolumnbox\relax + \calculatetotalclevernoteheight + \advance#2 -\totalnoteheight + \fi + \else + \ifnum#1=\lastcolumnbox\relax + \calculatetotalclevernoteheight + \advance#2 -\totalnoteheight + \fi + \fi} + +\def\overlaycolumnfootnotes + {\relax + \ifcase\clevernotes + % page notes + \else + \checknotepresence + \ifnotespresent + % the note box has the depth of the notefont + % because a column (i.e. first column has no depth, + % we need to anchor top down) + \bgroup + \ifcase\clevernotes\or + \getmulticolumnlines + \advance\nofcolumnlines \minustwo + \scratchdimen\nofcolumnlines\lineheight + \advance\scratchdimen \topskip + \setbox0\hbox + {\lower\scratchdimen\vbox{\placenoteinserts}}% + \ht0=\openstrutheight % \strutht + \dp0=\openstrutdepth % \strutdp + \scratchdimen\ht\firstcolumnbox + \global\setbox\firstcolumnbox\vbox to \scratchdimen + {\box\firstcolumnbox + \vskip-\scratchdimen + \box0}% + \else + % maybe here also \getmulticolumnlines + \scratchdimen\ht\firstcolumnbox + \advance\scratchdimen -\openstrutdepth % \strutdp + \getnoflines\scratchdimen + \advance\noflines \minustwo + \scratchdimen\noflines\lineheight + \advance\scratchdimen \topskip + \setbox0\hbox + {\lower\scratchdimen\vbox{\placenoteinserts}}% + \ht0=\openstrutheight % \strutht + \dp0=\openstrutdepth % \strutdp + \scratchdimen\ht\lastcolumnbox + \global\setbox\lastcolumnbox\vbox to \scratchdimen + {\box\lastcolumnbox + \vskip-\scratchdimen + box0}% + \fi + \egroup + \fi + \fi} + +%D Here comes the routine that splits the long box in columns. +%D The macro \type{\flushcolumnfloats} can be used to flush +%D either floats that were present before the multi||column +%D mode was entered, or floats that migrate to next columns. +%D Flushing floats is a delicate process. + +\def\continuousmulticolumnsout + {\bgroup + \forgetall + \setmulticolumnsout + \dontshowcomposition +% \dimen0=\columntextheight +% \advance\dimen0 -\precolumnboxheight +% \settotalinsertionheight +% \advance\dimen0 -\totalinsertionheight +% \ifgridsnapping % evt altijd, nog testen +% \getnoflines{\dimen0} +% \dimen0=\noflines\openlineheight +% \fi + \getmulticolumnlines + \dimen0=\nofcolumnlines\openlineheight + \dohandleallcolumns + {\splitcurrentcolumn from \box\normalpagebox to \dimen0}% + \setbox\restofpage\vbox{\unvbox\normalpagebox}% + \ifinheritcolumns + \ifr@ggedbottom % vreemd + \dohandleallcolumns + {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox + {\dimen0\dp\currentcolumnbox + \unvbox\currentcolumnbox + \vskip-\dimen0 + \vskip\openstrutdepth % \strutdp + \prevdepth\openstrutdepth % \strutdp + \vfill}}% + \ifbottomnotes \else + \dimen0\ht\firstcolumnbox + \fi + \fi + \ifn@rmalbottom + \advance\dimen0 \maxdepth + \dohandleallcolumns + {\global\setbox\currentcolumnbox\vbox to \dimen0 + {\unvbox\currentcolumnbox}}% + \fi + \ifb@selinebottom + % the columns are on top of the baseline + \fi + \else + \dohandleallcolumns + {\global\setbox\currentcolumnbox\vbox to \dimen0 + {\ifstretchcolumns + \unvbox\currentcolumnbox + \else + \unvbox\currentcolumnbox % wel of niet \unvbox ? + \vfill + \fi}}% + \dohandleallcolumns + {\global\ht\currentcolumnbox\dimen0}% + \fi + \setbox\precolumnbox\vbox{\flushcolumnedpage\zerocount}% + \finaloutput\box\precolumnbox + \sethsize + \setvsize + \flushcolumnfloats + \unvbox\restofpage + % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen + \egroup} + +%D And this is the balancing stuff. Again, part of the routine +%D is dedicated to handling ragged bottoms, but here we also +%D see some handling concerning the stretching of columns. +%D We set \type{\widowpenalty} at~0, which enables us to +%D balance columns with few lines. The use of \type{\box2} and +%D \type{\box4} garantees a more robust check when skips are +%D used. + +\def\multicolumnsbalancemax{250} % 100 is too small when floats are involved + +\def\balancedmulticolumnsout + {\bgroup + \setmulticolumnsout + \dontshowcomposition + \widowpenalty\zerocount + \setbox0\vbox{\unvbox\normalpagebox}% +\ifdim\ht0>\openlineheight % at least one line + \ifnum\minbalancetoplines<2 % balance anyway + \donetrue + \else % check criterium to available lines + \getnoflines{\ht0}% + \divide\noflines \nofcolumns \relax + \ifnum\noflines<\minbalancetoplines \relax + \dimen0\ht0 + \advance\dimen0 \ht\firsttopcolumnbox + \advance\dimen0 \openlineheight \relax % let's play safe + \ifdim\dimen0>\columntextheight % column exceeding text height + \donetrue + \else % it seems to fit + \donefalse + \fi + \else % balance indeed + \donetrue + \fi + \fi +\else % balancing does not make sense + \donefalse +\fi +\ifdone % start balancing + %\ifdim\ht0>\openlineheight + \dimen0\ht0 + \advance\dimen0 \topskip + \advance\dimen0 -\baselineskip + \dohandleallcolumns + {\advance\dimen0 \ht\currenttopcolumnbox}% + \divide\dimen0 \nofcolumns + \vbadness\!!tenthousand\relax + \count255=\zerocount + \bgroup + \ifgridsnapping + \dimen2\lineheight + \else + \dimen2=\onepoint % RUBISH + \dimen2=\spacingfactor\dimen2 + \fi + \doloop + {\advance\count255 \plusone + \global\setbox\restofpage\copy0\relax + \splitfirstcolumn from \box\restofpage to \dimen0 + \dohandlemidcolumns + {\splitcurrentcolumn from \box\restofpage to \dimen0}% + \splitlastcolumn from \box\restofpage to \dimen0 + \setbox2\vbox{\unvcopy\firstcolumnbox}% + \dimen4\zeropoint + \dohandleallcolumns + {\setbox4\vbox + {\unvcopy\currentcolumnbox + %rather new, test this on pdftex-z.tex + \unpenalty\unskip\unpenalty\unskip}% maybe better in main splitter + %\writestatus{balance}{\the\currentcolumnbox: \the\ht4}% +% \dimen6\ht4 \ifdim\dimen6>\dimen4 \dimen4=\dimen6 \fi}% + \ifdim\ht4>\dimen4 \dimen4=\ht4 \fi}% + \advance\dimen4 -.0005pt % get rid of accurracy problem, pretty new + \ifnum\count255>\multicolumnsbalancemax\relax + \exitloop + \else\ifdim\dimen4>\ht2 + \advance\dimen0 \dimen2\relax + \else + \exitloop + \fi\fi}% + \dohandleallcolumns + {\global\setbox\currentcolumnbox\vbox{\unvcopy\currentcolumnbox}}% NIEUW + \ifnum\count255>\multicolumnsbalancemax\relax + \showmessage\m!columns7\empty + \else + \showmessage\m!columns8{\the\count255\space}% + \fi + \egroup + \ifinheritcolumns + % We cannot assume that the first column is the tallest, if + % only because we may have an aborted balance (one line in the + % first column and a graphic in the second one). + % + % \dimen0\ht\firstcolumnbox + % \dimen2\ht\firstcolumnbox + % + \dimen0=\zeropoint + \dohandleallcolumns + {\ifdim\ht\currentcolumnbox>\dimen0 + \dimen0=\ht\currentcolumnbox + \fi}% + \dimen2\dimen0 + % so far + \advance\dimen2 -\openlineheight + \dohandleallcolumns + {\dimen4\ht\currentcolumnbox + \dimen6=10\openlineheight % funny value + \global\setbox\currentcolumnbox\vbox to \dimen0 + {\unvbox\currentcolumnbox + \ifdim\dimen4>\dimen6 + \ifdim\dimen4<\dimen0 + \ifdim\dimen4>\dimen2 + \vskip\zeropoint % !! + \else + \vskip\openlineheight + \vfill + \fi + \else + \vskip\zeropoint + \fi + \else + \vskip\openlineheight + \vfill + \fi}}% + \else + \bgroup + \ifstretchcolumns + \dimen0\ht\firstcolumnbox + \dimen2=\bottomtolerance\ht\firstcolumnbox + \setbox0\vbox{\unvcopy\lastcolumnbox}% + \advance\dimen0 -\ht0\relax + \advance\dimen0 -\dp0\relax + \ifdim\dimen0>\openlineheight\relax + \ifdim\dimen0>\dimen2\relax + % \stretchcolumnsfalse % beter goed slecht dan slecht goed + \showmessage\m!columns9\empty + \fi + \fi + \fi + \dohandleallcolumns + {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox + {\ifstretchcolumns + \unvbox\currentcolumnbox + \else + \box\currentcolumnbox + \vfill + \fi}}% + \egroup + \fi + \else + % a one liner is not properly handled here, so best rewrite the text then + \showmessage\m!columns{10}\empty + \global\setbox\firstcolumnbox\vbox{\unvbox0}% + \fi + \global\output{\balancingerror}% + \b@selinebottomtrue % forces depth in separation rule + \flushcolumnedpage\plusone + \multicolumnseject + \egroup} + +\def\multicolumnseject + {\ifdim\pagetotal>\textheight + \eject % new + \else + \allowbreak + \fi} + +%D The multicolumn mechanism is incorporated in a \CONTEXT\ +%D interface, which acts like: +%D +%D \starttyping +%D \startcolumns[n=4,balance=no] +%D some text +%D \stopcolumns +%D \stoptyping +%D +%D The setup is optional. The default behaviour of columns +%D can be set up with: +%D +%D \starttyping +%D \setupcolumns +%D [n=2, +%D balance=yes] +%D \stoptyping +%D +%D In this case, stretching is according to the way it's +%D done outside columns (\type{\inheritcolumnstrue}). Also +%D we can setup the \type{tolerance} within a column, the +%D \type{distance} between columns and the fixed +%D \type{height} of a column. + +%D Multi||column output: the float routines +%D +%D Here come the routines that handle the placement of column +%D floats. Floats that are to big migrate to the next +%D column. Floats that are too wide, migrate to the top of the +%D next page, where they span as much columns as needed. +%D Floats that are left over from outside the multi||column +%D mode are flushed first. In macro \type{\finaloutput} the +%D topfloats that are left from previous text should be set. +%D +%D When there are some floats in the queue, we inhibit the +%D flushing of floats on top of columns. The number of +%D waiting floats is preswent in \type{\savednoftopfloats} and +%D is saved. As long as there are floats waiting, the topfloats +%D are places as if we are outside multi||column mode. This is +%D neccessary for e.g. multicolumn lists. +%D +%D When all those floats are flushed, we switch to the local +%D flushing routine. + +\def\setcolumnfloats + {\xdef\globalsavednoffloats{\the\savednoffloats}% + \ifnum\globalsavednoffloats>\zerocount + \setglobalcolumnfloats + \else + \setlocalcolumnfloats + \fi} + +\def\setglobalcolumnfloats + {\everypar\emptytoks + \let\flushcolumnfloat\relax + %\let\doroomfloat\relax + \let\docheckiffloatfits\relax + \let\flushcolumnfloats\noflushcolumnfloats} + +\def\setlocalcolumnfloats + {\everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}% + \let\flushcolumnfloat\doflushcolumnfloat + %\let\doroomfloat\docolumnroomfloat + \let\docheckiffloatfits\docolumnroomfloat + \let\flushcolumnfloats\doflushcolumnfloats + \let\doflushfloats\doflushcolumnfloats % new + \let\dosetbothinserts\relax + \let\dotopinsertions\relax} + +\def\noflushcolumnfloats + {\bgroup + \xdef\localsavednoffloats{\the\savednoffloats}% + \global\savednoffloats\globalsavednoffloats + \dotopinsertions + \xdef\globalsavenoffloats{\the\savednoffloats}% + \ifnum\globalsavednoffloats=\zerocount + \setlocalcolumnfloats + \fi + \global\savednoffloats\localsavednoffloats + \egroup} + +%D We need to calculate the amount of free space in a columns. +%D When there is not enough room, we migrate the float to the +%D next column. These macro's are alternatives (and +%D look||alikes) of \type{\doroomfloat}. When a float is to +%D wide, for one column, it is moved to the top of the next +%D page. Of course such moved floats have to be taken into +%D account when we calculate the available space. It's a pitty +%D that such things are no integral part of \TEX. + +\def\getcolumnstatus\column#1\total#2\goal#3\\% + {\dimen0=\ifdim\pagegoal<\maxdimen \pagetotal \else \zeropoint \fi + \dimen2=\zeropoint + \count255=\zerocount + \dimen8=\columntextheight + \advance\dimen8 -\precolumnboxheight + \def\dogetcolumnstatus + {\advance\count255 \plusone + \advance\dimen2 \ht\currenttopcolumnbox + \advance\dimen2 \dp\currenttopcolumnbox + \dimen4\dimen2 + \advance\dimen4 \dimen0 + \dimen6=\count255\dimen8 + \ifdim\dimen4>\dimen6 + \else + \let\dogetcolumnstatus\relax + \fi}% + \dohandleallcolumns{\dogetcolumnstatus}% + \ifnum\count255=0 \count255=1 \fi + #1=\count255 + #2=\dimen4 + #3=\dimen6 } + +\def\getinsertionheight + {\ifdim\pagegoal<\maxdimen + \bgroup + \dimen0=\columntextheight + \advance\dimen0 -\pagegoal + \xdef\insertionheight{\the\dimen0}% + \egroup + \else + \global\let\insertionheight\zeropoint + \fi} + +\def\docolumnroomfloat + {\ifpostponecolumnfloats + \global\roomforfloatfalse + \else\ifnofloatpermitted + \global\roomforfloatfalse + \else + \bgroup + \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\% + \advance\dimen0 2\openlineheight % nog nodig ? + %\ifnum\count255=\nofcolumns + % \getinsertionheight + % %\message{\insertionheight}\wait + % \advance\dimen0 \insertionheight + %\fi + \setbox\scratchbox\vbox % tricky met objecten ? + {\blank[\@@bkspacebefore] + \snaptogrid\vbox{\copy\floatbox}}% + \advance\dimen0 \ht\scratchbox + \advance\dimen0 .5\lineheight % needed because goal a bit higher + %\message{column: \the\count255; total: \the\dimen0; goal: \the\dimen2}\wait + \ifdim\dimen0>\dimen2 + \global\roomforfloatfalse + \else + \global\roomforfloattrue + \fi + \ifdim\wd\floatbox>\hsize + \showmessage\m!columns{11}\empty + \global\roomforfloatfalse + \fi + \egroup + \fi\fi} + +%D Flushing one float is done as soon as possible, i.e. +%D \type{\everypar}. This means that (at the moment) +%D sidefloats are not supported (overulled)! + +\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue + +\def\doflushcolumnfloat + {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting + \bgroup + \forgetall + \let\doflushcolumnfloat\relax + \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\% + \ifdim\dimen0>\zeropoint + \dogetfloat + \ifdim\wd\floatbox>\hsize + \doresavefloat + \else + %\setbox2=\vbox + % {\blank[\@@bkspacebefore] + % \snaptogrid\vbox{\copy\floatbox}% + % \blank[\@@bkspaceafter] + \setbox2=\vbox + {\blank[\@@bkspacebefore] + \snaptogrid\vbox{\copy\floatbox}}% + \advance\dimen0 \ht2 + \ifdim\dimen0>\dimen2 + \ifnum\mofcolumns<\nofcolumns + \advance\mofcolumns \plusone +%% bug %% \edef\currenttopcolumnbox{\getvalue{\@@topcol\the\count255}}% + \ifdim\ht\currenttopcolumnbox=\zeropoint + \global\setbox\currenttopcolumnbox\vbox + {\snaptogrid\vbox{\copy\floatbox} + \whitespace % nodig ? + \blank[\@@bkspaceafter]}% + \dimen4=\ht\currenttopcolumnbox + \advance\dimen4 \dp\currenttopcolumnbox + \global\advance\vsize -\dimen4 + \advance\dimen4 -\pagegoal + \global\pagegoal-\dimen4 + \showmessage\m!columns{12}a% + \else + \showmessage\m!columns{12}b% + \doresavefloat + \fi + \else + \showmessage\m!columns{12}c% + \doresavefloat + \fi + \else + \ifhmode{\setbox0\lastbox}\fi% waar is die er in geslopen + \par + \ifdim\prevdepth<\zeropoint \else % anders bovenaan kolom witruimte + \nobreak + \blank[\@@bkspacebefore] + \nobreak + \fi + \flushfloatbox + \blank[\@@bkspaceafter] + \fi + \fi + \fi + \egroup + \fi\fi\fi\fi} + +%D This one looks complicated. Upto \type{\nofcolumns} floats +%D are placed, taking the width of a float into account. This +%D routine can be improved on different ways: +%D +%D \startitemize[intro,packed] +%D \item taking into account some imaginary baseline, just to +%D get the captions in line +%D \item multipass flushing until as many floats are displaced +%D as possible +%D \stopitemize +%D +%D When handling lots of (small) floats spacing can get worse +%D because of lining out the columns. + +\def\doflushcolumnfloats + {\ifpostponecolumnfloats\else + \bgroup + \forgetall + \ifsomefloatwaiting + \dimen8\zeropoint + \dimen4\zeropoint + \count0\zerocount % count0 can be used local + \count2\nofcolumns % count2 can be used local + \dohandleallcolumns + {\ifnum\count0>\zerocount % the wide one's reserved space + \global\setbox\currenttopcolumnbox\vbox + {\snaptogrid\vbox + {\copy\currenttopcolumnbox + \hbox{\vphantom{\copy\floatbox}}} + \whitespace % nodig ? + \blank[\@@bkspaceafter]}% + \else + \dogetfloat + \ifdim\wd\floatbox>\finalcolumntextwidth % better somewhere else too + \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}% + \fi % otherwise the graphic may disappear + \ifdim\wd\floatbox>\hsize + \dimen0\wd\floatbox + \advance\dimen0 \intercolumnwidth + \dimen2\hsize + \advance\dimen2 \intercolumnwidth + \advance\dimen0 .5pt % hm, why 1 + \advance\dimen2 .5pt % hm, why 2 + \divide\dimen0 \dimen2 + \count0\dimen0 + \advance\count0 \plusone + \ifnum\count0>\count2 + \doresavefloat + \count0\zerocount + \else + \dimen0=\count0\hsize + \advance\dimen0 \count0\intercolumnwidth + \advance\dimen0 -\intercolumnwidth + \global\setbox\floatbox\hbox to \dimen0 + %{\hss\hbox{\copy\floatbox}\hss}% + {\processaction[\@@bklocation] % how easy to forget + [ \v!left=>\copy\floatbox\hss, + \v!right=>\hss\copy\floatbox, + \s!default=>\hss\copy\floatbox\hss, + \s!unknown=>\hss\copy\floatbox\hss]}% + \fi + \showmessage\m!columns{13}\empty + \else + % \showmessage\m!columns{13}\empty + \fi + \ifdim\ht\floatbox>\zeropoint\relax + \global\setbox\currenttopcolumnbox\vbox + {\snaptogrid\vbox + {\copy\currenttopcolumnbox + \copy\floatbox} + \whitespace % nodig ? + \blank[\@@bkspaceafter]}% + \fi + \dimen6\ht\currenttopcolumnbox + \advance\dimen6 \dp\currenttopcolumnbox + \fi + \ifdim\dimen4<\ht\currenttopcolumnbox + \dimen4\ht\currenttopcolumnbox + \fi + \advance\dimen8 \dimen6 + \advance\count2 \minusone + \advance\count0 \minusone }% + \setvsize + \global\advance\vsize -\dimen8 + \global\pagegoal\vsize + \else + %\doflushfloats % does not snap! + \fi + \egroup + \fi} + +%D The next macro can be used to flush floats in the current +%D stream. No width checking is (yet) done. + +\def\insertcolumnfloats + {\doloop + {\ifsomefloatwaiting + \bgroup + \forgetall + % no check for width + \dogetfloat + \blank[\@@bkspacebefore] + \snaptogrid\vbox{\copy\floatbox} + \blank[\@@bkspaceafter] + \egroup + \else + \exitloop + \fi}} + +%D This were the multi||column routines. They can and need to +%D be improved but at the moment their behaviour is acceptable. +%D +%D One inprovement can be to normalize the height of floats +%D to $n\times$\type{\lineheight} with a macro like: +%D +%D \starttyping +%D \normalizevbox{...} +%D \stoptyping + +% border case, should fit on one page +% +% \startcolumns +% +% 1 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{1}} +% 2 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{2}} +% 3 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{3}} +% +% \stopcolumns + +\def\setupcolumns + {\dosingleempty\dosetupcolumns} + +\def\dosetupcolumns[#1]% + {\getparameters[\??kl][#1]% + \nofcolumns\@@kln\relax + \processaction + [\@@klrule] + [ \v!on=>\let\betweencolumns\linebetweencolumns, + \v!off=>\let\betweencolumns\spacebetweencolumns, + \s!default=>\let\betweencolumns\spacebetweencolumns, + \s!unknown=>\let\betweencolumns\@@klrule]} + +\def\linebetweencolumns + {\bgroup + \starttextproperties + \ifdim\@@kldistance>\zeropoint + \dimen0=\@@kldistance + \else + \dimen0=\linewidth + \fi + \advance\dimen0 -\linewidth + \hskip.5\dimen0 + \vrule + \!!width\linewidth + \ifb@selinebottom\!!depth\strutdepth\fi + \hskip.5\dimen0\relax + \stoptextproperties + \egroup} + +\def\spacebetweencolumns + {\hskip\@@kldistance} + +\presetlocalframed[\??kl] + +\def\backgroundfinishcolumnbox + {\doifinsetelse\@@kloffset{\v!none,\v!overlay} + {\let\@@kloffset\!!zeropoint} + {\scratchdimen\@@kloffset + \advance\scratchdimen -\@@klrulethickness + \edef\@@kloffset{\the\scratchdimen}}% + \localframed + [\??kl] + [\c!strut=\v!no, + \c!width=\v!fit, + \c!height=\v!fit, + \c!align=]} + +\definecomplexorsimpleempty\startcolumns + +\def\complexstartcolumns[#1]% %% \startcolumns + {\bgroup + \let\stopcolumns\egroup + \ifinsidecolumns + \else + \setupcolumns[#1]% + \ifnum\@@kln>1\relax + \whitespace + \begingroup + \doif\@@kloption\v!background + {\let\finishcolumnbox\backgroundfinishcolumnbox + \let\columntextoffset\@@kloffset}% + \ifx\@@klcommand\empty\else + \let\postprocesscolumnline\@@klcommand + \fi + \doifelsenothing\@@klheight + \heightencolumnsfalse + \heightencolumnstrue + \doifelse\@@kldirection\v!right + \reversecolumnsfalse + \reversecolumnstrue + \doifelse\@@klbalance\v!yes + \balancecolumnstrue + \balancecolumnsfalse + \installalign\v!yes {\stretchcolumnstrue \inheritcolumnsfalse}% todo: new key + \installalign\v!no {\stretchcolumnsfalse\inheritcolumnsfalse}% todo: new key + \installalign\v!text{\stretchcolumnsfalse\inheritcolumnstrue }% + \stretchcolumnsfalse + \inheritcolumnstrue + \doifsomething\@@klalign{\expanded{\setupalign[\@@klalign]}}% + \nofcolumns=\@@kln + % + % probably more is needed, and how about nesting save's + % + \saveouterspacing + % + \edef\fixedcolumnheight{\@@klheight}% + \edef\minbalancetoplines{\@@klntop}% + \setuptolerance[\@@kltolerance]% %% \startcolumns + \setupblank[\@@klblank]% + \ifdim\ctxparskip>\zeropoint\relax + \setupwhitespace[\@@klblank]% + \fi + \def\stopcolumns + {\endmulticolumns + \global\insidecolumnsfalse + \endgroup + \egroup}% + \global\insidecolumnstrue + \beginmulticolumns + \fi + \fi} + +\installcolumnbreakhandler {MUL} \v!preference + {\goodbreak} + +\installcolumnbreakhandler {MUL} \v!yes + {\par % todo: since + {\testrulewidth\zeropoint\ruledvskip\textheight} % we misuse a + \penalty-200 % side effect + \vskip-\textheight + }% bugged : \prevdepth-\thousandpoint} % signals top of column to \blank + +%D New: only at start of columns; may change ! Rather +%D interwoven and therefore to be integrated when the multi +%D column modules are merged. (moved from cont-new.tex) + +\def\setupcolumnspan[#1]% + {\getparameters[\??ks][#1]} + +\presetlocalframed + [\??ks] + +\setupcolumnspan + [\c!n=2, + \c!offset=\v!overlay, + \c!frame=\v!off] + +\newbox\columnspanbox \let\postprocesscolumnspanbox\gobbleoneargument + +\def\dostartcolumnspan[#1]% + {\bgroup + \setupcolumnspan[#1]% + \forgetall + \ifinsidecolumns + \advance\hsize \intercolumnwidth + \hsize\@@ksn\hsize + \advance\hsize -\intercolumnwidth + \fi + \dowithnextbox + {\setbox\columnspanbox\flushnextbox + \ifinsidecolumns\wd\columnspanbox\hsize\fi + \postprocesscolumnspanbox\columnspanbox + \scratchdimen\ht\columnspanbox + \setbox\columnspanbox\hbox % depth to be checked, probably option! + {\localframed[\??ks][\c!offset=\v!overlay]{\box\columnspanbox}}% + \ht\columnspanbox\scratchdimen + \dp\columnspanbox\strutdp + \wd\columnspanbox\hsize + \ifinsidecolumns + \ifnum\@@ksn>1 + \setvsize + \dohandleallcolumns + {\ifnum\currentcolumn>\@@ksn\else + \global\setbox\currenttopcolumnbox=\vbox + {\ifnum\currentcolumn=1 + \snaptogrid\vbox{\copy\columnspanbox} + \else + \snaptogrid\vbox{\vphantom{\copy\columnspanbox}} + \fi}% + \wd\currenttopcolumnbox\hsize + \global\advance\vsize -\ht\currenttopcolumnbox + \fi} + \global\pagegoal\vsize + \else + \snaptogrid\vbox{\box\columnspanbox} + \fi + \else + \snaptogrid\vbox{\box\columnspanbox} + \fi + \endgraf + \ifvmode\prevdepth\strutdp\fi + \egroup} + \vbox\bgroup + %\topskipcorrection % becomes an option ! + \EveryPar{\begstrut\EveryPar{}}} % also ! + +\def\startcolumnspan + {\dosingleempty\dostartcolumnspan} + +\def\stopcolumnspan + {\egroup} + +\setupcolumns + [\c!n=2, + \c!ntop=1, + \c!command=, + \c!direction=\v!right, + \c!rule=\v!off, + \c!tolerance=\v!tolerant, + \c!distance=1.5\bodyfontsize, % influenced by switching + \c!height=, + \c!balance=\v!yes, + \c!align=\v!text, + \c!blank={\v!line,\v!fixed}, + \c!option=, + \c!rulethickness=\linewidth, + \c!offset=.5\bodyfontsize] + +%D Undocumented and still under development. + +\def\startsimplecolumns + {\dosingleempty\dostartsimplecolumns} + +\def\dostartsimplecolumns[#1]% + {\bgroup + \nopenalties + \getparameters[\??kl] + [\c!width=\hsize,\c!distance=1.5\bodyfontsize,% + \c!n=2,\c!lines=0,#1]% + \let\rigidcolumnlines\@@kllines + \setrigidcolumnhsize\@@klwidth\@@kldistance\@@kln + \setbox\scratchbox\vbox\bgroup + \forgetall} % \blank[\v!disable] + +\def\stopsimplecolumns + {\removebottomthings + \egroup + \rigidcolumnbalance\scratchbox + \egroup} + +\protect \endinput diff --git a/tex/context/base/page-new.tex b/tex/context/base/page-new.tex deleted file mode 100644 index 0b047ffbe..000000000 --- a/tex/context/base/page-new.tex +++ /dev/null @@ -1,277 +0,0 @@ -%D \module -%D [ file=page-new, -%D version=2000.10.20, -%D title=\CONTEXT\ Page Macros, -%D subtitle=Page New, -%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. -\unprotect - -% % % NOT ENGLISH % % % - -% clean up footnotes to notes - -% We need to set the \dimen globally since we are in the -% OTR. Unfortunately this interferes with local settings, -% although we may assume that they will not cross page -% boundaries. - -\def\OTRSETcheckcontent - {\bgroup - \donefalse - \def\OTRSETcheckcontent##1% - {\setbox\scratchbox##1\recurselevel - \setbox\scratchbox\vbox{\unvbox\scratchbox}% - \ifdim\ht\scratchbox>\zeropoint\donetrue\fi}% - \dorecurse{\nofcolumns} - {\OTRSETcheckcontent\columngettextbox - \OTRSETcheckcontent\columngetfootbox - \OTRSETcheckcontent\columngettopbox - \OTRSETcheckcontent\columngetbotbox}% - \ifdone\egroup\donefalse\else\egroup\donetrue\fi} - -\def\OTRSETgetcolumntextheight#1% max - boven - top - {\scratchdimen=\OTRSETgetparameter\c!maxhoogte#1% - \advance\scratchdimen -\OTRSETgetparameter\c!bovenoffset#1% - \advance\scratchdimen -\ht\columntopbox#1% - \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% - \advance\scratchdimen -\ht\columnbotbox#1} % not used - -\def\OTRSETgetcolumnnaturalheight#1% max - boven - top - {\setbox\scratchbox\vbox{\unvcopy\columntextbox#1}% - \scratchdimen\ht\scratchbox - \advance\scratchdimen \OTRSETgetparameter\c!bovenoffset#1% - \advance\scratchdimen \ht\columntopbox#1% - \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% - \advance\scratchdimen \ht\columnbotbox#1} % not used - -\def\OTRSETdobalance% splitten in met en zonder footnotes - {\bgroup - \maxdeadcycles=1000 - % collect content and notes - \bgroup - \OTRSEToutput - {\global\setbox1\vbox{\unvbox\normalpagebox}% - \global\setbox3\vbox{\unvbox\footins}}% - \verticalstrut\vskip-\struttotal % makes footnotes flush - \eject - \global\collectingcontentfalse - % check for footnotes only - \ifdim\ht1<\topskip % real dirty - \global\setbox1=\vbox{} - % fix height of first line - \ifdim\ht3>\!!zeropoint - \global\setbox3\vbox - {\setfootnotebodyfont - \kern-\strutht - \kern\topskip - \unvbox3} - \fi - % prepare trial box - \global\setbox5\vbox - {\ifdim\ht1>\zeropoint - \unvcopy1 \ifdim\ht3>\zeropoint \kern\skip\footins \fi - \fi - \ifdim\ht3>\zeropoint \unvcopy3 \fi} - \egroup - % erase old stuff - \columnerasetextboxes - \columnerasefootboxes - % prepare floats - \OTRSETdotopinsertions - \OTRSETdobotinsertions % not used can be removed - % calculate available space - \!!heighta\zeropoint % available total height - \dorecurse{\nofcolumns} - {\OTRSETgetcolumntextheight\recurselevel - \OTRSETcalculatelines\scratchdimen - \advance\!!heighta \scratchdimen} - % quick check - \ifdim\ht5>\!!heighta - % use normal routine - \columnerasetextboxes - \columnerasefootboxes - % TEMP, TODO, FORCE NEXT PASS ! - \unvbox1 - \unvbox3 - \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist - \donefalse - %\writestatus\m!columns{no balancing, text overflows height}% - \else\ifdim\ht5>\zeropoint \relax - % some text and/or notes - \donetrue - \else - \donefalse - \dorecurse\nofcolumns - {\ifdim\ht\columntopbox\recurselevel>\zeropoint \donetrue \fi}% - \ifdone - % no text and notes, but figures - \else - % no text, no notes, no figures - \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist - \writestatus\m!columns{no balancing, nothing to be placed}% - \fi - \fi\fi - \ifdone - \ifdim\ht5>\zeropoint \relax - % balancing text and notes - %\writestatus\m!columns{text may fit, balancing}% - \newcounter\loopcounter - \newcounter\balancinglines - \doloop - {\increment\loopcounter\relax - % initialize - \columnerasetextboxes - \columnerasefootboxes - \setbox0=\copy5 - \splittopskip\topskip - % pre-split loop and quality calculation - %\writestatus\m!columns{pass \loopcounter: correction -\balancinglines} - \dorecurse\nofcolumns - {\OTRSETgetcolumntextheight\recurselevel - \OTRSETcalculatelines\scratchdimen - \!!heightc\scratchdimen - \ifnum\recurselevel<\nofcolumns - \advance\!!heightc -\balancinglines\lineheight - \fi - \columnsettextbox\recurselevel\vsplit0 to \!!heightc} - % just one method - \OTRSETgetcolumnnaturalheight1 \dimen4\scratchdimen - \OTRSETgetcolumnnaturalheight\nofcolumns \dimen6\scratchdimen - %\writestatus\m!columns{first column: \the\dimen4}% - %\writestatus\m!columns{last column: \the\dimen6}% - \ifdim\dimen4=\dimen6 - \donetrue % perfect balance - \else\ifdim\dimen4>\dimen6 - \donefalse % not yet good enough - \increment\balancinglines % try again - \edef\balancingcount{\the\!!counta} - \else - \donetrue % worse balance - \ifnum\balancinglines>0 % take previous - \decrement\balancinglines - \fi - \fi\fi - % extra check - % \ifdim\ht0>\zeropoint\relax \donefalse \fi - % another check - \ifdone - %\writestatus\m!columns{balancing finished in pass \loopcounter}% - \else \ifnum\loopcounter>100 \donetrue - %\writestatus\m!columns{balancing aborted after pass \loopcounter}% - \else - %\writestatus\m!columns{balancing continued after pass \loopcounter}% - \fi \fi - % final balancing pass - \ifdone - \setbox0\copy1 - \setbox2\copy3 - \columnerasetextboxes - \columnerasefootboxes - \dorecurse\nofcolumns - {\OTRSETgetcolumntextheight\recurselevel - \OTRSETcalculatelines\scratchdimen - \!!heightc\scratchdimen - \ifnum\recurselevel<\nofcolumns - \advance\!!heightc -\balancinglines\lineheight - \fi - % split off text - \ifdim\ht0>\zeropoint - \columnsettextbox\recurselevel\vsplit0 to \!!heightc - \setbox4\vbox{\unvcopy\columntextbox\recurselevel} - \advance\!!heightc -\ht4 - \ifdim\ht0>\zeropoint - \columnsettextbox\recurselevel\box4 - \advance\!!heightc \skip\footins - \fi - \fi - % split off footnotes - \ifdim\ht0>\zeropoint\relax \else - \ifdim\ht2>\zeropoint\relax - \setbox4\vsplit2 to \!!heightc - \setbox\footins=\vbox{\unvbox4} % ugly and dirty trick - \ifdim\ht\columntextbox\recurselevel=\zeropoint\relax - \columnsettextbox\recurselevel\hbox - {\raise\strutdp\hbox % ugly but needed - {\setfootnotebodyfont % both these moves - \lower\strutdp\hbox{\placebottomnotes}}} - \else - \columnsetfootbox\recurselevel\hbox{\placebottomnotes} - \fi - \fi - \fi} - \exitloop - \fi} - \else - % no reason to balance floats - \fi - \fi - \doglobal\addtocommalist{\realfolio}\OTRSETbalancinglist - \OTRSETdoflush - \fi - \egroup} - -\protect \endinput - -% \def\OTRSETsetbalanceht#1#2% var col -% {#1\getvalue{\??mc\OTRSETidentifier\number#2\c!regels}\relax -% \ifcase#1#1\getvalue{\??mc\OTRSETidentifier\c!regels}\relax\fi -% \ifcase#1#1\savedcolumnmaxcells\relax\fi} - -% \def\OTRSETinitbalancing -% {\ifbalancecolumns -% \let\savedcolumnmaxcells\columnmaxcells -% \ifnum\realpageno=\balancingpageno\relax -% \ifnum\mofcolumns=\plusone\relax -% \ifcase\OTRSETbottombalance \else -% \!!countc\zeropoint -% \dorecurse\nofcolumns -% {\OTRSETsetbalanceht\!!countb\recurselevel -% \ifnum\!!countb>\!!countc\!!countc\!!countb\fi}% -% \fi -% \dorecurse\nofcolumns -% {\!!counta\recurselevel\relax -% % can be an option: absolute versus relative -% \ifcase\OTRSETbottombalance -% \OTRSETsetbalanceht\!!countb\recurselevel -% \advance\!!countb\precolumnlines -% \ifnum\!!countb>\localcolumnmaxcells\relax -% \xdef\localcolumnmaxcells{\the\!!countb}% -% \fi -% \advance\!!countb \plusone -% \dostepwiserecurse\!!countb\columnmaxcells\plusone -% {\ifvoid\OTRSETgridcell\!!counta\recurselevel -% \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe -% \fi}% -% \else -% \globallet\localcolumnmaxcells\columnmaxcells -% \!!countb\!!countc -% \advance\!!countb-\columnmaxcells -% \!!countb-\!!countb -% \advance\!!countb \minusone -% \ifnum\!!countb>\zerocount -% \dostepwiserecurse\plusone\!!countb\plusone -% {\ifvoid\OTRSETgridcell\!!counta\recurselevel -% \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe -% \fi}% -% \OTRSETsetbalanceht\!!countb\recurselevel -% \ifnum\!!countc>\!!countb -% \!!countd\columnmaxcells -% \advance\!!countd-\!!countc -% \advance\!!countd+\!!countb -% \dostepwiserecurse\!!countd\columnmaxcells\plusone -% {\ifvoid\OTRSETgridcell\!!counta\recurselevel -% \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe -% \fi}% -% \fi -% \fi -% \fi}% -% \OTRSETsetvsize % ! ! ! -% \fi -% \fi -% \fi} diff --git a/tex/context/base/page-not.tex b/tex/context/base/page-not.mkii index 9c67f18f1..9c67f18f1 100644 --- a/tex/context/base/page-not.tex +++ b/tex/context/base/page-not.mkii diff --git a/tex/context/base/page-not.mkiv b/tex/context/base/page-not.mkiv new file mode 100644 index 000000000..9628b9d5f --- /dev/null +++ b/tex/context/base/page-not.mkiv @@ -0,0 +1,72 @@ +%D \module +%D [ file=page-nnt, +%D version=2002.04.16, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Footnotes, +%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 Page Macros / Footnotes} + +%D Terrible hacks: we need to share save/restore + +%D We've moved some footnote handling to a separate page +%D module. The macros below are used in the single and multi +%D column page handlers and permit mixed usage of column and +%D page notes. + +\unprotect + +\def\checkbegincolumnfootnotes % should happen inside otr + {\ifcase\clevernotes + \erasenotebackup + \else + \flushnotes + \savenotecontent + \fi + \savenotedata + \checknotes} + +\def\checkendcolumnfootnotes + {\restorenotedata % maybe better just \checknotes + \ifcase\clevernotes\else + \restorenotecontent + \fi} + +\def\checksinglecolumnfootnotes + {\checknotes} % niet : \restorenotedata + +\newdimen\totalinsertionheight + +\def\settotalinsertionheight + {\calculatetotalnoteheight + \totalinsertionheight\totalnoteheight + \addinsertionheight\topins\to\totalinsertionheight + \addinsertionheight\botins\to\totalinsertionheight} + +% hm + +\def\checkbegincolumnfootnotes % should happen inside otr + {\ifcase\clevernotes + \erasenotebackup + \else + \flushnotes + \savenotecontent + \fi + \savenotedata + \checknotes} + +\def\checkendcolumnfootnotes + {\restorenotedata + \ifinsidecolumns + \ifcase\clevernotes\else + \restorenotecontent + \fi + \fi} + +\protect \endinput diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv index 19ab43889..73f69d582 100644 --- a/tex/context/base/page-one.mkiv +++ b/tex/context/base/page-one.mkiv @@ -116,6 +116,8 @@ \chardef\kindofpagetextareas=2 % whole page (public variable! never change) +% can we avoind the extra vboxing here? + \def\OTRONEregisteredtextarea#1% {\ifregistertextareas \setbox0\vbox{#1}% @@ -132,8 +134,7 @@ \xypos{pbd:\realfolio:b}% we could save bytes by only saving the y \endgraf \begingroup - \scratchdimen\MPy{pbd:\realfolio:b}% - \advance\scratchdimen-\MPy{pbd:\realfolio:e}% + \scratchdimen\dimexpr\MPy{pbd:\realfolio:b}-\MPy{pbd:\realfolio:e}\relax \setbox\scratchbox\null \wd\scratchbox\makeupwidth \ht\scratchbox\scratchdimen @@ -174,36 +175,31 @@ \ifgridsnapping \OTRONEregisteredtextareaA{#1#2}% \vskip-\currentpagedepth\vskip\openstrutdepth - \pushproperties % moved from just after #1#2 \prevdepth\openstrutdepth \dobotinsertions \vfil \else\ifr@ggedbottom \OTRONEregisteredtextareaA{#1#2}% \vskip-\currentpagedepth\vskip\openstrutdepth - \pushproperties % moved from just after #1#2 \prevdepth\openstrutdepth \dobotinsertions \vfil \else\ifb@selinebottom \OTRONEregisteredtextareaA{#1#2}% \kern-\currentpagedepth\kern\maxdepth - \pushproperties % moved from just after #1#2 \dobotinsertions \else \OTRONEregisteredtextareaA{#1#2}% - \pushproperties % moved from just after #1#2 \dobotinsertions % added \fi\fi\fi \fakepagenotes}% was \fakenotes, but wrong! (check with \setupalign[height]) \ifbottomnotes \ifgridsnapping -\ifcase\layoutlines % todo: make macro of this - \getrawnoflines\textheight -\else - \noflines\layoutlines -\fi -% \getnoflines\textheight + \ifcase\layoutlines % todo: make macro of this + \getrawnoflines\textheight + \else + \noflines\layoutlines + \fi \advance\noflines \minusone \scratchdimen\noflines\lineheight \advance\scratchdimen \topskip @@ -626,9 +622,7 @@ \else \topofinsertfalse \fi - \global\advance\topinserted \ht\floatbox - \global\advance\topinserted \dp\floatbox - \global\advance\topinserted \floatbottomskip + \global\advance\topinserted \ht\floatbox+\dp\floatbox+\floatbottomskip\relax \insert\topins {\forgetall \iftopofinsert @@ -643,9 +637,7 @@ \doinsertfloatinfo} \def\OTRONEsomebotsfloat[#1]% - {\global\advance\botinserted \ht\floatbox - \global\advance\botinserted \dp\floatbox - \global\advance\botinserted \floattopskip + {\global\advance\botinserted\dimexpr\ht\floatbox+\dp\floatbox+\floattopskip\relax \insert\botins {\forgetall \blank[\@@bkspacebefore]% diff --git a/tex/context/base/page-par.tex b/tex/context/base/page-par.mkii index a5dea2e63..a5dea2e63 100644 --- a/tex/context/base/page-par.tex +++ b/tex/context/base/page-par.mkii diff --git a/tex/context/base/page-par.mkiv b/tex/context/base/page-par.mkiv new file mode 100644 index 000000000..a5dea2e63 --- /dev/null +++ b/tex/context/base/page-par.mkiv @@ -0,0 +1,58 @@ +%D \module +%D [ file=page-par, % copied from page-lin +%D version=1997.03.31, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Line Numbering, +%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 Page Macros / Paragraph Numbering} + +\unprotect + +\newcount\internalparagraphnumber + +\def\setupparagraphnumbering + {\dosingleempty\dosetupparagraphnumbering} + +\def\dosetupparagraphnumbering[#1]% + {\getparameters + [\??ph][#1]% + \processaction + [\@@phstate] + [\v!start=>\let\showparagraphnumber\doshowparagraphnumberA, + \v!stop=>\let\showparagraphnumber\relax, + \v!line=>\let\showparagraphnumber\doshowparagraphnumberB, + \v!reset=>\global\internalparagraphnumber\zerocount + \let\showparagraphnumber\doshowparagraphnumberA]} + +\def\dodoshowparagraphnumber + {\global\advance\internalparagraphnumber \plusone + \inleftmargin % \tf normalizes em + {\tf{\doattributes\??ph\c!style\c!color{\the\internalparagraphnumber}}% + \kern\@@phdistance}} + +\def\doshowparagraphnumberA + {\ifprocessingverbatim + \iflinepar\dodoshowparagraphnumber\fi + \else + \dodoshowparagraphnumber + \fi} + +\def\doshowparagraphnumberB + {\ifnumberinglines + \doshowparagraphnumberA + \fi} + +\setupparagraphnumbering + [\c!state=\v!stop, + \c!style=, + \c!color=, + \c!distance=\ifcase\linenumberlocation2em\else\!!zeropoint\fi] % will change + +\protect \endinput diff --git a/tex/context/base/page-plg.tex b/tex/context/base/page-plg.mkii index 3203b923c..3203b923c 100644 --- a/tex/context/base/page-plg.tex +++ b/tex/context/base/page-plg.mkii diff --git a/tex/context/base/page-plg.mkiv b/tex/context/base/page-plg.mkiv new file mode 100644 index 000000000..bbee2eb57 --- /dev/null +++ b/tex/context/base/page-plg.mkiv @@ -0,0 +1,198 @@ +%D \module +%D [ file=page-pls, +%D version=2003.03.16, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Page Setup, +%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. + +\ifx\pageareabox\undefined \else \endinput \fi + +\writestatus{loading}{ConTeXt Page Macros / Extra Page Building} + +%D This feature has been present for a while but has never been +%D exploited: pluggable pagebuilders. The next example code +%D demonstrates the application of one such a plug-in. This variant +%D support \type {page}, \type {leftpage} and \type {rightpage} +%D definitions where specific areas are placed with the \type +%D {\pagearea} command. +%D +%D \starttyping +%D \setupheadertexts[the header text] +%D \setupfootertexts[a pretty long left footer text][something right] +%D \setupbottomtexts[a not so long bottom text][another right thing] +%D \setuptexttexts [margin][something marginal][indeed] +%D +%D \startpagelayout[leftpage] +%D \setupTABLE[offset=overlay] +%D \setupTABLE[c][1][width=\leftmarginwidth] +%D \bTABLE +%D \bTR +%D \bTD[nx=3,background=color,backgroundcolor=green] +%D \pagearea[header][text][middle] +%D \eTD +%D \eTR +%D \bTR +%D \bTD \pagearea[text][margin][left] \eTD +%D \bTD[nx=2] \pagearea[text] \eTD +%D \eTR +%D \bTR +%D \bTD[nx=3,offset=overlay] +%D {\bTABLE[width=.5\hsize] +%D \bTR +%D \bTD \pagearea[footer][text][left] \eTD +%D \bTD \pagearea[bottom][text][left] \eTD +%D \eTR +%D \eTABLE} +%D \eTD +%D \eTR +%D \eTABLE +%D \stoppagelayout +%D +%D \startpagelayout[rightpage] +%D \setupTABLE[offset=overlay] +%D \setupTABLE[c][1][width=\rightmarginwidth] +%D \bTABLE +%D \bTR +%D \bTD[nx=3] \pagearea[header][text][middle] \eTD +%D \eTR +%D \bTR +%D \bTD \pagearea[text][margin][left] \eTD +%D \bTD[nx=2] \pagearea[text] \eTD +%D \eTR +%D \bTR +%D \bTD[nx=3,offset=overlay] +%D {\bTABLE[width=.5\hsize] +%D \bTR +%D \bTD \pagearea[bottom][text][right] \eTD +%D \bTD \pagearea[footer][text][right] \eTD +%D \eTR +%D \eTABLE} +%D \eTD +%D \eTR +%D \eTABLE +%D \stoppagelayout +%D +%D \setupcolors[state=start] +%D +%D \setupbackgrounds[text][background=color,backgroundcolor=blue] +%D \setupbackgrounds[header][text][background=color,backgroundcolor=red] +%D +%D \setuppagenumbering[alternative=doublesided,location=] +%D +%D \setuplayout[method=makeup] +%D +%D \definetextbackground +%D [test] +%D [state=start, +%D background=color, +%D backgroundcolor=yellow] +%D +%D \starttext +%D +%D \dorecurse{10}{\input tufte \par} +%D +%D \input tufte \starttest \input tufte \stoptest \input tufte +%D +%D \starttabulate +%D \NC test \NC \starttest \input tufte \stoptest \NC \NR +%D \stoptabulate +%D +%D \dorecurse{10}{\input tufte \par} +%D +%D \stoptext +%D \stoptyping + +\unprotect + +\setvalue{\??ly\c!method\v!makeup}#1#2% + {\setbox\pagebox\hbox + {\vbox to \textheight + {\offinterlineskip + % optie + \vskip\dimexpr-1\topskip+\strutheight\relax + % + \textwidth\makeupwidth + \hsize\textwidth + \boxmaxdepth\maxdepth + \noindent + \dopagecontents#1#2}}% + \wd\pagebox\makeupwidth + \ht\pagebox\textheight + \dp\pagebox\zeropoint + \hsize\paperwidth + \vsize\paperheight + \setbox\pagebox\vbox + {\doifbothsidesoverruled + {\let\!!stringa\v!page} + {\let\!!stringa\v!rightpage} + {\let\!!stringa\v!leftpage}% + \getvalue{\??ly\c!method:\!!stringa}}% + \wd\pagebox\paperwidth + \ht\pagebox\paperheight + \dp\pagebox\zeropoint} + +\newbox\pageareabox + +\def\pagearea + {\dotripleempty\dopagearea} + +\def\dopagearea[#1][#2][#3]% + {\ifthirdargument + \doifelse{#3}\v!left + {\dodopagearea{#1}{#2}\c!lefttext} + {\doifelse{#3}\v!right + {\dodopagearea{#1}{#2}\c!righttext} + {\dodopagearea{#1}{#2}\c!middletext}}% + \else\ifsecondargument + \doifbothsidesoverruled + {\dodopagearea{#1}{#2}\c!righttext} + {\dodopagearea{#1}{#2}\c!righttext} + {\dodopagearea{#1}{#2}\c!lefttext }% + \else + \doif{#1}\v!text % copy due to trial runs in TABLE + {\iftrialtypesetting + \copy\pagebox + \else + \localpositioningfalse + \addtextbackground\pagebox + \addtextgridlayer\pagebox + \box\pagebox + \fi}% + \fi\fi} + +\def\dodopagearea#1#2#3% + {\setbox\pageareabox\vbox{\getvalue{\??tk#1#2#3}}% + \ifsomebackgroundfound{#1#2}% + \iftrialtypesetting + \box\pageareabox + \else + \localframed + [\??ma#1#2] + [\c!width=\wd\pageareabox, + \c!height=\ht\pageareabox, + \c!offset=\v!overlay] + {\box\pageareabox}% + \fi + \else + \box\pageareabox + \fi} + +\setvalue{\??ly\c!method:\v!leftpage }{\getvalue{\??ly\c!method:\v!page}} +\setvalue{\??ly\c!method:\v!rightpage}{\getvalue{\??ly\c!method:\v!page}} + +% \long\def\startpagelayout[#1]#2\stoppagelayout +% {\long\setvalue{\??ly\c!method:#1}{#2}} + +\long\def\startpagelayout + {\bgroup\catcode`\^^M=\@@ignore\dostartpagelayout} + +\long\def\dostartpagelayout[#1]#2\stoppagelayout + {\egroup\long\setvalue{\??ly\c!method:#1}{#2}} + +\protect \endinput diff --git a/tex/context/base/page-run.tex b/tex/context/base/page-run.mkii index ae5af81e9..ae5af81e9 100644 --- a/tex/context/base/page-run.tex +++ b/tex/context/base/page-run.mkii diff --git a/tex/context/base/page-run.mkiv b/tex/context/base/page-run.mkiv new file mode 100644 index 000000000..ae5af81e9 --- /dev/null +++ b/tex/context/base/page-run.mkiv @@ -0,0 +1,382 @@ +%D \module +%D [ file=page-run, +%D version=2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Runtime Macros, +%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 Page Macros / Runtime Macros} + +\unprotect + +\gdef\doshowprint[#1][#2][#3]% + {\framed + [\c!offset=\v!overlay, + \c!strut=\v!no] + {\forgetall + \dontcomplain + \globaldefs\minusone + \dimen0\pagegoal + \definepapersize[X][\c!width=4em, \c!height=6em]% + \definepapersize[Y][\c!width=12em,\c!height=14em]% + \setuppapersize[#1,X][#2,Y]% + \setuplayout[#3]% + \setbox0\vbox + {\framed + [\c!offset=\v!overlay,\c!strut=\v!no, + \c!width=\paperwidth,\c!height=\paperheight] + {\ss ABC\par DEF}}% + \doublesidedfalse + \def\cutmarklength{.5em}% + \addpagecutmarks0% + \replicatepagebox0% + \scalepagebox0% + \mirrorpaperbox0% + \orientpaperbox0% + \centerpagebox0% + \mirrorprintbox0% + \orientprintbox0% + \offsetprintbox0% + \pagegoal\dimen0 + \box0}} + +\gdef\showprint + {\dotripleempty\doshowprint} + +% \switchnaarkorps[8pt] +% +% \startcombinatie[4*4] +% {\toonprint} {\strut} +% {\toonprint[][][plaats=midden]} {\type{plaats=midden}} +% {\toonprint[][][plaats=midden,markering=aan]} {\type{markering=aan}\break +% \type{plaats=midden}} +% {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break +% \type{plaats=midden}\break +% \type{nx=2}} +% {\toonprint[][][plaats=links]} {\type{plaats=links}} +% {\toonprint[][][plaats=rechts]} {\type{plaats=rechts}} +% {\toonprint[][][plaats={links,onder}]} {\type{plaats={links,onder}}} +% {\toonprint[][][plaats={rechts,onder}]} {\type{plaats={rechts,onder}}} +% {\toonprint[][][nx=2,ny=1]} {\type{nx=2,ny=1}} +% {\toonprint[][][nx=1,ny=2]} {\type{nx=1,ny=2}} +% {\toonprint[][][nx=2,ny=2]} {\type{nx=2,ny=2}} +% {\toonprint[][][nx=2,ny=2,plaats=midden]} {\type{nx=2,ny=2}\break +% \type{plaats=midden}} +% {\toonprint[][][rugoffset=3pt]} {\type{rugoffset=.5cm}} +% {\toonprint[][][kopoffset=3pt]} {\type{kopoffset=.5cm}} +% {\toonprint[][][schaal=1.5]} {\type{schaal=1.5}} +% {\toonprint[][][schaal=0.8]} {\type{schaal=0.8}} +% \stopcombinatie +% +% \startcombinatie[3*4] +% {\toonprint[liggend][][plaats=midden]} {\type{liggend}} +% {\toonprint[][liggend][plaats=midden]} {\strut\break\type{liggend}} +% {\toonprint[liggend][liggend][plaats=midden]} {\type{liggend}\break\type{liggend}} +% {\toonprint[90][][plaats=midden]} {\type{90}} +% {\toonprint[][90][plaats=midden]} {\strut\break\type{90}} +% {\toonprint[90][90][plaats=midden]} {\type{90}\break\type{90}} +% {\toonprint[180][][plaats=midden]} {\type{180}} +% {\toonprint[][180][plaats=midden]} {\strut\break\type{180}} +% {\toonprint[180][180][plaats=midden]} {\type{180}\break\type{180}} +% {\toonprint[gespiegeld][][plaats=midden]} {\type{gespiegeld}} +% {\toonprint[][gespiegeld][plaats=midden]} {\strut\break\type{gespiegeld}} +% {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}} +% \stopcombinatie + +\gdef\doshowframe[#1][#2]% + {\ifsecondargument + \setupbackgrounds + [\v!page] + [\c!frame=\v!on, + \c!corner=\v!rectangular, + \c!frameoffset=\!!zeropoint, + \c!framedepth=\!!zeropoint, + \c!framecolor=layout:page] + \setupbackgrounds + [#1][#2] + [\c!background=, + \c!frame=\v!on, + \c!corner=\v!rectangular, + \c!frameoffset=\!!zeropoint, + \c!framedepth=\!!zeropoint, + \c!framecolor=] + \else\iffirstargument + \showframe + [\v!header,\v!text,\v!footer] + [#1] + \else + \showframe + [\v!header,\v!text,\v!footer] + [\v!leftedge,\v!leftmargin, + \v!text, + \v!rightmargin,\v!rightedge] + \fi\fi + \setupbackgrounds + [\c!state=\v!repeat]} + +\gdef\showframe{\dodoubleempty\doshowframe} + +\gdef\showsetupA#1#2% + {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr} + +\gdef\showsetupB#1#2#3% + {#1&#3&\tttf\string#3\cr} + +% \startinterface english % english is fallback + +\gdef\showsetups + {\noindent + \vbox + {\forgetall + \dontcomplain + \switchtobodyfont[\v!small] + \tabskip\zeropoint + \halign + {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr + \showsetupA{paperheight} \paperheight + \showsetupA{paperwidth} \paperwidth + \showsetupA{printpaperheight} \printpaperheight + \showsetupA{printpaperwidth} \printpaperwidth + \showsetupA{topspace} \topspace + \showsetupA{backspace} \backspace + \showsetupA{height} \makeupheight + \showsetupA{width} \makeupwidth + \showsetupA{top} \topheight + \showsetupA{topdistance} \topdistance + \showsetupA{header} \headerheight + \showsetupA{headerdistance} \headerdistance + \showsetupA{textheight} \textheight + \showsetupA{footerdistance} \footerdistance + \showsetupA{footer} \footerheight + \showsetupA{bottomdistance} \bottomdistance + \showsetupA{bottom} \bottomheight + \showsetupA{leftedge} \leftedgewidth + \showsetupA{leftedgedistance} \leftedgedistance + \showsetupA{leftmargin} \leftmarginwidth + \showsetupA{leftmargindistance} \leftmargindistance + \showsetupA{textwidth} \textwidth + \showsetupA{rightmargindistance}\rightmargindistance + \showsetupA{rightmargin} \rightmarginwidth + \showsetupA{rightedgedistance} \rightedgedistance + \showsetupA{rightedge} \rightedgewidth + \showsetupB{bodyfontsize} \the \globalbodyfontsize + \showsetupB{line} \relax \normallineheight + \showsetupB{height} \relax \strutheightfactor + \showsetupB{depth} \relax \strutdepthfactor + \showsetupB{topskip} \relax \topskipfactor + \showsetupB{maxdepth} \relax \maxdepthfactor}}} + +% \stopinterface + +\startinterface dutch + +\gdef\showsetups + {\noindent + \vbox + {\forgetall + \dontcomplain + \switchtobodyfont[\v!small] + \tabskip\zeropoint + \halign + {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr + \showsetupA{papierhoogte} \papierhoogte + \showsetupA{papierbreedte} \papierbreedte + \showsetupA{printpapierhoogte} \printpapierhoogte + \showsetupA{printpapierbreedte} \printpapierbreedte + \showsetupA{kopwit} \kopwit + \showsetupA{rugwit} \rugwit + \showsetupA{snijwit} \snijwit + \showsetupA{hoogte} \zethoogte + \showsetupA{breedte} \zetbreedte + \showsetupA{boven} \bovenhoogte + \showsetupA{bovenafstand} \bovenafstand + \showsetupA{hoofd} \hoofdhoogte + \showsetupA{hoofdafstand} \hoofdafstand + \showsetupA{teksthoogte} \teksthoogte + \showsetupA{voetafstand} \voetafstand + \showsetupA{voet} \voethoogte + \showsetupA{onderafstand} \onderafstand + \showsetupA{onder} \onderhoogte + \showsetupA{linkerrand} \linkerrandbreedte + \showsetupA{linkerrandafstand} \linkerrandafstand + \showsetupA{linkermarge} \linkermargebreedte + \showsetupA{linkermargeafstand} \linkermargeafstand + \showsetupA{tekstbreedte} \tekstbreedte + \showsetupA{rechtermargeafstand}\rechtermargeafstand + \showsetupA{rechtermarge} \rechtermargebreedte + \showsetupA{rechterrandafstand} \rechterrandafstand + \showsetupA{rechterrand} \rechterrandbreedte + \showsetupB{korps} \the \globalbodyfontsize + \showsetupB{regel} \relax \normallineheight + \showsetupB{hoogte} \relax \strutheightfactor + \showsetupB{diepte} \relax \strutdepthfactor + \showsetupB{boven} \relax \topskipfactor + \showsetupB{onder} \relax \maxdepthfactor}}} + +\stopinterface + +% todo: \showsetupA{rugwit} \rugwit + +\startinterface german + +\gdef\showsetups% + {\noindent + \vbox + {\forgetall + \dontcomplain + \switchtobodyfont[\v!small] + \tabskip\zeropoint + \halign + {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr + \showsetupA{papierhoehe} \papierhoehe + \showsetupA{papierbreite} \papierbreite + \showsetupA{printpapierhoehe} \printpapierhoehe + \showsetupA{printpapierbreite} \printpapierbreite + \showsetupA{kopfweite} \kopfweite + \showsetupA{rumpfweite} \rumpfweite + \showsetupA{hoehe} \satzhoehe + \showsetupA{breite} \satzbreite + \showsetupA{oben} \hoeheoben + \showsetupA{abstandoben} \abstandoben + \showsetupA{kopfzeile} \kopfzeilenhoehe + \showsetupA{kopfzeilenabstand} \kopfzeilenabstand + \showsetupA{texthoehe} \texthoehe + \showsetupA{fusszeileabstand} \fusszeileabstand + \showsetupA{fusszeilen} \fusszeilenhoehe + \showsetupA{abstandunten} \abstandunten + \showsetupA{hoeheunten} \hoeheunten + \showsetupA{linkerrand} \breitelinkerrand + \showsetupA{abstandlinkerrand} \abstandlinkerrand + \showsetupA{linkemarginal} \linkemarginalbreite + \showsetupA{linkemarginalafstand} \linkemarginalafstand + \showsetupA{textbreite} \textbreite + \showsetupA{rechtemarginalafstand}\rechtemarginalafstand + \showsetupA{rechtemarginal} \rechtemarginalbreite + \showsetupA{abstandrechterrand} \abstandrechterrand + \showsetupA{rechterrand} \breiterechterrand + \showsetupB{fliesstext} \the \globalbodyfontsize + \showsetupB{linie} \relax \normallineheight + \showsetupB{hoehe} \relax \strutheightfactor + \showsetupB{tiefe} \relax \strutdepthfactor + \showsetupB{topskip} \relax \topskipfactor + \showsetupB{maxdepth} \relax \maxdepthfactor}}} + +\stopinterface + +\startinterface czech + +\gdef\showsetups% + {\noindent + \vbox + {\forgetall + \dontcomplain + \switchtobodyfont[\v!small] + \tabskip\zeropoint + \halign + {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr + \showsetupA{vyskapapiru} \vyskapapiru + \showsetupA{sirkapapiru} \sirkapapiru + \showsetupA{vyskatiskpapiru} \vyskatiskpapiru + \showsetupA{sirkatiskpapiru} \sirkatiskpapiru + \showsetupA{hornimezera} \hornimezera + \showsetupA{spodnimezera} \spodnimezera + \showsetupA{vyska} \vyskasazby + \showsetupA{breite} \sirkasazby + \showsetupA{vyskatextu} \vyskatextu + \showsetupA{sirkatextu} \sirkatextu + \showsetupA{horejsek} \vyskahorejsku + \showsetupA{vzdalenosthorejsku} \vzdalenosthorejsku + \showsetupA{zahlavi} \vyskazahlavi + \showsetupA{vzdalenostzahlavi} \vzdalenostzahlavi + \showsetupA{fusszeileabstand} \vzdalenostupati + \showsetupA{upati} \vyskaupati + \showsetupA{vzdalenostspodku} \vzdalenostspodku + \showsetupA{spodek} \vyakaspodku + \showsetupA{levyokraj} \sirkalevehookraje + \showsetupA{vzdalenostlevehookraje} \vzdalenostlevehookraje + \showsetupA{levamarginalie} \sirkalevemarginalie + \showsetupA{vzdalenostlevemarginalie} \vzdalenostlevemarginalie + \showsetupA{vzdalenostpravemarginalie}\vzdalenostpravemarginalie + \showsetupA{pravamarginalie} \sirkapravemarginalie + \showsetupA{vzdalenostpravehookraje} \vzdalenostpravehookraje + \showsetupA{pravyokraj} \sirkapravehookraje + \showsetupB{zakladnivelikost} \the \globalbodyfontsize + \showsetupB{linka} \relax \normallineheight + \showsetupB{vyska} \relax \strutheightfactor + \showsetupB{hloubka} \relax \strutdepthfactor + \showsetupB{topskip} \relax \topskipfactor + \showsetupB{maxdepth} \relax \maxdepthfactor}}} + +\stopinterface + +\startinterface romanian + +\gdef\showsetups% + {\noindent + \vbox + {\forgetall + \dontcomplain + \switchtobodyfont[\v!small] + \tabskip\zeropoint + \halign + {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr + \showsetupA{paperheight} \paperheight + \showsetupA{paperwidth} \paperwidth + \showsetupA{printpaperheight} \printpaperheight + \showsetupA{printpaperwidth} \printpaperwidth + \showsetupA{topspace} \topspace + \showsetupA{backspace} \backspace + \showsetupA{height} \makeupheight + \showsetupA{width} \makeupwidth + \showsetupA{top} \topheight + \showsetupA{topdistance} \topdistance + \showsetupA{header} \headerheight + \showsetupA{headerdistance} \headerdistance + \showsetupA{textheight} \textheight + \showsetupA{footerdistance} \footerdistance + \showsetupA{footer} \footerheight + \showsetupA{bottomdistance} \bottomdistance + \showsetupA{bottom} \bottomheight + \showsetupA{leftedge} \leftedgewidth + \showsetupA{leftedgedistance} \leftedgedistance + \showsetupA{leftmargin} \leftmarginwidth + \showsetupA{leftmargindistance} \leftmargindistance + \showsetupA{textwidth} \textwidth + \showsetupA{rightmargindistance}\rightmargindistance + \showsetupA{rightmargin} \rightmarginwidth + \showsetupA{rightedgedistance} \rightedgedistance + \showsetupA{rightedge} \rightedgewidth + \showsetupB{bodyfontsize} \the \globalbodyfontsize + \showsetupB{line} \relax \normallineheight + \showsetupB{height} \relax \strutheightfactor + \showsetupB{depth} \relax \strutdepthfactor + \showsetupB{topskip} \relax \topskipfactor + \showsetupB{maxdepth} \relax \maxdepthfactor}}} + +\stopinterface + +\gdef\showlayout % interfereert lelijk met een \typefile er na + {\bgroup + \page + \showframe + \setuplayout[\c!marking=\v!on] + \dorecurse{4}{\showsetups\page} + \egroup} + +\gdef\showmargins + {\starttabulate + \NC asynchrone \NC \doifoddpageelse {odd} {even} \NC \NR + \NC synchrone \NC \doifrightpageelse {right} {left} \NC \NR + \NC right margin \NC \the\rightmarginwidth \NC \NR + \NC left margin \NC \the\leftmarginwidth \NC \NR + \NC outer margin \NC \the\outermarginwidth \NC \NR + \NC inner margin \NC \the\innermarginwidth \NC \NR + \stoptabulate} + +\protect \endinput diff --git a/tex/context/base/page-set.tex b/tex/context/base/page-set.mkii index a9d42bce8..b8a075179 100644 --- a/tex/context/base/page-set.tex +++ b/tex/context/base/page-set.mkii @@ -2515,6 +2515,15 @@ \processcommacommand[#1]\docommand \egroup} +% \page[left] +% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer] +% \setupcolumntextareatext[intro][left][\setups{intro}] +% \flushcolumntextareas + +\def\flushcolumntextareas + {\initializecolumntextareas + \setvsize} + \def\columntextlastbackspace{\backspace} % beware, we have clipping offsets of 2\lineheight by default @@ -2789,6 +2798,206 @@ % \startcolumnsetspan[two] \input tufte \stopcolumnsetspan % \stopcolumnset +% We need to set the \dimen globally since we are in the +% OTR. Unfortunately this interferes with local settings, +% although we may assume that they will not cross page +% boundaries. + +\def\OTRSETcheckcontent + {\bgroup + \donefalse + \def\OTRSETcheckcontent##1% + {\setbox\scratchbox##1\recurselevel + \setbox\scratchbox\vbox{\unvbox\scratchbox}% + \ifdim\ht\scratchbox>\zeropoint\donetrue\fi}% + \dorecurse{\nofcolumns} + {\OTRSETcheckcontent\columngettextbox + \OTRSETcheckcontent\columngetfootbox + \OTRSETcheckcontent\columngettopbox + \OTRSETcheckcontent\columngetbotbox}% + \ifdone\egroup\donefalse\else\egroup\donetrue\fi} + +\def\OTRSETgetcolumntextheight#1% max - boven - top + {\scratchdimen=\OTRSETgetparameter\c!maxhoogte#1% + \advance\scratchdimen -\OTRSETgetparameter\c!bovenoffset#1% + \advance\scratchdimen -\ht\columntopbox#1% + \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% + \advance\scratchdimen -\ht\columnbotbox#1} % not used + +\def\OTRSETgetcolumnnaturalheight#1% max - boven - top + {\setbox\scratchbox\vbox{\unvcopy\columntextbox#1}% + \scratchdimen\ht\scratchbox + \advance\scratchdimen \OTRSETgetparameter\c!bovenoffset#1% + \advance\scratchdimen \ht\columntopbox#1% + \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% + \advance\scratchdimen \ht\columnbotbox#1} % not used + +\def\OTRSETdobalance% splitten in met en zonder footnotes + {\bgroup + \maxdeadcycles=1000 + % collect content and notes + \bgroup + \OTRSEToutput + {\global\setbox1\vbox{\unvbox\normalpagebox}% + \global\setbox3\vbox{\unvbox\footins}}% + \verticalstrut\vskip-\struttotal % makes footnotes flush + \eject + \global\collectingcontentfalse + % check for footnotes only + \ifdim\ht1<\topskip % real dirty + \global\setbox1=\vbox{} + % fix height of first line + \ifdim\ht3>\!!zeropoint + \global\setbox3\vbox + {\setfootnotebodyfont + \kern-\strutht + \kern\topskip + \unvbox3} + \fi + % prepare trial box + \global\setbox5\vbox + {\ifdim\ht1>\zeropoint + \unvcopy1 \ifdim\ht3>\zeropoint \kern\skip\footins \fi + \fi + \ifdim\ht3>\zeropoint \unvcopy3 \fi} + \egroup + % erase old stuff + \columnerasetextboxes + \columnerasefootboxes + % prepare floats + \OTRSETdotopinsertions + \OTRSETdobotinsertions % not used can be removed + % calculate available space + \!!heighta\zeropoint % available total height + \dorecurse{\nofcolumns} + {\OTRSETgetcolumntextheight\recurselevel + \OTRSETcalculatelines\scratchdimen + \advance\!!heighta \scratchdimen} + % quick check + \ifdim\ht5>\!!heighta + % use normal routine + \columnerasetextboxes + \columnerasefootboxes + % TEMP, TODO, FORCE NEXT PASS ! + \unvbox1 + \unvbox3 + \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist + \donefalse + %\writestatus\m!columns{no balancing, text overflows height}% + \else\ifdim\ht5>\zeropoint \relax + % some text and/or notes + \donetrue + \else + \donefalse + \dorecurse\nofcolumns + {\ifdim\ht\columntopbox\recurselevel>\zeropoint \donetrue \fi}% + \ifdone + % no text and notes, but figures + \else + % no text, no notes, no figures + \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist + \writestatus\m!columns{no balancing, nothing to be placed}% + \fi + \fi\fi + \ifdone + \ifdim\ht5>\zeropoint \relax + % balancing text and notes + %\writestatus\m!columns{text may fit, balancing}% + \newcounter\loopcounter + \newcounter\balancinglines + \doloop + {\increment\loopcounter\relax + % initialize + \columnerasetextboxes + \columnerasefootboxes + \setbox0=\copy5 + \splittopskip\topskip + % pre-split loop and quality calculation + %\writestatus\m!columns{pass \loopcounter: correction -\balancinglines} + \dorecurse\nofcolumns + {\OTRSETgetcolumntextheight\recurselevel + \OTRSETcalculatelines\scratchdimen + \!!heightc\scratchdimen + \ifnum\recurselevel<\nofcolumns + \advance\!!heightc -\balancinglines\lineheight + \fi + \columnsettextbox\recurselevel\vsplit0 to \!!heightc} + % just one method + \OTRSETgetcolumnnaturalheight1 \dimen4\scratchdimen + \OTRSETgetcolumnnaturalheight\nofcolumns \dimen6\scratchdimen + %\writestatus\m!columns{first column: \the\dimen4}% + %\writestatus\m!columns{last column: \the\dimen6}% + \ifdim\dimen4=\dimen6 + \donetrue % perfect balance + \else\ifdim\dimen4>\dimen6 + \donefalse % not yet good enough + \increment\balancinglines % try again + \edef\balancingcount{\the\!!counta} + \else + \donetrue % worse balance + \ifnum\balancinglines>0 % take previous + \decrement\balancinglines + \fi + \fi\fi + % extra check + % \ifdim\ht0>\zeropoint\relax \donefalse \fi + % another check + \ifdone + %\writestatus\m!columns{balancing finished in pass \loopcounter}% + \else \ifnum\loopcounter>100 \donetrue + %\writestatus\m!columns{balancing aborted after pass \loopcounter}% + \else + %\writestatus\m!columns{balancing continued after pass \loopcounter}% + \fi \fi + % final balancing pass + \ifdone + \setbox0\copy1 + \setbox2\copy3 + \columnerasetextboxes + \columnerasefootboxes + \dorecurse\nofcolumns + {\OTRSETgetcolumntextheight\recurselevel + \OTRSETcalculatelines\scratchdimen + \!!heightc\scratchdimen + \ifnum\recurselevel<\nofcolumns + \advance\!!heightc -\balancinglines\lineheight + \fi + % split off text + \ifdim\ht0>\zeropoint + \columnsettextbox\recurselevel\vsplit0 to \!!heightc + \setbox4\vbox{\unvcopy\columntextbox\recurselevel} + \advance\!!heightc -\ht4 + \ifdim\ht0>\zeropoint + \columnsettextbox\recurselevel\box4 + \advance\!!heightc \skip\footins + \fi + \fi + % split off footnotes + \ifdim\ht0>\zeropoint\relax \else + \ifdim\ht2>\zeropoint\relax + \setbox4\vsplit2 to \!!heightc + \setbox\footins=\vbox{\unvbox4} % ugly and dirty trick + \ifdim\ht\columntextbox\recurselevel=\zeropoint\relax + \columnsettextbox\recurselevel\hbox + {\raise\strutdp\hbox % ugly but needed + {\setfootnotebodyfont % both these moves + \lower\strutdp\hbox{\placebottomnotes}}} + \else + \columnsetfootbox\recurselevel\hbox{\placebottomnotes} + \fi + \fi + \fi} + \exitloop + \fi} + \else + % no reason to balance floats + \fi + \fi + \doglobal\addtocommalist{\realfolio}\OTRSETbalancinglist + \OTRSETdoflush + \fi + \egroup} + \protect \endinput % extreme examples (1) @@ -2813,3 +3022,88 @@ % \startcolumnset[first,next] % \chapter{thuan} \dorecurse{25}{\input thuan \endgraf\placefigure{}{}} % \stopcolumnset + +\unprotect + +% only in columnsets + +% \def\cornerfigure +% {\dotripleempty\docornerfigure} +% +% \def\docornerfigure[#1][#2][#3]% [layer] [location] [settings] +% {\bgroup +% \dowithnextbox +% {\!!doneafalse +% \!!donebfalse +% \processallactionsinset +% [\v!left,\v!bottom,#2] +% [ \v!left=>\!!doneatrue , +% \v!right=>\!!doneafalse, +% \v!top=>\!!donebtrue , +% \v!bottom=>\!!donebfalse]% +% \!!widtha\nextboxwd +% \if!!donea +% % unchecked +% \advance\!!widtha-\backspace +% \else +% % unchecked +% \advance\!!widtha-\backspace +% \fi +% \!!widtha\textwidth % could be an option +% \!!heighta\nextboxht +% % zou een macro moeten zijn \getnoflayoutlines +% \ifnum\layoutparameter\c!lines=\zerocount +% \getnoflines\textheight +% \else +% \noflines\layoutparameter\c!lines +% \fi +% % +% \advance\noflines \plusone % wordt default, instelbaar +% \!!heightb\noflines\lineheight\relax +% \if!!doneb % boven +% % unchecked +% \advance\!!heighta-\topspace +% \advance\!!heighta-\headerheight +% \advance\!!heighta-\headerdistance +% \else % onder +% % checked +% \advance\!!heighta-\paperheight +% \advance\!!heighta+\!!heightb +% \advance\!!heighta+\topspace +% \advance\!!heighta+\headerheight +% \advance\!!heighta+\headerdistance +% \advance\!!heighta-\footerdistance +% \advance\!!heighta-\footerheight +% \fi +% \getnoflines\!!heighta +% \!!heighta\noflines\lineheight\relax +% \def\docornerfigure[####1]% +% {\expanded{\plaatsfiguur[####1,\v!none]{} +% {\noexpand\phantombox[\c!width=\the\!!widtha,\c!height=\the\!!heighta]}}}% +% \if!!donea +% \if!!doneb % links boven / rb +% \setlayer[#1] +% [\c!corner={\v!left,\v!top},\c!location=rb,#3] +% {\flushnextbox}% +% \docornerfigure[tblr]% +% \else % links onder / rt +% \setlayer[#1] +% [\c!corner={\v!left,\v!bottom},\c!location=rt,#3] +% {\flushnextbox}% +% \docornerfigure[btlr]% +% \fi +% \else +% \if!!doneb % rechts boven / lt +% \setlayer[#1] +% [\c!corner={\v!right,\v!top},\c!location=lb,#3] +% {\flushnextbox}% +% \docornerfigure[tbrl]% +% \else % rechts onder / lb +% \setlayer[#1] +% [\c!corner={\v!right,\v!bottom},\c!location=lt,#3] +% {\flushnextbox}% +% \docornerfigure[btrl]% +% \fi +% \fi +% \egroup} +% \vbox} diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv new file mode 100644 index 000000000..e50c5ec21 --- /dev/null +++ b/tex/context/base/page-set.mkiv @@ -0,0 +1,3104 @@ +%D \module +%D [ file=page-set, +%D version=2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Column Sets, +%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. + +% getnoflines vs getrawnoflines + +% some day: cleanup and go etex + +\writestatus{loading}{ConTeXt Page Macros / Column Sets} + +% todo : last longer than previous +% todo : block span over last column if footnotes +% todo : diagnosis balancing run +% todo : separate footnote placement +% todo : go on on same page with colset +% todo : test page areas per page +% todo : leftmargin/rightmargin (better than afstand(1)) + +% use the OTRSET layer for more purposes, like the footnotes ! + +\unprotect + +\newcount\tofcolumns % total +\newcount\lofcolumns % left +\newcount\rofcolumns % right + +\newcount\columnfirstcell \columnfirstcell=1 +\newcount\columnlastcell +\newcount\columnfreecells +\newcount\currenthcell +\newcount\currentvcell +\newcount\columnhcells +\newcount\columnvcells + +\newif\ifenoughcolumncells +\newif\ifsomefreecolumncells +\newif\ifcolumnspread +\newif\iftracecolumnset % \tracecolumnsettrue + +\def\columnmaxcells {75} % runtime +\def\columnmaxfreecells {0} % runtime +\def\columngaplimit {0} % {5} + +\def\@otr@{otr} + +\def\OTRSETmakeupwidth{\innermakeupwidth} + +\let\OTRSETflushsidefloats \forgetsidefloats % \relax +\let\OTRSETsynchronizesidefloats\forgetsidefloats % \relax + +\def\OTRSETgridcell #1#2{\csname \@otr@:\number#1:\number#2\endcsname} +\def\OTRSETgetgridcell#1#2{\box\csname \@otr@:\number#1:\number#2\endcsname} +\def\OTRSETsetgridcell#1#2{\global\setbox\csname\@otr@:\number#1:\number#2\endcsname} + +\long\def\OTRSETdoifcellelse#1#2% + {\relax\ifvoid\csname\@otr@:\number#1:\number#2\endcsname + \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments + \fi} + +% The following two macros are used to compensate for a switch in body fonts +% as in: +% +% \definecolumnset [two] [n=2,balancing=yes] +% \definecolumnset [three] [n=3,balancing=yes] +% +% \setupcolumnsetlines[two][1][1][7] +% \setupcolumnsetlines[two][1][2][10] +% +% \setupcolumnsetlines[three][1][1][40] +% \setupcolumnsetlines[three][1][2][40] +% \setupcolumnsetlines[three][1][3][40] +% +% \setupcolumnsetstart[three][1][1][15] +% \setupcolumnsetstart[three][1][2][20] +% \setupcolumnsetstart[three][1][3][20] +% +% \starttext +% \startcolumnset [two] \dorecurse {1}{\input tufte \par} \stopcolumnset +% \switchtobodyfont[small] +% \startcolumnset [three] \dorecurse {1}{\input tufte \par} \stopcolumnset +% \stoptext + +%D Marks in columnsets: +%D +%D \starttyping +%D \definemarking[M] +%D \setupheadertexts[\setups{show-M-marks}] +%D \definecolumnset[test][n=3] +%D +%D \startsetups show-M-marks +%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][1][last]\quad +%D \getmarking[M][2][previous]/\getmarking[M][2][first]/\getmarking[M][2][last]\quad +%D \getmarking[M][3][previous]/\getmarking[M][3][first]/\getmarking[M][3][last]\quad +%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][last]\quad +%D \getsavedmarking[M][previous]/\getsavedmarking[M][first]/\getsavedmarking[M][last] +%D \stopsetups +%D +%D \startbuffer +%D \section{Knuth} [K1]\marking[M]{k1} [K2]\marking[M]{k2} \input knuth +%D \section{Zapf} [Z]\marking[M]{z} \input zapf +%D \stopbuffer +%D +%D \startbuffer +%D \section{Ward} [W]\marking[M]{w} \input ward +%D \placefigure[here]{none}{\externalfigure[a][height=2cm]} +%D \section{Davis} [D]\marking[M]{d} \input davis +%D \section{Zapf} [Z]\marking[M]{z} \input zapf +%D \stopbuffer +%D +%D \startbuffer +%D \section{Ward} [W]\marking[M]{w} \input ward +%D \placefigure[here]{none}{\externalfigure[a][height=2cm]} +%D \section{Davis} [D]\marking[M]{d} \input davis +%D \section{Zapf} [Z]\marking[M]{z} \input zapf +%D \section{Douglas} [O]\marking[M]{o} \input douglas +%D \stopbuffer +%D +%D \starttext +%D \startcolumnset[test] +%D \dorecurse{5}{\getbuffer} +%D \placefigure[here]{none}{\externalfigure[a][height=2cm]} +%D % \column % sometimes needed +%D \stopcolumnset +%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 +%D \setuplayout[height=middle,width=middle,grid=yes] +%D +%D \starttext +%D \startcolumnset +%D \dorecurse{10} +%D {\input thuan \endgraf +%D \bgroup +%D \ss\restoreinterlinespace +%D \dorecurse{3}{\input hawking \endgraf} +%D \egroup +%D \input bryson \endgraf} +%D \stopcolumnset +%D \stoptext +%D \stoptyping + +\def\OTRSETsetcorrectnofcells#1% + {\bgroup + \!!counta#1\relax + \ifdim\globalbodyfontsize=\localbodyfontsize + \restoreinterlinespace + \else + \!!dimena-\!!counta\lineheight + \restoreglobalbodyfont % slow, we need a fast one + \advance\!!dimena\!!counta\lineheight + \getnoflines\!!dimena + \advance\!!counta\noflines + \ifnum\!!counta<#1\else + \!!counta#1\relax + \fi + \fi + \relax % needed ! ! ! ! else lookahead over \fi and \@EA + \@EA\egroup\@EA\scratchcounter\the\!!counta\relax} + +\def\OTRSETsetcorrectcellht + {\bgroup + \!!dimena-\strutht\relax + \ifdim\globalbodyfontsize=\localbodyfontsize + \restoreinterlinespace + \else + \restoreglobalbodyfont + \fi + \advance\!!dimena\strutht + \relax % needed ! ! ! ! else lookahead over \fi and \@EA + \@EA\egroup\@EA\scratchdimen\the\!!dimena\relax} + +\def\columnerasegridboxes % maybe dedicated loops + {\bgroup + \increment\columnmaxcells\relax + \ifodd\realpageno + \else % we are on the other page + \columnspreadfalse + \fi + \ifcolumnspread + \dorecurse\nofcolumns + {\let\!!stringa\recurselevel + \scratchcounter\recurselevel \advance\scratchcounter\lofcolumns + \edef\!!stringb{\the\scratchcounter}% + \dostepwiserecurse \zerocount \columnmaxcells \plusone + {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname + \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname + \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname + \box\csname\@otr@:\!!stringb:\recurselevel\endcsname + %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname + \else + \emptybox + %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox + \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname + \fi + \else + \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname + \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname + \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname + \else + \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname + \fi + \fi}}% + \else + \dorecurse \tofcolumns + {\let\!!stringa\recurselevel + \dostepwiserecurse \zerocount \columnmaxcells \plusone + {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname + \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox + \else + \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname + \fi}}% + \fi + \dorecurse\tofcolumns + {\global\setbox\csname\@otr@:\recurselevel:\columnmaxcells\endcsname\copy\placeholderboxa}% + \global\columnfirstcell\zerocount + \global\columnlastcell\columnfirstcell + \global\columnfreecells\columnfirstcell + \egroup} + +\def\doOTRSETsetgridcells#1#2#3#4#5#6% placeholder col row wid hei {data} + {\!!countd#2\advance\!!countd#4\advance\!!countd\minusone + \!!counte#3\advance\!!counte#5\advance\!!counte\minusone + \dostepwiserecurse{#2}\!!countd\plusone + {\!!countf\recurselevel + \dostepwiserecurse{#3}\!!counte\plusone + {\OTRSETsetgridcell\!!countf\recurselevel#1}}% + \dostepwiserecurse{#3}\!!counte\plusone + {\global\wd\OTRSETgridcell{#2}\recurselevel\hsize}% + \OTRSETsetgridcell{#2}\!!counte#6} + +\def\OTRSETsetgridcells + {\doOTRSETsetgridcells{\copy\placeholderboxb}} + +\def\OTRSETerasegridcells#1#2#3#4% + {\doOTRSETsetgridcells{\emptybox}{#1}{#2}{#3}{#4}{\emptybox}} + +\def\setupcolumnsetlines{\doquintupleempty\dosetupcolumnsettrick[l]} +\def\setupcolumnsetstart{\doquintupleempty\dosetupcolumnsettrick[s]} + +\def\dosetupcolumnsettrick[#1][#2][#3][#4][#5]% tag id page col value + {% not needed, is already relative + % \doifinstringelse{+}{#3}{\scratchcounter\realpageno}{\scratchcounter\zerocount}% + % \advance\scratchcounter#3\relax % \relax needed + % \setevalue{\??mc:#1:#2:\the\scratchcounter:\number#4}{\number#5}} + \iffifthargument + \setevalue{\??mc:#1:#2:\number#3:\number#4}{\number#5}% + \else + \setevalue{\??mc:#1:#2:\number#3:0}{\number#4}% + \fi} + +\def\currentcolumnmaxcellstag #1{\??mc:l:\OTRSETidentifier:\columnsetpage:\number#1} +\def\currentcolumnstartcelltag#1{\??mc:s:\OTRSETidentifier:\columnsetpage:\number#1} + +\def\doresetcolumnsetlines#1% + {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname + \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount + \fi + \ifcsname\currentcolumnmaxcellstag{#1}\endcsname + \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount + \fi} + +\def\currentcolumnsomecells#1#2% + {\ifcsname#1\mofcolumns\endcsname + \ifnum\csname#1\mofcolumns\endcsname=\zerocount + #2% + \else + \number\numexpr\ifnum\csname#1\mofcolumns\endcsname<\zerocount + \columnmaxcells+\fi\csname#1\mofcolumns\endcsname\relax + \fi + \else\ifcsname#10\endcsname + \ifnum\csname#10\endcsname=\zerocount + #2% + \else + \number\numexpr\ifnum\csname#10\endcsname<\zerocount + \columnmaxcells+\fi\csname#10\endcsname\relax + \fi + \else + #2% + \fi\fi} + +\def\currentcolumnmaxcells {\currentcolumnsomecells\currentcolumnmaxcellstag \columnmaxcells} +\def\currentcolumnstartcell{\currentcolumnsomecells\currentcolumnstartcelltag\plusone} + +\def\OTRSETsetfreecells#1#2% col start + {\bgroup + \global\columnfirstcell\ifnum#2=0 1\else#2\fi\relax + \OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter + \edef\columnmaxcells{\the\scratchcounter}% + \ifnum\columnfirstcell>\columnmaxcells + \global\columnfreecells\zerocount + \global\columnfirstcell\plusone + \global\columnlastcell \zerocount + \global\somefreecolumncellsfalse + %\message{no cells a}% + \else + \doloop + {\ifnum\columnfirstcell>\columnmaxcells\relax + \exitloop + \else + \OTRSETdoifcellelse{#1}\columnfirstcell + {\global\advance\columnfirstcell\plusone}\exitloop + \fi}% + \global\columnlastcell\columnfirstcell + \doloop + {\ifnum\columnlastcell>\columnmaxcells\relax + \exitloop + \else + \OTRSETdoifcellelse{#1}\columnlastcell + {\global\advance\columnlastcell \minusone \exitloop} + {\global\advance\columnlastcell \plusone }% + \fi}% + \ifnum\columnfirstcell>\columnmaxcells + \global\columnfreecells\zerocount + \global\columnfirstcell\plusone + \global\columnlastcell \zerocount + \global\somefreecolumncellsfalse + %\message{no cells b}% + \else + \ifnum\columnlastcell>\columnmaxcells + \global\columnlastcell\columnmaxcells + \fi + \global\columnfreecells\columnlastcell + \global\advance\columnfreecells -\columnfirstcell + \global\advance\columnfreecells \plusone + \global\somefreecolumncellstrue + %\message{\number\columnfirstcell-\number\columnlastcell=\number\columnfreecells}% + \fi + \fi + \egroup} + +\def\OTRSETgetmaxfreecells#1#2% col start + {\let\columnmaxfreecells\!!zerocount + \let\columnfrmfreecells\!!zerocount + \pushmacro \columnmaxcells +\OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter +\edef\columnmaxcells{\the\scratchcounter}% + \scratchcounter\zerocount + \dostepwiserecurse{#2}\columnmaxcells\plusone + {\OTRSETdoifcellelse{#1}\recurselevel + {\ifnum\columnmaxfreecells<\scratchcounter + \edef\columnmaxfreecells{\the\scratchcounter}% + \let\columnfrmfreecells\recurselevel + \fi + \scratchcounter\zerocount} + {\advance\scratchcounter\plusone}}% + \popmacro\columnmaxcells} + +\long\def\OTRSETrecurseRL#1% + {\dostepwiserecurse\nofcolumns\plusone\minusone + {#1\hskip\OTRSETgetparameter\c!distance\recurselevel}} + +\def\OTRSETmakegridbox + {\ifcase\columndirection + \OTRSETdomakegridbox\plusone\nofcolumns\plusone + \else + \OTRSETdomakegridbox\nofcolumns\plusone\minusone + \fi} + +\def\OTRSETmakeupwidth{\makeupwidth} % temporary indirectness + +\def\OTRSETdomakegridbox#1#2#3% + {\hbox\bgroup + \dontcomplain + \forgetall % can go once in \flush + \!!heighta \textheight + % test first ! + \hbox to \OTRSETmakeupwidth + {\dostepwiserecurse{#1}{#2}{#3} + {\mofcolumns\recurselevel + \localcolumnwidth\OTRSETlocalwidth\mofcolumns + \setbox\scratchbox\hbox\localframed + [\??mc\OTRSETidentifier\number\mofcolumns]% + [\c!width=\localcolumnwidth,\c!height=\!!heighta,\c!lines=]% + {}% + \wd\scratchbox\localcolumnwidth + \ht\scratchbox\!!heighta + \ifcase\columndirection + \hskip\OTRSETgetparameter\c!distance\recurselevel + \box\scratchbox + \else + \box\scratchbox + \hskip\OTRSETgetparameter\c!distance\recurselevel + \fi}}% + \hskip-\OTRSETmakeupwidth + % main text + \hbox to \OTRSETmakeupwidth + {\dostepwiserecurse{#1}{#2}{#3} + {\mofcolumns\recurselevel + \localcolumnwidth\OTRSETlocalwidth\mofcolumns + \offinterlineskip + \setbox\scratchbox\vbox to \!!heighta + {\topskipcorrection % not needed + \ifcase\OTRSETbalancemethod + % no + \or + % yes + \doifelselayerdata{OTRTEXT}\vfill\relax % temp hack + \or + % top + \or + % bottom + \vfill + \fi + \dorecurse\columnmaxcells + {\setbox\scratchbox\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}% + \ht\scratchbox\strutht + \dp\scratchbox\strutdp + \ifcase\columndirection + \box\scratchbox + \else + \hbox to \localcolumnwidth + {\hskip\localcolumnwidth\llap{\box\scratchbox}}% + \fi + \par}% + \ifcase\OTRSETbalancemethod + % no + \else + % yes, top, bottom + \ifdim\globalbodyfontsize=\localbodyfontsize + \removedepth + \restoreglobalbodyfont + \vskip\strutdepth + \fi + \kern\zeropoint + \vss + \fi}% + \wd\scratchbox\localcolumnwidth % \textwidth + \ifcase\columndirection + \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox + \else + \box\scratchbox\hskip\OTRSETgetparameter\c!distance\recurselevel + \fi}}% + \egroup} + +\let\OTRSETbalht\zeropoint + +\def\OTRSETreducegridbox % for the moment no difference between methods + {\globallet\OTRSETbalht\zeropoint + \ifcase\OTRSETbalancemethod + % no balancing + \else + \bgroup + \!!counta\columnmaxcells + \donetrue + \doloop + {\dorecurse\nofcolumns{\OTRSETdoifcellelse\recurselevel\!!counta\donefalse\donothing}% + \ifdone + \ifnum\!!counta>\plusone\advance\!!counta\minusone\else\exitloop\fi + \else + \exitloop + \fi}% + \ifnum\!!counta>\plusone + \!!heighta\lineheight + \multiply\!!heighta \!!counta + \advance\!!heighta \topskip + \advance\!!heighta -\lineheight + \else + \!!heighta\zeropoint + \fi + \xdef\OTRSETbalht{\the\!!heighta}% + \egroup + \fi} + +\def\OTRSETflushfinalfootnotes + {\ifcase\lastcolumnlastcell \else + \setbox\scratchbox\hbox + {\placebottomnotes}% + \ifdim\ht\scratchbox>\zeropoint + \setbox\scratchbox\hbox + {\hbox to \zeropoint{\OTRSETgetgridcell\nofcolumns\lastcolumnlastcell}% + \box\scratchbox}% + \ht\scratchbox\strutht + \dp\scratchbox\strutdp + \OTRSETsetgridcell\nofcolumns\lastcolumnlastcell\box\scratchbox + \fi + \global\lastcolumnlastcell\zerocount + \fi} + +\def\OTRSETdoflush + {\ifcollectingcontent + \registerOTRSETmarks + \global\mofcolumns\plusone + \else + \OTRSETdofinalflush + \OTRSETdofinaloutput + \ifnum\columnsetpage>0 + \dorecurse\nofcolumns{\doresetcolumnsetlines\recurselevel}% + \fi + \doglobal\increment\columnsetpage + \OTRSETinitializecolumns + %\OTRSETdoflushfloats + \OTRSETstartnextpage +\presetOTRSETmarks + \initializecolumntextareas + \fi} + +\newbox\OTRfinalpagebox + +\def\OTRSETdofinalflush % see \OTRSETdoflush + {\OTRSETflushfinalfootnotes + \placecolumntextareas + \OTRSETcentergridcells + \bgroup % we want to keep the reduction local + \OTRSETreducegridbox + \global\setbox\OTRfinalpagebox\OTRSETmakegridbox + \egroup % otherwise we get the wrong number of free cells + %\gdef\localcolumnmaxcells{0}% here ? + \global\mofcolumns\nofcolumns} % otherwise problems in finaloutput + +% \def\OTRSETdofinaloutput +% {\ifdim\ht\OTRfinalpagebox=\teksthoogte +% % \bgroup \let\OTRSETsetvsize\relax % prevents useless search for gap +% \ifcase\OTRSETbalancemethod +% \finaloutput\box\OTRfinalpagebox +% \else\ifdim\OTRSETbalht>\zeropoint +% \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht +% {\box\OTRfinalpagebox}% +% \global\dp\OTRfinalpagebox\strutdepth +% \box\OTRfinalpagebox +% \else +% \finaloutput\box\OTRfinalpagebox +% \fi \fi +% \globallet\OTRSETbalht\zeropoint +% % \egroup +% \fi} + +\def\OTRSETdofinaloutput + {\ifdim\ht\OTRfinalpagebox=\textheight + \bgroup % \let\OTRSETsetvsize\relax % prevents useless search for gap + \ifcase\OTRSETbalancemethod + \finaloutput\box\OTRfinalpagebox + \else\ifdim\OTRSETbalht>\zeropoint + % catch a bordercase + \scratchdimen\OTRSETbalht + \advance\scratchdimen\lineheight\relax + \ifdim\scratchdimen>\textheight + % full page + \finaloutput\box\OTRfinalpagebox + \else + % same page + \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht + {\box\OTRfinalpagebox\vss}% + \setlayer[OTRTEXT]{\box\OTRfinalpagebox}% + \snaptogrid\vbox{\vskip\OTRSETbalht}% hack + \fi + \else + \finaloutput\box\OTRfinalpagebox + \fi \fi + \globallet\OTRSETbalht\zeropoint + \egroup + \fi} + +\definesystemvariable {mc} +\definesystemvariable {mt} +\definesystemconstant {colset} + +\definetwopasslist\s!colset + +\newdimen \OTRSETtextswidth +\newdimen \OTRSETtextsheight +\let \OTRSETidentifier=\empty + +\newtoks \OTRSEToutput + +\def\OTRSETgetparameter#1#2{\csname\??mc\OTRSETidentifier\number#2#1\endcsname} +\def\OTRSETsetparameter#1#2{\setvalue{\??mc\OTRSETidentifier\number#2#1}} + +\def\OTRSETskipstart + {\scratchcounter\executeifdefined{\??mc\OTRSETidentifier\c!start}\zerocount + \relax % needed ! + \ifcase\scratchcounter\else + \advance\scratchcounter\plusone + \doOTRSETsetgridcells + {\copy\placeholderboxe} + \plusone\plusone\nofcolumns\scratchcounter + \null + \fi} + +\def\OTRSETsetvsize % snap per sectie (gap here?) + {\ifcollectingcontent \else % can be assigndimen +\OTRSETskipstart % not that well tested + \OTRSETcheckinsert % added + \OTRSETsetfreecells\mofcolumns\columnfirstcell + \ifsomefreecolumncells + \global\vsize\columnfreecells\lineheight + \ifinotr % else problems with floats, see extreme + \global\pagegoal\vsize % niet nodig, tenzij binnen otr + \fi + \synchronizeoutput % fails on example + % \allowbreak % hm + \fi + \synchronizenotes + \fi} + +\def\OTRSETsethsize % of course this does not migrate outside the otr + {\localcolumnwidth\OTRSETlocalwidth\mofcolumns + \textwidth\localcolumnwidth + \hsize\localcolumnwidth} + +\def\OTRSETsynchronizehsize + {\ifcase0\getvalue{\??mc\??mc\c!width}\else % some width set + \bgroup + \scratchdimen\OTRSETlocalwidth\mofcolumns + \ifdim\scratchdimen=\textwidth + \egroup + \else + % only if change in width and \column/\break + \egroup \OTRSETsethsize + \fi + \fi} + +\def\OTRSETcheckfreelines + {\OTRSETsetvsize} + +\def\doOTRSETcolumnseparator + {\hbox to \zeropoint{\hss\red\vl\hss}} + +\let\OTRSETcolumnseparator\relax + +\def\showbreaks + {\let\OTRSETcolumnseparator\doOTRSETcolumnseparator} + +% \installcolumnbreakhandler {SET} \v!ja +% {% hmmm: +% \ifhmode +% \bgroup +% \removeunwantedspaces +% \parfillskip\zeropoint +% \OTRSETcolumnseparator +% \par +% \egroup +% \fi +% % brrr: +% \ejectinsert +% \ejectpage +% \OTRSETsynchronizehsize} % no \OTRSETsethsize, can be mid smaller (like tabulate) +% +% \installcolumnbreakhandler {SET} \v!forceer +% {\OTRSETgotocolumn[\v!forceer]} +% \installcolumnbreakhandler {SET} \v!eerste +% {\OTRSETgotocolumn[\v!eerste]} +% \installcolumnbreakhandler {SET} \v!laatste +% {\OTRSETgotocolumn[\v!laatste]} +% +% \installcolumnbreakhandler {SET} \v!pagina +% {\simplepagebreak % \flushnotes \executepagebreakhandler\v!ja +% \ifnum\mofcolumns>\plusone +% \OTRSETgotocolumn[\v!laatste,\v!forceer]% +% \fi} + +\def\OTRSETcolumnhbreak + {\ifhmode + \bgroup + \removeunwantedspaces + \parfillskip\zeropoint + \OTRSETcolumnseparator + \par + \egroup + \fi} + +\installcolumnbreakhandler {SET} \v!local + {\OTRSETcolumnhbreak + \ejectinsert + \ejectpage % brrr + % no \OTRSETsethsize, can be mid smaller (like tabulate) + % also, this one should be executed at the outer level + % (setting hsize inside otr does not work) + \OTRSETsynchronizehsize} + +% We need to make sure that we really leave the column; mid +% column we may end up in an empty gap, and we don't want to +% stay there (basically such a gap is a small empty page +% then). + +\installcolumnbreakhandler {SET} \v!yes + {\OTRSETcolumnhbreak + \edef\savedmofcolumns{\the\mofcolumns}% + \edef\savedrealpageno{\the\realpageno}% + \ejectinsert + \ejectpage % brrr + \doloop + {\ifnum\savedmofcolumns=\mofcolumns + \ifnum\savedrealpageno=\realpageno + \OTRSETdummycolumn + \else + \exitloop + \fi + \else + \exitloop + \fi}% + \OTRSETsynchronizehsize} + +\installcolumnbreakhandler {SET} \s!unknown + {\expanded{\OTRSETgotocolumn[\@@columnspecification]}} + +\installcolumnbreakhandler {SET} \v!page + {\vfill\eject % \doejectpage\eject + \OTRSETgotonextpage} + +\newtoks\OTRSETeverystartofcolumn + +\newbox\OTRSETsavedfootnotes + +% \installoutput\OTRSETflushtextsofar % spacing goes wrong + +%\def\OTRSETflushtextsofar +% {\ifvoid\normalpagebox \else +% \setbox\scratchbox\vbox{\unvbox\normalpagebox}% +% \OTRSETsavenotes +% \OTRSEThandleflushedtext0 +% \fi} + +% The complication is in the fact that when the HERE float +% is placed, the otr is not invoked when there is not yet +% enough content; this can lead to a change in order (turning +% on the tracer with option 0 is very instructive, watch the +% small numbers in the margin) +% +% 0 = no flushing, so no interference but user should handle +% border cases of placement +% 1 = the normal otr, rather untested +% 2 = a solution that works ok, is experimental and above +% all messy + +\chardef\OTRSETflushtextmode=0 + +\def\OTRSETflushtextsofar + {\ifcase\OTRSETflushtextmode + % don't mess around + \or + % the normal one + \ifvoid\normalpagebox\else + \OTRSETnaturalflush + \OTRSETcheckfreelines + \fi + \or + % way to complicated, but kind of ok + \doOTRSETflushtextsofar + \fi} + +\newskip\lastskipinotr + +\installoutput\doOTRSETflushtextsofar % experimental + {\ifvoid\normalpagebox\else + \scratchdimen\dp\normalpagebox + \setbox\scratchbox\vbox + {\forgetall + \unvbox\normalpagebox + \global\lastskipinotr\lastskip\relax + \ifdim\lastskipinotr>\zeropoint\relax + \removelastskip + \else + \kern-\scratchdimen % handle depth + \fi}% + \ifdim\lastskipinotr>\zeropoint + \scratchskip\ht\scratchbox + \setbox\scratchbox\hbox + {\lower\strutdepth\box\scratchbox}% + \dp\scratchbox\scratchdimen + \ht\scratchbox\scratchskip + \fi + \OTRSETsavenotes + \OTRSEThandleflushedtext\zerocount + \ifdim\lastskipinotr>\zeropoint + %\vskip \lastskipinotr % hm, gets lost anyway + \else + % we should not discard skips after here; tricky + \fi + \OTRSETsetvsize + \fi} + +\def\OTRSETplacebottomnotes + {\iflastcolumnfootnotes + \ifnum\nofcolumns=\mofcolumns + \ifintermediatefootnotes \placebottomnotes \fi + \fi + \else + \placebottomnotes + \fi} + +\def\OTRSETflushsavednotes + {\iflastcolumnfootnotes + \ifnum\nofcolumns=\mofcolumns + \flushsavednotes + \fi + \else + \flushsavednotes + \fi} + +\def\OTRSETsavenotes + {\iflastcolumnfootnotes + \ifnum\nofcolumns=\mofcolumns \else + \savenotes + \fi + \fi} + +\appendtoks \OTRSETflushsavednotes \to \OTRSETeverystartofcolumn + +\def\OTRSETnaturalflush + {\bgroup + \forgetall % new, needed ! + \setbox0\vbox to \columnfreecells\lineheight + {\vskip-\topskip + \vskip\lineheight + \prevdepth\strutdp + \unvbox\normalpagebox + \vfill}% + \setbox2\hbox + {\OTRSETplacebottomnotes}% + \setbox\scratchbox\hbox + {\wd0\zeropoint\box0\box2}% + \dp\scratchbox\strutdp + \OTRSEThandleflushedtext\plusone + \egroup} + +\newcount\lastcolumnlastcell + +\def\OTRSEThandleflushedtext#1% + {\getnoflines{\ht\scratchbox}% + %\wd\scratchbox\textwidth % geen \hsize kan < zijn in bv split tabulate + \wd\scratchbox\OTRSETlocalwidth\mofcolumns + \doOTRSETsetgridcells + {\copy\placeholderboxf} + \mofcolumns\columnfirstcell\plusone\noflines + {\registeredtextarea1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell + \global\columnlastcell\columnfirstcell + \global\advance\columnlastcell \noflines + \global\lastcolumnlastcell\columnlastcell + \global\advance\lastcolumnlastcell \minusone + % find next (acceptable) gap, todo: deadcycle + \ifcase#1\else + \OTRSETfillgapsbetweencells\mofcolumns\columnlastcell + \fi + \OTRSETfindnextgap + % \message{\the\mofcolumns,\the\columnfirstcell,\the\columnfreecells}% + % \wait + % we cannot adapt the hsize since it may have changed (like + % inside a tabulate) so we only change it when there is a + % reason to do so + \OTRSETsynchronizehsize + \OTRSETsetvsize} + +\def\OTRSETfindnextgap + {\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 + \global\columnlastcell\plusone + \global\columnfirstcell\zerocount + \OTRSETdoflushfloats + \else + \the\OTRSETeverystartofcolumn + \global\columnlastcell\plusone + \global\columnfirstcell\zerocount + \fi + \fi} + +\let\OTRSETcheckfreelines\donothing + +\def\OTRSETfillgapsbetweencells#1#2% col + {\ifnum\columngaplimit>\zerocount + \donefalse + \dostepwiserecurse{#2}\columnmaxcells\plusone + {\OTRSETdoifcellelse{#1}\recurselevel + {\ifdone + \!!countb\recurselevel \advance\!!countb -\!!counta\relax + \ifnum\!!countb>\plusone + \advance\!!countb \minusone + \ifnum\!!countb<\columngaplimit\relax + \!!countb\recurselevel \advance\!!countb \minusone + \dostepwiserecurse\!!counta\!!countb\plusone + {\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}% + %\message{[gap]}% + \fi + \fi + \fi + \donefalse} + {\ifdone \else + \donetrue + \!!counta\recurselevel + \fi}}% + \fi} + +\appendtoks + \OTRSETfillgapsbetweencells\mofcolumns\plusone +\to \OTRSETeverystartofcolumn + +%\def\OTRSETfreezeminimumgap#1% +% {\OTRSETgetmaxfreecells{#1}{1}% +% \ifnum\columnmaxfreecells>0 +% \!!countb=\columnfrmfreecells +% \!!counta=\!!counta \advance\!!counta -\columnmaxfreecells +% \dorecurse{\columnmaxcells} +% {\ifnum\recurselevel<\!!counta\relax +% \donetrue +% \else\ifnum\recurselevel>\!!countb +% \donetrue +% \else +% \donefalse +% \fi\fi +% \ifdone +% \OTRSETdoifcellelse{#1}{\recurselevel} +% {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}% +% \fi}% +% \fi} +% +%\def\OTRSETfillgaps#1#2#3% col from to +% {\dostepwiserecurse{#2}{#3}{1} +% {\OTRSETdoifcellelse{#1}{\recurselevel} +% {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}}} +% +%\def\OTRSETfillbotgaps#1#2% col first +% {\OTRSETfillgaps{#1}{#2}{\columnmaxcells}} +% +%\def\OTRSETfilltopgaps#1#2% col last +% {\OTRSETfillgaps{#1}{1}{#2}} + +\newif\ifspancolumnslots \spancolumnslotstrue +\newif\ifcheckcolumnspan \checkcolumnspantrue + +\def\OTRSETcheckwidthgap#1#2% box size + {\ifcheckcolumnspan + \bgroup + \scratchdimen#2% + \advance\scratchdimen-\wd#1\relax + \ifdim-10\scaledpoint>\scratchdimen + \egroup + \else\ifdim10\scaledpoint<\scratchdimen + \egroup + \else + \egroup + \wd#1=#2% + \fi\fi + \fi} + +\def\OTRSETcheckcolumnslot#1% + {\enoughcolumncellstrue + \ifspancolumnslots\else + \OTRSETcheckwidthgap#1\hsize + \ifdim\wd#1>\hsize + \enoughcolumncellsfalse + \fi + \fi + \ifenoughcolumncells + \getnoflines\pagetotal + \scratchcounter\noflines + \getnoflines{\ht#1}% + \columnvcells\noflines + \columnhcells\plusone + \advance\scratchcounter \columnvcells \relax + \ifnum\scratchcounter>\columnfreecells + \enoughcolumncellsfalse + \fi + \fi} + +\def\OTRSETstoreincolumnslotPAGE#1% + {\ifenoughcolumncells + % to do + \OTRSETsavebox{#1}% + \else + \OTRSETsavebox{#1}% + \fi} + +\def\OTRSETstoreincolumnslotTOPS#1% + {\OTRSETprepareforcolumnslot1{#1}% + \OTRSETcheckcolumnslot{#1}% + \ifenoughcolumncells + \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}% + \fi + \ifenoughcolumncells + \OTRSETsetgridcells\mofcolumns\columnfirstcell\columnhcells\columnvcells + {\hbox{\copy#1}}% + \OTRSETsetvsize + \else + \OTRSETsavebox{#1}% + \fi} + +\def\OTRSETstoreincolumnslotBOTS#1% + {\OTRSETprepareforcolumnslot3{#1}% + \edef\savedcolumnlastcell{\the\columnlastcell}% + \OTRSETcheckcolumnslot{#1}% + \ifenoughcolumncells + \advance\columnlastcell -\columnvcells \advance\columnlastcell \plusone +% \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}% + \OTRSETcheckcolumnspace\mofcolumns\columnlastcell{#1}% + \fi + \ifenoughcolumncells + \OTRSETsetgridcells\mofcolumns\columnlastcell\columnhcells\columnvcells{\copy#1}% + \OTRSETfillgapsbetweencells\mofcolumns\savedcolumnlastcell % -) + \OTRSETsetvsize + \else + \columnlastcell\savedcolumnlastcell + \OTRSETsavebox{#1}% + \fi} + +\newdimen\totalcolumnspace + +\def\columnspacetopoffset{0} +\def\columnspacebotoffset{0} + +\def\OTRSETcheckcolumnspace#1#2#3% col row box + {\columnhcells\plusone + \totalcolumnspace\zeropoint + \scratchcounter#1% + \enoughcolumncellstrue + \doloop + {\advance\totalcolumnspace \OTRSETlocalwidth\scratchcounter\relax % needed +\OTRSETcheckwidthgap#3\totalcolumnspace + \ifnum\wd#3>\totalcolumnspace\relax + \ifnum\scratchcounter=\nofcolumns + \enoughcolumncellsfalse + \exitloop + \else + \advance\columnhcells \plusone + \advance\scratchcounter \plusone + \advance\totalcolumnspace \OTRSETgetparameter\c!distance\scratchcounter + \fi + \else + \exitloop + \fi}% + \ifenoughcolumncells + \getnoflines{\ht#3}% + \columnvcells\noflines + \OTRSETcheckcolumncells{#1}{#2}\columnhcells\columnvcells + \fi} + +\def\OTRSETcheckcolumncells#1#2#3#4% col row wid hei + {\!!countd#1\advance\!!countd#3\advance\!!countd\minusone + \!!counte#2\advance\!!counte#4\advance\!!counte\minusone + \ifnum\!!counte>\columnmaxcells\relax + \enoughcolumncellsfalse + \else + \enoughcolumncellstrue +%\let\columnspacetopoffset\zerocount +%\scratchcounter#2\advance\scratchcounter\minusone +%\ifnum\scratchcounter>0 +% \dostepwiserecurse{#1}\!!countd\plusone +% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint +% \let\columnspacetopoffset\plusone +% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint +% \let\columnspacetopoffset\plusone +% \fi\fi}% +% \advance\!!counte \columnspacetopoffset \relax +% \advance\columnvcells \columnspacetopoffset \relax +%\fi +%\let\columnspacebotoffset\zerocount +%\scratchcounter\!!counte +%\advance\scratchcounter \columnvcells \relax +%\ifnum\scratchcounter>\columnmaxcells\else +% \dostepwiserecurse{#1}\!!countd\plusone +% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint +% \let\columnspacebotoffset\plusone +% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint +% \let\columnspacebotoffset\plusone +% \fi\fi}% +% \advance\!!counte \columnspacebotoffset \relax +% \advance\columnvcells \columnspacebotoffset \relax +%\fi + \dostepwiserecurse{#1}\!!countd\plusone % cols + {\ifenoughcolumncells + \!!countf\recurselevel\relax + \dostepwiserecurse{#2}\!!counte\plusone % rows + {\ifenoughcolumncells + \OTRSETdoifcellelse\!!countf\recurselevel + {\enoughcolumncellsfalse}{}% + \fi}% + \fi}% + \fi} + +\def\OTRSETsetpreferedcolumnslot#1#2% + {\doifsomething{#1}{\edef\preferedcolumn{#1}}% + \doifsomething{#2}{\edef\preferedrow {#2}}} + +\OTRSETsetpreferedcolumnslot{\nofcolumns}{1} % default ? + +\let\pofcolumns\mofcolumns +\let\qofcolumns\mofcolumns + +\newif\ifquitincurrentcolumn + +\def\OTRSETstoreincolumnslotLRTB#1% + {\OTRSETprepareforcolumnslot1{#1}% + \OTRSETflushtextsofar + \OTRSETstoreincolumnslotindeed + \mofcolumns\nofcolumns+\currenthcell + \plusone\columnmaxcells+\currentvcell{#1}} + +\def\OTRSETstoreincolumnslotLRBT#1% + {\OTRSETprepareforcolumnslot3{#1}% + \OTRSETflushtextsofar + \OTRSETstoreincolumnslotindeed + \mofcolumns\nofcolumns+\currenthcell + \columnmaxcells\plusone-\currentvcell{#1}} + +\def\OTRSETstoreincolumnslotRLTB#1% + {\OTRSETprepareforcolumnslot1{#1}% + \OTRSETflushtextsofar + \OTRSETcheckprefered + \OTRSETstoreincolumnslotindeed + \nofcolumns\qofcolumns-\currenthcell + \plusone\columnmaxcells+\currentvcell{#1}} + +\def\OTRSETstoreincolumnslotRLBT#1% + {\OTRSETprepareforcolumnslot3{#1}% + \OTRSETflushtextsofar + \OTRSETcheckprefered + \OTRSETstoreincolumnslotindeed + \nofcolumns\qofcolumns-\currenthcell + \columnmaxcells\plusone-\currentvcell{#1}} + +\def\OTRSETstoreincolumnslotTBLR#1% + {\OTRSETprepareforcolumnslot1{#1}% + \OTRSETflushtextsofar + \OTRSETstoreincolumnslotindeed + \plusone\columnmaxcells+\currentvcell + \mofcolumns\nofcolumns+\currenthcell{#1}} + +\def\OTRSETstoreincolumnslotTBRL#1% + {\OTRSETprepareforcolumnslot1{#1}% + \OTRSETflushtextsofar + \OTRSETcheckprefered + \OTRSETstoreincolumnslotindeed + \plusone\columnmaxcells+\currentvcell + \nofcolumns\qofcolumns-\currenthcell{#1}} + +\def\OTRSETstoreincolumnslotBTLR#1% + {\OTRSETprepareforcolumnslot3{#1}% + \OTRSETflushtextsofar + \OTRSETstoreincolumnslotindeed + \columnmaxcells\plusone-\currentvcell + \mofcolumns\nofcolumns+\currenthcell{#1}} + +\def\OTRSETstoreincolumnslotBTRL#1% + {\OTRSETprepareforcolumnslot3{#1}% + \OTRSETflushtextsofar + \OTRSETcheckprefered + \OTRSETstoreincolumnslotindeed + \columnmaxcells\plusone-\currentvcell + \nofcolumns\qofcolumns-\currenthcell{#1}} + +\def\OTRSETstoreincolumnslotFXTB#1% fixed column + {\OTRSETcheckprefered + \OTRSETdoifcellelse\pofcolumns\plusone + {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot1}{#1}% % 1/2 dependent of place, todo + \OTRSETflushtextsofar + \OTRSETstoreincolumnslotindeed + \pofcolumns \pofcolumns +\currenthcell + \preferedrow\columnmaxcells+\currentvcell{#1}} + +\def\OTRSETstoreincolumnslotFXBT#1% fixed column + {\OTRSETcheckprefered + \OTRSETdoifcellelse\pofcolumns\columnmaxcells + {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot3}{#1}% % 3/2 dependent of place, todo + \OTRSETflushtextsofar + \OTRSETstoreincolumnslotindeed + \pofcolumns \pofcolumns +\currenthcell + \columnmaxcells\preferedrow-\currentvcell{#1}} + +% \def\OTRSETstoreincolumnslotHERE#1% fixed column +% {\OTRSETprepareforcolumnslot2{#1}% +% \OTRSETflushtextsofar +% \getnoflines\pagetotal \advance\noflines\columnfirstcell +% \OTRSETstoreincolumnslotindeed +% \mofcolumns\mofcolumns+\currenthcell +% \noflines\columnmaxcells+\currentvcell{#1}% +% \OTRSETsetvsize} + +\chardef\OTRSETforcefixedfloats=0 + +\def\OTRSETstoreincolumnslotHERE#1% fixed column + {\ifcase\OTRSETforcefixedfloats + \OTRSETstoreincolumnslotSOMEWHERE2{#1}% + \else + \OTRSETstoreincolumnslotFIXD{#1}% + \fi} + +% this one looses too wide graphics +% +% \def\OTRSETstoreincolumnslotFIXD#1% fixed column +% {\OTRSETprepareforcolumnslot2{#1}% +% % no flush text sofar here, beware: no width test +% \snaptogrid\vbox{\box#1}} +% +% still imperfect + +\def\OTRSETstoreincolumnslotFIXD#1% fixed column + {\OTRSETflushtextsofar + \ifdim\wd#1>\textwidth + \OTRSETstoreincolumnslotSOMEWHERE2{#1}% + \else + % crappy test / needed for o-pbu-f / will be replaced + \getnoflines{\ht#1}% + \scratchdimen\noflines\lineheight + \advance\scratchdimen\lineheight + \advance\scratchdimen\pagetotal\relax + \ifdim\scratchdimen<\pagegoal + %OTRSETprepareforcolumnslot3{#1}% + %ruledvskip\columnslotspacing\lineheight + \blank[\columnslotspacing*\v!line]% + \snaptogrid\hbox to \hsize{\hss\box#1\hss}% strange, why the centering + \blank[\columnslotspacing*\v!line]% + \else + \OTRSETstoreincolumnslotSOMEWHERE2{#1}% + \fi + \fi} + +\def\OTRSETstoreincolumnslotSOMEWHERE#1#2% + {\OTRSETprepareforcolumnslot{#1}{#2}% + \OTRSETflushtextsofar + \getnoflines\pagetotal \advance\noflines\columnfirstcell + \OTRSETstoreincolumnslotindeed + \mofcolumns\mofcolumns+\currenthcell + \noflines\columnmaxcells+\currentvcell{#2}% + \OTRSETsetvsize} + +\def\OTRSETcheckprefered + {\ifnum\preferedcolumn<\mofcolumns + \let\pofcolumns\mofcolumns + \else + \let\pofcolumns\preferedcolumn + \fi + \ifquitincurrentcolumn + \ifnum\mofcolumns=\nofcolumns + \def\qofcolumns{\mofcolumns}% + \else + \scratchcounter\mofcolumns + \advance\scratchcounter \plusone + \edef\qofcolumns{\the\scratchcounter}% + \fi + \else + \let\qofcolumns\mofcolumns + \fi} + +\def\OTRSETstoreincolumnslotindeed#1#2#3#4#5#6#7#8#9% + {\OTRSETcheckprefered + \enoughcolumncellsfalse + \donefalse + \dostepwiserecurse{#1}{#2}{#31} + {\ifdone + \exitloop + \else + #4=\recurselevel + \dostepwiserecurse{#5}{#6}{#71} + {\ifdone + \exitloop + \else + #8=\recurselevel + \OTRSETcheckcolumnspace\currenthcell\currentvcell{#9}% + \ifenoughcolumncells \donetrue \fi + \fi}% + \fi}% + \ifdone + \enoughcolumncellstrue + \else + \enoughcolumncellsfalse + \fi + \ifenoughcolumncells +% \ifnum\columnspacetopoffset>0\message{[+++]}\fi +% \ifnum\columnspacebotoffset>0\message{[---]}\fi +% \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells +% {\vbox +% {\ifcase\columnspacetopoffset\else\ruledvskip\columnspacetopoffset\lineheight\fi +% \copy#9 +% \ifcase\columnspacebotoffset\else\ruledvskip\columnspacebotoffset\lineheight\fi}}% + \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells + {\copy#9}% + \ifnum\currenthcell=\mofcolumns\relax + \ifdim\ht\OTRSETsavedfootnotes>\zeropoint + \OTRSETsetfreecells\mofcolumns\columnfirstcell + \ifsomefreecolumncells + \getnoflines{\ht\OTRSETsavedfootnotes}\relax + \ifnum\columnfreecells<\noflines + \global\somefreecolumncellsfalse + \else + %\message{[flt]}% float + \fi + \fi + \ifsomefreecolumncells + % ok, enough room for notes + %\message{[flt]}% float + \else % ? + \OTRSETsavebox{#9}% + \OTRSETerasegridcells\currenthcell\currentvcell\columnhcells\columnvcells + %\message{[clr]}% save box + \fi + \else + %\message{[flt]}% float + \fi + \else + %\message{[flt]}% float + \fi + \OTRSETsetvsize + %\message{[fnt]}% float + \else + %\message{[rej]}% save box + \OTRSETsavebox{#9}% + \fi} + +\chardef\columnslotspacing \plusone + +\def\OTRSETstoreincolumnslot#1% #2 % {method} {box} % alleen last + {% no messing around here + % \dp#2=\zeropoint + % \ifcase\columnslotspacing\else + % \setbox#2=\vbox spread \columnslotspacing\lineheight + % {\vss\box#2\vss}% + % \fi + % and don't change this any more +% \doifdefinedelse{\strippedcsname\OTRSETstoreincolumnslot#1} +% {\getvalue{\strippedcsname\OTRSETstoreincolumnslot#1}{#2}} +% {\OTRSETstoreincolumnslotUNKNOWN{#2}}} + \executeifdefined{\strippedcsname\OTRSETstoreincolumnslot#1} + \OTRSETstoreincolumnslotUNKNOWN} % {#2}} + +\def\OTRSETstoreincolumnslotUNKNOWN#1% + {\OTRSETprepareforcolumnslot2{#1}\copy#1} % {} ? + +% \def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag +% {\dp#2\zeropoint +% \ifcase\columnslotspacing\else +% \scratchdimen\columnslotspacing\lineheight +% \ifnum#1=2 \scratchdimen2\scratchdimen \fi +% \setbox#2\vbox spread \scratchdimen +% {\ifnum#1>1\vss\fi\box#2\relax\ifnum#1<3\vss\fi}% +% \fi} + +\def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag + {\dp#2\zeropoint + \ifcase\columnslotspacing\else + \scratchdimen\columnslotspacing\lineheight + \ifnum#1=2 \scratchdimen2\scratchdimen \fi + \begingroup + \advance\scratchdimen\ht#2\relax + \ifdim\scratchdimen<\columnmaxcells\lineheight + \endgroup \setbox#2\vbox spread \scratchdimen \bgroup + \else + \endgroup \setbox#2\vbox to \columnmaxcells\lineheight \bgroup + \vskip\strutdepth + \fi + \ifnum#1>1\vss\fi + \box#2\relax + \ifnum#1<3\vss\fi + \egroup + \fi} + +\def\OTRSETdocheckiffloatfits % eigenlijk moet else float anders + {\global\ifnofloatpermitted\roomforfloatfalse\else\roomforfloattrue\fi} + +\def\OTRSETunpreparebox#1% + {\ifhbox#1% spans and so + \global\setbox\floatbox\vbox{\box#1}% + \else + \setbox\scratchbox\vbox + {\unvbox#1\unskip\unskip\unskip + \global\setbox\floatbox\lastbox}% + \fi} + +\def\OTRSETsavebox#1% clean up the skips + {\OTRSETunpreparebox{#1}% + \dosavefloat} + +\def\OTRSETresavebox#1% clean up the skips + {\OTRSETunpreparebox{#1}% + \doresavefloat} + +\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge + {\iftestfloatbox\ruledhbox\fi{\box\floatbox}} + +\def\OTRSETdoflushfloats + {\bgroup + \def\OTRSETsavebox##1{\!!doneafalse}% + \doloop + {\ifsomefloatwaiting +\OTRSETskipstart + \dogetfloat + \ifdim\wd\floatbox>\zeropoint + \!!doneatrue + \dp\floatbox\zeropoint + \OTRSETstoreincolumnslot{TBLR}\floatbox + \if!!donea + %\message{[flu]}% + \else + \OTRSETresavebox\floatbox + \exitloop + \fi + \else + %\message{[err]}% happens but why? + \fi + \else + \exitloop + \fi} + \egroup} + +\newif\ifcentergridcells \centergridcellstrue + +\newif\ifcentergridcellonly \centergridcellonlyfalse +\newif\ifautocentergridcellonly \autocentergridcellonlytrue + +\def\OTRSETcentergridcells + {\ifcentergridcells + \dorecurse\nofcolumns + {\currenthcell\recurselevel + \ifautocentergridcellonly + % we prevent centering when the next column is empty + % to be checked ! ! ! ! + \advance\currenthcell \plusone + \centergridcellonlytrue + \ifnum\currenthcell>\nofcolumns + % ok already + \else + % only span if there is a next column with content + \dorecurse\columnmaxcells + {\ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint + \centergridcellonlyfalse + \else\ifdim\dp\OTRSETgridcell\currenthcell\currentvcell>\zeropoint + \centergridcellonlyfalse + \fi\fi}% + \fi + \fi + \currenthcell\recurselevel + \dorecurse\columnmaxcells + {\currentvcell\recurselevel\relax + \ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint + \ifdim\dp\OTRSETgridcell\currenthcell\currentvcell=\zeropoint + \bgroup + \setbox\scratchbox\OTRSETgetgridcell\currenthcell\currentvcell + \getnoflines{\ht\scratchbox}% + \!!counta\currentvcell + \advance\!!counta -\noflines + \advance\!!counta \plusone + % first col always ok + \!!countb\currenthcell + \!!countc\currenthcell + \advance\!!countc \plusone + \!!donebtrue + \ifcentergridcellonly + \!!countc\maxdimen + \fi + \dostepwiserecurse\!!countc\nofcolumns\plusone + {\if!!doneb + \let\xrecurselevel\recurselevel + \dostepwiserecurse\!!counta\currentvcell\plusone + {\ifdim\ht\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint + \!!donebfalse + \else\ifdim\wd\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint + \!!donebfalse + \fi\fi}% + \if!!doneb + \!!countb\xrecurselevel + \fi + \fi}% + \totalcolumnspace\OTRSETlocalwidth\currenthcell + \dostepwiserecurse\!!countc\!!countb\plusone + {\advance\totalcolumnspace \OTRSETlocalwidth\recurselevel + \advance\totalcolumnspace \OTRSETgetparameter\c!distance\recurselevel}% + \ifdim\totalcolumnspace>\wd\scratchbox + \setbox\scratchbox\hbox to \totalcolumnspace{\hss\box\scratchbox\hss}% + \fi + \OTRSETsetgridcell\currenthcell\currentvcell\box\scratchbox + \egroup + \fi + \fi}}% + \fi} + +\def\OTRSETinitializecolumns% once per page + {\columnspreadtrue % todo + \ifcolumnspread + \global\rofcolumns\getvalue{\??mc\OTRSETidentifier\c!nright}% + \global\lofcolumns\getvalue{\??mc\OTRSETidentifier\c!nleft}% + \global\tofcolumns\rofcolumns \relax + \ifodd\realpageno\relax + \global\nofcolumns\rofcolumns + \else + \global\advance\tofcolumns\lofcolumns + \global\nofcolumns\lofcolumns + \fi + \else + \global\nofcolumns\getvalue{\??mc\OTRSETidentifier\c!n}% + \global\rofcolumns\nofcolumns + \global\lofcolumns\nofcolumns + \global\tofcolumns\nofcolumns + \fi + \OTRSETassignwidths + \global\mofcolumns\plusone + \columnerasegridboxes} + +% vanaf hier: + +\def\definecolumnset + {\dodoubleargument\dodefinecolumnset} + +\def\dodefinecolumnset[#1][#2]% + {\getparameters[\??mc#1] + [\c!direction=\v!right, + \c!balance=\v!no, + \c!distance=1.5\bodyfontsize, % controleren + \c!n=2, + \c!nleft=\getvalue{\??mc#1\c!n}, + \c!nright=\getvalue{\??mc#1\c!n}, + \c!width=\v!fit, + \c!lines=0, + \c!start=0, + #2]% + \dorecurse{\getvalue{\??mc#1\c!nleft}} % todo + {\dododefinecolumnset[#1][\recurselevel]}% + \dorecurse{\getvalue{\??mc#1\c!nright}} % todo + {\dododefinecolumnset[#1][\recurselevel]}% + % redo framed settings + \setupcolumnset[#1][1][\c!distance=\!!zeropoint]} + +\def\dododefinecolumnset[#1][#2]% + {\presetlocalframed + [\??mc#1#2]% + \setupcolumnset + [#1][#2] + [\c!offset=\v!overlay, + \c!frame=\v!off, + \c!align=, + \c!lines=0,% really needed since c!regels is now part of framed + \c!width=\getvalue{\??mc#1\c!width}, + \c!distance=\getvalue{\??mc#1\c!distance}]} + +\def\setupcolumnset + {\dotripleargument\dosetupcolumnset} + +\def\dosetupcolumnset[#1][#2][#3]% + {\ifthirdargument + \def\docommand##1% + {\doifelse{##1}\v!each + {\dorecurse{\getvalue{\??mc#1\c!n}}{\docommand\recurselevel}} + {\getparameters[\??mc#1##1][#3]}}% + \processcommalist[#2]\docommand + \else + \getparameters[\??mc#1][#2]% + \fi} + +\definecolumnset[\s!default][\c!n=2] % fallback + +\def\OTRSETgotonextpage + {\vfill\eject + \relax\ifnum\mofcolumns>\plusone + \OTRSETgotocolumn[\v!last]% + \ifnum\mofcolumns>\plusone + \OTRSETgotocolumn[\v!force]% + \fi + \fi} + +\let\OTRSETgotonextpageX\OTRSETgotonextpage % will become obsolete + +\def\OTRSETgotocolumn + {\dosingleempty\doOTRSETgotocolumn} + +\def\doOTRSETgotoCOLROW#1% <number>|<number>*<number> + {\bgroup % really needed + \splitstring#1\at*\to\column\and\row + \bgroup + \ifx\column\empty\else\expanded{\doOTRSETgotoCOLUMN{\column}}\fi + \egroup + \bgroup + \ifx\row \empty\else\expanded{\doOTRSETgotoROW {\row }}\fi + \egroup + \egroup} + +\def\doOTRSETgotoCOLUMN#1% + {\ifnum\mofcolumns=#1\else + \vfill\eject % \doejectpage\eject + \doloop + {\ifnum\mofcolumns=#1\relax + \exitloop \else \OTRSETdummycolumn + \fi}% + \fi} + +\def\doOTRSETgotoROW#1% + {\ifnum#1>1 + \scratchcounter\zerocount + \currenthcell\mofcolumns + \currentvcell#1\advance\currentvcell \minusone + \dorecurse\currentvcell + {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing + {\advance\scratchcounter\plusone}} + \getnoflines\pagetotal + \advance\scratchcounter-\noflines + \ifnum\scratchcounter>\zerocount + \dorecurse\scratchcounter{\line{\strut}}% + \fi + \fi + \OTRSETsetvsize} + +\def\doOTRSETgotocolumn[#1]% yes|force|first|last|<number>|<number>*<number> + {\processallactionsinset + [#1] + [ \v!yes=>\OTRSETdummycolumn, + \v!no=>,% not supported + \v!force=>\OTRSETdummycolumn, + \v!first=>\expanded{\doOTRSETgotoCOLUMN{1}}, + \v!last=>\expanded{\doOTRSETgotoCOLUMN{\the\nofcolumns}}, + \s!default=>\OTRSETdummycolumn, + \s!unknown=>\expanded{\doOTRSETgotoCOLROW{\commalistelement}}]} + +% to be documented and tested, not yet that robust + +% \def\OTRSETgotocell#1#2% +% {\endgraf +% \gdef\gotocellcounter{0}% +% \doloop +% {\ifnum\mofcolumns<#1\relax +% \doglobal\increment\gotocellcounter\relax +% \ifnum\gotocellcounter>#1\relax +% \line{\strut}\crlf +% \line{\strut}\crlf +% \column +% \writestatus{columnset}{quitting goto cell}% +% \exitloop +% \else +% \column +% \fi +% \else +% \exitloop +% \fi}% +% \ifnum\mofcolumns=#1\relax +% \ifnum#2>1 +% \scratchcounter\zerocount +% \currenthcell\mofcolumns +% \currentvcell#2\advance\currentvcell \minusone +% \dorecurse\currentvcell +% {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing +% {\advance\scratchcounter\plusone}} +% \getnoflines\pagetotal +% \advance\scratchcounter-\noflines +% \ifnum\scratchcounter>\zerocount +% \dorecurse\scratchcounter{\line{\strut}}% +% \fi +% \fi +% \fi +% \OTRSETsetvsize} + +\def\OTRSETgotocell#1#2% obsolete: now \column[#1*#2] + {\endgraf + \doOTRSETgotoCOLUMN{#1}% + \doOTRSETgotoROW {#2}} + +\def\OTRSETdummycolumn + {\verticalstrut + \vskip-\struttotal + \vfill + \eject} + +\newcounter\columnsetlevel +\let\currentcolumnset\empty +\chardef\OTRSETfinish\zerocount + +\def\startcolumnset + {\dodoubleempty\dostartcolumnset} + +\def\dostartcolumnset[#1][#2]% + {\increment\columnsetlevel\relax + \globallet\localcolumnmaxcells\!!zerocount + \global\chardef\OTRSETfinish\zerocount + \resetOTRSETmarks + \ifnum\columnsetlevel=\plusone + \bgroup + \saveinterlinespace + \globallet\columnsetpage\!!plusone + \def\currentcolumnset{#2}% + \insidecolumnstrue % will be different flag in addition + \activateotr{SET}{ONE}% andere naam, activate or so + \doifelsenothing{#1} + {\globallet\OTRSETlist\s!default} + {\xdef\OTRSETlist{#1}}% + \OTRSETstartnextpage + \OTRSETassignwidths + \OTRSETsethsize + \else + \bgroup + \fi} + +% \setuplayout[grid=yes] \definecolumnset[example] \showgrid + +% \starttext +% \startcolumnset[example] +% \input knuth \endgraf \input knuth +% \placetable{table}{\framed[width=\makeupwidth,height=4cm]{Hello}} +% \input knuth \endgraf \input knuth +% \stopcolumnset +% \input knuth \endgraf \input knuth +% \stoptext + + +\def\OTRSETflushleftovers % new per 13/4/2006 + {\OTRSETdoifcellelse{1}{1} + {\bgroup + \OTRSETcentergridcells + \chardef\OTRSETbalancemethod\plusone + \OTRSETreducegridbox + \global\setbox\OTRfinalpagebox\OTRSETmakegridbox + \global\ht\OTRfinalpagebox\textheight % signals output that there is content + \OTRSETdofinaloutput + \globallet\OTRSETbalht\zeropoint + \egroup} + {}} + +\def\stopcolumnset + {\relax + \ifnum\columnsetlevel=\plusone + \endgraf % needed, else wrong vsize in one par case + \global\chardef\OTRSETfinish\plusone + % no, extra page \pagebreak % (test on pascal toc) + \dostopcolumnset + \egroup + \global\notelimittrue % brrr, untested and fuzzy + \setvsize + \sethsize + \ifvoid\OTRfinalpagebox\else + % probably balanced + \ifdim\ht\OTRfinalpagebox<\textheight + \snaptogrid[\v!page]\hbox{\box\OTRfinalpagebox}% + \else + \box\OTRfinalpagebox + \fi + \fi + \global\chardef\OTRSETfinish\zerocount + \ifsomefloatwaiting \setvsize \pagebreak \setvsize \fi + \OTRSETflushleftovers + \else + \egroup + \fi + \decrement\columnsetlevel\relax} + +\chardef\OTRSETbalancemethod\zerocount + +\def\dostopcolumnset + {%\OTRSETdofinalflushfloats % yes/no + \ifcase\OTRSETbalancemethod + \OTRSETnobalance + \else + \OTRSETdobalance + \fi} + +\def\OTRSETdobalance + {\OTRSETnobalance} + +\def\localcolumnmaxcells{0} + +% currently line represents real line, i.e. on the grid, and +% not something noflines (also, watch out for switching from +% 2-3 columns on one page with both sets balanced: the +% second set does not see the first set + +% \def\OTRSETinitbalancing +% {\ifcase\OTRSETbalancemethod\or +% \let\savedcolumnmaxcells\columnmaxcells +% \ifnum\realpageno=\balancingpageno\relax +% \ifnum\mofcolumns=\plusone +% \dorecurse\nofcolumns +% {\!!counta\recurselevel\relax +% \!!countb\getvalue{\??mc\OTRSETidentifier\number\!!counta\c!regels}\relax +% \ifcase\!!countb +% \!!countb\getvalue{\??mc\OTRSETidentifier\c!regels}\relax +% \fi +% \ifcase\!!countb +% \!!countb \savedcolumnmaxcells\relax +% \fi +% % can be an option: absolute versus relative +% \ifnum\OTRSETbalancemethod=\plusthree +% \advance\!!countb\precolumnlines +% \ifnum\!!countb>\localcolumnmaxcells\relax +% \xdef\localcolumnmaxcells{\the\!!countb}% +% \fi +% \advance\!!countb \plusone +% \dostepwiserecurse\!!countb\columnmaxcells\plusone +% {\ifvoid\OTRSETgridcell\!!counta\recurselevel +% \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe +% \fi}% +% \else +% \globallet\localcolumnmaxcells\columnmaxcells +% \advance\!!countb-\columnmaxcells +% \!!countb-\!!countb +% \advance\!!countb \minusone +% \ifnum\!!countb>\zerocount +% \dostepwiserecurse\plusone\!!countb\plusone +% {\ifvoid\OTRSETgridcell\!!counta\recurselevel +% \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe +% \fi}% +% \fi +% \fi}% +% \OTRSETsetvsize % ! ! ! +% \fi +% \fi +% \fi} +% +% \def\OTRSETpresetbalancing +% {\doifvaluesomething{\??mc\OTRSETidentifier\c!regels}% +% {\getcommacommandsize[\csname\??mc\OTRSETidentifier\c!regels\endcsname]% +% \ifnum\commalistsize>\plusone +% \scratchcounter\zerocount +% \def\docommand##1% +% {\advance\scratchcounter\plusone +% \setvalue{\??mc\OTRSETidentifier\the\scratchcounter\c!regels}{##1}}% +% \processcommacommand +% [\csname\??mc\OTRSETidentifier\c!regels\endcsname]\docommand +% \setvalue{\??mc\OTRSETidentifier\c!regels}{0}% +% \fi}} + +% don't loose empty 1page/1column with area (example **) +% +% \definecolumntextarea[title][x=1,y=4,nx=2,ny=7,state=start] +% \setupcolumntextareatext[title][\vtop to 5cm{a\\b\\b\\d}] +% +% \starttext +% \startcolumnset \dorecurse{1}{\input tufte \par} \stopcolumnset +% \stoptext + +% better: + +\def\definecolumnsetarea {\definecolumntextarea} +\def\setupcolumnsetarea {\setupcolumntextarea} +\def\setupcolumnsetareatext{\setupcolumntextareatext} + +% so this will be changed + +% \def\OTRSETnobalance +% {\iflastcolumnfootnotes % testen ! optie +% % inhibit flush of floats ! +% % todo: nothing if no footnotes, else empty page +% \dostepwiserecurse\mofcolumns\nofcolumns\plusone +% {\vskip-\struttotal\verticalstrut\vfill\eject}% +% \else +% \ifdim\pagetotal>\zeropoint % no, see example ** +% \ifnum\mofcolumns=\nofcolumns +% \OTRSETflushfinalfootnotes +% \else +% % probably todo +% \fi +% \vfill +% \eject +% % brr, may result in empty page after nicely fit text +% % or if left, then lost of first column only text +% \ifnum\mofcolumns>1 +% \OTRSETdofinalflush +% \OTRSETdofinaloutput +% \fi +% \fi +% \fi} + +\def\OTRSETnobalance + {\iflastcolumnfootnotes % testen ! optie + % inhibit flush of floats ! + % todo: nothing if no footnotes, else empty page + \dostepwiserecurse\mofcolumns\nofcolumns\plusone + {\vskip-\struttotal\verticalstrut\vfill\eject}% + \else + \ifnum\mofcolumns>\plusone + \donetrue + \else\ifdim\pagetotal>\zeropoint % too dangerous, we loose data + \donetrue + \else + \donefalse + \fi\fi + \ifdone + \ifnum\mofcolumns=\nofcolumns + \OTRSETflushfinalfootnotes + \else + % probably todo + \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 + \OTRSETdofinalflush + \OTRSETdofinaloutput + \fi + \fi + \fi} + +\def\OTRSETstartnextpage + {\doifsomething\OTRSETlist + {\getfromcommacommand[\OTRSETlist][1]% + \global\let\OTRSETidentifier\commalistelement + \doifundefined{\??mc\OTRSETidentifier\c!n} + {\globallet\OTRSETidentifier\s!default}% + \let\newcommalistelement\empty + \doglobal\replaceincommalist\OTRSETlist1% + \OTRSETrestart}} + +\def\OTRSETrestart % weed + {\OTRSETinitializefeatures + \OTRSETflushpreposttext + \OTRSETinitializecolumns + \OTRSETcheckinsert + \OTRSETcheckgrid + \OTRSETsetvsize + \OTRSETsethsize % or local ? + \OTRSETsetplaceholders + \OTRSEThandlepreposttext + \initializecolumntextareas % name ! + \OTRSETcheckstartcells + \OTRSETsetvsize} + +% \def\OTRSETcheckstartcells +% {\dorecurse\nofcolumns +% {\bgroup +% \mofcolumns\recurselevel +% \scratchcounter\currentcolumnstartcell % uses \mofcolumns, returns 1 or more +% \advance\scratchcounter \minusone +% \dorecurse\scratchcounter +% {\OTRSETdoifcellelse\mofcolumns\recurselevel +% \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}% +% \egroup}} + +\def\OTRSETcheckstartcells + {\dorecurse\nofcolumns + {\bgroup + \mofcolumns\recurselevel +\OTRSETsetcorrectnofcells\currentcolumnstartcell +\advance\scratchcounter \minusone + \dorecurse\scratchcounter + {\OTRSETdoifcellelse\mofcolumns\recurselevel + \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}% + \egroup}} + +% \OTRSEToutput +% {\dontcomplain % new, get rid of overfull message (to be sorted out) +% \OTRSETnaturalflush +% %\OTRSETstartnextpage +% \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong) +% \OTRSETcheckfreelines +% \OTRSETchecksidefloat} + +\OTRSEToutput + {\dontcomplain % new, get rid of overfull message (to be sorted out) + \doloop + {\OTRSETnaturalflush + %\OTRSETstartnextpage % no + \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong) + \OTRSETcheckfreelines + \ifsomefreecolumncells + \exitloop + \else + % flush page and get rid of more floats if present + \fi}% + \OTRSETchecksidefloat} + +\def\OTRSETinitializefeatures + {% number of lines + % new: raw + \getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}% + % direction + \doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right + {\chardef\columndirection\zerocount} + {\chardef\columndirection\plusone}% + % balancing + \chardef\OTRSETbalancemethod\zerocount + \processaction + [\getvalue{\??mc\OTRSETidentifier\c!balance}] + [ \v!yes=>\chardef\OTRSETbalancemethod\plusone, + \v!top=>\chardef\OTRSETbalancemethod\plustwo, + \v!bottom=>\chardef\OTRSETbalancemethod\plusthree]} + +% keep 'm for a while +% +% \installoutput\OTRSETflushpreposttext +% {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}% +% \ifcarryoverfootnotes \else +% \global\setbox\postcolumnbox\vbox{\placebottomnotes}% +% \fi} +% +% to be tested on 'boekinhoud' in 'pascal/demo-bbi' +% +% junk ! ! ! ! ! +% +%\installoutput\OTRSETflushpreposttext +% {\global\setbox\precolumnbox\vbox +% {\unvbox\normalpagebox +% \strut\vskip-2\lineheight\strut}% we want a proper depth +% \ifcarryoverfootnotes \else +% \global\setbox\postcolumnbox\vbox{\placebottomnotes}% +% \fi} +% +% \starttext +% \definecolumnset[two][n=2] +% \startcolumnset[two] \dorecurse{4}{\input tufte } \stopcolumnset +% \input tufte +% \startcolumnset[two] \input tufte \stopcolumnset +% \stoptext +% +% \installoutput\OTRSETflushpreposttext +% {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}% +% \global\dp\precolumnbox\strutdepth +% \ifcarryoverfootnotes \else +% \global\setbox\postcolumnbox\vbox{\placebottomnotes}% +% \fi} + +% test: +% +% \definecolumnset[two] [n=2,balance=yes] +% \definecolumnset[three][n=3,balance=yes] +% \setupcolumnset [two] [1] [lines=10] +% \setupcolumnset [two] [2] [lines=10] +% +% \startcolumnset[two] \dorecurse{14}{\input tufte \par} \stopcolumnset +% \startcolumnset[three] \dorecurse{12}{\input tufte \par} \stopcolumnset +% +% with: +% +% \installoutput\OTRSETflushpreposttext +% {%\ifvoid\normalpagebox +% % \global\setbox\precolumnbox\vbox{}% +% %\else +% \global\setbox\precolumnbox\vbox +% {\unvcopy\normalpagebox}% +% \global\setbox\precolumnbox\vbox to \ht\precolumnbox +% {\box\normalpagebox}% +% %\fi +% \global\dp\precolumnbox\strutdepth +% \ifcarryoverfootnotes \else +% \global\setbox\postcolumnbox\vbox{\placebottomnotes}% +% \fi} + +% testcase : pascal demo-bbi, paragraaf/aanduiding koppen + +\ifx\lastskipinotr\undefined \newskip\lastskipinotr \fi + +\installoutput\OTRSETflushpreposttext + {\global\setbox\precolumnbox\vbox + {\unvbox\normalpagebox + \global\lastskipinotr\lastskip}% + \ifdim\lastskipinotr>\zeropoint + \global\setbox\precolumnbox\hbox + {\lower\strutdepth\box\precolumnbox}% + \fi + \global\dp\precolumnbox\strutdepth + \ifcarryoverfootnotes \else + \global\setbox\postcolumnbox\vbox{\placebottomnotes}% + \fi} + +\let\precolumnlines \!!zerocount +\let\postcolumnlines\!!zerocount + +% \def\OTRSEThandlepreposttext +% {\ifdim\ht\precolumnbox>\zeropoint % new +% \getnoflines{\ht\precolumnbox}% +% \edef\precolumnlines{\the\noflines}% +% \doOTRSETsetgridcells +% {\copy\placeholderboxe} +% \plusone\plusone\nofcolumns\noflines +% {\box\precolumnbox}% +% \else +% \let\precolumnlines\!!zerocount +% \fi +% \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line +% \getnoflines{\ht\postcolumnbox}% +% \edef\postcolumnlines{\the\noflines}% +% \advance\columnfreecells -\noflines +% \advance\columnfreecells \plusone +% \doOTRSETsetgridcells +% {\copy\placeholderboxe} +% \plusone\columnfreecells\nofcolumns\noflines +% {\box\postcolumnbox}% +% \else +% \let\postcolumnlines\!!zerocount +% \fi} + +\def\OTRSEThandlepreposttext + {\ifdim\ht\precolumnbox>\zeropoint % new + \getnoflines{\ht\precolumnbox}% + \edef\precolumnlines{\the\noflines}% + \doOTRSETsetgridcells + {\copy\placeholderboxe} + \plusone\plusone\nofcolumns\noflines + % normal version (single column set) + % {\box\precolumnbox}% + % compensated for bodyfont change + {\hbox + {\OTRSETsetcorrectcellht + \raise\scratchdimen\box\precolumnbox}}% + \else + \let\precolumnlines\!!zerocount + \fi + \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line + \getnoflines{\ht\postcolumnbox}% + \edef\postcolumnlines{\the\noflines}% + \advance\columnfreecells -\noflines + \advance\columnfreecells \plusone + \doOTRSETsetgridcells + {\copy\placeholderboxe} + \plusone\columnfreecells\nofcolumns\noflines + {\box\postcolumnbox}% + \else + \let\postcolumnlines\!!zerocount + \fi} + +\def\OTRSETchecksidefloat + {} % {\sidefloatoutput} + +\def\OTRSETfinalsidefloatoutput + {} + +\def\OTRSETcheckgrid + {\topskip1\topskip + \ifforcecolumngrid + \widowpenalty\zerocount + \clubpenalty\zerocount + \brokenpenalty\zerocount + \fi} + +\def\OTRSETcheckinsert + {\iflastcolumnfootnotes + \ifnum\nofcolumns=\mofcolumns + \OTRSETforceinserts + \else + \OTRSETinhibitinserts + \fi + \else + \OTRSETforceinserts + \fi} + +\def\OTRSETforceinserts + {\enablenotes} + +\def\OTRSETinhibitinserts + {\disablenotes} + +% interface to footnotes + +\def\OTRSETassignwidths + {%\scratchdimen\makeupwidth + \freezetextwidth \scratchdimen\textwidth + % + \scratchcounter\zerocount + \dorecurse\nofcolumns + {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit + {\advance\scratchcounter \plusone } + {\advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}% + \advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!distance}}% + \ifcase\scratchcounter\else + \divide\scratchdimen \scratchcounter + \fi + \setgvalue{\??mc\??mc\c!width}{0}% + \dorecurse\nofcolumns + {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit + {\dimen0=\scratchdimen} + {\setgvalue{\??mc\??mc\c!width}{1}% + \dimen0=\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}% + \setxvalue{\??mc\recurselevel\??mc\c!width}{\the\dimen0}}} + +\def\OTRSETlocalwidth#1% + {\getvalue{\??mc\number#1\??mc\c!width}} + +\newbox\placeholderboxa +\newbox\placeholderboxb +\newbox\placeholderboxc +\newbox\placeholderboxd +\newbox\placeholderboxe +\newbox\placeholderboxf + +\def\columnplaceholder#1#2% + {\hbox + {\setbox\scratchbox\hbox to \hsize + {\iftracecolumnset + \hskip-.5ex% + \startcolor[columnset:#2]\vrule\!!width1ex\!!height.5ex\!!depth.5ex\stopcolor + \fi + \hss}% + \ifcase#1\relax + \ht\scratchbox\zeropoint + \dp\scratchbox\zeropoint + \wd\scratchbox\zeropoint + \else + \wd\scratchbox\hsize + \ht\scratchbox\strutht + \dp\scratchbox\strutdp + \fi + \box\scratchbox}} + +\definepalet + [columnset] + [a=cyan,b=green,c=blue,d=red,e=magenta,f=darkgray] + +\def\OTRSETsetplaceholders + {\global\setbox\placeholderboxa\columnplaceholder0a% + \global\setbox\placeholderboxb\columnplaceholder0b% + \global\setbox\placeholderboxc\columnplaceholder0c% + \global\setbox\placeholderboxd\columnplaceholder0d% + \global\setbox\placeholderboxe\columnplaceholder0e% + \global\setbox\placeholderboxf\columnplaceholder1f} + +\def\doOTRSETshowstatus + {\llap{\tt\tfxx + \startcolor[blue](\the\vsize->\number\columnfirstcell\#\number\columnfreecells)\stopcolor + \hskip\leftskip}} + +\def\OTRSETshowstatus + {\iftracecolumnset \doOTRSETshowstatus \fi} + +% \appendtoks \OTRSETshowstatus \to \everypar + +% page contents + +\def\OTRSETdopagecontents#1#2% takes two args: \box<n> \unvbox<n> + {\vbox to \textheight{\forgetall#1#2}} + +\def\OTRSETsomepagefloat {\def\floatmethod{PAGE}\OTRSETsomeslotfloat} % check +\def\OTRSETsomeherefloat {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check +\def\OTRSETsomeelsefloat {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check +\def\OTRSETsomefixdfloat {\def\floatmethod{FIXD}\OTRSETsomeslotfloat} % check +\def\OTRSETsometopfloat {\def\floatmethod{TOPS}\OTRSETsomeslotfloat} % check +\def\OTRSETsomebottomfloat{\def\floatmethod{BOTS}\OTRSETsomeslotfloat} % check + +\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge + {\iftestfloatbox\ruledhbox\fi{\box\floatbox}} + +\def\OTRSETsomeslotfloat[#1]% + {\setbox\floatbox\vbox{\flushfloatbox}% + \dp\floatbox\strutdp + \@EA\uppercasestring\floatmethod\to\floatmethod + \OTRSETstoreincolumnslot\floatmethod\floatbox + \doinsertfloatinfo} + +% kind of new, looks much like OTRONE, but not entirely + +\def\OTRSETdosettopinserts + {\bgroup + \ifsomefloatwaiting + \noffloatinserts\zerocount + \let\totaltopinserted\!!zeropoint + \OTRSETdodosettopinserts + \ifnum\@@bknbottom=\zerocount + \ifnum\@@bknlines>\zerocount + \ifdim\totaltopinserted>\zeropoint\relax + \dimen0\lineheight + \dimen0=\@@bknlines\dimen0 + \advance\dimen0 \totaltopinserted\relax + \ifdim\dimen0>\textheight % \vsize %%%%%%%%% \textheight + \showmessage\m!floatblocks8{\@@bknlines}% + \vfilll\eject + \fi + \fi + \fi + \fi + \fi + \egroup} + +\def\OTRSETdodosettopinserts + {\ifnum\noffloatinserts<\noftopfloats + \dogetfloat + \ifdim\topinserted=\zeropoint\relax + \topofinserttrue + \else + \topofinsertfalse + \fi + \setbox\scratchbox\vbox % kan beter ! + {\forgetall + \iftopofinsert + \ifdim\OTRSETtopoffset=\zeropoint + \moveongrid[\v!top] + \fi + \else + \betweenfloatblanko % inserts can't look back + \fi + \flushfloatbox + \blank[\@@bkspaceafter]}% + \global\advance\topinserted \ht\scratchbox\relax + \ifdim\topinserted>\vsize % was \textheight\relax + \OTRSETresavebox\floatbox + \noffloatinserts\noftopfloats\relax + \global\advance\topinserted -\ht\scratchbox + \let\OTRSETdodosettopinserts\relax % to be tested + \else + \xdef\totaltopinserted{\the\topinserted}% + \insert\topins{\forgetall\box\scratchbox}% interlineskip ? + \ifsomefloatwaiting + \advance\noffloatinserts \plusone + \else + \noffloatinserts\noftopfloats\relax + \fi + \dofloatflushedinfo + \fi + \else + \ifsomefloatwaiting + \showmessage\m!floatblocks6{\the\noftopfloats}% + \fi + \let\OTRSETdodosettopinserts\relax + \fi + \OTRSETdodosettopinserts} + +\def\OTRSETdosetbotinserts + {\bgroup + \ifsomefloatwaiting + \noffloatinserts\zerocount + \OTRSETdodosetbotinserts + \fi + \egroup} + +\def\OTRSETdodosetbotinserts + {\ifnum\noffloatinserts<\nofbotfloats\relax + \dogetfloat + \global\advance\botinserted \ht\floatbox\relax + \global\advance\botinserted \dp\floatbox\relax + \global\advance\botinserted \floattopskip\relax + \ifdim\botinserted<\pagegoal\relax + \insert\botins + {\forgetall + \blank[\@@bkspacebefore]% + \flushfloatbox}% + \ifsomefloatwaiting + \advance\noffloatinserts \plusone + \else + \noffloatinserts\nofbotfloats + \fi + \dofloatflushedinfo + \else + \OTRSETresavebox\floatbox + \noffloatinserts\nofbotfloats\relax + \fi + \global\nofloatpermittedtrue % vgl topfloats s! + \else + \ifsomefloatwaiting + \showmessage\m!floatblocks7{\the\nofbotfloats}% + \fi + \let\OTRSETdodosetbotinserts\relax + \fi + \OTRSETdodosetbotinserts} + +\let\OTRSETdosetbothinserts\relax + +\def\OTRSETdotopinsertions + {\ifvoid\topins\else + \ifvoid\columntopbox\mofcolumns + \columnsettopbox\mofcolumns\box\topins + \else + \columnsettopbox\mofcolumns\vbox % temp, must be better + {\forgetall + \offinterlineskip + \box\columntopbox\mofcolumns + \box\topins} + \fi + \fi + \global\topinserted\zeropoint\relax} % goes away + +\def\OTRSETdobotinsertions + {\ifvoid\botins \else + \columnsetbotbox\mofcolumns\box\botins +% \else +% \columnsetbotbox\mofcolumns\vbox % temp, must be better +% {\forgetall +% \offinterlineskip +% \box\botins +% \box\columnbotbox\mofcolumns} + \fi + \global\botinserted\zeropoint\relax} % goes away + +% set ipv text + +% left right 1 2 3 +1 +2 +3 + +\let\columnleftareas \empty +\let\columnrightareas\empty + +% links rechts => odd, even, n, named + +\def\definecolumntextarea + {\dotripleempty\dodefinecolumntextarea} + +\def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig ! + {\ifthirdargument + \doifinsetelse{#2}{\v!both,\v!fixed} + {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]% + \definecolumntextarea[#1][\v!right][\c!type=#2,#3]} + {\doifelse{#2}\v!next + {\doifoddpageelse + {\definecolumntextarea[#1][\v!right][\c!type=#2,#3]} + {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}} + {\presetlocalframed + [\??mt#1#2]% + \processaction[#2] % \doglobal voorkomt stack build up + [ \v!left=>\doglobal\addtocommalist{#1}\columnleftareas, + \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]% + \getparameters[\??mt#1#2] + [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight, + \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off, + \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}% + \else + \definecolumntextarea[#1][\v!next][#2]% + \fi} + +\def\setupcolumntextarea + {\dotripleempty\dosetupcolumntextarea} + +\def\dosetupcolumntextarea[#1][#2][#3]% + {\ifthirdargument + \doifelse{#2}\v!both + {\setupcolumntextarea[#1][\v!left ][#3]% + \setupcolumntextarea[#1][\v!right][#3]} + {\doifelse{#2}\v!next + {\doifoddpageelse + {\setupcolumntextarea[#1][\v!right][#3]} + {\setupcolumntextarea[#1][\v!left][#3]}} + {\getparameters[\??mt#1#2][#3]}}% + \else + \setupcolumntextarea[#1][\v!next][#2]% + \fi} + +\def\docheckcolumnsetareapage#1#2% + {\ifnum\getvalue{\??mt#1\c!page}>\plusone + \doifelsevalue{\??mt#1\c!type}\v!fixed + {\ifnum\columnsetpage=\getvalue{\??mt#1\c!page}\relax + \donetrue\else\donefalse + \fi} + {\ifnum\columnsetpage<\getvalue{\??mt#1\c!page}\relax + \donefalse\else\donetrue + \fi}% + \else + \donetrue + \fi} + +\def\initializecolumntextareas + {\ifodd\realpageno + \doinitializecolumntextareas\columnrightareas\v!right + \else + \doinitializecolumntextareas\columnleftareas\v!left + \fi} + +\def\doinitializecolumntextareas#1#2% + {\def\docommand##1% + {\docheckcolumnsetareapage{##1#2}\plusone + \ifdone + \donefalse + \processaction + [\getvalue{\??mt##1#2\c!state}] + [ \v!start=>\donetrue, + \v!repeat=>\donetrue, + \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]% + \ifdone\dodoinitializecolumntextareas{##1}{#2}\fi + \fi}% + \processcommacommand[#1]\docommand} + +\def\dodoinitializecolumntextareas#1#2% + {\doOTRSETsetgridcells + {\copy\placeholderboxd} + {\getvalue{\??mt#1#2\c!x }}{\getvalue{\??mt#1#2\c!y }} + {\getvalue{\??mt#1#2\c!nx}}{\getvalue{\??mt#1#2\c!ny}} + {\copy\placeholderboxd}} + +\def\placecolumntextareas + {\ifodd\realpageno + \doplacecolumntextareas\columnrightareas\v!right + \else + \doplacecolumntextareas\columnleftareas\v!left + \fi} + +\def\doplacecolumntextareas#1#2% global ? + {\bgroup + \forgetall + \def\docommand##1% + {\docheckcolumnsetareapage{##1#2}\zerocount + \ifdone + \donefalse + \processaction + [\getvalue{\??mt##1#2\c!state}] + [ \v!start=>\donetrue\doglobal\removefromcommalist{##1}#1, + \v!repeat=>\donetrue, + \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]% + \ifdone + \dodoplacecolumntextareas{##1}{#2}% + \else + \doglobal\removefromcommalist{##1}#1% + \fi + \fi}% + \processcommacommand[#1]\docommand + \egroup} + +% \page[left] +% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer] +% \setupcolumntextareatext[intro][left][\setups{intro}] +% \flushcolumntextareas + +\def\flushcolumntextareas + {\initializecolumntextareas + \setvsize} + +\def\columntextlastbackspace{\backspace} + +% beware, we have clipping offsets of 2\lineheight by default + +\def\columntextareaparameter#1% + {\csname\??mt\currentcolumntestarea#1\endcsname} + +\def\dodoplacecolumntextareas#1#2% + {\def\currentcolumntestarea{#1#2}% + \!!counta\columntextareaparameter\c!x + \!!countb\columntextareaparameter\c!nx + \docalculatecolumnsetspan + \!!heighta\columntextareaparameter\c!ny\lineheight + % wrong + % \ifnum\columntextareaparameter\c!y=\zerocount + % \advance\!!heighta -\lineheight + % \advance\!!heighta \topskip + % \fi + % \advance\!!heighta -\lineheight % option + \ifnum\columntextareaparameter\c!y=\plusone + \advance\!!heighta -\lineheight + \advance\!!heighta \topskip + \fi + % + \setbox\scratchbox\vbox + {\donetrue\localframed + [\??mt\currentcolumntestarea] + [\c!location=,% new (*) + \c!width=\!!widtha,\c!height=\!!heighta,\c!lines=] + {\columntextareaparameter\empty}}% + \!!counta\columntextareaparameter\c!x + \!!countb\columntextareaparameter\c!y + \advance\!!countb \columntextareaparameter\c!ny + \advance\!!countb \minusone + % new (*) + \doif{\columntextareaparameter\c!location}\v!depth + {\setbox\scratchbox\hbox{\lower\strutdepth\box\scratchbox}% + \dp\scratchbox\zeropoint + \ht\scratchbox\!!heighta}% + % + \setbox0\hbox + {\ifcase\!!countc + \copy\scratchbox % \box + \else + \clip + [ %\c!topoffset=\columntextareaparameter\c!clipoffset,% + %\c!bottomoffset=\columntextareaparameter\c!clipoffset,% + %\c!leftoffset=\columntextareaparameter\c!clipoffset,% + \c!offset=\columntextareaparameter\c!clipoffset,% + \c!rightoffset=\zeropoint,% + \c!width=\!!widthb,% + \c!height=\!!heighta]% + {\copy\scratchbox}% + \fi}% + \OTRSETsetgridcell\!!counta\!!countb\box0 + \ifcase\!!countc\else + \advance\!!counta \columntextareaparameter\c!nx + \advance\!!counta -\!!countc + \advance\!!widtha -\!!widthb + \setbox0\hbox + {\hskip-\namedlayoutparameter\v!odd\c!backspace + \clip + [ %\c!topoffset=\columntextareaparameter\c!clipoffset,% + %\c!bottomoffset=\columntextareaparameter\c!clipoffset,% + %\c!rightoffset=\columntextareaparameter\c!clipoffset,% + \c!offset=\columntextareaparameter\c!clipoffset,% + \c!leftoffset=\zeropoint,% + \c!width=\!!widtha,% + \c!height=\!!heighta,% + \c!hoffset=\!!widthb]% + {\copy\scratchbox}}% + \OTRSETsetgridcell\!!counta\!!countb\box0% + \fi} + +\def\setupcolumntextareatext + {\dotripleempty\dosetupcolumntextareatext} + +\long\def\dosetupcolumntextareatext[#1][#2][#3]% + {\ifthirdargument + \doifelse{#2}\v!both + {\setvalue{\??mt#1\v!left }{#3}% + \setvalue{\??mt#1\v!right}{#3}} + {\doifelse{#2}\v!next + {\doifoddpageelse + {\setvalue{\??mt#1\v!right}{#3}}% + {\setvalue{\??mt#1\v!left }{#3}}}% + {\setvalue{\??mt#1#2}{#3}}}% + \else + \setupcolumntextareatext[#1][\v!next][{#2}]% + \fi} + +\def\docalculatecolumnsetspan + {% \!!counta <= x + % \!!countb <= nx + % \!!widtha => total width + % \!!widthb => left width + % \!!countc => left cols + \!!widtha\!!countb\textwidth % we assume equal widths + \advance\!!countb \!!counta + \advance\!!countb \minusone + \ifnum\!!countb>\nofcolumns + \!!countc\!!countb + \advance\!!countc -\nofcolumns + \!!countb\nofcolumns + \else + \!!countc\zerocount + \fi + \advance\!!counta \plusone + \dostepwiserecurse\!!counta\!!countb\plusone + {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}% + \!!widthb\!!widtha + \advance\!!widthb -\!!countc\textwidth + \ifodd\realpageno \else % tricky, assumes that we keep there + \ifcase\!!countc\else + % nog niet ok voor enkel/doublesided + \advance\!!widtha \namedlayoutparameter\v!even\c!backspace + \advance\!!widtha \namedlayoutparameter\v!odd \c!backspace + \advance\!!widthb \namedlayoutparameter\v!even\c!backspace + \dorecurse\!!countc + {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}% + \fi + \fi} + +\def\columnsetspanhsize{\textwidth} + +\def\setcolumnsetspanhsize#1#2% x nx / uses counta/b + {\!!counta#1\!!countb#2\docalculatecolumnsetspan + \edef\columnsetspanhsize{\the\!!widtha}} + +\def\definecolumnsetspan + {\dodoubleempty\dodefinecolumnsetspan} + +\def\dodefinecolumnsetspan[#1][#2]% + {%\ifsecondargument + \defineframedtext + [cs:#1] + [\c!frame=\v!off, + \c!before=, + \c!after=, + \c!offset=\v!overlay, + \c!location=\v!left, + \c!linecorrection=\v!off, + \c!depthcorrection=\v!off, + \c!n=2, + \c!nlines=0, + \c!indenting=, + \c!indentnext=\v!yes, + \c!default=HERE, + \c!alternative=\v!a, + #2]% + %\else + % \definecolumnspan[][#1]% + }%\fi} + +\definecolumnsetspan[\s!default] + +\def\setupcolumnsetspan + {\dodoubleempty\dosetupcolumnsetspan} + +\def\dosetupcolumnsetspan[#1][#2]% + {\ifsecondargument + \setupframedtexts[cs:#1][#2]% + \else + \setupcolumnsetspan[\s!default][#1]% + \fi} + +\def\startcolumnsetspan + {\dotripleempty\dostartcolumnsetspan} + +%%%%%%%%%%%%%%%% TODO + +\def\dostartcolumnsetspan[#1][#2][#3]% [#3] gobbles space + {\endgraf % else rubish output if forgotten + \vskip \zeropoint % make sure otr is done, otherwise last line problems + \bgroup + \forgetall + \ifnum\columnsetlevel>\zerocount\else + % of course we needed a one-column fall back for tm + \columnsetspanhsize\hsize + \nofcolumns\plusone + \mofcolumns\plusone + \fi + \setupframedtexts[cs:#1] + [\c!width=\columnsetspanhsize, + \c!linecorrection=\v!off, + \c!depthcorrection=\v!off, + #2]% + % determine widths + \!!countc\framedtextparameter{cs:#1}\c!n + % \!!countd\numexpr(\nofcolumns-\mofcolumns+\plusone)% + \!!countd\nofcolumns + % n <= n of columns + \ifnum\!!countc>\!!countd \!!countc\!!countd \fi + \advance\!!countd -\mofcolumns + \advance\!!countd \plusone + % n <= n of available columns (alternative a) + \doif{\framedtextparameter{cs:#1}\c!alternative}\v!a + {\ifnum\!!countc>\!!countd \!!countc\!!countd \fi}% + % here it all starts + \setcolumnsetspanhsize\mofcolumns\!!countc % a/b used + \hsize\columnsetspanhsize + \setbox\scratchbox\vbox\bgroup + \dostartframedtext[cs:#1][\v!none]% geen nils placement + % spoils spacing : \vskip-\struttotal\par\verticalstrut\par + \ifnum\columnsetlevel>\zerocount + \framedtextparameter{cs:#1}\c!before + \fi + \def\stopcolumnsetspan{\dostopcolumnsetspan{#1}}} + +\def\dostopcolumnsetspan#1% + {\par + \verticalstrut + \kern-2\struttotal + \verticalstrut + \ifnum\columnsetlevel>\zerocount + \doifsomething{\framedtextparameter{cs:#1}\c!after} + {\framedtextparameter{cs:#1}\c!after + \kern\zeropoint}% otherwise blanks disappear, better be a switch + \else + \endgraf + \fi + \dostopframedtext + \egroup + \setbox\scratchbox\frozenhbox to \hsize + {\dontcomplain + \alignedline{\framedtextparameter{cs:#1}\c!location}\v!middle + {\lower\strutdepth\box\scratchbox}}% + \dp\scratchbox\zeropoint % else wrong snap insidefloat +% +% to be tested first (strange in grid mode) +% +% \setbox\scratchbox\frozenhbox to \hsize +% {\dontcomplain +% \chardef\alignstrutmode\zerocount +% \alignedline{\framedtextparameter{cs:#1}\c!plaats}\v!midden +% {\box\scratchbox}}% +% + \ifinsidefloat + \box\scratchbox + \else\ifnum\columnsetlevel>\zerocount + % we only set \columnsetspacing when asked for, else bottom problems + % don't change this any more (test naw) + \chardef\columnslotspacing\framedtextparameter{cs:#1}\c!nlines\relax + % todo: nboven/onder & \chardef\columnslotlocation2 + %\OTRSETstoreincolumnslotHERE\scratchbox + \edef\floatmethod{\framedtextparameter{cs:#1}\c!default}% + \@EA\uppercasestring\floatmethod\to\floatmethod + % todo : \v!here -> here enzovoorts + \OTRSETstoreincolumnslot\floatmethod\scratchbox + % watch out: no \dochecknextindentation{tag} + \checknextindentation[\framedtextparameter{cs:#1}\c!indentnext]% + \else + % of course we needed a one-column fall back for tm; brrr, the box has now too + % much height (try \ruledvbox); don't change this without testing techniek + \scratchdimen\ht\scratchbox + \advance\scratchdimen-\strutdp + \ht\scratchbox\scratchdimen + \framedtextparameter{cs:#1}\c!before + \snaptogrid\vbox{\box\scratchbox}% + \framedtextparameter{cs:#1}\c!after + \fi\fi + \egroup + \endgraf} + +% \startcolumnset[two] +% \input tufte +% \startcolumnsetspan[two][width=20cm,location=middle] \input tufte \stopcolumnsetspan +% \startcolumnsetspan[two][default=btlr] \input tufte \stopcolumnsetspan +% \input tufte \par +% \input tufte \par +% \startcolumnsetspan[two] \emptylines[5] \stopcolumnsetspan +% \startcolumnsetspan[two] \input tufte \stopcolumnsetspan +% \stopcolumnset + +% We need to set the \dimen globally since we are in the +% OTR. Unfortunately this interferes with local settings, +% although we may assume that they will not cross page +% boundaries. + +\def\OTRSETcheckcontent + {\bgroup + \donefalse + \def\OTRSETcheckcontent##1% + {\setbox\scratchbox##1\recurselevel + \setbox\scratchbox\vbox{\unvbox\scratchbox}% + \ifdim\ht\scratchbox>\zeropoint\donetrue\fi}% + \dorecurse{\nofcolumns} + {\OTRSETcheckcontent\columngettextbox + \OTRSETcheckcontent\columngetfootbox + \OTRSETcheckcontent\columngettopbox + \OTRSETcheckcontent\columngetbotbox}% + \ifdone\egroup\donefalse\else\egroup\donetrue\fi} + +\def\OTRSETgetcolumntextheight#1% max - boven - top + {\scratchdimen=\OTRSETgetparameter\c!maxhoogte#1% + \advance\scratchdimen -\OTRSETgetparameter\c!bovenoffset#1% + \advance\scratchdimen -\ht\columntopbox#1% + \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% + \advance\scratchdimen -\ht\columnbotbox#1} % not used + +\def\OTRSETgetcolumnnaturalheight#1% max - boven - top + {\setbox\scratchbox\vbox{\unvcopy\columntextbox#1}% + \scratchdimen\ht\scratchbox + \advance\scratchdimen \OTRSETgetparameter\c!bovenoffset#1% + \advance\scratchdimen \ht\columntopbox#1% + \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}% + \advance\scratchdimen \ht\columnbotbox#1} % not used + +\def\OTRSETdobalance% splitten in met en zonder footnotes + {\bgroup + \maxdeadcycles=1000 + % collect content and notes + \bgroup + \OTRSEToutput + {\global\setbox1\vbox{\unvbox\normalpagebox}% + \global\setbox3\vbox{\unvbox\footins}}% + \verticalstrut\vskip-\struttotal % makes footnotes flush + \eject + \global\collectingcontentfalse + % check for footnotes only + \ifdim\ht1<\topskip % real dirty + \global\setbox1=\vbox{} + % fix height of first line + \ifdim\ht3>\!!zeropoint + \global\setbox3\vbox + {\setfootnotebodyfont + \kern-\strutht + \kern\topskip + \unvbox3} + \fi + % prepare trial box + \global\setbox5\vbox + {\ifdim\ht1>\zeropoint + \unvcopy1 \ifdim\ht3>\zeropoint \kern\skip\footins \fi + \fi + \ifdim\ht3>\zeropoint \unvcopy3 \fi} + \egroup + % erase old stuff + \columnerasetextboxes + \columnerasefootboxes + % prepare floats + \OTRSETdotopinsertions + \OTRSETdobotinsertions % not used can be removed + % calculate available space + \!!heighta\zeropoint % available total height + \dorecurse{\nofcolumns} + {\OTRSETgetcolumntextheight\recurselevel + \OTRSETcalculatelines\scratchdimen + \advance\!!heighta \scratchdimen} + % quick check + \ifdim\ht5>\!!heighta + % use normal routine + \columnerasetextboxes + \columnerasefootboxes + % TEMP, TODO, FORCE NEXT PASS ! + \unvbox1 + \unvbox3 + \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist + \donefalse + %\writestatus\m!columns{no balancing, text overflows height}% + \else\ifdim\ht5>\zeropoint \relax + % some text and/or notes + \donetrue + \else + \donefalse + \dorecurse\nofcolumns + {\ifdim\ht\columntopbox\recurselevel>\zeropoint \donetrue \fi}% + \ifdone + % no text and notes, but figures + \else + % no text, no notes, no figures + \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist + \writestatus\m!columns{no balancing, nothing to be placed}% + \fi + \fi\fi + \ifdone + \ifdim\ht5>\zeropoint \relax + % balancing text and notes + %\writestatus\m!columns{text may fit, balancing}% + \newcounter\loopcounter + \newcounter\balancinglines + \doloop + {\increment\loopcounter\relax + % initialize + \columnerasetextboxes + \columnerasefootboxes + \setbox0=\copy5 + \splittopskip\topskip + % pre-split loop and quality calculation + %\writestatus\m!columns{pass \loopcounter: correction -\balancinglines} + \dorecurse\nofcolumns + {\OTRSETgetcolumntextheight\recurselevel + \OTRSETcalculatelines\scratchdimen + \!!heightc\scratchdimen + \ifnum\recurselevel<\nofcolumns + \advance\!!heightc -\balancinglines\lineheight + \fi + \columnsettextbox\recurselevel\vsplit0 to \!!heightc} + % just one method + \OTRSETgetcolumnnaturalheight1 \dimen4\scratchdimen + \OTRSETgetcolumnnaturalheight\nofcolumns \dimen6\scratchdimen + %\writestatus\m!columns{first column: \the\dimen4}% + %\writestatus\m!columns{last column: \the\dimen6}% + \ifdim\dimen4=\dimen6 + \donetrue % perfect balance + \else\ifdim\dimen4>\dimen6 + \donefalse % not yet good enough + \increment\balancinglines % try again + \edef\balancingcount{\the\!!counta} + \else + \donetrue % worse balance + \ifnum\balancinglines>0 % take previous + \decrement\balancinglines + \fi + \fi\fi + % extra check + % \ifdim\ht0>\zeropoint\relax \donefalse \fi + % another check + \ifdone + %\writestatus\m!columns{balancing finished in pass \loopcounter}% + \else \ifnum\loopcounter>100 \donetrue + %\writestatus\m!columns{balancing aborted after pass \loopcounter}% + \else + %\writestatus\m!columns{balancing continued after pass \loopcounter}% + \fi \fi + % final balancing pass + \ifdone + \setbox0\copy1 + \setbox2\copy3 + \columnerasetextboxes + \columnerasefootboxes + \dorecurse\nofcolumns + {\OTRSETgetcolumntextheight\recurselevel + \OTRSETcalculatelines\scratchdimen + \!!heightc\scratchdimen + \ifnum\recurselevel<\nofcolumns + \advance\!!heightc -\balancinglines\lineheight + \fi + % split off text + \ifdim\ht0>\zeropoint + \columnsettextbox\recurselevel\vsplit0 to \!!heightc + \setbox4\vbox{\unvcopy\columntextbox\recurselevel} + \advance\!!heightc -\ht4 + \ifdim\ht0>\zeropoint + \columnsettextbox\recurselevel\box4 + \advance\!!heightc \skip\footins + \fi + \fi + % split off footnotes + \ifdim\ht0>\zeropoint\relax \else + \ifdim\ht2>\zeropoint\relax + \setbox4\vsplit2 to \!!heightc + \setbox\footins=\vbox{\unvbox4} % ugly and dirty trick + \ifdim\ht\columntextbox\recurselevel=\zeropoint\relax + \columnsettextbox\recurselevel\hbox + {\raise\strutdp\hbox % ugly but needed + {\setfootnotebodyfont % both these moves + \lower\strutdp\hbox{\placebottomnotes}}} + \else + \columnsetfootbox\recurselevel\hbox{\placebottomnotes} + \fi + \fi + \fi} + \exitloop + \fi} + \else + % no reason to balance floats + \fi + \fi + \doglobal\addtocommalist{\realfolio}\OTRSETbalancinglist + \OTRSETdoflush + \fi + \egroup} + +\protect \endinput + +% extreme examples (1) +% +% \setupfloats[numbering=nocheck] +% +% \definecolumnset [first] [n=2,start=0] +% \definecolumnset [next] [n=2,start=3] +% +% \setuptexttexts[\vbox to \textheight{\topskipcorrection \hsize\makeupwidth left \hfill right\vfill}] +% +% \setuphead[chapter][text=empty] +% +% \starttext +% +% \startcolumnset[first,next] +% \placefigure[btrl]{}{} +% \placefigure[tblr]{}{} +% \chapter{thuan} \dorecurse{25}{\recurselevel: \input thuan \endgraf} +% \stopcolumnset +% +% \startcolumnset[first,next] +% \chapter{thuan} \dorecurse{25}{\input thuan \endgraf\placefigure{}{}} +% \stopcolumnset + +\unprotect + +% only in columnsets + +% \def\cornerfigure +% {\dotripleempty\docornerfigure} +% +% \def\docornerfigure[#1][#2][#3]% [layer] [location] [settings] +% {\bgroup +% \dowithnextbox +% {\!!doneafalse +% \!!donebfalse +% \processallactionsinset +% [\v!left,\v!bottom,#2] +% [ \v!left=>\!!doneatrue , +% \v!right=>\!!doneafalse, +% \v!top=>\!!donebtrue , +% \v!bottom=>\!!donebfalse]% +% \!!widtha\nextboxwd +% \if!!donea +% % unchecked +% \advance\!!widtha-\backspace +% \else +% % unchecked +% \advance\!!widtha-\backspace +% \fi +% \!!widtha\textwidth % could be an option +% \!!heighta\nextboxht +% % zou een macro moeten zijn \getnoflayoutlines +% \ifnum\layoutparameter\c!lines=\zerocount +% \getnoflines\textheight +% \else +% \noflines\layoutparameter\c!lines +% \fi +% % +% \advance\noflines \plusone % wordt default, instelbaar +% \!!heightb\noflines\lineheight\relax +% \if!!doneb % boven +% % unchecked +% \advance\!!heighta-\topspace +% \advance\!!heighta-\headerheight +% \advance\!!heighta-\headerdistance +% \else % onder +% % checked +% \advance\!!heighta-\paperheight +% \advance\!!heighta+\!!heightb +% \advance\!!heighta+\topspace +% \advance\!!heighta+\headerheight +% \advance\!!heighta+\headerdistance +% \advance\!!heighta-\footerdistance +% \advance\!!heighta-\footerheight +% \fi +% \getnoflines\!!heighta +% \!!heighta\noflines\lineheight\relax +% \def\docornerfigure[####1]% +% {\expanded{\plaatsfiguur[####1,\v!none]{} +% {\noexpand\phantombox[\c!width=\the\!!widtha,\c!height=\the\!!heighta]}}}% +% \if!!donea +% \if!!doneb % links boven / rb +% \setlayer[#1] +% [\c!corner={\v!left,\v!top},\c!location=rb,#3] +% {\flushnextbox}% +% \docornerfigure[tblr]% +% \else % links onder / rt +% \setlayer[#1] +% [\c!corner={\v!left,\v!bottom},\c!location=rt,#3] +% {\flushnextbox}% +% \docornerfigure[btlr]% +% \fi +% \else +% \if!!doneb % rechts boven / lt +% \setlayer[#1] +% [\c!corner={\v!right,\v!top},\c!location=lb,#3] +% {\flushnextbox}% +% \docornerfigure[tbrl]% +% \else % rechts onder / lb +% \setlayer[#1] +% [\c!corner={\v!right,\v!bottom},\c!location=lt,#3] +% {\flushnextbox}% +% \docornerfigure[btrl]% +% \fi +% \fi +% \egroup} +% \vbox} diff --git a/tex/context/base/page-sid.tex b/tex/context/base/page-sid.mkii index 0848c9d8c..0848c9d8c 100644 --- a/tex/context/base/page-sid.tex +++ b/tex/context/base/page-sid.mkii diff --git a/tex/context/base/page-sid.mkiv b/tex/context/base/page-sid.mkiv new file mode 100644 index 000000000..0848c9d8c --- /dev/null +++ b/tex/context/base/page-sid.mkiv @@ -0,0 +1,931 @@ +%D \module +%D [ file=page-sid, +%D version=2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Side Floats, +%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 Page Macros / Side Floats} + +\unprotect + +% problem: when too small, side effects; we need to determine the +% shift earlier so that we can act when shift < size +% +% \definefloat[edgefigure] +% \setupfloat +% [edgefigure] +% [rightmargindistance=-\rightmargintotal, +% leftmargindistance=-\rightmargintotal, +% default=outer] +% \starttext +% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte +% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte +% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte +% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte +% \stoptext + +% todo: dimexpr an dnumexpr + +% These macro deal with side floats. We started with Daniel +% Comenetz macros as published in TUGBoat Volume 14 (1993), +% No.\ 1: Anchored Figures at Either Margin. I extended and +% patched the macros to suite our needs which results in a +% messy module. Therefore, this module badly needs an update +% because it's now a mixture of old and new macros. + +% afhankelijke variabelen +% +% \overgap vervangen door \floatsidetopskip +% \sidegap vervangen door \floatsideskip +% \undergap vervangen door \floatsidebottomskip +% +% \prskp vervangen door \ctxparskip + +% toegevoegde macro's/aanroepen +% +% \logsidefloat : loginformatie +% \flushsidefloats : nodig voor koppen + +% recente wijzigingen: +% +% namen aangepast: \float... enz. i.p.v. \pic + +% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}} +% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval +% begint de tekst terecht wat lager. + +\newdimen\sidefloatheight % includes the topskip +\newdimen\sidefloatwidth +\newdimen\sidefloathsize +\newdimen\sidefloatshift +\newdimen\sidefloatextrashift +\newdimen\sidefloatvsize \def\nofloatvsize{-1pt } +\newdimen\sidefloatprogress +\newdimen\sidefloatpagetotal + +\newbox\floatbottom + +\newcount\sidefloatsidelines +\newcount\sidefloatlinesdone + +% 1 = backspace +% 2 = leftedge +% 3 = leftmargin +% 4 = leftside +% 5 = rightside +% 6 = rightmargin +% 7 = rightedge +% 8 = cutspace + +\chardef\sidefloattype\zerocount + +\def\backspacefloat {\global\chardef\sidefloattype1 \putsidefloat} +\def\leftedgefloat {\global\chardef\sidefloattype2 \putsidefloat} +\def\leftmarginfloat {\global\chardef\sidefloattype3 \putsidefloat} +\def\leftfloat {\global\chardef\sidefloattype4 \putsidefloat} +\def\rightfloat {\global\chardef\sidefloattype5 \putsidefloat} +\def\rightmarginfloat {\global\chardef\sidefloattype6 \putsidefloat} +\def\rightedgefloat {\global\chardef\sidefloattype7 \putsidefloat} +\def\cutspacefloat {\global\chardef\sidefloattype8 \putsidefloat} + +\let\marginfloat \cutspacefloat + +\newif\ifroomforfloat +\newif\iffloatshort +\newif\iffloatflag +\newif\iffloatrighteqo +\newif\iffloatlefteqo + +\newdimen\sidefloatleftskip +\newdimen\sidefloatrightskip +\newdimen\sidefloatmaximum + +% \def\checksidefloatshift +% {\ifdim\sidefloatmaximum>\zeropoint +% \ifcase\sidefloattype +% % invalid +% \or +% % backspace +% \or +% \global\sidefloatshift-\sidefloatmaximum +% \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance \rightedgedistance +% \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth \rightmarginwidth +% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance +% \or +% \global\sidefloatshift-\sidefloatmaximum +% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance +% \or +% % left +% \or +% % right +% \or +% \global\sidefloatshift-\sidefloatmaximum +% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance +% \or +% \global\sidefloatshift-\sidefloatmaximum +% \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance \rightedgedistance +% \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth \rightmarginwidth +% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance +% \or +% % cutspace +% \fi +% \fi} + +\def\checksidefloatshift + {\ifdim\sidefloatmaximum>\zeropoint + \ifcase\sidefloattype + % invalid + \or + % backspace + \or + \global\sidefloatshift\dimexpr + -\sidefloatmaximum + -\rightorleftpageaction \leftedgedistance \rightedgedistance + -\rightorleftpageaction \leftmarginwidth \rightmarginwidth + -\rightorleftpageaction \leftmargindistance \rightmargindistance + -\compensatedinnermakeupmargin + \relax + \or + \global\sidefloatshift\dimexpr + -\sidefloatmaximum + -\rightorleftpageaction \leftmargindistance \rightmargindistance + -\compensatedinnermakeupmargin + \relax + \or + % left + \or + % right + \or + \global\sidefloatshift\dimexpr + -\sidefloatmaximum + -\rightorleftpageaction \leftmargindistance \rightmargindistance + -\compensatedinnermakeupmargin + \relax + \or + \global\sidefloatshift\dimexpr + -\sidefloatmaximum + -\rightorleftpageaction \leftedgedistance \rightedgedistance + -\rightorleftpageaction \leftmarginwidth \rightmarginwidth + -\rightorleftpageaction \leftmargindistance \rightmargindistance + -\compensatedinnermakeupmargin + \relax + \or + % cutspace + \fi + \fi} + +% \def\setsidefloatskips +% {\global\sidefloatrightskip\zeropoint +% \global\sidefloatleftskip \zeropoint +% \ifcase\sidefloattype +% \or % backspace +% \global \sidefloatleftskip \rightorleftpageaction \backspace \cutspace +% \or % leftedge +% \global \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance +% \global\advance\sidefloatleftskip \rightorleftpageaction \leftmarginwidth\rightmarginwidth +% \global\advance\sidefloatleftskip \rightorleftpageaction \leftedgedistance\rightedgedistance +% \or % leftmargin +% \global \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance +% \or % leftside +% \or % rightside +% \or % rightmargin +% \global \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance +% \or % rightedge +% \global \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance +% \global\advance\sidefloatrightskip\rightorleftpageaction \rightmarginwidth\leftmarginwidth +% \global\advance\sidefloatrightskip\rightorleftpageaction \rightedgedistance\leftedgedistance +% \or % cutspace +% \global \sidefloatrightskip\rightorleftpageaction \cutspace\backspace +% \fi +% \ifdim\sidefloatrightskip>\zeropoint +% \doglobal\advance\sidefloatrightskip\rightskip +% \fi +% \ifdim\sidefloatleftskip>\zeropoint +% \doglobal\advance\sidefloatleftskip\leftskip +% \fi} + + +% use \outermarginwidth etc here + +\def\setsidefloatskips + {\global\sidefloatrightskip\zeropoint + \global\sidefloatleftskip \zeropoint + \ifcase\sidefloattype + \or % backspace + \global\sidefloatleftskip\dimexpr + +\rightorleftpageaction \backspace \cutspace + +\compensatedinnermakeupmargin + \relax + \or % leftedge + \global\sidefloatleftskip\dimexpr + +\rightorleftpageaction \leftmargindistance \rightmargindistance + +\rightorleftpageaction \leftmarginwidth \rightmarginwidth + +\rightorleftpageaction \leftedgedistance \rightedgedistance + +\compensatedinnermakeupmargin + \relax + \or % leftmargin + \global\sidefloatleftskip\dimexpr + +\rightorleftpageaction \leftmargindistance \rightmargindistance + +\compensatedinnermakeupmargin + \relax + \or % leftside + \or % rightside + \or % rightmargin + \global\sidefloatrightskip\dimexpr + +\rightorleftpageaction \rightmargindistance \leftmargindistance + +\compensatedinnermakeupmargin + \relax + \or % rightedge + \global\sidefloatrightskip\dimexpr + +\rightorleftpageaction \rightmargindistance \leftmargindistance + +\rightorleftpageaction \rightmarginwidth \leftmarginwidth + +\rightorleftpageaction \rightedgedistance \leftedgedistance + +\compensatedinnermakeupmargin + \relax + \or % cutspace + \global\sidefloatrightskip\dimexpr + +\rightorleftpageaction \cutspace \backspace + +\compensatedinnermakeupmargin + \relax + \fi + \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi + \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip \fi} + +% eq is still crap + +\ifx\normalleqno\undefined + + \let\floatrighteqo=\eqno + \let\floatleftleqo=\leqno + +\else + + \let\floatrighteqo=\normaleqno + \let\floatleftleqo=\normalleqno + +\fi + +% Watch it even more! In inner, gaat't mis omdat daar +% pagetotal enz niet zijn aangepast. Inner kan overigens niet +% betrouwbaar worden getest! + +% \def\flushsidefloats% +% {\par +% \sidefloatprogress=\sidefloatvsize +% \advance\sidefloatprogress by -\pagetotal +% \ifdim\sidefloatprogress>\zeropoint +% \witruimte % nog checken op interferentie +% \kern\sidefloatprogress +% \fi +% \global\sidefloatvsize=\nofloatvsize +% \global\floatflagfalse} +% +% no, too buggy, leads to top of page crap +% +%\def\flushsidefloats +% {\par +% \dochecksidefloat +% \scratchcounter=-\hangafter +% \dorecurse{\scratchcounter}{\strut\hfill\strut\par}} +% +%\def\flushsidefloats +% {\par +% \!!heighta\sidefloatvsize +% \advance\!!heighta -\pagetotal +% \ifdim\!!heighta>\zeropoint +% % to be checked for interference +% \witruimte +% % will be option +% \getnoflines\!!heighta +% \!!heighta\noflines\lineheight +% % so far for option +% \kern\!!heighta +% \fi +% % == \forgetsidefloats +% \global\sidefloatvsize\nofloatvsize +% \global\floatshortfalse +% \global\floatflagfalse} + +% \def\flushsidefloats +% {\par +% \!!heighta\sidefloatvsize +% \advance\!!heighta -\pagetotal +% \ifdim\!!heighta>\zeropoint +% % to be checked for interference +% \witruimte +% % will be option +% \getnoflines\!!heighta +% \!!heighta\noflines\lineheight +% % so far for option +% \ifdim\sidefloatbottomskip>\zeropoint\relax +% \ifdim\!!heighta>\sidefloatbottomskip +% \advance\!!heighta-\sidefloatbottomskip +% \kern\!!heighta +% \vskip\sidefloatbottomskip +% \else +% \kern\!!heighta +% \fi +% \else +% \kern\!!heighta +% \fi +% \fi +% % == \forgetsidefloats +% \global\sidefloatvsize\nofloatvsize +% \global\floatshortfalse +% \global\floatflagfalse} + +\newif\iftracesidefloats + +\def\flushsidefloats + {\par + \!!heighta\sidefloatvsize + \advance\!!heighta -\pagetotal + \ifnum\!!heighta>\zeropoint + \global\advance\sidefloatvsize -\sidefloatbottomskip + \ifdim\!!heighta>\zeropoint + \bgroup + \let\flushsidefloats\relax + \forgetall + \doloop + {\strut + \iftracesidefloats + \color[darkgray]% + {\baselinerulefalse + \boxrulewidth.5\points + \ruledhbox{\strut\kern\sidefloatwidth}}% + \fi + \par + \!!heighta\sidefloatvsize + \advance\!!heighta -\pagetotal + \ifdim\!!heighta>\zeropoint + \ifnum\recurselevel>\plushundred + \exitloop + \fi + \else + \exitloop + \fi}% + \egroup + \ifdim\parskip>\zeropoint + \ifdim\sidefloatbottomskip>\parskip + \nowhitespace + \vskip\sidefloatbottomskip + \fi + \fi + \else\ifdim\sidefloatbottomskip>\parskip + \vskip\sidefloatbottomskip + \fi\fi + \fi + % not entirely the same as \forgetsidefloats + \global\sidefloatvsize\nofloatvsize + % \global\sidefloatsidelines\zerocount % no, we flush before a side float + \global\floatshortfalse % so this will get lost + % also here if used at all \global\holdinginserts\zerocount + \global\floatflagfalse} + +\def\flushsidefloatsafterpar + {\xdef\oldpagetotal{\the\pagetotal}% + \gdef\checksidefloat + {\dochecksidefloat + \ifdim\oldpagetotal=\pagetotal \else + \global\let\checksidefloat\dochecksidefloat + \flushsidefloats + \global\sidefloatsidelines\zerocount % here ! + \fi}} + +\def\forgetsidefloats + {\global\sidefloatvsize\nofloatvsize + \global\sidefloatsidelines\zerocount + % also here if used at all \global\holdinginserts\zerocount + \global\floatshortfalse + \global\floatflagfalse} + +\let\logsidefloat=\relax + +\def\pushpenalties % needed ? and right + {\widowpenalty\plusone + \clubpenalty\plustwo + \brokenpenalty\plusone + \let\pushpenalties\relax + \edef\poppenalties + {\widowpenalty \the\widowpenalty + \clubpenalty \the\clubpenalty + \brokenpenalty\the\brokenpenalty + \let\poppenalties\relax}} + +% shouldn;t that be: +% +% \def\pushpenalties % needed? +% {\let\pushpenalties\relax +% \edef\poppenalties +% {\widowpenalty \the\widowpenalty +% \clubpenalty \the\clubpenalty +% \brokenpenalty\the\brokenpenalty +% \let\poppenalties\relax}% +% \widowpenalty\plusone +% \clubpenalty\plustwo +% \brokenpenalty\plusone} + +\let\poppenalties=\relax + +\def\restorepenalties + {\ifnum\outputpenalty=\!!tenthousand\else + \penalty\outputpenalty + \fi} + +\def\sidefloatoutput + {\iffloatshort + \unvbox\normalpagebox + \setbox\floatbottom\lastbox + \ifdim\wd\floatbottom>\sidefloathsize + \penalty-201 + \box\floatbottom + \else + \ifvoid\floatbottom + \else + \restoreleftindent + \ifdim\wd\floatbottom<\sidefloathsize + \parskip\zeropoint + %\noindent + \ifinner\else\vadjust{\penalty\minusone}\fi + \iffloatlefteqo + \global\floatlefteqofalse + \else + \global\advance\sidefloathsize -\wd\floatbottom + \iffloatrighteqo + \global\floatrighteqofalse + \else + \global\divide\sidefloathsize \plustwo + \fi + \hskip\sidefloathsize + \fi + \fi + \box\floatbottom + \restorepenalties + \fi + \fi + % why was this \global\holdinginserts\zerocount + \global\floatshortfalse + \else + \finalsidefloatoutput % new + \global\sidefloatvsize\nofloatvsize + \global\sidefloatsidelines\zerocount + % we can end up in fig lock, so \global\holdinginserts\zerocount here too ? + \poppenalties + \fi} + +\def\finalsidefloatoutput% new + {\finaloutput\unvbox\normalpagebox} + +\def\restoreleftindent + {\relax \ifnum\sidefloattype>4 \else + \parskip\zeropoint % here ? + \ifdim\sidefloatwidth>\zeropoint % new, see prikkels + \noindent + \ifinner\else\vadjust{\penalty\minusone}\fi + \hskip\sidefloatwidth + %\else + % we have a margin or edge float + \fi + \fi} + +\ifx\normaleqno\undefined + + \def\normaleqno + {\iffloatshort + \global\floatrighteqotrue + \fi + \floatrighteqo} + +\else + + \def\eqno + {\iffloatshort + \global\floatrighteqotrue + \fi + \floatrighteqo} + +\fi + +% externfiguur -> grid =ja|hoogte|diepte|halveregel|passend -> helemaal in details +% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details' + +% replacement for below +% +% \global\setbox\floatbox\hbox % no \hskip, but \kern here +% {\ifcase\sidefloattype +% \vbox{#1}% +% \or % 1 +% \hskip\sidefloatleftshift +% \hskip\sidefloatshift +% \vbox{#1}% +% \kern-\sidefloatextrashift +% \or % 2 +% \hskip\sidefloatshift +% \vbox{#1}% +% \kern-\sidefloatextrashift +% \or % 3 +% \hskip\sidefloatshift +% \vbox{#1}% +% \kern-\sidefloatextrashift +% \or % 4 +% \hskip\sidefloatleftshift +% \hskip\sidefloatshift +% \vbox{#1\removedepth}% +% \kern-\sidefloatextrashift +% \or % 5 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \kern\sidefloatrightshift +% \or % 6 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \or % 7 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \or % 8 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \kern\sidefloatrightshift +% \fi}% +% +% keep this ^ + +\def\putsidefloat#1% grid (4) is rather experimental + {\par + \whitespace + % moved here dec 2001 + {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved + \checksidefloatshift + \ifdim\sidefloatshift=\zeropoint \relax + \ifnum\sidefloattype=4 + \global\advance\sidefloatshift\sidefloatextrashift + \global\sidefloatextrashift\zeropoint + \else\ifnum\sidefloattype=5 + \global\advance\sidefloatshift\sidefloatextrashift + \global\sidefloatextrashift\zeropoint + \fi\fi + \else + \ifnum\sidefloattype<4 + \global\chardef\sidefloattype4 + \else\ifnum\sidefloattype>5 + \global\chardef\sidefloattype5 + \fi\fi + \fi + \previoussidefloat + \stallsidefloat + %\global\setbox\floatbox\hbox + % {\ifmarginfloat\else\ifrightfloat\else\kern\sidefloatleftshift\fi\fi + % \hskip\ifrightfloat-\sidefloatextrashift\else\sidefloatshift\fi + % \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}% + % \kern\ifrightfloat\sidefloatshift\else-\sidefloatextrashift\fi + % \ifmarginfloat\else\ifrightfloat\kern\sidefloatrightshift\fi\fi}% + \global\setbox\floatbox\hbox % no \hskip, but \kern here + {\ifnum\sidefloattype=4 + \hskip\sidefloatleftshift + \else\ifnum\sidefloattype=1 + \hskip\sidefloatleftshift + \fi\fi + \ifnum\sidefloattype>4 + \hskip-\sidefloatextrashift + \else + \hskip\sidefloatshift + \fi + \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}% + \ifnum\sidefloattype>4 + \kern\sidefloatshift + \else + \kern-\sidefloatextrashift + \fi + \ifnum\sidefloattype=8 + \kern\sidefloatrightshift + \else\ifnum\sidefloattype=5 + \kern\sidefloatrightshift + \fi\fi}% + \ifnum\sidefloatalign=4 + \getnoflines{\ht\floatbox}% + \scratchdimen\noflines\lineheight + \advance\scratchdimen-\strutdepth + \getrawnoflines\sidefloattopskip + \advance\scratchdimen\noflines\lineheight + % todo: maybe rounding problem here + % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}% + \global\setbox\floatbox\hbox{\lower\strutdepth\box\floatbox}% + \global\ht\floatbox\scratchdimen + \global\dp\floatbox\zeropoint + \fi + \ifcase\sidefloatalign \else + \global\sidefloattopskip\zeropoint + \fi + \scratchdimen + \ifnum\sidefloattype<4 + \sidefloattopskip + \else\ifnum\sidefloattype>5 + \sidefloattopskip + \else + \zeropoint + \fi\fi + % the top of the box is at the previous baseline + \ifcase\sidefloatalign + % 0 normal + \advance\scratchdimen\strutdepth % == \sidefloattopoffset + \or % 1 height + \advance\scratchdimen\strutdepth % == \sidefloattopoffset + \or % 2 line + \or % 3 depth + \advance\scratchdimen\lineheight + \advance\scratchdimen\strutdepth + \or % 4 grid + \scratchdimen\zeropoint + \or + \advance\scratchdimen\strutheight + \fi + % new + \global\sidefloatlinesdone\zerocount + \ifnum\sidefloatsidelines>\zerocount + \advance\scratchdimen\sidefloatsidelines\lineheight + \fi + % new + \global\setbox\floatbox\hbox + {\vbox + {\vskip\scratchdimen + \nointerlineskip + \box\floatbox + \ifnum\sidefloatalign=5 \vskip-\lineheight \fi}}% + \ifnum\sidefloattype<4 + \global\sidefloattopskip\zeropoint + \else\ifnum\sidefloattype>5 + \global\sidefloattopskip\zeropoint + \fi\fi + \global\sidefloatdownshift\zeropoint + \measuresidefloat + \ifroomforfloat \else + \tosssidefloat + \measuresidefloat + \stallsidefloat + \fi + \setsidefloat} + +\def\progresssidefloat + {\sidefloatprogress\sidefloatvsize + \iffloatflag + \advance\sidefloatprogress -\sidefloatpagetotal + \global\floatflagfalse + \else + \advance\sidefloatprogress -\pagetotal + \fi} + +\def\tosssidefloat + {\vfill\eject} + +\def\measuresidefloat + {\global\floatflagtrue + \global\sidefloatpagetotal \pagetotal % global + \ifnum\sidefloattype<4 + \global \sidefloatwidth \zeropoint + \else\ifnum\sidefloattype>5 + \global \sidefloatwidth \zeropoint + \else + \global \sidefloatwidth \wd\floatbox + \global\advance\sidefloatwidth \floatsideskip + \fi\fi + \ifdim\sidefloatwidth<\zeropoint + \global\sidefloatwidth\zeropoint + \fi + \global \sidefloathsize \hsize + \global\advance\sidefloathsize -\sidefloatwidth + \global \sidefloatheight \ht\floatbox + \global\advance\sidefloatheight \dp\floatbox + \global\advance\sidefloatheight \sidefloattopskip + \global \sidefloatvsize \sidefloatheight + \global\advance\sidefloatvsize \sidefloatpagetotal + \dimen0\sidefloatvsize + \dimen2\pagegoal + \relax + \ifcase\sidefloatmethod + % method 0 : raw + \or + % method 1 : safe + \dimen2 .99\pagegoal + \or + % method 2 : tight + \advance\dimen0 -\onepoint + \fi + \relax % really needed ! ! ! ! + \ifdim\dimen0>\dimen2 + \global\roomforfloatfalse + \else + \dimen0=\pagegoal + \advance\dimen0 -\sidefloatvsize + \ifdim\dimen0<\sidefloatbottomskip + \global\advance\sidefloatvsize \dimen0 + \global\floatshorttrue + \pushpenalties + % why was this \global\holdinginserts\plusone + \else + \global\advance\sidefloatvsize \sidefloatbottomskip + \global\floatshortfalse + \fi + \global\roomforfloattrue + \fi} + +\def\setsidefloat% nilling everypar saves time and redudant pos's + {% removed here dec 2001 + % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% + \ifnum\sidefloattype=4 \kern\sidefloattopskip \fi + \ifnum\sidefloattype=5 \kern\sidefloattopskip \fi + \edef\presidefloatdepth{\the\prevdepth}% + \nointerlineskip + \bgroup + \everypar\emptytoks + \parskip\zeropoint + %\checksidefloatshift + \setsidefloatskips + \logsidefloat + \relax + \ifcase\sidefloattype + % invalid + \or % backspace + \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill + \or % leftedge + \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill + \or % leftmargin + \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill + \or % leftside + \noindent\box\floatbox\hfill + \or % rightside + \hfill\box\floatbox + \or % rightmargin + \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}% + \or % rightedge + \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}% + \or % cutspace + \hfill\rlap{\hskip\sidefloatrightskip\llap{\box\floatbox}}% + \fi + \egroup + \par + \kern-\sidefloatheight + \penalty10001 % oeps, this will change + \normalbaselines + \prevdepth\presidefloatdepth + % \noindent + \resetsidefloatparagraph + \ignorespaces} % not really needed + +\newcount\sidefloatparagraph + +\def\iffirstsidefloatparagraph + {\ifcase\sidefloatparagraph\or} + +% without sidefloat lines +% +% \def\setsidefloatparagraph +% {%\advance\sidefloatprogress \sidefloatbottomskip +% %\!!counta\sidefloatprogress +% \scratchdimen\sidefloatprogress +% \advance\scratchdimen \strutht +% \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors +% \!!counta\scratchdimen +% \divide\!!counta \baselineskip +% \ifnum\!!counta>0 +% \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth +% \hangafter-\!!counta +% \fi +% \global\advance\sidefloatparagraph \plusone +% \iftracesidefloats +% \hskip-\sidefloatwidth +% \color[darkgray]% +% {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth +% %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}% +% \llap{\showstruts\strut\hskip.25\bodyfontsize}}% +% \fi} + +\def\setsidefloatparagraph + {%\advance\sidefloatprogress \sidefloatbottomskip + %\!!counta\sidefloatprogress + \scratchdimen\sidefloatprogress + \advance\scratchdimen \strutht + \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors + \!!counta\scratchdimen + \divide\!!counta \baselineskip\relax + \ifnum\!!counta>0 + % new from here + \ifcase\sidefloatsidelines\else + \ifcase\sidefloatlinesdone + \global\sidefloatlinesdone\!!counta + \else + \scratchcounter\sidefloatlinesdone + \advance\scratchcounter-\!!counta + \global\advance\sidefloatsidelines-\scratchcounter + \fi + \fi + \ifnum\sidefloatsidelines>\zerocount + \scratchtoks\emptytoks + \scratchcounter\sidefloatsidelines + \scratchdimen\hsize + \advance\scratchdimen-\sidefloatwidth + \dorecurse\sidefloatsidelines + {\appendtoks \zeropoint \hsize \to \scratchtoks}% + \ifnum\!!counta>\sidefloatsidelines + \advance\!!counta -\sidefloatsidelines\relax + \advance\scratchcounter\!!counta + \dorecurse\!!counta + {\ifnum\sidefloattype>4 + \appendtoks \zeropoint \scratchdimen \to \scratchtoks + \else + \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks + \fi}% + \fi + \advance\scratchcounter \plusone + \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax + \else + % new till here + \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth + \hangafter-\!!counta + \fi + \fi + \global\advance\sidefloatparagraph \plusone + \iftracesidefloats + \hskip-\sidefloatwidth + \color[darkgray]% + {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth + %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}% + \llap{\showstruts\strut\hskip.25\bodyfontsize}}% + \fi} + +\def\resetsidefloatparagraph + {\global\sidefloatparagraph\zerocount } + +\def\dochecksidefloat + {\progresssidefloat + \ifdim\sidefloatprogress>\zeropoint + \setsidefloatparagraph + \else + \resetsidefloatparagraph + \fi + \parskip\ctxparskip} + +\def\checksidefloat + {\dochecksidefloat} + +\def\synchronizesidefloats + {\ifinner \else \checksidefloat \fi} + +\def\doadjustsidefloatdisplaylines + {\par + \vskip-\parskip + \noindent + \ignorespaces} + +\def\adjustsidefloatdisplaylines + {\aftergroup\doadjustsidefloatdisplaylines} + +\def\previoussidefloat + {\progresssidefloat + \ifdim\sidefloatprogress>\zeropoint \relax + \iffloatshort + \global\floatshortfalse + \tosssidefloat + \else + \kern\sidefloatprogress + \fi + \fi} + +\def\stallsidefloat + {\!!counta\pageshrink + \divide\!!counta \baselineskip + \advance\!!counta \plusone + \parskip\zeropoint + \dorecurse\!!counta{\line{}} + \kern-\!!counta\baselineskip + \penalty\zerocount } + +% We need to hook it into the other otr's. This code will move. + +\let\OTRONEflushsidefloats \flushsidefloats +\let\OTRONEsynchronizesidefloats\synchronizesidefloats + +% page-set +% +% \let\OTRSETflushsidefloats \forgetsidefloats +% \let\OTRSETsynchronizesidefloats\forgetsidefloats + +% page-mul +% +% \let\OTRMULflushsidefloats \forgetsidefloats +% \let\OTRMULsynchronizesidefloats\forgetsidefloats + +\def\synchronizesidefloats{\OTRcommand\synchronizesidefloats} +\def\flushsidefloats {\OTRcommand\flushsidefloats} + +\protect \endinput diff --git a/tex/context/base/page-spr.tex b/tex/context/base/page-spr.mkii index 06947a36a..06947a36a 100644 --- a/tex/context/base/page-spr.tex +++ b/tex/context/base/page-spr.mkii diff --git a/tex/context/base/page-spr.mkiv b/tex/context/base/page-spr.mkiv new file mode 100644 index 000000000..4436ddcc2 --- /dev/null +++ b/tex/context/base/page-spr.mkiv @@ -0,0 +1,103 @@ +%D \module +%D [ file=page-spr, +%D version=2002.11.11, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Spreading, +%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 Page Macros / Spreading} + +% This module is experimental and not yet official! + +\unprotect + +\newbox\spreadbox +\newif \ifinspread + +\chardef\showspreadmode\plusone + +% beware, ugly overload, to be redone + +\def\normalsettextpagecontent#1#2#3% #2 and #3 will disappear + {\setbox#1\hbox + {\setlayoutcomponentattribute\v!page\v!text + \vbox \layoutcomponentboxattribute to \textheight + {\offinterlineskip + \freezetextwidth + \hsize\textwidth % local variant of \sethsize + \boxmaxdepth\maxdepth + \noindent % content can be < \hsize + \dopagecontents#2#3}}% + \dp#1\zeropoint + \setbox#1\hbox to \makeupwidth + {\ifinspread + \ifvoid\spreadbox + \global\setbox\spreadbox\box#1% + \copy\spreadbox\hss % left page + \else + % prevent duplicate writes in normal run + \ifarrangingpages \else \ifcase\showspreadmode + \global\setbox\spreadbox\null + \wd\spreadbox\makeupwidth + \ht\spreadbox\textheight + \fi \fi + \hss\box\spreadbox % right page + \fi + \else + \hss\box#1\hss % never change the \hss's + \fi}} + +\def\doflushspread + {\ifinspread \ifvoid\spreadbox\else + % this page will be discarded later + \null \page + \fi \fi } + +\def\startspread + {\bgroup + \ifdoublesided + \page[\v!left]% + %\setsystemmode{spread}% + \inspreadtrue + \expanded{\setuplayout[\c!textwidth=\the\dimexpr2\textwidth+2\backspace\relax]}% + \def\startspread{\bgroup\let\stopspread\egroup}% + \let\stopspread\dostopspread + \else + \let\stopspread\egroup + \fi} + +\let\stopspread\relax + +\def\dostopspread + {\kern\zeropoint\page + \inspreadfalse + \setuplayout[\c!textwidth=\textwidth] + \page[\v!left] + \egroup} + +\protect \endinput + +% texexec --arr --pdf test +% +% \setuplayout[width=middle] +% \setuppapersize[A4][A3,landscape] +% \setuppagenumbering[alternative=doublesided] +% \setuparranging[2UP] +% +% \starttext +% +% \dorecurse{3}{\input tufte } +% +% \startspread +% \dorecurse{10}{\input tufte } +% \stopspread +% +% \dorecurse{3}{\input tufte } +% +% \stoptext diff --git a/tex/context/base/page-str.tex b/tex/context/base/page-str.mkii index 2fb53bc6a..cfaebe398 100644 --- a/tex/context/base/page-str.tex +++ b/tex/context/base/page-str.mkii @@ -23,6 +23,8 @@ %D These macros were written while listening to and watching the DVD %D \quotation {Rush In Rio}. +% not yet ok in mkiv ... marknotes + \unprotect % taco, what is the best way to append a otr chunk (insert pagediscards?) @@ -150,19 +152,19 @@ \def\flushmarknotes[#1]% assumes split {\begingroup - \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}% - \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}% - \ifnum\firstmarknote<\lastmarknote\relax - \getvalue{mn:#1\c!before}% - \dostepwiserecurse\firstmarknote\lastmarknote\plusone - {\ifnum\recurselevel>\firstmarknote\relax - \ifnum\recurselevel<\lastmarknote\relax - \getvalue{mn:#1\c!inbetween}% - \fi - \fi - \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}% - \getvalue{mn:#1\c!after}% - \fi +% \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}% +% \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}% +% \ifnum\firstmarknote<\lastmarknote\relax +% \getvalue{mn:#1\c!before}% +% \dostepwiserecurse\firstmarknote\lastmarknote\plusone +% {\ifnum\recurselevel>\firstmarknote\relax +% \ifnum\recurselevel<\lastmarknote\relax +% \getvalue{mn:#1\c!inbetween}% +% \fi +% \fi +% \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}% +% \getvalue{mn:#1\c!after}% +% \fi \endgroup} \def\erasemarknotes[#1]% diff --git a/tex/context/base/page-str.mkiv b/tex/context/base/page-str.mkiv new file mode 100644 index 000000000..e4fd39794 --- /dev/null +++ b/tex/context/base/page-str.mkiv @@ -0,0 +1,380 @@ +%D \module +%D [ file=page-str, +%D version=2006.03.21, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Page Streams, +%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. + +\writestatus{loading}{ConTeXt Page Macros / Page Streams} + +%D The first version of this component of \CONTEXT\ was written +%D for Thomas Schmitz who asked for parallel page streams. While +%D playing with the code, I decided to make it into a component +%D that can be used to construct all kind of stream related +%D mechanisms. Because I could apply this feature in a project, +%D there is some additional code here (related to graphics). +%D +%D These macros were written while listening to and watching the DVD +%D \quotation {Rush In Rio}. + +% not yet ok in mkiv ... marknotes .. will be completely redone + +\unprotect + +% taco, what is the best way to append a otr chunk (insert pagediscards?) + +\let\currentoutputstream\s!default + +\newtoks\defaultstreamoutput \defaultstreamoutput=\OTRONEoutput + +\newtoks\normalstreamoutput \normalstreamoutput={\saveoutputstream[\currentoutputstream]} + +\newcount\streampenalty \streampenalty=-101010101 + +\ifx\multicolumnseject\undefined \else + \let\normalmulticolumnseject\multicolumnseject + \def\multicolumnseject{\ifinoutputstream\else\normalmulticolumnseject\fi} +\fi + +\newif\ifinoutputstream + +\newtoks \everyenableoutputstream + +\appendtoks + \flushsidefloats +\to \everyenableoutputstream + +\def\enableoutputstream[#1]% + {\the\everyenableoutputstream + \finishoutputstream + \writestatus{otr}{switching to output stream #1}% + \inoutputstreamtrue + \xdef\currentoutputstream{#1}} + +\def\disableoutputstream + {\finishoutputstream + \writestatus{otr}{switching to default output stream}% + \inoutputstreamfalse + \global\let\currentoutputstream\s!default} + +\def\useoutputstream[#1]% + {\writestatus{otr}{using output stream #1}% + \xdef\currentoutputstream{#1}} + +\def\handlestreamoutput + {\ifx\currentoutputstream\s!default % already expanded + \ifnum\outputpenalty=\streampenalty + \ifvoid\normalpagebox \else + \unvbox\normalpagebox + \fi + \else + \the\defaultstreamoutput + \fi + \else + \the\normalstreamoutput + \fi} + +\OTRONEoutput{\handlestreamoutput} + +\def\defineoutputstream[#1]% + {\doifundefined{otrs:#1}{\expandafter\newbox\csname otrs:#1\endcsname}} + +\def\outputstreamtag#1% + {\csname otrs:#1\endcsname} + +\def\finishoutputstream % todo: installoutput + {\endgraf + \penalty\streampenalty + \endgraf} + +\def\saveoutputstream[#1]% + {\writestatus{otr}{saving otr stream #1}% + \ifvoid\normalpagebox + \global\setbox\outputstreamtag{#1}\emptybox + \else + \global\setbox\outputstreamtag{#1}\vbox + {\presetoutputstream + \ifvoid\outputstreamtag{#1}\else\unvbox\outputstreamtag{#1}\fi + \scratchdimen\dp\normalpagebox + \unvbox\normalpagebox + \vskip-\scratchdimen + \kern\strutdepth}% + \fi} + +% \def\presetoutputstream +% {\pdffirstlineheight\strutheight +% \pdflastlinedepth \strutdepth +% \pdfeachlineheight \strutheight +% \pdfeachlinedepth \strutdepth} + +\let\presetoutputstream\relax + +\def\outputstreamht [#1]{\ht\outputstreamtag{#1}} +\def\outputstreamdp [#1]{\dp\outputstreamtag{#1}} +\def\outputstreamwd [#1]{\wd\outputstreamtag{#1}} + +%def\outputstreambox [#1]{\ifvoid\outputstreamtag{#1}\else\box \outputstreamtag{#1}\fi} +%def\outputstreamcopy[#1]{\ifvoid\outputstreamtag{#1}\else\copy\outputstreamtag{#1}\fi} + +\def\dowithoutputstreambox#1[#2]{\ifvoid\outputstreamtag{#2}\else#1\outputstreamtag{#2}\fi} + +\def\outputstreamcopy {\dowithoutputstreambox\copy } +\def\outputstreambox {\dowithoutputstreambox\box } +\def\outputstreamunvcopy{\dowithoutputstreambox\unvcopy} +\def\outputstreamunvbox {\dowithoutputstreambox\unvbox } + +%D Footnotes don't go along with streams, simply because there is no +%D way to re-split inserts. A dirty way out is to use marks and store +%D notes that way. + +% not mkiv ready yet + +\def\definemarknote + {\dodoubleempty\dodefinemarknote} + +\def\dodefinemarknote[#1][#2]% + {\definemarking[mn:#1]% + \setvalue{mn:#1:n}{0}% + \getparameters + [mn:#1] + [\c!before=, + \c!after=, + \c!inbetween=\endgraf, + \c!command=\firstofoneargument, + #2]} + +\def\setmarknote[#1]#2% + {\doglobal\incrementvalue{mn:#1:n}% + \setgvalue{mn:#1:t:\getvalue{mn:#1:n}}{#2}% + \expanded{\marking[mn:#1]{\getvalue{mn:#1:n}}}} + +\def\flushmarknotes[#1]% assumes split + {\begingroup +% \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}% +% \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}% +% \ifnum\firstmarknote<\lastmarknote\relax +% \getvalue{mn:#1\c!before}% +% \dostepwiserecurse\firstmarknote\lastmarknote\plusone +% {\ifnum\recurselevel>\firstmarknote\relax +% \ifnum\recurselevel<\lastmarknote\relax +% \getvalue{mn:#1\c!inbetween}% +% \fi +% \fi +% \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}% +% \getvalue{mn:#1\c!after}% +% \fi + \endgroup} + +\def\erasemarknotes[#1]% + {\begingroup + \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}% + \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}% + \dostepwiserecurse\firstmarknote\lastmarknote\plusone + {\global\letvalue{mn:#1:t:\recurselevel}\empty}% + \endgroup} + +%D The next section implements synchronization of (currently +%D two) output streams. In due time we will implement both a +%D vertical and horizontal system, as well as alternative +%D splitters (firstpagevsize, succesivevsize etc). + +\def\synchronizeoutputstreams[#1]% [one,two] [left,right] + {\bgroup + \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement + \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement + \forgeteverypar + \def\roundingeps{50sp}% + \getboxheight\dimen0\of\box\outputstreamtag\firstoutputstream + \getboxheight\dimen2\of\box\outputstreamtag\secondoutputstream + \scratchdimen\dimexpr\dimen0-\dimen2\relax + \ifdim\scratchdimen<-\roundingeps\relax + \scratchdimen-\scratchdimen + \writestatus{sync}{compensating first stream: \the\scratchdimen/\number\scratchdimen}% + \getroundednoflines\scratchdimen + \global\setbox\outputstreamtag\firstoutputstream\vbox + {\presetoutputstream + \unvbox\outputstreamtag\firstoutputstream\dorecurse\noflines\crlf}% + \else\ifdim\scratchdimen>\roundingeps\relax + \writestatus{sync}{compensating second stream: \the\scratchdimen/\number\scratchdimen}% + \getroundednoflines\scratchdimen + \global\setbox\outputstreamtag\secondoutputstream\vbox + {\presetoutputstream + \unvbox\outputstreamtag\secondoutputstream\dorecurse\noflines\crlf}% + \else + \writestatus{sync}{no need to compensate streams: \the\scratchdimen/\number\scratchdimen}% + \fi\fi + \egroup} + +\def\nofoutputstreamsplitlines {\v!auto} % {40} +\def\outputstreamsplittolerance {-5} + +\def\flushoutputstreampages[#1]% + {\bgroup + \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement + \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement + \doloop + {\flushoutputstreams[#1]% + \ifvoid\outputstreamtag\firstoutputstream + \ifvoid\outputstreamtag\secondoutputstream + \exitloop + \else + \global\setbox\outputstreamtag\firstoutputstream\vbox{\strut}% + \fi + \else + \ifvoid\outputstreamtag\secondoutputstream + \global\setbox\outputstreamtag\secondoutputstream\vbox{\strut}% + \else + % okay + \fi + \fi}% + \egroup} + +\def\flushoutputstreams[#1]% + {\bgroup + \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement + \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement + \doif\nofoutputstreamsplitlines\v!auto + {\getrawnoflines\textheight + \edef\nofoutputstreamsplitlines{\the\noflines}}% + \splittopskip\strutheight + \scratchdimen\nofoutputstreamsplitlines\lineheight\relax + \unless\iffalse + \dimen0\scratchdimen + \doloop + {\setbox4\copy\outputstreamtag\firstoutputstream + \setbox0\vsplit4 to \dimen0 + \setbox0\vbox + {\directsetup{stream:\firstoutputstream:top}% + \unvbox0 + \directsetup{stream:\firstoutputstream:bottom}}% + \ifdim\ht0>\scratchdimen + \advance\dimen0-\lineheight + \else + \exitloop + \fi}% + \scratchdimen\dimen0 + \dimen2\scratchdimen + \doloop + {\setbox6\copy\outputstreamtag\secondoutputstream + \setbox2\vsplit6 to \dimen2 + \setbox2\vbox + {\directsetup{stream:\secondoutputstream:top}% + \unvbox0 + \directsetup{stream:\secondoutputstream:bottom}}% + \ifdim\ht2>\scratchdimen + \advance\dimen2-\lineheight + \else + \exitloop + \fi}% + \scratchdimen\dimen2 + \fi + \setbox4\copy\outputstreamtag\firstoutputstream + \setbox6\copy\outputstreamtag\secondoutputstream + \scratchcounter\zerocount + \doloop + {\setbox0\vsplit4 to \scratchdimen + \setbox0\vbox{\unvbox0}% + \setbox2\vsplit6 to \scratchdimen + \setbox2\vbox{\unvbox2}% + \ifvoid4 + \exitloop + \else\ifvoid6 + \exitloop + \else + \dimen8=\dimexpr\ht4-\ht6\relax + \ifdim\dimen8<\zeropoint\dimen8=-\dimen8\relax\fi + \advance\scratchcounter\plusone + \ifdim\dimen8<.5\lineheight + \exitloop + \else\ifnum\outputstreamsplittolerance>\zeropoint + \ifnum\scratchcounter>\outputstreamsplittolerance\relax + \exitloop + \else + \advance\scratchdimen\lineheight + \fi + \else\ifnum\outputstreamsplittolerance<\zeropoint + \ifnum-\scratchcounter<\outputstreamsplittolerance\relax + \exitloop + \else + \advance\scratchdimen-\lineheight + \fi + \else\ifnum\outputstreamsplittolerance=\zeropoint + \exitloop + \fi\fi\fi\fi + \fi\fi}% + \setbox0\vsplit\outputstreamtag\firstoutputstream to \scratchdimen + \setbox0\vbox to \textheight + {\presetoutputstream + \directsetup{stream:\firstoutputstream:top}% + \unvbox0 + \vfill + \directsetup{stream:\firstoutputstream:bottom}}% + \setbox2\vsplit\outputstreamtag\secondoutputstream to \scratchdimen + \setbox2\vbox to \textheight + {\presetoutputstream + \directsetup{stream:\secondoutputstream:top}% + \unvbox2 + \vfill + \directsetup{stream:\secondoutputstream:bottom}}% + \directsetup{stream:\firstoutputstream:reset}% + \directsetup{stream:\secondoutputstream:reset}% + \page[even] + \box0\vfill\page + \box2\vfill\page + \egroup} + + %D Although one can put floats in a stream, it sometimes makes sense + %D to keep them apart and this is what local floats do. + + \def\setuplocalfloats + {\getparameters[\??lf]} + + \setuplocalfloats + [%before=\blank, + %after=\blank, + inbetween=\blank] + + \installfloathandler \v!local \somelocalfloat + + \initializeboxstack{localfloats} + + \newcounter\noflocalfloats + + \def\resetlocalfloats + {\doglobal\newcounter\noflocalfloats + \initializeboxstack{localfloats}} + + \def\somelocalfloat[#1]% + {\doglobal\increment\noflocalfloats + \savebox{localfloats}{\noflocalfloats}{\box\floatbox}} + + \def\getlocalfloats + {\dorecurse\noflocalfloats + {\ifnum\recurselevel=\plusone % 1\relax + \getvalue{\??lf\c!before}% + \else + \getvalue{\??lf\c!inbetween}% + \fi + \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}% + \ifnum\recurselevel=\noflocalfloats\relax + \getvalue{\??lf\c!after}% + \fi}} + + \def\flushlocalfloats + {\getlocalfloats + \resetlocalfloats} + + \def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}} + + \def\forcelocalfloats{\let\forcedfloatmethod\v!local} + +%D Because many arrangements are possible, we will implement +%D some examples in a runtime loadable module \type {m-streams}. + +\protect \endinput diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv index ab0370316..f4e2d76f9 100644 --- a/tex/context/base/page-txt.mkiv +++ b/tex/context/base/page-txt.mkiv @@ -19,8 +19,6 @@ \unprotect -\let\dodummypageskip\gobbleoneargument % obsolete - %D Interfacing between this and other modules is handled by %D the following macros. The current state of a text line %D (header, footer, etc.) is checked by: @@ -74,16 +72,18 @@ \getparameters[\??tk#1#2][#3]% \else %\getparameters[\??tk#1\v!text][#2]% - \edef\previoustextstate{\getvalue{\??tk#1\c!state}}% + \edef\previoustextstate{\csname\??tk#1\c!state\endcsname}% \getparameters[\??tk#1][#2]% - \doifnotvalue{\??tk#1\c!state}\previoustextstate - {%\checkcurrentlayout % no - \edef\currenttextstate{\getvalue{\??tk#1\c!state}}% - % speed optimization (calculating backgrounds takes time) - \doifcommon{\previoustextstate,\currenttextstate}{\v!high,\v!none} - {\calculatevsizes - \recalculatebackgrounds - \recalculatelogos}}% + \edef\currenttextstate{\csname\??tk#1\c!state\endcsname}% + \ifx\currenttextstate\previoustextstate + % no change in state + \else + %\checkcurrentlayout % no + % speed optimization (calculating backgrounds takes time) + \doifcommon{\previoustextstate,\currenttextstate}{\v!high,\v!none} + {\calculatevsizes + \recalculatebackgrounds}% + \fi \fi} \def\setuptop {\dotripleempty\dosetuplayouttext[\v!top]} @@ -125,11 +125,11 @@ %D \showsetup{setupfootertexts} %D \showsetup{setupbottomtexts} -\def\setuptoptexts {\dosixtupleempty\dosetuptexts[\v!top]} -\def\setupheadertexts {\dosixtupleempty\dosetuptexts[\v!header]} -\def\setuptexttexts {\dosixtupleempty\dosetuptexts[\v!text]} +\def\setuptoptexts {\dosixtupleempty\dosetuptexts[\v!top ]} +\def\setupheadertexts {\dosixtupleempty\dosetuptexts[\v!header ]} +\def\setuptexttexts {\dosixtupleempty\dosetuptexts[\v!text ]} \def\setupfootertexts {\dosixtupleempty\dosetuptexts[\v!footer ]} -\def\setupbottomtexts {\dosixtupleempty\dosetuptexts[\v!bottom]} +\def\setupbottomtexts {\dosixtupleempty\dosetuptexts[\v!bottom ]} %D The left, right and center variables can also be set %D directly using the previously discussed macros. @@ -137,97 +137,78 @@ \def\dosetuptexts[#1][#2][#3][#4][#5][#6]% {\ifsixthargument \setvalue{\??tk#1#2\c!lefttext}% - {\dodoubletexts{\??tk#1}{#2}% + {\dodoubletexts{#1}{#2}% {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}% {\c!rightstyle\c!rightcolor\c!rightwidth}{#6}}% \setvalue{\??tk#1#2\c!righttext}% - {\dodoubletexts{\??tk#1}{#2}% + {\dodoubletexts{#1}{#2}% {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}% {\c!leftstyle \c!leftcolor \c!leftwidth }{#5}}% \else\iffifthargument \setvalue{\??tk#1\v!text\c!lefttext}% - {\dodoubletexts{\??tk#1}\v!text + {\dodoubletexts{#1}\v!text {\c!leftstyle \c!leftcolor \c!leftwidth }{#2}% {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}% \setvalue{\??tk#1\v!text\c!righttext}% - {\dodoubletexts{\??tk#1}\v!text + {\dodoubletexts{#1}\v!text {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}% {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}}% \else\iffourthargument \setvalue{\??tk#1#2\c!lefttext}% - {\dodoubletexts{\??tk#1}{#2} + {\dodoubletexts{#1}{#2} {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}% {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}}% \setvalue{\??tk#1#2\c!righttext}% - {\dodoubletexts{\??tk#1}{#2} + {\dodoubletexts{#1}{#2} {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}% {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}% \else\ifthirdargument \setvalue{\??tk#1\v!text\c!lefttext}% - {\dodoubletexts{\??tk#1}\v!text + {\dodoubletexts{#1}\v!text {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}% {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}}% \setvalue{\??tk#1\v!text\c!righttext}% - {\dodoubletexts{\??tk#1}\v!text + {\dodoubletexts{#1}\v!text {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}% {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}% \else\ifsecondargument % new - \letvalue{\??tk#1\v!text\c!lefttext }\empty - \letvalue{\??tk#1\v!text\c!righttext}\empty - \setvalue{\??tk#1\v!text\c!middletext }% - {\dosingletexts{\??tk#1}\v!text\c!style\c!color\c!width{#2}}% + \letvalue{\??tk#1\v!text\c!lefttext }\empty + \letvalue{\??tk#1\v!text\c!righttext }\empty + \setvalue{\??tk#1\v!text\c!middletext}{\dosingletexts{#1}\v!text\c!style\c!color\c!width{#2}}% \else - \dosixtupleempty\dosetuptexts[#1][\v!text][][][][]% + \dosixtupleempty\dosetuptexts[#1][\v!text ][][][][]% \dosixtupleempty\dosetuptexts[#1][\v!margin][][][][]% - \dosixtupleempty\dosetuptexts[#1][\v!edge ][][][][]% + \dosixtupleempty\dosetuptexts[#1][\v!edge ][][][][]% \fi\fi\fi\fi\fi} %D Left and right texts are swapped on odd and even pages, but %D only when double sided typesetting is enabled. -\def\dodoubletexts#1#2#3#4#5#6% - {\doifoddpageelse - {\dosingletexts{#1}{#2}#3{#4}} % #3 => provides three arguments - {\dosingletexts{#1}{#2}#5{#6}}} % #5 => provides three arguments +\def\dodoubletexts{\doifoddpageelse\dodoubletextsodd\dodoubletextseven} -%D The next macro will be cleaned up amd made less messy and +\def\dodoubletextsodd #1#2#3#4#5#6{\dosingletexts{#1}{#2}#3{#4}} % #3 => provides three arguments +\def\dodoubletextseven#1#2#3#4#5#6{\dosingletexts{#1}{#2}#5{#6}} % #5 => provides three arguments + +%D The next macro will be cleaned up and made less messy and %D dependent. \def\placetextlinestrut#1% {\doifvalue{#1\c!strut}\v!yes{\setstrut\strut}} -% \def\dosingletexts#1#2#3#4#5#6% -% {\bgroup -% \defconvertedargument\ascii{#6}% -% \doifsomething\ascii -% {\doattributes{#1#2}#3#4% -% {\placetextlinestrut{#1}% here ! -% %\doifdefinedelse{\??mk\ascii\c!coupling} % brrr -% \doifelsemarking\ascii -% {\dolimitatetexts{#1#2#5}{\getmarking[\ascii][\v!first]}} -% {\ConvertConstantAfter\doifelse\v!pagenumber{#6} -% \placelocationpagenumber % pretty low level -% {\ConvertConstantAfter\doifelse\v!date{#6} -% {\currentdate} -% {% #6{}{}{} -> {} needed for macros that look -% % ahead, like \uniqueMPgraphic -% \ignorecrlf\dolimitatetexts{#1#2#5}{#6{}{}{}}}}}}}% -% \egroup} - \def\dosingletexts#1#2#3#4#5#6% {\bgroup \defconvertedargument\ascii{#6}% no longer \defconvertedargument \ifx\ascii\empty\else - \dostartattributes{#1#2}#3#4\empty - \placetextlinestrut{#1}% here ! + \dostartattributes{\??tk#1#2}#3#4\empty + \placetextlinestrut{\??tk#1}% here ! \doifelsemarking\ascii - {\dolimitatetexts{#1#2#5}{\getmarking[\ascii][\v!first]}}% + {\dolimitatetexts{\??tk#1#2#5}{\getmarking[\ascii][\v!first]}}% {\ifcsname\??tk->\ascii\endcsname \csname\??tk->\ascii\endcsname \else % #6{}{}{} -> {} needed for macros that look % ahead, like \uniqueMPgraphic - \ignorecrlf\dolimitatetexts{#1#2#5}{#6{}{}{}}% + \ignorecrlf\dolimitatetexts{\??tk#1#2#5}{#6{}{}{}}% \fi}% \dostopattributes \fi @@ -240,7 +221,7 @@ %D length. \def\dolimitatetexts#1#2% - {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\getvalue{#1}}{\unknown}}} + {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\csname#1\endcsname}{\unknown}}} %D The placement of text is hooked into the token lists %D associated to the area at hand. @@ -255,24 +236,15 @@ %D the \type {status} variable. This is handled by the next %D couple of macros. -\def\settextlinestatus #1{\edef\textlinestatus{\csname\??tk#1\c!state\endcsname}} -%def\resettextlinestatus#1{\letgvalue{\??tk#1\c!state}\v!normal} +\def\settextlinestatus#1% + {\edef\textlinestatus{\csname\??tk#1\c!state\endcsname}} \def\resettextlinestatus#1% postpone - {\setgvalue{\??tk#1\s!reset}{\letgvalue{\??tk#1\c!state}\v!normal}} + {\expandafter\gdef\csname\??tk#1\s!reset\endcsname{\global\expandafter\let\csname\??tk#1\c!state\endcsname\v!normal}} \def\placelayouttextline#1% #2 - {\settextlinestatus{#1}% - \csname\string\placelayouttextline - \ifcsname\string\placelayouttextline\textlinestatus\endcsname - \textlinestatus - \else - \s!unknown - \fi - \endcsname{#1}} % {#2} - -% \def\doifelselayouttextline#1% shown or not -% {\doifinsetelse{\getvalue{\??tk#1\c!state}}{\v!normal,\v!start}} + {\settextlinestatus#1% + \csname\??tk::\ifcsname\??tk::\textlinestatus\endcsname\textlinestatus\else\s!unknown\fi\endcsname#1} % {#2} \def\doifelselayouttextline#1% shown or not {\edef\!!stringa{\csname\??tk#1\c!state\endcsname}% @@ -298,50 +270,49 @@ \newconditional\resyncaftertextline -\setvalue{\string\placelayouttextline\v!normal }{\doplacelayouttextline} -\setvalue{\string\placelayouttextline }{\doplacelayouttextline} +% there is no need for {#1} etc since we use symbolic names -\setvalue{\string\placelayouttextline\v!none}#1#2% - {} +\setvalue{\??tk::\v!normal}{\doplacelayouttextline} +\setvalue{\??tk::\empty }{\doplacelayouttextline} -\setvalue{\string\placelayouttextline\v!high}#1#2% - {\global\settrue\resyncaftertextline - \resettextlinestatus{#1}} +\setvalue{\??tk::\v!none }#1#2{} +\setvalue{\??tk::\v!stop }#1#2{} -\setvalue{\string\placelayouttextline\v!empty}#1#2% - {\resettextlinestatus{#1}} +\setvalue{\??tk::\v!high}#1#2% + {\global\settrue\resyncaftertextline + \resettextlinestatus#1} -\setvalue{\string\placelayouttextline\v!start}#1#2% - {\resettextlinestatus{#1}% - \doplacelayouttextline{#1}{#2}} +\setvalue{\??tk::\v!empty}#1#2% + {\resettextlinestatus#1} -\setvalue{\string\placelayouttextline\v!stop}#1#2% - {} +\setvalue{\??tk::\v!start}#1#2% + {\resettextlinestatus#1% + \doplacelayouttextline#1#2} -\setvalue{\string\placelayouttextline\v!nomarking}#1#2% +\setvalue{\??tk::\v!nomarking}#1#2% {\bgroup - \resettextlinestatus{#1}% + \resettextlinestatus#1% \let\dogetmarking\nogetmarking - \doplacelayouttextline{#1}{#2}% + \doplacelayouttextline#1#2% \egroup} -\setvalue{\string\placelayouttextline\s!unknown}#1#2% +\setvalue{\??tk::\s!unknown}#1#2% {\global\settrue\resyncaftertextline \bgroup % new - \resettextlinestatus{#1}% - \getvalue{\??tk#1\textlinestatus}% - \getvalue{\??tk#1\v!text \textlinestatus}% - \getvalue{\??tk#1\v!margin\textlinestatus}% - \getvalue{\??tk#1\v!edge \textlinestatus}% - \doplacelayouttextline{#1}{#2}% + \resettextlinestatus#1% + \csname\??tk#1\textlinestatus\endcsname + \csname\??tk#1\v!text \textlinestatus\endcsname + \csname\??tk#1\v!margin\textlinestatus\endcsname + \csname\??tk#1\v!edge \textlinestatus\endcsname + \doplacelayouttextline#1#2% \egroup} %D The following macro has to be called after a page %D is flushed. \def\resetlayouttextline#1% - {\getvalue {\??tk#1\s!reset}% - \letgvalue{\??tk#1\s!reset}\relax} + {\csname\??tk#1\s!reset\endcsname + \global\expandafter\let\csname\??tk#1\s!reset\endcsname\relax} \def\resetlayouttextlines {\resetlayouttextline\v!top @@ -350,9 +321,8 @@ \resetlayouttextline\v!footer \resetlayouttextline\v!bottom \ifconditional\resyncaftertextline - \doglobal\calculatevsizes + \calculateglobalvsizes \recalculatebackgrounds - \recalculatelogos \global\setfalse\resyncaftertextline \fi} @@ -458,15 +428,9 @@ \egroup \mkprocesspagecontents{#2}% \settextpagecontent\scratchpagebox{#1}{#2}% - \setbox\scratchpagebox\vbox % can we avoid this extra box - {\startlayoutcomponent{textbody}{text body}% - \box\scratchpagebox - \stoplayoutcomponent}% \addtextbackground\scratchpagebox \addtextgridlayer\scratchpagebox - \localstarttextcolor % does not work in mkiv \box\scratchpagebox - \localstoptextcolor % so we have to change this \bgroup \hskip\rightmargindistance \ifdim\rightmarginwidth>\zeropoint @@ -486,17 +450,20 @@ %D The main text area has to be combined with some additional %D (tracing) information. -% will be overloaded in page-lyr +% will be stored as normal and overloaded in page-lyr and later in +% page-spr we overload the the stored version .. evenatually i will +% clear up the experimental mess \def\settextpagecontent#1#2#3% #2 and #3 will disappear {\setbox#1\hbox to \makeupwidth - {\hss % so don't change this - \vbox to \textheight + {\hss % so don't change this + \setlayoutcomponentattribute\v!page\v!text + \vbox \layoutcomponentboxattribute to \textheight {\offinterlineskip \freezetextwidth \hsize\textwidth % local variant of \sethsize \boxmaxdepth\maxdepth - \noindent % content can be < \hsize + \noindent % content can be < \hsize \dopagecontents#2#3}% \hss}% \dp#1\zeropoint} @@ -506,17 +473,17 @@ [grid=red, page=green] -\def\addtextgridlayer#1% tzt run time +\def\addtextgridlayer#1% to be checked for color and layer {\ifcase\showgridstate\else % 1=bottom 2=top - \setgridbox\scratchbox\makeupwidth\textheight + \startcolor[layout:grid]% + \setgridbox\scratchbox\makeupwidth\textheight % todo: check color \setbox#1\hbox {\ifcase\showgridstate\or\or\box#1\hskip-\makeupwidth\fi \bgroup % color - \startlayoutcomponent{gridcolumns}{grid columns}% - \incolortrue \ifcase\layoutcolumns\else \gray - \hbox to \makeupwidth + \setlayoutcomponentattribute\v!grid\v!columns + \hbox \layoutcomponentboxattribute to \makeupwidth {\dorecurse\layoutcolumns {\hskip\layoutcolumnwidth \ifnum\recurselevel<\layoutcolumns @@ -527,12 +494,11 @@ \fi}}% \hskip-\makeupwidth \fi - \stoplayoutcomponent - \startlayoutcomponent{gridlines}{grid lines}% - \startcolor[layout:grid]\box\scratchbox\stopcolor - \stoplayoutcomponent + \setlayoutcomponentattribute\v!grid\v!lines + \hbox \layoutcomponentboxattribute{\box\scratchbox}% \egroup \ifcase\showgridstate\or\hskip-\makeupwidth\box#1\fi}% + \stopcolor \fi} %D The placement of a whole line is handled by the next two @@ -541,89 +507,158 @@ \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% - {\ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height - \goleftonpage - \hbox - {\setbox\scratchpagebox\vbox to #2 - {%\forgetall - \vsize#2\relax - \normalbaselines - \let\\\ignoredlinebreak - \let\crlf\ignoredlinebreak - %\getvalue{\??tk#1\v!text\c!before}% - \getvalue{\??tk#1\c!before}% - \doifbothsidesoverruled - {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\gobbleoneargument\getvalue} - {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\gobbleoneargument\getvalue} - {\dodoplacelayouttextline#1\c!righttext\c!middletext\c!lefttext \getvalue\gobbleoneargument}% - %\getvalue{\??tk#1\v!text\c!after}% - \getvalue{\??tk#1\c!after}% - \kern\zeropoint}% keep the \dp, beware of \vtops, never change this! - \dp\scratchpagebox\zeropoint - \box\scratchpagebox}% - \vskip-#2\relax + {\let\currentlayouttextline#1% + \ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height + \doplacelayouttextlineindeed{#2}% \fi} -\def\dodoplacelayouttextline#1#2#3#4#5#6% \hsize toegevoegd, \hss's niet meer wijzigen +\def\doplacelayouttextlineindeed#1% + {\goleftonpage + \hbox + {\setbox\scratchpagebox\vbox to #1 + {\vsize#1\relax + \normalbaselines + \let\\\ignoredlinebreak + \let\crlf\ignoredlinebreak + \csname\??tk\currentlayouttextline\c!before\endcsname + \doifbothsidesoverruled\dodoplacelayouttextlineright\dodoplacelayouttextlineright\dodoplacelayouttextlineleft + \csname\??tk\currentlayouttextline\c!after\endcsname + \kern\zeropoint}% keep the \dp, beware of \vtops, never change this! + \dp\scratchpagebox\zeropoint + \box\scratchpagebox}% + \vskip-#1\relax} + +\def\dodoplacelayouttextlineright{\dodoplacelayouttextline\c!lefttext \c!middletext\c!righttext\zerocount\plusone} +\def\dodoplacelayouttextlineleft {\dodoplacelayouttextline\c!righttext\c!middletext\c!lefttext \plusone\zerocount} + +\def\dodoplacelayouttextline#1#2#3#4#5% \hsize toegevoegd, \hss's niet meer wijzigen {\hbox {\ifdim\leftedgewidth>\zeropoint - \dododoplacelayouttextline\leftedgewidth{#1}\v!edge - {\hss\getvalue{\??tk#1\v!edge#2}}% + \dododoplacelayouttextline\leftedgewidth\currentlayouttextline\v!edge{\thelayoutleftedgeline#1}% \hskip\leftedgedistance \fi \ifdim\leftmarginwidth>\zeropoint - \dododoplacelayouttextline\leftmarginwidth{#1}\v!margin - {\hbox to \leftmarginwidth - {\hss\getvalue{\??tk#1\v!margin#2}}% - \hskip-\leftmarginwidth - \hbox to \leftmarginwidth - {\hss#5{\??tk#1\v!margin\c!margintext}}}% + \dododoplacelayouttextline\leftmarginwidth\currentlayouttextline\v!margin{\thelayoutleftmarginline#1#4}% \hskip\leftmargindistance \fi \ifdim\makeupwidth>\zeropoint - \dododoplacelayouttextline\makeupwidth{#1}\v!text - {\hbox to \makeupwidth - {\@@nmpre{#5{\??tk#1\v!text\c!marginedgetext}}% - \getvalue{\??tk#1\v!text#2}\hss}% - \hskip-\makeupwidth - \hbox to \makeupwidth - {\hss\getvalue{\??tk#1\v!text#3}\hss}% - \hskip-\makeupwidth - \hbox to \makeupwidth - {\hss\getvalue{\??tk#1\v!text#4}% - \@@nmpos{#6{\??tk#1\v!text\c!marginedgetext}}}}% + \dododoplacelayouttextline\makeupwidth\currentlayouttextline\v!text{\thelayouttextline#1#2#3#4#5}% \fi \ifdim\rightmarginwidth>\zeropoint \hskip\rightmargindistance - \dododoplacelayouttextline\rightmarginwidth{#1}\v!margin - {\hbox to \rightmarginwidth - {\getvalue{\??tk#1\v!margin#4}\hss}% - \hskip-\rightmarginwidth - \hbox to \rightmarginwidth - {#6{\??tk#1\v!margin\c!margintext}\hss}}% + \dododoplacelayouttextline\rightmarginwidth\currentlayouttextline\v!margin{\thelayoutrightmarginline#3#5}% \fi \ifdim\rightedgewidth>\zeropoint \hskip\rightedgedistance - \dododoplacelayouttextline\rightedgewidth{#1}\v!edge - {\getvalue{\??tk#1\v!edge#4}\hss}% + \dododoplacelayouttextline\rightedgewidth\currentlayouttextline\v!edge{\thelayoutrightedgeline#1}% \fi}} -% \def\dododoplacelayouttextline#1#2#3#4% -% {\vbox % to \vsize -% {\hsize#1\relax -% \getvalue{\??tk#2#3\c!voor} -% \hbox to #1{#4}% -% \getvalue{\??tk#2#3\c!na}}} +\def\thelayoutleftedgeline#1% + {\hss\csname\??tk\currentlayouttextline\v!edge#1\endcsname}% + +\def\thelayoutrightedgeline#1% + {\csname\??tk\currentlayouttextline\v!edge#1\endcsname\hss} + +\def\thelayoutleftmarginline#1#2% + {\hbox to \leftmarginwidth{\hss\csname\??tk\currentlayouttextline\v!margin#1\endcsname}% + \hskip-\leftmarginwidth + \hbox to \leftmarginwidth{\hss\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi}} + +\def\thelayoutrightmarginline#1#2% + {\hbox to \rightmarginwidth{\csname\??tk\currentlayouttextline\v!margin#1\endcsname\hss}% + \hskip-\rightmarginwidth + \hbox to \rightmarginwidth{\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi\hss}} + +\def\thelayoutedgetextline{\csname\??tk\currentlayouttextline\v!text\c!marginedgetext\endcsname} + +\def\thelayouttextline#1#2#3#4#5% + {\hbox to \makeupwidth{\ifcase#4\or\@@nmpre\thelayoutedgetextline\fi\csname\??tk\currentlayouttextline\v!text#1\endcsname\hss}% + \hskip-\makeupwidth + \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#2\endcsname\hss}% + \hskip-\makeupwidth + \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#3\endcsname\ifcase#5\or\@@nmpos\thelayoutedgetextline\fi}} \def\dododoplacelayouttextline#1#2#3#4% {\vbox % to \vsize {\hsize#1\relax - \getvalue{\??tk#2#3\c!before}% - \startlayoutcomponent{t:#2:#3}{area #2 #3}% - \hbox to #1{#4}% - \stoplayoutcomponent - \getvalue{\??tk#2#3\c!after}}} + \csname\??tk#2#3\c!before\endcsname + \setlayoutcomponentattribute#2#3% + \hbox \layoutcomponentboxattribute to #1{#4}% + \csname\??tk#2#3\c!after\endcsname}} %D Although it is far better to use backgrounds for this %D purpose, one can add a rule in the following way. This @@ -649,19 +684,41 @@ % \def\@@nmpos#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\tfskip\unhbox0\fi} % cleaner - -\def\@@nmpre#1{\doiftext{#1}{{#1}\tfskip}} -\def\@@nmpos#1{\doiftext{#1}{\tfskip{#1}}} - +% +% \def\@@nmpre#1{\doiftext{#1}{{#1}\tfskip}} +% \def\@@nmpos#1{\doiftext{#1}{\tfskip{#1}}} +% % newer - -\def\@@nmprepos#1#2#3#4#5% - {\doifelsenothing\@@nmwidth - {\doiftext{#5}{#1{#5}#2}} - {\doiftext{#5}{\hbox to \@@nmwidth{#3{#5}#4}}}} - -\def\@@nmpre{\@@nmprepos\empty\tfskip\relax\hss} -\def\@@nmpos{\@@nmprepos\tfskip\empty\hss\relax} +% +% \def\@@nmprepos#1#2#3#4#5% +% {\doifelsenothing\@@nmwidth +% {\doiftext{#5}{#1{#5}#2}} +% {\doiftext{#5}{\hbox to \@@nmwidth{#3{#5}#4}}}} +% +% \def\@@nmpre{\@@nmprepos\empty\tfskip\relax\hss} +% \def\@@nmpos{\@@nmprepos\tfskip\empty\hss\relax} +% +% faster + +\def\@@nmpre#1% + {\begingroup + \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}% + \ifzeropt\wd\scratchbox\else + \doifelsenothing\@@nmwidth + {\box\scratchbox\tfskip} + {\hbox to \@@nmwidth{\box\scratchbox\hss}}% + \fi + \endgroup} + +\def\@@nmpos#1% + {\begingroup + \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}% + \ifzeropt\wd\scratchbox\else + \doifelsenothing\@@nmwidth + {\tfskip\box\scratchbox} + {\hbox to \@@nmwidth{\hss\box\scratchbox}}% + \fi + \endgroup} %D This code will move to \type {page-flt.tex}. @@ -768,21 +825,21 @@ {\getparameters [\??tk#1#2] [%\c!state=\v!normal, % moved - \c!before=, % both global and local are used - \c!after=, % both global and local are used - \c!strut=, % the local one, not (yet) used - \c!style=\getvalue{\??tk#1\c!style},% hm, got lost - \c!color=\getvalue{\??tk#1\c!color}, % hm, got lost + \c!before=,% both global and local are used + \c!after=,% both global and local are used + \c!strut=,% the local one, not (yet) used + \c!style=\csname\??tk#1\c!style\endcsname,% hm, got lost + \c!color=\csname\??tk#1\c!color\endcsname,% hm, got lost \c!lefttext=, \c!middletext=, \c!righttext=, \c!marginedgetext=, \c!margintext=, \c!width=]% - \inheritparameter[\??tk#1#2][\c!leftstyle ][\c!style ]% - \inheritparameter[\??tk#1#2][\c!rightstyle ][\c!style ]% - \inheritparameter[\??tk#1#2][\c!leftcolor ][\c!color ]% - \inheritparameter[\??tk#1#2][\c!rightcolor ][\c!color ]% + \inheritparameter[\??tk#1#2][\c!leftstyle ][\c!style ]% + \inheritparameter[\??tk#1#2][\c!rightstyle][\c!style ]% + \inheritparameter[\??tk#1#2][\c!leftcolor ][\c!color ]% + \inheritparameter[\??tk#1#2][\c!rightcolor][\c!color ]% \inheritparameter[\??tk#1#2][\c!leftwidth ][\c!width]% \inheritparameter[\??tk#1#2][\c!rightwidth][\c!width]} diff --git a/tex/context/base/pdfr-def.tex b/tex/context/base/pdfr-def.mkii index 7554bda9e..7554bda9e 100644 --- a/tex/context/base/pdfr-def.tex +++ b/tex/context/base/pdfr-def.mkii diff --git a/tex/context/base/pdfr-ec.tex b/tex/context/base/pdfr-ec.mkii index b6604984c..b6604984c 100644 --- a/tex/context/base/pdfr-ec.tex +++ b/tex/context/base/pdfr-ec.mkii diff --git a/tex/context/base/pdfr-il2.mkii b/tex/context/base/pdfr-il2.mkii new file mode 100644 index 000000000..70bcb25da --- /dev/null +++ b/tex/context/base/pdfr-il2.mkii @@ -0,0 +1,233 @@ +%D \module +%D [ file=pdfr-il2, +%D version=2000.12.10, +%D title=\CONTEXT\ PDF Font Resources, +%D subtitle=ISO Latin 2, +%D author={Ondrej Koala Vacha, 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 vector is derived (but reformatted a bit) from a +%D sample send to me by Petr Ferdus. There was some Czech +%D comment in which I could recognize the name of Ondrej +%D Koala Vacha. More information on setting up such a vector +%D can be found in the \PDF\ reference manual. + +\startpdffontresource[il2] +/CIDInit /ProcSet findresource begin +12 dict begin + begincmap + /CIDSystemInfo + << /Registry (Adobe) + /Ordering (T1UV) + /Supplement 0 + >> def + /CMapName /Adobe-Identity-UCS def + /CMapType 1 def + 1 begincodespacerange + <00> <FF> + endcodespacerange + %%FontSpecificEncoding + 191 beginbfrange + <20> <20> <0020> % space dec: 32 oct:040 hex:20 + <21> <21> <0021> % exclam dec: 33 oct:041 hex:21 + <22> <22> <0022> % quotedbl dec: 34 oct:042 hex:22 + <23> <23> <0023> % numbersign dec: 35 oct:043 hex:23 + <24> <24> <0024> % dollar dec: 36 oct:044 hex:24 + <25> <25> <0025> % percent dec: 37 oct:045 hex:25 + <26> <26> <0026> % ampersand dec: 38 oct:046 hex:26 + <27> <27> <0027> % quotesingle dec: 39 oct:047 hex:27 + <28> <28> <0028> % parenleft dec: 40 oct:050 hex:28 + <29> <29> <0029> % parenright dec: 41 oct:051 hex:29 + <2a> <2a> <002a> % asterisk dec: 42 oct:052 hex:2a + <2b> <2b> <002b> % plus dec: 43 oct:053 hex:2b + <2c> <2c> <002c> % comma dec: 44 oct:054 hex:2c + <2d> <2d> <002d> % hyphen dec: 45 oct:055 hex:2d + <2e> <2e> <002e> % period dec: 46 oct:056 hex:2e + <2f> <2f> <002f> % slash dec: 47 oct:057 hex:2f + <30> <30> <0030> % zero dec: 48 oct:060 hex:30 + <31> <31> <0031> % one dec: 49 oct:061 hex:31 + <32> <32> <0032> % two dec: 50 oct:062 hex:32 + <33> <33> <0033> % three dec: 51 oct:063 hex:33 + <34> <34> <0034> % four dec: 52 oct:064 hex:34 + <35> <35> <0035> % five dec: 53 oct:065 hex:35 + <36> <36> <0036> % six dec: 54 oct:066 hex:36 + <37> <37> <0037> % seven dec: 55 oct:067 hex:37 + <38> <38> <0038> % eight dec: 56 oct:070 hex:38 + <39> <39> <0039> % nine dec: 57 oct:071 hex:39 + <3a> <3a> <003a> % colon dec: 58 oct:072 hex:3a + <3b> <3b> <003b> % semicolon dec: 59 oct:073 hex:3b + <3c> <3c> <003c> % less dec: 60 oct:074 hex:3c + <3d> <3d> <003d> % equal dec: 61 oct:075 hex:3d + <3e> <3e> <003e> % greater dec: 62 oct:076 hex:3e + <3f> <3f> <003f> % question dec: 63 oct:077 hex:3f + <40> <40> <0040> % at dec: 64 oct:100 hex:40 + <41> <41> <0041> % A dec: 65 oct:101 hex:41 + <42> <42> <0042> % B dec: 66 oct:102 hex:42 + <43> <43> <0043> % C dec: 67 oct:103 hex:43 + <44> <44> <0044> % D dec: 68 oct:104 hex:44 + <45> <45> <0045> % E dec: 69 oct:105 hex:45 + <46> <46> <0046> % F dec: 70 oct:106 hex:46 + <47> <47> <0047> % G dec: 71 oct:107 hex:47 + <48> <48> <0048> % H dec: 72 oct:110 hex:48 + <49> <49> <0049> % I dec: 73 oct:111 hex:49 + <4a> <4a> <004a> % J dec: 74 oct:112 hex:4a + <4b> <4b> <004b> % K dec: 75 oct:113 hex:4b + <4c> <4c> <004c> % L dec: 76 oct:114 hex:4c + <4d> <4d> <004d> % M dec: 77 oct:115 hex:4d + <4e> <4e> <004e> % N dec: 78 oct:116 hex:4e + <4f> <4f> <004f> % O dec: 79 oct:117 hex:4f + <50> <50> <0050> % P dec: 80 oct:120 hex:50 + <51> <51> <0051> % Q dec: 81 oct:121 hex:51 + <52> <52> <0052> % R dec: 82 oct:122 hex:52 + <53> <53> <0053> % S dec: 83 oct:123 hex:53 + <54> <54> <0054> % T dec: 84 oct:124 hex:54 + <55> <55> <0055> % U dec: 85 oct:125 hex:55 + <56> <56> <0056> % V dec: 86 oct:126 hex:56 + <57> <57> <0057> % W dec: 87 oct:127 hex:57 + <58> <58> <0058> % X dec: 88 oct:130 hex:58 + <59> <59> <0059> % Y dec: 89 oct:131 hex:59 + <5a> <5a> <005a> % Z dec: 90 oct:132 hex:5a + <5b> <5b> <005b> % bracketleft dec: 91 oct:133 hex:5b + <5c> <5c> <005c> % backslash dec: 92 oct:134 hex:5c + <5d> <5d> <005d> % bracketright dec: 93 oct:135 hex:5d + <5e> <5e> <005e> % asciicircum dec: 94 oct:136 hex:5e + <5f> <5f> <005f> % underscore dec: 95 oct:137 hex:5f + <60> <60> <0060> % grave dec: 96 oct:140 hex:60 + <61> <61> <0061> % a dec: 97 oct:141 hex:61 + <62> <62> <0062> % b dec: 98 oct:142 hex:62 + <63> <63> <0063> % c dec: 99 oct:143 hex:63 + <64> <64> <0064> % d dec:100 oct:144 hex:64 + <65> <65> <0065> % e dec:101 oct:145 hex:65 + <66> <66> <0066> % f dec:102 oct:146 hex:66 + <67> <67> <0067> % g dec:103 oct:147 hex:67 + <68> <68> <0068> % h dec:104 oct:150 hex:68 + <69> <69> <0069> % i dec:105 oct:151 hex:69 + <6a> <6a> <006a> % j dec:106 oct:152 hex:6a + <6b> <6b> <006b> % k dec:107 oct:153 hex:6b + <6c> <6c> <006c> % l dec:108 oct:154 hex:6c + <6d> <6d> <006d> % m dec:109 oct:155 hex:6d + <6e> <6e> <006e> % n dec:110 oct:156 hex:6e + <6f> <6f> <006f> % o dec:111 oct:157 hex:6f + <70> <70> <0070> % p dec:112 oct:160 hex:70 + <71> <71> <0071> % q dec:113 oct:161 hex:71 + <72> <72> <0072> % r dec:114 oct:162 hex:72 + <73> <73> <0073> % s dec:115 oct:163 hex:73 + <74> <74> <0074> % t dec:116 oct:164 hex:74 + <75> <75> <0075> % u dec:117 oct:165 hex:75 + <76> <76> <0076> % v dec:118 oct:166 hex:76 + <77> <77> <0077> % w dec:119 oct:167 hex:77 + <78> <78> <0078> % x dec:120 oct:170 hex:78 + <79> <79> <0079> % y dec:121 oct:171 hex:79 + <7a> <7a> <007a> % z dec:122 oct:172 hex:7a + <7b> <7b> <007b> % braceleft dec:123 oct:173 hex:7b + <7c> <7c> <007c> % bar dec:124 oct:174 hex:7c + <7d> <7d> <007d> % braceright dec:125 oct:175 hex:7d + <7e> <7e> <007e> % asciitilde dec:126 oct:176 hex:7e + <a0> <a0> <00a0> % nbspace dec:160 oct:240 hex:a0 + <a1> <a1> <0104> % Aogonek dec:161 oct:241 hex:a1 + <a2> <a2> <00a2> % breve dec:162 oct:242 hex:a2 + <a3> <a3> <00a3> % Lslash dec:163 oct:243 hex:a3 + <a4> <a4> <00a4> % currency dec:164 oct:244 hex:a4 + <a5> <a5> <013d> % Lcaron dec:165 oct:245 hex:a5 + <a6> <a6> <015a> % Sacute dec:166 oct:246 hex:a6 + <a7> <a7> <00a7> % section dec:167 oct:247 hex:a7 + <a8> <a8> <00a8> % dieresis dec:168 oct:250 hex:a8 + <a9> <a9> <0160> % Scaron dec:169 oct:251 hex:a9 + <aa> <aa> <015e> % Scedilla dec:170 oct:252 hex:aa + <ab> <ab> <0164> % Tcaron dec:171 oct:253 hex:ab + <ac> <ac> <0179> % Zacute dec:172 oct:254 hex:ac + <ad> <ad> <00ad> % sfthyphen dec:173 oct:255 hex:ad + <ae> <ae> <017d> % Zcaron dec:174 oct:256 hex:ae + <af> <af> <00af> % Zdotaccent dec:175 oct:257 hex:af + <b0> <b0> <00b0> % ring dec:176 oct:260 hex:b0 + <b1> <b1> <0105> % aogonek dec:177 oct:261 hex:b1 + <b2> <b2> <00b2> % ogonek dec:178 oct:262 hex:b2 + <b3> <b3> <00b3> % lslash dec:179 oct:263 hex:b3 + <b4> <b4> <00b4> % acute dec:180 oct:264 hex:b4 + <b5> <b5> <013e> % lcaron dec:181 oct:265 hex:b5 + <b6> <b6> <015b> % sacute dec:182 oct:266 hex:b6 + <b7> <b7> <00b7> % caron dec:183 oct:267 hex:b7 + <b8> <b8> <00b8> % cedilla dec:184 oct:270 hex:b8 + <b9> <b9> <0161> % scaron dec:185 oct:271 hex:b9 + <ba> <ba> <015f> % scedilla dec:186 oct:272 hex:ba + <bb> <bb> <0165> % tcaron dec:187 oct:273 hex:bb + <bc> <bc> <017a> % zacute dec:188 oct:274 hex:bc + <bd> <bd> <00bd> % hungarumlaut dec:189 oct:275 hex:bd + <be> <be> <017e> % zcaron dec:190 oct:276 hex:be + <bf> <bf> <00bf> % zdotaccent dec:191 oct:277 hex:bf + <c0> <c0> <0154> % Racute dec:192 oct:300 hex:c0 + <c1> <c1> <00c1> % Aacute dec:193 oct:301 hex:c1 + <c2> <c2> <00c2> % Acircumflex dec:194 oct:302 hex:c2 + <c3> <c3> <0102> % Abreve dec:195 oct:303 hex:c3 + <c4> <c4> <00c4> % Adieresis dec:196 oct:304 hex:c4 + <c5> <c5> <0139> % Lacute dec:197 oct:305 hex:c5 + <c6> <c6> <0106> % Cacute dec:198 oct:306 hex:c6 + <c7> <c7> <00c7> % Ccedilla dec:199 oct:307 hex:c7 + <c8> <c8> <010c> % Ccaron dec:200 oct:310 hex:c8 + <c9> <c9> <00c9> % Eacute dec:201 oct:311 hex:c9 + <ca> <ca> <0118> % Eogonek dec:202 oct:312 hex:ca + <cb> <cb> <00cb> % Edieresis dec:203 oct:313 hex:cb + <cc> <cc> <011a> % Ecaron dec:204 oct:314 hex:cc + <cd> <cd> <00cd> % Iacute dec:205 oct:315 hex:cd + <ce> <ce> <00ce> % Icircumflex dec:206 oct:316 hex:ce + <cf> <cf> <010e> % Dcaron dec:207 oct:317 hex:cf + <d0> <d0> <00d0> % Dslash dec:208 oct:320 hex:d0 + <d1> <d1> <0143> % Nacute dec:209 oct:321 hex:d1 + <d2> <d2> <0147> % Ncaron dec:210 oct:322 hex:d2 + <d3> <d3> <00d3> % Oacute dec:211 oct:323 hex:d3 + <d4> <d4> <00d4> % Ocircumflex dec:212 oct:324 hex:d4 + <d5> <d5> <00d5> % Ohungarumlaut dec:213 oct:325 hex:d5 + <d6> <d6> <00d6> % Odieresis dec:214 oct:326 hex:d6 + <d7> <d7> <00d7> % multiply dec:215 oct:327 hex:d7 + <d8> <d8> <0158> % Rcaron dec:216 oct:330 hex:d8 + <d9> <d9> <016e> % Uring dec:217 oct:331 hex:d9 + <da> <da> <00da> % Uacute dec:218 oct:332 hex:da + <db> <db> <00db> % Uhungarumlaut dec:219 oct:333 hex:db + <dc> <dc> <00dc> % Udieresis dec:220 oct:334 hex:dc + <dd> <dd> <00dd> % Yacute dec:221 oct:335 hex:dd + <de> <de> <00de> % Tcommaaccent dec:222 oct:336 hex:de + <df> <df> <00df> % germandbls dec:223 oct:337 hex:df + <e0> <e0> <0155> % racute dec:224 oct:340 hex:e0 + <e1> <e1> <00e1> % aacute dec:225 oct:341 hex:e1 + <e2> <e2> <00e2> % acircumflex dec:226 oct:342 hex:e2 + <e3> <e3> <0103> % abreve dec:227 oct:343 hex:e3 + <e4> <e4> <00e4> % adieresis dec:228 oct:344 hex:e4 + <e5> <e5> <013a> % lacute dec:229 oct:345 hex:e5 + <e6> <e6> <0107> % cacute dec:230 oct:346 hex:e6 + <e7> <e7> <00e7> % ccedilla dec:231 oct:347 hex:e7 + <e8> <e8> <010d> % ccaron dec:232 oct:350 hex:e8 + <e9> <e9> <00e9> % eacute dec:233 oct:351 hex:e9 + <ea> <ea> <0119> % eogonek dec:234 oct:352 hex:ea + <eb> <eb> <00eb> % edieresis dec:235 oct:353 hex:eb + <ec> <ec> <011b> % ecaron dec:236 oct:354 hex:ec + <ed> <ed> <00ed> % iacute dec:237 oct:355 hex:ed + <ee> <ee> <00ee> % icircumflex dec:238 oct:356 hex:ee + <ef> <ef> <010f> % dcaron dec:239 oct:357 hex:ef + <f0> <f0> <00f0> % dmacron dec:240 oct:360 hex:f0 + <f1> <f1> <0144> % nacute dec:241 oct:361 hex:f1 + <f2> <f2> <0148> % ncaron dec:242 oct:362 hex:f2 + <f3> <f3> <00f3> % oacute dec:243 oct:363 hex:f3 + <f4> <f4> <00f4> % ocircumflex dec:244 oct:364 hex:f4 + <f5> <f5> <00f5> % ohungarumlaut dec:245 oct:365 hex:f5 + <f6> <f6> <00f6> % odieresis dec:246 oct:366 hex:f6 + <f7> <f7> <00f7> % divide dec:247 oct:367 hex:f7 + <f8> <f8> <0159> % rcaron dec:248 oct:370 hex:f8 + <f9> <f9> <016f> % uring dec:249 oct:371 hex:f9 + <fa> <fa> <00fa> % uacute dec:250 oct:372 hex:fa + <fb> <fb> <00fb> % uhungarumlaut dec:251 oct:373 hex:fb + <fc> <fc> <00fc> % udieresis dec:252 oct:374 hex:fc + <fd> <fd> <00fd> % yacute dec:253 oct:375 hex:fd + <fe> <fe> <00fe> % tcommaaccent dec:254 oct:376 hex:fe + <ff> <ff> <00ff> % dotaccent dec:255 oct:377 hex:ff + endbfrange + endcmap +CMapName currentdict /CMap defineresource pop end +end +\stoppdffontresource + +\endinput diff --git a/tex/context/base/prop-ini.mkiv b/tex/context/base/prop-ini.mkiv index 2320f1069..c5df391a7 100644 --- a/tex/context/base/prop-ini.mkiv +++ b/tex/context/base/prop-ini.mkiv @@ -93,7 +93,7 @@ \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\expandafter\let\csname\??py:c:0\endcsname\empty + \global\expandafter\let\csname\??py:c:0\endcsname\empty \fi \letgvalue{\??py\s!check#1}\docheckproperty \doifelsevalue{\??py#1\c!method}\v!command @@ -130,9 +130,9 @@ \def\propertyparameter#1#2% expands to #1 when not defined (see \define...) {\csname\??py \ifcsname\??py#1#2\endcsname - #1#2% + #1#2% \else\ifcsname\??py\csname\??py#1\c!type\endcsname#2\endcsname - \csname\??py#1\c!type\endcsname#2% + \csname\??py#1\c!type\endcsname#2% \else \s!empty \fi\fi @@ -142,7 +142,7 @@ {\propertyparameter\currentproperty} \def\checkedpropertyparameter#1% only self - {\executeifdefined{\??py\currentproperty#1}} + {\ifcsname\??py\currentproperty#1\endcsname\csname\??py\currentproperty#1\endcsname\fi} \def\definepropertyhandler#1{\setvalue{\??py*#1}} \def\propertyhandler #1{\getvalue{\??py*#1}} diff --git a/tex/context/base/prop-lay.mkiv b/tex/context/base/prop-lay.mkiv index 0cd4bc2c8..a34a71632 100644 --- a/tex/context/base/prop-lay.mkiv +++ b/tex/context/base/prop-lay.mkiv @@ -25,56 +25,33 @@ \unprotect -\let\currentlayerproperty\empty +% will be redone ... no longer using property mechanism (less clashes) + +\let\currentviewerlayer\empty + +\appendtoks + \let\currentviewerlayer\empty +\to \everypagebody \def\startlayerproperty - {\let\currentlayerproperty\currentproperty + {\pushmacro\currentviewerlayer % grouped (used in interaction) + \let\currentlayerproperty\currentproperty % can be cross group \dotriggerviewerlayer\currentlayerproperty} \def\stoplayerproperty - {\let\currentlayerproperty\previousproperty + {\popmacro\currentviewerlayer % grouped (used in interaction) + \let\currentlayerproperty\previousproperty % can be cross group \dotriggerviewerlayer\currentlayerproperty} \def\checklayerproperty % could be made more clever - {\doifelse{\checkedpropertyparameter\v!printable\currentproperty}\v!no - {\def\printviewerlayer{0}} - {\def\printviewerlayer{1}}% - \registerviewerlayer\currentproperty\currentproperty - \dodefineviewerlayer - \currentproperty % tag - {\checkedpropertyparameter\c!title\currentproperty}% - {\checkedpropertyparameter\c!state\v!start}% visible or hidden - {0}% type (1=frozen) - {\printviewerlayer}}% 1=printable - -\def\domakelayerpropertylist - {\iflocation - \expandafter\domakeviewerlayerlist - \else - \expandafter\gobbleoneargument - \fi} - -\ifdefined\setglobalsystemreference - - \setglobalsystemreference \rt!exec \v!HideLayer {hidelayer} - \setglobalsystemreference \rt!exec \v!VideLayer {videlayer} - \setglobalsystemreference \rt!exec \v!ToggleLayer {togglelayer} - - \setexecutecommandcheck {hidelayer} \domakelayerpropertylist - \setexecutecommandcheck {videlayer} \domakelayerpropertylist - \setexecutecommandcheck {togglelayer} \domakelayerpropertylist - -\else - - % todo, but after a full split (saves dev time) - -\fi - -% \currentlayerproperty -% \checklayerproperty -% \startlayerproperty -% \stoplayerproperty -% \domakelayerpropertylist + {\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 @@ -118,42 +95,48 @@ %D %D \stoptext -%D Handy for tracing: - -\def\showlayoutcomponents - {\let\startlayoutcomponent\dostartlayoutcomponent - \let\stoplayoutcomponent \dostoplayoutcomponent} - -\def\dodefinelayoutcomponent#1#2% - {\doifelsenothing{#2}% - {\defineproperty[#1][\s!layer]}% - {\defineproperty[#1][\s!layer][\c!title=#2]}} +\def\doinitializelayoutcomponent#1#2% + {\ctxlua{backends.codeinjections.defineviewerlayer{ + tag = "#1:#2", + title = "#1 #2", + visible = "\v!start", + kind = 0, % 1 == frozen + printable = "\v!yes" + }}% + \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(viewerlayers.register('#1:#2'))} }% + \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\dostartlayoutcomponent#1#2% - {\doifelseproperty{#1}\donothing{\dodefinelayoutcomponent{#1}{#2}}% - \startproperty[#1]} +\def\doresetlayoutcomponentattribute + {\let\layoutcomponentboxattribute\empty} -\def\dostoplayoutcomponent - {\stopproperty} +\let\startlayoutcomponent \gobbletwoarguments % obsolete +\let\stoplayoutcomponent \relax % obsolete +\let\setlayoutcomponentattribute \gobbletwoarguments +\let\resetlayoutcomponentattribute\relax +\let\layoutcomponentboxattribute \empty -\let\startlayoutcomponent\gobbletwoarguments -\let\stoplayoutcomponent \relax +\def\showlayoutcomponents + {\ctxlua{viewerlayers.enabled=true}% + \let\setlayoutcomponentattribute \dosetlayoutcomponentattribute + \let\resetlayoutcomponentattribute\doresetlayoutcomponentattribute} \protect \endinput -% \def\remaplayering -% {\dodoubleargument\doremaplayering} -% -% \def\remaplayering[#1][#2]% -% {\setvalue{\??lm#1}{#2}} -% -% \def\remappedlayering#1% -% {\ifcsname\??lm#1\endcsname -% \@EA\remappedlayering\csname\??lm#1\endcsname\else#1% -% \fi} -% -% \def\startshowlayering#1#2% -% {\ifshowlayering -% \defineproperty[\remappedlayering{#1}][\s!layer][\c!titel=#2]% -% \startproperty[\remappedlayering{#1}]% -% \fi} +% \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/regi-8859-1.tex b/tex/context/base/regi-8859-1.mkii index c291b029a..c291b029a 100644 --- a/tex/context/base/regi-8859-1.tex +++ b/tex/context/base/regi-8859-1.mkii diff --git a/tex/context/base/regi-8859-10.tex b/tex/context/base/regi-8859-10.mkii index 79d74d952..79d74d952 100644 --- a/tex/context/base/regi-8859-10.tex +++ b/tex/context/base/regi-8859-10.mkii diff --git a/tex/context/base/regi-8859-13.tex b/tex/context/base/regi-8859-13.mkii index a6dbe376f..a6dbe376f 100644 --- a/tex/context/base/regi-8859-13.tex +++ b/tex/context/base/regi-8859-13.mkii diff --git a/tex/context/base/regi-8859-15.tex b/tex/context/base/regi-8859-15.mkii index cf788d3f3..cf788d3f3 100644 --- a/tex/context/base/regi-8859-15.tex +++ b/tex/context/base/regi-8859-15.mkii diff --git a/tex/context/base/regi-8859-16.tex b/tex/context/base/regi-8859-16.mkii index 96f0a15d4..96f0a15d4 100644 --- a/tex/context/base/regi-8859-16.tex +++ b/tex/context/base/regi-8859-16.mkii diff --git a/tex/context/base/regi-8859-2.tex b/tex/context/base/regi-8859-2.mkii index 81fe8419e..81fe8419e 100644 --- a/tex/context/base/regi-8859-2.tex +++ b/tex/context/base/regi-8859-2.mkii diff --git a/tex/context/base/regi-8859-3.tex b/tex/context/base/regi-8859-3.mkii index dcb8be67f..dcb8be67f 100644 --- a/tex/context/base/regi-8859-3.tex +++ b/tex/context/base/regi-8859-3.mkii diff --git a/tex/context/base/regi-8859-4.tex b/tex/context/base/regi-8859-4.mkii index 3ebe66a13..3ebe66a13 100644 --- a/tex/context/base/regi-8859-4.tex +++ b/tex/context/base/regi-8859-4.mkii diff --git a/tex/context/base/regi-8859-5.tex b/tex/context/base/regi-8859-5.mkii index 531226433..531226433 100644 --- a/tex/context/base/regi-8859-5.tex +++ b/tex/context/base/regi-8859-5.mkii diff --git a/tex/context/base/regi-8859-7.tex b/tex/context/base/regi-8859-7.mkii index 80259be65..80259be65 100644 --- a/tex/context/base/regi-8859-7.tex +++ b/tex/context/base/regi-8859-7.mkii diff --git a/tex/context/base/regi-8859-9.tex b/tex/context/base/regi-8859-9.mkii index 8460d739b..8460d739b 100644 --- a/tex/context/base/regi-8859-9.tex +++ b/tex/context/base/regi-8859-9.mkii diff --git a/tex/context/base/regi-cp1250.tex b/tex/context/base/regi-cp1250.mkii index b92eb5e31..b92eb5e31 100644 --- a/tex/context/base/regi-cp1250.tex +++ b/tex/context/base/regi-cp1250.mkii diff --git a/tex/context/base/regi-cp1251.tex b/tex/context/base/regi-cp1251.mkii index 60f04170b..60f04170b 100644 --- a/tex/context/base/regi-cp1251.tex +++ b/tex/context/base/regi-cp1251.mkii diff --git a/tex/context/base/regi-cp1252.tex b/tex/context/base/regi-cp1252.mkii index 9a54f178f..9a54f178f 100644 --- a/tex/context/base/regi-cp1252.tex +++ b/tex/context/base/regi-cp1252.mkii diff --git a/tex/context/base/regi-cp1253.tex b/tex/context/base/regi-cp1253.mkii index 24ec45eac..24ec45eac 100644 --- a/tex/context/base/regi-cp1253.tex +++ b/tex/context/base/regi-cp1253.mkii diff --git a/tex/context/base/regi-cp1254.tex b/tex/context/base/regi-cp1254.mkii index 4dd509b9d..4dd509b9d 100644 --- a/tex/context/base/regi-cp1254.tex +++ b/tex/context/base/regi-cp1254.mkii diff --git a/tex/context/base/regi-cp1257.tex b/tex/context/base/regi-cp1257.mkii index 0790ef734..0790ef734 100644 --- a/tex/context/base/regi-cp1257.tex +++ b/tex/context/base/regi-cp1257.mkii diff --git a/tex/context/base/regi-cyp.tex b/tex/context/base/regi-cyp.mkii index 7d134df50..7d134df50 100644 --- a/tex/context/base/regi-cyp.tex +++ b/tex/context/base/regi-cyp.mkii diff --git a/tex/context/base/regi-cyr.tex b/tex/context/base/regi-cyr.mkii index 1e84b9cba..1e84b9cba 100644 --- a/tex/context/base/regi-cyr.tex +++ b/tex/context/base/regi-cyr.mkii diff --git a/tex/context/base/regi-def.tex b/tex/context/base/regi-def.mkii index e26709c77..e26709c77 100644 --- a/tex/context/base/regi-def.tex +++ b/tex/context/base/regi-def.mkii diff --git a/tex/context/base/regi-ibm.tex b/tex/context/base/regi-ibm.mkii index 1fad9545a..1fad9545a 100644 --- a/tex/context/base/regi-ibm.tex +++ b/tex/context/base/regi-ibm.mkii diff --git a/tex/context/base/regi-ini.mkii b/tex/context/base/regi-ini.mkii index 9ba567145..3cdfe2763 100644 --- a/tex/context/base/regi-ini.mkii +++ b/tex/context/base/regi-ini.mkii @@ -150,7 +150,7 @@ {\letgvalue{\c!file\f!regimeprefix#1}\empty \makeshortfilename[\truefilename{\f!regimeprefix#1}]% \startreadingfile - \readsysfile\shortfilename + \readsysfile{\shortfilename.mkii} {\showmessage\m!regimes2{#1}} {\showmessage\m!regimes3{#1}}% \stopreadingfile}} @@ -199,6 +199,24 @@ \catcode#1=#2\relax \fi} +%D Goodie: + +\def\showregime[#1]% + {\doifnot{#1}{utf} + {\bgroup + \enableregime[#1]% + \starttabulate[|l|l|l|] + \dostepwiserecurse{128}{255}{1} + {\expanded + {\scantokens + {\NC \recurselevel + \NC \rawcharacter\recurselevel + \NC \noexpand\tttf + \noexpand\meaning\rawcharacter\recurselevel \NC \NR}}}% + \stoptabulate + \unskip + \egroup}} + %D Sort related: \def\dowalkregime#1% diff --git a/tex/context/base/regi-mac.tex b/tex/context/base/regi-mac.mkii index b3c281ec0..b3c281ec0 100644 --- a/tex/context/base/regi-mac.tex +++ b/tex/context/base/regi-mac.mkii diff --git a/tex/context/base/regi-run.mkii b/tex/context/base/regi-run.mkii deleted file mode 100644 index 573f1803b..000000000 --- a/tex/context/base/regi-run.mkii +++ /dev/null @@ -1,32 +0,0 @@ -%D \module -%D [ file=regi-run, -%D version=2003.03.12, -%D title=\CONTEXT\ Regime Macros, -%D subtitle=Runtime Macros, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright=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. - -\unprotect - -\gdef\mkshowregime#1% - {\doifnot{#1}{utf} - {\bgroup - \enableregime[#1]% - \starttabulate[|l|l|l|] - \dostepwiserecurse{128}{255}{1} - {\expanded - {\scantokens - {\NC \recurselevel - \NC \rawcharacter\recurselevel - \NC \noexpand\tttf - \noexpand\meaning\rawcharacter\recurselevel \NC \NR}}}% - \stoptabulate - \unskip - \egroup}} - -\protect \endinput diff --git a/tex/context/base/regi-uni.tex b/tex/context/base/regi-uni.mkii index c4d9521e9..c4d9521e9 100644 --- a/tex/context/base/regi-uni.tex +++ b/tex/context/base/regi-uni.mkii diff --git a/tex/context/base/regi-utf.tex b/tex/context/base/regi-utf.mkii index 5b30e85ee..01556ab2d 100644 --- a/tex/context/base/regi-utf.tex +++ b/tex/context/base/regi-utf.mkii @@ -12,7 +12,7 @@ %C details. \ifnum\texengine>\pdftexengine - \endinput + \expandafter \endinput \fi %D This regime activates the characters $>192$ and let them diff --git a/tex/context/base/regi-vis.tex b/tex/context/base/regi-vis.mkii index d1071354f..d1071354f 100644 --- a/tex/context/base/regi-vis.tex +++ b/tex/context/base/regi-vis.mkii diff --git a/tex/context/base/s-pre-11.tex b/tex/context/base/s-pre-11.tex new file mode 100644 index 000000000..23bf9e223 --- /dev/null +++ b/tex/context/base/s-pre-11.tex @@ -0,0 +1,220 @@ +%D \module +%D [ file=s-pre-11, +%D version=1999.08.20, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 11, +%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. + +\setuppapersize + [S6][S6] + +\setuplayout + [topspace=0cm, + backspace=0cm, + header=0pt, + footer=0pt, + width=middle, + height=middle] + +\setupbodyfont + [14.4pt,lbr] + +\setupcolors + [state=start] + +\setupinteraction + [click=no, + display=new, + state=start] + +\setupinteractionscreen + [option=max] + +\def\SomeShape% + {\resetMPdrawing + \startMPdrawing + path p[], q[] ; pair a, b ; + StartPage ; + \stopMPdrawing + \dorecurse{\CurrentTopic} + {\startMPdrawing + initialize_box(\MPpos{topic-\realfolio-\recurselevel}) ; + p[\recurselevel] := tensecircle (wxy,hxy,.25cm) shifted cxy ; + fill p[\recurselevel] withcolor .9white ; + pickup pencircle scaled .25cm ; + \ifnum\recurselevel=\CurrentTopic\space + draw p[\recurselevel] withcolor \MPcolor{ShowColor} ; + \else + draw p[\recurselevel] withcolor \MPcolor{DoneColor} ; + \fi + \stopMPdrawing}% + \dorecurse{\CurrentMaxItem} + {\startMPdrawing + initialize_box(\MPpos{item-\realfolio-\recurselevel}) ; + linewidth := .25cm ; + q[\recurselevel] := tensecircle (wxy,hxy,linewidth) shifted cxy ; + fill q[\recurselevel] withcolor .9white ; + pickup pencircle scaled linewidth ; + \ifnum\recurselevel=\CurrentMaxItem\space + draw q[\recurselevel] withcolor \MPcolor{ShowColor} ; + \else + draw q[\recurselevel] withcolor \MPcolor{DoneColor} ; + \fi + \stopMPdrawing}% + \dostepwiserecurse{2}{\CurrentTopic}{1} + {\startMPdrawing + draw + rt point 3 of p[\recurselevel-1] -- + lft point 7 of p[\recurselevel] + withcolor \MPcolor{ArrowColor} ; + \stopMPdrawing}% + \dostepwiserecurse{2}{\CurrentMaxItem}{1} + {\startMPdrawing + draw + bot point 9 of q[\recurselevel-1] -- + top point 5 of q[\recurselevel] + withcolor \MPcolor{ArrowColor} ; + \stopMPdrawing}% + \startMPdrawing + draw Page + withpen pencircle scaled .5cm + withcolor \MPcolor{EdgeColor} ; + StopPage ; + \stopMPdrawing + \MPdrawingdonetrue + \getMPdrawing} + +\def\TitlePage#1% + {\startstandardmakeup + \setupalign[middle] + \def\\{\vfil\bfb\setupinterlinespace} + \bfd\setupinterlinespace + \vfil#1\vfil\vfil + \stopstandardmakeup} + +\definecolor[PageColor][r=.5,g=.4,b=.3] +\definecolor[LineColor][r=.7,g=.6,b=.5] + +\definecolor[PageColor] [s=.60] +\definecolor[ShowColor] [r=.40] +\definecolor[EdgeColor] [g=.40] +\definecolor[DoneColor] [r=.40,g=.40] +\definecolor[ArrowColor] [b=.40] +\definecolor[LineColor] [r=.60,g=.60] +\definecolor[GotoColor] [ArrowColor] + +\setupinteraction[color=GotoColor,contrastcolor=GotoColor] + +\defineoverlay [shape] [\SomeShape] +\defineoverlay [next] [\overlaybutton{forward}] % [{nextpage}] + +\setupbackgrounds + [page] + [background={color,next,shape}, + backgroundcolor=PageColor] + +\doglobal\newcounter\CurrentMaxItem +\doglobal\newcounter\CurrentItem +\doglobal\newcounter\CurrentTopic + +\def\StartIdea% + {\doglobal\newcounter\CurrentItem} + +\def\StartTopic% + {\doglobal\increment\CurrentTopic + \dostartbuffer[topic-\CurrentTopic][StartTopic][StopTopic]} + +\def\StopIdea% + {\dorecurse{\CurrentItem} + {\let\CurrentMaxItem\recurselevel + \doStopIdea}} + +\def\doStopIdea% + {\startstandardmakeup + \dontcomplain + \vskip.875cm + \hbox to \makeupwidth + {\hfill + \dorecurse{\CurrentTopic} + {\edef\Topic{topic-\realfolio-\recurselevel}% + \hpos + {\Topic} + {\framed + [frame=off,align=middle,offset=.25cm] + {\getbuffer[topic-\recurselevel]}}% + \ifnum\recurselevel<\CurrentTopic + \hskip.875cm + \fi}% + \hfill} + \vskip.875cm + \vfilll + \dorecurse{\CurrentMaxItem} + {\edef\Item{item-\realfolio-\recurselevel} + \hbox to \makeupwidth + {\hfill + \hpos + {\Item} + {\framed + [width=.75\makeupwidth, + frame=off, + align=middle,offset=.125cm] + {\getbuffer[item-\recurselevel]}}% + \hfill} + \vskip.875cm} + \vfilll + \stopstandardmakeup} + +\def\StartItem% + {\doglobal\increment\CurrentItem + \dostartbuffer[item-\CurrentItem][StartItem][StopItem]} + +\lefthyphenmin =\maxdimen +\righthyphenmin=\maxdimen + +\doifnotmode{demo}{\endinput} + +\starttext + +\StartIdea + \StartTopic + A Nice Idea + \StopTopic + \StartItem + \input reich \relax + \StopItem + \StartItem + \input reich \relax + \StopItem + \StartItem + \input reich \relax + \StopItem +\StopIdea + +\StartIdea + \StartTopic + One More Nice Idea + \StopTopic + \StartItem + \input reich \relax + \StopItem + \StartItem + \input reich \relax + \StopItem +\StopIdea + +\StartIdea + \StartTopic + The Last Idea + \StopTopic + \StartItem + \input tufte \relax + \StopItem +\StopIdea + +\stoptext diff --git a/tex/context/base/s-pre-12.tex b/tex/context/base/s-pre-12.tex new file mode 100644 index 000000000..722d59ced --- /dev/null +++ b/tex/context/base/s-pre-12.tex @@ -0,0 +1,226 @@ +%D \module +%D [ file=s-pre-12, +%D version=1999.08.20, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 12, +%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. + +\setuppapersize + [S6][S6] + +\setuplayout + [topspace=0cm, + backspace=0cm, + header=0pt, + footer=0pt, + width=middle, + height=middle] + +\setupbodyfont + [14.4pt,lbr] + +\setupcolors + [state=start] + +\setupinteraction + [click=no, + display=new, + state=start] + +\setupinteractionscreen + [option=max] + +\def\SomeShape% + {\resetMPdrawing + \startMPdrawing + path p ; pair a, b ; + ahlength := .375cm ; + StartPage ; + draw Page %unitsquare + %xscaled PaperWidth yscaled PaperHeight + withpen pencircle scaled .5cm + withcolor \MPcolor{EdgeColor} ; + \stopMPdrawing + \dorecurse{\CurrentTopic} + {\startMPdrawing + initialize_box(\MPpos{topic-\realfolio-\recurselevel}) ; + p := tensecircle (wxy,hxy,.25cm) shifted cxy ; + fill p withcolor .9white ; + pickup pencircle scaled .25cm ; + \ifnum\recurselevel=\CurrentTopic + draw p withcolor \MPcolor{ShowColor} ; + a := bot point 7 of p ; + \else + draw p withcolor \MPcolor{DoneColor} ; + \fi + \stopMPdrawing} + \dorecurse{\CurrentMaxItem} + {\startMPdrawing + initialize_box(\MPpos{item-\realfolio-\recurselevel}) ; + linewidth := .25cm ; + p := tensecircle (wxy,hxy,linewidth) shifted cxy ; + fill p withcolor .9white ; + pickup pencircle scaled linewidth ; + b := rt point 3 of p ; + \ifnum\recurselevel=\CurrentMaxItem + draw p withcolor \MPcolor{ShowColor} ; + \else + draw p withcolor \MPcolor{DoneColor} ; + \fi + dxab := xpart a-xpart b ; + dyab := ypart a-ypart b ; + sign := if dyab>0 : - fi 1 ; + drawarrow + a -- + a shifted (+2linewidth-dxab/2,0) {left} .. + if abs(dyab)>4linewidth : + a shifted (-dxab/2,+sign*2linewidth) -- + b shifted (+dxab/2,-sign*2linewidth) .. + fi + {left} b shifted (-2linewidth+dxab/2,0) -- + b + withcolor \MPcolor{ArrowColor} ; + \stopMPdrawing}% + \startMPdrawing + StopPage ; + \stopMPdrawing + \MPdrawingdonetrue + \getMPdrawing} + +\definecolor[PageColor][r=.5,g=.4,b=.3] +\definecolor[LineColor][r=.7,g=.6,b=.5] + +\definecolor[PageColor] [s=.60] +\definecolor[ShowColor] [r=.40] +\definecolor[EdgeColor] [g=.40] +\definecolor[DoneColor] [r=.40,g=.40] +\definecolor[ArrowColor] [b=.40] +\definecolor[LineColor] [r=.60,g=.60] +\definecolor[GotoColor] [ArrowColor] + +\setupinteraction[color=GotoColor,contrastcolor=GotoColor] + +\defineoverlay [shape] [\SomeShape] +\defineoverlay [next] [\overlaybutton{forward}] + +\setupbackgrounds + [page] + [background={color,next,shape}, + backgroundcolor=PageColor] + +\doglobal\newcounter\CurrentItem +\doglobal\newcounter\CurrentTopic +\doglobal\newcounter\CurrentMaxItem + +\def\StartIdea% + {\doglobal\newcounter\CurrentItem} + +\def\StartTopic% + {\doglobal\increment\CurrentTopic + \dostartbuffer[topic-\CurrentTopic][StartTopic][StopTopic]} + +\def\StopIdea% + {\dorecurse{\CurrentItem} + {\let\CurrentMaxItem\recurselevel + \doStopIdea}} + +\def\IdeaWidth {.6\makeupwidth} % .5 +\def\TopicWidth{.2\makeupwidth} % .3 + +\def\doStopIdea% + {\startstandardmakeup + \dontcomplain + \vbox to \makeupheight + {\vskip.75cm \relax % \vfill + \dorecurse{\CurrentMaxItem} + {\edef\Item{item-\realfolio-\recurselevel} + \hbox to \makeupwidth + {\hskip.75cm + \hpos + {\Item} + {\framed + [width=\IdeaWidth,frame=off, + align=middle,offset=.125cm] + {\getbuffer[item-\recurselevel]}}} + \vskip.875cm} + \vfill} + \vskip-\makeupheight + \vbox to \makeupheight + {\vskip.75cm \relax + \dorecurse{\CurrentTopic} + {\edef\Topic{topic-\realfolio-\recurselevel} + \hbox to \makeupwidth + {\hfill + \hpos + {\Topic} + {\framed + [width=\TopicWidth,frame=off, + align=middle,offset=.25cm] + {\getbuffer[topic-\recurselevel]}}% + \hskip.75cm} + \vskip.875cm} + \vfill} + \stopstandardmakeup} + +\def\StartItem% + {\doglobal\increment\CurrentItem + \dostartbuffer[item-\CurrentItem][StartItem][StopItem]} + +\lefthyphenmin =\maxdimen +\righthyphenmin=\maxdimen + +\def\TitlePage#1% + {\startstandardmakeup + \setupalign[middle] + \def\\{\vfil\bfb\setupinterlinespace} + \bfd\setupinterlinespace + \vfil#1\vfil\vfil + \stopstandardmakeup} + +\endinput + +% \starttext +% +% \StartIdea +% \StartTopic +% What a topic +% \StopTopic +% \StartItem +% \input reich \relax +% \StopItem +% \StartItem +% \input reich \relax +% \StopItem +% \StartItem +% \input reich \relax +% \StopItem +% \StopIdea +% +% \StartIdea +% \StartTopic +% One More Nice Idea +% \StopTopic +% \StartItem +% \input reich \relax +% \StopItem +% \StartItem +% \input reich \relax +% \StopItem +% \StopIdea +% +% \StartIdea +% \StartTopic +% The Last Idea +% \StopTopic +% \StartItem +% \input tufte \relax +% \StopItem +% \StopIdea +% +% \stoptext diff --git a/tex/context/base/s-pre-17.tex b/tex/context/base/s-pre-17.tex new file mode 100644 index 000000000..798f30cf8 --- /dev/null +++ b/tex/context/base/s-pre-17.tex @@ -0,0 +1,399 @@ +%D \module +%D [ file=s-pre-17, +%D version=1999.08.20, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 17, +%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. + +\setupbodyfont + [12pt,ss] + +\setupcolors + [state=start] + +\setupsystem + [random=medium] + +\setupbackgrounds + [state=repeat] + +\setupbackgrounds + [page] + [background={page,forward}] + +\setupbackgrounds + [text][text] + [background=blowup] + +\setupinteraction + [state=start, + %click=off, + color=TitleColor, + contrastcolor=TitleColor] + +\setupinteractionscreen + [option=max] + +\setuptolerance + [verytolerant,stretch] + +\definecolor [BackColor] [s=.30] +\definecolor [PageColor] [g=1] +\definecolor [FrameColor] [r=1] +\definecolor [TitleColor] [y=1] +\definecolor [ArrowColor] [b=1] + +\defineoverlay [title] [\useMPgraphic{title}] +\defineoverlay [page] [\useMPgraphic{page}] +\defineoverlay [blowup] [\overlaybutton{page(\realfolio)}] +\defineoverlay [forward] [\overlaybutton{forward}] + +\startMPpositiongraphic{mppos:connection} + path pa, pb, pc ; pair ca, cb ; + initialize_box(\MPpos{\MPvar{self}}) ; pa := pxy ; ca := cxy ; + initialize_box(\MPpos{\MPvar{prev}}) ; pb := pxy ; cb := cxy ; + pickup pencircle scaled .5pt ; + pa := pa enlarged 10pt ; + pb := pb enlarged 10pt ; + for i=1 upto 10 : + draw pa randomized 20pt withcolor \MPcolor{FrameColor} ; + endfor ; + if \MPp{\MPvar{prev}}>0 : + pair a, b, c, d ; + for i=1 upto 25 : + a := .5[ulcorner pa,urcorner pa] randomized (10pt,10pt) ; + b := .5[llcorner pb,lrcorner pb] randomized (20pt,10pt) ; + c := .5[a,b] rotatedaround(a,-25) randomized (5pt,5pt) ; + d := .5[a,b] rotatedaround(a,+25) randomized (5pt,5pt) ; + draw (a--b) withcolor \MPcolor{ArrowColor} ; + draw (d--a--c) withcolor \MPcolor{ArrowColor} ; + endfor ; + fi ; + anchor_box(\MPanchor{\MPvar{self}}) ; +\stopMPpositiongraphic + +\startuseMPgraphic{title} + pickup pencircle scaled .5pt ; + for i=1 upto 10 : + draw + fullsquare xyscaled(OverlayWidth,OverlayHeight) + enlarged 10pt randomized 20pt + withcolor \MPcolor{TitleColor} ; + endfor ; +\stopuseMPgraphic + +\startuseMPgraphic{page} + StartPage ; + pickup pencircle scaled .5pt ; + fill Page withcolor \MPcolor{BackColor} ; + for i=1 upto 20 : + draw Page enlarged -50pt randomized 50pt withcolor \MPcolor{PageColor} ; + endfor ; + StopPage ; +\stopuseMPgraphic + +\def\StartText% + {\bgroup + \getrandomdimen\scratchdimen{250pt}{350pt}% + \edef\TextWidth{\the\scratchdimen}% + \setbox\scratchbox=\hbox\bgroup + \hsize\TextWidth + \setupframedtexts + [before=,after=, + width=fit,align=right, % normal, + frame=off,foregroundcolor=white]% + \framedtext\bgroup} + +\def\BlowX{450pt} % \def\BlowX{600pt} +\def\BlowY{300pt} % \def\BlowY{450pt} +\def\BlowV {50pt} % \def\BlowV{100pt} +\def\BlowH {75pt} % \def\BlowH{100pt} +\def\BackO {50pt} % \def\BackO {50pt} + +\def\StopText% + {\egroup\egroup + \doglobal\increment\CurrentBlaBla + \let\PrevBlaBla\CurrentBlaBla \doglobal\decrement\PrevBlaBla + \let\NextBlaBla\CurrentBlaBla \doglobal\increment\NextBlaBla + \setMPpositiongraphic + {connection:\CurrentBlaBla}% + {mppos:connection}% + {seed=\CurrentBlaBla, + prev=connection:\PrevBlaBla, + next=connection:\NextBlaBla}% + \SetBlowUp{connection:\CurrentBlaBla}\BlowX\BlowY\BlowH\BlowV + \hbox to 600pt +% {\getrandomdimen\scratchdimen{50pt}{100pt}% + {\getrandomdimen\scratchdimen{50pt}{75pt}% + \hskip0pt plus \scratchdimen minus \scratchdimen + \hpos{connection:\CurrentBlaBla}% + {\framed + [frame=off, + offset=overlay, + backgroundoffset=\BackO, + background=blowup] + {\box\scratchbox}}% +% \getrandomdimen\scratchdimen{50pt}{100pt}% + \getrandomdimen\scratchdimen{50pt}{75pt}% + \hskip0pt plus \scratchdimen minus \scratchdimen}% +% \getrandomdimen\scratchdimen{100pt}{150pt}% + \getrandomdimen\scratchdimen{75pt}{125pt}% + \vskip\scratchdimen + \egroup} + +\def\xStartText + {\bgroup + \setbox\scratchbox=\hbox\bgroup + \framed + [frame=off,foregroundcolor=white] + \bgroup} + +\def\xStopText{\StopText} + +\def\SetBlowUp#1#2#3#4#5% tag width height hoffset voffset + {\scratchdimen=\MPw{#1}% + \advance\scratchdimen-#2 % + \divide\scratchdimen by 2 + \advance\scratchdimen by \MPx{#1}\relax + \ifdim\scratchdimen<0pt \scratchdimen=0pt \fi + \ScaledPointsToBigPoints{\number\scratchdimen}\TextX + \advance\scratchdimen by #2 % + \ScaledPointsToBigPoints{\number\scratchdimen}\TextW + % + \scratchdimen=\MPh{#1}% + \advance\scratchdimen-#3 % + \divide\scratchdimen by 2 + \advance\scratchdimen\MPy{#1}\relax + \ifdim\scratchdimen<0pt \scratchdimen=0pt \fi + \ScaledPointsToBigPoints{\number\scratchdimen}\TextY + \advance\scratchdimen by #3 + \ScaledPointsToBigPoints{\number\scratchdimen}\TextH + % + \def\PDFpageviewkey{ fitr \TextX\space\TextY\space\TextW\space\TextH}% + \def\PDFpageviewwrd{ /FitR \TextX\space\TextY\space\TextW\space\TextH}% + \edef\PDFpageview{/View [\PDFpageviewwrd]}} + +\def\xSetBlowUp#1#2#3#4#5% tag width height hoffset voffset + {\scratchdimen\MPx{#1}\relax + \ifdim\scratchdimen<#4 + \ScaledPointsToBigPoints{0}\TextX + \multiply\scratchdimen 2 + \else + \advance\scratchdimen-#4 + \ScaledPointsToBigPoints{\number\scratchdimen}\TextX + \advance\scratchdimen#4 + \advance\scratchdimen#4 + \fi + \advance\scratchdimen\MPw{#1}% + \ScaledPointsToBigPoints{\number\scratchdimen}\TextW + % + \scratchdimen\MPy{#1}\relax + \ifdim\scratchdimen<#5 + \ScaledPointsToBigPoints{0}\TextY + \multiply\scratchdimen 2 + \else + \advance\scratchdimen-#5 + \ScaledPointsToBigPoints{\number\scratchdimen}\TextY + \advance\scratchdimen#5 + \advance\scratchdimen#5 + \fi + \advance\scratchdimen\MPh{#1}% + \ScaledPointsToBigPoints{\number\scratchdimen}\TextH + % + \def\PDFpageviewkey{ fitr \TextX\space\TextY\space\TextW\space\TextH}% + \def\PDFpageviewwrd{ /FitR \TextX\space\TextY\space\TextW\space\TextH}% + \edef\PDFpageview{/View [\PDFpageviewwrd]}} + +\dontcomplain + +\def\StartPage#1% + {\doStartPage{1}{#1}} + +\def\doStartPage#1#2% + {\def\StopPage{\doStopPage{#1}{#2}}% + \setbox\scratchbox=\hbox\bgroup + \valign\bgroup\ignorespaces##\vss\cr} + +\def\doStopPage#1#2% + {\cr + \egroup + \egroup + \setbox\scratchbox=\vbox + {\vskip100pt + \hbox \ifcase#1 spread 200pt \else to \wd\scratchbox \fi + {\hss + \switchtobodyfont[big]% + \bfd\setupinterlinespace + \ifcase#1\else \SetBlowUp{title:\realfolio}\BlowX\BlowY\BlowH\BlowV \fi + \hpos{title:\realfolio} + {\framed + [frame=off,align=middle, + foregroundcolor=white, + background={title,blowup}] + {#2}}% + \hss} + \vskip100pt + \box\scratchbox} + \doFlushPage} + +\def\doFlushPage + {\scratchdimen=\ht\scratchbox + \advance\scratchdimen \dp\scratchbox + \advance\scratchdimen 100pt + \edef\height{\the\scratchdimen} + \scratchdimen=\wd\scratchbox + \advance\scratchdimen 100pt + \edef\width {\the\scratchdimen} + \expanded{\definepapersize[MASTER][width=\width,height=\height]} + \setuppapersize + [MASTER][MASTER] + \setuplayout + [topspace=25pt,backspace=25pt, + width=middle,header=0pt,footer=0pt,height=middle] + \centerbox{\box\scratchbox} + \page} + +\def\StartTopic#1% + {\unskip\unskip\cr + \doglobal\increment(\CurrentBlaBla,100)% + \vbox\bgroup + \vskip100pt + \bgroup + \definecolor[FrameColor][TitleColor] + \switchtobodyfont[big] + \bfd\setupinterlinespace + \xStartText#1\xStopText + \vskip25pt + \egroup} + +\def\StopTopic% + {\vskip-\lastskip + \vskip100pt + \egroup + \ignorespaces} + +\def\TitlePage#1% + {\doStartPage{0}{\def\\{\vskip1ex\bfc\def\\{\vskip1ex\bfb}}#1} + \StopPage} + +\doifnotmode{demo}{\endinput} + +\setupoutput[pdftex] + +\starttext + +\TitlePage{About Text\\Today's Talk\\Hans Hagen} + +\StartPage{The First Page} + +\StartTopic{Some Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input knuth \StopText +\StopTopic + +\StartTopic{Another Text} + \StartText \input tufte \StopText + \StartText \input zapf \StopText + \StartText \input knuth \StopText +\StopTopic + +\StartTopic{Some More Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText +\StopTopic + +\StartTopic{Some Text Agian} + \StartText \input tufte \StopText + \StartText \input zapf \StopText + \StartText \input knuth \StopText + \StartText \input tufte \StopText +\StopTopic + +\StopPage + +\StartPage{The Second Page} + +\StartTopic{Some Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText +\StopTopic + +\StartTopic{Another Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText +\StopTopic + +\StartTopic{Some Nice Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input tufte \StopText +\StopTopic + +\StartTopic{Some Funny Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText +\StopTopic + +\StartTopic{Quite Some Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText +\StopTopic + +\StartTopic{Even More Text} + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText +\StopTopic + +\StopPage + +\StartPage{The Third Page} + +\StartTopic{Some Short Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText +\StopTopic + +\StartTopic{Some Minimal Text} + \StartText \input tufte \StopText + \StartText \input zapf \StopText +\StopTopic + +\StartTopic{Some More Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input tufte \StopText +\StopTopic + +\StopPage + +\stoptext diff --git a/tex/context/base/s-pre-18.tex b/tex/context/base/s-pre-18.tex new file mode 100644 index 000000000..407f30824 --- /dev/null +++ b/tex/context/base/s-pre-18.tex @@ -0,0 +1,177 @@ +%D \module +%D [ file=s-pre-18, +%D version=1999.08.20, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 18, +%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. + + + +% output=pdftex interface=en + +% todo: met pos en dan iedere titel + +\setuppapersize + [S6][S6] + +\setupbodyfont + [loc,ppl] + +\setupcolors + [state=start] + +\definecolor [shade-1] [s=.7] +\definecolor [shade-2] [s=.1] + +\definecolor [shade-3] [s=.8] +\definecolor [shade-4] [b=.8] + +\definecolor [shade-5] [g=.6] + +\setuplayout + [topspace=1cm, + height=fit, + backspace=1cm, + width=middle, + header=0pt, + footer=0pt, + bottomdistance=1cm] + +\setupbackgrounds + [state=repeat] + +\setupbackgrounds [page] [background=page] + +\defineoverlay [page] [\useMPgraphic{page}] +\defineoverlay [text] [\useMPgraphic{text}] + +\startuseMPgraphic{page} + StartPage ; + path p ; numeric s ; pair cp ; cp := center Page ; + s := define_circular_shade(cp,cp,0,TextWidth, + \MPcolor{shade-1},\MPcolor{shade-2}) ; + fill Page withshade s ; + p := fullcircle xyscaled (TextWidth+1cm, TextHeight+1cm) shifted cp ; + s := define_circular_shade(cp,cp,0,TextWidth,\MPcolor{shade-3}, + \MPcolor{shade-4}) ; + fill p withshade s ; + StopPage +\stopuseMPgraphic + +\startuseMPgraphic{text} + StartPage ; + path p ; numeric s, t ; pair cp ; cp := center Page ; + s := define_circular_shade(cp,cp,0,TextWidth, + \MPcolor{shade-1},\MPcolor{shade-2}) ; + fill Page withshade s ; + p := llcorner Field[Text][Bottom] -- + lrcorner Field[Text][Bottom] -- + urcorner Field[Text][Text] -- + ulcorner Field[Text][Text] -- cycle ; + p := p enlarged .5cm randomized .5cm ; + t := define_circular_shade(cp,cp,0,TextWidth,\MPcolor{shade-3}, + \MPcolor{shade-4}) ; + fill p withshade t ; + + def bottom_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) = + if (pp>0) and (rr>0) : + if nn = 1 : + p := (0,0)--(ww,hh/2)--(0,hh)--cycle ; + elseif nn = 2 : + p := (0,hh/2)--(ww,hh)--(ww,0)--cycle ; + else : + p := origin--cycle ; + fi ; + fill p randomized 2.5mm shifted (xx,yy) withshade s ; + fi ; + enddef ; + + \MPmenubuttons{bottom} + + if length \MPstring{topic} > 0 : + graphictext + \MPstring{topic} + scaled 3 + shifted ulcorner Field[Text][Text] + shifted (0,-1.5cm) + withshade s ; + fi ; + + StopPage ; +\stopuseMPgraphic + +\setupinteractionmenu + [bottom] + [state=start, + frame=off, + left=\hfill, + middle=\hskip.5cm, + width=2\bottomheight, + position=yes] + +\startinteractionmenu[bottom] + \but [previouspage] \\ + \but [nextpage] \\ +\stopinteractionmenu + +\setupinteraction + [state=start, + click=no, + color=shade-5, + contrastcolor=shade-5, + menu=on] + +\setupwhitespace + [big] + +\def\Topic#1% + {\page + \setMPtext{topic}{#1} + \vbox to 2cm{}} + +\setMPtext{topic}{} + +\def\StartTitlePage% + {\startstandardmakeup[bottomstate=none] + \setupalign[middle] + \vfill} + +\def\StopTitlePage% + {\stopstandardmakeup + \setuplayout[bottom=1.5cm] + \setupbackgrounds[page][background=text]} + +\def\TitleString#1#2% + {\indent + \startMPcode + graphictext + "#2" + scaled #1 + withdrawcolor .4white + withfillcolor .7white + withpen pencircle scaled 2pt ; + \stopMPcode + \vfill} + +\doifnotmode{demo}{\endinput} + +\starttext + +\StartTitlePage + \TitleString{8}{Welcome} + \TitleString{4}{to my favourite} + \TitleString{8}{Quotes} +\StopTitlePage + +\Topic {Douglas R. Hofstadter} \input douglas \page +\Topic {Donald E. Knuth} \input knuth \page +\Topic {Edward R. Tufte} \input tufte \page +\Topic {Hermann Zapf} \input zapf \page + +\stoptext diff --git a/tex/context/base/s-pre-19.tex b/tex/context/base/s-pre-19.tex index dc013d0b3..3715d6ac1 100644 --- a/tex/context/base/s-pre-19.tex +++ b/tex/context/base/s-pre-19.tex @@ -337,6 +337,7 @@ enddef ; A Simple Style Demo\\ Hans Hagen, August 2000} + \Topic {Douglas R. Hofstadter} \input douglas \page \Topic {Donald E. Knuth} \input knuth \page \Topic {Edward R. Tufte} \input tufte \page diff --git a/tex/context/base/s-pre-26.tex b/tex/context/base/s-pre-26.tex new file mode 100644 index 000000000..a99516960 --- /dev/null +++ b/tex/context/base/s-pre-26.tex @@ -0,0 +1,255 @@ +%D \module +%D [ file=s-pre-26, +%D version=2001.02.18, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 26, +%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 modes: reverse + +%D This is a nice and simple style, written in februari +%D 2001. It uses a square papersize, derived from \type {S4}. +%D Because this style is meant to be used with Zapf +%D Chancery, I dedicate this style to Volker Schaa, a fan of +%D Zapf. + +\setuppapersize + [S44][S44] + +\startmode[asintended] + \definetypeface[zaphy][cg][calligraphy][chancery] + \setupbodyfont[zaphy,cg,12pt] +\stopmode + +\startnotmode[asintended] + \setupbodyfont[13pt] +\stopnotmode + +%D We use the whole page. + +\setuplayout + [backspace=0pt, + topspace=0pt, + header=0pt, + footer=0pt, + bottom=0pt, + width=middle, + height=middle] + +%D We will be very tolerant in alignment. + +\setuptolerance + [verytolerant,stretch] + +%D Of course use navigation, but we hide the in this case +%D ugly reverse video hyper spot. + +\setupinteraction + [state=start, + color=white, + contrastcolor=white, + style=\underbar, + click=no] + +%D This style looks best in a dark room, full screen. + +\setupinteractionscreen + [option=max] + +%D We use colors and remap a couple of standard colors. + +\setupcolors + [state=start] + +\definecolor[white] [s=.8] +\definecolor[red] [r=.7] +\definecolor[green] [g=.7] +\definecolor[blue] [b=.7] +\definecolor[yellow][r=.7,g=.7] + +\definecolor [PageColor][black] + +%D These colors will cyclic be assigned to \type +%D {TextColor}. + +\definecolor [TextColor 0][white] +\definecolor [TextColor 1][red] +\definecolor [TextColor 2][green] +\definecolor [TextColor 3][blue] +\definecolor [TextColor 4][yellow] + +\definecolor [TextColor] [TextColor 0] + +%D We will collect everything in a layer. + +\definelayer + [main] + [state=repeat] + +%D We have quite some overlays. + +\defineoverlay [page] [\reuseMPgraphic{page}] +\defineoverlay [text] [\useMPgraphic{text}] +\defineoverlay [next] [\overlaybutton{nextpage}] +\defineoverlay [prev] [\overlaybutton{previouspage}] +\defineoverlay [main] [\composedlayer{main}] + +%D These end up as paper, page and text backgrounds. We need +%D to locate the foreground, otherwise hyperlinks will not +%D work. + +\setupbackgrounds % otherwise in acrobat 5 rounding error + [paper] % and one pixel white line + [backgroundcolor=Pagecolor, + background=page] + +\setupbackgrounds + [page] + [background={page,prev,foreground,main}] + +\setupbackgrounds + [text] + [background=next, + backgroundoffset=-10pt] + +%D This means that clicking on the center brings you to the +%D next page, while clicking on teh page frame brings you one +%D page back. + +%D As usual, the graphics are handled by \METAPOST: + +\startuseMPgraphic{text} + path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ; + color c ; c := (.7+uniformdeviate.3)*\MPcolor{TextColor} ; + p := p enlarged -1.25pt ; + filldraw p withcolor c ; + draw p withpen pencircle scaled 2.5pt withcolor .75c ; +\stopuseMPgraphic + +\startreusableMPgraphic{page} + path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ; + color c ; c := \MPcolor{PageColor} ; + filldraw p enlarged 5pt withcolor c ; % bleeding +\stopreusableMPgraphic + +%D The text is typeset in a framed text. We cycle trough the +%D colors by means of a counter. This counter also determines +%D the positioning on the main layer. The width is slightly +%D random. + +\newcounter\KindOfTopic % and cycle through corners +\newdimen \TopicWidth % with randomized widths + +\defineframedtext + [TopicText] + [frame=off, + offset=10pt, + style=bold, + width=\TopicWidth, + background=text, + before=, + after=, + align=normal] + +\def\BeforeTopic + {\ifcase\KindOfTopic\relax + \TopicWidth=.7\textwidth + \definecolor[CharColor][black] + \else + \getrandomdimen\TopicWidth{.55\textwidth}{.7\textwidth} + \definecolor[CharColor][white] + \fi + \doifmode{reverse} + {\setupframedtexts[TopicText][foregroundcolor=CharColor]} + \definecolor[TextColor][TextColor \KindOfTopic] + \ifcase\KindOfTopic\relax + \setuplayer[main][x=.5\textwidth,y=.5\textheight,location=c] \or + \setuplayer[main][x=0pt, y=0pt, location=rb] \or + \setuplayer[main][x=\textwidth, y=0pt, location=lb] \or + \setuplayer[main][x=\textwidth, y=\textheight, location=lt] \or + \setuplayer[main][x=0pt, y=\textheight, location=rt] \fi} + +\def\AfterTopic + {\ifnum\KindOfTopic=4 + \gdef\KindOfTopic{1} + \else + \doglobal\increment\KindOfTopic + \fi} + +\def\StartTopic + {\BeforeTopic + \startstandardmakeup + \setlayer[main] \bgroup \startTopicText[none] + }%\setupwhitespace[big]} % generates an empty line + +\def\StopTopic + {\stopTopicText \egroup + \stopstandardmakeup + \AfterTopic} + +%D The title and colofon page are centered on the page. + +\def\StartNopic + {\doglobal\newcounter\KindOfTopic % centered at the page + \StartTopic + \bfd\setupinterlinespace + \setupinteraction[color=,contrastcolor=]% + \def\\{\blank\bfb\setupinterlinespace\def\\{\blank}}% + \raggedcenter\ignorespaces} + +\def\StopNopic + {\StopTopic} + +\let\StartTitlePage\StartNopic \let\StartColofonPage\StartNopic +\let\StopTitlePage \StopNopic \let\StopColofonPage \StopNopic + +\def\TitlePage #1{\StartTitlePage #1\StopTitlePage} +\def\ColofonPage#1{\StartColofonPage#1\StopColofonPage} + +%D We provide a minimum of title commands. + +\definehead + [Title] + [title] + +\definehead + [Subject] + [subject] + +\setuphead + [Title] + [style=\bfb, + page=, + before=, + after=\blank] + +\setuphead + [Subject] + [style=\bfa, + before=\blank, + after=\blank] + +\doifnotmode{demo}{\endinput} + +\def\Sample #1 {\input #1 \par \rightaligned{--- #1 ---}} + +\starttext + +\StartNopic The \ConTeXt\ Test Quotes \\ \currentdate \StopNopic + +\StartTopic \Sample tufte \StopTopic +\StartTopic \Sample knuth \StopTopic +\StartTopic \Sample zapf \StopTopic +\StartTopic \Sample douglas \StopTopic +\StartTopic \Sample stork \StopTopic +\StartTopic \Sample materie \StopTopic + +\StartNopic There Will Be Some More \StopNopic + +\stoptext diff --git a/tex/context/base/s-pre-27.tex b/tex/context/base/s-pre-27.tex new file mode 100644 index 000000000..eda75e8f4 --- /dev/null +++ b/tex/context/base/s-pre-27.tex @@ -0,0 +1,181 @@ +%D \module +%D [ file=s-pre-27, +%D version=1999.08.20, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 27, +%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. + +\setuppapersize + [S6][S6] + +% \setupbodyfont[ppl] + +\definetypeface[main][rm][casual][informal][default] +\loadmapfile[original-micropress-informal.map] + +\setupbodyfont[main,10pt] + +\setuplayout + [footerdistance=20pt, + footer=40pt, + %footer=24pt, + %bottomdistance=10pt, + %bottom=12pt, + header=0pt, + backspace=20pt, + topspace=20pt, + width=middle, + height=fit] + +% \def\MainTitle#1{\setupfootertexts[\hfill#1]} +% \def\SubTitle #1{\setupbottomtexts[\hfill#1]} +% +% \MainTitle{a dull talk held at \currentdate} +% \SubTitle {welcome to whatever} +% +% \setupbottom +% [style=\ssbf, +% color=white] +% +% \setupfooter +% [style=\ssbfb, +% color=white] + +\setupfooter + [strut=no, + style=\bfb, + color=white] + +\setupinteraction + [state=start] + +\setupinteractionscreen + [option=max] + +\definecolor[white] [s=.8] +\definecolor[red] [r=.7] +\definecolor[green] [g=.7] +\definecolor[blue] [b=.7] +\definecolor[yellow][r=.7,g=.7] + +\setupcolors + [state=start] + +\defineoverlay [page] [\reuseMPgraphic{page}] +\defineoverlay [text] [\useMPgraphic {text}] +\defineoverlay [continue] [\overlaybutton {forward}] + +\setupbackgrounds + [page] + [background={page,continue}] + +\definecolor [PageColor] [red] +\definecolor [TextColor] [yellow] + +\defineframedtext + [TopicPage] + +\defineframedtext + [TopicText] + +\setupframedtexts + [TopicPage] + [width=\textwidth, + height=\textheight, + offset=overlay] + +\setupframedtexts + [TopicText] + [offset=10pt, + style=bold, % hm + width=\TopicWidth, + background=text, + align=normal] + +\setupframedtexts + [TopicPage,TopicText] + [frame=off, + depthcorrection=off, + before=, + after=] + +\newbox \TopicBox +\newcounter \KindOfTopic +\newdimen \TopicWidth + +\def\KindOfTopic{1} + +\def\StartTopic + {\getrandomdimen\TopicWidth{.5\textwidth}{.7\textwidth} + \ifcase\KindOfTopic\or + \setupframedtexts [TopicPage] [align={right,high}] \or + \setupframedtexts [TopicPage] [align={left,high}] \or + \setupframedtexts [TopicPage] [align={left,low}] \or + \setupframedtexts [TopicPage] [align={right,low}] \fi + \setbox\scratchbox=\vbox \bgroup \dontcomplain + \noindent \startTopicPage [none] + \noindent \startTopicText [none] + \setuptolerance [verytolerant,stretch]} + +\def\StopTopic% + {\stopTopicText + \stopTopicPage + \egroup + \global\setbox\TopicBox=\vbox + {\startoverlay + {\box\TopicBox} {\box\scratchbox} + \stopoverlay} + \copy\TopicBox + \ifnum\KindOfTopic=4 + \def\KindOfTopic{1} + \else + \increment\KindOfTopic + \fi + \page} + +\startuseMPgraphic{text} + path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ; + color c ; c := (.7+uniformdeviate.3)*\MPcolor{TextColor} ; + p := p enlarged -1.25pt ; + fill p withcolor c ; + draw p withpen pencircle scaled 2.5pt withcolor .75c ; +\stopuseMPgraphic + +\startreusableMPgraphic{page} + path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ; + color c ; c := \MPcolor{PageColor} ; + fill p withcolor c ; + draw p withpen pencircle scaled 2.5pt withcolor c ; +\stopreusableMPgraphic + +\def\StartNopic#1\StopNopic + {\setupfootertexts + [\vbox to \footerheight + {\vfill + \raggedleft + \def\\{\endgraf\tx\setstrut\strut} + \setstrut\strut\ignorespaces#1\unskip\endgraf\removedepth}] + \null \page} + +\def\TitlePage#1% + {\StartNopic#1\StopNopic} + +\setuphead[title] [style=\bfc,after=\blank] +\setuphead[subject][style=\bfa,before=\blank] + +\doifnotmode{demo}{\endinput} + +\starttext + +\TitlePage + {a dull talk held at \currentdate\\welcome to whatever} + +\dorecurse{10}{\StartTopic \input tufte \StopTopic} + +\stoptext diff --git a/tex/context/base/s-pre-61.tex b/tex/context/base/s-pre-61.tex index 216bb9a00..fa52d158a 100644 --- a/tex/context/base/s-pre-61.tex +++ b/tex/context/base/s-pre-61.tex @@ -221,7 +221,7 @@ [bottom] [text] [background=topics] -\doifnotmode{demo}{\endinput} +% \doifnotmode{demo}{\endinput} \starttext diff --git a/tex/context/base/s-pre-93.tex b/tex/context/base/s-pre-93.tex new file mode 100644 index 000000000..b67645806 --- /dev/null +++ b/tex/context/base/s-pre-93.tex @@ -0,0 +1,210 @@ +%D \module +%D [ file=s-pre-20, +%D version=2000.08.07, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment 20, +%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. + +\setupbodyfont + [lbr,14.4pt] + +\setuppapersize + [S6][S6] + +\setuplayout + [topspace=0cm, + backspace=0cm, + header=0pt, + footer=0pt, + width=middle, + height=middle] + +\setupcolors + [state=start] + +\setupinteraction + [state=start, + click=no, + display=new, + color=LineColor, + contrastcolor=LineColor] + +\setupinteractionscreen + [option=max] + +\setupsystem + [random=big] % once per hour + +\startreusableMPgraphic{page} + StartPage ; + filldraw Page withcolor \MPcolor{PageColor} ; + pickup pencircle scaled (.25cm+uniformdeviate.25cm) ; + for i=1 upto 200 : + drawdot + (uniformdeviate PaperWidth,uniformdeviate PaperHeight) + withcolor \MPcolor {LineColor} ; + endfor ; + StopPage ; +\stopreusableMPgraphic + +\startuseMPgraphic{idea} + StartPage ; + path p ; + p := unitsquare xyscaled(\MPw{idea:\realfolio},\MPh{idea:\realfolio}) superellipsed .90 ; + p := p shifted \MPxy{idea:\realfolio} ; + draw p withpen pencircle scaled .500cm withcolor \MPcolor{PageColor} ; + fill p withcolor \MPcolor{\overlaycolor} ; + draw p withpen pencircle scaled .250cm withcolor \MPcolor{LineColor} ; + p := unitsquare xyscaled(\MPw{title:\realfolio},\MPh{title:\realfolio}) superellipsed .90 ; + p := p shifted \MPxy{title:\realfolio} ; + draw p withpen pencircle scaled .250cm withcolor \MPcolor{PageColor} ; + fill p withcolor \MPcolor{\overlaycolor} ; + draw p withpen pencircle scaled .125cm withcolor \MPcolor{LineColor} ; + StopPage ; +\stopuseMPgraphic + +\definecolor[PageColor][s=.50] +\definecolor[TextColor][s=.80] +\definecolor[DoneColor][s=.65] +\definecolor[LineColor][r=.7,g=.6,b=.5] + +\defineoverlay [idea] [\useMPgraphic {idea}] +\defineoverlay [page] [\reuseMPgraphic{page}] + +\setupbackgrounds + [page] + [background={page,forward}] + +\defineoverlay[forward][\overlaybutton{forward}] + +% alternatief: buffer en ander regime, zodat lokale kleuren +% kunnen worden genilled. Pos gebruiken om te positioneren. + +\definereference[thispage][page(\realfolio)] + +\newbox\firstideabox \setbox\firstideabox =\null +\newbox\secondideabox \setbox\secondideabox=\null +\newbox\thirdideabox \setbox\thirdideabox =\null + +\def\StartTopic% bottom title, top title + {\dodoublegroupempty\doStartTopic} + +\def\doStartTopic#1#2% the positions end up at each page -) + {\setbox\firstideabox= + \vbox to \makeupheight + \bgroup + \getrandomdimen\scratchdimen{.5cm}\makeupheight + \vskip 0cm plus \scratchdimen + \hbox to \makeupwidth + \bgroup + \getrandomdimen\scratchdimen{.5cm}\makeupwidth + \hskip 0cm plus \scratchdimen + \setbox\scratchbox=\hbox\bgroup\hpos{idea:\realfolio} + \bgroup + \getrandomdimen\hsize{.5\makeupwidth}{.7\makeupwidth}% + \framed + [offset=3ex,align=middle,strut=no,frame=off, + before=,after=] + \bgroup + \setupwhitespace[big]% + \doifsomething{#2}{\Title{#2}}% + \def\StopTopic{% + \egroup + \egroup + \egroup + \gotobox{\box\scratchbox}[thispage]% + \getrandomdimen\scratchdimen{.5cm}\makeupwidth + \hskip 0cm plus \scratchdimen + \egroup + \getrandomdimen\scratchdimen{.5cm}\makeupheight + \vskip 0cm plus \scratchdimen + \hbox to \makeupwidth + \bgroup + \hfill + \hpos{title:\realfolio} + {\button[offset=1.5ex,frame=off]{#1}[backward]}% + \getrandomdimen\scratchdimen{.5cm}{2.5cm}% + \hskip \scratchdimen + \egroup + \getrandomdimen\scratchdimen{.5cm}{1.5cm} + \vskip \scratchdimen + \egroup + \setbox\secondideabox=\vbox + {\framed + [offset=overlay,frame=off,background=idea,backgroundcolor=TextColor] + {\copy\firstideabox}} + \setbox\firstideabox=\vbox + {\framed + [offset=overlay,frame=off,background=idea,backgroundcolor=DoneColor] + {\LineColor\copy\firstideabox}} + \startstandardmakeup + \startoverlay + {\copy\thirdideabox } + {\copy\secondideabox} + \stopoverlay + \stopstandardmakeup + \setbox\thirdideabox=\vbox + {\startoverlay + {\copy\thirdideabox } + {\copy\firstideabox} + \stopoverlay}}} + +\long\def\TitlePage#1#2% + {\bgroup + \switchtobodyfont[32pt] + \StartTopic{#1}#2\StopTopic + \egroup} + +\def\Title#1{\midaligned{\bfb#1}\blank} + +\doifnotmode{demo}{\endinput} + +% \usemodule[pre-super] % super ellipse as well as superpositioned + +\starttext + +\setupoutput[pdftex] + +\TitlePage{August 2000}{Something Very Important} + +\StartTopic{Alpha} + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. +\StopTopic + +\StartTopic{Beta and Gamma} + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. +\StopTopic + +\StartTopic{Delta} + A simple and not too long text just to show the idea. +\StopTopic + +\StartTopic{Epsilon} + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. +\StopTopic + +\StartTopic{Zeta, Eta and Theta} + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. +\StopTopic + +\StartTopic{Omega} + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. + A simple and not too long text just to show the idea. +\StopTopic + +\stoptext diff --git a/tex/context/base/scrn-bar.mkiv b/tex/context/base/scrn-bar.mkiv new file mode 100644 index 000000000..fd274419d --- /dev/null +++ b/tex/context/base/scrn-bar.mkiv @@ -0,0 +1,398 @@ +%D \module +%D [ file=scrn-bar, % was part of scrn-int +%D version=1995.01.01, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Progress Bars, +%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 Screen Macros / Progress Bars} + +\unprotect + +%D The code is a bit upgraded to \MKIV\ but the output is mostly the same. +%D In retrospect this shoul dhave been a module. + +% todo: replace blackrule by stupid rules + +% \setupinteraction[state=start] +% \setupsubpagenumber[state=start] +% +% \startsetups bars +% \vbox +% {\hsize 5cm +% \hbox{\interactionbar[a]}\blank +% \hbox{\interactionbar[b]}\blank +% \hbox{\interactionbar[c]}\blank +% \hbox{\interactionbar[d]}\blank +% \hbox{\interactionbar[e]}\blank +% \hbox{\interactionbar[f]}\blank +% \hbox{\interactionbar[g]}\blank +% } +% \stopsetups +% +% \setupheadertexts[\setups{bars}] +% +% \starttext +% \dorecurse{10}{test \page } +% \stoptext + +\presetlocalframed[\??ib] + +%D First the usual definition code. + +\let\currentinteractionbar\empty + +\def\setinteractionbarparameter#1#2#3{\@EA\def\csname\??ib#1#2\endcsname{#3}} +\def\letinteractionbarparameter #1#2{\@EA\let\csname\??ib#1#2\endcsname} + +\def\interactionbarparameter #1{\csname\dointeractionbarparameter{\??ib\currentinteractionbar}#1\endcsname} +\def\namedinteractionbarparameter#1#2{\csname\dointeractionbarparameter{\??ib#1}#2\endcsname} +\def\interactionbarparameterhash #1{\dointeractionbarparameterhash {\??ib\currentinteractionbar}#1} + +\def\dointeractionbarparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointeractionbarparentparameter \csname#1\s!parent\endcsname#2\fi} +\def\dointeractionbarparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dointeractionbarparentparameterhash\csname#1\s!parent\endcsname#2\fi} + +\def\dointeractionbarparentparameter #1#2{\ifx#1\relax\s!empty\else\dointeractionbarparameter #1#2\fi} +\def\dointeractionbarparentparameterhash#1#2{\ifx#1\relax \else\dointeractionbarparameterhash#1#2\fi} + +\def\defineinteractionbar{\dodoubleargument\dodefineinteractionbar} +\def\setupinteractionbar {\dodoubleempty \dosetupinteractionbar} +\def\interactionbar {\dodoubleempty \dointeractionbar} + +\def\dosetupinteractionbar[#1][#2]% + {\ifsecondargument + \getparameters[\??ib#1][#2]% + \else + \getparameters[\??ib][#1]% + \fi} + +\def\dodefineinteractionbar[#1][#2]% + {\getparameters + [\??ib#1]% + [\s!parent=\??ib,% +% \c!foregroundcolor=\interactionbarparameter\c!color,% +% \c!foregroundstyle=\interactionbarparameter\c!style,% + #2]} + +\def\dointeractionbar[#1][#2]% + {\iflocation + \begingroup + \doifnot{#1}\v!reset % obsolete, no caching any more + {\doifassignmentelse{#1} + {\getparameters[\??ib][#2]% + \edef\currentinteractionbar{\interactionbarparameter\c!alternative}}% + {\edef\currentinteractionbar{#1}% + \ifsecondargument\getparameters[\??ib#1][#2]\fi}% + \doif{\interactionbarparameter\c!state}\v!start + {\interactionbarparameter\c!command}}% + \endgroup + \fi} + +\newdimen\interactionbarwidth +\newdimen\interactionbarheight +\newdimen\interactionbardepth +\newdimen\interactionbardistance + +%D Interaction buttons, in fact a row of tiny buttons, are +%D typically only used for navigational purposed. The next +%D macro builds such a row based on a specification list. +%D +%D \startbuffer +%D \interactionbuttons[width=\hsize][page,PreviousJump,ExitViewer] +%D \stopbuffer +%D +%D \typebuffer +%D +%D gives +%D +%D \getbuffer +%D +%D Apart from individual entries, one can use \type{page} and +%D \type {subpage} as shortcuts to their four associated buttons. +%D The symbols are derived from the symbols linked to the +%D entries. + +\def\interactionbuttons + {\dodoubleempty\dointeractionbuttons} + +\def\dointeractionbuttons[#1][#2]% er is een verdeel macro \horizontalfractions + {\iflocation + \begingroup + % beware, is already set \let\currentinteractionbar\empty + \doif{\interactionbarparameter\c!state}\v!stop\locationfalse + \iflocation + \ifsecondargument + \let\menuparameter\interactionbarparameter + \setupinteractionbar[#1]% + \interactionbarwidth\interactionbarparameter\c!width + \ifdim\interactionbarwidth=\zeropoint + \interactionbarwidth1.5\emwidth + \fi + \doifnothing\@@ibheight{\letinteractionbarparameter\c!height\v!broad}% + \doifnothing\@@ibdepth {\letinteractionbarparameter\c!depth\!!zeropoint}%%% + \setbox2\hbox{\localframed[\??ib\currentinteractionbar][\c!background=]{\symbol[\@@iasymbolset][\v!previouspage]}}% + \!!heighta\ht2 % needed because we default to nothing + \setupinteractionbar[\c!strut=\v!no]% + \setinteractionparameter\c!width\!!zeropoint + \!!counta\zerocount % new, was 1 + \processallactionsinset + [#2] + [ \v!page=>\advance\!!counta 4, + \v!subpage=>\advance\!!counta 4, + \s!unknown=>\advance\!!counta 1]% + \ifdim\interactionbarwidth=\zeropoint + \!!widtha\dimexpr2\emwidth+\interactionbardistance\relax + \!!widthb\dimexpr\!!counta\!!widtha-\interactionbardistance\relax + \else + \!!widtha\interactionbarwidth + \!!widthb\dimexpr\!!counta\interactionbardistance-\interactionbardistance\relax + \advance\!!widtha -\!!widthb + \divide\!!widtha \!!counta + \!!widthb\interactionbarwidth + \fi + \hbox to \!!widthb + {\setnostrut + \processallactionsinset + [#2] + [ \v!page=>\interactionbargotox\v!firstpage \interactionbargotox\v!nextpage \interactionbargotox\v!previouspage \interactionbargotox\v!lastpage, + \v!subpage=>\interactionbargotox\v!firstsubpage\interactionbargotox\v!nextsubpage\interactionbargotox\v!previoussubpage\interactionbargotox\v!lastsubpage, + \s!unknown=>\interactionbargotox\commalistelement]% + \unskip}% + \else + \interactionbuttons[][#1]% + \fi + \fi + \endgroup + \fi} + +\def\interactionbargotox#1% + {\normalexpanded{\noexpand\dodocomplexbutton +% {\??ib\currentinteractionbar}% + {\??ib}% + [\c!height=\the\!!heighta,\c!width=\the\!!widtha]% + {\noexpand\symbol[\@@iasymbolset][#1]}% + [#1]}% + \hss} + +\def\interactionbara + {\iflocation + \interactionbarwidth \interactionbarparameter\c!width + \interactionbardistance\interactionbarparameter\c!distance + \interactionbarheight \interactionbarparameter\c!height + \interactionbardepth \interactionbarparameter\c!depth + \noindent\hbox to \interactionbarwidth \bgroup + \dontcomplain + \setupblackrules[\c!height=\v!max,\c!depth=\v!max]% + \!!widthb\dimexpr\interactionbarwidth-4\emwidth\relax + \processaction + [\interactionbarparameter\c!step] + [ \v!small=>\scratchcounter 20, + \v!medium=>\scratchcounter 10, + \v!big=>\scratchcounter 5, + \s!unknown=>\scratchcounter 10]% + \!!widtha\dimexpr\!!widthb/\scratchcounter\relax + \setupblackrules[\c!width=\!!widtha]% + \setbox\scratchbox\hbox to \interactionbarwidth + {\hskip2\emwidth + \setbox\scratchbox\hbox{\blackrule[\c!color=\interactionbarparameter\c!backgroundcolor]}% + \dorecurse\scratchcounter + {\hss\normalexpanded{\directgotodumbbox{\copy\scratchbox}[page(\the\numexpr\recurselevel*\lastpage/\scratchcounter\relax)]}}% + \hss + \hskip2\emwidth}% + \wd\scratchbox\zeropoint + \box \scratchbox + \setupblackrules[\c!width=\emwidth]% + \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!firstpage]}% + \hskip\emwidth + \ifnum\realpageno>\plusone + \hskip\zeropoint\!!plus\numexpr\realpageno-\plustwo\relax \s!sp\relax % cm gives overflow + \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!previouspage)]}% + \fi + \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[page(\number\realpageno)]}% todo: \v!currentpage + \ifnum\realpageno<\lastpage\relax + \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!nextpage]}% + \hskip\zeropoint\!!plus\numexpr\lastpage-\realpageno-\plusone\relax \s!sp\relax % cm gives overflow + \fi + \hskip\emwidth + \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!lastpage]}% + \egroup + \fi} + +\def\interactionbarb + {\ifnum\lastpage>\firstpage\relax + \interactionbuttons[\v!firstpage,\v!previouspage,\v!nextpage,\v!lastpage]% + \fi} + +\def\interactionbarc + {\iflocation \ifnum\lastpage>\plusone + \interactionbarwidth\interactionbarparameter\c!width + \hbox to \interactionbarwidth + {\setupblackrules[\c!height=\interactionbarparameter\c!height,\c!depth=\interactionbarparameter\c!depth,\c!width=\emwidth]% + \scratchdimen\dimexpr(\interactionbarwidth-4\emwidth)/\numexpr\lastpage+\minusone\relax\relax + \!!widtha\numexpr\realpageno+\minusone\relax\scratchdimen + \!!widthb\numexpr\lastpage-\realpageno\relax\scratchdimen + \directgotospecbox\interactionbarparameter{\blackrule}[\v!firstpage]% + \hss + \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widtha]}[\v!previouspage]% + \blackrule[\c!color=\interactionbarparameter\c!contrastcolor]% + \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widthb]}[\v!nextpage]% + \hss + \directgotospecbox\interactionbarparameter{\blackrule}[\v!lastpage]}% + \fi \fi} + +\unexpanded\def\@@commoninteractionbargotoa#1% + {\symbol[\ifcase#1\v!previous\or\v!somewhere\or\v!next\fi]} + +\unexpanded\def\@@commoninteractionbargotob#1% + {\vrule\!!height\interactionbarheight\!!depth\interactionbardepth\!!width\!!widtha\relax} + +\unexpanded\def\@@commoninteractionbargotoc#1% + {\symbol[\ifcase#1\v!previous\or\v!somewhere\or\v!somewhere\or\v!somewhere\or\v!next\fi} + +\unexpanded\def\@@commoninteractionbargotod#1% + {\vrule \!!width\!!widtha \ifcase#1% + \!!height \interactionbarheight \!!depth \interactionbardepth \or + \!!height.5\interactionbarheight \!!depth.5\interactionbardepth \or + \!!height \interactionbarheight \!!depth \interactionbardepth \or + \!!height.5\interactionbarheight \!!depth.5\interactionbardepth \else + \!!height \interactionbarheight \!!depth \interactionbardepth \fi} + +\unexpanded\def\@@commoninteractionbarx#1% + {\doifelse{\interactionbarparameter\c!symbol}\v!yes + {\setupsymbolset[\@@iasymbolset]% + \let\dogotox\@@commoninteractionbargotoa} + {\let\dogotox\@@commoninteractionbargotob}% + \dorecurse\nofsubpages + {\scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax + \chardef\what + \ifnum\scratchcounter<\realpageno \zerocount \else + \ifnum\scratchcounter=\realpageno \plusone \else + \plustwo \fi\fi + \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\dogotox\what}[page(\the\scratchcounter)]}% + #1}% + \unskip} + +\def\interactionbard + {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{% + \interactionbarwidth \interactionbarparameter\c!width + \interactionbardistance\interactionbarparameter\c!distance + \interactionbarheight \interactionbarparameter\c!height + \interactionbardepth \interactionbarparameter\c!depth + \!!widtha\interactionbarwidth + \noindent\hbox{\@@commoninteractionbarx{\hskip\interactionbardistance}}% + }\fi \fi} + +\def\interactionbare + {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{% + \begingroup + \interactionbarwidth \interactionbarparameter\c!width + \interactionbardistance\interactionbarparameter\c!distance + \interactionbarheight \interactionbarparameter\c!height + \interactionbardepth \interactionbarparameter\c!depth + \!!widthb\dimexpr\nofsubpages\interactionbardistance-\interactionbardistance\relax % (n-1) + \!!widtha\dimexpr(\interactionbarwidth-\!!widthb)/\nofsubpages\relax + \ifdim\!!widtha<\interactionbardistance + \interactionbarf + \else + \noindent\hbox to \interactionbarwidth{\@@commoninteractionbarx{\hss}\unskip}% + \fi + \endgroup + }\fi\fi} + +\def\interactionbarf + {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{% + \interactionbarwidth \interactionbarparameter\c!width + \interactionbardistance\interactionbarparameter\c!distance + \interactionbarheight \interactionbarparameter\c!height + \interactionbardepth \interactionbarparameter\c!depth + \noindent \hbox to \interactionbarwidth \bgroup + \doloop + {\!!countc\numexpr(\nofsubpages/\recurselevel)+\plusone\relax % rounding + \!!widthb\interactionbardistance + \multiply\!!widthb \!!countc + \advance\!!widthb -\interactionbardistance + \!!widtha\interactionbarwidth + \advance\!!widtha -\!!widthb + \divide\!!widtha \!!countc + \ifdim\!!widtha<\interactionbardistance\else + \!!countb\recurselevel + \exitloop + \fi}% + \ifnum\!!countc>\plusone + % this is not that well tested + \advance\!!countc \minustwo + \!!widtha-\interactionbardistance + \!!widtha\!!countc\!!widtha + \advance\!!widtha \interactionbarwidth + \advance\!!countc \plusone + \divide\!!widtha \!!countc + \fi + \doifelse{\interactionbarparameter\c!symbol}\v!yes + {\setupsymbolset[\@@iasymbolset]% + \let\dogotox\@@commoninteractionbargotoc}% + {\let\dogotox\@@commoninteractionbargotod}% + \!!countc\numexpr\realpageno-\plustwo\relax + \!!countd\numexpr\realpageno+\plustwo\relax + \ifnum\!!countc<\plusone \!!countc\plusone \fi + \!!countf\zerocount + \dostepwiserecurse\firstsubpage\lastsubpage\plusone + {\!!doneafalse + \advance\!!countf \plusone + \ifnum\recurselevel=\firstsubpage\relax \!!doneatrue \fi + \ifnum\recurselevel=\lastsubpage \relax \!!doneatrue \fi + \chardef\what \if!!donea + \ifnum\recurselevel<\realpageno \zerocount \else + \ifnum\recurselevel>\realpageno \plustwo \else + \plusfour \fi\fi + \else \ifnum\!!countf=\!!countb + \ifnum\recurselevel<\realpageno \plusone \else + \ifnum\recurselevel>\realpageno \plusthree \else + \plustwo \fi\fi + \fi \fi + \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\dogotox\what}[page(\recurselevel)]}% + \hss + \!!countf\zerocount}% + \unskip + \egroup + }\fi\fi} + +\def\interactionbarg + {\iflocation \ifnum\lastsubpage>\firstsubpage\relax % no test for state? + \interactionbuttons[\v!firstsubpage,\v!previoussubpage,\v!nextsubpage,\v!lastsubpage]% + \fi \fi} + +\setupinteractionbar + [\c!state=\v!start, + \c!alternative=a, + \c!symbol=\v!no, + \c!width=10\emwidth, + \c!height=.5\emwidth, + \c!depth=\zeropoint, + \c!distance=.5\emwidth, + \c!step=\v!medium, + \c!foregroundcolor=\interactionbarparameter\c!color, + \c!foregroundstyle=\interactionbarparameter\c!style, + \c!color=\@@iacolor, + \c!contrastcolor=\@@iacontrastcolor, + \c!style=, + \c!frame=\v!on, + \c!background=color, + \c!backgroundcolor=gray, + \c!samepage=\v!yes, + \c!unknownreference=\v!yes] + +\defineinteractionbar[a][\c!command=\interactionbara] +\defineinteractionbar[b][\c!command=\interactionbarb,\c!height=\v!broad] +\defineinteractionbar[c][\c!command=\interactionbarc,\c!height=\v!max,\c!depth=\v!max] +\defineinteractionbar[d][\c!command=\interactionbard,\c!width=.5\emwidth] +\defineinteractionbar[e][\c!command=\interactionbare] +\defineinteractionbar[f][\c!command=\interactionbarf] +\defineinteractionbar[g][\c!command=\interactionbarg,\c!height=\v!broad] + +\protect \endinput diff --git a/tex/context/base/scrn-but.mkiv b/tex/context/base/scrn-but.mkiv new file mode 100644 index 000000000..6beaee757 --- /dev/null +++ b/tex/context/base/scrn-but.mkiv @@ -0,0 +1,126 @@ +%D \module +%D [ file=scrn-but, % moved code +%D version=1995.01.01, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Interaction, +%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 Screen Macros / Buttons} + +\unprotect + +%D Buttons are just what their names says: things that can be +%D clicked (pushed) on. They are similar to \type{\goto}, +%D except that the text argument is not interpreted. +%D Furthermore one can apply anything to them that can be done +%D with \type{\framed}. +%D +%D \startbuffer +%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer] +%D \stopbuffer +%D +%D \typebuffer +%D +%D gives +%D +%D \getbuffer +%D +%D This command is formally specified as: +%D +%D \showsetup{button} +%D +%D The characteristics can be set with: +%D +%D \showsetup{setupbuttons} + +\def\setupbuttons + {\dodoubleargument\getparameters[\??bt]} + +\definecomplexorsimpleempty\button + +\def\complexbutton + {\docomplexbutton\??bt} + +\presetlocalframed[\??bt] + +\def\buttonparameter#1{\csname\??bt#1\endcsname} % simple version + +\long\def\docomplexbutton#1[#2]#3#4% get rid of possible space before [#4] + {\dodocomplexbutton#1[#2]{#3}#4} % #4 == [ + +\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie + +% #3=none is obsolete, just use empty=yes + +\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later + {\begingroup + \let\menuparameter\buttonparameter + \doif{\buttonparameter\c!state}\v!stop\locationfalse + \iflocation + \setlocationboxyes#1[#2]{#3}[#4]% + \fi + \endgroup} + +%D \macros +%D {overlaybutton} +%D +%D For converience we provide: +%D +%D \starttyping +%D \overlaybutton[reference] +%D \stoptyping +%D +%D This command can be used to define overlays an/or can be +%D used in the whatevertext areas, like: +%D +%D \starttyping +%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}] +%D \setupbackgrounds[page][background=PrevPage] +%D \setuptexttexts[\overlaybutton{NextPage}] +%D \stoptyping +%D +%D For practical reasons, this macro accepts square brackets +%D as well as braces. + +\definecomplexorsimple\overlaybutton + +\def\simpleoverlaybutton#1% + {\complexoverlaybutton[#1]} + +\def\complexoverlaybutton[#1]% + {\iflocation + \gotobox{\overlayfakebox}[#1]% + \fi} + +\def\overlayfakebox + {\hbox + {\setbox\scratchbox\null + \wd\scratchbox\overlaywidth + \ht\scratchbox\overlayheight + \box\scratchbox}} + +%D Done. + +\setupbuttons + [\c!state=\v!start, + \c!width=\v!fit, + \c!height=\v!broad, + \c!offset=0.25em, + \c!frame=\v!on, + \c!background=, + \c!backgroundcolor=, + \c!foregroundstyle=\buttonparameter\c!style, + \c!foregroundcolor=\buttonparameter\c!color, + \c!style=\@@iastyle, + \c!color=\@@iacolor, + \c!contrastcolor=\@@iacontrastcolor, + \c!samepage=\v!yes, + \c!unknownreference=\v!yes] + +\protect \endinput diff --git a/tex/context/base/scrn-fld.mkii b/tex/context/base/scrn-fld.mkii index 60511ac2b..85e4aa738 100644 --- a/tex/context/base/scrn-fld.mkii +++ b/tex/context/base/scrn-fld.mkii @@ -1077,4 +1077,169 @@ \setupforms [\c!method=HTML] +%D Goodie: + +\def\definepushbutton % name optional setup + {\dodoubleempty\dodefinepushbutton} + +\def\dodefinepushbutton[#1][#2]% name setup + {\dododefinepushbutton{#1}{n}{push}% + \dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}% + \dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}% + \setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}} + +\def\dododefinepushbutton#1#2#3% + {\doifsymboldefinedelse{psym:#1:#2}% + \donothing{\definesymbol[psym:#1:#2][{#3}]}} + +\def\definepushsymbol + {\dotripleargument\dodefinepushsymbol} + +\def\dodefinepushsymbol[#1][#2]% [#3] + {\definesymbol[psym:#1:#2]} + +\def\dopushbutton[#1][#2]% + {\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}} + +\def\pushbutton + {\dodoubleargument\dopushbutton} + +\def\dohandlepushbutton#1#2#3% identifier setup script + {\bgroup + \nextsystemfield + \setupfield + [pushbutton] + [\c!frame=\v!overlay, + \c!offset=\v!overlay, + \c!clickout=#3,#2]% + \definefield + [\currentsystemfield] + [push] + [pushbutton] + [psym:#1:n,psym:#1:r,psym:#1:d]% + \fitfield + [\currentsystemfield]% + \egroup} + +% \def\do@@ampsh +% {\dodoubleargument\dodo@@ampsh} +% +% \def\dodo@@ampsh[#1][#2]#3\\% +% {\txt\pushbutton[#1][#2]\\}% +% +%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands + +\def\@@ampsh{\txt\pushbutton} + +\appendtoks \let\psh\@@ampsh \to \everysetmenucommands + +% \definepushbutton [reset] +% +% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}] +% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}] +% +% \startinteractionmenu[bottom] +% \psh [reset] [JS(reset_something)] \\ +% \stopinteractionmenu + +%D Another goodie: + +% \definecolor[rollover:n][red] +% \definecolor[rollover:r][green] +% \definecolor[rollover:d][blue] + +\definepalet + [rollover] + [n=red, + r=green, + d=blue] + +\newcounter\nofrollovers +\newcounter\nofrollbuttons + +\def\dorollbutton[#1][#2]#3[#4]% + {\dontleavehmode + \bgroup + \doglobal\increment\nofrollovers + \doglobal\increment\nofrollbuttons + \unexpanded\def\dosetlocationbox[##1]##2[##3]% + {\getparameters[##1][##3]% + \definecolor[rollover][rollover:##2]% + \doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox + {\localframed[##1] + [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]% + {\dolocationattributes{##1}\c!style\c!color{#3}}}}% + \iffirstargument + \ifsecondargument + \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}% + \else + \doifassignmentelse{#1} + {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}} + {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}% + \fi + \else + \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}% + \fi + % todo: share symbols, tricky since different dimensions + \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]% + \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]% + \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]% + \setupfield + [rollbutton] + [\c!frame=\v!off, + \c!offset=\v!overlay, + \c!clickout={#4}]% + \definefield + [roll:\nofrollbuttons][push][rollbutton] + [rsym:\nofrollovers:n,% + rsym:\nofrollovers:r,% + rsym:\nofrollovers:d]% + \fitfield[roll:\nofrollbuttons]% + \egroup} + +\unexpanded\def\rollbutton + {\dodoubleempty\dorollbutton} + +\def\menu@rob[#1]#2\\% + {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}% + +\appendtoks \let\rob\menu@rob \to \everysetmenucommands + +% calls: +% {..} [JS..] +% [left] {..} [JS..] +% [a=b] {..} [JS..] +% [left] [a=b] {..} [JS..] +% +% \setupbuttons[offset=0pt,frame=off] % alternative=hidden +% +% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})] +% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})] +% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})] +% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})] +% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})] +% +% \rob [JS(...)] bla bla \\ + +\unexpanded\def\overlayrollbutton + {\dodoubleargument\dooverlayrollbutton} + +\def\dooverlayrollbutton[#1][#2]% + {\bgroup + \nextsystemfield + \setupfield + [overlayrollbutton] + [\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]% + \definesymbol + [\currentsystemfield] + [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]% + \definefield + [\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]% + \fitfield[\currentsystemfield]% + \egroup} + +% \defineoverlay +% [ShowMenu] +% [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}] + \protect \endinput diff --git a/tex/context/base/scrn-fld.mkiv b/tex/context/base/scrn-fld.mkiv index 604b675c0..eef6bbe7d 100644 --- a/tex/context/base/scrn-fld.mkiv +++ b/tex/context/base/scrn-fld.mkiv @@ -11,310 +11,20 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% \appendtocommalist versus \addtocommalist -% -% * as default trigger in radiofields ? -% -% beware: weblink plugin truncates on length, while save as doesn't; -% more precise: (1) first time right string is sent, (2) -% internal string truncated, (3) second time truncated -% string is sent. - \writestatus{loading}{ConTeXt Screen Macros / Fields} -% messages - -\definemessageconstant{fields} - \unprotect %D First we hook fields into the (viewer based) layering mechanism %D (implemented as properties). -\ifx\currentlayerproperty\undefined\else \let\currentlayerproperty\empty\fi - \appendtoks - \doif\@@iafieldlayer\v!auto - {\def\@@iafieldlayer{\currentlayerproperty}}% + \doif\@@iafieldlayer\v!auto{\def\@@iafieldlayer{\currentviewerlayer}}% \to \everysetupinteraction \setupinteraction [\c!fieldlayer=\v!auto] % auto by default -%D Internal command, linked to \type{\definesymbol}. - -\def\dogetfieldsymbol#1% - {\getobject{SYM}{#1}} - -\def\dopresetfieldsymbol#1% - {\doifobjectfoundelse{SYM}{#1} - {} - {\settightobject{SYM}{#1}\hbox{\symbol[#1]}% - \flushatshipout - {\setbox0\hbox{\hskip-\maxdimen\getobject{SYM}{#1}}% - \smashbox0\box0}}} - -\def\presetfieldsymbols[#1]% slow - {\def\dopresetfieldsymbols##1% - {\processcommalist[##1]\dopresetfieldsymbol}% - \@EA\processcommalist\@EA[#1]\dopresetfieldsymbols} - -\def\definedefaultsymbols - {\definesymbol[defaultyes][$\times$]% - \definesymbol[defaultno][$\cdot$]} - -\def\resetfieldsymbol[#1]% for experimental usage only - {\resetobject{SYM}{#1}} - -%D The interface to the specials. DEFAULT NOG ANDERS - -\def\preparefieldvariables % evt \def's at the outer level (test) or \edef's here for fast testing - {\let\@@DriverFieldNumber \@@fdn - \let\@@DriverFieldStyle \@@fdstyle - \let\@@DriverFieldColor \@@fdcolor - \let\@@DriverFieldBackgroundColor\@@fdfieldbackgroundcolor - \let\@@DriverFieldFrameColor \@@fdfieldframecolor - \let\@@DriverFieldLayer \@@fdfieldlayer - \let\@@DriverFieldOption \@@fdoption - \let\@@DriverFieldAlign \@@fdalign - \let\@@DriverFieldClickIn \@@fdclickin - \let\@@DriverFieldClickOut \@@fdclickout - \let\@@DriverFieldRegionIn \@@fdregionin - \let\@@DriverFieldRegionOut \@@fdregionout - \let\@@DriverFieldAfterKey \@@fdafterkey - \let\@@DriverFieldFormat \@@fdformat - \let\@@DriverFieldValidate \@@fdvalidate - \let\@@DriverFieldCalculate \@@fdcalculate - \let\@@DriverFieldFocusIn \@@fdfocusin - \let\@@DriverFieldFocusOut \@@fdfocusout} - -% todo : remove arguments, consider DriverField a namespace - -\def\presetlinefield - {\preparefieldvariables - \dopresetlinefield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldNumber} - {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor} - {\@@DriverFieldOption} - {\@@DriverFieldAlign} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presettextfield - {\preparefieldvariables - \dopresettextfield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldNumber} - {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor} - {\@@DriverFieldOption} - {\@@DriverFieldAlign} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presetchoicefield - {\preparefieldvariables - \dopresetchoicefield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor} - {\@@DriverFieldOption} - {\@@DriverFieldValues} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presetpopupfield - {\preparefieldvariables - \dopresetpopupfield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor} - {\@@DriverFieldOption} - {\@@DriverFieldValues} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presetcombofield - {\preparefieldvariables - \dopresetcombofield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor} - {\@@DriverFieldOption} - {\@@DriverFieldValues} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presetcheckfield - {\preparefieldvariables - \presetfieldsymbols[\@@DriverFieldValues]% - \dopresetcheckfield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldOption} - {\@@DriverFieldValues} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presetpushfield - {\preparefieldvariables - %\edef\@@DriverFieldValues{{\@@DriverFieldValues}}% makes sure {a,b,c} is passed - \presetfieldsymbols[\@@DriverFieldValues]% - \dopresetpushfield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldOption} - {\@@DriverFieldValues} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presetradiofield - {\preparefieldvariables - \presetfieldsymbols[\@@DriverFieldValues]% - \dopresetradiofield - {\@@DriverFieldName} - {\@@DriverFieldWidth} - {\@@DriverFieldHeight} - {\@@DriverFieldDefault} - {\@@DriverFieldOption} - {\@@DriverFieldRoot} - {\@@DriverFieldValues} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\presetradiorecord - {\preparefieldvariables - \dopresetradiorecord - {\@@DriverFieldName} - {\@@DriverFieldDefault} - {\@@DriverFieldOption} - {\@@DriverFieldKids} - {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,% - \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,% - \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}} - -\def\setfieldmodes#1#2#3% - {\xdef\@@DriverFieldMode{#1}% % 0 1 2 3 - \xdef\@@DriverFieldFree{#2}% % 0 1 - \xdef\@@DriverFieldAuto{#3}} % 0 1 - -\newevery\everysetfield\relax - -\def\doiffieldelse#1{\doifdefinedelse{fielddata#1}} - -\def\setfield#1#2#3#4#5#6#7#8#9% - {\bgroup - \doglobal\increment\numberoffields - \iftracefields - \doglobal\addtocommalist{#1}\collectedfields - \fi - \the\everysetfield - \setxvalue{fielddata#1}% kortere tag #7 needs expansion etc - {\noexpand\dosetfield{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}% - \egroup} - -\def\dosetfield#1#2#3#4#5#6#7#8#9% - {\xdef\@@DriverFieldName {#1}% - \xdef\@@DriverFieldType {#2}% - \xdef\@@DriverFieldRoot {#3}% - \xdef\@@DriverFieldParent {#4}% - \xdef\@@DriverFieldKids {#5}% - \xdef\@@DriverFieldGroup {#6}% - \setfieldmodes #7% - \bgroup - \def\par{\string\n\string\n}% - \xdef\@@DriverFieldValues {#8}% - \xdef\@@DriverFieldDefault{#9}% - \egroup} - -\def\changefield#1% - {\setfield{#1}\@@DriverFieldType\@@DriverFieldRoot\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldGroup - {\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}\@@DriverFieldValues\@@DriverFieldDefault} - -\def\getfield#1% name - {\doifundefinedelse{fielddata#1} - {\dosetfield{#1}\empty\empty\empty\empty\empty{\empty00}\empty\empty} - {\getvalue{fielddata#1}}} - -\newif\iftracefields \tracefieldsfalse - -\let\tracefields\tracefieldstrue - -\def\doshowfields[#1]% todo: tabulate van maken en runtime - {\bgroup - \switchtobodyfont[8pt,tt]% - \doifsomething{#1}{\def\collectedfields{#1}}% - \ifx\collectedfields\empty - \par specify [fieldlist] or say \type{\tracefieldstrue} first\par - \else - \def\normalizedfieldmode##1##2##3% - {\ifcase0##2 \else\sl\fi - \ifcase0##1 loner\or parent\or clone\or copy\fi}% - \def\dosetfield##1##2##3##4##5##6##7##8##9% - {##1&##2&##3&##4&##5&##6&\normalizedfieldmode##7&##8&##9\cr}% - \halign - {&##\strut\hss\quad\cr - \noalign{\hrule}% - NAME &TYPE &ROOT & - PARENT&KIDS &GROUP & - MODE &VALUES&DEFAULT\cr - \noalign{\hrule}% - \@EA\globalprocesscommalist\@EA[\collectedfields]\getfield - \noalign{\hrule}}% - \fi - \egroup} - -\def\showfields - {\dosingleempty\doshowfields} - -\def\dologfields[#1]% - {\bgroup - \immediate\openout\scratchwrite=fields.log - \doifsomething{#1}{\def\collectedfields{#1}}% - \ifx\colledtedfields\empty - \immediate\write\scratchwrite{use \tracefieldstrue}% - \else - \def\normalizedfieldmode##1##2##3% - {\edef\@@DriverFieldMode - {\ifcase##1 loner \or parent \or clone \or copy \fi - \ifcase##2 \else(done)\fi}}% - \def\dosetfield##1##2##3##4##5##6##7##8##9% - {\normalizedfieldmode##7% - \immediate\write\scratchwrite - {N=##1 / T=##2 / R=##3 / P=##4 / K=##5 / G=##6 / - M=\@@DriverFieldMode\space/ V=##8 / D=##9}}% - \processcommacommand[\collectedfields]\getfield - \fi - \immediate\closeout\scratchwrite - \egroup} - -\def\logfields - {\dosingleempty\doLogFields} - %D \starttyping %D \definefield [name] [type] [group] [values] [default] %D @@ -340,411 +50,124 @@ %D \fitfield[XXXX] %D \stoptyping -\newif\ifdefinemainfield \definemainfieldfalse +%D Internal command, linked to \type{\definesymbol}. -%D We need to keep track of cloned (related) fields and so by -%D maintaining lists of field clones. -%D -%D The first alternative used a two pass data list and was -%D implemented as follows: -%D -%D \starttyping -%D \def\getmainfieldkids#1% -%D {\let\@@DriverFieldKids\empty -%D \ifdefinemainfield -%D \definetwopasslist{fld:#1}% defined by system -%D \doloop -%D {\gettwopassdata{fld:#1}% -%D \iftwopassdatafound -%D %\addtocommalist\twopassdata\@@DriverFieldKids -%D \appendtocommalist\twopassdata\@@DriverFieldKids -%D \else -%D \exitloop -%D \fi}% -%D \fi} -%D \stoptyping -%D -%D However, the next alternative is much faster when we have -%D a field with thousands of clones, something not that -%D imaginary. -%D -%D \starttyping -%D \def\getmainfieldkids#1% -%D {\let\@@DriverFieldKids\empty -%D \ifdefinemainfield -%D \definetwopasslist{fld:#1}% runtime defined by system -%D \getnamedtwopassdatalist{fld:#1}\@@DriverFieldKids -%D \fi} -%D \stoptyping -%D -%D The data is written by file using: -%D -%D \starttyping -%D \newcounter\nofmainfieldkids -%D -%D \def\setmainfieldkid#1#2% -%D {\doglobal\increment\nofmainfieldkids -%D \savetwopassdata{fld:#1}{\nofmainfieldkids}{#2}} -%D \stoptyping -%D -%D The trade of of this mechanism is that for each cloned or -%D copied field, the uitlity file is to be read in order to -%D fetch the data. -%D -%D The next, much faster alternative uses a dedicated % -%D reference mechanism. - -\def\setmainfieldkid#1#2% - {\immediatewriteutilitycommand{\fieldreference{#1}{#2}}} - -\def\checkfieldreferences - {\startnointerference - \protectlabels - \doutilities{fieldreferences}\jobname\empty\relax\relax - \global\let\checkfieldreferences\relax - \stopnointerference} - -\def\setfieldreferences - {\def\fieldreference##1##2% - {\ifundefined{\r!widget##1}% - \setxvalue{\r!widget##1}{##2}% - \else - \edef\!!stringa{\getvalue{\r!widget##1}}% - \setxvalue{\r!widget##1}{\!!stringa,##2}% - \fi}} +\def\dogetfieldsymbol#1% + {\getobject{SYM}{#1}} -\def\resetfieldreferences - {\let\fieldreference\gobbletwoarguments} +\def\dopresetfieldsymbol#1% + {\doifobjectfoundelse{SYM}{#1} + {} + {\settightobject{SYM}{#1}\hbox{\symbol[#1]}% + \flushatshipout + {\setbox0\hbox{\hskip-\maxdimen\getobject{SYM}{#1}}% + \smashbox0\box0}}} -\def\getmainfieldkids#1% - {\checkfieldreferences - \ifdefinemainfield - \doifundefinedelse{\r!widget#1}% - {\let\@@DriverFieldKids\empty} - {\@EA\let\@EA\@@DriverFieldKids\csname\r!widget#1\endcsname}% - \else - \let\@@DriverFieldKids\empty - \fi} +\def\presetfieldsymbols[#1]% slow + {\def\dopresetfieldsymbols##1{\processcommalist[##1]\dopresetfieldsymbol}% + \@EA\processcommalist\@EA[#1]\dopresetfieldsymbols} -\resetfieldreferences +\def\definedefaultsymbols + {\definesymbol[defaultyes][$\times$]% + \definesymbol[defaultno][$\cdot$]} -%D Of course it costs a few more tokens to implement, but it's -%D worth the memory: running for instance the 2000 page -%D english examns publishing on demand document went down from -%D 1350 seconds to less than 950 on a 650 Mhz pentium. +\def\resetfieldsymbol[#1]% for experimental usage only + {\resetobject{SYM}{#1}} -\def\definefield - {\definemainfieldfalse\doquintupleempty\dodefinefield} +%D The interface to the specials. DEFAULT NOG ANDERS -\def\definemainfield - {\definemainfieldtrue \doquintupleempty\dodefinefield} +\def\typesetfield + {\ctxlua{backends.codeinjections.typesetfield("\currentfieldname", { + title = "\currentfieldname", + width = \number\dimexpr\@@fdwidth\relax, + height = \number\dimexpr\@@fdheight\relax, + align = "\@@fdalign", + length = tonumber("\@@fdn") or 0, + style = "\@@fdstyle", + color = "\@@fdcolor", + backgroundcolor = "\@@fdfieldbackgroundcolor", + framecolor = "\@@fdfieldframecolor", + layer = "\@@fdfieldlayer", + options = "\@@fdoption", + align = "\@@fdalign", + clickin = "\@@fdclickin", + clickout = "\@@fdclickout", + regionin = "\@@fdregionin", + regionout = "\@@fdregionout", + afterkey = "\@@fdafterkey", + format = "\@@fdformat", + validate = "\@@fdvalidate", + calculate = "\@@fdcalculate", + focusin = "\@@fdfocusin", + focusout = "\@@fdfocusout", + }) }} + +\unexpanded\def\definefieldset {\dodoubleargument\dodefinefieldset} +\unexpanded\def\definefield {\doquintupleempty\dodefinefield} +\unexpanded\def\definemainfield{\doquintupleempty\dodefinefield} % redundant +\unexpanded\def\definesubfield {\dotripleempty \dodefinesubfield} +\unexpanded\def\clonefield {\doquadrupleempty\doclonefield} +\unexpanded\def\copyfield {\dodoubleempty \docopyfield} +\unexpanded\def\field {\dodoubleempty \donormalfield} +\unexpanded\def\fitfield {\dodoubleempty \dofitfield} +\unexpanded\def\setupfield {\doquintupleempty\dosetupfield} +\unexpanded\def\setupfields {\doquadrupleempty\dosetupfields} -\let\collectedfields\empty -\newcounter\numberoffields -\newcounter\totalnumberoffields +% misc -\def\savenumberoffields - {\ifcase\numberoffields\relax\else - \savecurrentvalue\totalnumberoffields\numberoffields - \fi} +\appendtoks\ctxlua{backends.codeinjections.finishfields()}\to\everylastshipout -\appendtoks \savenumberoffields \to \everybye % \everylastshipout +% testing -% \def\presetfieldreferences -% {\ifnum\totalnumberoffields>0 -% \definereference[AtOpenInitializeForm][\v!ResetForm]% -% \fi} -% -% \definereference[AtOpenInitializeForm][\v!geen] -% -% \appendtoks \presetfieldreferences \to \everycheckreferences +\def\doiffieldelse #1{\ctxlua{backends.codeinjections.doiffieldelse("#1")}} +\def\doiffieldgroupelse#1{\ctxlua{backends.codeinjections.doiffieldgroupelse("#1")}} -\def\dodefinefield[#1][#2][#3][#4][#5]% - {\ifsecondargument - \edef\currentfieldname{#1}% just in case we're inside a loop - \doifundefinedelse{define#2field} - {\writestatus\m!fields{unknown field type #2}} - {\doifundefined{fielddata\currentfieldname} - {\getmainfieldkids\currentfieldname - \ifdefinemainfield - \ifx\@@DriverFieldKids\empty - \let\@@DriverFieldMode\fieldlonermode - \else - \let\@@DriverFieldMode\fieldparentmode - \fi - \def\@@DriverFieldAuto{1}% - \else - \let\@@DriverFieldMode\fieldlonermode - \def\@@DriverFieldAuto{0}% - \fi - \def\@@DriverFieldFree{0}% - \getvalue{define#2field}{\currentfieldname}{#2}{#3}{#4}{#5}}}% - \else - \writestatus\m!fields{pass fieldname and fieldtype}% - \fi} +% definition -\def\definelinefield#1#2#3#4#5% - {\setfield{#1}{#2}{}{}{\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{#4}} - -\let\definetextfield=\definelinefield - -\def\definechoicefield#1#2#3#4#5% - {\doifelsenothing{#4} - {\def\@@DriverFieldValues{yes,no}} - {\def\@@DriverFieldValues{#4}}% - \doifelsenothing{#5} - {\dogetcommacommandelement2\from\@@DriverFieldValues \to\@@DriverFieldDefault - \dogetcommacommandelement1\from\@@DriverFieldDefault\to\@@DriverFieldDefault} - {\def\@@DriverFieldDefault{#5}}% - \setfield{#1}{#2}{}{}{\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{\@@DriverFieldValues}{\@@DriverFieldDefault}} - -\let\definepopupfield=\definechoicefield -\let\definecombofield=\definechoicefield - -%\def\definecheckfield#1#2#3#4#5% -% {\doifelsenothing{#4} -% {\definedefaultsymbols -% \def\@@DriverFieldValues{defaultyes}} -% {\def\@@DriverFieldValues{#4}}% -% \doifelsenothing{#5} -% {\dogetcommacommandelement2\from\@@DriverFieldValues\to\@@DriverFieldDefault -% \dogetcommacommandelement1\from\@@DriverFieldDefault\to\@@DriverFieldDefault} -% {\def\@@DriverFieldDefault{#5}}% -% \setfield{#1}{#2}{}{}{\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{\@@DriverFieldValues}{\@@DriverFieldDefault}} - -%D Since these fields have an on/off state only, we pass 1/0 -%D to the driver as default values. - -\def\definecheckfield#1#2#3#4#5% - {\doifelsenothing{#4} - {\definedefaultsymbols - \def\@@DriverFieldValues{defaultyes}} - {\def\@@DriverFieldValues{#4}}% - \doifelsenothing{#5} - {\def\@@DriverFieldDefault{2}} - {\dogetcommacommandelement1\from\@@DriverFieldValues\to\@@DriverFieldDefault - \doifinstringelse{#5}{\@@DriverFieldDefault} - {\def\@@DriverFieldDefault{1}} - {\def\@@DriverFieldDefault{0}}}% - \setfield - {#1}{#2}{}{}{\@@DriverFieldKids}{#3}% - {\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}% - {\@@DriverFieldValues}{\@@DriverFieldDefault}} - -\let\definepushfield=\definecheckfield - -\def\defineradiofield#1#2#3#4#5% - {\iffourthargument - \doifelsenothing{#5} - {\dogetcommacommandelement1\from#4\to\SavedFieldDefault - \dogetcommacommandelement1\from\SavedFieldDefault\to\SavedFieldDefault} - {\def\SavedFieldDefault{#5}}% -% when opt works -% \@EA\beforesplitstring\SavedFieldDefault\at=>\to\SavedFieldDefault - \ifx\@@DriverFieldKids\empty - \setfield{#1}{#2}{}{}{#4}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\SavedFieldDefault}% - \else - \setfield{#1}{#2}{}{}{#4,\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\SavedFieldDefault}% - \fi -% - \def\docommand##1% - {\doifelse{##1}\SavedFieldDefault - {\def\@@DriverFieldDefault{##1}}% - {\let\@@DriverFieldDefault\empty}% - \setfield{##1}{#2}{#1}{}{}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\@@DriverFieldDefault}}% -% when opt works -% \def\docommand##1% -% {\@EA\beforesplitstring##1\at=>\to\FieldValue -% \doifelse\FieldValue\SavedFieldDefault -% {\let\@@DriverFieldDefault\FieldValue}% -% {\let\@@DriverFieldDefault\empty}% -% \setfield\FieldValue{#2}{#1}{}{}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\@@DriverFieldDefault}}% - \processcommalist[#4]\docommand - \else - \writestatus\m!fields{pass values too}% - \fi} - -\def\definesubfield - {\dotripleempty\dodefinesubfield} - -\def\dodefinesubfield[#1][#2][#3]% for the moment only radio ones - {\ifsecondargument - \def\docommand##1% - {\getfield{##1}% - \ifx\@@DriverFieldType\empty - \writestatus\m!fields{unknown field ##1}% to do - \else - \doifsomething{#2} - {\edef\@@DriverFieldGroup{#2}}% - \doifelsenothing{#3} - {\definedefaultsymbols - \def\@@DriverFieldValues{defaultyes}} - {\def\@@DriverFieldValues{#3}}% - \changefield{##1}% - \fi}% - \processcommalist[#1]\docommand - \else - \writestatus\m!fields{pass fieldname, setupgroup, values and default}% - \fi} +\def\dodefinefield[#1][#2][#3][#4][#5]% [name] [kind] [group] [values] [default] + {\ctxlua{backends.codeinjections.definefield{ variant="normal", name="#1", kind="#2", group="#3", values=\!!bs#4\!!es, default=\!!bs#5\!!es }}} -\def\doclonefield[#1][#2][#3][#4]% parent children setupgroup values - {\ifsecondargument - \getfield{#1}% -\iftrialtypesetting\else - \ifx\@@DriverFieldType\empty - \writestatus\m!fields{unknown field #1}% - \else - \let\@@DriverFieldMode\fieldparentmode - %\def\docommand##1{\addtocommalist{##1}\@@DriverFieldKids}% - \def\docommand##1{\appendtocommalist{##1}\@@DriverFieldKids}% - \processcommalist[#2]\docommand - \changefield{#1}% - \let\@@DriverFieldAutoParent\@@DriverFieldAuto - \def\@@DriverFieldParent{#1}% - \let\@@DriverFieldKids\empty - \let\@@DriverFieldRoot\empty - \let\@@DriverFieldMode\fieldchildmode - \def\@@DriverFieldFree{0}% - \def\@@DriverFieldAuto{0}% - \doifsomething{#3}{\edef\@@DriverFieldGroup{#3}}% - \doifsomething{#4}{\edef\@@DriverFieldValues{#4}}% - \def\docommand##1% - {\ifcase\@@DriverFieldAutoParent\else - \setmainfieldkid{\@@DriverFieldParent}{##1}% - \fi - \changefield{##1}}% - \processcommalist[#2]\docommand - \fi -\fi - \else - \writestatus\m!fields{pass parent field and clones}% - \fi} +\def\dodefinesubfield[#1][#2][#3]% [name] [group] [values] + {\ctxlua{backends.codeinjections.definefield{ variant="normal", name="#1", kind="sub", group="#2", values=\!!bs#3\!!es }}} -\def\clonefield - {\doquadrupleempty\doclonefield} +\def\doclonefield[#1][#2][#3][#4]% [parent] [children] [group] [values] + {\ctxlua{backends.codeinjections.clonefield{ variant="clone", parent="#1", children="#2", group="#3", values=\!!bs#4\!!es }}} -\def\docopyfield[#1][#2]% parent children - {\ifsecondargument - \getfield{#1}% -\iftrialtypesetting\else - \ifx\@@DriverFieldType\empty - \writestatus\m!fields{unknown field #1}% - \else - \let\@@DriverFieldMode\fieldparentmode - %\def\docommand##1{\addtocommalist{##1}\@@DriverFieldKids}% - \def\docommand##1{\appendtocommalist{##1}\@@DriverFieldKids}% - \processcommalist[#2]\docommand - \changefield{#1}% - \let\@@DriverFieldAutoParent\@@DriverFieldAuto - \def\@@DriverFieldParent{#1}% - \let\@@DriverFieldKids\empty - \let\@@DriverFieldRoot\empty - \let\@@DriverFieldMode\fieldcopymode - \def\@@DriverFieldFree{0}% - \def\@@DriverFieldAuto{0}% - \def\docommand##1% - {\ifcase\@@DriverFieldAutoParent\else - \setmainfieldkid{\@@DriverFieldParent}{##1}% - \fi - \changefield{##1}}% - \processcommalist[#2]\docommand - \fi -\fi - \else - \writestatus\m!fields{pass parent field and copies}% - \fi} +\def\docopyfield[#1][#2]% [parent] [children] + {\ctxlua{backends.codeinjections.clonefield{ variant="copy", parent="#1", children="#2" }}} -\def\copyfield{\dodoubleempty\docopyfield} +\def\dodefinefieldset[#1][#2]% + {\ctxlua{backends.codeinjections.definefieldset("#1","#2")}} -\unexpanded\def\field {\dotripleempty\dofield[\dohandlefield]} -\unexpanded\def\fitfield{\dotripleempty\dofield[\dohandlefitfield]} +% usage +% +% \iftrialtypesetting +% +% just a default setup -\def\dofield[#1][#2][#3]% - {\iffirstargument - \bgroup - \getfield{#2}% - \ifsecondargument - \def\@@DriverFieldLabel{#3}% - \else - \let\@@DriverFieldLabel\@@DriverFieldName - \fi - \ifx\@@DriverFieldType\empty - \writestatus\m!fields{unknown field #2}% - \else\ifcase\@@DriverFieldFree\relax - \doifdefinedelse{\strippedcsname\setupfield\@@DriverFieldGroup} - {\let\dosetupfield=#1\getvalue{\strippedcsname\setupfield\@@DriverFieldGroup}} - {#1[\@@DriverFieldName][\v!label,\v!frame,\v!horizontal][][][]}% -\iftrialtypesetting\else - \def\@@DriverFieldFree{1}% - \changefield{#2}% -\fi - \else\ifcase\@@DriverFieldAuto\relax - % \writestatus\m!fields{field #2 already typeset}% - \else - % \writestatus\m!fields{field #2 automatically copied}% - \nextsystemfield - \copyfield[\@@DriverFieldName][\currentsystemfield]% - \dotripleempty\dofield[#1][\currentsystemfield][#3]% get the if's right - \fi\fi\fi - \egroup - \fi} +\def\loadfieldscripts{\useJSscripts[fld]\globallet\loadfieldscripts\relax} -\def\typesetfield - {\useJSscripts[fld]% - \ifx\@@DriverFieldRoot\empty \else - \let\@@SavedFieldName\@@DriverFieldName - \getfield\@@DriverFieldRoot - \ifcase\@@DriverFieldFree\relax - \dosetfieldstatus\@@DriverFieldMode\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldRoot - \dopresetrecord -\iftrialtypesetting\else - \def\@@DriverFieldFree{1}% - \changefield\@@DriverFieldName -\fi - \fi - \getfield\@@SavedFieldName +\def\donormalfield{\doprocessfield\dohandlefield} +\def\dofitfield {\doprocessfield\dohandlefitfield} + +\def\doprocessfield#1[#2][#3]% \method [name] [label] + {\dontleavehmode + \begingroup + \loadfieldscripts + \edef\currentfieldname {#2}% + \edef\currentfieldlabel{#3}% + \edef\currentfieldgroup{\ctxlua{backends.codeinjections.getfieldgroup("#2")}}% + \ifx\currentfieldlabel\empty + \let\currentfieldlabel\currentfieldname \fi - \ifx\@@DriverFieldKids\empty - \donefalse + \ifx\currentfieldgroup\empty + #1[#2][\v!label,\v!frame,\v!horizontal][][][]% \else - \donetrue + #1[#2][][][][]% todo: pass setups \fi - \ifdone - \let\@@DriverFieldParent\@@DriverFieldName - %\addtocommalist\@@DriverFieldParent\@@DriverFieldKids - \appendtocommalist\@@DriverFieldParent\@@DriverFieldKids - \dosetfieldstatus\@@DriverFieldMode\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldRoot - \dopresetfield - \let\@@DriverFieldMode\fieldchildmode - \fi - \dosetfieldstatus\@@DriverFieldMode\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldRoot - \dopresetfield} - -\def\dopresetfield - {\iftrialtypesetting\else\iflocation\getvalue{preset\@@DriverFieldType field}\fi\fi} - -\def\dopresetrecord - {\iftrialtypesetting\else\iflocation\getvalue{preset\@@DriverFieldType record}\fi\fi} - -\def\dodefinethefieldset[#1][#2]% - {\dodefinefieldset{#1}{#2}} - -\def\definefieldset% - {\dodoubleargument\dodefinethefieldset} - -\def\normaldodosetupfield[#1][#2][#3][#4][#5]% - {\doifdefinedelse{\strippedcsname\setupfield#1} - {\pushmacro\dosetupfield - \def\dosetupfield[##1][##2][##3][##4][##5]% - {\setvalue{\strippedcsname\setupfield#1}{\dosetupfield[#1][##2,#2][##3,#3][##4,#4][##5,#5]}}% - \getvalue{\strippedcsname\setupfield#1}% - \popmacro\dosetupfield} - {\setvalue{\strippedcsname\setupfield#1}{\dosetupfield[#1][#2][#3][#4][#5]}}} + \endgroup} -\let\dodosetupfield\normaldodosetupfield - -\def\donosetupfield[#1][#2][#3][#4][#5]% - {\setvalue{\strippedcsname\setupfield#1}{\dosetupfield[#1][#2][#3][#4][#5]}} +% setups \def\dosetupfield[#1][#2][#3][#4][#5]% {\iffifthargument @@ -765,17 +188,31 @@ \writestatus\m!fields{provide either 1, 2, 3 or 5 arguments}% \fi\fi\fi\fi} -\def\setupfield - {\doquintupleempty\dosetupfield} +\def\normaldodosetupfield[#1][#2][#3][#4][#5]% + {\ifcsname\??fd::#1\endcsname + \pushmacro\dosetupfield + \def\dosetupfield[##1][##2][##3][##4][##5]{\setvalue{\??fd::#1}{\dosetupfield[#1][##2,#2][##3,#3][##4,#4][##5,#5]}}% + \getvalue{\??fd::#1}% + \popmacro\dosetupfield + \else + \setvalue{\??fd::#1}{\dosetupfield[#1][#2][#3][#4][#5]}% + \fi} + +\let\dodosetupfield\normaldodosetupfield + +\def\donosetupfield[#1][#2][#3][#4][#5]% + {\setvalue{\??fd::#1}{\dosetupfield[#1][#2][#3][#4][#5]}} \def\dosetupfields[#1][#2][#3][#4]% {\ifsecondargument \def\dodosetupfield[##1][##2][##3][##4][##5]% - {\doifdefinedelse{\strippedcsname\setupfield##1} - {\def\dosetupfield[####1][####2][####3][####4][####5]% - {\setvalue{\strippedcsname\setupfield##1}{\dosetupfield[##1][#1,####2,##2][#2,####3,##3][#3,####4,##4][#4,####5,##5]}}% - \getvalue{\strippedcsname\setupfield##1}} - {\setvalue{\strippedcsname\setupfield##1}{\dosetupfield[##1][#1,##2][#2,##3][#3,##4][#4,##5]}}}% + {\ifcsname\??fd::##1\endcsname + \def\dosetupfield[####1][####2][####3][####4][####5]% + {\setvalue{\??fd::##1}{\dosetupfield[##1][#1,####2,##2][#2,####3,##3][#3,####4,##4][#4,####5,##5]}}% + \getvalue{\??fd::##1}% + \else + \setvalue{\??fd::##1}{\dosetupfield[##1][#1,##2][#2,##3][#3,##4][#4,##5]}% + \fi}% \else\iffirstargument \doifelse{#1}\v!reset {\resetfields} @@ -784,9 +221,6 @@ \writestatus\m!fields{provide either 1 or 4 arguments}% \fi\fi} -\def\setupfields - {\doquadrupleempty\dosetupfields} - \def\resetfields {\let\dodosetupfield\normaldodosetupfield} @@ -806,27 +240,19 @@ {\presetlocalframed[\??fd]% \processallactionsinset [#2] - [ \v!reset=>\ShowFieldLabelfalse\ShowFieldFramefalse - \HorizontalFieldfalse\VerticalFieldfalse, + [ \v!reset=>\ShowFieldLabelfalse\ShowFieldFramefalse\HorizontalFieldfalse\VerticalFieldfalse, \v!label=>\ShowFieldLabeltrue, \v!frame=>\ShowFieldFrametrue, \v!horizontal=>\HorizontalFieldtrue, \v!vertical=>\VerticalFieldtrue]% \ifVerticalField - \getparameters[\??fd] - [\c!distance=\!!zeropoint,\c!inbetween=\vskip\@@localoffset, - \c!align=\v!right,\c!width=20em]% + \getparameters[\??fd][\c!distance=\!!zeropoint,\c!inbetween=\vskip\@@localoffset,\c!align=\v!right,\c!width=20em]% \else\ifHorizontalField - \getparameters[\??fd] - [\c!distance=\@@localoffset,\c!inbetween=,\c!align=\c!left, - \c!height=10ex]% + \getparameters[\??fd][\c!distance=\@@localoffset,\c!inbetween=,\c!align=\c!left,\c!height=10ex]% \else - \getparameters[\??fd] - [\c!distance=\!!zeropoint,\c!inbetween=,\c!align=\c!left]% + \getparameters[\??fd][\c!distance=\!!zeropoint,\c!inbetween=,\c!align=\c!left]% \fi\fi - \getparameters[\??fd] - [\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=,#3]% - \reshapeframeboxfalse % else ugly spacing + \getparameters[\??fd][\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=,#3]% \ifShowFieldFrame \localframed[\??fd][\c!strut=\v!no,\c!align=]\bgroup \else @@ -838,7 +264,7 @@ {\reshapeframeboxtrue % else wrong dimensions \framed [\c!style=,\c!color=,\c!align=\c!right,#4] - {\@@DriverFieldLabel}}% + {\currentfieldlabel}}% \fi \setbox2\hbox {\reshapeframeboxtrue % else wrong dimensions @@ -859,8 +285,8 @@ \c!focusin=,\c!focusout=, \c!fieldoffset=\!!zeropoint,\c!fieldbackgroundcolor=, \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5]% - \scratchdimen\framedwidth \edef\@@DriverFieldWidth {\the\scratchdimen}% - \scratchdimen\framedheight\edef\@@DriverFieldHeight{\the\scratchdimen}% + \scratchdimen\framedwidth \edef\@@fdwidth {\the\scratchdimen}% + \scratchdimen\framedheight\edef\@@fdheight{\the\scratchdimen}% \vfill \hbox{\lower\@@fdfieldoffset\hbox{\typesetfield}} \vss}}% @@ -900,33 +326,31 @@ \c!afterkey=,\c!format=,\c!validate=,\c!calculate=, \c!fieldoffset=\!!zeropoint,\c!fieldbackgroundcolor=, \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5,\c!align=] - {\dogetcommacommandelement1\from\@@DriverFieldValues\to\@@DriverFieldValue - \ifx\@@DriverFieldValue\empty - \let\@@DriverFieldValue\@@DriverFieldDefault - \fi - \dopresetfieldsymbol\@@DriverFieldValue - \setbox\scratchbox\hbox{\dogetfieldsymbol\@@DriverFieldValue}% - \scratchdimen\wd\scratchbox \edef\@@DriverFieldWidth {\the\scratchdimen}% - \scratchdimen\ht\scratchbox \edef\@@DriverFieldHeight{\the\scratchdimen}% + {\edef\defaultfield{\ctxlua{backends.codeinjections.getdefaultfieldvalue("#1")}}% +\dopresetsymbol\defaultfield +\setbox\scratchbox\hbox{\dogetsymbol\defaultfield}% + \edef\@@fdwidth {\the\wd\scratchbox}% \ifcase\fitfieldmode + \edef\@@fdheight{\the\ht\scratchbox}% \typesetfield \or % 1 = ignore depth (original, assumed no depth, actually a bug) + \edef\@@fdheight{\the\ht\scratchbox}% \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}% \or % 2 = add depth to height, but no depth in result - \advance\scratchdimen\dp\scratchbox \edef\@@DriverFieldHeight{\the\scratchdimen}% + \edef\@@fdheight{\the\htdp\scratchbox}% \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}% \or % 3 = add depth to height, and apply depth to result - \advance\scratchdimen\dp\scratchbox \edef\@@DriverFieldHeight{\the\scratchdimen}% + \edef\@@fdheight{\the\htdp\scratchbox}% \hbox to \wd\scratchbox{\lower\dp\scratchbox\hbox{\typesetfield}\hfill}% \fi}} %D Common stuff -\newcounter\nofsystemfields +\newcount\nofsystemfields \def\nextsystemfield - {\doglobal\increment\nofsystemfields - \def\currentsystemfield{sys::\nofsystemfields}} + {\global\advance\nofsystemfields\plusone + \def\currentsystemfield{sys::\number\nofsystemfields}} %D An example: @@ -968,7 +392,8 @@ {\dosingleempty\dotooltip} \def\dotooltip[#1]#2#3% - {\bgroup + {\dontleavehmode + \begingroup \setupfields[\v!reset]% \useJSscripts[fld]% \setbox0\hbox @@ -1013,7 +438,7 @@ {\fitfield[\currentsystemfield:but]}% #2}% \ht0\strutht\dp0\strutdp\box0 - \egroup} + \enfgroup} %D And one more: @@ -1021,11 +446,24 @@ {\dotripleargument\dodefinefieldstack} \def\dodefinefieldstack[#1][#2][#3]% name, symbols, settings - {\doifundefined{fieldstack:#1} - {\setgvalue{fieldstack:#1}{\dodofieldstack[#1][#2][#3]}}} + {\ifcsname fieldstack:#1\endcsname + \setgvalue{fieldstack:#1}{\dodofieldstack[#1][#2][#3]}% + \fi} + +\def\fieldstack + {\dotripleempty\dofieldstack} + +\def\dofieldstack[#1][#2][#3]% + {\ifsecondargument + \dodefinefieldstack[#1][#2][#3]\fieldstack[#1]% + \else + \getvalue {fieldstack:#1}% + \setgvalue{fieldstack:#1}{[#1]}% + \fi} \def\dodofieldstack[#1][#2][#3]% start=n, 0 == leeg - {\bgroup + {\dontleavehmode + \begingroup \getparameters[\??fd][\c!start=1,#3]% \setupfields[\v!reset]% \definesymbol[\v!empty][]% @@ -1050,30 +488,189 @@ \globalprocesscommalist[#2]\dododofieldstack \egroup \stopoverlay + \endgroup} + +%D When submitting a form, we need to tell the driver module +%D that we want \FDF\ or \HTML. + +\newtoks\everysetupforms + +\def\setupforms{\dosingleempty\dosetupforms} + +\def\dosetupforms[#1] + {\getparameters[\??fr][#1]% + \the\everysetupforms} + +\appendtoks + \ctxlua{backends.codeinjections.setformsmethod("@@frmethod")}% +\to \everysetupforms + +\setupforms + [\c!method=XML] % no need for everyjob initialization as this is the default + +%D Goodie: (unchecked in \MKIV) + +\def\definepushbutton % name optional setup + {\dodoubleempty\dodefinepushbutton} + +\def\dodefinepushbutton[#1][#2]% name setup + {\dododefinepushbutton{#1}{n}{push}% + \dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}% + \dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}% + \setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}} + +\def\dododefinepushbutton#1#2#3% + {\doifsymboldefinedelse{psym:#1:#2}% + \donothing{\definesymbol[psym:#1:#2][{#3}]}} + +\def\definepushsymbol + {\dotripleargument\dodefinepushsymbol} + +\def\dodefinepushsymbol[#1][#2]% [#3] + {\definesymbol[psym:#1:#2]} + +\def\dopushbutton[#1][#2]% + {\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}} + +\def\pushbutton + {\dodoubleargument\dopushbutton} + +\def\dohandlepushbutton#1#2#3% identifier setup script + {\bgroup + \nextsystemfield + \setupfield + [pushbutton] + [\c!frame=\v!overlay, + \c!offset=\v!overlay, + \c!clickout=#3,#2]% + \definefield + [\currentsystemfield] + [push] + [pushbutton] + [psym:#1:n,psym:#1:r,psym:#1:d]% + \fitfield + [\currentsystemfield]% \egroup} -\def\dofieldstack[#1][#2][#3]% - {\ifsecondargument - \dodefinefieldstack[#1][#2][#3]\fieldstack[#1]% +% \def\menu@psh +% {\dodoubleargument\domenu@psh} +% +% \def\domenu@psh[#1][#2]#3\\% +% {\txt\pushbutton[#1][#2]\\}% +% +%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands + +\unexpanded\def\menu@psh{\txt\pushbutton} + +\appendtoks \let\psh\menu@psh \to \everysetmenucommands + +% \definepushbutton [reset] +% +% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}] +% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}] +% +% \startinteractionmenu[bottom] +% \psh [reset] [JS(reset_something)] \\ +% \stopinteractionmenu + +%D Another goodie: (unchecked in \MKIV) + +% \definecolor[rollover:n][red] +% \definecolor[rollover:r][green] +% \definecolor[rollover:d][blue] + +\definepalet + [rollover] + [n=red, + r=green, + d=blue] + +\newcounter\nofrollovers +\newcounter\nofrollbuttons + +\def\dorollbutton[#1][#2]#3[#4]% + {\dontleavehmode + \bgroup + \doglobal\increment\nofrollovers + \doglobal\increment\nofrollbuttons + \unexpanded\def\dosetlocationbox[##1]##2[##3]% + {\getparameters[##1][##3]% + \definecolor[rollover][rollover:##2]% + \doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox + {\localframed[##1] + [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]% + {\dolocationattributes{##1}\c!style\c!color{#3}}}}% + \iffirstargument + \ifsecondargument + \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}% + \else + \doifassignmentelse{#1} + {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}} + {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}% + \fi \else - \getvalue{fieldstack:#1}\setgvalue{fieldstack:#1}{[#1]}% - \fi} + \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}% + \fi + % todo: share symbols, tricky since different dimensions + \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]% + \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]% + \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]% + \setupfield + [rollbutton] + [\c!frame=\v!off, + \c!offset=\v!overlay, + \c!clickout={#4}]% + \definefield + [roll:\nofrollbuttons][push][rollbutton] + [rsym:\nofrollovers:n,% + rsym:\nofrollovers:r,% + rsym:\nofrollovers:d]% + \fitfield[roll:\nofrollbuttons]% + \egroup} -\def\fieldstack - {\dotripleempty\dofieldstack} +\unexpanded\def\rollbutton + {\dodoubleempty\dorollbutton} -%D When submitting a form, we need to tell the driver module -%D that we want \FDF\ or \HTML. +\def\menu@rob[#1]#2\\% + {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}% -\def\setupforms - {\dodoubleargument\getparameters[\??fr]} +\appendtoks \let\rob\menu@rob \to \everysetmenucommands -\def\checksubmitform#1% - {\setsubmitoutputformat\@@frmethod} +% calls: +% {..} [JS..] +% [left] {..} [JS..] +% [a=b] {..} [JS..] +% [left] [a=b] {..} [JS..] +% +% \setupbuttons[offset=0pt,frame=off] % alternative=hidden +% +% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})] +% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})] +% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})] +% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})] +% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})] +% +% \rob [JS(...)] bla bla \\ -\setexecutecommandcheck {submitform} \checksubmitform +\unexpanded\def\overlayrollbutton + {\dodoubleargument\dooverlayrollbutton} -\setupforms - [\c!method=HTML] +\def\dooverlayrollbutton[#1][#2]% + {\bgroup + \nextsystemfield + \setupfield + [overlayrollbutton] + [\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]% + \definesymbol + [\currentsystemfield] + [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]% + \definefield + [\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]% + \fitfield[\currentsystemfield]% + \egroup} + +% \defineoverlay +% [ShowMenu] +% [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}] \protect \endinput diff --git a/tex/context/base/scrn-int.lua b/tex/context/base/scrn-int.lua new file mode 100644 index 000000000..7e90ed069 --- /dev/null +++ b/tex/context/base/scrn-int.lua @@ -0,0 +1,111 @@ +if not modules then modules = { } end modules ['scrn-int'] = { + version = 1.001, + comment = "companion to scrn-int.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local format = string.format +local texsprint, texcount, ctxcatcodes = tex.sprint, tex.count, tex.ctxcatcodes + +interactions = interactions or { } + +local attachments = { } + +function interactions.registerattachment(specification) + if specification.label then + specification.filename = specification.filename or specification.label + specification.newname = specification.newname or specification.filename + specification.title = specification.title or specification.filename + specification.newname = file.addsuffix(specification.newname,file.extname(specification.filename)) + attachments[specification.label] = specification + return specification + end +end + +function interactions.attachment(label) + local at = attachments[label] + if not at then + interfaces.showmessage("interactions",6,label) + return interactions.registerattachment { label = label } + else + return at + end +end + +function interactions.attachmentvar(label,key) + local at = attachments[label] + texsprint(ctxcatcodes,at and at[key] or "") +end + +local soundclips = { } + +function interactions.registersoundclip(specification) + if specification.label then + specification.filename = specification.filename or specification.label + soundclips[specification.label] = specification + return specification + end +end + +function interactions.soundclip(label) + local sc = soundclips[label] + if not sc then + -- todo: message + return interactions.registersoundclip { label = label } + else + return sc + end +end + +local renderings = { } + +function interactions.registerrendering(specification) + if specification.label then + renderings[specification.label] = specification + return specification + end +end + +function interactions.rendering(label) + local rn = renderings[label] + if not rn then + -- todo: message + return interactions.registerrendering { label = label } + else + return rn + end +end + +function interactions.renderingvar(label,key) + local rn = renderings[label] + texsprint(ctxcatcodes,rn and rn[key] or "") +end + +-- linked lists + +function interactions.definelinkedlist(name) + -- no need +end + +function interactions.addlinktolist(name) + local tobesaved = jobpasses.gettobesaved(name) + local collected = jobpasses.getcollected(name) or { } + local currentlink = #tobesaved + 1 + local noflinks = #collected + tobesaved[currentlink] = 0 + local f = collected[1] or 0 + local l = collected[noflinks] or 0 + local p = collected[currentlink-1] or f + local n = collected[currentlink+1] or l + texsprint(ctxcatcodes,format("\\setlinkproperties{%s}{%s}{%s}{%s}{%s}{%s}",currentlink,noflinks,f,p,n,l)) +end + +function interactions.enhancelinkoflist(name,n) + local ll = jobpasses.gettobesaved(name) + if ll then + ll[n] = texcount.realpageno + end +end + diff --git a/tex/context/base/scrn-int.mkii b/tex/context/base/scrn-int.mkii index 38d50a350..9f1be68e1 100644 --- a/tex/context/base/scrn-int.mkii +++ b/tex/context/base/scrn-int.mkii @@ -27,66 +27,11 @@ \newcounter\numberoflinks -\def\stelkoppelingenin% +\def\stelkoppelingenin {\dodoubleargument\getparameters[\??lk]} \def\definieerkoppeling[#1]% % local loading ! {\doifundefined{\s!link:#1:\s!list} - {\expanded{\definetwopasslist{\s!link:#1}}% - \expanded{\doloadtwopassdata{\s!link:#1}}% - \getfirsttwopassdata{\s!link:#1}% - \letgvalue{\s!link:#1:f}\twopassdata - \getlasttwopassdata{\s!link:#1}% - \letgvalue{\s!link:#1:l}\twopassdata - \letgvalue{\s!link:#1:s}\noftwopassitems - \gettwopassdata{\s!link:#1}% - \letgvalue{\s!link:#1:c}\twopassdata - \letgvalue{\s!link:#1:n}\twopassdata}} - -\def\koppeling[#1]#2% - {\bgroup - \definieerkoppeling[#1]% - \doglobal\increment\numberoflinks - \gettwopassdata{\s!link:#1}% - \edef\numberoflinks{0\getvalue{\s!link:#1:s}}% - \edef\firstlink {0\getvalue{\s!link:#1:f}}% - \edef\lastlink {0\getvalue{\s!link:#1:l}}% - \edef\currentlink {0\getvalue{\s!link:#1:n}}% - \edef\prevlink {0\getvalue{\s!link:#1:c}}% - \iftwopassdatafound - \edef\nextlink{0\twopassdata}% - \letgvalue{\s!link:#1:n}\nextlink - \letgvalue{\s!link:#1:c}\currentlink - \else - \edef\nextlink{0\getvalue{\s!link:#1:l}}% - \fi - \lazysavetwopassdata{\s!link:#1}{\numberoflinks}{\noexpand\realfolio}% - \ifnum\noflinks<\plustwo - \locationfalse - \fi - \iflocation - \hbox - {\setinteractionparameter\c!width\!!zeropoint - \dogotosomepage\??lk\gotobegincharacter\firstlink\hss - \ifnum\noflinks>\plustwo - \hskip\@@lkdistance - \dogotosomepage\??lk\gobackwardcharacter\prevlink\hss - \fi - \hskip\@@lkdistance - #2\relax - \hskip\@@lkdistance - \ifnum\noflinks>\plustwo - \dogotosomepage\??lk\goforwardcharacter\nextlink\hss - \hskip\@@lkdistance - \fi - \dogotosomepage\??lk\gotoendcharacter\lastlink}% - \else - \hbox{#2}% - \fi - \egroup} - -\def\definieerkoppeling[#1]% % local loading ! - {\doifundefined{\s!link:#1:\s!list} {\expanded{\definetwopasslist{\s!link:#1}}% \expanded{\doloadtwopassdata{\s!link:#1}}% \getfirsttwopassdata{\s!link:#1}% \let\firstlink\twopassdata @@ -560,7 +505,7 @@ \fi}}% \ifskippedmenuitem\else\box\locationbox\fi} -\def\setlocationboxnop#1[#2]#3[#4]% +\def\setlocationboxnop#1[#2]#3[#4]% inefficient as text can be outside box {\locationclickfalse \setbox\locationbox\hbox {\resetgoto % anders cyclische aanroep ! @@ -1932,7 +1877,6 @@ % % \starttext \attachment[whatever] \stoptext -\definesystemvariable{at} \def\useattachment {\doquadrupleempty\douseattachment} @@ -2028,6 +1972,144 @@ \def\registermenubuttons {\dodoubleempty\doregistermenubuttons} +% It took quite a while to figure this out (using the preliminary 1.5 +% spec). There are still a lot of things to be implemented. This is +% the third alternative. + +% todo: multiple instances, dus indirect + +\let\currentrendering\empty + +\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}] +\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}] +\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}] +\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}] + +\newcounter\nofexternalrenderings + +\def\useexternalrendering{\doquadrupleempty\douseexternalrendering} +\def\setinternalrendering{\dodoubleempty \dosetinternalrendering} + +\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options + {\setgvalue{\??rd:#1}{\plusone{#1}{#2}{#3}{#4}}} + +\def\dosetinternalrendering[#1][#2]% tag options {content} + {\bgroup + \dowithnextbox + {\setgvalue{\??rd:#1}{\plustwo{#1}{IRO}{#1}{#2}}% + \let\objectoffset\zeropoint + \setobject{IRO}{#1}\hbox{\box\nextbox}% + \egroup}% + \hbox} + +\def\checkrendering#1% let's hope that \next is not used + {\iflocation + \doifsomething{#1}% + {\doifdefined{\??rd:#1}% + {\expanded{\getvalue{\??rd::\number\renderingtype{#1}}% + {\filterfromvalue{\??rd:#1}52}{\filterfromvalue{\??rd:#1}53}% + {\filterfromvalue{\??rd:#1}54}{\filterfromvalue{\??rd:#1}55}}}}% + \fi} + +\setvalue{\??rd::1}{\doinsertrendering} +\setvalue{\??rd::2}{\doinsertrenderingobject} + +\def\renderingtype #1{\filterfromvalue{\??rd:#1}51} +\def\renderingoptions#1{\filterfromvalue{\??rd:#1}55} + +\setexecutecommandcheck {startrendering} \checkrendering +\setexecutecommandcheck {stoprendering} \checkrendering +\setexecutecommandcheck {pauserendering} \checkrendering +\setexecutecommandcheck {resumerendering} \checkrendering + +% by using a nice trick (used in other places of context as well) we +% can easily overload the default size to match the opbject size + +\def\renderingwidth {8cm} +\def\renderingheight{6cm} + +\def\definerenderingwindow + {\dodoubleempty\dodefinerenderingwindow} + +\def\dodefinerenderingwindow[#1][#2]% + {\presetlocalframed[\??rw#1]% + \getparameters% + [\??rw#1]% + [\c!openpageaction=,\c!closepageaction=,% + \c!width=\renderingwidth,\c!height=\renderingheight,% + #2]} + +\def\setuprenderingwindow + {\dodoubleargument\dosetuprenderingwindow} + +\def\dosetuprenderingwindow[#1]% + {\getparameters[\??rw#1]} + +\def\placerenderingwindow + {\dodoubleempty\doplacerenderingwindow} + +\def\doplacerenderingwindow[#1][#2]% + {\bgroup + \edef\currentrendering{\ifsecondargument#2\else#1\fi}% + \ifcase\renderingtype\currentrendering\or + % a file + \or + % an object + \getobjectdimensions{IRO}\currentrendering + \scratchdimen\objectheight + \advance\scratchdimen\objectdepth + \edef\renderingheight{\the\scratchdimen}% + \edef\renderingwidth{\objectwidth}% + \fi + % create fall back if needed + \doifdefinedelse{\??rw#1\c!width} + {\def\currentrenderingwindow{#1}} + {\let\currentrenderingwindow\s!default + \definerenderingwindow[\currentrenderingwindow]}% + \checkrendering\currentrendering + \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction + \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction + \localframed + [\??rw\currentrenderingwindow][\c!offset=\v!overlay]% + {\expanded{\doinsertrenderingwindow + \noexpand\currentrendering\hsize\vsize{\renderingoptions\currentrendering}}}% + \egroup} + +% todo: +% +% \setinternalrendering[example-1][options]{} + +% test file: +% +% \definerenderingwindow +% [example] +% [width=320pt,height=150pt,frame=off, +% background=color,backgroundcolor=gray, +% openpageaction=StartCurrentRendering, +% closepageaction=NextPage]% StopCurrentRendering] +% +% \useexternalrendering[example-1][audio/mpeg] [eldorado.mp3] +% \useexternalrendering[example-2][audio/mpeg] [myst-12.mp3] +% \useexternalrendering[example-3][application/x-shockwave-flash][http://localhost/mb.swf] [auto] +% \useexternalrendering[example-4][application/x-shockwave-flash][celebration.swf] +% \useexternalrendering[example-5][video/quicktime] [p1000726.mov] +% \useexternalrendering[example-6][application/smil] [quadratic_map.smi] +% +% \def\renderingmenu[#1]% +% {\hbox +% {\setupbuttons[width=2.5em]% +% \button{\symbol[StartRendering]} [StartRendering{#1}]\enspace +% \button{\symbol[StopRendering]} [StopRendering{#1}]\enspace +% \button{\symbol[PauseRendering]} [PauseRendering{#1}]\enspace +% \button{\symbol[ResumeRendering]}[ResumeRendering{#1}]}} +% +% \renderingmenu[example-1]\blank +% \renderingmenu[example-2]\blank +% \renderingmenu[example-3]\blank +% \renderingmenu[example-4] \placefigure{A ShockWave}{\placerenderingwindow[example][example-4]} \page +% \renderingmenu[example-5] \placefigure{A Movie}{\placerenderingwindow[example][example-5]} \page +% \renderingmenu[example-6] \placefigure{A Smile}{\placerenderingwindow[example][example-6]} + \stelkoppelingenin [\c!distance=.25em, \c!width=\v!fit, diff --git a/tex/context/base/scrn-int.mkiv b/tex/context/base/scrn-int.mkiv index 80f85145b..ddf6e5938 100644 --- a/tex/context/base/scrn-int.mkiv +++ b/tex/context/base/scrn-int.mkiv @@ -11,191 +11,30 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% evt interactionbaren runtime laden (scheelt 8K) - -%D Still to be done properly. - \writestatus{loading}{ConTeXt Screen Macros / Interaction} \unprotect -% \expand vs \expanded - -% linked registers implementeren als een koppeling == mooier +%D This is an update of \MKII\ code. In the process profiles and versions +%D were removed as I never used them (although they were kind of cool at +%D that time). -\presetlocalframed[\??lk] +% a bit complex due to papercomment (see imposition code) -\newcounter\numberoflinks +\newtoks\everysetupinteractionscreen -\def\stelkoppelingenin% - {\dodoubleargument\getparameters[\??lk]} +\def\setupinteractionscreen + {\dosingleempty\dosetupinteractionscreen} -\def\definieerkoppeling[#1]% % local loading ! - {\doifundefined{\s!link:#1:\s!list} - {\expanded{\definetwopasslist{\s!link:#1}}% - \expanded{\doloadtwopassdata{\s!link:#1}}% - \getfirsttwopassdata{\s!link:#1}% - \letgvalue{\s!link:#1:f}\twopassdata - \getlasttwopassdata{\s!link:#1}% - \letgvalue{\s!link:#1:l}\twopassdata - \letgvalue{\s!link:#1:s}\noftwopassitems - \gettwopassdata{\s!link:#1}% - \letgvalue{\s!link:#1:c}\twopassdata - \letgvalue{\s!link:#1:n}\twopassdata}} +\def\dosetupinteractionscreen[#1]% + {\getparameters[\??sc][#1]% + \the\everysetupinteractionscreen} -\def\koppeling[#1]#2% - {\bgroup - \definieerkoppeling[#1]% - \doglobal\increment\numberoflinks - \gettwopassdata{\s!link:#1}% - \edef\numberoflinks{0\getvalue{\s!link:#1:s}}% - \edef\firstlink {0\getvalue{\s!link:#1:f}}% - \edef\lastlink {0\getvalue{\s!link:#1:l}}% - \edef\currentlink {0\getvalue{\s!link:#1:n}}% - \edef\prevlink {0\getvalue{\s!link:#1:c}}% - \iftwopassdatafound - \edef\nextlink{0\twopassdata}% - \letgvalue{\s!link:#1:n}\nextlink - \letgvalue{\s!link:#1:c}\currentlink - \else - \edef\nextlink{0\getvalue{\s!link:#1:l}}% - \fi - \lazysavetwopassdata{\s!link:#1}{\numberoflinks}{\noexpand\realfolio}% - \ifnum\noflinks<\plustwo - \locationfalse - \fi - \iflocation - \hbox - {\setinteractionparameter\c!width\!!zeropoint - \dogotosomepage\??lk\gotobegincharacter\firstlink\hss - \ifnum\noflinks>\plustwo - \hskip\@@lkdistance - \dogotosomepage\??lk\gobackwardcharacter\prevlink\hss - \fi - \hskip\@@lkdistance - #2\relax - \hskip\@@lkdistance - \ifnum\noflinks>\plustwo - \dogotosomepage\??lk\goforwardcharacter\nextlink\hss - \hskip\@@lkdistance - \fi - \dogotosomepage\??lk\gotoendcharacter\lastlink}% - \else - \hbox{#2}% - \fi - \egroup} - -\def\definieerkoppeling[#1]% % local loading ! - {\doifundefined{\s!link:#1:\s!list} - {\expanded{\definetwopasslist{\s!link:#1}}% \expanded{\doloadtwopassdata{\s!link:#1}}% - \getfirsttwopassdata{\s!link:#1}% - \let\firstlink\twopassdata - \getlasttwopassdata{\s!link:#1}% - \let\lastlink\twopassdata - \let\noflinks\noftwopassitems - \gettwopassdata{\s!link:#1}% - \let\currentlink\twopassdata - \let\nextlink\twopassdata - \setxvalue{\s!link:#1:}{\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}}} - -\def\koppeling[#1]#2% - {\bgroup - \definieerkoppeling[#1]% - \doglobal\increment\numberoflinks - \gettwopassdata{\s!link:#1}% - \def\next[##1:##2:##3:##4:##5]% - {\edef\firstlink {0##1}% - \edef\lastlink {0##2}% - \edef\noflinks {0##3}% - \edef\prevlink {0##4}% - \edef\currentlink{0##5}}% - \expanded{\next[\getvalue{\s!link:#1:}]}% - \edef\nextlink{0\iftwopassdatafound\twopassdata\else\lastlink\fi}% - \setxvalue{\s!link:#1:}{\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}% - \lazysavetwopassdata{\s!link:#1}{\numberoflinks}{\noexpand\realfolio}% - \ifnum\noflinks<\plustwo - \locationfalse - \fi - \iflocation - \hbox - {\setinteractionparameter\c!width\!!zeropoint - #2\relax - \hskip\@@lkdistance - \dogotosomepage\??lk\gotobegincharacter\firstlink\hss - \ifnum\noflinks>\plustwo - \dogotosomepage\??lk\gobackwardcharacter\prevlink\hss - \fi - \ifnum\noflinks>\plustwo - \dogotosomepage\??lk\goforwardcharacter\nextlink\hss - \hskip\@@lkdistance - \fi - \dogotosomepage\??lk\gotoendcharacter\lastlink}% - \else - \hbox{#2}% - \fi - \egroup} - -\let\setupinteractionscreens\empty - -\def\docalculateinteractionscreen - {\doifelse\@@scwidth\v!fit - {\!!widtha\leftcombitotal - \ifdim\backspace>\!!widtha\ifdim\backspace>\zeropoint\relax - \advance\backspace -\!!widtha - \fi\fi - \advance\!!widtha\rightcombitotal - \advance\!!widtha 2\dimexpr\@@scbackspace+\@@schoroffset\relax} - {\doifelse\@@scwidth\v!max - {\!!widtha\printpaperwidth} - {\!!widtha\@@scwidth}}% - \doifelse\@@scheight\v!fit - {\!!heighta\dimexpr\topheight+\topdistance\relax - \ifdim\topspace>\!!heighta\ifdim\topspace>\zeropoint\relax - \advance\topspace -\!!heighta - \fi\fi - \advance\!!heighta \dimexpr\makeupheight+\bottomdistance+\bottomheight\relax - \advance\!!heighta 2\dimexpr\@@sctopspace+\@@scveroffset\relax} - {\doifelse\@@scheight\v!max - {\!!heighta\printpaperheight} - {\!!heighta\@@scheight}}% - \doif\@@scdelay\v!none{\let\@@scdelay\zerocountervalue}} - -% The macro is not to be changed; only the \@@ia-variables -% may be set! ConTeXt is the producer but we no longer -% mention the pragma site, since we don't want to be bothered -% with remarks about third party documents and/or associated -% with documents produced outside our control. - -\def\doprepareidentity % beware, we need to construct - {\let\!!stringa\@@iakeyword % an unexpanded space separated - \let\@@iakeyword\empty % list of keywords from a comma - \def\doprepareidentity##1% % separated one - {\ifx\@@iakeyword\empty - \appended\def\@@iakeyword{##1}% - \else - \appended\def\@@iakeyword{ ##1}% - \fi}% - \@EA\processcommalist\@EA[\!!stringa]\doprepareidentity - \global\let\doprepareidentity\relax} - -%D The Creator field is changed per 12/04/2006 due to user presure. This -%D means that I need to put my own status info someplace else. - -\def\initializeidentity - {\doprepareidentity - \dosetupidentity % no \expanded{..} will be done in special (else no pdfdoc) - {\@@iatitle}{\@@iasubtitle}{\@@iaauthor}% - {ConTeXt - \contextversion}% - {\@@iadate}{\@@iakeyword}% - \global\let\initializeidentity\relax} - -\appendtoks \initializeidentity \to \everyshipout - -\def\initializepaper +\def\synchronizepaperdimensionssimple % simple version {\bgroup - \ifx\@@ppleft \empty - \ifx\@@ppright\empty - \ifx\@@pptop \empty + \ifx\@@ppleft \empty + \ifx\@@ppright \empty + \ifx\@@pptop \empty \ifx\@@ppbottom \empty \ifx\@@pcstate\v!start \locationfalse\fi\else @@ -204,1500 +43,276 @@ \locationfalse\fi\else \locationfalse\fi \iflocation % without screen settings - \egroup - \dosetuppaper\papersize\paperwidth\paperheight + \ctxlua{backends.codeinjections.setupcanvas { + paperwidth = \number\paperwidth, + paperheight = \number\paperheight + }}% \else - \egroup - \dosetuppaper\printpapersize\printpaperwidth\printpaperheight - \fi} - -\appendtoks \initializepaper \to \everyshipout + \ctxlua{backends.codeinjections.setupcanvas { + paperwidth = \number\printpaperwidth, + paperheight = \number\printpaperheight + }}% + \fi + \egroup} -\def\doinitializepaper +\def\synchronizepaperdimensionscomplex % complex version {\bgroup - \docalculateinteractionscreen + \edef\@@scwidth {\@@scwidth}% + \edef\@@scheight{\@@scheight}% + \ifx\@@scwidth\v!fit + \!!widtha\leftcombitotal + \ifdim\backspace>\!!widtha\ifdim\backspace>\zeropoint\relax + \advance\backspace -\!!widtha + \fi\fi + \advance\!!widtha\dimexpr\rightcombitotal+2\dimexpr\@@scbackspace+\@@schoroffset\relax\relax + \else\ifx\@@scwidth\v!max + \!!widtha\printpaperwidth + \else + \!!widtha\@@scwidth + \fi\fi + \ifx\@@scheight\v!fit + \!!heighta\dimexpr\topheight+\topdistance\relax + \ifdim\topspace>\!!heighta\ifdim\topspace>\zeropoint\relax + \advance\topspace -\!!heighta + \fi\fi + \advance\!!heighta\dimexpr\makeupheight+\bottomdistance+\bottomheight+2\dimexpr\@@sctopspace+\@@scveroffset\relax\relax + \else\ifx\@@scheight\v!max + \!!heighta\printpaperheight + \else + \!!heighta\@@scheight + \fi\fi + \doif\@@scdelay\v!none{\let\@@scdelay\zerocountervalue}% \ifdim\!!widtha>\paperwidth\ifdim\!!widtha>\zeropoint \paperwidth\!!widtha \fi\fi \ifdim\!!heighta>\paperheight\ifdim\!!heighta>\zeropoint \paperheight\!!heighta \fi\fi - \dosetuppaper - {\printpapersize} - {\the\paperwidth} - {\the\paperheight}% - \egroup} - -\let\@@pcscreendata\empty - -\def\dosetupinteractionscreens % met a, b en \number - {\doifnot\@@pcstate\v!start\dodosetupinteractionscreens} - -\setvalue{\??sc\c!option\v!max }{1} % tzt share with driver -\setvalue{\??sc\c!option\v!bookmark }{2} % tzt share with driver -\setvalue{\??sc\c!option\v!fit }{3} % tzt share with driver -\setvalue{\??sc\c!option\v!doublesided}{4} % tzt share with driver - -\def\dodosetupinteractionscreens % met a, b en \number - {\bgroup - \docalculateinteractionscreen - \!!counte=0\getvalue{\??sc\c!option\@@scoption}\relax - % niet waterdicht - \doifnot{\the\!!widtha\the\!!heighta}\@@pcscreendata - {\xdef\@@pcscreendata{\the\!!widtha\the\!!heighta}% - \showmessage\m!interactions1{\withoutpt\the\!!widtha,\withoutpt\the\!!heighta}}% - % needs to be split: dimensions for each page - % and mode per document and only once ! - \dosetupscreen \backoffset\topoffset\!!widtha\!!heighta{\the\!!counte}% - \dosetupcropbox\backoffset\topoffset\!!widtha\!!heighta - \egroup} - -\def\dosetupinteractionscreen[#1]% - {\getparameters[\??sc][#1]% - \ifproductionrun - \let\initializepaper\doinitializepaper - \let\setupinteractionscreens\dosetupinteractionscreens - \fi} - -\appendtoks \setupinteractionscreens \to \everyfirstshipout % needed to get option=max etc working -\appendtoks \setupinteractionscreens \to \everyshipout % needed for page/screen dimensions - -\def\setupinteractionscreen - {\dosingleempty\dosetupinteractionscreen} - -% \startinteractionmenu[rechts] -% \but [eerste] eerste \\ -% \txt hello world \\ -% \but [tweede] tweede \\ -% \nop \\ -% \but [tweede] tweede \\ -% \rul whow \\ -% \but [tweede] tweede \\ -% \raw hello world \\ -% \but [tweede] tweede \\ -% \com \vfill \\ -% \but [derde] derde \\ -% \stopinteractionmenu - -\newif\iflocationmenupermitted - -\def\testinteractionmenu#1% - {\iflocation - \doifelse\@@iamenu\v!on - {\doifelsevalue{\??am#1\c!state}\v!start - {\global\locationmenupermittedtrue} - {\global\locationmenupermittedfalse}} - {\global\locationmenupermittedfalse}% - \else - \global\locationmenupermittedfalse - \fi} - -\def\dodisableinteractionmenu[#1][#2][#3]% - {\def\dododisableinteractionmenu##1% - {\doifelse{#3}{} - {\letvalue{\??am##1\c!obstruction}\empty} - {\edef\interactieblokkade{\getvalue{\??am##1\c!obstruction}} - \def\docommand####1{#1{####1}{\interactieblokkade}}% #1 = \remove or \add - \processcommalist[#3]\docommand - \setevalue{\??am##1\c!obstruction}{\interactieblokkade}}}% - \processcommalist[#2]\dododisableinteractionmenu} - -\def\disableinteractionmenu - {\dotripleempty\dodisableinteractionmenu[\addtocommalist]} - -\def\enableinteractionmenu - {\dotripleempty\dodisableinteractionmenu[\removefromcommalist]} - -% ja : kader/achtergrond met tekst -% leeg : kader/achtergrond maar geen tekst -% nee : alleen ruimte reserveren -% geen : helemaal weglaten - -\newif\iflocationdummy -\newif\ifskippedmenuitem - -\newif\iflocationempty -\newif\iflocationclick - -% ja : kader/achtergrond met tekst -% leeg : kader/achtergrond maar geen tekst -% nee : alleen ruimte reserveren -% geen : helemaal weglaten -% -% \setupinteractionmenu[right][samepage=yes, unknownreference=yes] -% \setupinteractionmenu[right][samepage=empty,unknownreference=empty] -% \setupinteractionmenu[right][samepage=no, unknownreference=no] -% \setupinteractionmenu[right][samepage=none, unknownreference=none] -% -% \startinteractionmenu[right] -% \but [firstpage] first \\ -% \but [lastpage] last \\ -% \but [somepage] crap \\ -% \stopinteractionmenu - -\def\dosetlocationboxcontent#1[#2]#3[#4]% - {\global\skippedmenuitemfalse - \setbox\locationbox\hbox - {\resetgoto % anders cyclische aanroep ! - \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}}% - \iflocationclick - \hbox{\gotolocation{#4}{\box\locationbox}}% - \else - \hbox{\box\locationbox}% - \fi} - -\let\dosetlocationboxyes\dosetlocationboxcontent - -\def\dosetlocationboxempty#1[% - {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,} - -\def\dosetlocationboxno#1[% - {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,\c!frame=,\c!background=,} - -\def\dosetlocationboxnone#1[#2]#3[#4]% - {\global\skippedmenuitemtrue} - -\def\setlocationboxyes#1[#2]#3[#4]% - {\locationclicktrue - \setbox\locationbox\hbox - {\resetgoto % anders cyclische aanroep ! - \global\skippedmenuitemfalse - \gotolocation - {#4}% % needed - {\ifrealreferencepage - \ifcase\csname\??am\??am\csname#1\c!samepage\endcsname\endcsname\relax - \copycsname#1\c!color\endcsname\csname#1\c!contrastcolor\endcsname - \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}% - \or - \localframed[#1][\c!empty=\v!yes,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}% - \or - \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}% - \or - \global\skippedmenuitemtrue - \fi - \else - \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}% - \fi}}% - \ifskippedmenuitem\else\box\locationbox\fi} - -\def\setlocationboxnop#1[#2]#3[#4]% - {\locationclickfalse - \setbox\locationbox\hbox - {\resetgoto % anders cyclische aanroep ! - \global\skippedmenuitemfalse - \ifcase\csname\??am\??am\csname#1\c!unknownreference\endcsname\endcsname\relax - \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}% - \or - \localframed[#1][\c!empty=\v!yes,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}% - \or - \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}% - \or - \global\skippedmenuitemtrue - \fi}% - \ifskippedmenuitem\else\box\locationbox\fi} - -\def\setlocationboxraw#1[#2]#3[#4]% - {\localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}} - -\def\setlocationbox#1[#2]#3[#4]% - {\bgroup % really needed ! - \edef\permittedreferences{\csname#1\c!obstruction\endcsname}% - \doifreferencepermittedelse{#4}% - {\setlocationboxyes{#1}[#2]{#3}[#4]}% - {\setlocationboxnop{#1}[#2]{#3}[#4]}% + \ctxlua{backends.codeinjections.setupcanvas { + mode = "\@@scoption", + doublesided = \ifsinglesided false\else\ifdoublesided true\else false\fi\fi, + leftoffset = \number\dimexpr\backoffset\relax, + topoffset = \number\dimexpr\topoffset \relax, + width = \number\dimexpr\!!widtha \relax, + height = \number\dimexpr\!!heighta \relax, + paperwidth = \number\paperwidth, + paperheight = \number\paperheight + }}% \egroup} - -\def\setlocationnop#1[#2]#3% - {\localframed[#1][#2]{#3}} - -\def\executeamboxcommands#1#2#3#4#5% - {%\processaction - % [\getvalue{\??am#1\c!dummy}] - % [ \v!yes=>\chardef\handleunknownmenuitem=0\relax, - % \v!empty=>\chardef\handleunknownmenuitem=1\relax, - % \v!no=>\chardef\handleunknownmenuitem=2\relax]% - \getvalue{\??am#1#3}\relax - \setamboxcommands{#1}{#4}% - \ignorespaces#2\unskip - \getvalue{\??am#1#5}} - -\newcounter\currentamposition - -\newtoks\everysetmenucommands - -\def\setamboxcommands#1#2% - {\def\currentmenu{#1}% % kan nog eerder - \def\currentsubmenu{#2}% % ? ? - \doglobal\newcounter\currentamposition - \the\everysetmenucommands} - -\def\menu@@amboxcommand#1\\% - {\dontleavehmode - \bgroup - \ignorespaces#1\unskip\relax - \ifskippedmenuitem \else - \getvalue{\??am\currentmenu\currentsubmenu}% - \fi - \egroup - \ignorespaces} - -\appendtoks - \let\@@amboxcommand\menu@@amboxcommand -\to \everysetmenucommands - -\def\menu@raw[#1]#2\\% - {\@@amboxcommand\gotobox{\ignorespaces#2\unskip}[#1]\\}% - -\def\menu@but[#1]#2\\% - {\@@amboxcommand\do@@amposition\currentmenu{#1}{\setlocationbox{\??am\currentmenu}[]{\ignorespaces#2\unskip}[#1]}\\}% - -\def\menu@got[#1]#2\\% pas op! offset - {\@@amboxcommand\setlocationbox{\??am\currentmenu}[\c!frame=\v!off,\c!background=]{\ignorespaces#2\unskip}[#1]\\}% -\def\menu@nop#1\\% - {\@@amboxcommand\setlocationboxraw{\??am\currentmenu}[\c!frame=\v!off,\c!background=,\c!empty=\v!yes]{\ignorespaces#1\unskip}[]\\}% - -\def\menu@txt#1\\% - {\@@amboxcommand\localframed[\??am\currentmenu][\c!frame=\v!off,\c!background=]{\ignorespaces#1\unskip}\\}% - -\def\menu@rul#1\\% ook \do@@amposition ! - {\@@amboxcommand\localframed[\??am\currentmenu][]{\ignorespaces#1\unskip}\\}% - -\def\menu@com#1\\% - {\ignorespaces#1\unskip\ignorespaces}% +\let\synchronizepaperdimensions \synchronizepaperdimensionscomplex \appendtoks - \let\raw\menu@raw - \let\but\menu@but - \let\got\menu@got - \let\nop\menu@nop - \let\txt\menu@txt - \let\rul\menu@rul - \let\com\menu@com -\to \everysetmenucommands - -\ifx\do@@amposition\undefined - \let\do@@amposition\gobbletwoarguments % hook for positional thingies -\fi - -\let\currentmenu\empty - -% beware : never change the concept of pbgoffset - -\def\menuparameter#1{\csname\??am\currentmenu#1\endcsname} - -\def\@@amhbox#1#2#3#4% - {\def\currentmenu{#3}% - \testinteractionmenu{#3}% - \iflocationmenupermitted - \bgroup - \showcomposition - \scratchdimen\dimexpr - \makeupwidth - +\pagebackgroundhoffset - +\pagebackgroundhoffset - -\menuparameter\c!leftoffset - -\menuparameter\c!rightoffset - \relax - \setbox\scratchbox\hbox to \scratchdimen - {\forgetall\executeamboxcommands{#3}{#4}\c!left\c!middle\c!right}% - \setbox\scratchbox\hbox{\do@@ammenuposition{#3}{\box\scratchbox}}% - \wd\scratchbox\makeupwidth % geen \ht=#2 setting (yet) - \hskip\dimexpr-\pagebackgroundhoffset+\menuparameter\c!leftoffset\relax - \box\scratchbox - \egroup - \else - #1\relax - \fi} - -\def\@@amvbox#1#2#3#4% don't change skipping, this one works! - {\def\currentmenu{#3}% - \testinteractionmenu{#3}% - \iflocationmenupermitted - \bgroup - \showcomposition - \scratchdimen\dimexpr - \textheight - +\pagebackgroundvoffset - +\pagebackgroundvoffset - +\pagebackgrounddepth - -\menuparameter\c!topoffset - -\menuparameter\c!bottomoffset - \relax - \setbox\scratchbox\vbox to \scratchdimen - {\forgetall % Voor't geval de afstand - %\setupblank[\v!standard]% % (tijdelijk) is aangepast. - \restorestandardblank - \hsize#2\relax - \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after}% - \setbox\scratchbox\vbox{\hbox{\do@@ammenuposition{#3}{\box\scratchbox}}}% - \setbox\scratchbox\vbox - {\ht\scratchbox\zeropoint - \vskip\dimexpr-\pagebackgroundvoffset+\menuparameter\c!topoffset\relax - \box\scratchbox - \vskip\pagebackgroundvoffset}% overbodig - \ht\scratchbox\textheight - \wd\scratchbox#2\relax - \box\scratchbox - \egroup - \else - #1\relax - \fi} - -\ifx\do@@ammenuposition\undefined - \let\do@@ammenuposition\gobbleoneargument % hook for positional thingies -\fi - -\setvalue{\??am\s!do\v!right }{\@@amvbox{\dodummypageskip\v!right }\rightedgewidth} -\setvalue{\??am\s!do\v!left }{\@@amvbox{\dodummypageskip\v!left }\leftedgewidth } -\setvalue{\??am\s!do\v!top }{\@@amhbox{\dodummypageskip\v!top }\topheight } -\setvalue{\??am\s!do\v!bottom}{\@@amhbox{\dodummypageskip\v!bottom}\bottomheight } - -\def\dointeractionmenu#1#2% - {\getvalue{\??am\s!do\getvalue{\??am#1\c!location}}{#1}{#2}} - -\unexpanded\def\interactionmenu[#1]% - {\getvalue{\??am\c!menu#1}} - -\def\horizontalinteractionmenu#1#2#3#4% - {\ifdim#2>\zeropoint % new - \scratchdimen\zeropoint - \setbox\scratchbox\hbox - {\def\docommand##1% - {\doifnotvalue{\??am##1\c!state}\v!none - {\hskip\scratchdimen - \setbox2\hbox to #2 - {\getvalue{\??am##1#3}\interactionmenu[##1]\getvalue{\??am##1#4}}% - \doifelsevalue{\??am##1\c!distance}\v!overlay - {\scratchdimen\zeropoint - \wd2\zeropoint}% - {\scratchdimen\getvalue{\??am##1\c!distance}}% - \box2}}% - \startinteraction - \processcommacommand[\getvalue{\??am#1}]\docommand - \stopinteraction}% - \wd\scratchbox#2\relax - \box\scratchbox - \fi} - -\def\verticalinteractionmenu#1#2#3#4% - {\ifdim#2>\zeropoint % new - \scratchdimen\zeropoint - \setbox\scratchbox\vbox - {\def\docommand##1% - {\doifnotvalue{\??am##1\c!state}\v!none - {\vskip\scratchdimen - \setbox2\vbox to #2 - {\getvalue{\??am##1#3}\interactionmenu[##1]\getvalue{\??am##1#4}}% - \doifelsevalue{\??am##1\c!distance}\v!overlay - {\scratchdimen\zeropoint - \offinterlineskip - \dp2\zeropoint - \ht2\zeropoint}% - {\scratchdimen\getvalue{\??am##1\c!distance}}% - \box2}}% - \startinteraction - \processcommacommand[\getvalue{\??am#1}]\docommand - \stopinteraction}% - \ht\scratchbox#2\relax - \dp\scratchbox\zeropoint - \box\scratchbox - \fi} - -\letvalue{\??am\v!left }\empty -\letvalue{\??am\v!right}\empty -\letvalue{\??am\v!top }\empty -\letvalue{\??am\v!bottom }\empty - -% todo : \defineinteractionmenuclass - -\def\interactionmenus[#1]% - {\iflocation - \getvalue{\??am\??am\c!menu#1}% - \else - \dodummypageskip{#1}% - \fi} - -\setvalue{\??am\??am\c!menu\v!left }{\horizontalinteractionmenu\v!left \leftedgewidth \c!left \c!right} -\setvalue{\??am\??am\c!menu\v!right }{\horizontalinteractionmenu\v!right \rightedgewidth\c!left \c!right} -\setvalue{\??am\??am\c!menu\v!top }{\verticalinteractionmenu \v!top \topheight \c!before\c!after} -\setvalue{\??am\??am\c!menu\v!bottom}{\verticalinteractionmenu \v!bottom\bottomheight \c!before\c!after} - -% this can be implemented with the following command (which -% is new, undocumented, experimental, untested, etc etc) - -\def\defineinteractionmenuclass - {\dodoubleargument\dodefineinteractionmenuclass} + \ifproductionrun + \doifelse\@@pcstate\v!start + {\let\synchronizepaperdimensions\synchronizepaperdimensionssimple} + {\let\synchronizepaperdimensions\synchronizepaperdimensionscomplex}% + \fi +\to \everysetupinteractionscreen + +\appendtoks \synchronizepaperdimensions \to \everyshipout + +%D The next mechanism, linked lists, is quite old and +%D is \MKIV'd for completeness. I will finish the +%D confuguration part when I need it. -\def\dodefineinteractionmenuclass[#1][#2]% tag hori|veri - {\doifelse{#2}\v!vertical - {\setvalue{\??am\??am\c!menu#1}{\verticalinteractionmenu {#1}{\getvalue{\??am#1\c!width }}\c!before\c!after}} - {\setvalue{\??am\??am\c!menu#1}{\horizontalinteractionmenu{#1}{\getvalue{\??am#1\c!height}}\c!left\c!right }}} +% todo: a kind of button that gets a tag passed (\??tk) -% \setupinteraction[menu=on,state=start] -% -% \defineinteractionmenuclass[test] [vertical] -% \defineinteractionmenuclass[another][horizontal] -% -% \defineinteractionmenu[test] [left][state=start,width=4cm] -% \defineinteractionmenu[another][top] [state=start,height=1cm] -% -% \startinteractionmenu[test] -% \but [firstpage] test-a \\ -% \but [nextpage] test-b \\ -% \stopinteractionmenu -% -% \startinteractionmenu[another] -% \but [firstpage] test-a \\ -% \but [nextpage] test-b \\ -% \stopinteractionmenu -% -% \setupheadertexts[{\interactionmenu[another]}] -% % \starttext -% -% test \interactionmenu[test] \page -% test \interactionmenu[test] \page -% +% \setupinteraction[state=start] +% \definelinkedlist[demo] +% \dorecurse{10}{\linkedlistelement[demo]{link \recurselevel} \page} % \stoptext -%D This can save complicated menu macros when one want to -%D keep control over parts of a menu (i.e.\ turn them on and -%D off). We could have achieved something similar with modes. - -\def\local@@ambox#1#2#3#4% don't change skipping, this one works! - {\bgroup - \testinteractionmenu{#3}% - \iflocationmenupermitted - \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after - \else - #1\relax - \fi - \egroup} +\def\linkedlistparameter #1{\csname\dolinkedlistparameter{\??lk\currentlinkedlist}#1\endcsname} +\def\dolinkedlistparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dolinkedlistparentparameter\csname#1\s!parent\endcsname#2\fi} +\def\dolinkedlistparentparameter#1#2{\ifx#1\relax\s!empty\else\dolinkedlistparameter#1#2\fi} -\def\includemenu[#1]% - {\doifvalue{\??am#1\c!state}\v!local - {\bgroup - \letvalue{\??am#1\c!state}\v!start - \let\@@amvbox\local@@ambox - \let\@@amhbox\local@@ambox - \getvalue{\??am\c!menu#1}% - \egroup}} - -%D We also need an explicit position control some day. I'll -%D do that when I need it. [The stacking order.] - -\newif\ifextendedmenu - -% [name] [location] -% [name] [location] [pars] - -\def\defineinteractionmenu - {\dotripleempty\dodefineinteractionmenu} - -\def\dodefineinteractionmenu[#1][#2][#3]% - {% main settings - \letvalue{\??am\c!menu#1}\empty - \setvalue{\@@dodolistelement#1}{\def\dosomelistelement{\dodomenulistelement{#1}}}% - \presetlocalframed[\??am#1]% - % register location - \expanded{\addtocommalist{#1}\@EA\noexpand\csname\??am#2\endcsname}% - % inherit settings - \doifnot{#1}{#2} - {\copyparameters[\??am#1][\??am#2] - [\c!left,\c!middle,\c!right,\c!before,\c!after,\c!inbetween,% - \c!width,\c!height,\c!distance,\c!offset,% - \c!frame,\c!framecolor,\c!rulethickness,% - \c!background,\c!backgroundcolor,\c!backgroundscreen,% - \c!style,\c!color,\c!contrastcolor,\c!samepage,\c!unknownreference,% - \c!leftoffset,\c!rightoffset,\c!topoffset,\c!bottomoffset]}% - % additional settings - \getparameters[\??am#1][\c!location=#2,\c!obstruction=,#3]} - -\def\setupinteractionmenu - {\dodoubleargument\dosetupinteractionmenu} - -\def\dosetupinteractionmenu[#1][#2]% - {\def\docommand##1{\getparameters[\??am##1][#2]}% - \processcommalist[#1]\docommand} - -\expandafter\chardef\csname\??am\??am\v!yes \endcsname\zerocount -\expandafter\chardef\csname\??am\??am\v!empty\endcsname\plusone -\expandafter\chardef\csname\??am\??am\v!no \endcsname\plustwo -\expandafter\chardef\csname\??am\??am\v!none \endcsname\plusthree -\expandafter\chardef\csname\??am\??am \endcsname\plusone % default - -\processbetween{\v!interactionmenu}\dostartinteractionmenu - -\def\dostartinteractionmenu#1% - {\dodostartinteractionmenu#1\dodostopinteractionmenu} - -\def\dodostartinteractionmenu[#1]#2\dodostopinteractionmenu - {\setvalue{\??am\c!menu#1}{\extendedmenutrue\dointeractionmenu{#1}{#2}}} - -\def\resetinteractionmenu[#1]% - {\letvalue{\??am\c!menu#1}\empty} - -\def\dodomenulistelement#1#2#3#4#5#6#7% - {\setbox0=\hbox - {\let\gotolocation\gobbleoneargument % hack to catch last [] - %\locationclickfalse % ipv ^ - \docheckrealreferencepage{#7}% - \setlocationboxyes - {\??am#1}% % needed ! - []% no settings - {\limitatetext{#5}{\namedlistparameter{#2}\c!maxwidth}{\unknown}}% % needed ! - []}% normally the destination, catch by gobble - \@@amboxcommand\do@@amposition{#1}{#7}% beware, we pass the pagenumber - {\ignorespaces\linklisttoelement{#3}{#6}{#7}{\box0}\unskip}\\} - -% \scherm moet worden als \page +\def\definelinkedlist{\dodoubleargument\dodefinelinkedlist} +\def\setuplinkedlist {\dodoubleargument\dosetuplinkedlist } +\def\setuplinkedlists{\dosingleargument\dosetuplinkedlists} -\def\screen - {\dosingleempty\doscreen} - -\def\doscreen[#1]% - {\iflocation\page[#1]\fi} - -\unexpanded\def\menubutton - {\dodoubleempty\domenubutton} - -\def\domenubutton[#1]% - {\iffirstargument - \ifsecondargument - \@EAEAEA\domenubuttonB - \else - \doifassignmentelse{#1} - {\@EAEAEA\domenubuttonC} - {\@EAEAEA\domenubuttonD}% - \fi - \else - \@EA\domenubuttonA - \fi[#1]} - -\def\domenubuttonA[#1][#2]#3[#4]% normal button, no parameters - {\bgroup - %\locationdummytrue - \setlocationbox\??bt[]{#3}[#4]% - \egroup} +\def\dodefinelinkedlist[#1][#2]% + {\ctxlua{interactions.definelinkedlist("#1")}% + \getparameters[\??lk#1][\s!parent=\??lk,#2]} -\def\domenubuttonB[#1][#2]#3[#4]% menu button, with parameters - {\bgroup - %\locationdummytrue - \setlocationbox{\??am#1}[#2]{#3}[#4]% - \egroup} - -\def\domenubuttonC[#1][#2]#3[#4]% normal button, with parameters - {\bgroup - %\locationdummytrue - \setlocationbox\??bt[#1]{#3}[#4]% - \egroup} - -\def\domenubuttonD[#1][#2]#3[#4]% menu button, no parameters - {\bgroup - %\locationdummytrue - \setlocationbox{\??am#1}[]{#3}[#4]% - \egroup} - -\def\menubox - {\dodoubleempty\domenubox} - -\def\domenubox[#1][#2]#3% - {\bgroup - \let\setlocationbox\setlocationboxraw - \domenubutton[#1][#2]#3[]% - \egroup} - -% Hier volgen de synchronisatiemacro's: - -\def\syncprefix{sync} - -%def\syncmarker{syncmark} -%\definemarking[\syncmarker] -%\setupmarking[\syncmarker][\c!expansie=\v!ja] - -\newmark\syncmarker - -\newcounter\synccounter - -\newif\ifsynchronisation - -\def\startsynchronization% - {\iflocation\ifsynchronisation - \doglobal\increment\synccounter - \fi\fi} - -\def\stopsynchronization% - {\iflocation\ifsynchronisation - %\thisisdestination{\syncprefix:\synccounter}% - \pagereference[\syncprefix:\synccounter]% - \ifvmode - \@EA\setmark\@EA\syncmarker\@EA{\synccounter} % \marking[\syncmarker]{\synccounter}% - \else - \showmessage\m!interactions4\synccounter - \fi - \fi\fi} +\def\dosetuplinkedlist[#1][#2]% + {\getparameters[\??lk#1][#2]} -\def\synchronize% - {\startsynchronization - \stopsynchronization} +\def\dosetuplinkedlists[#1]% + {\getparameters[\??lk][#1]} -\def\dosetupsynchronization[#1]% - {\getparameters[\??sy][#1]% - \doifelse\@@systate\v!start - \synchronisationtrue - \synchronisationfalse} +\def\setlinkproperties#1#2#3#4#5#6% + {\def\currentlink {#1}% + \def\noflinks {#2}% + \def\firstlink {#3}% + \def\previouslink{#4}% + \def\nextlink {#5}% + \def\lastlink {#6}} -\def\setupsynchronization - {\dosingleargument\dosetupsynchronization} - -\def\definesynchronization - {\dosingleargument\dodefinesynchronization} - -\def\setupsynchronizationbar - {\dodoubleargument\getparameters[\??ba]} - -\presetlocalframed[\??ba] - -\setvalue{synchronisatie\v!page}[#1]% - {\bgroup - %\setupinteraction[\c!width=\!!zeropoint]% - \setinteractionparameter\c!width\!!zeropoint - \setbox0\hbox - {\localframed[\??ba][]{\dolocationattributes\??ba\c!style\c!color{\strut\@@batext}}}% - \dontcomplain - \def\atthebottom - {\leaders\hrule\!!depth1ex\!!height-.5ex\hfil}% - \def\atthetop##1##2##3% - {\dimen0=\wd0 - \divide\dimen0 3 - \multiply\dimen0 ##2\relax - \dimen2=.25em % brrr - \advance\dimen0 -##3\dimen2 - %\gotodestination - % {}{#1}{\syncprefix:##1}{} - % {\hbox to \dimen0{\color[\locationcolor\@@bacolor]{\atthebottom}}}}% - \gotobox - {\hbox to \dimen0{\color[\locationcolor\@@bacolor]{\atthebottom}}}% - [#1::\syncprefix:##1]}% - \hbox - {\def\check##1##2% - {\edef##2{0##1\syncmarker}% - \ifnum0##2=0 \def##2{1}\fi}% - \check\gettopmark\top - \check\getfirstmark\first - \check\getbotmark\bot - \setbox2\hbox to \wd0 - {\ifnum\top=\first\relax - \ifnum\first=\bot\relax - \atthetop\first30\relax - \else - \atthetop\first21\hss\atthetop\bot11\relax - \fi - \else - \ifnum\first=\bot\relax - \atthetop\top11\hss\atthetop\first21\relax - \else - \atthetop\top11\hss\atthetop\first11\hss\atthetop\bot11\relax - \fi - \fi}% - \wd2=\zeropoint\box2 - \box0\relax}% - \egroup} - -\setvalue{synchronisatie\v!local}[#1]% - {\bgroup - %\setupinteraction[\c!width=\!!zeropoint]% - \setinteractionparameter\c!width\!!zeropoint - \def\blackrule{\hbox{\vrule\!!height.5em\!!width.5em}}% - %\gotodestination - % {}{##1}{\syncprefix:#1}{0} - % {\color[\locationcolor\@@bacolor]{\blackrule}}% - \gotobox % - {\color[\locationcolor\@@bacolor]{\blackrule}}% - [#1::\syncprefix:\synccounter]% - \egroup} - -\def\synchronizationbar[#1][#2]% - {\iflocation\ifsynchronisation - \bgroup - \setupsynchronizationbar - [\c!text=\getvalue{doc:des:#1},#2]% - \getvalue{synchronisatie\@@baalternative}[#1]% - \egroup - \fi\fi} - -% A nice application of glue. All this code will be rewritten and -% generalized. - -\newbox\interactionbarbox - -\newif\ifbarsymbol - -\def\dogotosomepage#1#2#3% nog checken ! - {\hbox - {\iflocation - \ifnum#3=\realpageno - #2% - \else - \gotorealpage\empty\empty{#3}{\doifsomething{#1}{\dolocationattributes{#1}\c!style\c!color}{#2}}% +\def\linkedlistelement[#1]#2% currently no view support + {\dontleavehmode\hbox\bgroup + #2% + \iflocation + \edef\currentlinkedlist{#1}% + \ifcsname\??lk\currentlinkedlist\s!parent\endcsname + \hskip\linkedlistparameter\c!distance + \ctxlua{interactions.addlinktolist("\currentlinkedlist")}% + \expanded{\ctxlatelua{interactions.enhancelinkoflist("\currentlinkedlist",\currentlink)}}% + \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink + \ifnum\noflinks>\plustwo + \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink + \dogotosomepage{\??lk\currentlinkedlist}\goforwardcharacter \nextlink \fi + \dogotosomepage {\??lk\currentlinkedlist}\gotoendcharacter \lastlink \else - #2% - \fi}} - -\def\dogotosomecontrastpage#1#2#3% nog checken, may replace previous - {\checkreferences % nodig ?? - \hbox - {\iflocation - \ifnum#3=\realpageno - \gotorealpage\empty\empty{#3}{\doifsomething{#1}{\dolocationattributes{#1}\c!style\c!contrastcolor}{#2}}% - \else - \gotorealpage\empty\empty{#3}{\doifsomething{#1}{\dolocationattributes{#1}\c!style\c!color}{#2}}% - \fi - \else - #2% - \fi}} - -\presetlocalframed[\??ib] - -\def\interactionbara % we need better control over contrastcolor - {\iflocation % maybe just use gotopage and set colors - \bgroup - \setinteractionparameter\c!width\zeropoint - \setupblackrules[\c!height=\v!max,\c!depth=\v!max]% - \!!widthb\dimexpr\@@ibwidth-2.75\emwidth\relax - \!!widtha\dimexpr\!!widthb/\lastpage\relax - \bgroup - \advance\realpageno\minusone - \ifvoid\interactionbarbox - \bgroup - \processaction - [\@@ibstep] - [ \v!small=>\scratchdimen.25\emwidth, - \v!medium=>\scratchdimen.5\emwidth, - \v!big=>\scratchdimen\emwidth, - \s!unknown=>\scratchdimen\!!widtha]% - \ifdim\!!widtha<\scratchdimen\relax - \!!counta\numexpr\scratchdimen/\!!widtha\relax - \else - \!!counta\@@ibstep\relax - \fi - \!!widtha\!!counta\!!widtha - \setbox\scratchbox\hbox{\blackrule[\c!width=\!!widtha,\c!color=middlegray]}% color here, else no mkiv - \global\setbox\interactionbarbox\hbox to \!!widthb - {\hss - \dostepwiserecurse\plusone\lastpage\!!counta - {\gotorealpage\empty\empty\recurselevel{\copy\scratchbox}}% - \hss}% - \global\wd\interactionbarbox\zeropoint - \egroup - \fi - \egroup - \noindent - \strut - \hbox to \@@ibwidth - {\dontcomplain - \setupblackrules[\c!width=\emwidth]% - \dogotosomecontrastpage\??ib\blackrule\firstpage - \hss - \copy\interactionbarbox - \hbox to \!!widthb - {\ifdim\!!widtha<\emwidth - \!!widtha\emwidth - \fi - \setupblackrules[\c!width=\!!widtha]% - \ifnum\realpageno>\plusone - \!!counta\numexpr\realpageno-\plustwo\relax - \hskip\zeropoint\!!plus\!!counta \s!sp\relax % cm gives overflow - \dogotosomepage\??ib\blackrule\prevpage - \fi - \dogotosomecontrastpage\??ib{\blackrule[\c!width=.5em]}\realpageno - \ifnum\realpageno<\lastpage\relax - \dogotosomepage\??ib\blackrule\nextpage - \!!counta\numexpr\lastpage-\realpageno-\plusone\relax - \hskip\zeropoint\!!plus\!!counta \s!sp\relax % cm gives overflow - \fi}% - \hss - \dogotosomecontrastpage\??ib\blackrule\lastpage}% - \egroup - \fi} - -\def\interactionbarb - {\ifnum\lastpage>\firstpage\relax - \interactionbuttons[\v!firstpage,\v!previouspage,\v!nextpage,\v!lastpage]% - \fi} - -\def\interactionbarc - {\iflocation - \ifnum\lastpage>\plusone - \hbox to \@@ibwidth - {\setupblackrules[\c!height=\@@ibheight,\c!depth=\@@ibdepth]% - \scratchdimen\dimexpr(\@@ibwidth-4\emwidth)/\numexpr\lastpage+\minusone\relax\relax - \!!widtha\numexpr\realpageno+\minusone\relax\scratchdimen - \!!widthb\numexpr\lastpage-\realpageno\relax\scratchdimen - \startcolor[\locationcolor\@@ibcolor]% - \dogotosomepage\empty{\blackrule[\c!width=\emwidth]}\firstpage - \hss - \dogotosomepage\empty{\blackrule[\c!width=\!!widtha]}\prevpage - \color[\@@ibcontrastcolor]{\blackrule[\c!width=\emwidth]}% - \dogotosomepage\empty{\blackrule[\c!width=\!!widthb]}\nextpage - \hss - \dogotosomepage\empty{\blackrule[\c!width=\emwidth]}\lastpage - \stopcolor}% - \fi - \fi} - -\def\interactionbard - {\iflocation\ifshowingsubpage - \ifnum\nofsubpages>\plusone - \hbox \bgroup - \setinteractionparameter\c!width\!!zeropoint - \ifbarsymbol - \setupsymbolset[\@@iasymbolset]% - \def\dogotox##1% - {\hbox{\symbol[\ifcase##1 \v!previous\or\v!somewhere\or\v!next\fi]}}% - \else - \def\dogotox##1% - {\hbox{\vrule\!!height\@@ibheight\!!depth \@@ibdepth\!!width \@@ibwidth}}% - \fi - \dostepwiserecurse\plusone\nofsubpages\plusone - {\bgroup - \scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax - \ifnum\scratchcounter<\realpageno\relax - \dogotosomecontrastpage\??ib{\dogotox0}\scratchcounter - \else\ifnum\scratchcounter=\realpageno\relax - \dogotosomecontrastpage\??ib{\dogotox1}\scratchcounter - \else - \dogotosomecontrastpage\??ib{\dogotox2}\scratchcounter - \fi\fi - \egroup - \hskip\@@ibdistance}% - \unskip % not needed - \egroup - \fi - \fi\fi} - -\def\interactionbare% KAN WORDEN GECOMBINEERD MET D - {\iflocation\ifshowingsubpage - \ifnum\nofsubpages>\plusone - \bgroup - \!!widthb\dimexpr\nofsubpages\dimexpr\@@ibdistance\relax-\@@ibdistance\relax % (n-1) - \!!widtha\dimexpr(\@@ibwidth-\!!widthb)/\nofsubpages\relax - \ifdim\!!widtha<\@@ibdistance\relax - \interactionbarf - \else - \setinteractionparameter\c!width\!!zeropoint - \noindent - \hbox to \@@ibwidth - \bgroup - \ifbarsymbol - \setupsymbolset[\@@iasymbolset]% - \def\dogotox##1% - {\hbox{\symbol[\ifcase##1 \v!previous\or\v!somewhere\or\v!next\fi}}% - \else - \def\dogotox##1% - {\hbox{\vrule\!!height\@@ibheight\!!depth\@@ibdepth\!!width\!!widtha}}% - \fi - \dostepwiserecurse\plusone\nofsubpages\plusone - {\bgroup - \scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax - \ifnum\scratchcounter<\realpageno\relax - \dogotosomecontrastpage\??ib{\dogotox0}\scratchcounter - \else\ifnum\scratchcounter=\realpageno\relax - \dogotosomecontrastpage\??ib{\dogotox1}\scratchcounter - \else - \dogotosomecontrastpage\??ib{\dogotox2}\scratchcounter - \fi\fi - \egroup - \hss}% - \unskip - \egroup - \fi - \egroup + \writestatus\m!interactions{no such linked list: \currentlinkedlist}% \fi - \fi\fi} - -\def\interactionbarf % !! KAN WORDEN GECOMBINEERD MET D !! - {\iflocation\ifshowingsubpage - \ifnum\nofsubpages>\plusone - \setinteractionparameter\c!width\!!zeropoint - \noindent - \hbox to \@@ibwidth - \bgroup - \!!countb\zerocount - \loop % todo: \doloop - \advance\!!countb \plusone - %\!!countc\nofsubpages \divide\!!countc \!!countb \advance\!!countc \plusone - \!!countc\numexpr(\nofsubpages/\!!countb)+\plusone\relax % rounding - \!!widthb\@@ibdistance - \multiply\!!widthb \!!countc - \advance\!!widthb -\@@ibdistance - \!!widtha\@@ibwidth - \advance\!!widtha -\!!widthb - \divide\!!widtha \!!countc - \ifdim\!!widtha<\@@ibdistance\relax - \repeat - \ifnum\!!countc>\plusone - % this is not that well tested - \advance\!!countc \minustwo - \!!widtha-\@@ibdistance - \!!widtha\!!countc\!!widtha - \advance\!!widtha \@@ibwidth - \advance\!!countc \plusone - \divide\!!widtha \!!countc - \fi - \ifbarsymbol - \setupsymbolset[\@@iasymbolset]% - \def\dogotox##1% - {\hbox{\symbol[\ifcase##1 \v!previous\or\v!somewhere\or\v!somewhere\or\v!somewhere\or\v!next\fi}}% - \else - \def\dogotox##1% - {\hbox - {\!!heighta\@@ibheight - \!!deptha\@@ibdepth - \ifcase##1\relax - \vrule\!!height \!!heighta\!!depth \!!deptha\!!width\!!widtha - \or - \vrule\!!height.5\!!heighta\!!depth.5\!!deptha\!!width\!!widtha - \or - \vrule\!!height \!!heighta\!!depth \!!deptha\!!width\!!widtha - \or - \vrule\!!height.5\!!heighta\!!depth.5\!!deptha\!!width\!!widtha - \or - \vrule\!!height \!!heighta\!!depth \!!deptha\!!width\!!widtha - \fi}}% - \fi - \!!countc\numexpr\realpageno-\plustwo\relax - \!!countd\numexpr\realpageno+\plustwo\relax - \ifnum\!!countc<\plusone \!!countc\plusone \fi - \!!countf\zerocount - \dostepwiserecurse\firstsubpage\lastsubpage\plusone - {\!!doneafalse - \advance\!!countf \plusone - \ifnum\recurselevel=\firstsubpage\relax \!!doneatrue \fi - \ifnum\recurselevel=\lastsubpage\relax \!!doneatrue \fi - \if!!donea - \ifnum\recurselevel<\realpageno - \dogotosomecontrastpage\??ib{\dogotox0}\recurselevel - \else\ifnum\recurselevel>\realpageno - \dogotosomecontrastpage\??ib{\dogotox2}\recurselevel - \else - \dogotosomecontrastpage\??ib{\dogotox4}\recurselevel - \fi\fi - \hss - \!!countf\zerocount - \else\ifnum\!!countf=\!!countb - \ifnum\recurselevel<\realpageno - \dogotosomecontrastpage\??ib{\dogotox1}\recurselevel - \else\ifnum\recurselevel>\realpageno - \dogotosomecontrastpage\??ib{\dogotox3}\recurselevel - \else - \dogotosomecontrastpage\??ib{\dogotox2}\recurselevel - \fi\fi - \hss - \!!countf\zerocount - \fi\fi}% - \unskip - \egroup - \fi - \fi\fi} - -\def\interactionbarg - {\ifnum\lastsubpage>\firstsubpage\relax - \interactionbuttons[\v!firstsubpage,\v!previoussubpage,\v!nextsubpage,\v!lastsubpage]% - \fi} - -\def\checkinteractionbar#1#2#3% - {\ifdim\@@ibwidth=\zeropoint\def\@@ibwidth{#1}\fi - \doifnothing\@@ibheight{\def\@@ibheight{#2}}% - \doifnothing\@@ibdepth{\def\@@ibdepth{#3}}} - -\def\complexinteractionbar[#1]% - {\doifelse{#1}\v!reset - {\global\setbox\interactionbarbox\emptybox}% - {\bgroup - \iflocation - \checksubpages % goes wrong / loads \numberofpages too - \getparameters[\??ib][#1]% - \doif\@@ibstate\v!start - {\startinteraction - \processaction % breedte defaults ! - [\@@ibalternative] - [ c=>\checkinteractionbar{10em}\v!max \v!max, - d=>\checkinteractionbar{.5em}{.5em} \!!zeropoint, - e=>\checkinteractionbar{10em}{.5em} \!!zeropoint, - f=>\checkinteractionbar{10em}{.5em} \!!zeropoint, - \s!default=>\checkinteractionbar{10em}\v!broad\!!zeropoint, - \s!unknown=>\checkinteractionbar{10em}\v!broad\!!zeropoint]% - \doifelse\@@ibsymbol\v!yes - \barsymboltrue\barsymbolfalse - \getvalue{interactionbar\@@ibalternative}% - \stopinteraction}% - \fi - \egroup}} - -\definecomplexorsimpleempty\interactionbar - -\def\setupinteractionbar - {\dodoubleargument\getparameters[\??ib]} - -% Er wordt vooralsnog uitgegaan van een symmetrische -% start-stop situatie. - -\def\c!profiel!! {profiel:} % brrr -\def\c!versie!! {versie:} - -\def\dodefineprofile[#1][#2]% - {\iflocation - \def\dododefineprofile##1% - {\def\dodododefineprofile####1% - {\doifdefinedelse{\c!profiel!!####1}% - {\edef\!!stringa{\getvalue{\c!profiel!!####1}}% - \setevalue{\c!profiel!!####1}{\!!stringa,##1}}% - {\setevalue{\c!profiel!!####1}{##1}}}% - \processcommalist[#2]\dodododefineprofile}% - \processcommalist[#1]\dododefineprofile - \fi} - -\def\defineprofile% - {\dodoubleargument\dodefineprofile} - -% Als met \getpar wordt gewerkt, dan moet \next worden toegepast. - -% TZT initialisatie! - -\def\profilepage{} - -\let\dosetprofilepage\relax -\let\dogetprofilepage\relax - -\def\processprofile#1[#2]% - {\iflocation - \par % needed for pdftex - \bgroup - \dosetprofilepage - \dogetprofilepage - \def\processoneprofile##1##2% - {\ExpandBothAfter\doifinsetelse{##2}{\processedprofiles}% - {\doifsomething{##1}{(##1)}}% - {\addtocommalist{##2}\processedprofiles - ##1\relax - \ifcase#1\relax - \dobeginofprofile{##2}\paperwidth\paperheight\profilepage - \else - \doendofprofile - \fi}}% - \let\processedprofiles\empty - \def\doprocessprofile##1% - {\doifelse{\@@pfoption}{\v!test}% - {\goodbreak\blank\nobreak\tt[\space - \ifcase#1\v!start\else\v!stop\fi profiel\space ##1:\space - \doifdefinedelse{\c!profiel!!##1}% - {\def\dodoprocessprofile####1% - {\processoneprofile - {\goto{####1}[\c!profiel!!####1]}% - {####1}% - \space}% - \processcommacommand - [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}% - {- }% - ]\nobreak\blank}% - {\doifdefined{\c!profiel!!##1}% - {\def\dodoprocessprofile####1% - {\processoneprofile{}{####1}}% - \processcommacommand - [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}}}% - \processcommalist[#2]\doprocessprofile - \egroup - \par % needed for pdftex - \fi} - -\def\startprofile[#1]% - {\iflocation - \bgroup - \addtocommalist{#1}\actualprofile - \def\stopprofile% - {\processprofile1[#1]% - \egroup}% - \def\next{\processprofile0[#1]}% % \DoAfterFi \processprofile0[#1]% - \else % ^^^^^^^^^^ will be obsolete - \let\next\relax % since ugly and never used \fi - \next} - -\let\stopprofile\relax - -\def\dofollowprofile#1[#2]% - {\iflocation - \hbox - {\dohandlegoto - {\dolocationattributes\??ia\c!style\c!color{#1\presetgoto}}% - {\dostartgotoprofile\buttonwidth\buttonheight{#2}}% - {\dostopgotoprofile}}% - \else - {#1}% - \fi} - -\def\followprofile#1[#2]% - {\iflocation - \doif\@@pfoption\v!test{\pagereference[\c!profiel!!#2]}% - \dofollowprofile{#1}[#2]% - \fi} - -\def\setupprofiles% - {\dodoubleargument\getparameters[\??pf]} - -% Als er nog geen tekst op de pagina staat, dan heeft het -% profiel betrekking op het bovenstaande, dus soms een vorige -% pagina! Vreemd, omdat PDF paginagewijs werkt. Gelukkig -% biedt /page een oplossing. Echter: expansie van een -% \special kan niet worden uitgesteld, zodat alleen een -% two-pass een oplossing vormt. Het onderstaande kan komen -% te vervallen als Acrobat dit ondervangt. Het scheelt een -% pass en een lijst. -% -% Er kunnen eventueel twee lijsten worden gebruikt. Een voor -% het begin (start) en een voor het eind (stop). Nu staat -% alles in een lijst. - -\definetwopasslist\s!profile - -\newcounter\currentprofile - -\def\dosetprofilepage% - {\doglobal\increment\currentprofile - \lazysavetwopassdata{\s!profile}{\currentprofile}{\noexpand\realfolio}} - -\def\dogetprofilepage% - {\gettwopassdata{\s!profile}% - \let\profilepage=\twopassdata} - -% is this stuff used at all - -\newcounter\versionlevel -\newcounter\versionorder - -\newif\ifrecentversion - -\let\oldatcharacter=@ - -\def\minimumversion{0} -\def\actualversion{0} + \egroup} -\def\dosetupversions[#1]% - {\getparameters[\??ve][#1] - \stripcharacter.\from\@@venumber\to\minimumversion} +\setuplinkedlists + [\c!distance=.25em, + \c!width=\v!fit, + \c!location=\v!low, + \c!color=\@@iacolor, + \c!frame=\v!off, + \c!background=, + \c!backgroundcolor=] -\def\setupversions - {\dosingleargument\dosetupversions} +\def\koppeling {\linkedlistelement} +\def\stelkoppelingenin {\setuplinkedlists} +\def\definieerkoppeling{\definelinkedlist} -\definetwopasslist\s!versionbegin -\definetwopasslist\s!versionend +%D Conditional page breaks: -\let\actualprofile\empty +\def\screen + {\dosingleempty\doscreen} -\def\doresetpageversion - {\lazysavetwopassdata{\s!versionend}{\versionorder}{\noexpand\realfolio}} +\def\doscreen[#1]% + {\iflocation\page[#1]\fi} -\def\dosetpageversion#1% - {\recentversiontrue - \doglobal\increment\versionorder\relax - \lazysavetwopassdata{\s!versionbegin}{\versionorder}{\noexpand\realfolio}% - \let\resetpageversion\doresetpageversion} +%D Page transitions: -\def\recentcontributions{} +\let\askedpagetransitions\empty -\def\checkrecentcontributions% - {\gettwopassdata{\s!versionbegin}% - \iftwopassdatafound - \!!counta\twopassdata\relax - \gettwopassdata{\s!versionend}% - \iftwopassdatafound - \!!countb\twopassdata\relax - \doglobal\increment\versionorder\relax - \savetwopassdata{\s!versionbegin}{\versionorder}{\the\!!counta}% - \savetwopassdata{\s!versionend }{\versionorder}{\the\!!countb}% - \dostepwiserecurse\!!counta\!!countb\plusone - {\@EA\doglobal\@EA\addtocommalist\@EA{\recurselevel}{\recentcontributions}}% - \let\next\checkrecentcontributions - \else - \let\next\relax - \fi - \else - \let\next\relax - \fi - \next} +\def\setuppagetransitions + {\dosingleempty\dosetuppagetransitions} -\def\docheckpageversion - {\ExpandBothAfter\doifinsetelse{\realfolio}{\recentcontributions} - {\pageselectedtrue}% - {\pageselectedfalse}} +\def\dosetuppagetransitions[#1]% + {\edef\askedpagetransitions{#1}} -\let\setpageversion \gobbleoneargument -\let\resetpageversion \relax -\let\checkpageversion \relax +\def\setpagetransition + {\iflocation \ifx\askedpagetransitions\empty \else + \ctxlua{backends.codeinjections.setpagetransition{ n = "\askedpagetransitions", delay = "\@@scdelay" }}% + \fi \fi} -\def\complexstartversion[#1]% - {\bgroup - \doifelsenothing\actualprofile - {\startprofile[#1]}% - {\startprofile[#1,\actualprofile]}% - \def\docomplexstartversie##1% - {\stripcharacter.\from##1\to\actualversion - \ifnum\versionlevel>\zerocount\relax - \ifnum\actualversion=\zerocount - \setpageversion\actualversion % unknown version - \else - \ifnum\actualversion<\minimumversion\relax - \relax % old version - \else - \setpageversion\actualversion % new version - \fi - \fi - \fi}% - \doglobal\increment\versionlevel\relax - \doifelsenothing{#1} - {\docomplexstartversie{0}}% - {\processcommalist[#1]\docomplexstartversie}} - -\definecomplexorsimpleempty\startversion - -\def\stopversion - {\stopprofile - \doglobal\decrement\versionlevel - \ifnum\versionlevel<\zerocount - \showmessage\m!versions1\empty - \else - \resetpageversion - \egroup - \fi} +\prependtoks \setpagetransition \to \everyshipout -\def\markversion - {\showmessage\m!versions2\empty - \let\setpageversion\dosetpageversion - \let\resetpageversion\relax - \let\checkpageversion\relax} - -\def\selectversion - {\checkrecentcontributions - \showmessage\m!versions3\recentcontributions - \let\setpageversio\gobbleoneargument - \let\resetpageversion\relax - \let\checkpageversion\docheckpageversion} - -\def\dodefineversion[#1][#2]% - {\setvalue{\c!versie!!#1}{#2}% - \defineprofile[#1][#2]} - -\def\defineversion - {\dodoubleargument\dodefineversion} - -\def\followversion - {\followprofile} - -\def\followprofileversion#1[#2][#3]% - {\def\docommand##1% - {\defineprofile[#2#3][##1]}% - \processcommacommand[\getvalue{\c!versie!!#3}]\docommand - \followprofile#1[#2#3]} - -\newcounter\currentpagetransition +\setuppagetransitions + [\v!reset] -\newif\ifrandomtransitions +%D Comments: -\def\setuppagetransitions% - {\dosingleempty\dosetuppagetransitions} +\newbox\commentcollection +\newbox\commentbox +\newbox\commentboxone +\newbox\commentboxtwo -\def\dosetuppagetransitions[#1]% - {\doifelsenothing{#1} - {\doifnot\@@scdelay\v!none - {\let\setpagetransition\setsomepagedelay}} - {\doifelse{#1}\v!start - {\doifnot\@@scdelay\v!none - {\let\setpagetransition\setsomepagedelay}} - {\doglobal\newcounter\currentpagetransition - \doifinsetelse{#1}{\v!reset,\v!stop} - {\let\setpagetransition\relax} - {\let\setpagetransition\setsomepagetransition - \doifinsetelse\v!random{#1} - {\randomtransitionstrue}{\randomtransitionsfalse}% - \edef\userpagetransitions{#1}% - \@EA\removefromcommalist\@EA{\v!random}\userpagetransitions - \ifx\userpagetransitions\empty - \let\userpagetransitions\pagetransitions - \fi}}}} - -\def\setsomepagedelay - {\expanded{\dosetpagetransition{0}{\@@scdelay}}} - -\def\setsomepagetransition - {\iflocation - \ifrandomtransitions - \expanded{\getcommalistsize[\userpagetransitions]}% - \getrandomnumber\currentpagetransition1\commalistsize - \else - \doglobal\increment\currentpagetransition - \fi - \expanded{\getfromcommalist[\userpagetransitions][\currentpagetransition]}% - \doifnumberelse\commalistelement - {\expanded{\getfromcommalist[\pagetransitions][\commalistelement]}} - {}% - \ifx\commalistelement\empty - \doglobal\newcounter\currentpagetransition - \setsomepagetransition - \else - \doifelse\@@scdelay\v!none - {\expanded{\dosetpagetransition{\commalistelement}{0}}} - {\expanded{\dosetpagetransition{\commalistelement}{\@@scdelay}}}% - \fi - \fi} +\def\raisedcommentanchors#1#2{#1{\hbox{\raise\strutht#2}}} -\prependtoks \setpagetransition \to \everyshipout - -% temporary here - -%D \startbuffer -%D \dorecurse{10} -%D {\horizontalpositionbar -%D \pos\recurselevel \min1 \max10 -%D \token\framed{\recurselevel}% -%D \\} -%D -%D \hbox to 15em -%D {\hss -%D \dorecurse{10} -%D {\verticalpositionbar\pos\recurselevel\min1\max10\token\blackrule\\ -%D \hss}} -%D \stopbuffer - -\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\% - {\hbox to \hsize - {\hskip\zeropoint\!!plus #1\!!fill - \hskip\zeropoint\!!plus-#2\!!fill - #4\relax - \hskip\zeropoint\!!plus #3\!!fill - \hskip\zeropoint\!!plus-#1\!!fill}} - -\def\verticalpositionbar\pos#1\min#2\max#3\token#4\\% - {\vbox to \vsize - {\vskip\zeropoint\!!plus #1\!!fill - \vskip\zeropoint\!!plus-#2\!!fill - \hbox{#4}\relax - \vskip\zeropoint\!!plus #3\!!fill - \vskip\zeropoint\!!plus-#1\!!fill}} - -\def\horizontalgrowingbar\pos#1\min#2\max#3\height#4\depth#5\\% - {\hbox to \hsize - {\scratchcounter#1% - \advance\scratchcounter -#2% - \advance\scratchcounter \plusone - \leaders\vrule\hskip\zeropoint\!!plus \scratchcounter\!!fill - \vrule\!!width\zeropoint\!!height#4\!!depth#5% - \hskip\zeropoint\!!plus #3\!!fill - \hskip\zeropoint\!!plus-#1\!!fill}} - -\def\verticalgrowingbar\pos#1\min#2\max#3\width#4\\% - {\vbox to \vsize - {\scratchcounter#1% - \advance\scratchcounter -#2% - \advance\scratchcounter \plusone - \leaders\hrule\vskip\zeropoint\!!plus\scratchcounter\!!fill - \hrule\!!width#4\!!height\zeropoint\!!depth\zeropoint - \vskip\zeropoint\!!plus #3\!!fill - \vskip\zeropoint\!!plus-#1\!!fill}} - -\newbox\commentbox +\setvalue{\??cc:\c!location:\v!inmargin }{\raisedcommentanchors\inmargin } +\setvalue{\??cc:\c!location:\v!leftedge }{\raisedcommentanchors\inleftedge } +\setvalue{\??cc:\c!location:\v!rightedge }{\raisedcommentanchors\inrightedge } +\setvalue{\??cc:\c!location:\v!leftmargin }{\raisedcommentanchors\inleftmargin } +\setvalue{\??cc:\c!location:\v!rightmargin}{\raisedcommentanchors\inrightmargin} \def\doflushcommentanchors - {\let\next\relax % new - \processaction - [\@@cclocation] - [% \v!text=>\let\next\relax, % new - \v!inmargin=>\let\next\inmargin, % brr not the same as inleft|rightmargin - \v!leftedge=>\let\next\inleftedge, - \v!rightedge=>\let\next\inrightedge, - \v!leftmargin=>\let\next\inleftmargin, - \v!rightmargin=>\let\next\inrightmargin]% - \next{\hbox{\raise\strutht\box\commentbox}}} - -\def\flushcommentanchors % in everypar so indirect - {\ifvoid\commentbox\else \doflushcommentanchors \fi} + {\executeifdefined{\??cc:\c!location:\@@cclocation}\hbox{\box\commentbox}} \def\setupcomment {\dodoubleargument\getparameters[\??cc]} -\setvalue{\e!start\v!comment}% the dummy triple gobbles trailing spaces - {\dotripleempty\dostartcommentaar} +\def\placecomments {\box\commentcollection} % when option=buffer +\def\flushcommentanchors{\ifvoid\commentbox\else\doflushcommentanchors\fi} % in everypar so indirect + +\def\doinsertcomment#1% + {\begingroup + \ctxlua{backends.codeinjections.presetsymbollist("\@@ccsymbol")}% + % in between predefined symbols are dealt with + \ctxlua{backends.codeinjections.registercomment { + title = "\@@cctitle", + width = \number\dimexpr\@@ccwidth \relax, + height = \number\dimexpr\@@ccheight\relax, + colormodel = \number\currentcolormodel, + colorvalue = \thecolorattribute{\@@cccolor}, + open = \@@ccopen, + symbol = "\@@ccsymbol", + buffer = "#1", + layer = "\@@cctextlayer" + }}% + \box\commentboxone + \doif\@@ccoption\v!buffer + {\setbox\scratchbox\vbox to \@@ccheight{\forgetall\vss\box\commentboxtwo}% + \wd\scratchbox\@@ccwidth + \global\setbox\commentcollection\vbox + {\startoverlay{\box\commentcollection}{\box\scratchbox}\stopoverlay}}% + \endgroup} + +\setvalue{\e!start\v!comment}{\dotripleempty\dostartcomment}% the dummy triple gobbles trailing spaces + +\def\dostartcomment[#1][#2][#3]% + {\bgroup + \doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}% + \doifelse\@@ccoption\v!max{\let\@@ccopen\s!true}{\let\@@ccopen\s!false}% + \setcurrentbuffer{\v!comment\v!buffer}% + \dostartbuffer[\v!comment\v!buffer][\v!comment\v!buffer][\e!start\v!comment][\e!stop\v!comment]} + +\def\stopcomment + {\doif\@@ccstate\v!start + {\global\setbox\commentbox\frozenhbox + {\hbox to \zeropoint{\struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}}\hss}% + \hskip\ifvoid\commentbox\@@ccmargin\else\@@ccdistance\fi + \box\commentbox}}% + \egroup} \def\comment {\dodoubleempty\docomment} -\def\dodocomment#1% - {\!!widtha\@@ccwidth - \!!heighta\@@ccheight - \doifelse\@@ccoption\v!max - {\let\@@ccopen \!!plusone}{\let\@@ccopen \!!zerocount}% - \doifelse\@@ccoption\v!buffer - {\let\@@cccollect\!!plusone}{\let\@@cccollect\!!zerocount}% - \preparecommentvariables - \doinsertcomment - \@@cctitle\!!widtha\!!heighta - \@@cccolor\@@ccopen\@@ccsymbol - \@@cccollect{#1}} - -\def\preparecommentvariables % more will move here as with fields - {\let\@@DriverCommentLayer\@@cctextlayer} - -\def\dopreparecommentaar#1#2% - {\doifassignmentelse{#1} - {\getparameters[\??cc][#1]} - {\getparameters[\??cc][\c!title=#1,#2]}% - \obeylines - \doif\@@ccspace\v!yes\obeyspaces} - -\def\dostartcommentaar[#1][#2][#3]% - {\bgroup - \doifelse\@@ccstate\v!start - {\dopreparecommentaar{#1}{#2}% - \long\def\docommand##1% - {\global\setbox\commentbox\frozenhbox - {\hbox to \zeropoint - {\struttedbox{\tbox{\dodocomment{##1}}}\hss}% - \hskip\ifvoid\commentbox\@@ccmargin\else\@@ccdistance\fi - \box\commentbox}% - \egroup}}% - {\long\def\docommand##1% - {\egroup}}% - \grabuntil{\e!stop\v!comment}\docommand} - -\letvalue{\e!stop\v!comment}\relax % handy for \expanded{...} - \def\docomment[#1][#2]#3% {\doif\@@ccstate\v!start {\hbox to \zeropoint - {\dopreparecommentaar{#1}{#2}% + {\doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}% \hskip-\@@ccmargin - \struttedbox{\tbox{\dodocomment{#3}}\hss}}}% + \ctxlua{buffers.set("\v!comment\v!buffer", \!!bs\detokenize{#3}\!!es)}% + \struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}\hss}}}% \ignorespaces} +% test +% % \startcomment % hello beautiful\\world % \stopcomment % +% test +% % \startcomment[hello] -% hello << \'e\'erste >> +% hello << eerste >> % beautiful % world % \stopcomment % -% \startcomment[hello][color=green,width=4cm,height=3cm] +% test +% +% \startcomment[hello][color=green,width=10cm,height=3cm] % hello \leftguillemot\ \'e\'erste \rightguillemot\ % beautiful % world -% \stopcommentaar +% \stopcomment +% +% test % -% \startcomment[hello][color=green,width=4cm,height=3cm] +% \startcomment[hello][color=red,width=4cm,height=3cm] % hello \leftguillemot\ \'e\'erste \rightguillemot\ test % % beautiful @@ -1705,6 +320,8 @@ % world % \stopcomment % +% test +% % \startcomment[symbol=Balloon] % Do we want this kind of rubish? And, why isn't this and % some more features related to text annotations so poorly @@ -1713,7 +330,9 @@ % the way, it's funny that when in Acrobat we scale up the % text, the symbols scale down. % \stopcomment - +% +% test +% % \definesymbol [comment-normal][{\externalfigure[cow.pdf]}] % \definesymbol [comment-down] [{\externalfigure[cow.pdf]}] % @@ -1735,11 +354,38 @@ % [\c!symbol={comment-normal,comment-down}, % \c!option=\v!buffer] % -% \setupfootertexts[\placecomments] +% \startcomment[hello] +% oeps +% \stopcomment +% +% test +% +% \setupcomment +% [\c!symbol=normal, +% \c!option=max,width=10cm] +% +% \startcomment[hello] +% oeps +% \stopcomment +% +% test + +\setupcomment + [\c!state=\v!start, + \c!margin=2.5em, + \c!distance=1em, + \c!width=.3\textwidth, + \c!height=.2\textheight, + \c!color=\@@iacolor, + \c!title=, + \c!space=\v!no, + \c!symbol=\v!normal, + \c!location=\v!inmargin, + \c!option=, + \c!textlayer=] + +%D Attachments: -\def\placecomments - {\doflushcomments} - % \setupinteraction[state=start] % % \useattachment[test.tex] @@ -1751,67 +397,42 @@ % % \starttext \attachment[whatever] \stoptext -\definesystemvariable{at} - \def\useattachment {\doquadrupleempty\douseattachment} \def\douseattachment[#1][#2][#3][#4]% tag title newname filename {\iffourthargument - \setgvalue{\??at:#1}{{#2}{#3}{#4}}% tooltip kind of case + \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#3", filename="#4" }}% \else\ifthirdargument - \setgvalue{\??at:#1}{{#2}{#2}{#3}}% full path case + \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#3" }}% \else\ifsecondargument - \setgvalue{\??at:#1}{{#2}{#2}{#2}}% obvious case + \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#2" }}% \else - \setgvalue{\??at:#1}{{#1}{#1}{#1}}% worst case + \ctxlua{interactions.registerattachment{ label="#1", title="#1", newname="#1", filename="#1" }}% \fi\fi\fi} -\let\attachmenttitle\empty -\let\attachmentname \empty -\let\attachmentfile \empty - -\def\getattachmentdata[#1]% - {\edef\attachmenttitle{\filterfromvalue{\??at:#1}31}% description - \edef\attachmentname {\filterfromvalue{\??at:#1}32}% new name - \edef\attachmentfile {\filterfromvalue{\??at:#1}33}% original - \expandafter\splitstring\attachmentname\at.\to\!!stringa\and\!!stringb - \ifx\!!stringb\empty % no suffix, so we need to inherit it - \expandafter\splitstring\attachmentfile\at.\to\!!stringc\and\!!stringd - \edef\attachmentname{\attachmentname.\!!stringd}% - \fi} - \def\attachment {\dodoubleempty\doattachment} -\def\doattachment[#1][#2]% currently title equals newname +\def\doattachment[#1][#2]% [tag] [settings] {\iflocation - \ifsecondargument - \doifundefined{\??at:#2} - {\showmessage\m!interactions6{#2}% - \useattachment[#2]}% - \doif\@@atstate\v!start - {\bgroup - \getattachmentdata[#2]% - \doiffileelse\attachmentfile - {\setupattachments[#1]% - \presetattachmentvariables -\struttedbox{\tbox{% - \doattachfile - \attachmenttitle - {1em}\strutheight\strutdepth\@@atcolor\@@atsymbol - \attachmentname - \attachmentfile}% -}}% - {\showmessage\m!interactions5\attachmentfile}% - \egroup}% - \else\iffirstargument - \attachment[][#1]% - \fi\fi + \doif\@@atstate\v!start + {\bgroup + \setupattachments[#2]% + \ctxlua{backends.codeinjections.presetsymbollist("\@@atsymbol")}% + \getvalue{\??at:\@@atalternative}{\ctxlua{backends.codeinjections.attachfile{ + label = "#1", + width = \number\dimexpr\@@atwidth \relax, + height = \number\dimexpr\@@atheight\relax, + depth = \number\dimexpr\@@atdepth \relax, + color = "\@@atcolor", + symbol = "\@@atsymbol", + layer = "\@@attextlayer", + }}}% + \egroup}% \fi} -\def\presetattachmentvariables - {\let\@@DriverAttachmentLayer\@@attextlayer} +\setvalue{\??at:\v!high}#1{\struttedbox{\tbox{#1}}} \def\setupattachments {\dodoubleempty\getparameters[\??at]} @@ -1820,139 +441,141 @@ [\c!state=\v!start, \c!color=\@@iacolor, \c!textlayer=, + \c!width=1em, + \c!height=\strutheight, + \c!depth=\strutdepth, + \c!alternative=\v!high, \c!symbol=] - -% jammer, tussen/midden had erin gemoeten; \c!commando toevoegen -\def\registermenucommand#1% - {{\textonly\noindent#1\space}} % no math switching +%D Defining sound tracks: +%D +%D \starttyping +%D \useexternalsoundtrack[label][file] +%D \stoptyping +%D +%D associated actions: StartSound StopSound PauseSound ResumeSound +%D +%D Todo: like external figures, also search on path, +%D although, they need to be present ar viewing time, so ... + +\def\useexternalsoundtrack + {\dodoubleargument\douseexternalsoundtrack} + +\def\douseexternalsoundtrack[#1][#2]% + {\ctxlua{interactions.registersound{ label="#1", filename="#2" }}} + +\def\checksoundtrack#1% yet untested in mkiv (also move management to lua) + {\iflocation + \ctxlua{codeinjections.insertsound{ + label = "#1", + repeat = "\@@sdoption", % not entirely ok but works + }}% + \fi} + +\def\setupexternalsoundtracks + {\dodoubleargument\getparameters[\??sd]} + +\setupexternalsoundtracks + [\c!option=] + +%D Multi Media: -\def\doregistermenubuttons[#1][#2]% [menu id] [register] +% todo: multiple instances, dus indirect + +\let\currentrendering\empty + +\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}] +\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}] +\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}] +\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}] + +\newcounter\nofexternalrenderings + +\def\useexternalrendering{\doquadrupleempty\douseexternalrendering} +\def\setinternalrendering{\dodoubleempty \dosetinternalrendering} + +\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options + {\ctxlua{interactions.registerrendering { + kind = "external", + label = "#1", + mime = "#2", + filename = "#3", + options = "#4", + }}} + +\def\dosetinternalrendering[#1][#2]% tag options {content} {\bgroup - \ifsecondargument - \setupinteractionmenu - [#1][\c!unknownreference=\v!yes,\c!samepage=\v!yes]% - \def\docommand##1% - {\registermenucommand{\menubutton[#1]{##1}[#2:##1]}}% + \dowithnextbox + {\ctxlua{interactions.registerrendering { + kind = "internal", + label = "#1", + mime = "IRO", + filename = "#1", + options = "#2", + }}% + \let\objectoffset\zeropoint + \setobject{IRO}{#1}\hbox{\box\nextbox}% + \egroup}% + \hbox} + +\def\renderingtype #1{\ctxlua{interactions.renderingvar("#1","kind")}} +\def\renderingoptions#1{\ctxlua{interactions.renderingvar("#1","options")}} + +\def\renderingwidth {8cm} +\def\renderingheight {6cm} + +\def\definerenderingwindow + {\dodoubleempty\dodefinerenderingwindow} + +\def\dodefinerenderingwindow[#1][#2]% + {\presetlocalframed[\??rw#1]% + \getparameters + [\??rw#1]% + [\c!openpageaction=,\c!closepageaction=,% + \c!width=\renderingwidth,\c!height=\renderingheight,% + #2]} + +\def\setuprenderingwindow + {\dodoubleargument\dosetuprenderingwindow} + +\def\dosetuprenderingwindow[#1]% + {\getparameters[\??rw#1]} + +\def\placerenderingwindow + {\dodoubleempty\doplacerenderingwindow} + +\def\doplacerenderingwindow[#1][#2]% + {\bgroup + \edef\currentrendering{\ifsecondargument#2\else#1\fi}% + \doifelse{\renderingtype\currentrendering}{internal} % an object + {\getobjectdimensions{IRO}\currentrendering + \edef\renderingheight{\the\dimexpr\objectheight+\objectdepth\relax}% + \edef\renderingwidth{\objectwidth}% + \dogetobjectreferencepage{IRO}\currentrendering\renderingpage}% + {\def\renderingheight{\vsize}% + \def\renderingwidth{\hsize}% + \def\renderingpage{\realpageno}}% + % create fall back if needed + \ifcsname\??rw#1\c!width\endcsname + \def\currentrenderingwindow{#1}% \else - \def\docommand##1% - {\registermenucommand - {\button - [\c!unknownreference=\v!yes,\c!samepage=\v!yes] - {##1}[#1:##1]}}% + \let\currentrenderingwindow\s!default + \definerenderingwindow[\currentrenderingwindow]% \fi - \handletokens abcdefghijklmnopqrstuvwxyz\with\docommand % moet anders +% todo +% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction +% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction + \localframed + [\??rw\currentrenderingwindow][\c!offset=\v!overlay]% + {\ctxlua{backends.codeinjections.insertrenderingwindow { + label = "\currentrendering", + width = \number\dimexpr\renderingwidth\relax, + height = \number\dimexpr\renderingheight\relax, + options = "\renderingoptions\currentrendering", + page = \number\renderingpage, + }}}% \egroup} - -\def\registermenubuttons - {\dodoubleempty\doregistermenubuttons} -\stelkoppelingenin - [\c!distance=.25em, - \c!width=\v!fit, - \c!location=\v!low, - \c!color=\@@iacolor, - \c!frame=\v!off, - \c!background=, - \c!backgroundscreen=\@@rsscreen, - \c!backgroundcolor=] - -\defineinteractionmenu - [\v!right] - [\v!right] - [\c!before=, - \c!after=\vfil, - \c!inbetween=\blank, - \c!distance=\bodyfontsize, % 12pt - \c!left=\hss, - \c!right=\hss, - \c!width=\rightedgewidth, - \c!height=\v!broad] - -\defineinteractionmenu - [\v!left] - [\v!left] - [\c!before=, - \c!after=\vfil, - \c!inbetween=\blank, - \c!distance=\bodyfontsize, % 12pt - \c!left=\hss, - \c!right=\hss, - \c!width=\leftedgewidth, - \c!height=\v!broad] - -\defineinteractionmenu - [\v!bottom] - [\v!bottom] - [\c!before=\vss, - \c!after=\vss, - \c!middle=\hfil, - \c!distance=\bodyfontsize, % 12pt - \c!width=\v!fit, - \c!height=\v!broad] - -\defineinteractionmenu - [\v!top] - [\v!top] - [\c!before=\vss, - \c!after=\vss, - \c!middle=\hfil, - \c!distance=\bodyfontsize, % 12pt - \c!width=\v!fit, - \c!height=\v!broad] - -\setupinteractionmenu - [\v!left,\v!right,\v!top,\v!bottom] - [\c!offset=.25em, - \c!position=\v!no, - \c!frame=\v!on, - \c!background=, - \c!backgroundcolor=, - \c!backgroundscreen=\@@rsscreen, - \c!style=\@@iastyle, - \c!color=\@@iacolor, - \c!contrastcolor=\@@iacontrastcolor, - \c!state=\v!start, - \c!samepage=\v!yes, - \c!unknownreference=\v!empty, - \c!topoffset=\!!zeropoint, - \c!bottomoffset=\!!zeropoint, - \c!leftoffset=\!!zeropoint, - \c!rightoffset=\!!zeropoint] - -\def\placeleftedgetextblock % Is \hss/\hsize really needed here? - {\hbox to \leftedgewidth % (check outer level and settings) - {\hsize\leftedgewidth\hss\interactionmenus[\v!left]}} - -\def\placerightedgetextblock % Is \hss/\hsize really needed here? - {\hbox to \rightedgewidth % (check outer level and settings) - {\hsize\rightedgewidth\interactionmenus[\v!right]\hss}} - -\def\placetoptextblock - {\vbox to \topheight - {\vsize\topheight - \csname\??tk\v!top\c!before\endcsname - \interactionmenus[\v!top]% - \csname\??tk\v!top\c!after\endcsname - \kern\zeropoint}} - -\def\placebottomtextblock - {\vbox to \bottomheight - {\vsize\bottomheight - \csname\??tk\v!bottom\c!before\endcsname - \interactionmenus[\v!bottom]% - \csname\??tk\v!bottom\c!after\endcsname - \kern\zeropoint}} - -\ifx\leftedgetextcontent\undefined \else - - \appendtoks \placeleftedgetextblock \hskip-\leftedgewidth \to \leftedgetextcontent - \appendtoks \placerightedgetextblock \hskip-\rightedgewidth \to \rightedgetextcontent - \appendtoks \placetoptextblock \vskip-\topheight \to \toptextcontent - \appendtoks \placebottomtextblock \vskip-\bottomheight \to \bottomtextcontent - -\fi - \setupinteractionscreen [\c!width=\printpaperwidth, \c!height=\printpaperheight, @@ -1963,74 +586,4 @@ \c!option=\v!min, \c!delay=\v!none] -\setupbuttons - [\c!state=\v!start, - \c!width=\v!fit, - \c!height=\v!broad, - \c!offset=0.25em, - \c!frame=\v!on, - \c!background=, - \c!backgroundscreen=\@@rsscreen, - \c!backgroundcolor=, - \c!style=\@@iastyle, - \c!color=\@@iacolor, - \c!contrastcolor=\@@iacontrastcolor, - \c!samepage=\v!yes, - \c!unknownreference=\v!yes] - -\setupinteractionbar - [\c!state=\v!start, - \c!alternative=a, - \c!symbol=\v!no, - \c!width=\rightedgewidth, - \c!height=, % these are taken care - \c!depth=, % of at calling time - \c!distance=.5em, % beter relateren aan breedte - \c!step=1, - \c!color=\@@iacolor, - \c!contrastcolor=\@@iacontrastcolor, - \c!frame=\v!on, - \c!background=, - \c!backgroundscreen=\@@rsscreen, - \c!backgroundcolor=, - \c!samepage=\v!yes, - \c!unknownreference=\v!yes] - -\setupsynchronizationbar - [\c!alternative=\v!page, - \c!width=\rightedgewidth, - \c!style=\@@iastyle, - \c!color=\@@iacolor, - \c!background=, - \c!backgroundscreen=\@@rsscreen, - \c!backgroundcolor=] - -\setupsynchronization - [\c!state=\v!stop] - -\setupprofiles - [\c!option=] - -\setuppagetransitions - [\v!reset] - -\setupcomment - [\c!state=\v!start, - \c!margin=2.5em, - \c!distance=1em, - \c!width=.3\textwidth, - \c!height=.2\textheight, - \c!color=\@@iacolor, - \c!title=, - \c!space=\v!no, - \c!symbol=\v!normal, - \c!location=\v!inmargin, - \c!option=, - \c!textlayer=] - -\setupversions % beware, @ is made active here, - [\c!number=1, % therefore we set this one at the end - \c!style=\ss, - \c!color=] - \protect \endinput diff --git a/tex/context/base/scrn-men.mkiv b/tex/context/base/scrn-men.mkiv new file mode 100644 index 000000000..ae95a5c04 --- /dev/null +++ b/tex/context/base/scrn-men.mkiv @@ -0,0 +1,616 @@ +%D \module +%D [ file=scrn-bar, % was part of scrn-int +%D version=1995.01.01, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Menus, +%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 Screen Macros / Menus} + +\unprotect + +% \startinteractionmenu[rechts] +% \but [eerste] eerste \\ +% \txt hello world \\ +% \but [tweede] tweede \\ +% \nop \\ +% \but [tweede] tweede \\ +% \rul whow \\ +% \but [tweede] tweede \\ +% \raw hello world \\ +% \but [tweede] tweede \\ +% \com \vfill \\ +% \but [derde] derde \\ +% \stopinteractionmenu + +% \setupinteraction[menu=on,state=start] +% +% \defineinteractionmenuclass[test] [vertical] +% \defineinteractionmenuclass[another][horizontal] +% +% \defineinteractionmenu[test] [left][state=start,width=4cm] +% \defineinteractionmenu[another][top] [state=start,height=1cm] +% +% \startinteractionmenu[test] +% \but [firstpage] test-a \\ +% \but [nextpage] test-b \\ +% \stopinteractionmenu +% +% \startinteractionmenu[another] +% \but [firstpage] test-a \\ +% \but [nextpage] test-b \\ +% \stopinteractionmenu +% +% \setupheadertexts[{\interactionmenu[another]}] +% +% \starttext +% +% test \interactionmenu[test] \page +% test \interactionmenu[test] \page +% +% \stoptext + +% ja : kader/achtergrond met tekst +% leeg : kader/achtergrond maar geen tekst +% nee : alleen ruimte reserveren +% geen : helemaal weglaten +% +% \setupinteractionmenu[right][samepage=yes, unknownreference=yes] +% \setupinteractionmenu[right][samepage=empty,unknownreference=empty] +% \setupinteractionmenu[right][samepage=no, unknownreference=no] +% \setupinteractionmenu[right][samepage=none, unknownreference=none] +% +% \startinteractionmenu[right] +% \but [firstpage] first \\ +% \but [lastpage] last \\ +% \but [somepage] crap \\ +% \stopinteractionmenu + +%D Define menus: + +\def\setmenuparameter#1#2#3{\@EA\def\csname\??am#1#2\endcsname{#3}} +\def\letmenuparameter #1#2{\@EA\let\csname\??am#1#2\endcsname} + +\def\menuparameter #1{\csname\domenuparameter{\??am\currentmenu}#1\endcsname} +\def\namedmenuparameter#1#2{\csname\domenuparameter{\??am #1}#2\endcsname} +\def\menuparameterhash #1{\domenuparameterhash {\??am\currentmenu}#1} + +\def\domenuparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\domenuparentparameter \csname#1\s!parent\endcsname#2\fi} +\def\domenuparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\domenuparentparameterhash\csname#1\s!parent\endcsname#2\fi} + +\def\domenuparentparameter #1#2{\ifx#1\relax\s!empty\else\domenuparameter #1#2\fi} +\def\domenuparentparameterhash#1#2{\ifx#1\relax \else\domenuparameterhash#1#2\fi} + +\def\defineinteractionmenu + {\dotripleempty\dodefineinteractionmenu} + +\def\dodefineinteractionmenu[#1][#2][#3]% [name] [location] [settings] + {\ifsecondargument + \ifcsname\??am:\c!list:#2\endcsname \else + \letvalue{\??am:\c!list:#2}\empty + \fi + \normalexpanded{\noexpand\addtocommalist{#1}\@EA\noexpand\csname\??am:\c!list:#2\endcsname}% + \setvalue{\@@dodolistelement#1}{\def\dosomelistelement{\dodomenulistelement{#1}}}% + \ifthirdargument + \presetlocalframed[\??am#1]% + \doifassignmentelse{#3} + {\doifelse{#1}{#2} + {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am,#3]} + {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#2,#3]}}% + {\doifelsenothing{#3} + {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am]} + {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#3]}}% + \else + \getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#2]% + \fi + \else + \getparameters[\??am#1][\s!parent=\??am]% simple cloning + \fi} + +\def\currentmenulist{\ifcsname\??am:\c!list:\currentmenu\endcsname\csname\??am:\c!list:\currentmenu\endcsname\fi} + +%D Setup menus: + +\def\setupinteractionmenu + {\dodoubleargument\dosetupinteractionmenu} + +\def\dosetupinteractionmenu[#1][#2]% + {\def\docommand##1{\getparameters[\??am##1][#2]}% + \processcommalist[#1]\docommand} + +\def\setupinteractionmenus[#1]% + {\getparameters[\??am][#1]} + +%D Fill menus: + +\normalexpanded{\long\def\expandafter\noexpand\csname\e!start\v!interactionmenu\endcsname[#1]#2\expandafter\noexpand\csname\e!stop\v!interactionmenu\endcsname}% + {\long\setmenuparameter{#1}\c!menu{\dointeractionmenu{#1}{#2}}} + +\def\resetinteractionmenu[#1]% + {\letmenuparameter{#1}\c!menu\empty} + +%D Check if menus permitted: + +\newif\iflocationmenupermitted + +\def\testinteractionmenu + {\iflocation + \doifelse\@@iamenu\v!on + {\doifelse{\menuparameter\c!state}\v!start + {\global\locationmenupermittedtrue} + {\global\locationmenupermittedfalse}} + {\global\locationmenupermittedfalse}% + \else + \global\locationmenupermittedfalse + \fi} + +%D Placement of menus: + +\def\interactionmenus[#1]% location + {\iflocation + \csname\??am:\c!menu:#1\endcsname + \fi} + +% \def\defineinteractionmenuclass +% {\dodoubleargument\dodefineinteractionmenuclass} +% +% \def\dodefineinteractionmenuclass[#1][#2]% tag hori|veri +% {\doifelse{#2}\v!vertical +% {\setvalue{\??am:\c!menu:#1}{\verticalinteractionmenu {#1}{\getvalue{\??am#1\c!width }}}} +% {\setvalue{\??am:\c!menu:#1}{\horizontalinteractionmenu{#1}{\getvalue{\??am#1\c!height}}}}} +% +% \defineinteractionmenuclass[\v!left ][\v!horizontal] +% \defineinteractionmenuclass[\v!right ][\v!horizontal] +% \defineinteractionmenuclass[\v!top ][\v!vertical] +% \defineinteractionmenuclass[\v!bottom][\v!vertical] + +\setvalue{\??am:\c!menu :\v!left }{\horizontalinteractionmenu\v!left \leftedgewidth } +\setvalue{\??am:\c!menu :\v!right }{\horizontalinteractionmenu\v!right \rightedgewidth} +\setvalue{\??am:\c!menu :\v!top }{\verticalinteractionmenu \v!top \topheight } +\setvalue{\??am:\c!menu :\v!bottom}{\verticalinteractionmenu \v!bottom\bottomheight } + +\setvalue{\??am:\c!command:\v!right }{\@@amvbox{}\rightedgewidth} +\setvalue{\??am:\c!command:\v!left }{\@@amvbox{}\leftedgewidth } +\setvalue{\??am:\c!command:\v!top }{\@@amhbox{}\topheight } +\setvalue{\??am:\c!command:\v!bottom}{\@@amhbox{}\bottomheight } + +\def\dointeractionmenu#1#2% + {\edef\currentmenu{#1}% + \getvalue{\??am:\c!command:\menuparameter\c!location}\currentmenu{#2}} + +\unexpanded\def\interactionmenu[#1]% + {\def\currentmenu{#1}% + \menuparameter\c!menu} + +\newdimen \intermenudistance +\newdimen \finalmenuwidth +\newdimen \finalmenuheight + +\newcounter\currentamposition % better \currentmenuposition +\newtoks \everysetmenucommands + +\def\horizontalinteractionmenu#1#2% location vhsize before/after + {\ifdim#2>\zeropoint + \edef\currentmenu{#1}% + \finalmenuwidth#2\relax + \horizontalinteractionmenuindeed + \fi} + +\def\verticalinteractionmenu#1#2% + {\ifdim#2>\zeropoint + \edef\currentmenu{#1}% + \finalmenuheight#2\relax + \verticalinteractionmenuindeed + \fi} + +\def\horizontalinteractionmenuindeed + {\global\intermenudistance\zeropoint + \setbox\scratchbox\hbox + {\processcommacommand[\currentmenulist]\somehorizontalinteractionmenu}% + \wd\scratchbox\finalmenuwidth\relax + \box\scratchbox} + +\def\verticalinteractionmenuindeed + {\global\intermenudistance\zeropoint + \setbox\scratchbox\vbox + {\processcommacommand[\currentmenulist]\someverticalinteractionmenu}% + \ht\scratchbox\finalmenuheight + \dp\scratchbox\zeropoint + \box\scratchbox} + +\def\somehorizontalinteractionmenu#1% + {\begingroup + \edef\currentmenu{#1}% + \doifnot{\menuparameter\c!state}\v!none + {\hskip\intermenudistance + \setbox\scratchbox\hbox to \finalmenuwidth + {\menuparameter\c!left + \interactionmenu[#1]% + \menuparameter\c!right}% + \doifelse{\menuparameter\c!distance}\v!overlay + {\global\intermenudistance\zeropoint + \wd\scratchbox\zeropoint}% + {\global\intermenudistance\menuparameter\c!distance}% + \box\scratchbox}% + \endgroup} + +\def\someverticalinteractionmenu#1% + {\begingroup + \edef\currentmenu{#1}% + \doifnot{\menuparameter\c!state}\v!none + {\vskip\intermenudistance + \setbox\scratchbox\vbox to \finalmenuheight + {\menuparameter\c!before + \interactionmenu[#1]% + \menuparameter\c!after}% + \doifelse{\menuparameter\c!distance}\v!overlay + {\global\intermenudistance\zeropoint + \offinterlineskip + \dp\scratchbox\zeropoint + \ht\scratchbox\zeropoint}% + {\global\intermenudistance\menuparameter\c!distance}% + \box\scratchbox}% + \endgroup} + +% don't change skipping, this one works! \showcomposition removed + +\def\@@amhbox#1#2#3#4% #1 obsolete, #3 is redundant + {\edef\currentmenu{#3}% + \testinteractionmenu + \iflocationmenupermitted + \begingroup + \forgetall + \scratchdimen\dimexpr\makeupwidth+\pagebackgroundhoffset*2-\menuparameter\c!leftoffset-\menuparameter\c!rightoffset\relax + \setbox\scratchbox\hbox to \scratchdimen + {\executeamboxcommands{#3}{#4}\c!left\c!middle\c!right}% + \setbox\scratchbox\hbox{\dowholemenuposition{#3}{\box\scratchbox}}% cannot happen in previous due to align + \wd\scratchbox\makeupwidth % geen \ht=#2 setting (yet) + \hskip\dimexpr-\pagebackgroundhoffset+\menuparameter\c!leftoffset\relax + \box\scratchbox + \endgroup + \fi} + +\def\@@amvbox#1#2#3#4% #1 obsolete, #3 is redundant + {\edef\currentmenu{#3}% + \testinteractionmenu + \iflocationmenupermitted + \bgroup + \forgetall + \scratchdimen\dimexpr\textheight+\pagebackgroundvoffset*2+\pagebackgrounddepth-\menuparameter\c!topoffset-\menuparameter\c!bottomoffset\relax + \setbox\scratchbox\vbox to \scratchdimen + {\restorestandardblank % todo: vspacing + \hsize#2\relax + \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after}% + % strange: when we mnake this a hbox the content disappears + \setbox\scratchbox\vbox{\dowholemenuposition{#3}{\box\scratchbox}}% cannot happen in previous due to align + \setbox\scratchbox\vbox + {\ht\scratchbox\zeropoint + \vskip\dimexpr-\pagebackgroundvoffset+\menuparameter\c!topoffset\relax + \box\scratchbox + \vskip\pagebackgroundvoffset}% overbodig + \ht\scratchbox\textheight + \wd\scratchbox#2\relax + \box\scratchbox + \egroup + \fi} + +\def\executeamboxcommands#1#2#3#4#5% + {\begingroup + \edef\currentmenu{#1}% + \menuparameter#3\relax + \setamboxcommands{#1}{#4}% + \ignorespaces#2\unskip + \menuparameter#5\relax + \endgroup} + +\def\setamboxcommands#1#2% + {\edef\currentmenu{#1}% + \edef\betweenmenu{#2}% + \doglobal\newcounter\currentamposition + \the\everysetmenucommands} + +\def\addsomemenuitem#1% + {\dontleavehmode + \begingroup + \ignorespaces#1\unskip\relax + \ifconditional\skippedmenuitem \else + \menuparameter\betweenmenu + \fi + \endgroup + \ignorespaces} + +%D This can save complicated menu macros when one want to +%D keep control over parts of a menu (i.e.\ turn them on and +%D off). We could have achieved something similar with modes. + +\def\local@@ambox#1#2#3#4% don't change skipping, this one works! + {\begingroup + \edef\currentmenu{#3}% + \iflocationmenupermitted + \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after + \fi + \endgroup} + +\def\includemenu[#1]% + {\begingroup + \edef\currentmenu{#1}% + \doif{\menuparameter\c!state}\v!local + {\letmenuparameter\currentmenu\c!state\v!start + \let\@@amvbox\local@@ambox + \let\@@amhbox\local@@ambox + \menuparameter\c!menu}% + \endgroup} + +%D The menu commands: + +% ja : kader/achtergrond met tekst +% leeg : kader/achtergrond maar geen tekst +% nee : alleen ruimte reserveren +% geen : helemaal weglaten + +\newconditional\skippedmenuitem +\newconditional\usemenuclick + +\def\dosetlocationboxcontent#1[#2]#3[#4]% to be checked + {\global\setfalse\skippedmenuitem + \setbox\locationbox\hbox{\localframed[#1][#2]{#3}}% + \ifconditional\usemenuclick + \gotobox{\box\locationbox}[#4]% + \else + \box\locationbox + \fi} + +\def\dosetlocationboxempty#1[% + {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,} + +\def\dosetlocationboxno#1[% + {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,\c!frame=,\c!background=,} + +\def\dosetlocationboxnone#1[#2]#3[#4]% + {\global\settrue\skippedmenuitem} + +% make two sub macros + +% \dosetfontattribute {#1}{#2}% +% \dosetcolorattribute{#1}{#3}% + +\def\setlocationboxyes#1[#2]#3[#4]% needs to be split as the attr is not applicable to the box + {\begingroup + \settrue\usemenuclick + \global\setfalse\skippedmenuitem + \attribute\referenceattribute\attributeunsetvalue + \doifreferencefoundelse{#4} + {\analyzecurrentreference % we need to act on the state + \ifcase\referencepagestate + % something else than a page reference + \ctxlua{jobreferences.injectcurrentset(nil,nil)}% + \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2]{#3}}% + \else\ifcase\csname\??am:\c!location:\menuparameter\c!samepage\endcsname\relax + % yes: same page or not ... todo + \ctxlua{jobreferences.injectcurrentset(nil,nil)}% + \ifnum\referencepagestate=\plusone % same page + \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2,\c!color=\menuparameter\c!contrastcolor]{#3}}% + \else % elsewhere + \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2]{#3}}% + \fi + \or + % empty but frame: no click + \localframed[#1][\c!empty=\v!yes,#2]{#3}% + \or + % empty no frame: no + \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{#3}% + \or + % nothing at all + \global\settrue\skippedmenuitem + \fi\fi}% + {\unknownreference{#4}% + \ifcase\csname\??am:\c!location:\menuparameter\c!unknownreference\endcsname\relax + \localframed[#1][#2]{#3}% + \or + \localframed[#1][\c!empty=\v!yes,#2]{#3}% + \or + \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{#1}% + \or + \global\skippedmenuitemtrue + \fi}% + \endgroup} + +\def\setlocationboxraw#1[#2]#3[#4]% + {\localframed[#1][#2]{#3}} + +\def\setlocationnop#1[#2]#3% + {\localframed[#1][#2]{#3}} + +\def\menu@raw[#1]#2\\% + {\addsomemenuitem{\gotobox{\ignorespaces#2\unskip}[#1]}} + +\def\menu@but[#1]#2\\% + {\addsomemenuitem{\domenuitemposition\currentmenu{#1}{\setlocationboxyes{\??am\currentmenu}[]{\ignorespaces#2\unskip}[#1]}}} + +\def\menu@got[#1]#2\\% + {\addsomemenuitem{\setlocationboxyes{\??am\currentmenu}[\c!frame=\v!off,\c!background=]{\ignorespaces#2\unskip}[#1]}} + +\def\menu@nop#1\\% + {\addsomemenuitem{\setlocationboxraw{\??am\currentmenu}[\c!frame=\v!off,\c!background=,\c!empty=\v!yes]{\ignorespaces#1\unskip}[]}} + +\def\menu@txt#1\\% + {\addsomemenuitem{\localframed[\??am\currentmenu][\c!frame=\v!off,\c!background=]{\ignorespaces#1\unskip}}} + +\def\menu@rul#1\\% + {\addsomemenuitem{\localframed[\??am\currentmenu][]{\ignorespaces#1\unskip}}} + +\def\menu@com#1\\% + {\ignorespaces#1\unskip\ignorespaces} + +\appendtoks + \let\raw\menu@raw \let\but\menu@but \let\got\menu@got \let\nop\menu@nop + \let\txt\menu@txt \let\rul\menu@rul \let\com\menu@com +\to \everysetmenucommands + +\ifdefined\domenuitemposition \else \let\domenuitemposition \gobbletwoarguments \fi +\ifdefined\dowholemenuposition \else \let\dowholemenuposition\gobbleoneargument \fi + +%D We also need an explicit position control some day. I'll +%D do that when I need it. [The stacking order.] + +% [name] [location] +% [name] [location] [pars] + +\expandafter\chardef\csname\??am:\c!location:\v!yes \endcsname\zerocount +\expandafter\chardef\csname\??am:\c!location:\v!empty \endcsname\plusone +\expandafter\chardef\csname\??am:\c!location:\v!no \endcsname\plustwo +\expandafter\chardef\csname\??am:\c!location:\v!none \endcsname\plusthree + +\expandafter\chardef\csname\??am:\c!location:\v!normal \endcsname\plusone % default +\expandafter\chardef\csname\??am:\c!location:\s!default\endcsname\plusone % default +\expandafter\chardef\csname\??am:\c!location:\s!empty \endcsname\plusone % default + +\def\dodomenulistelement#1#2#3#4#5#6#7% + {\addsomemenuitem{\domenuitemposition\currentmenu{internal(#3)}% + {\setlocationboxyes{\??am\currentmenu}[]{\limitatetext{#5}{\namedlistparameter{#2}\c!maxwidth}{\unknown}}[internal(#3)]}}} + +\unexpanded\def\menubutton + {\dodoubleempty\domenubutton} + +\def\domenubutton[#1]% + {\iffirstargument + \ifsecondargument + \@EAEAEA\domenubuttonB + \else + \doifassignmentelse{#1} + {\@EAEAEA\domenubuttonC} + {\@EAEAEA\domenubuttonD}% + \fi + \else + \@EA\domenubuttonA + \fi[#1]} + +\def\domenubuttonA[#1][#2]#3[#4]{\setlocationboxyes\??bt[]{#3}[#4]} % normal button, no parameters +\def\domenubuttonB[#1][#2]#3[#4]{\setlocationboxyes{\??am#1}[#2]{#3}[#4]} % menu button, with parameters +\def\domenubuttonC[#1][#2]#3[#4]{\setlocationboxyes\??bt[#1]{#3}[#4]} % normal button, with parameters +\def\domenubuttonD[#1][#2]#3[#4]{\setlocationboxyes{\??am#1}[]{#3}[#4]} % menu button, no parameters + +\def\menubox + {\dodoubleempty\domenubox} + +\def\domenubox[#1][#2]#3% + {\bgroup + \let\setlocationboxyes\setlocationboxraw + \domenubutton[#1][#2]#3[]% + \egroup} + +% jammer, tussen/midden had erin gemoeten; \c!commando toevoegen + +\def\registermenucommand#1% + {{\textonly\noindent#1\space}} % no math switching + +\def\doregistermenubuttons[#1][#2]% [menu id] [register] + {\bgroup + \ifsecondargument + \setupinteractionmenu[#1][\c!unknownreference=\v!yes,\c!samepage=\v!yes]% + \def\docommand##1{\registermenucommand{\menubutton[#1]{##1}[#2:##1]}}% + \else + \def\docommand##1{\registermenucommand{\button[\c!unknownreference=\v!yes,\c!samepage=\v!yes]{##1}[#1:##1]}}% + \fi + \handletokens abcdefghijklmnopqrstuvwxyz\with\docommand % moet anders + \egroup} + +\def\registermenubuttons + {\dodoubleempty\doregistermenubuttons} + +\defineinteractionmenu [\v!vertical] % we happen to know that this works out ok (just a setup set) +\defineinteractionmenu [\v!horizontal] % we happen to know that this works out ok (just a setup set) + +\defineinteractionmenu [\v!right ] [\v!right ] [\v!vertical ] % we share a setup set +\defineinteractionmenu [\v!left ] [\v!left ] [\v!vertical ] % we share a setup set +\defineinteractionmenu [\v!top ] [\v!top ] [\v!horizontal] % we share a setup set +\defineinteractionmenu [\v!bottom] [\v!bottom] [\v!horizontal] % we share a setup set + +\setupinteractionmenus + [\c!offset=.25em, + \c!position=\v!no, + \c!frame=\v!on, + \c!background=, + \c!backgroundcolor=, + \c!foregroundstyle=\menuparameter\c!style, + \c!foregroundcolor=\menuparameter\c!color, + \c!style=\@@iastyle, + \c!color=\@@iacolor, + \c!contrastcolor=\@@iacontrastcolor, + \c!state=\v!start, + \c!samepage=\v!yes, + \c!unknownreference=\v!empty, + \c!topoffset=\zeropoint, + \c!bottomoffset=\zeropoint, + \c!leftoffset=\zeropoint, + \c!rightoffset=\zeropoint] + +\setupinteractionmenu + [\v!vertical] % not really a menu + [\c!before=, + \c!after=\vfil, + \c!inbetween=\blank, + \c!distance=\bodyfontsize, % 12pt + \c!left=\hss, + \c!right=\hss, + \c!height=\v!broad] + +\setupinteractionmenu + [\v!horizontal] % not really a menu + [\c!before=\vss, + \c!after=\vss, + \c!middle=\hfil, + \c!distance=\bodyfontsize, % 12pt + \c!width=\v!fit, + \c!height=\v!broad] + +\setupinteractionmenu[\v!left ][\c!width=\leftedgewidth ] +\setupinteractionmenu[\v!right ][\c!width=\rightedgewidth] +% \setupinteractionmenu[\v!top ] [\c!height=\topheight ] +% \setupinteractionmenu[\v!bottom] [\c!height=\bottomheight ] + +\def\placeleftedgetextblock % Is \hss/\hsize really needed here? (check outer level and settings) + {\hbox to \leftedgewidth{\hsize\leftedgewidth\hss\interactionmenus[\v!left]}} + +\def\placerightedgetextblock % Is \hss/\hsize really needed here? (check outer level and settings) + {\hbox to \rightedgewidth{\hsize\rightedgewidth\interactionmenus[\v!right]\hss}} + +\def\placetoptextblock + {\vbox to \topheight + {\vsize\topheight + \csname\??tk\v!top\c!before\endcsname + \interactionmenus[\v!top]% + \csname\??tk\v!top\c!after\endcsname + \kern\zeropoint}} + +\def\placebottomtextblock + {\vbox to \bottomheight + {\vsize\bottomheight + \csname\??tk\v!bottom\c!before\endcsname + \interactionmenus[\v!bottom]% + \csname\??tk\v!bottom\c!after\endcsname + \kern\zeropoint}} + +\ifdefined\leftedgetextcontent + + \appendtoks \iflocation\placeleftedgetextblock \hskip-\leftedgewidth \fi\to \leftedgetextcontent + \appendtoks \iflocation\placerightedgetextblock \hskip-\rightedgewidth \fi\to \rightedgetextcontent + \appendtoks \iflocation\placetoptextblock \vskip-\topheight \fi\to \toptextcontent + \appendtoks \iflocation\placebottomtextblock \vskip-\bottomheight \fi\to \bottomtextcontent + +\fi + +%D Enable and disable menus \unknown\ obsolete: + +\def\gobbletwoparameters[#1][#2]{} + +\def\disableinteractionmenu{\dodoubleempty\gobbletwoparameters} +\def\enableinteractionmenu {\dodoubleempty\gobbletwoparameters} + +\protect \endinput diff --git a/tex/context/base/scrn-nav.mkiv b/tex/context/base/scrn-nav.mkiv index 441951eff..6b21a9e95 100644 --- a/tex/context/base/scrn-nav.mkiv +++ b/tex/context/base/scrn-nav.mkiv @@ -20,17 +20,9 @@ %D this module, where we deal with some common navigational %D features, there will be quite some forward references. %D -%D When I started implementing hypertext support, the macros -%D were mostly dealing with things related to locations, that -%D is click in this location and goto that one. The -%D functionality of many macro depends on the output medium: -%D paper or screen. The next boolean holds the state: - -\newif\iflocation \def\ifinteractief{\iflocation} % upw comp - -%D We also allocate a scratchbox: - -\newbox\locationbox +%D The current support in \MKIV\ is mostly the same as in +%D \MKII\ and the old files have some more detailed +%D (sometimes historic) information. %D There is no interaction at all unless enabled by saying: %D @@ -41,19 +33,14 @@ %D The other settings are: %D %D \showsetup{setupinteraction} -%D -%D In the special driver modules we introduced a switch that -%D forces page destinations (instead of named ones). We set -%D this switch here. -\def\setinteractionparameter#1#2% use with case, no checking done - {\setvalue{\??ia#1}{#2}} % pass #2, can be \blabla +% use with care, no checking done -\def\resetinteractionparameter#1% use with case, no checking done - {\letvalue{\??ia#1}\empty} +\def\setinteractionparameter#1#2% + {\expandafter\def\csname\??ia#1\endcsname{#2}} -% \def\interactionparameter#1% -% {\csname\??ia#1\endcsname} +\def\resetinteractionparameter#1% + {\expandafter\let\csname\??ia#1\endcsname\empty} \newtoks\everysetupinteraction @@ -71,7 +58,7 @@ {\iflocation\else \showmessage\m!interactions2{\ifusepagedestinations\space(PAGE)\fi}% \global\locationtrue - \fi} + \fi}% {\iflocation \showmessage\m!interactions3{\ifusepagedestinations\space(PAGE)\fi}% \global\locationfalse @@ -81,199 +68,66 @@ \else \resetsystemmode\v!interaction \fi - \dosetuppageview\@@iafocus \doifsomething\@@iacalculate {\doregistercalculationset\@@iacalculate}% - \doifelse\@@iastrut\v!yes - \locationstruttrue - \locationstrutfalse - \doifelse\@@iaclick\v!yes - \highlighthyperlinkstrue - \highlighthyperlinksfalse - \doifelse\@@iasplit\v!yes - \locationsplittrue - \locationsplitfalse - \doifelse\@@iadisplay\v!new - \gotonewwindowtrue - \gotonewwindowfalse - \doifelse\@@iapage\v!yes - {\global\usepagedestinationstrue} - {\global\usepagedestinationsfalse}% + \doifelse\@@iastrut \v!yes \settrue \setfalse \uselocationstrut + \doifelse\@@iaclick \v!yes \settrue \setfalse \highlighthyperlinks + \doifelse\@@iadisplay\v!new \settrue \setfalse \gotonewwindow + \doifelse\@@iapage \v!yes \settrue \setfalse \usepagedestinations \to \everysetupinteraction +\def\synchronizebackendidentity + {\ctxlua{backends.codeinjections.setupidentity{ + title = \!!bs\@@iatitle\!!es, + subtitle = \!!bs\@@iasubtitle\!!es, + author = \!!bs\@@iaauthor\!!es, + creator = \!!bs ConTeXt - \contextversion\!!es, + date = \!!bs\@@iadate\!!es, + keywords = \!!bs\@@iakeyword\!!es, + }}} + +\appendtoks + \synchronizebackendidentity +\to \everyfirstshipout + %D We have to make sure of some settings: \def\dolocationstartup {\iflocation - \dosetupinteraction - \handlereferenceactions\@@iaopenaction \dosetupopenaction - \handlereferenceactions\@@iacloseaction\dosetupcloseaction - \setupinteractionscreens + \donefalse + \ifx\@@iaopenaction\empty \else \donetrue + \ctxlua{jobreferences.checkopendocumentactions("\@@iaopenaction")}% + \ctxlua{jobreferences.expandcurrent()}% + \fi + \ifx\@@iacloseaction\empty \else \donetrue + \ctxlua{jobreferences.checkclosedocumentactions("\@@iacloseaction")}% + \ctxlua{jobreferences.expandcurrent()}% + \fi + \ifdone + \ctxlua{jobreferences.flushdocumentactions()}% + \fi \global\let\dolocationstartup\relax \fi} -\appendtoks \dolocationstartup \to \everyshipout - -\def\dolocationpagecheck % brr pdf dependent +\def\dolocationpagecheck {\iflocation - \handlereferenceactions\@@iaopenpageaction \dosetupopenpageaction - \handlereferenceactions\@@iaclosepageaction\dosetupclosepageaction + \donefalse + \ifx\@@iaopenpageaction\empty \else \donetrue + \ctxlua{jobreferences.checkopenpageactions("\@@iaopenpageaction")}% + \ctxlua{jobreferences.expandcurrent()}% + \fi + \ifx\@@iaclosepageaction\empty \else \donetrue + \ctxlua{jobreferences.checkclosepageactions("\@@iaclosepageaction")}% + \ctxlua{jobreferences.expandcurrent()}% + \fi + \ifdone + \ctxlua{jobreferences.flushpageactions()}% + \fi \fi} +\appendtoks \dolocationstartup \to \everyshipout \appendtoks \dolocationpagecheck \to \everyshipout -%D The next few macros are really horrible. For proper -%D navigation a in||line hypertext fragment must have -%D comfortable properties, so we must force some minimal -%D dimensions. On the other hand button, and here I mean those -%D pieces of text with fancy outlines and/or backgrounds, often -%D have fixed, preset dimensions. -%D -%D To make things even worse, if we choose to let the optimal -%D dimensions depend on the height and depth of a strut, a not -%D too uncommon practice in \TEX, we have to deal with the fact -%D that such a strut, set inside a box, is unknown too the -%D outside world. -%D -%D The solution lays in passing the strut characteristics in -%D a proper way, in our case by applying \type{\presetgoto}: -%D -%D \starttyping -%D {some piece of text \presetgoto} -%D \stoptyping -%D -%D This macro stores the current strut values. - -\newif\iflocationstrut -\newif\iflocationsplit - -\def\resetgoto - {\globallet\@@ia@@hoogte\!!zeropoint - \globallet\@@ia@@diepte\!!zeropoint} - -\resetgoto - -\def\presetgoto - {\iflocationstrut - \setstrut - %\xdef\@@ia@@hoogte{\the\strutht}% - %\xdef\@@ia@@diepte{\the\strutdp}% - \globallet\@@ia@@hoogte\strutheight - \globallet\@@ia@@diepte\strutdepth - \else - \globallet\@@ia@@hoogte\@@iaheight - \globallet\@@ia@@diepte\@@iadepth - \fi} - -%D In the macros that deal with making areas into hyperlinks, -%D we use: - -\newbox\driverresources - -\def\collectdriverresource#1% - {\global\setbox\driverresources\hbox{\box\driverresources#1}} - -\def\flushdriverresources - {\ifvoid\driverresources\else\box\driverresources\fi} - -% \def\dohandlegoto#1#2#3% -% {\ifsecondaryreference -% \bgroup\setbox0\hbox{#2#3}\egroup -% \else -% \hbox -% {\setbox0\hbox{#1}% -% \ifdim\wd0<\@@iawidth\relax -% \buttonwidth\@@iawidth\relax -% \else -% \buttonwidth\wd0 -% \fi -% \ifdim\ht0<\@@ia@@hoogte\relax -% \buttonheight\@@ia@@hoogte\relax -% \else -% \buttonheight\ht0 -% \fi -% \ifdim\dp0<\@@ia@@diepte\relax -% \dimen0=\@@ia@@diepte\relax % = ! -% \else -% \dimen0\dp0 -% \fi -% \advance\buttonheight \dimen0 -% \setbox2\hbox -% {\lower\dimen0\hbox -% {\dontcomplain -% \dimen0=.5\wd0 % direct skipping is faster of course -% \advance\dimen0 -.5\buttonwidth % buts this is nicer -% \hskip\dimen0#2#3}}% when visualizing things -% \naturalhbox % needed for omega / moved from plus-omg -% {\ifreversegoto -% \dimen0\wd0\box0\kern-\dimen0\smashbox2\box2\kern\dimen0 -% \else -% \smashbox2\box2\box0 -% \fi -% \flushdriverresources}% -% \resetgoto}% -% \fi} - -\def\dohandlegoto#1#2#3% - {\ifcollectreferenceactions - % this happens here while in mkii elsewhere, better is to deal with - % in in the ref module but that's for later to deal with - \bgroup\setbox\scratchbox\hbox{#2#3}\egroup - \ifsecondaryreference \else - \resetgoto - \fi - \ifsecondaryreference\else#1\resetgoto\fi - \else\ifsecondaryreference - \bgroup\setbox\scratchbox\hbox{#2#3}\egroup - \else - \hbox - {\setbox0\hbox{#1}% - \ifdim\wd0<\@@iawidth\relax - \buttonwidth\@@iawidth\relax - \else - \buttonwidth\wd0 - \fi - \ifdim\ht0<\@@ia@@hoogte\relax - \buttonheight\@@ia@@hoogte\relax - \else - \buttonheight\ht0 - \fi - \ifdim\dp0<\@@ia@@diepte\relax - \dimen0=\@@ia@@diepte\relax % = ! - \else - \dimen0\dp0 - \fi - \advance\buttonheight \dimen0 - \setbox2\hbox - {\lower\dimen0\hbox - {\dontcomplain - \dimen0=.5\wd0 % direct skipping is faster of course - \advance\dimen0 -.5\buttonwidth % buts this is nicer - \hskip\dimen0#2#3}}% when visualizing things - \naturalhbox % needed for omega / moved from plus-omg - {\ifreversegoto - \dimen0\wd0\box0\kern-\dimen0\smashbox2\box2\kern\dimen0 - \else - \smashbox2\box2\box0 - \fi - \flushdriverresources}% - \resetgoto}% - \fi\fi} - -%D The secondary references are processed but not typeset. The -%D special driver must collect the data needed. - -%D The width of the active area depends on the dimensions -%D preset, the actual dimens and/or the height and depth of the -%D strut. -%D -%D Normally the hyper active area is laid on top of the text. -%D This enables stacking hyperlinks on top of each other. When, -%D for some reason the opposite is prefered, one can use the -%D next boolean to signal this wish. - -\newif\ifreversegoto \reversegotofalse - %D As long as there a natural feeling of what can be considered %D hyper active or not, we have to tell users where they can %D possibly click. We've already seen a few macros that deal @@ -296,109 +150,62 @@ %D situations where the typeface is handled by the calling %D macro. -\def\interactioncolor % todo \??ia as argument - {\iflocation - \ifrealreferencepage - \@@iacontrastcolor +%D When we're dealing with pure page references, contrast +%D colors are used when we are already at the page mentioned. + +\def\setlocationcolor#1% not grouped ! + {\ifnum\referencepagestate=\plusone + \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}% + \ifx\askedcontrastcolor\empty + \dosetcolorattribute{#1}\c!color \else - \@@iacolor + \dosetcolorattribute{#1}\c!contrastcolor \fi + \else % we could just set and if > 0 set again + \dosetcolorattribute{#1}\c!color \fi} -%D CHECK WHERE USED / CONSISTENCY - -\def\showlocation#1% - {\iflocation\color[\@@iacolor]{#1\presetgoto}\else#1\fi} - -%D When local color settings are to be used, we can use the -%D next macro, where \type{#1} is a tag like \type{\??tg} and -%D \type{#2} some text. - -\def\showcoloredlocation#1#2% - {\iflocation - \color[\getvalue{#1\c!color}]{#2\presetgoto}% - \else - #2% - \fi} +\def\setlocationfont#1% + {\dosetfontattribute{#1}\c!style} -%D When we're dealing with pure page references, contrast -%D colors are used when we are already at the page mentioned. +\def\setlocationattributes#1% + {\ifnum\referencepagestate=\plusone + \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}% + \ifx\askedcontrastcolor\empty + \dosetcolorattribute{#1}\c!color + \else + \dosetcolorattribute{#1}\c!contrastcolor + \fi + \else % we could just set and if > 0 set again + \dosetcolorattribute{#1}\c!color + \fi + \dosetfontattribute{#1}\c!style} -\def\showcontrastlocation#1#2#3% the \@EA is needed - {\iflocation - \ifnum#2=\realpageno\relax - \doifelsevaluenothing{#1\c!color} - {#3\presetgoto} - {\color[\getvalue{#1\c!contrastcolor}]{#3\presetgoto}}% +\def\setlocationcolorspec#1% \resolver + {\ifnum\referencepagestate=\plusone + \edef\askedcontrastcolor{#1\c!contrastcolor}% + \ifx\askedcontrastcolor\empty + \doactivatecolor{#1\c!color}% \else - \color[\getvalue{#1\c!color}]{#3\presetgoto}% + \doactivatecolor\askedcontrastcolor \fi \else - #3% + \doactivatecolor{#1\c!color}% \fi} -%D The next simple macro can be used in color specifications, -%D like \type{\color[\locationcolor{green}]}. - -\def\locationcolor#1% - {\iflocation#1\fi} - %D More tokens are spend when we want both typeface and color %D highlighting. -\def\dolocationattributes#1#2#3#4% - {\bgroup - \let\fontattribute\empty - \let\colorattribute\empty - \doifdefined{#1#2}{\def\fontattribute{\getvalue{#1#2}}}% - \iflocation - \doifdefined{#1#3}{\def\colorattribute{\getvalue{#1#3}}}% - \fi - \startcolor[\colorattribute]% - \@EA\doconvertfont\@EA{\fontattribute}{#4}% no \edef, but \@EA here - \stopcolor - \egroup} - -\def\navigating - {\dolocationattributes\??ia\c!style\c!color} - -%D Although not decently supported in current viewers, a -%D provisory hiding mechanims is implemented. Areas marked as -%D such, are visible on screen, but invisible on paper. Don't -%D trust this mechanism yet! - -\def\dostartinteraction - {\bgroup - \let\stopinteraction\egroup - \dowithnextbox{\dostarthide\flushnextbox\dostophide\egroup}\hbox} - -\let\startinteraction = \relax -\let\stopinteraction = \relax - -% in the future: -% -% eerst boolean invoeren bij menu, achtergrond, balk, button -% enz; verder startinteractie een argument meegeven {#1} -> -% \getvalue{#1\c!print}=={\v!ja} enz. Consequent menubutton -% gebruiken! - \def\@@iatimestamp {\the\normalyear \ifnum\normalmonth<10 0\fi\the\normalmonth \ifnum\normalday <10 0\fi\the\normalday} -% happens in core-fld -% -% \definereference [AtOpenInitializeForm] [\v!geen] - \setupinteraction % start fit page and reset form [\c!state=\v!stop, \c!page=\v!no, \c!click=\v!yes, \c!display=, - %\c!openaction={\v!firstpage,AtOpenInitializeForm}, - %\c!openaction={\v!firstpage,\v!ResetForm}, - %\c!openaction=\v!ResetForm, % too buggy in reader 4.05 \c!openaction=, \c!closeaction=, \c!openpageaction=, diff --git a/tex/context/base/sort-def.tex b/tex/context/base/sort-def.mkii index 10dc31b14..10dc31b14 100644 --- a/tex/context/base/sort-def.tex +++ b/tex/context/base/sort-def.mkii diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua index b75950860..3930e85fe 100644 --- a/tex/context/base/sort-ini.lua +++ b/tex/context/base/sort-ini.lua @@ -14,8 +14,8 @@ if not modules then modules = { } end modules ['sort-ini'] = { -- always expand to utf local utf = unicode.utf8 -local gsub = string.gsub -local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues +local gsub, rep = string.gsub, string.rep +local utfcharacters, utfvalues, strcharacters = string.utfcharacters, string.utfvalues, string.characters sorters = { } sorters.comparers = { } @@ -26,16 +26,26 @@ sorters.replacements = { } sorters.language = 'en' function sorters.comparers.basic(sort_a,sort_b) + local sm = sorters.mappings[sorters.language or sorters.defaultlanguage] -- slow, will become sorters.initialize if #sort_a > #sort_b then if #sort_b == 0 then return 1 else for i=1,#sort_b do local ai, bi = sort_a[i], sort_b[i] - if ai > bi then - return 1 - elseif ai < bi then - return -1 + local am, bm = sm[ai], sm[bi] + if am and bm then + if am > bm then + return 1 + elseif am < bm then + return -1 + end + else + if ai > bi then + return 1 + elseif ai < bi then + return -1 + end end end return 1 @@ -46,10 +56,19 @@ function sorters.comparers.basic(sort_a,sort_b) else for i=1,#sort_a do local ai, bi = sort_a[i], sort_b[i] - if ai > bi then - return 1 - elseif ai < bi then - return -1 + local am, bm = sm[ai], sm[bi] + if am and bm then + if am > bm then + return 1 + elseif am < bm then + return -1 + end + else + if ai > bi then + return 1 + elseif ai < bi then + return -1 + end end end return -1 @@ -59,42 +78,65 @@ function sorters.comparers.basic(sort_a,sort_b) else for i=1,#sort_a do local ai, bi = sort_a[i], sort_b[i] - if ai > bi then - return 1 - elseif ai < bi then - return -1 + local am, bm = sm[ai], sm[bi] + if am and bm then + if am > bm then + return 1 + elseif am < bm then + return -1 + end + else + if ai > bi then + return 1 + elseif ai < bi then + return -1 + end end end return 0 end end +local function padd(s) return rep(" ",10-#s) .. s end -- or format with padd + function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])","") - str = gsub(str,"\\%S*","") - str = gsub(str,"[%s%[%](){}%$\"\']*","") - str = gsub(str,"(%d+)",function(s) return (" "):rep(10-#s) .. s end) -- sort numbers properly - return str + if str then + str = gsub(str,"\\%S*","") + str = gsub(str,"[%s%[%](){}%$\"\']*","") + str = gsub(str,"(%d+)",padd) -- sort numbers properly + return str + else + return "" + end +end + +function sorters.firstofsplit(split) + -- numbers are left padded by spaces + local se = sorters.entries[sorters.language or sorters.defaultlanguage] -- slow, will become sorters.initialize + local vs = split[1] + local entry = (vs and vs[1]) or "" + return entry, (se and se[entry]) or "\000" end sorters.defaultlanguage = 'en' +-- beware, numbers get spaces in front + function sorters.splitters.utf(str) -- brrr, todo: language local r = sorters.replacements[sorters.language] or sorters.replacements[sorters.defaultlanguage] or { } - local m = sorters.mappings [sorters.language] or sorters.mappings [sorters.defaultlanguage] or { } +--~ local m = sorters.mappings [sorters.language] or sorters.mappings [sorters.defaultlanguage] or { } local u = characters.uncompose local b = utf.byte local t = { } for _,v in next, r do str = gsub(str,v[1],v[2]) end - for c in utfcharacters(str) do - if m[c] then - t[#t+1] = m[c] - elseif #c == 1 then - t[#t+1] = b(c) + for c in utfcharacters(str) do -- maybe an lpeg + if #c == 1 then + t[#t+1] = c else - for cc in string.characters(u(c)) do -- utf ? - t[#t+1] = m[cc] or b(cc) + for cc in strcharacters(c) do + t[#t+1] = cc end end end @@ -104,27 +146,3 @@ end function sorters.sort(entries,cmp) table.sort(entries,function(a,b) return cmp(a,b) == -1 end) end - --- temp workaround (is gone) - -function sorters.process() - -- gone -end - --- was: - ---~ function sorters.process(kind,data) ---~ if data.entries then ---~ if not data.sorted then ---~ sorters.language = data.language or sorters.language ---~ sorters[kind].prepare(data.entries) ---~ sorters[kind].sort(data.entries) ---~ sorters[kind].unique(data.entries) ---~ data.sorted = true ---~ end ---~ return sorters[kind].flush(sorters[kind].finalize(data.entries),data.class,data.flush) ---~ else ---~ return { } ---~ end ---~ end - diff --git a/tex/context/base/sort-ini.mkii b/tex/context/base/sort-ini.mkii index f26f4febe..f1ed1c316 100644 --- a/tex/context/base/sort-ini.mkii +++ b/tex/context/base/sort-ini.mkii @@ -128,10 +128,8 @@ {\dowalkregime\characterencoding}}% \egroup \startnointerference -% \startreadingfile -\setcatcodetable\ctxcatcodes - \readsysfile{\f!sortprefix def}\donothing\donothing % default -% \stopreadingfile + \setcatcodetable\ctxcatcodes + \readsysfile{\f!sortprefix def.mkii}\donothing\donothing % default \stopnointerference \global\let\savesortdefinitions\relax} @@ -142,10 +140,8 @@ \global\letvalue{\f!sortprefix::#1}\empty \def\currentexportclass{#1}% \enablemode[sortorder-#1]% -% \startreadingfile -\setcatcodetable\ctxcatcodes - \readsysfile{\f!sortprefix lan}\donothing\donothing -% \stopreadingfile + \setcatcodetable\ctxcatcodes + \readsysfile{\f!sortprefix lan.mkii}\donothing\donothing \stopnointerference}}} \prependtoks diff --git a/tex/context/base/sort-lan.lua b/tex/context/base/sort-lan.lua index 394cbabe1..5d4ded78e 100644 --- a/tex/context/base/sort-lan.lua +++ b/tex/context/base/sort-lan.lua @@ -17,19 +17,20 @@ local utf = unicode.utf8 -- other languages are sparse so for the moment we keep this one. sorters.entries['en'] = { - [ 1] = "a", [ 3] = "b", [ 5] = "c", [ 7] = "d", [ 9] = "e", - [11] = "f", [13] = "g", [15] = "h", [17] = "i", [19] = "j", - [21] = "k", [23] = "l", [25] = "m", [27] = "n", [29] = "o", - [31] = "p", [33] = "q", [35] = "r", [37] = "s", [39] = "t", - [41] = "u", [43] = "v", [45] = "w", [47] = "x", [49] = "y", - [51] = "z", - [ 2] = 1, [ 4] = 3, [ 6] = 5, [ 8] = 7, [10] = 9, - [12] = 11, [14] = 13, [16] = 15, [18] = 17, [20] = 19, - [22] = 21, [24] = 23, [26] = 25, [28] = 27, [30] = 29, - [32] = 31, [34] = 33, [36] = 35, [38] = 37, [40] = 39, - [42] = 41, [44] = 43, [46] = 45, [48] = 47, [50] = 49, - [52] = 51, + ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e", + ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j", + ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o", + ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t", + ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", + ["z"] = "z", + ["A"] = "a", ["B"] = "b", ["C"] = "c", ["D"] = "d", ["E"] = "e", + ["F"] = "f", ["G"] = "g", ["H"] = "h", ["I"] = "i", ["J"] = "j", + ["K"] = "k", ["L"] = "l", ["M"] = "m", ["N"] = "n", ["O"] = "o", + ["P"] = "p", ["Q"] = "q", ["R"] = "r", ["S"] = "s", ["T"] = "t", + ["U"] = "u", ["V"] = "v", ["W"] = "w", ["X"] = "x", ["Y"] = "y", + ["Z"] = "z", } + sorters.mappings['en'] = { ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9, ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19, @@ -61,46 +62,46 @@ sorters.replacements['cz'] = { } sorters.entries['cz'] = { - [ 1] = "a", - [ 2] = 1, - [ 3] = "b", - [ 4] = "c", - [ 5] = uc(0x010D), -- ccaron - [ 6] = "d", - [ 7] = uc(0x010F), -- dcaron - [ 8] = "e", - [ 9] = 8, - [10] = 8, - [11] = "f", - [12] = "g", - [13] = "h", - [14] = "ch", - [15] = "i", - [16] = 15, - [17] = "j", - [18] = "k", - [19] = "l", - [20] = "m", - [21] = "n", - [22] = uc(0x0147), -- ncaron - [23] = "o", - [24] = "p", - [25] = "q", - [26] = "r", - [27] = uc(0x0147), -- rcaron - [28] = "s", - [29] = uc(0x0161), -- scaron - [30] = "t", - [31] = uc(0x0165), -- tcaron - [32] = "u", - [33] = 32, - [34] = 32, - [35] = "v", - [36] = "w", - [37] = "x", - [38] = "y", - [49] = "z", - [40] = uc(0x017E), -- zcaron + ['a'] = "a", + [uc(0x00E1)] = "a", + ['b'] = "b", + ['c'] = "c", + [uc(0x010D)] = uc(0x010D), -- ccaron + ['d'] = "d", + [uc(0x010F)] = uc(0x010F), -- dcaron + ['e'] = "e", + [uc(0x00E9)] = "e", + [uc(0x011B)] = "e", + ['f'] = "f", + ['g'] = "g", + ['h'] = "h", + [uc(0xFF01)] = "ch", + ['i'] = "i", + [uc(0x00ED)] = "i", + ['j'] = "j", + ['k'] = "k", + ['l'] = "l", + ['m'] = "m", + ['n'] = "n", + [uc(0x0147)] = uc(0x0147), -- ncaron + ['o'] = "o", + ['p'] = "p", + ['q'] = "q", + ['s'] = "r", + [uc(0x0147)] = uc(0x0147), -- rcaron + ['s'] = "s", + [uc(0x0161)] = uc(0x0161), -- scaron + ['t'] = "t", + [uc(0x0165)] = uc(0x0165), -- tcaron + ['u'] = "u", + [uc(0x00FA)] = "u", + [uc(0x01F6)] = "u", + ['v'] = "v", + ['w'] = "w", + ['x'] = "x", + ['y'] = "y", + ['z'] = "z", + [uc(0x017E)] = uc(0x017E), -- zcaron } sorters.mappings['cz'] = { @@ -196,19 +197,20 @@ sorters.mappings ['de-CH'] = sorters.mappings['de'] -- german - Austria sorters.entries['de-AT'] = { - [ 1] = "a", [ 3] = 1, [ 5] = "b", [ 7] = "c", [ 9] = "d", - [11] = "e", [13] = "f", [15] = "g", [17] = "h", [19] = "i", - [21] = "j", [23] = "k", [25] = "l", [27] = "m", [29] = "n", - [31] = "o", [33] = 31, [35] = "p", [37] = "q", [39] = "r", - [41] = "s", [43] = "t", [45] = "u", [47] = 45, [49] = "v", - [51] = "w", [53] = "y", [55] = "y", [57] = "z", - [ 2] = 1, [ 4] = 3, [ 6] = 5, [ 8] = 7, [10] = 9, - [12] = 11, [14] = 13, [16] = 15, [18] = 17, [20] = 19, - [22] = 21, [24] = 23, [26] = 25, [28] = 27, [30] = 29, - [32] = 31, [34] = 33, [36] = 35, [38] = 37, [40] = 39, - [42] = 41, [44] = 43, [46] = 45, [48] = 47, [50] = 49, - [52] = 51, [54] = 53, [56] = 55, [58] = 57, + ["a"] = "a", ["ä"] = "ä", ["b"] = "b", ["c"] = "c", ["d"] = "d", + ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", + ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", + ["o"] = "o", ["ö"] = "ö", ["p"] = "p", ["q"] = "q", ["r"] = "r", + ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ü"] = "ü", ["v"] = "v", + ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z", + ["A"] = "a", ["Ä"] = "ä", ["B"] = "b", ["C"] = "c", ["D"] = "d", + ["E"] = "e", ["F"] = "f", ["G"] = "g", ["H"] = "h", ["I"] = "i", + ["J"] = "j", ["K"] = "k", ["L"] = "l", ["M"] = "m", ["N"] = "n", + ["O"] = "o", ["Ö"] = "ö", ["P"] = "p", ["Q"] = "q", ["R"] = "r", + ["S"] = "s", ["T"] = "t", ["U"] = "u", ["Ü"] = "ü", ["V"] = "v", + ["W"] = "w", ["X"] = "x", ["Y"] = "y", ["Z"] = "z", } + sorters.mappings['de-AT'] = { ["a"] = 1, ["ä"] = 3, ["b"] = 5, ["c"] = 7, ["d"] = 9, ["e"] = 11, ["f"] = 13, ["g"] = 15, ["h"] = 17, ["i"] = 19, @@ -240,19 +242,20 @@ sorters.entries['fi'] = { [42] = 41, [44] = 43, [46] = 45, [48] = 47, [50] = 49, [52] = 51, [54] = 53, [56] = 55, [58] = 57, } -sorters.mappings['fi'] = { - ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9, - ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19, - ["k"] = 21, ["l"] = 23, ["m"] = 25, ["n"] = 27, ["o"] = 29, - ["p"] = 31, ["q"] = 33, ["r"] = 35, ["s"] = 37, ["t"] = 39, - ["u"] = 41, ["v"] = 43, ["w"] = 45, ["x"] = 47, ["y"] = 49, - ["z"] = 51, ["å"] = 53, ["ä"] = 55, ["ö"] = 57, - ["A"] = 2, ["B"] = 4, ["C"] = 6, ["D"] = 8, ["E"] = 10, - ["F"] = 12, ["G"] = 14, ["H"] = 16, ["I"] = 18, ["J"] = 20, - ["K"] = 22, ["L"] = 24, ["M"] = 26, ["N"] = 28, ["O"] = 30, - ["P"] = 32, ["Q"] = 34, ["R"] = 36, ["S"] = 38, ["T"] = 40, - ["U"] = 42, ["V"] = 44, ["W"] = 46, ["X"] = 48, ["Y"] = 50, - ["Z"] = 52, ["Å"] = 54, ["Ä"] = 56, ["Ö"] = 58, + +sorters.entries['fi'] = { + ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e", + ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j", + ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o", + ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t", + ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", + ["z"] = "z", ["å"] = "å", ["ä"] = "ä", ["ö"] = "ö", + ["A"] = "a", ["B"] = "b", ["C"] = "c", ["D"] = "d", ["E"] = "e", + ["F"] = "f", ["G"] = "g", ["H"] = "h", ["I"] = "i", ["J"] = "j", + ["K"] = "k", ["L"] = "l", ["M"] = "m", ["N"] = "n", ["O"] = "o", + ["P"] = "p", ["Q"] = "q", ["R"] = "r", ["S"] = "s", ["T"] = "t", + ["U"] = "u", ["V"] = "v", ["W"] = "w", ["X"] = "x", ["Y"] = "y", + ["Z"] = "z", ["Å"] = "å", ["Ä"] = "ä", ["Ö"] = "ö", } --~ sorters.test = '' diff --git a/tex/context/base/sort-lan.tex b/tex/context/base/sort-lan.mkii index ad5232b02..ad5232b02 100644 --- a/tex/context/base/sort-lan.tex +++ b/tex/context/base/sort-lan.mkii diff --git a/tex/context/base/spec-def.tex b/tex/context/base/spec-def.mkii index ad1a9bb1d..ad1a9bb1d 100644 --- a/tex/context/base/spec-def.tex +++ b/tex/context/base/spec-def.mkii diff --git a/tex/context/base/spec-dpm.tex b/tex/context/base/spec-dpm.mkii index 9cf023fe0..9cf023fe0 100644 --- a/tex/context/base/spec-dpm.tex +++ b/tex/context/base/spec-dpm.mkii diff --git a/tex/context/base/spec-dpx.tex b/tex/context/base/spec-dpx.mkii index ed49ea843..ed49ea843 100644 --- a/tex/context/base/spec-dpx.tex +++ b/tex/context/base/spec-dpx.mkii diff --git a/tex/context/base/spec-dvi.tex b/tex/context/base/spec-dvi.mkii index 1a8f653f0..1a8f653f0 100644 --- a/tex/context/base/spec-dvi.tex +++ b/tex/context/base/spec-dvi.mkii diff --git a/tex/context/base/spec-fdf.tex b/tex/context/base/spec-fdf.mkii index da29a5b38..6579a9247 100644 --- a/tex/context/base/spec-fdf.tex +++ b/tex/context/base/spec-fdf.mkii @@ -136,7 +136,7 @@ \def\doPDFgetobjectpage#1#2#3% {\dogetobjectreferencepage{#1}{#2}#3% - \ifx#3\empty\def#3{1}\fi} + \ifx#3\empty\def#3{\realfolio}\fi} \def\doPDFgetobjectpagereference#1#2#3% {\dogetobjectreferencepage{#1}{#2}#3% @@ -290,7 +290,7 @@ \def\addPDFdocumentinfo {\doPDFaddtocatalog{\currentPDFpagemode\currentPDFviewerprefs}% - \doPDFaddtocatalog{/Version \ifdim\PDFversion00\points>100\points 1.\fi\PDFversion}% + \doPDFaddtocatalog{/Version /\PDFversion}% \doPDFaddtoinfo{/Trapped /False}% \doPDFaddtoinfo{/ConTeXt.Version (\contextversion)}% \doPDFaddtoinfo{/ConTeXt.Time (\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute)}% @@ -594,7 +594,7 @@ \let\lastfakedPDFpage\!!zerocount \def\fakePDFpagedestination % as in pdf, we start numbering at zero - {\iflocation \ifarrangingpages \ifnum\overcomePDFpage=\plustwo \else + {\iflocation \ifarrangingpages \else \ifnum\overcomePDFpage=\plustwo \ifnum\lastfakedPDFpage<\realpageno \bgroup \xdef\lastfakedPDFpage{\realfolio}% @@ -3166,7 +3166,6 @@ % kan zelf ocmd bevatten \def\doPDFdefinelayer#1#2#3#4#5% tag title visible type printable -% {\driverreferenced \doPDFdictionaryobject{PDLN}{#1} {\doPDFdictionaryobject{PDLN}{#1} {/Type /OCG \ifcase#4 \or @@ -3181,7 +3180,6 @@ \doifelse{#3}\v!start {\xdef\PDFvidelayers{\PDFvidelayers\space\PDFobjectreference}}% {\xdef\PDFhidelayers{\PDFhidelayers\space\PDFobjectreference}}% - %\driverreferenced \doPDFdictionaryobject{PDLD}{#1} \doPDFdictionaryobject{PDLD}{#1} {/Type /OCMD /OCGs [\PDFobjectreference]}% diff --git a/tex/context/base/spec-ini.tex b/tex/context/base/spec-ini.mkii index 4f3d884be..0229a0e3d 100644 --- a/tex/context/base/spec-ini.tex +++ b/tex/context/base/spec-ini.mkii @@ -35,38 +35,6 @@ \unprotect -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - -% messages moved - %D \TEX\ produces files in the \DVI\ format. This format is %D well defined and stable. In this format one||byte commands %D are used which can optionally be followed by length @@ -321,7 +289,7 @@ {\edef\currentspecialfile{#1}}% \makeshortfilename[\truefilename{\f!specialprefix\currentspecialfile}]% \startreadingfile - \readsysfile\shortfilename{\showmessage\m!specials5\currentspecialfile}\donothing + \readsysfile{\shortfilename.mkii}{\showmessage\m!specials5\currentspecialfile}\donothing \stopreadingfile}} \def\usespecials[#1]% diff --git a/tex/context/base/spec-mis.tex b/tex/context/base/spec-mis.mkii index 3d263eace..3d263eace 100644 --- a/tex/context/base/spec-mis.tex +++ b/tex/context/base/spec-mis.mkii diff --git a/tex/context/base/spec-pdf.tex b/tex/context/base/spec-pdf.mkii index 2191eaeae..2191eaeae 100644 --- a/tex/context/base/spec-pdf.tex +++ b/tex/context/base/spec-pdf.mkii diff --git a/tex/context/base/spec-ps.tex b/tex/context/base/spec-ps.mkii index 803defe02..803defe02 100644 --- a/tex/context/base/spec-ps.tex +++ b/tex/context/base/spec-ps.mkii diff --git a/tex/context/base/spec-tpd.tex b/tex/context/base/spec-tpd.mkii index 597993e0a..597993e0a 100644 --- a/tex/context/base/spec-tpd.tex +++ b/tex/context/base/spec-tpd.mkii diff --git a/tex/context/base/spec-tr.tex b/tex/context/base/spec-tr.mkii index c1f997bca..c1f997bca 100644 --- a/tex/context/base/spec-tr.tex +++ b/tex/context/base/spec-tr.mkii diff --git a/tex/context/base/spec-tst.tex b/tex/context/base/spec-tst.mkii index bdd8a29b2..bdd8a29b2 100644 --- a/tex/context/base/spec-tst.tex +++ b/tex/context/base/spec-tst.mkii diff --git a/tex/context/base/spec-var.tex b/tex/context/base/spec-var.mkii index 8d561dc6f..8d561dc6f 100644 --- a/tex/context/base/spec-var.tex +++ b/tex/context/base/spec-var.mkii diff --git a/tex/context/base/spec-win.tex b/tex/context/base/spec-win.mkii index 73db8830e..73db8830e 100644 --- a/tex/context/base/spec-win.tex +++ b/tex/context/base/spec-win.mkii diff --git a/tex/context/base/spec-xet.tex b/tex/context/base/spec-xet.mkii index 0cbd55ba7..0cbd55ba7 100644 --- a/tex/context/base/spec-xet.tex +++ b/tex/context/base/spec-xet.mkii diff --git a/tex/context/base/spec-xtx.tex b/tex/context/base/spec-xtx.mkii index 799c6ca8d..799c6ca8d 100644 --- a/tex/context/base/spec-xtx.tex +++ b/tex/context/base/spec-xtx.mkii diff --git a/tex/context/base/spec-yy.tex b/tex/context/base/spec-yy.mkii index beec95493..beec95493 100644 --- a/tex/context/base/spec-yy.tex +++ b/tex/context/base/spec-yy.mkii diff --git a/tex/context/base/strc-bkm.lua b/tex/context/base/strc-bkm.lua index 1104157bd..8f8a3ca24 100644 --- a/tex/context/base/strc-bkm.lua +++ b/tex/context/base/strc-bkm.lua @@ -6,75 +6,22 @@ if not modules then modules = { } end modules ['strc-bkm'] = { license = "see context related readme files" } --- todo: move some code to backend +-- Future version will support adding arbitrary bookmarks with +-- associated complex actions (rather trivial to implement). local format, concat, gsub = string.format, table.concat, string.gsub local texsprint, utfvalues = tex.sprint, string.utfvalues local ctxcatcodes = tex.ctxcatcodes -local lists = structure.lists - --- todo: backend code - -local function pdfhexified(str) - local t = { } - t[#t+1] = "feff" - for b in utfvalues(str) do - if b < 0x10000 then - t[#t+1] = format("%04x",b) - else - t[#t+1] = format("%04x%04x",b/1024+0xD800,b%1024+0xDC00) - end - end - return concat(t) -end - --- todo: lpeg cleaner - -local function pdfbookmark(level,n,text,page,open) - text = gsub(text,"\\([A-Z]+)","%1") -- \LOGO - text = gsub(text,"\\ "," ") -- \ - text = gsub(text,"\\([A-Za-z]+) *{(.-)}","%1") -- \bla{...} - text = gsub(text," +"," ") -- spaces - text = pdfhexified(text) -- somehow must happen here - texsprint(ctxcatcodes,format("\\doinsertbookmark{%s}{%s}{%s}{%s}{%s}",level,n,text,page,open)) -end - --- end of todo - +local lists = structure.lists local levelmap = structure.sections.levelmap structure.bookmarks = structure.bookmarks or { } local bookmarks = structure.bookmarks -local function nofchildren(list,current,currentlevel) - local i = current + 1 - local li = list[i] - if li then - local nextlevel = levelmap[li.metadata.name] - if nextlevel and nextlevel > currentlevel then - local n = 1 - i = i + 1 - li = list[i] - while li do - local somelevel = levelmap[li.metadata.name] - if somelevel then - if somelevel == nextlevel then - n = n + 1 - elseif somelevel < nextlevel then - break - end - end - i = i + 1 - li = list[i] - end - return n - end - end - return 0 -end +bookmarks.method = "internal" -- or "page" local names, opened = "", "" @@ -83,34 +30,6 @@ function bookmarks.register(n,o) if opened == "" then opened = o else opened = opened .. "," .. o end end -function bookmarks.place() - if name ~= "" then - local list = lists.filter(names,"all",nil,lists.collected) - if #list > 0 then - local allopen = (opened == interfaces.variables.all) and 1 - opened = aux.settings_to_set(opened) - for i=1,#list do - local li = list[i] - local metadata = li.metadata - if not metadata.nolist and levelmap[metadata.name] then - local name, titledata = metadata.name, li.titledata - if titledata then - local level = levelmap[name] - local children = nofchildren(list,i,level) - local title = titledata.bookmark or titledata.title or "?" - local realpage = li.references and li.references.realpage - if realpage then - local open = allopen or (opened[name] and 1) - pdfbookmark(level,children,title,realpage,allopen or open or 0) - end - end - end - end - bookmarks.place = function() end - end - end -end - function bookmarks.overload(name,text) local l, ls = lists.tobesaved, nil if #l == 0 then @@ -131,3 +50,38 @@ function bookmarks.overload(name,text) ls.titledata.bookmark = text end end + +local function stripped(str) -- kind of generic + str = gsub(str,"\\([A-Z]+)","%1") -- \LOGO + str = gsub(str,"\\ "," ") -- \ + str = gsub(str,"\\([A-Za-z]+) *{(.-)}","%1") -- \bla{...} + str = gsub(str," +"," ") -- spaces + return str +end + +function bookmarks.place() + if names ~= "" then + local list = lists.filter(names,"all",nil,lists.collected) + if #list > 0 then + local opened, levels = aux.settings_to_set(opened), { } + for i=1,#list do + local li = list[i] + local metadata = li.metadata + local name = metadata.name + if not metadata.nolist and levelmap[name] then + local titledata = li.titledata + if titledata then + levels[#levels+1] = { + levelmap[name], + stripped(titledata.bookmark or titledata.title or "?"), + li.references, -- has internal and realpage + allopen or opened[name] + } + end + end + end + backends.codeinjections.addbookmarks(levels,bookmarks.method) + end + function bookmarks.place() end -- prevent second run + end +end diff --git a/tex/context/base/strc-def.mkiv b/tex/context/base/strc-def.mkiv index f24ee2023..2395ddf6c 100644 --- a/tex/context/base/strc-def.mkiv +++ b/tex/context/base/strc-def.mkiv @@ -81,10 +81,6 @@ \c!ownnumber=\v!no, %\c!page=, \c!placehead=\v!yes, - %\c!prefix=, - \c!previousnumber=\v!yes, - \c!resetnumber=\v!yes, - %\c!section=, \c!sectionconversionset=\s!default, \c!sectionnumber=\v!yes, %\c!sectionsegments=, @@ -103,9 +99,17 @@ % \setupstructureblock[appendix][sectionconversionset=appendix] % \setupstructurehead[chapter][sectionconversionset=\structureblockparameter\c!sectionconversionset] % \structureblockparameter] +% \definestructureresetset[default][0,1,1,0][1] % this will not reset parts and subsections +% \setuphead[part][sectionresetset=default] +% \starttext +% \placelist[chapter,section,subsection][criterium=all,width=3cm] +% \part{first} \chapter{alpha} \section{a} \section{b} \subsection{x} \subsection{y} \chapter{beta} +% \part{second} \chapter{gamma} \section{a} \section{b} \subsection{x} \subsection{y} \chapter{delta} +% \stoptext + \definestructureseparatorset [\s!default] [] [.] \definestructureconversionset [\s!default] [] [numbers] -\definestructureresetset [\s!default] [] [0] +\definestructureresetset [\s!default] [] [1] \definestructureprefixset [\s!default] [section-1,section-2,section-3] [] \definestructureprefixset [\v!all] [section-1,section-2,section-3,section-4,section-5,section-6,section-7,section-8] [] diff --git a/tex/context/base/strc-des.mkiv b/tex/context/base/strc-des.mkiv index f2fbe2329..42e216789 100644 --- a/tex/context/base/strc-des.mkiv +++ b/tex/context/base/strc-des.mkiv @@ -485,6 +485,7 @@ \dodescriptionheadtext{#1}% \iftrialtypesetting \else \currentdescriptionsynchronize + \dosetattribute{destination}\currentdescriptionattribute % todo \fi} \def\dodescriptionheadtext#1% title @@ -619,6 +620,7 @@ \fi \iftrialtypesetting \else \currentdescriptionsynchronize + \dosetattribute{destination}\currentdescriptionattribute % todo \fi} \def\doenumerationsavecounter {\savestructurecounter[\currentdescriptionnumber]} @@ -737,8 +739,8 @@ \globallet\currentdescriptionlisttitle \currentdescriptiontitle \globallet\currentdescriptioncoding\s!tex \fi - \xdef\currentdescriptionlabel {\descriptionparameter\c!label}% - \xdef\currentdescriptionreference {\descriptionparameter\c!reference}% + \xdef\currentdescriptionlabel {\descriptionparameter\c!label}% + \xdef\currentdescriptionreference{\descriptionparameter\c!reference}% % \doif{\descriptionparameter\c!title}\v!none{\global\nodescriptioncaptiontrue\global\nodescriptionnumbertrue}% will become obsolete % @@ -749,6 +751,7 @@ \ifnodescriptioncaption \glet\currentdescriptionlistnumber \relax \glet\currentdescriptionsynchronize\relax + \glet\currentdescriptionattribute \relax \else \setnextinternalreference \xdef\currentdescriptionnumberentry{\ctxlua{structure.lists.push{ @@ -797,9 +800,8 @@ userdata = structure.helpers.touserdata(\!!bs\detokenize{#2}\!!es) } }}% - \xdef\currentdescriptionsynchronize % make this a macro because shared - {\noexpand\ctxlua{jobreferences.setinternalreference(nil,nil,\nextinternalreference)}% - \noexpand\ctxlatelua{structure.lists.enhance(\currentdescriptionnumberentry)}}% + \xdef\currentdescriptionattribute {\ctxlua {tex.write(jobreferences.setinternalreference("\referenceprefix","\currentdescriptionreference",\nextinternalreference,"\@@iafocus"))}}% + \xdef\currentdescriptionsynchronize{\ctxlatelua{structure.lists.enhance(\currentdescriptionnumberentry)}}% \fi \endgroup} @@ -863,7 +865,6 @@ \def\dodocurrentlabelnumber[#1]% {\dontleavehmode \writestatus{!!!}{todo: reference of label}% -% \rawreference{lab}{#1}{\composedsectionnumber}% \dotextprefix{\descriptionparameter\c!text}% \convertedsubstructurecounter[\currentdescriptionnumber][\currentdescriptionlevel]} diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index 93cdb71e3..23d39a110 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -181,64 +181,93 @@ function sections.getcurrentlevel() texwrite(data.depth) end -function sections.nextlevel() - local depth = data.depth + 1 - data.depth = depth - return depth -end - -function sections.prevlevel() - local numbers, ownnumbers, status, depth = data.numbers, data.ownnumbers, data.status, data.depth - local resetter = sets.getall("structure:resets",data.block,status[depth].resets or "") - local rd = resetter and resetter[depth] - numbers[depth] = (rd and rd > 0 and rd < depth and numbers[depth]) or 0 - status[depth] = nil - depth = depth - 1 - data.depth = depth - return depth -end - -function sections.somelevel(t) - local numbers, ownnumbers, status, depth = data.numbers, data.ownnumbers, data.status, data.depth - local d = tonumber(levelmap[t.metadata.name] or (depth > 0 and depth) or 1) - local resetter = sets.getall("structure:resets",data.block,(t and t.resets) or "") - local previous = { } - if d > depth then - local rd = resetter and resetter[i] - for i=depth+1,d do - numbers[i] = (rd and rd[i] and rd[i] > 0 and rd[i] < i and numbers[i]) or 0 +function sections.somelevel(given) + -- old number + local numbers, ownnumbers, status, olddepth = data.numbers, data.ownnumbers, data.status, data.depth + local newdepth = tonumber(levelmap[given.metadata.name] or (olddepth > 0 and olddepth) or 1) + local directives = given.directives + local resetset = (directives and directives.resetset) or "" + local resetter = sets.getall("structure:resets",data.block,resetset) + -- a trick to permits userdata to overload title, ownnumber and reference + -- normally these are passed as argument but nowadays we provide several + -- interfaces (we need this because we want to be compatible) + local u = given.userdata + if u then + -- kind of obsolete as we can pass them directly anyway + if u.reference and u.reference ~= "" then given.metadata.reference = u.reference ; u.reference = nil end + if u.ownnumber and u.ownnumber ~= "" then given.numberdata.ownnumber = u.ownnumber ; u.ownnumber = nil end + if u.title and u.title ~= "" then given.titledata.title = u.title ; u.title = nil end + if u.bookmark and u.bookmark ~= "" then given.titledata.bookmark = u.bookmark ; u.bookmark = nil end + if u.label and u.label ~= "" then given.titledata.label = u.label ; u.label = nil end + end + -- so far for the trick + if newdepth > olddepth then + for i=olddepth+1,newdepth do + local s = tonumber(sets.get("structure:resets",data.block,resetset,i)) +--~ logs.report("structure >","old: %s, new:%s, reset: %s (%s: %s)",olddepth,newdepth,s,resetset,table.concat(resetter,",")) + if not s or s == 0 then + numbers[i] = numbers[i] or 0 + ownnumbers[i] = ownnumbers[i] or "" + else + numbers[i] = s - 1 + ownnumbers[i] = "" + end status[i] = { } end - elseif d < depth then - local rd = resetter and resetter[i] - for i=depth,d+1,-1 do - numbers[i] = (rd and rd[i] and rd[i] > 0 and rd[i] < i and numbers[i]) or 0 + elseif newdepth < olddepth then + for i=olddepth,newdepth+1,-1 do + local s = tonumber(sets.get("structure:resets",data.block,resetset,i)) +--~ logs.report("structure <","old: %s, new:%s, reset: %s (%s: %s)",olddepth,newdepth,s,resetset,table.concat(resetter,",")) + if not s or s == 0 then + numbers[i] = numbers[i] or 0 + ownnumbers[i] = ownnumbers[i] or "" + else + numbers[i] = s - 1 + ownnumbers[i] = "" + end status[i] = nil end end - for i=1,d do - -- selective resetter - if numbers[i] == 0 then - ownnumbers[i] = "" + ownnumbers[newdepth] = given.numberdata.ownnumber or "" + given.numberdata.ownnumber = nil + data.depth = newdepth + -- new number + olddepth = newdepth + if given.metadata.increment then + if numbers[newdepth] then + numbers[newdepth] = numbers[newdepth] + 1 + else + local s = tonumber(sets.get("structure:resets",data.block,resetset,newdepth)) +--~ logs.report("structure =","old: %s, new:%s, reset: %s (%s: %s)",olddepth,newdepth,s,resetset,table.concat(resetter,",")) + if not s or s == 0 then + numbers[newdepth] = numbers[newdepth] or 0 + else + numbers[newdepth] = s - 1 + end end end - -- a trick to permits userdata to overload title, ownnumber and reference - -- normally these are passed as argument but nowadays we provide several - -- interfaces (we need this because we want to be compatible) - local u = t.userdata - if u then - if u.reference and u.reference ~= "" then t.metadata.reference = u.reference ; u.reference = nil end - if u.ownnumber and u.ownnumber ~= "" then t.numberdata.ownnumber = u.ownnumber ; u.ownnumber = nil end - if u.title and u.title ~= "" then t.titledata.title = u.title ; u.title = nil end - if u.bookmark and u.bookmark ~= "" then t.titledata.bookmark = u.bookmark ; u.bookmark = nil end - if u.label and u.label ~= "" then t.titledata.label = u.label ; u.label = nil end + status[newdepth] = given or { } + for k, v in pairs(data.checkers) do + if v[1] == newdepth and v[2] then + v[2](k) + end end - -- so far for the trick - ownnumbers[d] = t.numberdata.ownnumber or "" - t.numberdata.ownnumber = nil --- t.numberdata = helpers.simplify(t.numberdata) - data.depth = d - sections.pluslevel(t) + local numberdata= given.numberdata + if not numberdata then + -- probably simplified to nothing + numberdata = { } + given.numberdata = numberdata + end + local n = { } + for i=1,newdepth do + n[i] = numbers[i] + end + numberdata.numbers = n + if #ownnumbers > 0 then + numberdata.ownnumbers = table.fastcopy(ownnumbers) + end + given.references.section = sections.save(given) + -- given.numberdata = nil end function sections.writestatus() @@ -260,44 +289,6 @@ function sections.writestatus() end end -function sections.pluslevel(t) - -- data has saved level data - local numbers, ownnumbers, status, depth = data.numbers, data.ownnumbers, data.status, data.depth - local directives = t.directives - local resetter = sets.getall("structure:resets",data.block, (directives and directives.resetset) or "") ---~ if not (directives and directives.hidenumber) then - if t.metadata.increment then - if numbers[depth] then - numbers[depth] = numbers[depth] + 1 - else - numbers[depth] = 1 - end - end - for k, v in pairs(resetter) do -- sparse - if v > 0 and depth == v then - numbers[k] = 0 - end - end - status[depth] = t or { } - for k, v in pairs(data.checkers) do - if v[1] == depth and v[2] then - v[2](k) - end - end - local numberdata= t.numberdata - if not numberdata then - -- probably simplified to nothing - numberdata = { } - t.numberdata = numberdata - end - numberdata.numbers = table.fastcopy(numbers) - if #ownnumbers > 0 then - numberdata.ownnumbers = table.fastcopy(ownnumbers) - end - t.references.section = sections.save(t) ---~ t.numberdata = nil -end - function sections.setnumber(depth,n) local numbers, depth = data.numbers, data.depth local d = numbers[depth] @@ -331,7 +322,7 @@ function sections.cct() texsprint((metadata and metadata.catcodes) or ctxcatcodes) end -function sections.get(key,default,honorcatcodetable) +function sections.structuredata(key,default,honorcatcodetable) local data = data.status[data.depth] local d = data for k in key:gmatch("([^.]+)") do @@ -357,11 +348,14 @@ function sections.get(key,default,honorcatcodetable) end end -function sections.getuser(key,default) - local userdata = data.status[data.depth].userdata - local str = (userdata and userdata[key]) or default - if str then - texsprint(ctxcatcodes,str) +function sections.userdata(key,default) + if data.depth > 0 then + local userdata = data.status[data.depth] + userdata = userdata and userdata.userdata + userdata = (userdata and userdata[key]) or default + if userdata then + texsprint(ctxcatcodes,userdata) + end end end diff --git a/tex/context/base/strc-doc.mkiv b/tex/context/base/strc-doc.mkiv index 9d0d7c01c..637248929 100644 --- a/tex/context/base/strc-doc.mkiv +++ b/tex/context/base/strc-doc.mkiv @@ -34,14 +34,16 @@ \getparameters % initialization, used not grouped anyway [\??ns] - [\c!number=,\c!level=,\c!name=,\c!title=,\c!bookmark=,\c!label=,\c!coupling=,\c!ownnumber=, + [\c!number=,\c!level=,\c!name=,\c!title=,\c!bookmark=,\c!marking=,\c!list=,\c!label=,\c!coupling=,\c!ownnumber=, \c!sectionseparatorset=\s!default,\c!sectionconversionset=\s!default, \c!sectionstopper=,\c!sectionsegments=, - \c!reset=,\c!reference=, + \c!sectionresetset=,\c!reference=, \c!expansion=\v!no, \c!saveinlist=\v!yes, \c!command=\showstructuredata] +% maybe flags for list, bm, mark + \def\dostructurecomponent[#1][#2]% #1=interfaced-settings, #2=optional user data (not yet supported) {\begingroup \getparameters[\??ns][#1]% @@ -49,23 +51,38 @@ \xdef\currentstructurecoupling {\structureparameter\c!coupling}% \xdef\currentstructureownnumber{\structureparameter\c!ownnumber}% optional own number \xdef\currentstructurelevel {\structureparameter\c!level}% +\ifnum\catcodetable=\xmlcatcodes + \let\currentstructureexpansion\s!xml +\else \edef\currentstructureexpansion{\structureparameter\c!expansion} +\fi + \ifx\currentstructureexpansion\s!xml % goes via lua anyway \xdef\currentstructuretitle {\detokenizedstructureparameter\c!title}% \xdef\currentstructurebookmark{\detokenizedstructureparameter\c!bookmark}% + \xdef\currentstructuremarking {\detokenizedstructureparameter\c!marking}% + \xdef\currentstructurelist {\detokenizedstructureparameter\c!list}% + \ifx\currentstructurelist\empty + \globallet\currentstructurelist\currentstructuretitle + \else + \xmlstartraw + \xdef\currentstructurelist{\structureparameter\c!list}% + \xmlstopraw + \fi % - \xmlstartraw - \xdef\currentstructurelisttitle {\structureparameter\c!title}% - \xmlstopraw \globallet\currentstructurecoding\s!xml \else \ifx\currentstructureexpansion\v!yes \xdef\currentstructuretitle {\structureparameter\c!title}% \xdef\currentstructurebookmark{\structureparameter\c!bookmark}% + \xdef\currentstructuremarking {\structureparameter\c!marking}% + \xdef\currentstructurelist {\structureparameter\c!list}% \else \xdef\currentstructuretitle {\detokenizedstructureparameter\c!title}% \xdef\currentstructurebookmark{\detokenizedstructureparameter\c!bookmark}% + \xdef\currentstructuremarking {\detokenizedstructureparameter\c!marking}% + \xdef\currentstructurelist {\detokenizedstructureparameter\c!list}% \iflocation \ifx\currentstructurebookmark\empty \begingroup \simplifycommands @@ -73,7 +90,9 @@ \endgroup \fi \fi \fi - \globallet\currentstructurelisttitle \currentstructuretitle + \ifx\currentstructurelist\empty + \globallet\currentstructurelist\currentstructuretitle + \fi \globallet\currentstructurecoding\s!tex \fi \xdef\currentstructurelabel {\structureparameter\c!label}% @@ -92,7 +111,7 @@ referenceprefix = "\currentstructurereferenceprefix", }, directives = { - resetset = "\structureparameter\c!reset", + resetset = "\structureparameter\c!sectionresetset", }, metadata = { kind = "section", @@ -113,9 +132,14 @@ \ifx\currentstructurebookmark\currentstructuretitle \else bookmark = \!!bs\detokenize\expandafter{\currentstructurebookmark }\!!es, \fi - \ifx\currentstructurelisttitle\currentstructuretitle \else \ifx\currentstructuresaveinlist\v!no - list = \!!bs\detokenize\expandafter{\currentstructurelisttitle}\!!es, - \fi \fi + \ifx\currentstructuremarking\currentstructuretitle \else + marking = \!!bs\detokenize\expandafter{\currentstructuremarking }\!!es, + \fi + \ifx\currentstructuresaveinlist\v!no \else + \ifx\currentstructurelist\currentstructuretitle \else + list = \!!bs\detokenize\expandafter{\currentstructurelist}\!!es, + \fi + \fi }, numberdata = { block = "\currentstructureblock", @@ -142,9 +166,8 @@ hidenumber = \ifx\currentstructureshownumber\v!no true\else nil\fi, % titles \let\previousstructurecounter\!!zerocount \def\setstructuresynchronization#1% - {\xdef\currentstructuresynchronize - {\noexpand\ctxlua{jobreferences.setinternalreference("\currentstructurereferenceprefix","\currentstructurereference",\nextinternalreference)}% - \noexpand\ctxlatelua{structure.lists.enhance(#1)}}} + {\xdef\currentstructureattribute {\ctxlua {tex.write(jobreferences.setinternalreference("\currentstructurereferenceprefix","\currentstructurereference",\nextinternalreference,"\@@iafocus"))}}% + \xdef\currentstructuresynchronize{\ctxlatelua{structure.lists.enhance(#1)}}} \def\reportcurrentstructure{\ctxlua{structure.sections.writestatus()}} @@ -153,17 +176,32 @@ hidenumber = \ifx\currentstructureshownumber\v!no true\else nil\fi, % titles \def\showstructuredata {\par - \dontleavehmode + \dontleavehmode\begingroup \currentstructuresynchronize + \currentstructureattribute [\currentstructurename: \showstructurelevel: \currentstructuretitle] - \par} + \endgroup\par} % We can access the (stored) data with the following macros. - -\def\structurevalue #1{\ctxlua{structure.sections.get("#1")}} -\def\structureuservalue#1{\ctxlua{structure.sections.getuser("#1")}} -\def\structurenumber {\ctxlua{structure.sections.fullnumber()}} - -\def\structurecctvalue #1{\ctxlua{structure.sections.get("#1",nil,true)}} +% +% \def\MyHeadCommand #1#2{\framed{#1}\framed{#2 / \structureuservariable{subtitle}}} +% \def\MyListCommand#1#2#3{\externalfigure[\structurelistuservariable{figure}][height=5mm]#2} +% +% \setuphead[chapter][command=\MyHeadCommand] +% \setuplist[chapter][alternative=command,command=\MyListCommand] +% +% \starttext +% \setupheadertexts[chapter] +% \setupinteraction[state=start] +% \placebookmarks[chapter] +% \placelist[chapter] +% \startchapter[ownnumber=10,title=Ton,list=Hans,marking=Kees,bookmark=Bram][figure=cow.pdf,subtitle=oeps] +% \stopchapter +% \stoptext + +\def\structurevariable #1{\ctxlua{structure.sections.structuredata("#1")}} +\def\structureuservariable#1{\ctxlua{structure.sections.userdata("#1")}} +\def\structurenumber {\ctxlua{structure.sections.fullnumber()}} +\def\structurecatcodedget #1{\ctxlua{structure.sections.structuredata("#1",nil,true)}} % bad name \protect \endinput diff --git a/tex/context/base/strc-flt.mkiv b/tex/context/base/strc-flt.mkiv index 9a39b7f88..fc0b9ef3b 100644 --- a/tex/context/base/strc-flt.mkiv +++ b/tex/context/base/strc-flt.mkiv @@ -136,7 +136,6 @@ \c!radius=.5\bodyfontsize, \c!corner=\v!rectangular, \c!background=, - \c!backgroundscreen=, \c!backgroundcolor=, \c!backgroundoffset=\!!zeropoint, \c!topframe=, @@ -215,11 +214,11 @@ \newtoks\everysetupcaption \def\dosetupfloat[#1][#2]% - {\def\docommand##1{\getparameters[\??fl##1][#2]\the\everysetupfloat}% + {\def\docommand##1{\getparameters[\??fl##1][#2]\def\currentfloat{##1}\the\everysetupfloat}% \processcommalist[#1]\docommand} \def\dosetupcaption[#1][#2]% - {\def\docommand##1{\getparameters[\??kj##1][#2]\the\everysetupcaption}% + {\def\docommand##1{\getparameters[\??kj##1][#2]\def\currentfloat{##1}\the\everysetupcaption}% \processcommalist[#1]\docommand} \appendtoks @@ -349,9 +348,7 @@ \setgvalue{@fl@r@#1}% {\tracefloatnumber{#1}% \ifconditional\retainfloatnumber\else - % \dowritetolist{#1}{\getvalue{@fl@n@#1}}{#3}{#1}% - % \gdefconvertedargument\flasciititle{#3}% \asciititle is global - % \doifsomething{#2}{\rawreference\s!flt{#2}{{\getvalue{@fl@n@#1}}{\flasciititle}}}% + % todo \fi \letgvalue{@fl@r@#1}\relax}% nils \setgvalue{@fl@t@#1}% @@ -484,7 +481,7 @@ \let\twopassfloatdata\realpageno % used for odd/even determination, can be combined with nodelocation -\def\dosavefloatdata % \expanded +\def\dosavefloatdata % \expanded ... will change in mkiv {\doglobal\increment\noffloatdata \lazysavetaggedtwopassdata{\s!float\s!data}{\noffloatdata}{\noffloatpages}{\noexpand\realfolio}}% later {}{}{}{} and \getfirst... @@ -737,6 +734,11 @@ % todo: optional user pars +\def\floatcaptionattribute + {\iflocation \ifnofloatnumber \else \ifnofloatcaption \else + attr \destinationattribute \currentfloatattribute + \fi \fi \fi} + \long\def\docompletefloat#1#2#3#4#5% #1:floatclass #2:reference #3:optionlist #4:caption #5:box number {\presetfloatvariables{#1}{#3}{#2}{#5}% check this one \bgroup @@ -759,6 +761,7 @@ \c!reference=#2,\c!title={#4},\c!bookmark=]% []% \globallet\currentfloatnumber \laststructurecounternumber + \globallet\currentfloatattribute \laststructurecounterattribute \globallet\currentfloatsynchronize\laststructurecountersynchronize % % check float box @@ -770,7 +773,7 @@ \global\setbox\floatbox\vbox{\doemptyfloatblock{#1}}% \fi % deal with lack of caption - \global\setbox\floatbox\vbox + \global\setbox\floatbox\vbox \floatcaptionattribute {\doifelsemainfloatbody\currentfloatsynchronize\donothing \unvbox\floatbox \ifnofloatcaption @@ -993,29 +996,9 @@ \newdimen\floatwidth \newdimen\floatheight -% In \dofloatinfomessage wordt {{ }} gebruikt omdat anders -% binnen \startpostponing...\stoppostponing geen goede -% melding in de marge volgt: \ifinner is dan namelijk true. - -\def\dofloatinfomessage#1#2#3% - {\bgroup - \showmessage\m!floatblocks{#2}{#3}% - \setmessagetext\m!floatblocks{#2}% - \@EA\floatinfo\@EA#1\@EA{\currentmessagetext}% - \egroup} - -\def\dosavefloatinfo - {\dofloatinfomessage>2{\the\totalnoffloats}} - -\def\dofloatflushedinfo - {\bgroup - \!!counta\totalnoffloats - \advance\!!counta -\savednoffloats - \dofloatinfomessage<3{\the\!!counta}% - \egroup} - -\def\doinsertfloatinfo - {\dofloatinfomessage<4{\the\totalnoffloats}} +\def\dosavefloatinfo {\showmessage\m!floatblocks2{\the\totalnoffloats}} +\def\doinsertfloatinfo {\showmessage\m!floatblocks4{\the\totalnoffloats}} +\def\dofloatflushedinfo{\showmessage\m!floatblocks3{\the\numexpr\totalnoffloats-\savednoffloats\relax}} \def\dogetfloat {\ifsomefloatwaiting @@ -1185,32 +1168,6 @@ \ifx\somefacefloat\undefined \let\somefacefloat\doplacefloatbox \fi \ifx\sometextfloat\undefined \let\sometextfloat\doplacefloatbox \fi -% brr, wordt deze niet overladen in page-one? weg er mee - -% \def\somepagefloat[#1]% links, rechts, midden, hoog, midden, laag -% {%\checkwaitingfloats{#1}% -% \global\setbox\collectedpagefloats\vbox -% {\unvbox\collectedpagefloats -% \vbox to \textheight -% {\doifnotinset\v!high{#1}\vfill -% \box\floatbox -% \doifnotinset\v!low{#1}\vfill}% -% \goodbreak}% -% \doinsertfloatinfo} - -% \def\OTRONEsomepagefloat[#1]% -% {%\checkwaitingfloats{#1}% -% \global\setbox\collectedpagefloats\vbox -% {\ifvoid\collectedpagefloats\else\unvbox\collectedpagefloats\fi -% \vbox to \textheight % vss and unvbox catch too high and limited floats -% {\vss -% \doifnotinset\v!high{#1}\vfill -% \unvbox\floatbox -% \doifnotinset\v!low{#1}\vfill -% \vss}% -% \goodbreak}% -% \doinsertfloatinfo} - % test case: % % \placefigure[page,none]{}{\blackrule[width=\textwidth,height=0.9\textheight,color=green]} @@ -2016,8 +1973,7 @@ \edef\floatcaptiondirectives{\floatparameter\c!location,\floatcaptionparameter\c!location}% \ifparfloat\@EA\dosetparfloat\else\@EA\dosetpagfloat\fi{#1}{#2}{#3}% \setlocalfloatdimensions{#1}% - \setbox\floatbox\hbox - {\dosavefloatdata\restoretextcolor{\box\floatbox}}% + \setbox\floatbox\hbox{\dosavefloatdata\box\floatbox}% still needed? we will do renumbering differently \global\floatheight\ht\floatbox \global\advance\floatheight \dp\floatbox \global\floatwidth\wd\floatbox diff --git a/tex/context/base/strc-itm.mkii b/tex/context/base/strc-itm.mkii index 0148f83ca..d0afd13c8 100644 --- a/tex/context/base/strc-itm.mkii +++ b/tex/context/base/strc-itm.mkii @@ -151,6 +151,14 @@ \def\setitemparameter #1#2{\@EA\def\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} \def\letitemparameter #1#2{\@EA\let\csname\??op\currentitemgroup#1#2\endcsname} +% works ok but not needed (also possible compatibility problem) +% +% \def\getitemparameter#1#2% +% {\executeifdefined{\??op\currentitemgroup#1#2}% +% {\executeifdefined{\??op\currentitemgroup #2}% +% {\executeifdefined{\??oo #2}% +% {}}}} + % test this: saves hash entries and is also faster % % \let\doinitializeitemgrouplevel\gobbleoneargument % todo ! ! ! diff --git a/tex/context/base/strc-itm.mkiv b/tex/context/base/strc-itm.mkiv index dd639d72b..2abe54d50 100644 --- a/tex/context/base/strc-itm.mkiv +++ b/tex/context/base/strc-itm.mkiv @@ -67,30 +67,30 @@ \def\dohandleitemreference % we will make a decent number helper {\ifx\currentitemreference \empty \else \setnextinternalreference - \ctxlua { - jobreferences.set("\s!full", "\referenceprefix","\currentitemreference", - { - metadata = { - kind = "list", - catcodes = \the\catcodetable, - xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text - }, - references = { - internal = \nextinternalreference, - section = structure.sections.currentid(), - }, - numberdata = structure.helpers.simplify { - numbers = structure.counters.compact("\currentitemgroupcounter",nil,true), - separatorset = "\structurecounterparameter\currentitemgroupcounter\c!numberseparatorset", - conversion = "\structurecounterparameter\currentitemgroupcounter\c!numberconversion", - conversionset = "\structurecounterparameter\currentitemgroupcounter\c!numberconversionset", - % for the moment no stopper, we need to make references configurable first - % stopper = \!!bs\structurecounterparameter\currentitemgroupcounter\c!numberstopper\!!es, - segments = "\structurecounterparameter\currentitemgroupcounter\c!numbersegments", - }, - }) - jobreferences.setinternalreference("\referenceprefix","\currentitemreference",\nextinternalreference) + \ctxlua { jobreferences.setandgetattribute("\s!full", "\referenceprefix","\currentitemreference", + { + metadata = { + kind = "list", + catcodes = \the\catcodetable, + xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text + }, + references = { + internal = \nextinternalreference, + section = structure.sections.currentid(), + }, + numberdata = structure.helpers.simplify { + numbers = structure.counters.compact("\currentitemgroupcounter",nil,true), + separatorset = "\structurecounterparameter\currentitemgroupcounter\c!numberseparatorset", + conversion = "\structurecounterparameter\currentitemgroupcounter\c!numberconversion", + conversionset = "\structurecounterparameter\currentitemgroupcounter\c!numberconversionset", + % for the moment no stopper, we need to make references configurable first + % stopper = \!!bs\structurecounterparameter\currentitemgroupcounter\c!numberstopper\!!es, + segments = "\structurecounterparameter\currentitemgroupcounter\c!numbersegments", + }, + }) }% + \xdef\currentitemattribute{\number\lastdestinationattribute}% + \begingroup\dosetattribute{destination}\currentitemattribute\kern\zeropoint\endgroup % todo \fi} % \startitemize[n,packed] @@ -925,7 +925,7 @@ \fi \fi \doifsomething\doitemdestination - {\setbox\itemgroupitembox\hbox{\goto{\box\itemgroupitembox}[\doitemdestination]}}% + {\setbox\itemgroupitembox\hbox{\directgotobox{\box\itemgroupitembox}[\doitemdestination]}}% \globallet\doitemdestination\empty \itemgroupaskedwidth\getitemparameter\currentitemlevel\c!width\relax % new, prevents loops when symbol is (not yet found) graphic diff --git a/tex/context/base/core-lnt.tex b/tex/context/base/strc-lnt.mkii index ae3200e7a..ef09842cd 100644 --- a/tex/context/base/core-lnt.tex +++ b/tex/context/base/strc-lnt.mkii @@ -1,7 +1,7 @@ %D \module -%D [ file=core-lnt, +%D [ file=strc-lnt, %D version=2002.05.10, -%D title=\CONTEXT\ Core Macros, +%D title=\CONTEXT\ Structure Macros, %D subtitle=Line Notes, %D author=Hans Hagen, %D date=\currentdate, @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\writestatus{loading}{ConTeXt Core Macros / Line Notes} +\writestatus{loading}{ConTeXt Structure Macros / Line Notes} %D This module loads on top of the footnote and line numbering macros. diff --git a/tex/context/base/strc-lnt.mkiv b/tex/context/base/strc-lnt.mkiv new file mode 100644 index 000000000..d0816cfc7 --- /dev/null +++ b/tex/context/base/strc-lnt.mkiv @@ -0,0 +1,193 @@ +%D \module +%D [ file=strc-lnt, +%D version=2002.05.10, +%D title=\CONTEXT\ Structure Macros, +%D subtitle=Line Notes, +%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 Structure Macros / Line Notes} + +%D This module loads on top of the footnote and line numbering macros. + +\unprotect + +\newcounter\linenotecounter +\newtoks \collectedlinenotes +\newif \iftracelinenotes + +\appendtoks + \the\collectedlinenotes +\to \everylinenumber + +\appendtoks + \global\collectedlinenotes\emptytoks +\to \beforeeverylinenumbering + +\def\dohandlelinenote#1#2#3% + {\bgroup + \expanded{\beforesplitstring#2}\at--\to\linenotelinenumber + \ifnum\linenotelinenumber=\linenumber\relax + \def\linenotelinenumber##1{#2}% + \setupnote[#1][\c!numbercommand=\linenotelinenumber,\c!textcommand=\gobbleoneargument]% + \setnote[#1]{#3}% + \fi + \egroup} + +\def\dotracedlinenote#1% + {\iftracelinenotes + \hbox to \zeropoint + {\forgetall + \hsize\zeropoint + \hss + \vbox to \strutheight{\llap{\red\infofont\setstrut\linenotecounter}\vss}% + {\color[blue]{\vl}}% + \vbox to \strutheight{\rlap{\red\infofont\setstrut#1}\vss}% + \hss}% + \prewordbreak + \fi} + +\def\dolinenote#1#2% + {\doglobal\increment\linenotecounter + \doifreferencefoundelse{\??rr:\linenotecounter}% + {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote + {#1}{\currenttextreference}}{#2}\to\collectedlinenotes} + \donothing + \dotracedlinenote\empty + \expanded{\someline[\??rr:\linenotecounter]}} + +\def\dostartlinenote#1[#2]#3% + {\doifreferencefoundelse{\??rr:#2}% + {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote + {#1}{\currenttextreference}}{#3}\to\collectedlinenotes}% + {\unknownreference{#2}}% + \dotracedlinenote{#2}% + \startline[\??rr:#2]} + +\def\dostoplinenote#1[#2]% + {\stopline[\??rr:#2]} + +% defining them + +\def\definelinenote + {\dodoubleempty\dodefinelinenote} + +\def\dodefinelinenote[#1][#2]% + {\definenote[#1][#2]% + \setvalue {#1}{\dolinenote {#1}}% + \setvalue{\e!start#1}{\dostartlinenote{#1}}% + \setvalue{\e!stop #1}{\dostoplinenote {#1}}} + +\def\setuplinenote % convenient + {\setupnote} + +% We predefine one, namely \type {\linenote} cum suis. + +\definelinenote[\v!linenote] + +% \startbuffer[test] +% \startlinenumbering[100] +% test \linenote {oeps} test test test test test test +% test \startlinenote [well] {oeps} test test test test test test +% test \linenote {oeps} test test test test test test +% test \linenote {oeps} test test test test test test +% test \linenote {oeps} test test test test test test +% test \linenote {oeps} test test test test test test +% test \stoplinenote [well] test test test test test test +% \stoplinenumbering +% \stopbuffer +% +% \setupnotedefinition[linenote] [location=serried,distance=.5em] +% +% {\typebuffer[test] \getbuffer[test]} \page +% +% \startbuffer[setup] +% \setuplinenumbering +% [align=left] +% \stopbuffer +% +% {\typebuffer[setup] \getbuffer[setup,test]} \page +% +% \startbuffer[setup] +% \setuplinenumbering +% [width=1em, +% align=left] +% \stopbuffer +% +% {\typebuffer[setup] \getbuffer[setup,test]} \page +% +% \startbuffer[setup] +% \setuplinenumbering +% [width=2em, +% distance=.5em, +% align=left] +% \stopbuffer +% +% {\typebuffer[setup] \getbuffer[setup,test]} \page +% +% \startbuffer[setup] +% \setuplinenumbering +% [width=2em, +% align=middle] +% \stopbuffer +% +% {\typebuffer[setup] \getbuffer[setup,test]} \page +% +% \startbuffer[setup] +% \setuplinenumbering +% [conversion=romannumerals, +% start=1, +% step=1, +% location=text, +% style=slanted, +% color=blue, +% width=1.5em] +% \stopbuffer +% +% {\typebuffer[setup] \startnarrower\getbuffer[setup,test]\stopnarrower} \page +% +% \startbuffer[setup] +% \setuplinenumbering +% [width=4em, +% left=--, +% right=--, +% align=middle] +% \stopbuffer +% +% {\typebuffer[setup] \getbuffer[setup,test]} \page +% +% \startbuffer[setup-1] +% \setuplinenumbering +% [style=\bfxx, +% command=\WatchThis] +% \stopbuffer +% +% \startbuffer[setup-2] +% \def\WatchThis#1% +% {\ifodd\linenumber +% \definecolor[linecolor][red]% +% \else +% \definecolor[linecolor][green]% +% \fi +% \inframed +% [offset=1pt,frame=off,background=color,backgroundcolor=linecolor] +% {#1}} +% \stopbuffer +% +% {\typebuffer[setup-1,setup-2] \getbuffer[setup-1,setup-2,test]} \page +% +% \startbuffer[setup-1] +% \setuplinenumbering +% [location=inright, +% style=\bfxx, +% command=\WatchThis] +% \stopbuffer +% +% {\typebuffer[setup-1] \getbuffer[setup-1,setup-2,test]} \page + +\protect \endinput diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua index 07f551764..37c520306 100644 --- a/tex/context/base/strc-lst.lua +++ b/tex/context/base/strc-lst.lua @@ -12,7 +12,7 @@ if not modules then modules = { } end modules ['strc-lst'] = { -- shared cache [we can use a fast and stupid serializer] local format, tonumber = string.format, tonumber -local texsprint, texprint, texwrite, count = tex.sprint, tex.print, tex.write, tex.count +local texsprint, texprint, texwrite, texcount = tex.sprint, tex.print, tex.write, tex.count local ctxcatcodes = tex.ctxcatcodes @@ -40,7 +40,7 @@ local function initializer() -- create a cross reference between internal references -- and list entries local collected = lists.collected - local internals = lists.internals + local internals = jobreferences.internals local ordered = lists.ordered for i=1,#collected do local c = collected[i] @@ -105,7 +105,7 @@ function lists.enhance(n) -- save in the right order (happen sat shipout) lists.tobesaved[#lists.tobesaved+1] = l -- default enhancer (cross referencing) - l.references.realpage = count[0] + l.references.realpage = texcount.realpageno -- specific enhancer (kind of obsolete) local kind = l.metadata.kind local enhancer = kind and lists.enhancers[kind] @@ -240,7 +240,8 @@ local function filter_collected(names, criterium, number, collected) local cnumbers = sectionnumber.numbers local metadata = v.metadata if cnumbers then - if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers >= depth and cnumbers[depth] == number then +-- if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers >= depth and cnumbers[depth] == number then + if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers >= depth and (number == 0 or cnumbers[depth] == number) then result[#result+1] = v end end @@ -272,7 +273,7 @@ function lists.analyze(...) lists.result = lists.filter(...) end -function lists.userdata(name,r,tag) +function lists.userdata(name,r,tag) -- to tex local str = lists.result[r] str = str and str.userdata str = str and str[tag] @@ -281,7 +282,7 @@ function lists.userdata(name,r,tag) end end -function lists.uservalue(name,r,tag,default) +function lists.uservalue(name,r,tag,default) -- to lua local str = lists.result[r] str = str and str.userdata str = str and str[tag] @@ -311,7 +312,7 @@ function lists.title(name,n,tag) -- tag becomes obsolete if data then local titledata = data.titledata if titledata then - texsprint(ctxcatcodes,titledata[tag] or titledata.title or "") + texsprint(ctxcatcodes,titledata[tag] or titledata.list or titledata.title or "") end end end diff --git a/tex/context/base/strc-lst.mkiv b/tex/context/base/strc-lst.mkiv index 3f829dc20..e56f492c9 100644 --- a/tex/context/base/strc-lst.mkiv +++ b/tex/context/base/strc-lst.mkiv @@ -25,11 +25,6 @@ % auto refs to lists (chain) -> todo (\dododowritetolist) % todo: \normalexpanded{\noexpand\everylistentry\emptytoks\the\everylistentry}% \emptytoks, else loop -% \def\linklisttoelement#1#2#3#4{#4}% list location format page data - -\def\linklisttoelement#1#2#3#4% % list location format page data - {\gotonextinternal\currentlist{#1}{#3}{#4}} - % interface to lua % we have to deal with compatible processing, i.e. list elements that have two @@ -71,7 +66,6 @@ % handling - % The next code injects data into the list at the current level. \def\structurelistinject{\dotripleempty\dostructurelistinject} @@ -126,6 +120,9 @@ \def\structurelistsecond {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"second")}} +\def\structurelistuservariable#1% + {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"#1")}} + % \appendtoks % \to \everystructurelist @@ -523,17 +520,19 @@ {\listparameter\c!command{#3}{#4}{#5}} {[\currentlist: #3 -- #4 -- #5]}} +\def\domakelistelement#1#2#3#4% ref internal command data + {\dontleavehmode + \doifnot{\listparameter\c!interaction}{#1}\locationfalse + \iflocation + \directgotobox{\setlocationcolor\??ia#4}[internal(#2)]% + \else + #3{#4}% + \fi} + \def\dodofreelistelement#1#2#3#4#5#6#7#8% - {\def\makelistelement##1##2% - {\noindent % new and needed - \hbox - {\doifelse{\listparameter\c!interaction}{##1} % \??li ipv \??ia - {\setbox0\hbox{\showcontrastlocation{\??li\currentlist}{#6}{##2}}% - \linklisttoelement{#2}{#5}{#6}{\box0}}%{\copy0}}% - {##2}}}% - \listparameter\c!before% can be \hskip + {\listparameter\c!before% can be \hskip \doifdefinedelse{\??li#1\c!command} - {\makelistelement{\listparameter\c!interaction}% this forces all + {\domakelistelement{\listparameter\c!interaction}{#2}\hbox {\listparameter\c!command {#3}% geen conversies etc {#4}% geen conversies etc @@ -541,19 +540,19 @@ {#7% \vbox {\forgetall - \makelistelement\v!all + \domakelistelement\v!all{#2}\hbox {\doif{\listparameter\c!headnumber}\v!yes - {\makelistelement\v!sectionnumber + {\domakelistelement\v!sectionnumber{#2}\hbox {\donestedlistattributes\c!numberstyle\c!numbercolor {\listparameter\c!numbercommand{\currentlistsymbol}}}}% - \makelistelement\v!text + \domakelistelement\v!text{#2}\hbox {\donestedlistattributes\c!textstyle\c!textcolor {\let\\=\newlineinlist \dontconvertfont \listparameter\c!textcommand{#4}}}% \doif{\listparameter\c!pagenumber}\v!yes {\doifsomething{#5} - {\makelistelement\v!pagenumber + {\domakelistelement\v!pagenumber{#2}\hbox {\donestedlistattributes\c!pagestyle\c!pagecolor {\listparameter\c!pagecommand{#5}}}}}}}% #8}% @@ -594,16 +593,11 @@ {\!!widtha\listparameter\c!width}}% \getvalue{\??li\c!alternative\listparameter\c!alternative}% \endgraf - \def\makelistelement##1##2% - {\doifelse{\listparameter\c!interaction}{##1} - {\setbox0\hbox{\showcontrastlocation\??ia{#6}{##2}}% - \linklisttoelement{#2}{#5}{#6}{\box0}}%{\copy0}}% - {\hbox{##2}}}% \doif{\listparameter\c!interaction}\v!text % not supported ! ! ! ! ! ! text == all {\setlistparameter\currentlist\c!interaction\v!all}% % \dontleavehmode % new, else no margin, but wrong, better (else \indent as well): \noindent - \makelistelement\v!all + \domakelistelement\v!all{#2}\hbox {\setlocalhsize \hsize\localhsize \hbox to \hsize @@ -612,7 +606,7 @@ \!!widthb\hsize \doifelse{\listparameter\c!headnumber}\v!yes {\setbox2\hbox \ifdim\!!widtha>\zeropoint to \!!widtha \fi - {\makelistelement\v!sectionnumber + {\domakelistelement\v!sectionnumber{#2}\hbox {\donestedlistattributes\c!numberstyle\c!numbercolor {\listparameter\c!numbercommand{\currentlistsymbol}}% \hfill}}} @@ -624,7 +618,7 @@ {\doifsomething{#5} % \listwidth is new ; temp hack {\hbox \ifdim\listwidth>\zeropoint to \listwidth\fi {\hfill - \makelistelement\v!pagenumber + \domakelistelement\v!pagenumber{#2}\hbox {\donestedlistattributes\c!pagestyle\c!pagecolor {\listparameter\c!pagecommand{#5}}}}}}}% \vbox @@ -711,15 +705,10 @@ {\setlistparameter\currentlist\c!interaction\v!sectionnumber}% \doif{\listparameter\c!interaction}\v!all % not supported {\setlistparameter\currentlist\c!interaction\v!sectionnumber}% - \def\makelistelement##1##2% - {\doifelse{\listparameter\c!interaction}{##1} - {\setbox0\hbox{\showcontrastlocation\??ia{#6}{##2}}% - \linklisttoelement{#2}{#5}{#6}{\box0}}%{\copy0}}% - {\hbox{##2}}}% \setbox4\hbox {\doif{\listparameter\c!pagenumber}\v!yes {\doifsomething{#5} - {\makelistelement\v!pagenumber + {\domakelistelement\v!pagenumber{#2}\hbox {\donestedlistattributes\c!pagestyle\c!pagecolor {\listparameter\c!pagecommand{#5}}}}}}% \doif{\listparameter\c!headnumber}\v!yes @@ -729,7 +718,7 @@ \ifdone \hbox {\listparameter\c!left - \makelistelement\v!sectionnumber + \domakelistelement\v!sectionnumber{#2}\hbox {\donestedlistattributes\c!numberstyle\c!numbercolor {\listparameter\c!numbercommand{\currentlistsymbol}}}% \listparameter\c!right @@ -777,12 +766,7 @@ \def\dodofixdlistelementEFG#1#2#3#4#5#6#7#8% {\noindent \bgroup - \def\makelistelement##1##2% isolated by Wolfgang Schuster - {\doifelse{\listparameter\c!interaction}{##1} - {#2{##2}} - {\setbox0\hbox{#2{\showcontrastlocation\??ia{#8}{##2}}}% - \linklisttoelement{#4}{#7}{#8}{\box0}}}% - \makelistelement\v!no + \domakelistelement\v!no{#4}{#2}% {\let\\=\newlineinlist #1% in case E nils the strut (still needed?) \dosetlistattributes\c!style\c!color diff --git a/tex/context/base/strc-mar.lua b/tex/context/base/strc-mar.lua index 14eac8c2c..f0d6df314 100644 --- a/tex/context/base/strc-mar.lua +++ b/tex/context/base/strc-mar.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['strc-mar'] = { structure.marks = structure.marks or { } function structure.marks.title(tag,n) - structure.lists.savedtitle(tag,n,"mark") + structure.lists.savedtitle(tag,n,"marking") end function structure.marks.number(tag,n) -- no spec diff --git a/tex/context/base/strc-mat.mkiv b/tex/context/base/strc-mat.mkiv index 482426b48..097b1d710 100644 --- a/tex/context/base/strc-mat.mkiv +++ b/tex/context/base/strc-mat.mkiv @@ -50,7 +50,7 @@ [\v!formula] [\c!numberconversionset=\v!formula] -\def\storecurrentformulanumber#1#2#3% ref, todo:str, \sync % todo: title etc (like float) +\def\storecurrentformulanumber#1#2#3#4% ref, todo:str, \sync % todo: title etc (like float) {\dostructurecountercomponent {formula}% \getfloatparameters @@ -64,7 +64,8 @@ \c!reference=#1,\c!title=,\c!bookmark=]% [#2]% \globallet\currentformulanumber\laststructurecounternumber - \globallet#3\laststructurecountersynchronize} + \globallet#3\laststructurecountersynchronize + \globallet#4\laststructurecounterattribute} \def\thecurrentformulanumber {%\ifnoformulacaption \else \ifnoformulanumber \else @@ -72,13 +73,10 @@ }%\fi \fi} \def\placecurrentformulanumber - {\currentformulassynchronize - \currentformulasynchronize - \currentsubformulasynchronize - \thecurrentformulanumber} %\convertedstructurecounter[\v!formula]\relax} - -\def\doformulareference#1#2% - {\doifsomething{#1}{\doifnotinset{#1}{+,-}{\rawreference\s!for{#1}{#2}}}} + {\currentformulassynchronize \currentformulasattribute % todo + \currentformulasynchronize \currentformulasattribute % todo + \currentsubformulasynchronize \currentsubformulaattribute % todo + \thecurrentformulanumber} \def\doformulanumber {\dotripleempty\dodoformulanumber} @@ -88,8 +86,9 @@ \let\subformulasreference\empty % temp hack -\let\currentformulasynchronize \relax -\let\currentformulassynchronize\relax +\let\currentformulasynchronize \relax \let\currentformulaattribute \relax +\let\currentsubformulasynchronize\relax \let\currentsubformulaattribute\relax +\let\currentformulassynchronize \relax \let\currentformulasattribute \relax \def\dododoformulanumber#1#2#3#4% (#1,#2)=outer(ref,sub) (#3,#4)=inner(ref,sub) {\hbox\bgroup @@ -110,8 +109,9 @@ \edef\currentformulareference{#1}% \ifx\currentformulareference\empty \glet\currentformulasynchronize\relax + \glet\currentformulaattribute \relax \else - \storecurrentformulanumber\currentformulareference\empty\currentformulasynchronize + \storecurrentformulanumber\currentformulareference\empty\currentformulasynchronize\currentformulaattribute \fi % subcounter \setbox0\hbox{\ignorespaces#4\unskip}% @@ -121,8 +121,9 @@ \edef\currentsubformulareference{#3}% \ifx\currentsubformulareference\empty \glet\currentsubformulasynchronize\relax + \glet\currentsubformulaattribute \relax \else - \storecurrentformulanumber\currentsubformulareference\empty\currentsubformulasynchronize + \storecurrentformulanumber\currentsubformulareference\empty\currentsubformulasynchronize\currentsubformulaattribute \fi % \rm % nodig ? @@ -546,8 +547,9 @@ \edef\subformulasreference{#1}% messy \ifx\subformulasreference\empty \glet\currentformulassynchronize\relax + \glet\currentformulasattribute \relax \else - \storecurrentformulanumber\subformulasreference\empty\currentformulassynchronize + \storecurrentformulanumber\subformulasreference\empty\currentformulassynchronize\currentformulasattribute \fi \fi \settrue\insidesubformulas} diff --git a/tex/context/base/strc-not.lua b/tex/context/base/strc-not.lua index 115de7b9d..32a836ba8 100644 --- a/tex/context/base/strc-not.lua +++ b/tex/context/base/strc-not.lua @@ -8,10 +8,12 @@ if not modules then modules = { } end modules ['strc-not'] = { local format = string.format local next = next -local texsprint, texwrite = tex.sprint, tex.write +local texsprint, texwrite, texcount = tex.sprint, tex.write, tex.count local ctxcatcodes = tex.ctxcatcodes +local trace_notes = false trackers.register("structure.notes", function(v) trace_notes = v end) + structure = structure or { } structure.helpers = structure.helpers or { } structure.lists = structure.lists or { } @@ -41,11 +43,14 @@ function notes.store(tag,n) nd = { } notedata[tag] = nd end - nd[#nd+1] = n + local nnd = #nd+1 + nd[nnd] = n local state = notestates[tag] if state.kind ~= "insert" then ---~ state.start = #nd - state.start = state.start or #nd + if trace_notes then + logs.report("notes","storing %s with state %s as %s",tag,state.kind,nnd) + end + state.start = state.start or nnd end tex.write(#nd) end @@ -53,8 +58,12 @@ end function notes.get(tag,n) local nd = notedata[tag] if nd then - nd = nd[n or #notedata] + n = n or #notedata + nd = nd[n or n] if nd then + if trace_notes then + logs.report("notes","getting %s of %s",n,tag) + end return structure.lists.collected[nd] end end @@ -86,6 +95,9 @@ end function notes.setstate(tag,newkind) local state = notestates[tag] + if trace_notes then + logs.report("notes","setting state of %s from %s to %s",tag,(state and state.kind) or "unset",newkind) + end if not state then state = { kind = newkind @@ -98,6 +110,7 @@ function notes.setstate(tag,newkind) else state.kind = newkind end + -- state.start can already be set and will be set when an entry is added or flushed return state end @@ -128,7 +141,8 @@ local function internal(tag,n) local r = nd.references if r then local i = r.internal - return i and lists.internals[i] +--~ return i and lists.internals[i] + return i and jobreferences.internals[i] end end return nil @@ -152,7 +166,7 @@ function notes.checkpagechange(tag) -- called before increment ! end elseif current then -- we need to locate the next one, best guess - if tex.count[0] > current.pagenumber.number then + if texcount.realpageno > current.pagenumber.number then counters.reset(tag) end end @@ -187,6 +201,9 @@ function notes.deltapage(tag,n) end function notes.postpone() + if trace_notes then + logs.report("notes","postponing all insert notes") + end for tag, state in next, notestates do if state.kind ~= "store" then notes.setstate(tag,"postpone") @@ -197,7 +214,7 @@ end function notes.setsymbolpage(tag,n) local nd = notes.get(tag,n) if nd then - nd.metadata.symbolpage = tex.count[0] -- realpage + nd.metadata.symbolpage = texcount.realpageno end end @@ -216,26 +233,59 @@ function notes.getnumberpage(tag,n) end function notes.flush(tag,whatkind) -- store and postpone - local nd = notedata[tag] - if nd then - local state = notestates[tag] - local ns = state and state.start -- first index - if ns then - local kind = state.kind - if kind == whatkind then - if kind == "postpone" then - for i=ns,#nd do - texsprint(ctxcatcodes,format("\\handlenoteinsert{%s}{%s}",tag,i)) - end - state.start = nil - state.kind = "insert" - elseif kind == "store" then - for i=ns,#nd do - texsprint(ctxcatcodes,format("\\handlenoteitself{%s}{%s}",tag,i)) - end - state.start = nil + local state = notestates[tag] + local kind = state.kind + if kind == whatkind then + if kind == "postpone" then + local nd = notedata[tag] + local ns = state.start -- first index + if nd and ns then + if trace_notes then + logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd) + end + for i=ns,#nd do + texsprint(ctxcatcodes,format("\\handlenoteinsert{%s}{%s}",tag,i)) + end + end + state.start = nil + state.kind = "insert" + elseif kind == "store" then + local nd = notedata[tag] + local ns = state.start -- first index + if trace_notes then + logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd) + end + if nd and ns then + for i=ns,#nd do + texsprint(ctxcatcodes,format("\\handlenoteitself{%s}{%s}",tag,i)) end end + state.start = nil + elseif trace_notes then + logs.report("notes","not flushing state %s of %s",whatkind,tag) + end + elseif trace_notes then + logs.report("notes","not flushing state %s of %s",whatkind,tag) + end +end + +function notes.flushpostponed() + if trace_notes then + logs.report("notes","flushing all postponed notes") + end + for tag, _ in next, notestates do + notes.flush(tag,"postpone") + end +end + +function notes.resetpostponed() + if trace_notes then + logs.report("notes","resetting all postponed notes") + end + for tag, state in next, notestates do + if state.kind == "postpone" then + state.start = nil + state.kind = "insert" end end end diff --git a/tex/context/base/strc-not.mkiv b/tex/context/base/strc-not.mkiv index 7dc998451..d432deb30 100644 --- a/tex/context/base/strc-not.mkiv +++ b/tex/context/base/strc-not.mkiv @@ -86,7 +86,11 @@ \newif\ifnotesenabled \notesenabledtrue -\appendtoks \notesenabledfalse \to \everymarking +% better mark a note .. once flushed no more flushing + +%appendtoks \notesenabledfalse \to \everymarking +\appendtoks \notesenabledfalse \to \everypagebody +\appendtoks \notesenabledfalse \to \everystructurelist % quick hack %D Often we need to process the whole set of notes and to make that %D fast, we use a token register: @@ -94,7 +98,7 @@ \newtoks\tobeprocessednotes \def\processnotes#1% #1: \macro that uses \currentnote - {\def\doprocesssomenote##1{\edef\currentdescription{##1}\edef\currentnote{##1}#1}% + {\def\doprocesssomenote##1{\edef\currentnote{##1}\let\currentdescription\currentnote#1}% \the\tobeprocessednotes} %D Notes have their own paremater handlers. The complication here @@ -106,6 +110,8 @@ \def\noteparameter #1{\csname\donoteparameter{\??vn\currentnote}#1\endcsname} \def\noteparameterhash#1{\donoteparameterhash {\??vn\currentnote}#1} +\def\namednoteparameter#1#2{\csname\donoteparameter{\??vn#1}#2\endcsname} + \def\donoteparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\donoteparentparameter \csname#1\s!parent\endcsname#2\fi} \def\donoteparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\donoteparentparameterhash\csname#1\s!parent\endcsname#2\fi} @@ -239,7 +245,8 @@ \definestructurecounter [\currentnote]% \ctxlua{structure.notes.define("\currentnote","insert",\number\csname\??vn:\currentnote\endcsname)}% - \the\everysetupnote} + \the\everysetupnote + \dochecknote} \let\setupnotedefinition\setupenumerations @@ -247,6 +254,11 @@ \setupenumerations[\currentnote][]% \to \everysetupnote +% \appendtoks +% \dochecknote +% \to \everysetupnote + + \def\setupnote {\dodoubleempty\dosetupnote} @@ -309,8 +321,8 @@ \def\s!notefmt{nodefmt} % 1 text \def\s!notecol{nodecol} -\def\clevernotes % compatibility hack - {\numexpr\ifcase\noteparameter\s!noteloc\or0\or2\or2\or1\else0\fi\relax} +\def\clevernotes % compatibility hack, will be redone + {\numexpr\ifcase\namednoteparameter\v!footnote\s!noteloc\or0\or2\or2\or1\else0\fi\relax} \def\setnotelocation #1{\expandafter\chardef\csname\??vn\currentnote\s!noteloc\endcsname#1\relax} \def\setnoteposition #1{\expandafter\chardef\csname\??vn\currentnote\s!notepos\endcsname#1\relax} @@ -319,21 +331,22 @@ \def\currentnofcolumns{\@@kln} +\setvalue{\??vn @\v!page }{\setnotelocation\plusone} +\setvalue{\??vn @\v!columns }{\setnotelocation\plustwo} +\setvalue{\??vn @\v!firstcolumn}{\setnotelocation\plusthree} +\setvalue{\??vn @\v!lastcolumn }{\setnotelocation\plusfour} +\setvalue{\??vn @\v!none }{\setnotelocation\plusfive} +\setvalue{\??vn @\v!text }{\setnotelocation\plusfive \setnoteformatting\plusone} % test +\setvalue{\??vn @\v!high }{\setnoteposition\plusone} +\setvalue{\??vn @\v!bottom }{\setnoteposition\plustwo} + +\def\dosetcheckednote#1{\csname\??vn @#1\endcsname} + \def\dochecknote {% node states \setnotelocation\plusone \setnoteposition\plustwo - \processallactionsinset - [\noteparameter\c!location] - [ \v!page=>\setnotelocation \plusone, - \v!columns=>\setnotelocation \plustwo, - \v!firstcolumn=>\setnotelocation \plusthree, - \v!lastcolumn=>\setnotelocation \plusfour, - \v!none=>\setnotelocation \plusfive, - \v!text=>\setnotelocation \plusfive - \setnoteformatting\plusone, % test - \v!high=>\setnoteposition \plusone, - \v!bottom=>\setnoteposition \plustwo]% + \normalexpanded{\noexpand\rawprocesscommalist[\noteparameter\c!location]}\dosetcheckednote % compatibility hack \ifnum\noteparameter\s!noteloc=\plusfive \endnotestrue \else \endnotesfalse \fi \ifnum\noteparameter\s!notepos=\plustwo \bottomnotestrue \else \bottomnotesfalse \fi @@ -383,8 +396,10 @@ \global\skip \currentnoteins\zeropoint \fi} -\def\checknotes - {\processnotes\dochecknote} +% \def\checknotes +% {\processnotes\dochecknote} + +\let\checknotes\relax % experiment, avoiding this saves a lot of time % D When \type{n} exceeds~1, footnotes are typeset in % D multi||columns, using the algoritm presented on page~397 @@ -505,35 +520,37 @@ \newconditional\skipnoteplacement \def\@@notemakedescription[#1]#2#3% todo ... proper [key=value] etc - {\begingroup - \doenumerationcheckconditions - \let\currentnote\currentdescriptionmain - \dodescriptioncomponent[\c!reference=#1,\c!label={\descriptionparameter\c!text},\c!title={#3},\c!bookmark=,][]% - \xdef\currentnotenumber{\ctxlua{structure.notes.store("\currentnote",\currentdescriptionnumberentry)}}% - \settrue\processingnote - \ifconditional\skipnoteplacement - \globallet\lastnotesymbol\dolastnotesymbol - \else - \iftypesettinglines % otherwise problems with \type <crlf> {xxx} - \ignorelines % makes footnotes work in \startlines ... \stoplines + {\ifnotesenabled + \begingroup + \doenumerationcheckconditions + \let\currentnote\currentdescriptionmain + \dodescriptioncomponent[\c!reference=#1,\c!label={\descriptionparameter\c!text},\c!title={#3},\c!bookmark=,][]% + \xdef\currentnotenumber{\ctxlua{structure.notes.store("\currentnote",\currentdescriptionnumberentry)}}% + \settrue\processingnote + \ifconditional\skipnoteplacement + \globallet\lastnotesymbol\dolastnotesymbol + \else + \iftypesettinglines % otherwise problems with \type <crlf> {xxx} + \ignorelines % makes footnotes work in \startlines ... \stoplines + \fi + \ifnotesymbol + \dolastnotesymbol + \else + \unskip\unskip + \globallet\lastnotesymbol\dolastnotesymbol + \fi \fi - \ifnotesymbol - \dolastnotesymbol + \ifconditional\postponingnotes + \global\settrue\postponednote \else - \unskip\unskip - \globallet\lastnotesymbol\dolastnotesymbol + \handlenoteinsert\currentnote\currentnotenumber \fi - \fi - \ifconditional\postponingnotes - \global\settrue\postponednote - \else - \handlenoteinsert\currentnote\currentnotenumber - \fi - \ifconditional\skipnoteplacement \else - \kern\notesignal\relax % \relax is needed to honor spaces - \iftrialtypesetting \else \global\setfalse\skipnoteplacement \fi - \fi - \endgroup} + \ifconditional\skipnoteplacement \else + \kern\notesignal\relax % \relax is needed to honor spaces + \iftrialtypesetting \else \global\setfalse\skipnoteplacement \fi + \fi + \endgroup + \fi} \def\dolastnotesymbol{\typesetsomenotesymbol\currentnote\currentnotenumber} @@ -552,7 +569,7 @@ \nobreak \doifelse{\noteparameter\c!interaction}\v!no {\dotypesetsomenotesymbol{#1}{#2}} - {\gotobox{\dotypesetsomenotesymbol{#1}{#2}}[page(\ctxlua{structure.notes.getnumberpage("#1",\number#2)})]}% f: + {\directgotobox{\dotypesetsomenotesymbol{#1}{#2}}[page(\ctxlua{structure.notes.getnumberpage("#1",\number#2)})]}% f: \globallet\lastnotesymbol\relax} \def\currentnotedescriptiontext % todo: can be other number @@ -561,7 +578,7 @@ \def\currentnoteenumerationfullnumber {\doifelse{\noteparameter\c!interaction}\v!no {\docurrentnoteenumerationfullnumber}% - {\gotobox + {\directgotobox {\docurrentnoteenumerationfullnumber}% [page(\ctxlua{structure.notes.getsymbolpage("\currentnote",\currentdescriptionnumberentry)})]}} @@ -632,7 +649,7 @@ \newtoks\everyafternoteinsert \appendtoks - \let\doflushnotes\relax + \let\flushnotes\relax \let\postponenotes\relax \forgetall \to \everybeforenoteinsert @@ -782,52 +799,19 @@ \ctxlua{structure.notes.postpone()}% \fi} -% \def\flushnotes -% {\ifconditional\processingnote \else -% \ifconditional\postponednote -% \ifinner \else -% \ifinpagebody \else -% %ifvmode % less interference, but also less secure -% \doflushnotes -% %fi -% \fi -% \fi -% \fi -% \fi} - \def\flushnotes - {\ifconditional\postponednote + {\ifconditional\postponingnotes \flushnotesindeed \fi} \def\flushnotesindeed - {\ifconditional\processingnote \else - \ifinner \else - \ifinpagebody \else - %ifvmode % less interference, but also less secure - \doflushnotes - %fi - \fi - \fi - \fi} - -\def\doflushnotes % also called directly, \ifvoid is needed ! {\begingroup - \let\doflushnotes\relax + \let\flushnotes \relax \let\postponenotes\relax - \ifconditional\processingnote \else - \ifconditional\postponednote - \processnotes\dodoflushnotes - \global\setfalse\postponednote - \setfalse\postponingnotes - \fi - \fi - \endgroup} - -\def\dodoflushnotes % per class, todo: handle endnotes here - {%\writestatus{notes}{flushing \currentnote}% + \ctxlua{structure.notes.flushpostponed()}% this also resets the states ! + \global\setfalse\postponednote \global\setfalse\postponingnotes - \ctxlua{structure.notes.flush("\currentnote","postpone")}} + \endgroup} %D \macros %D {startlocalfootnotes,placelocalfootnotes} @@ -843,7 +827,7 @@ \newtoks\everyplacelocalnotes \appendtoks - \let\doflushnotes\relax + \let\flushnotes \relax \let\postponenotes\relax \to \everyplacelocalnotes @@ -1003,6 +987,8 @@ %D \macros %D {fakenotes} + % is this ok? endnotes and such + \def\fakenotes {\ifhmode\endgraf\fi\ifvmode \calculatetotalclevernoteheight @@ -1123,8 +1109,6 @@ \def\placelocalfootnotes {\dodoubleempty\doplacelocalfootnotes[\v!footnote]} \def\startlocalfootnotes {\startlocalnotes [\v!footnote]} % alleen footnote \def\stoplocalfootnotes {\stoplocalnotes } - \def\flushfootnotes {\flushnotes} - \def\doflushfootnotes {\doflushnotes} \def\doplacefootnotes [#1][#2]{\ifsecondargument\placenotes [#1][#2,\c!height=\textheight]\else\placenotes [#1]\fi} \def\doplacelocalfootnotes[#1][#2]{\ifsecondargument\placelocalnotes[#1][#2,\c!height=\textheight]\else\placelocalnotes[#1]\fi} diff --git a/tex/context/base/strc-num.lua b/tex/context/base/strc-num.lua index 8918346c6..b80c27f3c 100644 --- a/tex/context/base/strc-num.lua +++ b/tex/context/base/strc-num.lua @@ -8,7 +8,8 @@ if not modules then modules = { } end modules ['strc-num'] = { local format = string.format local next, type = next, type -local texsprint = tex.sprint +local min, max = math.min, math.max +local texsprint, texcount = tex.sprint, tex.count structure = structure or { } structure.helpers = structure.helpers or { } @@ -71,15 +72,29 @@ local function constructor(t,s,name,i) return t.stop end elseif s == "first" then - if t.offset then + if t.start > 0 then + return t.start -- brrr + elseif t.offset then return t.start + t.step + 1 else return t.start + 1 end elseif s == "prev" or s == "previous" then - return math.max(t.first,t.number-1) -- todo: step + return max(t.first,t.number-1) -- todo: step elseif s == "next" then - return math.min(t.last,t.number+1) -- todo: step + return min(t.last,t.number+1) -- todo: step + elseif s == "backward" then + if t.number - 1 < t.first then + return t.last + else + return t.previous + end + elseif s == "forward" then + if t.number + 1 > t.last then + return t.first + else + return t.next + end elseif s == "subs" then local cc = collected[name] t.subs = (cc and cc[i+1] and cc[i+1][t.range]) or 0 @@ -134,6 +149,10 @@ local function allocate(name,i) return ci end +function counters.record(name,i) + return allocate(name,i or 1) +end + local function savevalue(name,i) local cd = counterdata[name].data[i] local cs = tobesaved[name][i] @@ -148,8 +167,8 @@ end function counters.define(name, start, counter) -- todo: step local d = allocate(name,1) d.start = start - if counter and counter > 0 then - d.counter = counter -- only for special purposes + if counter ~= "" then + d.counter = counter -- only for special purposes, cannot be false end end @@ -248,7 +267,7 @@ function counters.reset(name,n) savevalue(name,i) d.number = d.start or 0 d.own = nil - -- if d.counter then tex.count[d.counter] = d.number end + if d.counter then texcount[d.counter] = d.number end end cd.numbers = nil end @@ -260,7 +279,7 @@ function counters.set(name,n,value) local d = allocate(name,n) d.number = value or 0 d.own = nil - -- if d.counter then tex.count[d.counter] = d.number end + if d.counter then texcount[d.counter] = d.number end end end @@ -270,7 +289,7 @@ local function check(name,data,start,stop) savevalue(name,i) d.number = d.start or 0 d.own = nil - -- if d.counter then tex.count[d.counter] = d.number end + if d.counter then texcount[d.counter] = d.number end end end @@ -283,6 +302,7 @@ function counters.setown(name,n,value) if cd.level and cd.level > 0 then -- 0 is signal that we reset manually check(name,data,n+1) -- where is check defined end + if d.counter then texcount[d.counter] = d.number end end end @@ -322,6 +342,7 @@ function counters.add(name,n,delta) if cd.level and cd.level > 0 then -- 0 is signal that we reset manually check(name,data,n+1) end + if d.counter then texcount[d.counter] = d.number end return d.number end return 0 diff --git a/tex/context/base/strc-num.mkiv b/tex/context/base/strc-num.mkiv index 6498b4e55..eb2f441fd 100644 --- a/tex/context/base/strc-num.mkiv +++ b/tex/context/base/strc-num.mkiv @@ -93,13 +93,8 @@ {\donodefinestructurecounter[#1][#2]}}} \def\dododefinestructurecounter[#1][#2]% - {\getparameters - [\??nn#1] - [\s!counter=,#2]% counter is for internal purposes - \ctxlua{structure.counters.define("#1", - tonumber("\structurecounterparameter{#1}\c!start") or 0, - tonumber("\structurecounterparameter{#1}\s!counter") or 0 - )}% + {\getparameters[\??nn#1][\s!counter=,#2]% counter is for internal purposes + \ctxlua{structure.counters.define("#1",tonumber("\structurecounterparameter{#1}\c!start") or 0,"\structurecounterparameter{#1}\s!counter")}% \docheckstructurecountersetup{#1}} \def\donodefinestructurecounter[#1][#2]% inherit @@ -227,6 +222,32 @@ )}% \endgroup} +\def\directconvertedstructurecounter#1#2% name, type + {\begingroup + \ctxlua{structure.counters.prefixedconverted( + "\@@thestructurecounter{#1}", + { + prefix = "\structurecounterparameter{#1}\c!prefix", + separatorset = "\structurecounterparameter{#1}\c!prefixseparatorset", + conversion = "\structurecounterparameter{#1}\c!prefixconversion", + conversionset = "\structurecounterparameter{#1}\c!prefixconversionset", + stopper = \!!bs\structurecounterparameter{#1}\c!prefixstopper\!!es, + set = "\structurecounterparameter{#1}\c!prefixset", + segments = "\structurecounterparameter{#1}\c!prefixsegments", + connector = \!!bs\structurecounterparameter{#1}\c!prefixconnector\!!es, + }, + { + order = "\structurecounterparameter{#1}\c!numberorder", + separatorset = "\structurecounterparameter{#1}\c!numberseparatorset", + conversion = \!!bs\structurecounterparameter{#1}\c!numberconversion\!!es, + conversionset = "\structurecounterparameter{#1}\c!numberconversionset", + stopper = \!!bs\structurecounterparameter{#1}\c!numberstopper\!!es, + segments = "\structurecounterparameter{#1}\c!numbersegments", + type = "#2", + } + )}% + \endgroup} + \def\convertedsubstructurecounter {\dotripleempty\doconvertedsubstructurecounter} @@ -414,11 +435,11 @@ userdata = structure.helpers.touserdata(\!!bs\detokenize{#9}\!!es) } }}% - \xdef\laststructurecountersynchronize % make this a macro because shared - {\noexpand\ctxlua{jobreferences.setinternalreference(nil,nil,\nextinternalreference)}% - \noexpand\ctxlatelua{structure.lists.enhance(\laststructurecounternumber)}}% + \xdef\laststructurecounterattribute {\ctxlua {tex.write(jobreferences.setinternalreference(nil,nil,\nextinternalreference))}}% + \xdef\laststructurecountersynchronize{\ctxlatelua{structure.lists.enhance(\laststructurecounternumber)}}% \else \glet\laststructurecounternumber \relax + \glet\laststructurecounterattribute \relax \glet\laststructurecountersynchronize\relax \fi \endgroup} diff --git a/tex/context/base/strc-pag.lua b/tex/context/base/strc-pag.lua index bb2de7881..b95f0842a 100644 --- a/tex/context/base/strc-pag.lua +++ b/tex/context/base/strc-pag.lua @@ -6,10 +6,10 @@ if not modules then modules = { } end modules ['strc-pag'] = { license = "see context related readme files" } -local count, format = tex.count, string.format +local texcount, format = tex.count, string.format local ctxcatcodes = tex.ctxcatcodes -local texsprint = tex.sprint +local texsprint, texwrite = tex.sprint, tex.write structure.pages = structure.pages or { } @@ -38,7 +38,7 @@ job.register('jobpages.collected', jobpages.tobesaved, initializer) local specification = { } function pages.save(userspec) - local realpage, userpage = count[0], count[1] + local realpage, userpage = texcount.realpageno, texcount.userpageno local data = { number = userpage, specification = helpers.simplify(userspec or specification), @@ -61,9 +61,9 @@ function pages.pagenumber(localspec) end end if deltaspec then - return { realpage = count[0], specification = deltaspec } + return { realpage = texcount.realpageno, specification = deltaspec } else - return { realpage = count[0] } + return { realpage = texcount.realpageno } end end @@ -142,7 +142,8 @@ end function helpers.prefixpage(data,prefixspec,pagespec) if data then - local pagedata, prefixdata = pages.analyse(data,pagespec) + local pagedata, prefixdata, e = pages.analyse(data,pagespec) +--~ tex.write(e) if pagedata then if prefixdata then sections.typesetnumber(prefixdata,"prefix",prefixspec or false,prefixdata or false,pagedata.specification or false) @@ -156,7 +157,7 @@ function helpers.prefixlastpage(data,prefixspec,pagespec) if data then local r = data.references local ls, lr = r.section, r.realpage - r.section, r.realpage = r.lastsection, r.lastrealpage + r.section, r.realpage = r.lastsection or r.section, r.lastrealpage or r.realpage helpers.prefixpage(data,prefixspec,pagespec) r.section, r.realpage = ls, lr end diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv index b4286f970..276cf8b78 100644 --- a/tex/context/base/strc-pag.mkiv +++ b/tex/context/base/strc-pag.mkiv @@ -20,9 +20,6 @@ % Hacks: \let\preparepageprefix\gobbleoneargument -\let\checkrealpage \relax -\let\checksubpages \relax -\let\setpagecounters \relax % Allocation: @@ -58,9 +55,9 @@ % prefixset=mine, % prefixseparatorset=mine] -\definestructurecounter[\s!realpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=] % [\s!counter=0] -\definestructurecounter[\s!userpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=] % [\s!counter=1] -\definestructurecounter[\s!subpage] [\c!prefix=\v!no,\c!start=1,\c!prefixsegments=] % [\s!counter=2] +\definestructurecounter[\s!realpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=] % \c!counter=realpage +\definestructurecounter[\s!userpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=] % \c!counter=userpage +\definestructurecounter[\s!subpage] [\c!prefix=\v!no,\c!start=1,\c!prefixsegments=] % \c!counter=subpage \newtoks\everysetuprealpagenumber % todo: set state: none, start, stop, reset \newtoks\everysetupuserpagenumber % todo: set state: none, start, stop, reset @@ -89,26 +86,6 @@ \let\setuppagenumber\setupuserpagenumber \let\resetpagenumber\resetuserpagenumber -% { -% prefix = "\structurecounterparameter{#1}\c!prefix", -% separatorset = "\structurecounterparameter{#1}\c!prefixseparatorset", -% conversion = "\structurecounterparameter{#1}\c!prefixconversion", -% conversionset = "\structurecounterparameter{#1}\c!prefixconversionset", -% stopper = \!!bs\structurecounterparameter{#1}\c!prefixstopper\!!es, -% set = "\structurecounterparameter{#1}\c!prefixset", -% segments = "\structurecounterparameter{#1}\c!prefixsegments", -% connector = \!!bs\structurecounterparameter{#1}\c!prefixconnector\!!es, -% }, -% { -% order = "\structurecounterparameter{#1}\c!numberorder", -% separatorset = "\structurecounterparameter{#1}\c!numberseparatorset", -% conversion = "\structurecounterparameter{#1}\c!numberconversion", -% conversionset = "\structurecounterparameter{#1}\c!numberconversionset", -% stopper = \!!bs\structurecounterparameter{#1}\c!numberstopper\!!es, -% segments = "\structurecounterparameter{#1}\c!numbersegments", -% type = "\structurecounterparameter{#1}\c!type", -% } - \def\savecurrentpagestate {\ctxlua{structure.pages.save { prefix = "\structurecounterparameter\s!userpage\c!prefix", @@ -139,15 +116,6 @@ [\c!way=\v!by\v!part, \c!state=\v!stop] -% We don't want conflicts when \type {\pageno} is used by other -% packages, like \CWEB, so we redefine \type {\pageno}. - -\newcount\pageno \pageno\userpageno \let\folio\userfolio - -\appendtoks - \global\pageno\userpageno -\to \everyinitializepagecounters - % Counters % \def\firstpage {1} \def\prevpage {1} \def\nextpage {1} \def\lastpage {1} @@ -209,28 +177,28 @@ % Renderers: -\def\realpagenumber{\convertedstructurecounter[\s!realpage]} -\def\userpagenumber{\convertedstructurecounter[\s!userpage]} -\def\subpagenumber {\convertedstructurecounter[\s!subpage]} +\def\pagenumber {\rawstructurecounter[\s!userpage]} +\def\prefixedpagenumber {\directconvertedstructurecounter\s!userpage\empty} % \userpagenumber -\def\pagenumber {\rawstructurecounter[\s!userpage]} -\def\prefixedpagenumber{\convertedstructurecounter[\s!userpage]} % \userpagenumber +\def\realpagenumber {\directconvertedstructurecounter\s!realpage\empty} +\def\userpagenumber {\directconvertedstructurecounter\s!userpage\empty} +\def\subpagenumber {\directconvertedstructurecounter\s!subpage \empty} -\def\firstrealpagenumber{\convertedstructurecounter[\s!realpage][\c!type=\v!first]} -\def\firstuserpagenumber{\convertedstructurecounter[\s!userpage][\c!type=\v!first]} -\def\firstsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!first]} +\def\firstrealpagenumber{\directconvertedstructurecounter\s!realpage\v!first} +\def\firstuserpagenumber{\directconvertedstructurecounter\s!userpage\v!first} +\def\firstsubpagenumber {\directconvertedstructurecounter\s!subpage \v!first} -\def\lastrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!last]} -\def\lastuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!last]} -\def\lastsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!last]} +\def\lastrealpagenumber {\directconvertedstructurecounter\s!realpage\v!last} +\def\lastuserpagenumber {\directconvertedstructurecounter\s!userpage\v!last} +\def\lastsubpagenumber {\directconvertedstructurecounter\s!subpage \v!last} -\def\prevrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!previous]} -\def\prevuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!previous]} -\def\prevsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!previous]} +\def\prevrealpagenumber {\directconvertedstructurecounter\s!realpage\v!previous} +\def\prevuserpagenumber {\directconvertedstructurecounter\s!userpage\v!previous} +\def\prevsubpagenumber {\directconvertedstructurecounter\s!subpage \v!previous} -\def\nextrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!next]} -\def\nextuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!next]} -\def\nextsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!next]} +\def\nextrealpagenumber {\directconvertedstructurecounter\s!realpage\v!next} +\def\nextuserpagenumber {\directconvertedstructurecounter\s!userpage\v!next} +\def\nextsubpagenumber {\directconvertedstructurecounter\s!subpage \v!next} \appendtoks \decrementstructurecounter[\s!realpage]% @@ -242,9 +210,9 @@ % % todo: maybe leave lastpage etc lua calls -\def\realpage{\realfolio} -\def\userpage{\userfolio} -\def\subpage {\subfolio} +\def\realpage{\the\realpageno} +\def\userpage{\the\userpageno} +\def\subpage {\the\subpageno} % Hooks: @@ -253,71 +221,26 @@ \ifnum\realpageno>\lastpage \globallet\lastpage\lastrealpage \fi \to \everyinitializepagecounters -% \def\savenofpages -% {\global\realpageno\decrementedstructurecounter[\s!realpage]\relax -% \global\pageno \decrementedstructurecounter[\s!userpage]\relax} - -\let\savenofpages\relax - % States: \newif\ifrightpage \rightpagetrue \newif\ifdoublesided \newif\ifsinglesided -% Real page numbers: +% Realpage and subpage numbers: -\def\gotonextrealpage - {\global\realpageno\incrementedstructurecounter[\s!realpage]\relax - \ifnum\realpageno>\lastpage - \xdef\lastpage{\realfolio}% - \fi - \setpagereference\v!firstpage\firstpage - \setpagereference\v!lastpage\lastpage - \ifnum\realpageno>\plusone - \xdef\prevpage{\the\numexpr\realpageno+\minusone}% - \setpagereference\v!backward\prevpage - \else - \global\let\prevpage\firstpage - \setpagereference\v!backward\lastpage - \fi - \setpagereference\v!previouspage\prevpage - \ifnum\realpageno<\lastpage\relax - \xdef\nextpage{\the\numexpr\realpageno+\plusone}% - \setpagereference\v!page\nextpage - \setpagereference\v!forward\nextpage - \glet\nextnextpage\nextpage - \ifodd\nextpage\relax - \setpagereference\v!nextoddpage\nextnextpage - \else - \setpagereference\v!nextevenpage\nextnextpage - \fi - \xdef\nextnextpage{\the\numexpr\realpageno+\plustwo}% - \ifnum\nextnextpage>\lastpage\else - \ifodd\nextnextpage\relax - \setpagereference\v!nextoddpage\nextnextpage - \else - \setpagereference\v!nextevenpage\nextnextpage - \fi - \fi - \else - \glet\nextpage\lastpage - \setpagereference\v!page\firstpage - \setpagereference\v!forward\firstpage - \setpagereference\v!nextoddpage\lastpage - \setpagereference\v!nextevenpage\lastpage - \fi - \setpagereference\v!nextpage\realfolio} +\def\setnextrealpageno{\global\realpageno\incrementedstructurecounter[\s!realpage]\relax} +\def\setnextsubpageno {\global\subpageno \incrementedstructurecounter[\s!subpage ]\relax} -% Pagenumbers: +% Page numbers: -\def\dodecrementpagenumber{\global\userpageno\decrementedstructurecounter[\s!userpage]\relax\global\pageno\userpageno} -\def\doincrementpagenumber{\global\userpageno\incrementedstructurecounter[\s!userpage]\relax\global\pageno\userpageno} +\def\dodecrementpagenumber{\global\userpageno\decrementedstructurecounter[\s!userpage]\relax} +\def\doincrementpagenumber{\global\userpageno\incrementedstructurecounter[\s!userpage]\relax} \def\dosynchronizepagenumber{\global\let\@@pnstate\v!start} -\def\decrementpagenumber{\getvalue{\??pn-\structurecounterparameter\s!userpage\c!state}} -\def\incrementpagenumber{\getvalue{\??pn+\structurecounterparameter\s!userpage\c!state}} +\def\decrementpagenumber{\csname\??pn-\structurecounterparameter\s!userpage\c!state\endcsname} +\def\incrementpagenumber{\csname\??pn+\structurecounterparameter\s!userpage\c!state\endcsname} \letvalue{\??pn-\v!start}\dodecrementpagenumber \letvalue{\??pn-\v!none }\dodecrementpagenumber @@ -330,36 +253,6 @@ % todo: check if number set, and reset it after testing; also take care of \global\shiftedrealpagenotrue -% Subpagenumbers: - -\def\gotonextsubpage - {\global\subpageno\incrementedstructurecounter[\s!subpage]\relax - \ifnum\subpageno>\lastsubpage - \xdef\lastsubpage{\subfolio}% - \fi - \setpagereference\v!firstsubpage\firstsubpage - \setpagereference\v!lastsubpage\lastsubpage - \ifnum\subpageno>\plusone - \xdef\prevsubpage{\the\numexpr\subpageno+\minusone}% - \setpagereference\v!subbackward\prevsubpage - \else - \global\let\prevsubpage\firstsubpage - \setpagereference\v!subbackward\lastsubpage - \fi - \setpagereference\v!previoussubpage\prevsubpage - \ifnum\subpageno<\lastsubpage\relax - \xdef\nextsubpage{\the\numexpr\subpageno+\plusone}% - \setpagereference\v!subpage\nextsubpage - \setpagereference\v!subforward\nextsubpage - \glet\nextnextpage\nextsubpage - \xdef\nextnextpage{\the\numexpr\subpageno+\plustwo}% - \else - \glet\nextsubpage\lastsubpage - \setpagereference\v!subpage\firstsubpage - \setpagereference\v!subforward\firstsubpage - \fi - \setpagereference\v!nextsubpage\subfolio} - % Control: \def\getpagestatus % hierboven gebruiken @@ -383,8 +276,7 @@ \appendtoks \singlesidedfalse \doublesidedfalse - \ExpandFirstAfter\processallactionsinset - [\@@nmalternative] + \normalexpanded{\noexpand\processallactionsinset[\@@nmalternative]} [ \v!singlesided=>\singlesidedtrue, \v!doublesided=>\doublesidedtrue]% \ifx\trackingmarginnotestrue\undefined\else diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index f18bb9407..da5de43d6 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -6,7 +6,8 @@ if not modules then modules = { } end modules ['strc-ref'] = { license = "see context related readme files" } -local format, gmatch, texsprint, texwrite, count = string.format, string.gmatch, tex.sprint, tex.write, tex.count +local format, find, gmatch, match = string.format, string.find, string.gmatch, string.match +local texsprint, texwrite, texcount = tex.sprint, tex.write, tex.count local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables @@ -32,13 +33,6 @@ local defined, derived, specials, runners = jobreferences.defined, jobreferences local currentreference = nil -local gotoinner = "\\gotoinner{%s}{%s}{%s}{%s}" -- prefix inner page data -local gotoouterfilelocation = "\\gotoouterfilelocation{%s}{%s}{%s}{%s}" -- file location page data -local gotoouterfilepage = "\\gotoouterfilepage{%s}{%s}{%s}" -- file page data -local gotoouterurl = "\\gotoouterurl{%s}{%s}{%s}" -- url args data -local gotoinnerpage = "\\gotoinnerpage{%s}{%s}" -- page data -local gotospecial = "\\gotospecial{%s}{%s}{%s}{%s}{%s}" -- action, special, operation, arguments, data - jobreferences.initializers = jobreferences.initializers or { } function jobreferences.registerinitializer(func) -- we could use a token register instead @@ -56,9 +50,11 @@ if job then job.register('jobreferences.collected', jobreferences.tobesaved, initializer) end +-- todo: delay split till later as in destinations we split anyway + function jobreferences.set(kind,prefix,tag,data) for ref in gmatch(tag,"[^,]+") do - local p, r = ref:match("^(%-):(.-)$") + local p, r = match(ref,"^(%-):(.-)$") if p and r then prefix, ref = p, r else @@ -76,10 +72,15 @@ function jobreferences.set(kind,prefix,tag,data) end end +function jobreferences.setandgetattribute(kind,prefix,tag,data) -- maybe do internal automatically here + jobreferences.set(kind,prefix,tag,data) + texcount.lastdestinationattribute = jobreferences.setinternalreference(prefix,tag) or -0x7FFFFFFF +end + function jobreferences.enhance(prefix,tag,spec) local l = tobesaved[prefix][tag] if l then - l.references.realpage = tex.count[0] + l.references.realpage = texcount.realpageno end end @@ -87,14 +88,22 @@ end local result = { } -local lparent, rparent, lbrace, rbrace, dcolon = lpeg.P("("), lpeg.P(")"), lpeg.P("{"), lpeg.P("}"), lpeg.P("::") +local lparent, rparent, lbrace, rbrace, dcolon, backslash = lpeg.P("("), lpeg.P(")"), lpeg.P("{"), lpeg.P("}"), lpeg.P("::"), lpeg.P("\\") -local reset = lpeg.P("") / function (s) result = { } end -local outer = (1-dcolon-lparent-lbrace )^1 / function (s) result.outer = s end -local operation = (1-rparent-rbrace-lparent-lbrace)^1 / function (s) result.operation = s end -local arguments = (1-rbrace )^0 / function (s) result.arguments = s end -local special = (1-lparent-lbrace-lparent-lbrace)^1 / function (s) result.special = s end -local inner = (1-lparent-lbrace )^1 / function (s) result.inner = s end +local reset = lpeg.P("") / function() result = { } end +local b_token = backslash / function(s) result.has_tex = true return s end + +local o_token = 1 - rparent - rbrace - lparent - lbrace +local a_token = 1 - rbrace +local s_token = 1 - lparent - lbrace - lparent - lbrace +local i_token = 1 - lparent - lbrace +local f_token = 1 - lparent - lbrace - dcolon + +local outer = (f_token )^1 / function (s) result.outer = s end +local operation = lpeg.Cs((b_token + o_token)^1) / function (s) result.operation = s end +local arguments = lpeg.Cs((b_token + a_token)^0) / function (s) result.arguments = s end +local special = (s_token )^1 / function (s) result.special = s end +local inner = (i_token )^1 / function (s) result.inner = s end local outer_reference = (outer * dcolon)^0 @@ -110,12 +119,8 @@ function jobreferences.analyse(str) return scanner:match(str) end -local splittemplate = "\\setreferencevariables{%s}{%s}{%s}{%s}{%s}" -- will go away - function jobreferences.split(str) - local t = scanner:match(str or "") - texsprint(ctxcatcodes,format(splittemplate,t.special or "",t.operation or "",t.arguments or "",t.outer or "",t.inner or "")) - return t + return scanner:match(str or "") end --~ print(table.serialize(jobreferences.analyse(""))) @@ -173,7 +178,10 @@ local function register_from_lists(collected,derived) local kind, realpage = m.kind, r.realpage if kind and realpage then local d = derived[prefix] if not d then d = { } derived[prefix] = d end - d[reference] = { kind, i } +--~ d[reference] = { kind, i } +for s in gmatch(reference,"[^,]+") do + d[s] = { kind, i } +end end end end @@ -345,6 +353,7 @@ end local settings_to_array = aux.settings_to_array local function resolve(prefix,reference,args,set) -- we start with prefix,reference + texcount.referencehastexstate = 0 if reference and reference ~= "" then set = set or { } local r = settings_to_array(reference) @@ -369,11 +378,17 @@ local function resolve(prefix,reference,args,set) -- we start with prefix,refere if args then var.arguments = args end set[#set+1] = var end + if var.has_tex then + set.has_tex = true + end else -- logs.report("references","funny pattern: %s",ri or "?") end end end + if set.has_tex then + texcount.referencehastexstate = 1 + end return set else return { } @@ -382,6 +397,44 @@ end -- prefix == "" is valid prefix which saves multistep lookup +jobreferences.currentset = nil + +local b, e = "\\ctxlua{local jc = jobreferences.currentset;", "}" +local o, a = 'jc[%s].operation=[[%s]];', 'jc[%s].arguments=[[%s]];' + +function jobreferences.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex + local currentset = jobreferences.currentset + if currentset and currentset.has_tex then + local done = false + for i=1,#currentset do + local ci = currentset[i] + local operation = ci.operation + if operation then + if find(operation,"\\") then -- if o_has_tex then + if not done then + texsprint(ctxcatcodes,b) + done = true + end + texsprint(ctxcatcodes,format(o,i,operation)) + end + end + local arguments = ci.arguments + if arguments then + if find(arguments,"\\") then -- if a_has_tex then + if not done then + texsprint(ctxcatcodes,b) + done = true + end + texsprint(ctxcatcodes,format(a,i,arguments)) + end + end + end + if done then + texsprint(ctxcatcodes,e) + end + end +end + local function identify(prefix,reference) local set = resolve(prefix,reference) local bug = false @@ -390,7 +443,6 @@ local function identify(prefix,reference) local special, inner, outer, arguments, operation = var.special, var.inner, var.outer, var.arguments, var.operation if special then local s = specials[special] ---~ print(table.serialize(specials)) if s then if outer then if operation then @@ -535,9 +587,6 @@ local function identify(prefix,reference) if s then var.kind = "special" else ---~ i = (tobesaved[""] and tobesaved[""][inner]) or ---~ (derived [""] and derived [""][inner]) or ---~ (collected[""] and collected[""][inner]) i = (collected[""] and collected[""][inner]) or (derived [""] and derived [""][inner]) or (tobesaved[""] and tobesaved[""][inner]) @@ -558,91 +607,45 @@ local function identify(prefix,reference) bug = bug or var.error set[i] = var end ---~ print(prefix,reference,table.serialize(set)) + jobreferences.currentset = set return set, bug end jobreferences.identify = identify -function jobreferences.doifelse(prefix,reference) +function jobreferences.doifelse(prefix,reference,highlight,newwindow,layer) local set, bug = identify(prefix,reference) local unknown = bug or #set == 0 if unknown then - currentreference = nil + currentreference = nil -- will go away else + set.highlight, set.newwindow,set.layer = highlight, newwindow, layer currentreference = set[1] end + -- we can do the expansion here which saves a call commands.doifelse(not unknown) end -function jobreferences.analysis(prefix,reference) - local set, bug = identify(prefix,reference) - local unknown = bug or #set == 0 - if unknown then - currentreference = nil - texwrite(0) -- unknown - else - currentreference = set[1] - texwrite(1) -- whatever ---~ texwrite(2) -- forward, following page ---~ texwrite(3) -- backward, preceding page ---~ texwrite(4) -- forward, same page ---~ texwrite(5) -- backward, same page - end -end - -function jobreferences.handle(prefix,reference) -- todo: use currentreference is possible - local set, bug = identify(prefix,reference) - if bug or #set == 0 then - texsprint(ctxcatcodes,"\\referenceunknownaction") - else - for i=2,#set do - local s = set[i] -currentreference = s - -- not that needed, but keep it for a while - texsprint(ctxcatcodes,format(splittemplate,s.special or "",s.operation or "",s.arguments or "",s.outer or "",s.inner or "")) - -- - if s.error then - texsprint(ctxcatcodes,"\\referenceunknownaction") - else - local runner = runners[s.kind] - if runner then - texsprint(ctxcatcodes,runner(s,"\\secondaryreferencefoundaction")) - end +function jobreferences.setinternalreference(prefix,tag,internal,view) + local t = { } + if tag then + if prefix and prefix ~= "" then + prefix = prefix .. ":" + for ref in gmatch(tag,"[^,]+") do + t[#t+1] = prefix .. ref end - end - local s = set[1] -currentreference = s - -- not that needed, but keep it for a while - texsprint(ctxcatcodes,format(splittemplate,s.special or "",s.operation or "",s.arguments or "",s.outer or "",s.inner or "")) - -- - if s.error then - texsprint(ctxcatcodes,"\\referenceunknownaction") else - local runner = runners[s.kind] - if runner then - texsprint(ctxcatcodes,runner(s,"\\primaryreferencefoundaction")) + for ref in gmatch(tag,"[^,]+") do + t[#t+1] = ref end end end -end - -local thisdestinationyes = "\\thisisdestination{%s:%s}" -local thisdestinationnop = "\\thisisdestination{%s}" -local thisdestinationaut = "\\thisisdestination{aut:%s}" - -function jobreferences.setinternalreference(prefix,tag,internal) - if tag then - for ref in gmatch(tag,"[^,]+") do - if not prefix or prefix == "" then - texsprint(ctxcatcodes,format(thisdestinationnop,ref)) - else - texsprint(ctxcatcodes,format(thisdestinationyes,prefix,ref)) - end - end + if internal then + t[#t+1] = "aut:" .. internal end - texsprint(ctxcatcodes,format(thisdestinationaut,internal)) - -- texsprint(ctxcatcodes,"[["..internal.."]]") + local destination = jobreferences.mark(t,nil,nil,view) -- returns an attribute + texcount.lastdestinationattribute = destination + return destination end -- @@ -708,11 +711,19 @@ function filters.text.page(data,prefixspec,pagespec) helpers.prefixpage(data,prefixspec,pagespec) end ---~ filters.section = { } +filters.section = { } ---~ filters.section.title = filters.generic.title ---~ filters.section.number = filters.generic.number ---~ filters.section.page = filters.generic.page +filters.section.title = filters.generic.title +filters.section.page = filters.generic.page + +function filters.section.number(data) -- todo: spec and then no stopper + if data then + local numberdata = data.numberdata + if numberdata then + sections.typesetnumber(numberdata,"number",numberdata or false) + end + end +end --~ filters.float = { } @@ -720,164 +731,126 @@ end --~ filters.float.number = filters.generic.number --~ filters.float.page = filters.generic.page --- each method gets its own call, so that we can later move completely to lua +structure.references = structure.references or { } +structure.helpers = structure.helpers or { } -runners["inner"] = function(var,content) - -- inner - currentreference = var - local r = var.r - return (r and format(gotoinner,var.p or "",var.inner,r,content)) or "error" -end +local references = structure.references +local helpers = structure.helpers -runners["inner with arguments"] = function(var,content) - -- inner{argument} - currentreference = var - return "todo: " .. var.kind or "?" +function references.sectiontitle(n) + helpers.sectiontitle(lists.collected[tonumber(n) or 0]) end -runners["outer"] = function(var,content) - -- outer:: - -- todo: resolve url/file name - currentreference = var - local url = "" - local file = var.o - return format(gotoouterfilepage,url,file,1,content) +function references.sectionnumber(n) + helpers.sectionnumber(lists.collected[tonumber(n) or 0]) end -runners["outer with inner"] = function(var,content) - -- outer::inner - -- todo: resolve url/file name - currentreference = var - local r = var.r - return (r and format(gotoouterfilelocation,var.f,var.inner,r,content)) or "error" +function references.sectionpage(n,prefixspec,pagespec) + helpers.prefixedpage(lists.collected[tonumber(n) or 0],prefixspec,pagespec) end -runners["special outer with operation"] = function(var,content) - -- special(outer::operation) - currentreference = var - return "todo: " .. var.kind or "?" -end +-- analyse -runners["special outer"] = function(var,content) - -- special() - currentreference = var - return "todo: " .. var.kind or "?" -end +jobreferences.testrunners = jobreferences.testrunners or { } +jobreferences.testspecials = jobreferences.testspecials or { } -runners["special"] = function(var,content) - -- special(operation) - currentreference = var - local handler = specials[var.special] - if handler then - return handler(var,content) -- var.special wegwerken +local runners = jobreferences.testrunners +local specials = jobreferences.testspecials + +function jobreferences.analyse(actions) + actions = actions or jobreferences.currentset + if not actions then + actions = { realpage = 0 } + elseif actions.realpage then + -- already analysed else - return "" + -- we store some analysis data alongside the indexed array + -- at this moment only the real reference page is analysed + -- normally such an analysis happens in the backend code + texcount.referencepagestate = 0 + local nofactions = #actions + if nofactions > 0 then + for i=1,nofactions do + local a = actions[i] + local what = runners[a.kind] + if what then + what = what(a,actions) + end + end + local realpage, p = texcount.realpageno, tonumber(actions.realpage) + if not p then + -- sorry + elseif p > realpage then + texcount.referencepagestate = 3 + elseif p < realpage then + texcount.referencepagestate = 2 + else + texcount.referencepagestate = 1 + end + end end + return actions end -runners["outer with inner with arguments"] = function(var,content) - -- outer::inner{argument} - currentreference = var - return "todo: " .. var.kind or "?" -end - -runners["outer with special and operation and arguments"] = function(var,content) - -- outer::special(operation{argument,argument}) - currentreference = var - return "todo: " .. var.kind or "?" -end -runners["outer with special"] = function(var,content) - -- outer::special() - currentreference = var - return "todo: " .. var.kind or "?" +function jobreferences.realpage() -- special case, we always want result + local cs = jobreferences.analyse() + texwrite(cs.realpage or 0) end -runners["outer with special and operation"] = function(var,content) - -- outer::special(operation) - currentreference = var - return "todo: " .. var.kind or "?" -end - -runners["special operation"] = runners["special"] -runners["special operation with arguments"] = runners["special"] - -local gotoactionspecial = "\\gotoactionspecial{%s}{%s}{%s}{%s}" -local gotopagespecial = "\\gotopagespecial{%s}{%s}{%s}{%s}" -local gotourlspecial = "\\gotourlspecial{%s}{%s}{%s}{%s}" -local gotofilespecial = "\\gotofilespecial{%s}{%s}{%s}{%s}" -local gotoprogramspecial = "\\gotoprogramspecial{%s}{%s}{%s}{%s}" -local gotojavascriptspecial = "\\gotojavascriptspecial{%s}{%s}{%s}{%s}" +-- -function specials.action(var,content) - return format(gotoactionspecial,var.special,var.operation,var.arguments or "",content) -end +jobreferences.pages = { + [variables.firstpage] = function() return structure.counters.record("realpage")["first"] end, + [variables.previouspage] = function() return structure.counters.record("realpage")["previous"] end, + [variables.nextpage] = function() return structure.counters.record("realpage")["next"] end, + [variables.lastpage] = function() return structure.counters.record("realpage")["last"] end, -function specials.page(var,content) - -- we need to deal with page(inner) and page(outer::1) and outer::page(1) - return format(gotopagespecial,var.special,var.operation,var.arguments or "",content) -end + [variables.firstsubpage] = function() return structure.counters.record("subpage" )["first"] end, + [variables.previoussubpage] = function() return structure.counters.record("subpage" )["previous"] end, + [variables.nextsubpage] = function() return structure.counters.record("subpage" )["next"] end, + [variables.lastsubpage] = function() return structure.counters.record("subpage" )["last"] end, -function specials.url(var,content) - local url = var.operation - if url then - local u = urls[url] - if u then - local u, f = u[1], u[2] - if f and f ~= "" then - url = u .. "/" .. f - else - url = u - end - end - end - return format(gotourlspecial,var.special,url,var.arguments or "",content) -end + [variables.forward] = function() return structure.counters.record("realpage")["forward"] end, + [variables.backward] = function() return structure.counters.record("realpage")["backward"] end, +} -function specials.file(var,content) - local file = var.operation - if file then - local f = files[file] - if f then - file = f[1] - end - end - return format(gotofilespecial,var.special,file,var.arguments or "",content) -end +-- maybe some day i will merge this in the backend code with a testmode (so each +-- runner then implements a branch) -function specials.program(var,content) - local program = var.operation - if program then - local p = programs[program] - if p then - programs = p[1] - end +runners["inner"] = function(var,actions) + local r = var.r + if r then + actions.realpage = r end - return format(gotoprogramspecial,var.special,program,var.arguments or "",content) end -function specials.javascript(var,content) - -- todo: store js code in lua - return format(gotojavascriptspecial,var.special,var.operation,var.arguments or "",content) +runners["special"] = function(var,actions) + local handler = specials[var.special] + return handler and handler(var,actions) end -specials.JS = specials.javascript - -structure.references = structure.references or { } -structure.helpers = structure.helpers or { } +runners["special operation"] = runners["special"] +runners["special operation with arguments"] = runners["special"] -local references = structure.references -local helpers = structure.helpers +local pages = jobreferences.pages -function references.sectiontitle(n) - helpers.sectiontitle(lists.collected[tonumber(n) or 0]) +function specials.internal(var,actions) + local v = jobreferences.internals[tonumber(var.operation)] + local r = v and v.references.realpage + if r then + actions.realpage = r + end end -function references.sectionnumber(n) - helpers.sectionnumber(lists.collected[tonumber(n) or 0]) -end +specials.i = specials.internal -function references.sectionpage(n,prefixspec,pagespec) - helpers.prefixedpage(lists.collected[tonumber(n) or 0],prefixspec,pagespec) +function specials.page(var,actions) + local p = pages[var.operation] + if type(p) == "function" then + p = p() + end + if p then + actions.realpage = p + end end - diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv index 61436ef77..3cd0def78 100644 --- a/tex/context/base/strc-ref.mkiv +++ b/tex/context/base/strc-ref.mkiv @@ -14,6 +14,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Cross Referencing} \registerctxluafile{strc-ref}{1.001} +\registerctxluafile{node-ref}{1.001} \unprotect @@ -91,21 +92,16 @@ %D full reference, but it's the concept that counts. The low %D level implementation is: -\newcount\crossreferencenumber +\newcount\lastreferenceattribute +\newcount\lastdestinationattribute -\def\dofinishfullreference#1#2% - {\normalexpanded{\noexpand\ctxlatelua{jobreferences.enhance("#1","#2")}}% - \referenceinfo>{#1\letterbar#2}} +\def\dofinishfullreference#1#2{\normalexpanded{\ctxlatelua{jobreferences.enhance("#1","#2")}}} +\def\dofinishtextreference#1#2{\normalexpanded{\ctxlatelua{jobreferences.enhance("#1","#2",{})}}} \let\dofinishpagereference\dofinishfullreference -\def\dofinishtextreference#1#2% - {\normalexpanded{\noexpand\ctxlatelua{jobreferences.enhance("#1","#2",{})}}% - \referenceinfo>{#1\letterbar#2}} - \def\dosetreference#1#2#3% kind labels text -> todo: userdata {\ifreferencing - \global\advance\crossreferencenumber\plusone \edef\currentreferencekind{#1}% \edef\currentreferencelabels{#2}% \edef\currentreferenceexpansion{\@@rfexpansion}% {\referenceparameter\c!expansion} @@ -123,35 +119,30 @@ \fi \globallet\currentreferencecoding\s!tex \fi - \setnextinternalreference - \ctxlua { - jobreferences.set("\currentreferencekind", "\referenceprefix","\currentreferencelabels", - { - references = { - internal = \nextinternalreference, - block = "\currentstructureblock", - section = structure.sections.currentid(), - }, - metadata = { - kind = "#1", - catcodes = \the\catcodetable, - xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text - }, - entries = { - text = \!!bs\currentreferencetext\!!es - } - }) - jobreferences.setinternalreference("\referenceprefix","\currentreferencelabels",\nextinternalreference) - }% + % beware, the jobreferences.set writes a + % \setnextinternalreference + \ctxlua{jobreferences.setandgetattribute("\currentreferencekind", "\referenceprefix","\currentreferencelabels", + { + references = { + % internal = \nextinternalreference, % no need for an internal as we have an explicit + block = "\currentstructureblock", + section = structure.sections.currentid(), + }, + metadata = { + kind = "#1", + catcodes = \the\catcodetable, + xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text + }, + entries = { + text = \!!bs\currentreferencetext\!!es + } + }) + }% + \xdef\currentdestinationattribute{\number\lastdestinationattribute}% + \begingroup\dosetattribute{destination}\currentdestinationattribute\hbox{}\endgroup % todo \fi \fi} -%D For compatibility we provide: - -\def\rawreference #1#2#3{\dosetreference\s!full{#2}{#3}} % tag, labels, text -\def\rawpagereference #1#2{\dosetreference\s!page{#2}{}} % tag, labels -\def\rawtextreference#1#2#3{\dosetreference\s!text{#2}{#3}} % tag, labels, text - \def\defaultreferencepage#1{[[[#1]]]} \def\defaultreferencetext#1{[[[#1]]]} @@ -200,7 +191,7 @@ %D \NC \NC $\star$ \NC \NC\NR %D \stoptabulate -\def\usereferences[#1]% +\def\usereferences[#1]% not yet {\writestatus\m!systems{references from other files are handled automatically}} %D As mentioned we will also use the cross reference mechanism @@ -233,19 +224,12 @@ \let\currentsubtextreference \empty \let\currentsubsubtextreference\empty -%D System references only have one component: - -\newif\ifforwardreference -\newif\ifrealreferencepage +\newcount\referencepagestate % set in backend +\newcount\referencehastexstate % set in backend -\def\docheckrealreferencepage#1% todo - {\doifnumberelse{#1} - {\ifnum#1=\realpageno - \realreferencepagetrue - \else - \realreferencepagefalse - \fi} - {\realreferencepagefalse}} +% referencepagestate: +% +% 0 = no page ref, 1=same page, 2=before, 3=after %D Text references can contain more than one entry and %D therefore we check for @@ -262,11 +246,6 @@ %D %D and split accordingly. -% todo: - -\def\doifforwardreferenceelse#1#2% todo - {\iffalse} - %D Cross references appear as numbers (figure~1.1, chapter~2) %D or pagenumbers (page~2, page 3--2), and are called with %D \type{\in} and \type{\at}. In interactive documents we also @@ -302,19 +281,12 @@ \newif\ifreferencefound -\let\currentfullreference \empty -\let\currentreferencespecial \empty -\let\currentreferenceoperation\empty -\let\currentreferencearguments\empty -\let\currentouterreference \empty -\let\currentinnerreference \empty - -\def\setreferencevariables#1#2#3#4#5% - {\def\currentreferencespecial {#1}% - \def\currentreferenceoperation{#2}% - \def\currentreferencearguments{#3}% - \def\currentouterreference {#4}% - \def\currentinnerreference {#5}} +% \let\currentfullreference \empty +% \let\currentreferencespecial \empty +% \let\currentreferenceoperation\empty +% \let\currentreferencearguments\empty +% \let\currentouterreference \empty +% \let\currentinnerreference \empty %D Now we've come to the testing step. As we can see below, %D this macro does bit more than testing: it also resolves @@ -364,7 +336,7 @@ %D %D \starttyping %D \definereference[startup][JS(My_Script{"test",123}),titlepage] -%D \goto{do}[REF(startup)] +%D \goto{do}[startup] %D \stoptyping %D %D Now is this is a handy feature or not? @@ -395,22 +367,41 @@ %D Actually supporting chains is up to the special driver. Here %D we only provide the hooks. -\newif \ifsecondaryreference -\newcount\nofsecondaryreferences +%D \macros +%D {highlighthyperlinks} +%D +%D The next switch can be used to make user hyperlinks are +%D not highlighted when clicked on. + +\newconditional\highlighthyperlinks \settrue\highlighthyperlinks + +%D \macros +%D {gotonewwindow} +%D +%D To make the {\em goto previous jump} feature more +%D convenient when using more than one file, it makes sense +%D to force the viewer to open a new window for each file +%D opened. -% the counter stuff should move to the (mkiv) backend +\newconditional\gotonewwindow \setfalse\gotonewwindow -\def\doifreferencefoundelse#1% - {\ctxlua{jobreferences.doifelse("\referenceprefix","#1")}} +\def\expandtexincurrentreference % will happen in lua some time + {\ifcase\referencehastexstate\else\ctxlua{jobreferences.expandcurrent()}\fi} -\def\doprocessreferenceelse#1#2#3% - {\doresetgotowhereever - \nofsecondaryreferences\zerocount - \def\primaryreferencefoundaction {\secondaryreferencefalse#2}% - \def\secondaryreferencefoundaction{\advance\nofsecondaryreferences\plusone\secondaryreferencetrue#2}% - \def\referenceunknownaction {#3}% - \ctxlua{jobreferences.handle("\referenceprefix","#1")}% - \doresetgotowhereever} % to prevent problems with direct goto's +\def\doifreferencefoundelse#1#2#3% + {\ctxlua{jobreferences.doifelse("\referenceprefix","#1",\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow)}% + {\expandtexincurrentreference#2}% + {#3}} + +%D The tester only splits the reference in components but does +%D not look into them. The following macro does a preroll and +%D determines for instance the current real reference pagenumber. +%D The \type {\currentrealreference} macro does the same so unless +%D one wants to use the pagestate the next macro seldom needs to +%D be called. + +\def\analyzecurrentreference + {\ctxlua{jobreferences.analyse()}} %D The inner case is simple. Only two cases have to be taken %D care of: @@ -453,37 +444,6 @@ %D being defined, we set such an unknown reference to an empty %D one after the first encounter. -%D Sometimes we want to temporary put a reference out of -%D order. An example can be found in the menu macros. -%D -%D \starttyping -%D \doifreferencepermittedelse{reference}{set}{true}{false} -%D \stoptyping -%D -%D The second argument can be a comma seperated list. - -\let\permittedreferences\empty - - \def\doifreferencepermittedelse#1#2#3% ref found notfound - {\doprocessreferenceelse{#1} - {\donetrue - \ifx\permittedreferences\empty \else - \docheckifreferencepermitted{#1}% - \fi - \ifdone#2\else#3\fi} - {#3\unknownreference{#1}}} - - \def\docheckifreferencepermitted#1% - {\ifx\currentinnerreference\empty - \ifx\currentouterreference\empty \else - \doifinstring{\currentouterreference::}\permittedreferences\donefalse - \fi - \else\ifx\currentouterreference\empty - \doifinstring{\currentinnerreference}\permittedreferences\donefalse - \else - \doifinstring{\currentouterreference::\currentinnerreference}\permittedreferences\donefalse - \fi\fi} - %D Apart from cross references supplied by the user, \CONTEXT\ %D generates cross references itself. Most of them are not %D saved as a reference, but stored with their source, for @@ -521,103 +481,9 @@ %D the special driver modules (see \type{spec-ini}). The flag %D \type{\iflocation} signals if we're in interactive mode. -\def\thisisdestination#1% destination - {\iflocation \ifusepagedestinations \else - \dostartthisislocation{#1}\dostopthisislocation - \fi \fi} - -\def\thisisrealpage#1% pagenumber - {\iflocation - \dostartthisisrealpage{#1}\dostopthisisrealpage - \fi} - -%D The previous tho macros were easy ones, opposite to their -%D counterparts. A common component in these is: -%D -%D \starttyping -%D \dohandlegoto{..}{..}{..} -%D \stoptyping -%D -%D Here data can be whatever needs highlighting, e.g. {\em -%D figure 2.4}, and the start and stop entries handle the -%D specials. The two \DIMENSIONS\ \type{\buttonwidth} and -%D \type{\buttonheight} have to be set when handling the -%D data~(\type{#2}). - \ifx\buttonheight\undefined \newdimen\buttonheight \fi \ifx\buttonwidth \undefined \newdimen\buttonwidth \fi -\def\gotodestination#1#2#3#4#5% url file destination page data - {\iflocation - \ifusepagedestinations - \gotorealpage{#1}{#2}{\number#4}{#5}% - \else - \dohandlegoto - {#5}% - {\the\everyreference\dostartgotolocation\buttonwidth\buttonheight{#1}{#2}{#3}{\number#4}}% - {\dostopgotolocation}% - \fi - \else - {#5}% - \fi} - -\def\gotorealpage#1#2#3#4% url file page data - {\iflocation - \dohandlegoto - {#4}% - {\dostartgotorealpage\buttonwidth\buttonheight{#1}{#2}{\number#3}}% - {\dostopgotorealpage}% - \else - {#4}% - \fi} - -\def\gotoinnerpage#1#2% page data - {\iflocation - \dohandlegoto - {#2}% - {\dostartgotorealpage\buttonwidth\buttonheight\empty\empty{\number#1}}% - {\dostopgotorealpage}% - \else - {#2}% - \fi} - -\def\gotoouterfilepage#1#2#3% file page data - {\iflocation - \dohandlegoto - {#3}% - {\dostartgotorealpage\buttonwidth\buttonheight\empty{#1}{\number#2}}% - {\dostopgotorealpage}% - \else - {#3}% - \fi} - -%D \macros -%D {setreferencefilename} -%D -%D This command can be used in the special drivers to -%D uppercase filenames. This is needed when one wants to -%D produce \CDROM's conforming to ISO9660. We consider is the -%D savest to enable this feature by default. We cannot handle -%D uppercase here, since the suffix is handled in the special -%D driver. Conversion is taken care of by: -%D -%D \starttyping -%D \setreferencefilename somefilename\to\SomeFileName -%D \stoptyping - -\chardef\referencefilecase=0 - - \def\setreferencefilename#1\to#2% - {\ifcase\referencefilecase - \edef#2{#1}% - \or - \uppercasestring#1\to#2% - \or - \lowercasestring#1\to#2% - \else - \edef#2{#1}% - \fi} - %D Internal references can best be set using the next few %D macros. Setting such references to unique values is %D completely up to the macros that call them. @@ -627,30 +493,9 @@ %D \gotosomeinternal {tag}{identifier}{pagenumber}{text} %D \stoptyping -\def\thisissomeinternal#1#2% tag reference - {\doifsomething{#2}{\thisisdestination{#1:#2}}} - -\def\gotosomeinternal#1#2% #3#4 - {\gotodestination\empty\empty{#1:#2}} - -%D An automatic mechanism is provided too: -%D -%D \starttyping -%D \thisisnextinternal{tag} -%D \gotonextinternal {tag}{number}{pagenumber}{text} -%D \stoptyping -%D -%D The first macro increments a counter. The value of this -%D counter is available in the macro \type{\nextinternalreference} -%D and should be saved somewhere (for instance in a file) for -%D future reference. The second argument of -%D \type {\gotonextinternal} takes such a saved number. One can -%D turn on tracing these references, in which case the -%D references are a bit more verbose. - +\newif \iflocation \newcount\locationcount - -\newif\ifinternalnamedreferences \internalnamedreferencestrue +\newbox \locationbox \def\nextinternalreference {\the\locationcount} @@ -658,120 +503,18 @@ \def\setnextinternalreference {\global\advance\locationcount\plusone} -\def\thisisnextinternal#1% #1 will be removed when we are done with mkiv - {\ifinternalnamedreferences - \thisisdestination{\s!aut:\nextinternalreference}% - \fi} - -\def\insertnextinternal#1% - {\ifinternalnamedreferences - \thisisdestination{\s!aut:\number#1}% - \fi} +\def\thisissomeinternal#1#2% tag reference (only for old time sake) + {\begingroup\dosetattribute{destination}{\ctxlua{jobreferences.mark("#1:#2")}}\hbox{}\endgroup} -\def\gotonextinternal#1#2#3#4% #1 will be removed when we are done with mkiv +\def\gotosomeinternal#1#2#3#4% {\ifinternalnamedreferences - \gotodestination\empty\empty{\s!aut:#2}{#3}{#4}% + \directgoto{#4}[#1:#2]% \else - \gotorealpage\empty\empty{#3}{#4}% + \directgoto{#4}[page(#3)]% \fi} -%D We already went through a lot of problems to sort out what -%D kind of reference we're dealing with. Sorting out the user -%D supplied cross references (show/goto this or that) as well -%D as user supplied system references (invoke this or that) is -%D already taken care of in the test routine, but we still have -%D to direct the request to the right (first) routine. - -\def\gotolocation#1#2{\doprocessreferenceelse{#1}{#2}{\unknownreference{#1}}} % obsolete - -%D An inner reference refers to some place in the document -%D itself. - - \def\gotoinnerlocation#1% #2% - {\gotodestination\empty\empty{\referenceprefix\currentinnerreference}\currentrealreference} % {#2} - -\def\gotoinner#1#2#3% prefix inner page data - {\gotodestination\empty\empty{#1#2}{#3}} % {#4} - -%D The outer location refers to another document, specified as -%D file or \URL. - - \def\gotoouterlocation#1#2% % page checken! - {\bgroup - \let\referenceprefix\empty - \setouterlocation\currentouterreference - \ifx\currentinnerreference\empty - \gotorealpage\otherURL\otherfile1{#2}% - \else - \gotodestination\otherURL\otherfile\currentinnerreference\currentrealreference{#2}% - \fi - \egroup} - -\def\gotoouterfile#1#2% file location page data #3 #4 - {\doifelsenothing{#2}{\gotorealpage\empty{#1}}{\gotodestination\empty{#1}{#2}}} - -\def\gotoouterfilepage#1% file page data - {\gotorealpage\empty{#1}\empty} - -\def\gotoouterfilelocation% file location page data - {\gotodestination\empty} - -\def\gotoouterurl#1#2% url args data #2 - {\gotodestination{#1}\empty{#2}1} - -%D Special locations are those that are accessed by saying -%D things like: -%D -%D \starttyping -%D \goto{calculate total}[JS(summarize{10,23,56}] -%D \stoptyping -%D -%D After several intermediate steps this finally arrives at -%D the next macro and expands into (simplified): -%D -%D \starttyping -%D \gotoJSlocation{total{summarize{10,23,56}}}{calculate total} -%D \stoptyping -%D -%D The first argument is the full reference, the second one -%D is the text, in some kind of manipulated form. In practice -%D we split references, so we get: -%D -%D \starttyping -%D \gotoJSlocation{summarize{10,23,56}}{calculate} -%D \gotoJSlocation{summarize{10,23,56}}{total} -%D \stoptyping -%D -%D where \type{calculate} and \type{total} are colored, boxed -%D or whatever \type{\goto} is told to do. -%D -%D The macro \type{\gotoJSlocation} can use \type -%D {\currentreferenceoperation} (in our example -%D \type{summarize}) and \type{\currentreference} (here -%D being \type {10,23,56}) to perform its task. - - \def\gotospeciallocation - {\executeifdefined{goto\currentreferencespecial location}\gobbleoneargument} - -%D Such special macros can be defined by: - - \def\definespeciallocation#1% - {\setvalue{goto#1location}} - -%D The associated test is to be defined by: - -\def\definespecialtest#1% - {\setvalue{\s!do:\v!test:#1}} - -%D This \type{\def} alike macro is to be used as: -%D -%D \starttyping -%D \definespeciallocation{JS}#1#2{... #1 ... #2 ...} -%D \stoptyping -%D -%D In module \type {java-ini} one can see that \type -%D {\gotoJSlocation} looks much like the previous goto -%D definitions. +\def\gotonextinternal#1#2% + {\directgoto{#1}[internal(#2)]} %D In this module we define three system references: one for %D handling navigational, viewer specific, commands, another @@ -796,40 +539,6 @@ \def\setglobalsystemreference#1#2#3{\definereference[#2][\v!action(#3)]} -% action actions - -\def\gotoactionspecial#1#2#3#4% special operation arguments data - {\begingroup - \iflocation - \dohandlegoto - {#4}% - {\dostartexecutecommand\buttonwidth\buttonheight{#2}{#3}}% - {\dostopexecutecommand}% - \else - #4% - \fi - \endgroup} - -\def\gotopagespecial#1#2#3#4% page(n) page(+n) page(-n) page(file::1) - {\begingroup - \iflocation - \doifnonzeropositiveelse{#2} - {\doifinstringelse+{#2} - {\edef\currenttargetpage{\the\numexpr\realpageno#2}} - {\doifinstringelse-{#2} - {\edef\currenttargetpage{\the\numexpr\realpageno#2}} - {\edef\currenttargetpage{#2}}}}% - {\edef\currenttargetpage{1}}% - \docheckrealreferencepage\currenttargetpage % new - \gotorealpage\empty\empty\currenttargetpage{#4}% - \else - #4% - \fi - \endgroup} - -%D It is possible to disable the writing of references to the -%D utility file by setting: - \newif\ifreferencing \referencingtrue %D One can also activate an automatic prefix mechanism. By @@ -902,33 +611,6 @@ \edef\referenceprefix{\@@rfprefix:}% \fi\fi\fi\fi} -%D \macros -%D {handlereferenceactions, -%D collectreferenceactions} -%D -%D Sometimes we need to pass the actions connected to -%D references to variables instead of rectangular areas on -%D which one can click. The next macro collects the actions -%D and passes them to a handle. This is a rather dreadfull -%D hack! -%D -%D \starttyping -%D \handlereferenceactions{references}\handle -%D \stoptyping -%D -%D So, \type {\handle} does the final job, which in for -%D instance the \PDF\ drivers comes down to doing something -%D with \type {\lastPDFaction}. - -\newif\ifcollectreferenceactions - -\def\handlereferenceactions#1#2% - {\doifsomething{#1} - {\bgroup - \collectreferenceactionstrue - \doprocessreferenceelse{#1}{#2}{\unknownreference{#1}}% - \egroup}} - %D The most straightforward way of retrieving references is %D using \type{\ref}. Consider the reference: %D @@ -957,20 +639,23 @@ %D \startlines %D \getbuffer %D \stoplines +%D +%D This is a cheap compatibility hack. Don't use this command +%D as there will be more advanced access to user data. \def\ref{\dodoubleargument\doref} -\def\reftypep{\currentpagereference} -\def\reftypet{\currenttextreference} -\def\reftyper{\currentrealreference} -\def\reftypes{\currentsubtextreference} -\def\reftypee{\currentsubsubtextreference} +\def\reftypep{\currentreferencepage} +\def\reftypet{\currentreferencetext} +\def\reftyper{\currentreferencepage} +\def\reftypes{\currentreferencetext} +\def\reftypee{\currentreferencetext} \def\doref[#1][#2]% {\ifsecondargument -% \doifreferencefoundelse{#2} -% {\executeifdefined{reftype#1}\reftypep} -% {\unknownreference{#2}\dummyreference}% + \doifreferencefoundelse{#2} + {\executeifdefined{reftype#1}\reftypep} + {\unknownreference{#2}\dummyreference}% \else \dummyreference \fi} @@ -1025,9 +710,10 @@ \definecommand from {\dospecialfrom} \definecommand over {\dospecialabout} % needed here, else math problems -\def\currentreferencenumber{\ctxlua{jobreferences.filter("number")}} -\def\currentreferencepage {\ctxlua{jobreferences.filter("page")}} -\def\currentreferencetitle {\ctxlua{jobreferences.filter("title")}} +\def\currentreferencenumber {\ctxlua{jobreferences.filter("number")}} +\def\currentreferencepage {\ctxlua{jobreferences.filter("page")}} +\def\currentreferencetitle {\ctxlua{jobreferences.filter("title")}} +\def\currentreferencerealpage{\ctxlua{jobreferences.realpage()}} % there will eb a few more \unexpanded\def\dospecialin{\doinatreference\currentreferencenumber} \unexpanded\def\dospecialat{\doinatreference\currentreferencepage} @@ -1039,18 +725,14 @@ {\def\dododoinatreference{\dodododoinatreference{#1}}% \futurelet\next\dododoinatreference} -\unexpanded\def\dospecialabout[#1]% +\unexpanded\def\dospecialabout[#1]% hm, does this work? {\dontleavehmode \bgroup + \let\crlf\space + \let\\\space \@@rfleft - \doprocessreferenceelse{#1} - {\let\crlf\space - \let\\\space - \let\dogotofixed\dogotospace - \dogotospace{\limitatetext\currentreferencetitle\@@rfwidth\unknown}[#1]} - {\unknownreference{#1}\dummyreference}% + \goto{\limitatetext\currentreferencetitle\@@rfwidth\unknown}[#1]% \@@rfright - \referenceinfo{<}{#1}% \egroup} %D We arrived at the last step. Before we do the typesetting, @@ -1065,31 +747,44 @@ %D $^\gobackwardcharacter$ $^\gonowherecharacter$}, depending %D on the direction to go. - \def\dosymbolreference#1#2[#3]% todo - {\bgroup - \setupsymbolset[\@@iasymbolset]% - \removelastskip - \ifx\currentreferencespecial\empty - \ifx\currentouterreference\empty - \ifnum0\currentrealreference=\zerocount - \ifhmode\strut\high{\symbol[\v!nowhere]}\fi - \else\ifnum0\currentrealreference>\realpageno - \dodosymbolreference{#2}{\high{\symbol[\v!next]}}% - \else\ifnum0\currentrealreference<\realpageno - \dodosymbolreference{#2}{\high{\symbol[\v!previous]}}% - \else - \ifhmode\strut\high{\symbol[\v!nowhere]}\fi - \fi\fi\fi - \else - \gotoouterlocation{#3}{\showlocation{\high{\symbol[\v!somewhere]}}}% - \fi - \else - \gotospeciallocation{#3}{\showlocation{\high{\symbol[\v!somewhere]}}}% - \fi - \egroup} - - \def\dodosymbolreference#1#2% todo - {#1\hbox{\gotorealpage\empty\empty\currentrealreference{\dolocationattributes\??ia\c!style\c!color{#2}}}} +% 1 = whatever +% 2 = forward, following page +% 3 = backward, preceding page +% 4 = forward, same page +% 5 = backward, same page + +% Yet untested: + +\unexpanded\def\somewhere#1#2#3[#4]% #3 gobbles space around #2 % todo + {\goto{\ifcase\referencepagestate#1/#2\or#2\or#1\or#2\fi}[#4]} + +\unexpanded\def\atpage[#1]% todo + {\goto{\ifcase\referencepagestate + \labeltexts\v!page\dummyreference + \or + \labeltexts\v!atpage\currentreferencepage + \or + \labeltexts\v!atpage\currentreferencepage + \or + \labeltexts\v!atpage\currentreferencepage + \or + \labeltext\v!hereafter + \or + \labeltext\v!hencefore + \fi}[#1]} + +\def\dosymbolreference#1#2[#3]% + {\removeunwantedspaces + \goto{\setupsymbolset[\@@iasymbolset]\high{\symbol + [\ifcase\referencepagestate + \v!somewhere + \or % same + \v!nowhere + \or % before + \v!previous + \or % after + \v!next% + \fi]}}[#3]} %D The other alternatives just conform their names: only the %D label, only the text, or the label and the text. @@ -1098,19 +793,18 @@ {\unknownreference{#3}\dotextprefix{#2}\dummyreference}% \def\docompletereference#1#2[#3]% - {\iflocationsplit - \doifsomespaceelse{#2}\dogotospace\dogotofixed{\dotextprefix{#2}#1}[#3]% - \else - \dogotofixed{\dotextprefix{#2}#1}[#3]% - \fi} + {\goto{\dotextprefix{#2}#1}[#3]} + +% \def\dolabelonlyreference#1#2[#3]% +% {\doifsomespaceelse{#2}% space? +% {\doifsomething{#2}{\goto{#2}[#3]}} +% {\goto{\dotextprefix{#2}}[#3]}} \def\dolabelonlyreference#1#2[#3]% - {\doifsomespaceelse{#2} - {\doifsomething{#2}{\dogotospace{#2}[#3]}} - {\dogotofixed{\dotextprefix{#2}}[#3]}} + {\goto{\dotextprefix{#2}}[#3]} \def\dotextonlyreference#1#2[#3]% - {\dotextprefix{#2}\dogotofixed{#1}[#3]} + {\dotextprefix{#2}\goto{#1}[#3]} \let\dowantedreference\docompletereference @@ -1158,8 +852,7 @@ \fi} \def\noexecutelabelreferenceformat#1% - {\doifvaluesomething{\??rf#1\c!text} - {\gdef\textofreference{\csname\??rf#1\c!text\endcsname}}% + {\doifvaluesomething{\??rf#1\c!text}{\gdef\textofreference{\csname\??rf#1\c!text\endcsname}}% \csname\??rf#1\c!command\endcsname} \def\doexecutelabelreferenceformat#1% @@ -1171,8 +864,7 @@ {\gdef\leftofreference {\csname\??rf#1\c!left \endcsname}% \gdef\rightofreference{\csname\??rf#1\c!right\endcsname}% \global\let\textofreference\empty % otherwise ~ added - \doifelsevaluenothing{\??rf#1\c!label} - \noexecutelabelreferenceformat\doexecutelabelreferenceformat{#1}} + \doifelsevaluenothing{\??rf#1\c!label}\noexecutelabelreferenceformat\doexecutelabelreferenceformat{#1}} \let\leftofreference \relax \let\rightofreference\relax @@ -1192,12 +884,10 @@ \def\dododododoinatreference#1#2[#3]% {\dontleavehmode % replaces \leaveoutervmode \begingroup - \forgetall \postponenotes \doifreferencefoundelse{#3} {\doifelsenothing{#1}\dosymbolreference\dowantedreference{#1}{#2}[#3]}% {\dounknownreference{#1}{#2}[#3]}% - \referenceinfo<{#3}% \endgroup} %D In interactive documents going to a specific location is not @@ -1211,85 +901,127 @@ %D %D \showsetup{goto} %D -%D One important chaacteristic is that the first argument of +%D One important characteristic is that the first argument of %D \type{\goto} (and therefore \type{\at} and \type{\in} is %D split at spaces. This means that, although hyphenation is %D prevented, long references can cross line endings. -\newif\ifsharesimilarreferences \sharesimilarreferencestrue -\newcount\similarreference % 0=noppes 1=create/refer 2,3,..=refer +\newconditional\uselocationstrut \settrue\uselocationstrut -\unexpanded\def\goto#1#2% - {\dogoto{#1}#2} +\def\extrareferencearguments{\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow,"\currentviewerlayer"} + +\unexpanded\def\directgoto {\ifconditional\uselocationstrut\expandafter\dodirectgoto\else\expandafter\directgotohtdp\fi} +\unexpanded\def\goto {\ifconditional\uselocationstrut\expandafter\dogoto \else\expandafter\gotohtdp \fi} + +\def\dodirectgoto#1[#2]% no test for valid references + {\dontleavehmode + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.inject("\referenceprefix","#2",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}% + \setlocationattributes\??ia + \setstrut % can be option + \attribute\referenceattribute\lastreferenceattribute + \fi + #1% + \endgroup} + +\def\dodirectgotohtdp#1[#2]% no test for valid references + {\dontleavehmode + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.inject("\referenceprefix","#2",\number\dimexpr\@@iaheight\relax,\number\dimexpr\@@iadepth\relax,\extrareferencearguments)}% + \setlocationattributes\??ia + \attribute\referenceattribute\lastreferenceattribute + \fi + #1% + \endgroup} \def\dogoto#1[#2]% {\dontleavehmode - \bgroup - \postponenotes - % todo: handle empty #1 - \doifelsenothing{#1}{\dosymbolreference{}{}}{\dogotospace{#1}}[#2]% - \egroup - \referenceinfo{<}{#2}} - -% inefficient, we need to save the shared one (just reuse last command in lua) - -\def\dogotoprocessisolatedword#1#2% - {\ifisolatedwords\ifsharesimilarreferences - \global\advance\similarreference \plusone - \fi\fi - \hbox\bgroup - \doprocessreferenceelse{#1}{#2\presetgoto}{\unknownreference{#1}#2\relax}% - \egroup}% - -\def\dogotospace#1[#2]% - {\iflocationsplit - \ifsecondaryreference\setbox\scratchbox\hbox\fi % due to space insertion - \bgroup - \let\dogotospace\dogotofixed - \iflocation - \dosetfontattribute \??ia\c!style - \dosetcolorattribute\??ia\c!color - \processisolatedwords{#1}{\dogotoprocessisolatedword{#2}}% - \else - #1\relax % \relax prevents #1's next macros from gobbling \fi - \fi - \egroup + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.doifelse("\referenceprefix","#2",\extrareferencearguments)}% + {\expandtexincurrentreference + \ctxlua{jobreferences.injectcurrentset(\number\ht\strutbox,\number\dp\strutbox)}% + \setlocationattributes\??ia + \setstrut % can be option + \attribute\referenceattribute\lastreferenceattribute}% + {\unknownreference{#2}}% + \fi + #1% + \endgroup} + +\def\dogotohtdp#1[#2]% + {\dontleavehmode + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.doifelse("\referenceprefix","#2",\extrareferencearguments)}% + {\expandtexincurrentreference + \ctxlua{jobreferences.injectcurrentset(\number\dimexpr\@@iaheight\relax,\number\dimexpr\@@iadepth\relax)}% + \setlocationattributes\??ia + \attribute\referenceattribute\lastreferenceattribute}% + {\unknownreference{#2}}% + \fi + #1% + \endgroup} + +\unexpanded\def\directgotobox#1[#2]% no test for valid references + {\dontleavehmode + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}% + \setlocationattributes\??ia + \hbox attr \referenceattribute \lastreferenceattribute {#1}% \else - \iflocation - \hbox\bgroup - \dosetfontattribute \??ia\c!style - \dosetcolorattribute\??ia\c!color - \doprocessreferenceelse{#2}{#1\presetgoto}{\unknownreference{#2}#1\relax}% - \egroup% - \else - #1\relax % \relax prevents #1's next macros from gobbling \fi - \fi + #1% \fi - \global\similarreference\zerocount} - -\def\dogotofixed#1[#2]% - {{\iflocation - \hbox\bgroup - \dosetfontattribute \??ia\c!style - \dosetcolorattribute\??ia\c!color - \doprocessreferenceelse{#2}{#1\presetgoto}{\unknownreference{#2}#1\relax}% - \egroup - \else - #1% - \fi}} - -%D In case the auto split feature is not needed or even not -%D even wanted, \type{\gotobox} can be used. - -\unexpanded\def\gotobox#1[#2]% + \endgroup} + +\unexpanded\def\directgotospecbox#1#2[#3]% no test for valid references {\dontleavehmode - \bgroup - \locationstrutfalse - \doprocessreferenceelse{#2} - {\dogotofixed{#1}[#2]} - {\hbox{\unknownreference{#2}#1}}% - \referenceinfo{<}{#2}% - \egroup} + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.inject("\referenceprefix","#3",nil,nil,\extrareferencearguments)}% + \setlocationcolorspec{#1}% no consequence for strut + \hbox attr \referenceattribute \lastreferenceattribute {#2}% + \else + #2% + \fi + \endgroup} + +\unexpanded\def\directgotodumbbox#1[#2]% no test for valid references + {\dontleavehmode + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}% + \hbox attr \referenceattribute \lastreferenceattribute {#1}% + \else + #1% + \fi + \endgroup} + +\unexpanded\def\gotobox#1[#2]% no test for valid references + {\dontleavehmode + \begingroup + \attribute\referenceattribute\attributeunsetvalue + \iflocation + \ctxlua{jobreferences.doifelse("\referenceprefix","#2",\extrareferencearguments)}% + {\expandtexincurrentreference + \ctxlua{jobreferences.injectcurrentset(nil,nil)}% + \setlocationattributes\??ia + \hbox attr \referenceattribute \lastreferenceattribute {#1}}% + {\unknownreference{#2}}% + \else + #1% + \fi + \endgroup} %D An reference to another document can be specified as a file %D or as an \URL. Both are handled by the same mechanism and @@ -1352,9 +1084,6 @@ \def\dousefile[#1][#2][#3]% {\ctxlua{jobreferences.files.define("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}} -% \doifsomething\@@urstyle{\let\@@iastyle\@@urstyle\let\@@urstyle\empty}% -% \doifsomething\@@urcolor{\let\@@iacolor\@@urcolor\let\@@urcolor\empty}% - %D \macros %D {url,setupurl} %D @@ -1439,12 +1168,6 @@ %D \goto{some text}[identifier::location] %D \stoptyping -\def\gotofilespecial#1#2#3#4% special operation arguments data - {\begingroup\iflocation\gotoouterfile{#2}{#3}{#4}\else#4\fi\endgroup} - -\def\gotourlspecial#1#2#3#4% special operation arguments data - {\begingroup\iflocation\gotoouterurl{#2}{#3}{#4}\else#4\fi\endgroup} - %D A special case of references are those to programs. These, %D very system dependant references are implemented by abusing %D some of the previous macros. @@ -1475,20 +1198,6 @@ \ctxlua{jobreferences.programs.get("#1","\@@pralternative","\@@prspace")}% \endgroup} -% needs an update: program(abc{arg}) - -\def\gotoprogramspecial#1#2#3#4% special operation arguments data - {\begingroup - \iflocation - \dohandlegoto - {#4}% - {\dostartrunprogram\buttonwidth\buttonheight{\@@prdirectory#2}{#3}}% - {\dostoprunprogram}% - \else - #4% - \fi - \endgroup} - %D As we can see, we directly use the special reference %D mechanism, which means that %D @@ -1544,40 +1253,12 @@ %D %D In future versions there will be more sophisticated -%D support, also suitable for references to floating bodies. - -\def\analysedreference#1% - {\ctxlua{jobreferences.analysis("\referenceprefix","#1")}} - -\unexpanded\def\somewhere#1#2#3[#4]% #3 gobbles space around #2 % todo - {\dontleavehmode - \ifcase\analysedreference{#4}\relax - \unknownreference{#4}#1/#2% - \or - \doifelsenothing{#2}{\dosymbolreference{}{}[#4]}{\dogotospace{#2}[#4]}% - \or % forward - \doifelsenothing{#1}{\dosymbolreference{}{}[#4]}{\dogotospace{#1}[#4]}% - \or % backward - \doifelsenothing{#2}{\dosymbolreference{}{}[#4]}{\dogotospace{#2}[#4]}% - \fi - \referenceinfo{<}{#4}} - -\unexpanded\def\atpage[#1]% todo - {\dontleavehmode -% \docheckrealreferencepage{}% -% \doifreferencefoundelse{#1} -% {\ifrealreferencepage -% \ifforwardreference -% \dogotofixed{\labeltext\v!hencefore}[#1]% -% \else -% \dogotofixed{\labeltext\v!hereafter}[#1]% -% \fi -% \else -% \dogotofixed{\labeltexts\v!atpage\currentpagereference}[#1]% -% \fi} -% {\unknownreference{#1}% -% \labeltexts\v!page\dummyreference}% - \referenceinfo{<}{#1}} +% 0 = no page reference +% 1 = same page +% 2 = preceding page +% 3 = following page +% 4 = backward, same page (todo) +% 5 = forward, same page (todo) %D We can cross link documents by using: %D @@ -1653,7 +1334,6 @@ {\begingroup \doifvalue{#1\c!state}\v!stop\locationfalse \iflocation - \resetgoto \ConvertConstantAfter\doifelse{#3}\v!none\hphantom\hbox {\doifelsenothing{#4} {\setlocationboxnop#1[#2]{#3}[#4]} @@ -1664,6 +1344,9 @@ \fi \endgroup} +\setupbuttons + [\c!state=\v!start] + %D Interaction buttons, in fact a row of tiny buttons, are %D typically only used for navigational purposed. The next %D macro builds such a row based on a specification list. @@ -1722,7 +1405,7 @@ \divide\!!widtha \!!counta \!!widthb\@@ibwidth \fi - \def\goto##1% clash ? + \def\xgoto##1% clash ? {\setnostrut \edef\localreference{##1}% \normalexpanded{\noexpand\dodocomplexbutton\??ib[\c!height=\the\!!heighta,\c!width=\the\!!widtha]}% @@ -1732,15 +1415,15 @@ \hbox to \!!widthb {\processallactionsinset [#2] - [ \v!page=>\goto\v!firstpage - \goto\v!nextpage - \goto\v!previouspage - \goto\v!lastpage, - \v!subpage=>\goto\v!firstsubpage - \goto\v!nextsubpage - \goto\v!previoussubpage - \goto\v!lastsubpage, - \s!unknown=>\goto\commalistelement]% + [ \v!page=>\xgoto\v!firstpage + \xgoto\v!nextpage + \xgoto\v!previouspage + \xgoto\v!lastpage, + \v!subpage=>\xgoto\v!firstsubpage + \xgoto\v!nextsubpage + \xgoto\v!previoussubpage + \xgoto\v!lastsubpage, + \s!unknown=>\xgoto\commalistelement]% \unskip}% \else \interactionbuttons[][#1]% @@ -1777,17 +1460,14 @@ \def\complexoverlaybutton[#1]% {\iflocation - \doprocessreferenceelse{#1} - {\overlayfakebox {#1}} - {\unknownreference{#1}}% + \gotobox{\overlayfakebox}[#1]% \fi} -\def\overlayfakebox#1% +\def\overlayfakebox {\hbox {\setbox\scratchbox\null \wd\scratchbox\overlaywidth \ht\scratchbox\overlayheight - \locationstrutfalse \box\scratchbox}} %D \macros @@ -1804,11 +1484,10 @@ \def\dotextprefix#1% {\begingroup - \global\labeltextdonefalse % this is an ugly dependancy, \setbox\scratchbox\hbox{#1}% to be solved some day \ifdim\wd\scratchbox>\zeropoint \unhbox\scratchbox - \iflabeltextdone\else\@@rfseparator\fi + \@@rfseparator \else \unhbox\scratchbox \fi @@ -1890,22 +1569,27 @@ \definereference [\v!ShowThumbs ] [action(thumbnails)] \definereference [\v!ShowBookmarks ] [action(bookmarks)] -\definereference [\v!firstpage] [page(\firstpage)] -\definereference [\v!previouspage] [page(\prevpage)] -\definereference [\v!nextpage] [page(\nextpage)] -\definereference [\v!lastpage] [page(\lastpage)] -\definereference [\v!firstsubpage] [page(\firstsubpage)] -\definereference [\v!previoussubpage] [page(\prevsubpage)] -\definereference [\v!nextsubpage] [page(\nextsubpage)] -\definereference [\v!lastsubpage] [page(\lastsubpage)] -\definereference [\v!first] [page(\firstpage)] -\definereference [\v!previous] [page(\prevpage)] -\definereference [\v!next] [page(\nextpage)] -\definereference [\v!last] [page(\lastpage)] -\definereference [\v!first\v!sub] [page(\firstsubpage)] -\definereference [\v!previous\v!sub] [page(\prevsubpage)] -\definereference [\v!next\v!sub] [page(\nextsubpage)] -\definereference [\v!last\v!sub] [page(\lastsubpage)] +\definereference [\v!firstpage] [page(firstpage)] +\definereference [\v!previouspage] [page(previouspage)] +\definereference [\v!nextpage] [page(nextpage)] +\definereference [\v!lastpage] [page(lastpage)] +\definereference [\v!forward] [page(forward)] +\definereference [\v!backward] [page(backward)] +\definereference [\v!firstsubpage] [page(firstsubpage)] +\definereference [\v!previoussubpage] [page(previoussubpage)] +\definereference [\v!nextsubpage] [page(nextsubpage)] +\definereference [\v!lastsubpage] [page(lastsubpage)] + +% we can do this but only when later in resolve (else problems with \chapter[first]{...} +% +% \definereference [\v!first] [page(firstpage)] +% \definereference [\v!previous] [page(prevpage)] +% \definereference [\v!next] [page(nextpage)] +% \definereference [\v!last] [page(lastpage)] +% \definereference [\v!first\v!sub] [page(firstsubpage)] +% \definereference [\v!previous\v!sub] [page(prevsubpage)] +% \definereference [\v!next\v!sub] [page(nextsubpage)] +% \definereference [\v!last\v!sub] [page(lastsubpage)] %D We cannot set up buttons (not yet, this one calls a menu macro): diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua index 74dbf90e2..b406ea1b0 100644 --- a/tex/context/base/strc-reg.lua +++ b/tex/context/base/strc-reg.lua @@ -6,7 +6,10 @@ if not modules then modules = { } end modules ['strc-reg'] = { license = "see context related readme files" } -local texwrite, texsprint, count, format, gmatch = tex.write, tex.sprint, tex.count, string.format, string.gmatch +local next, type = next, type +local texwrite, texsprint, texcount = tex.write, tex.sprint, tex.count +local format, gmatch = string.format, string.gmatch +local utfchar = utf.char local ctxcatcodes = tex.ctxcatcodes @@ -118,12 +121,16 @@ local function filter_collected(names,criterium,number,collected,prevmode) local number = tonumber(number) or 0 for i=1,#collected do local v = collected[i] - local sectionnumber = jobsections.collected[v.references.section] - if sectionnumber then - local cnumbers = sectionnumber.numbers - if (all or hash[v.metadata.name]) and #cnumbers >= depth then -- was > - if cnumbers[depth] == number then - result[#result+1] = v + local r = v.references + if r then + local sectionnumber = jobsections.collected[r.section] + if sectionnumber then + local metadata = v.metadata + local cnumbers = sectionnumber.numbers + if cnumbers then + if (all or hash[metadata.name or false]) and #cnumbers >= depth and (number == 0 or cnumbers[depth] == number) then + result[#result+1] = v + end end end end @@ -146,6 +153,20 @@ local tobesaved, collected = jobregisters.tobesaved, jobregisters.collected local function initializer() tobesaved, collected = jobregisters.tobesaved, jobregisters.collected + local internals = jobreferences.internals + for name, list in next, collected do + local entries = list.entries + for e=1,#entries do + local entry = entries[e] + local r = entry.references + if r then + local internal = r and r.internal + if internal then + internals[internal] = entry + end + end + end + end end job.register('jobregisters.collected', jobregisters.tobesaved, initializer) @@ -170,34 +191,68 @@ jobregisters.define = allocate local entrysplitter = lpeg.Ct(lpeg.splitat('+')) -function jobregisters.store(rawdata) - local data = allocate(rawdata.metadata.name).entries +local tagged = { } + +local function preprocessentries(rawdata) local entries = rawdata.entries - local et = entrysplitter:match(entries[1]) -- alse & - local kt = entrysplitter:match(entries[2]) -- alse & - entries = { } - for k=1,#et do - entries[k] = { et[k] or "", kt[k] or "" } + if entries then + local et = entrysplitter:match(entries[1]) -- alse & + local kt = entrysplitter:match(entries[2]) -- alse & + entries = { } + for k=1,#et do + entries[k] = { et[k] or "", kt[k] or "" } + end + rawdata.list = entries + rawdata.entries = nil + else + rawdata.list = { "", "" } -- br end - rawdata.list = entries - rawdata.entries = nil +end + +function jobregisters.store(rawdata) -- metadata, references, entries + local data = allocate(rawdata.metadata.name).entries + local references = rawdata.references + references.realpage = references.realpage or 0 -- just to be sure as it can be refered to + preprocessentries(rawdata) data[#data+1] = rawdata + local label = references.label + if label and label ~= "" then tagged[label] = #data end texwrite(#data) end function jobregisters.enhance(name,n) local r = tobesaved[name].entries[n] if r then - r.references.realpage = tex.count[0] + r.references.realpage = texcount.realpageno end end -function jobregisters.extend(name,n,lastsection) - local r = tobesaved[name].entries[n] - if r then - r.references.lastrealpage = tex.count[0] - r.references.lastsection = lastsection - +function jobregisters.extend(name,tag,rawdata) -- maybe do lastsection internally + if type(tag) == "string" then + tag = tagged[tag] + end + if tag then + local r = tobesaved[name].entries[tag] + if r then + local rr = r.references + rr.lastrealpage = texcount.realpageno + rr.lastsection = structure.sections.currentid() + if rawdata then + preprocessentries(rawdata) + for k,v in pairs(rawdata) do + if not r[k] then + r[k] = v + else + local rk = r[k] + for kk,vv in pairs(v) do + if vv ~= "" then + rk[kk] = vv + end + end + end + end + end + end end end @@ -225,7 +280,10 @@ function jobregisters.compare(a,b) return -1 elseif a.metadata.kind == 'entry' then -- e/f/t local page_a, page_b = a.references.realpage, b.references.realpage - if page_a < page_b then + if not page_a or not page_b then +--~ print(table.serialize(a),table.serialize(b)) + return 0 + elseif page_a < page_b then return -1 elseif page_a > page_b then return 1 @@ -248,13 +306,15 @@ function jobregisters.prepare(data) for i=1, #result do local entry, split = result[i], { } local list = entry.list - for l=1,#list do - local ll = list[l] - local key, word = ll[1], ll[2] - if key == "" then - key = word + if list then + for l=1,#list do + local ll = list[l] + local word, key = ll[1], ll[2] + if not key or key == "" then + key = word + end + split[l] = splitter(strip(key)) end - split[l] = splitter(strip(key)) end entry.split = split end @@ -262,7 +322,7 @@ function jobregisters.prepare(data) end function jobregisters.sort(data,options) - sorters.sort(data.entries,jobregisters.compare) + sorters.sort(data.result,jobregisters.compare) end function jobregisters.unique(data,options) @@ -298,23 +358,13 @@ function jobregisters.finalize(data,options) data.metadata.nofsorted = #result local split = { } -- maps character to index (order) - local se = sorters.entries[options.language or sorters.defaultlanguage] or sorters.entries[sorters.defaultlanguage] for k=1,#result do local v = result[k] - local entry, tag = v.split[1][1], "" - if se and se[entry] then - if type(se[entry]) == "number" then - entry = se[entry] - end - tag = se[entry] - else - entry = 0 - tag = "unknown" - end - local s = split[entry] + local entry, tag = sorters.firstofsplit(v.split) + local s = split[tag] -- keeps track of change if not s then s = { tag = tag, data = { } } - split[entry] = s + split[tag] = s end s.data[#s.data+1] = v end @@ -324,6 +374,7 @@ end function jobregisters.analysed(class,options) local data = collected[class] if data and data.entries then + sorters.language = options.language or sorters.defaultlanguage jobregisters.filter(data,options) -- filter entries into results (criteria) jobregisters.prepare(data,options) -- adds split table parallel to list table jobregisters.sort(data,options) -- sorts results @@ -346,18 +397,21 @@ function jobregisters.flush(data,options,prefixspec,pagespec) local result = data.result -- todo ownnumber local function pagenumber(entry) - texsprint(ctxcatcodes,"\\registeronepage{") + local er = entry.references + texsprint(ctxcatcodes,format("\\registeronepage{%s}{%s}{",er.internal or 0,er.realpage or 0)) -- internal realpage content helpers.prefixpage(entry,prefixspec,pagespec) texsprint(ctxcatcodes,"}") end local function pagerange(f_entry,t_entry,is_last) - texsprint(ctxcatcodes,"\\registerpagerange{") + local er = f_entry.references + texsprint(ctxcatcodes,format("\\registerpagerange{%s}{%s}{",er.internal or 0,er.realpage or 0)) helpers.prefixpage(f_entry,prefixspec,pagespec) - texsprint(ctxcatcodes,"}{") + local er = t_entry.references + texsprint(ctxcatcodes,format("}{%s}{%s}{",er.internal or 0,er.realpage or 0)) if is_last then - helpers.prefixpage(t_entry,prefixspec,pagespec) + helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys else - helpers.prefixlastpage(t_entry,prefixspec,pagespec) + helpers.prefixpage(t_entry,prefixspec,pagespec) end texsprint(ctxcatcodes,"}") end @@ -424,7 +478,7 @@ function jobregisters.flush(data,options,prefixspec,pagespec) first, last, prev = nil, nil, nil elseif not first then first, prev = next, next - elseif next.references.realpage - prev.references.realpage == 1 then + elseif next.references.realpage - prev.references.realpage == 1 then -- 1 ? last, prev = next, next else pages[#pages+1] = { first, last or first } @@ -449,7 +503,7 @@ function jobregisters.flush(data,options,prefixspec,pagespec) local first_last_pn = first_last .references.realpage local second_first_pn = second_first.references.realpage local second_last_pn = second_last .references.realpage - local first_last_last = first_last.references.lastrealpage + local first_last_last = first_last .references.lastrealpage local second_first_last = second_first.references.lastrealpage if first_last_last then first_last_pn = first_last_last @@ -550,7 +604,7 @@ function jobregisters.flush(data,options,prefixspec,pagespec) elseif kind == 'see' then -- maybe some day more words texsprint(ctxcatcodes,"\\startregisterseewords") - texsprint(ctxcatcodes,format("\\registeroneword{%s}",entry.seeword.text)) + texsprint(ctxcatcodes,format("\\registeroneword{0}{0}{%s}",entry.seeword.text)) -- todo: internal texsprint(ctxcatcodes,"\\stopregisterseewords") end end diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv index b764525e1..2ec448d97 100644 --- a/tex/context/base/strc-reg.mkiv +++ b/tex/context/base/strc-reg.mkiv @@ -17,12 +17,25 @@ \unprotect +\def\c!keys {keys} +\def\c!entries{entries} + % todo: tag:: becomes rendering % todo: language, character, linked, location %D Helper: -\def\doflushatpar{\ifvmode\expandafter\dogotopar\else\expandafter\firstofoneargument\fi} +% \def\doflushatpar{\ifvmode\expandafter\dogotopar\else\expandafter\firstofoneargument\fi} + +\def\doflushatpar{\ifvmode\expandafter\flushatnextpar\else\expandafter\firstofoneargument\fi} + +% \starttext +% \placeregister[index] +% \chapter{a} \index{93} \index{456} \index{***} \index{*} \index{@} +% test \index{aa} test \startregister[index][x]{bb} test \page test \page test \page test \stopregister[index][x] +% test \index{aa} test \setregisterentry[index][label=x,entries=bb] test \page test \page test \page test \finishregisterentry[index][label=x] +% test \index{aa} test \setregisterentry[index][label=y] test \page test \page test \page test \finishregisterentry[index][label=y,entries=yy] +% \stoptext % In plaats van + kan een & worden gebruikt. Ook kan als % eerste karakter worden opgegeven wat de scheider is. @@ -40,7 +53,9 @@ \let\currentregister\empty -\def\registerparameter#1{\csname\??id\currentregister#1\endcsname} +% \def\registerparameter#1{\csname\??id\currentregister#1\endcsname} + +\def\detokenizedregisterparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??id#1\endcsname}} % always root \def\registerparameter #1{\csname\doregisterparameter{\??id\currentregister}#1\endcsname} \def\registerparameterhash#1{\doregisterparameterhash {\??id\currentregister}#1} @@ -129,66 +144,72 @@ % tzt variant met n entries, parameters en userdata (altnum) -\def\doprocesspageregister#1#2#3#4#5% register tag key altnum entry +\def\doregisterstructurepageregister#1#2#3% register data userdata {\begingroup \edef\currentregister{#1}% - \edef\currentregistertag{#2}% + \getparameters[\??id][\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]% + \edef\currentregisterlabel {\registerparameter\c!label}% \edef\currentregisterexpansion{\registerparameter\c!expansion}% \edef\currentregisterownnumber{\registerparameter\c!ownnumber}% + \xdef\currentregisterkeys {\registerparameter\c!keys}% \ifx\currentregisterexpansion\s!xml \xmlstartraw - \xdef\currentregisterentries{\detokenize{#5}}% not ok yet + \xdef\currentregisterentries{\registerparameter\c!entries}% \xmlstopraw \globallet\currentregistercoding\s!xml \else \ifx\currentregisterexpansion\v!yes - \xdef\currentregisterentries{#5}% not ok yet + \xdef\currentregisterentries{\registerparameter\c!entries}% \else - \xdef\currentregisterentries{\detokenize{#5}}% not ok yet + \xdef\currentregisterentries{\detokenizedregisterparameter\c!entries}% \fi \globallet\currentregistercoding\s!tex \fi \setnextinternalreference - % we could consider storing register entries in list + % we could consider storing register entries in a list which we + % could then sort \xdef\currentregisternumber{\ctxlua{ jobregisters.store { metadata = { kind = "entry", name = "\currentregister", level = structure.sections.currentlevel(), + coding = "\currentregistercoding", catcodes = \the\catcodetable, - own = \ifx\currentregisterownnumber\v!yes "#4" \else nil \fi, % can be used instead of pagenumber + \ifx\currentregisterownnumber\v!yes + own = "\registerparameter\c!alternative", % can be used instead of pagenumber + \fi }, references = { internal = \nextinternalreference, - section = structure.sections.currentid(), + section = structure.sections.currentid(), % hm, why then not also lastsection the same way + label = "\currentregisterlabel", }, + \ifx\currentregisterentries\empty \else entries = { % we need a special one for xml, this is just a single one - \!!bs\currentregisterentries\!!es, \!!bs#3\!!es + \!!bs\currentregisterentries\!!es, \!!bs\currentregisterkeys\!!es }, + \fi + userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es) } } }% - \xdef\currentregistersynchronize % make this a macro because shared - {\noexpand\ctxlua{jobreferences.setinternalreference(nil,nil,\nextinternalreference)}% - \ifx\currentregisterownnumber\v!yes \else - \noexpand\ctxlatelua{jobregisters.enhance("\currentregister",\currentregisternumber)}% - \fi}% - \ifx\currentregistertag\empty \else - \setxvalue{\??id#1->#2}{\noexpand\dofinishpageregister{\currentregister}{\currentregisternumber}}% + \ctxlua{jobreferences.setinternalreference(nil,nil,\nextinternalreference)}% + \ifx\currentregisterownnumber\v!yes + \glet\currentregistersynchronize\relax + \else + \xdef\currentregistersynchronize{\ctxlatelua{jobregisters.enhance("\currentregister",\currentregisternumber)}}% \fi \currentregistersynchronize % here? + \attribute\destinationattribute\lastdestinationattribute \strut % todo \endgroup} -\def\dofinishpageregister#1#2% - {\ctxlatelua{jobregisters.extend("#1",#2,\ctxlua{tex.write(structure.currentsectionnumber())}}} - \def\doregister[#1][#2]% {\def\currentregister{#1}% \doifelse{\registerparameter\c!ownnumber}\v!yes\dodoregister\donoregister{#1}{#2}} -\def\donoregister #1#2{\doflushatpar{\doprocesspageregister{#1}{}{}{#2}}} % register key - entry -\def\dodoregister#1#2#3{\doflushatpar{\doprocesspageregister{#1}{}{#2}{#3}}} % register key altnum entry +\def\donoregister #1#2#3{\doflushatpar{\doregisterstructurepageregister{#1}{\c!keys={#2},\c!entries={#3}}{}}} +\def\dodoregister#1#2#3#4{\doflushatpar{\doregisterstructurepageregister{#1}{\c!keys={#2},\c!alternative=#3,\c!entries={#4}}{}}} \def\startregister{\doquadrupleempty\dostartregister} \def\stopregister {\dodoubleargument\dostopregister} @@ -199,19 +220,72 @@ \let\closeregisterrange\stopregister \def\dostartregister[#1][#2][#3][#4]#5% - {\iffourthargument - % #1=register #2=tag #3=own #4=sortkey #5=entry - \doflushatpar{\doprocesspageregister{#1}{#2}{#4}{#3}{#5}}% - \else - % #1=register #2=tag #3=sortkey #5=entry - \doflushatpar{\doprocesspageregister{#1}{#2}{#3}{}{#5}}% - \fi} + {\iffourthargument + % #1=register #2=tag #3=own #4=sortkey #5=entry + \doflushatpar{\doregisterstructurepageregister{#1}{\c!label=#2,\c!alternative=#3,\c!keys={#4},\c!entries={#5}}{}}% + \else + % #1=register #2=tag #3=sortkey #5=entry + \doflushatpar{\doregisterstructurepageregister{#1}{\c!label=#2,\c!keys={#3},\c!entries={#5}}{}}% + \fi} \def\dostopregister[#1][#2]% - {\ifcsname\??id#1->#2\endcsname - \getvalue{\??id#1->#2}% - \letgvalue{\??id#1->#2}\relax - \fi} + {\normalexpanded{\ctxlatelua{jobregisters.extend("#1","#2")}}} + +\def\setregisterentry {\dotripleempty\dosetregisterentry} +\def\finishregisterentry{\dotripleempty\dofinishregisterentry} + +\def\dosetregisterentry [#1][#2][#3]{\doflushatpar{\doregisterstructurepageregister{#1}{#2}{#3}}} +\def\dofinishregisterentry[#1][#2][#3]{\dofinishregisterstructurepageregister{#1}{#2}{#3}} + +\def\dofinishregisterstructurepageregister#1#2#3% register data userdata + {\begingroup + \edef\currentregister{#1}% + \getparameters[\??id][\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]% + \edef\currentregisterlabel {\registerparameter\c!label}% + \edef\currentregisterexpansion{\registerparameter\c!expansion}% + \edef\currentregisterownnumber{\registerparameter\c!ownnumber}% + \xdef\currentregisterkeys {\registerparameter\c!keys}% + \ifx\currentregisterexpansion\s!xml + \xmlstartraw + \xdef\currentregisterentries{\registerparameter\c!entries}% + \xmlstopraw + \globallet\currentregistercoding\s!xml + \else + \ifx\currentregisterexpansion\v!yes + \xdef\currentregisterentries{\registerparameter\c!entries}% + \else + \xdef\currentregisterentries{\detokenizedregisterparameter\c!entries}% + \fi + \globallet\currentregistercoding\s!tex + \fi + \ifx\currentregisterentries\empty + \normalexpanded{\ctxlua{jobregisters.extend("\currentregister","\currentregisterlabel", { + metadata = { + \ifx\currentregisterownnumber\v!yes + own = "\registerparameter\c!alternative", % can be used instead of pagenumber + \fi + }, + userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es) + })% + }}% + \else + \normalexpanded{\ctxlua{jobregisters.extend("\currentregister","\currentregisterlabel", { + metadata = { + catcodes = \the\catcodetable, + coding = "\currentregistercoding", + \ifx\currentregisterownnumber\v!yes + own = "\registerparameter\c!alternative", % can be used instead of pagenumber + \fi + }, + entries = { + % we need a special one for xml, this is just a single one + \!!bs\currentregisterentries\!!es, \!!bs\currentregisterkeys\!!es + }, + userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es) + }) + }}% + \fi + \endgroup} \def\doseeregister[#1][#2]#3#4% {\doflushatpar{\doprocessseeregister{#1}{#2}{#3}{#4}}} @@ -278,7 +352,7 @@ \newtoks\everyplaceregister \appendtoks - \dontcomplain + \dontcomplain \to \everyplaceregister \def\placeregister @@ -287,6 +361,7 @@ \def\doplaceregister[#1][#2]% {\iffirstargument \begingroup +% \forgetall \edef\currentregister{#1}% \setupregister[\currentregister][#2]% \the\everyplaceregister @@ -371,9 +446,10 @@ \def\defaultregistercharacter#1% {\doifsomething{#1} - {\doifelse{\registerparameter\c!indicator}\v!yes - {\executeifdefined{\strippedcsname\doregistercharacter\registerparameter\c!alternative}\doregistercharactera{#1}} - {\noregistercharacter{#1}}}} + {\doifnot{#1}\s!unknown + {\doifelse{\registerparameter\c!indicator}\v!yes + {\expandcheckedcsname{\??id:\c!indicator:}{\registerparameter\c!alternative}{a}{#1}} + {\noregistercharacter{#1}}}}} \def\noregistercharacter#1% {\registerparameter\c!before @@ -381,10 +457,9 @@ % a = <before> <goodbreak> <character> <par> <after> <nobreak> -\def\doregistercharactera#1% +\setvalue{\??id:\c!indicator:a}#1% {\registerparameter\c!before \vskip\lineheight\goodbreak\vskip-\lineheight - \ifhmode\unskip\else\noindent\fi % brrr \begingroup\dosetregisterattributes\c!style\c!color \registerparameter\c!command{\strut#1}% \endgroup @@ -393,28 +468,29 @@ % b = <goodbreak> <before> <character> <after> <nobreak> -\def\doregistercharacterb#1% here no lineheight hackery ! ! ! +\setvalue{\??id:\c!indicator:b}#1% {\registerparameter\c!before - \ifhmode\unskip\else\noindent\fi % brrr \begingroup\dosetregisterattributes\c!style\c!color \registerparameter\c!command{\strut#1}% \endgroup \registerparameter\c!after \nobreak} -% extra: - -\def\doregistercharacterA#1{\doregistercharactera{\WORD{#1}}} -\def\doregistercharacterB#1{\doregistercharacterb{\WORD{#1}}} +\setvalue{\??id:\c!indicator:A}#1{\getvalue{\??id:\c!indicator:a}{\WORD{#1}}} +\setvalue{\??id:\c!indicator:B}#1{\getvalue{\??id:\c!indicator:b}{\WORD{#1}}} %D The following macros are the interface to the rendering. These are %D generated by \LUA. This might change. \def\startregisteroutput - {\endgraf} + {\endgraf + \begingroup + \forgetparindent + \forgetparskip} \def\stopregisteroutput - {\endgraf} + {\endgraf + \endgroup} \def\startregisterentries#1% depth {\endgraf @@ -459,14 +535,14 @@ \settrue\registerpagedone \fi} -\def\registeronepage#1% content - {\registerpageseparator\registerparameter\c!pagecommand{#1}} +\def\registeronepage#1#2#3% content + {\registerpageseparator\registerparameter\c!pagecommand{\goto{#3}[internal(#1)]}} -\def\registerpagerange#1#2% content, content todo: -- configurable - {\registerpageseparator\registerparameter\c!pagecommand{#1}|--|\registerparameter\c!pagecommand{#2}} +\def\registerpagerange#1#2#3#4#5#6% content, content todo: -- configurable + {\registerpageseparator\registerparameter\c!pagecommand{\goto{#3}[internal(#1)]}|--|\registerparameter\c!pagecommand{\goto{#6}[internal(#4)]}} -\def\registeroneword#1% content - {\registerpageseparator\registerseeword{#1}} +\def\registeroneword#1#2#3% content + {\registerpageseparator\registerseeword{#3}} \def\defaultregisterentry #1{\registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#1}}}} \def\defaultregisterseeword#1{\labeltexts\v!see{#1}} @@ -506,14 +582,6 @@ \setregisterpagerendering \to \everyplaceregister -%D Don't use \type{\string#2}; another hack is needed, since -%D \type {#2} can be \type {\string} itself. -% -% \def\doregisterreference[#1]#2% -% {\doifsomething{#2} -% {\doif{\registerparameter\c!referencing}\v!on -% {\pagereference[#1:\strippedcsname#2]}}} - % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv index c2b8ffd83..8890ec8e6 100644 --- a/tex/context/base/strc-ren.mkiv +++ b/tex/context/base/strc-ren.mkiv @@ -89,15 +89,17 @@ % \newif\ifemptyhead % \newif\ifdisplaysectionhead +\def\structureheadattribute{\iflocation attr \destinationattribute \currentstructureattribute\fi} + \def\doplacestructureheadtext#1#2#3% nodes, text, endstuff {\beginheadplacement -\postponenotes +% \postponenotes \doresettructureheadnumbercontent - \ifconditional\structureheadleaveempty % \ifemptyhead - \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi to \zeropoint{#1}% + \ifconditional\structureheadleaveempty + \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint {#1}% \makestrutofbox\sectionheadbox \else - \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi + \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute {\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 @@ -107,13 +109,13 @@ \def\doplacestructureheadnumbertext#1#2#3#4% nodes number text nodes {\beginheadplacement -\postponenotes +% \postponenotes \doiftextelse{#2}\dosettructureheadnumbercontent\doresettructureheadnumbercontent - \ifconditional\structureheadleaveempty % \ifemptyhead % = needed - \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi to \zeropoint{#1}% + \ifconditional\structureheadleaveempty + \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{#1}% \makestrutofbox\sectionheadbox \else % = needed - \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi + \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute {\ifcase\headtimingmode\or#1\fi \dosetfontattribute{\??nh\currentstructurehead}\c!style \structureheadparameter\c!command{\doplaceheadnumbercomponent{#1}{#2}}{\doplaceheadtextcomponent{#1}{#3}}}% @@ -127,7 +129,7 @@ {\doplacestructureheadtext\empty\getstructureheadtitle\getstructureheadsyncs} \def\placestructureheadnothing - {\getstructureheadsyncs} + {\hbox \structureheadattribute {\getstructureheadsyncs}} %D \starttyping %D \def\StretchedBox#1% @@ -188,8 +190,7 @@ \resetinteractionparameter\c!color \resetinteractionparameter\c!contrastcolor %\strictouterreferencestrue % tzt instelling - \let\localheadsetup\dolocalheadsetup - \startsynchronization} + \let\localheadsetup\dolocalheadsetup} % \setuphead[chapter] [style=\bfd,after=,hang=line] % fit broad 2 % \setuphead[section] [style=\bfc,after=,hang=line] @@ -227,13 +228,9 @@ \newbox\sectionheadbox \def\endheadplacement#1% - {\doifelse{\structureheadparameter\c!state}\v!start - {\doifnothing{\structureheadparameter\c!file}{\autocrossdocumentfalse}} - {\autocrossdocumentfalse}% - % no message needed here, should be a proper switch - \noflines\zerocount + {\noflines\zerocount \ifconditional\structureheadisdisplay % \ifdisplaysectionhead - % new (tod tight == one following line up) + % new (todo tight == one following line up) \processaction [\structureheadparameter\c!hang] [ \v!line=>\hangheadplacement\noflines\zerocount, @@ -247,19 +244,8 @@ \snaptogrid[\structureheadparameter\c!grid]\hbox {\hskip\localheadskip \hskip\structureheadparameter\c!margin\relax - \iflocation -% \ifautocrossdocument -% \doifreferencefoundelse{\structureheadparameter\c!file::\currentstructurehead} -% {\edef\currentinnerreference{\s!aut:\currenttextreference}% stored in -% \gotoouterlocation{}{\box\sectionheadbox}} % text slot -% {\hbox{\box\sectionheadbox}}% -% \else - \hbox{\box\sectionheadbox}% -% \fi - \else - \hbox{\box\sectionheadbox}% - \fi}% - \doflushnotes % new, not really needed + \box\sectionheadbox}% + \flushnotes % new, not really needed \endgraf \ifvmode \ifnum\noflines>\zerocount @@ -271,21 +257,9 @@ #1% \else \strut - \doflushnotes % new, here since we're in par mode - \iflocation - \ifautocrossdocument - \hhboxindent=\ifconditional\continuoussectionhead\headlastlinewidth\else\zeropoint\fi - \unhhbox\sectionheadbox\with{\gotobox{\box\hhbox}[\structureheadparameter\c!file::\currentstructurehead]}% - \advance\lasthhboxwidth by \numberheaddistance - \xdef\headlastlinewidth{\the\lasthhboxwidth}% - \else - \unhbox\sectionheadbox - \globallet\headlastlinewidth\!!zeropoint - \fi - \else - \unhbox\sectionheadbox - \globallet\headlastlinewidth\!!zeropoint - \fi + \flushnotes % new, here since we're in par mode + \unhbox\sectionheadbox + \globallet\headlastlinewidth\!!zeropoint #1% \hskip\numberheaddistance\!!plus\numberheaddistance\!!minus.25\dimexpr\numberheaddistance\relax \hskip\continuousstructureheadsignal\ignorespaces @@ -299,7 +273,6 @@ \fi \fi \fi - \stopsynchronization \egroup \egroup \ifconditional\structureheadisdisplay % \ifdisplaysectionhead @@ -331,10 +304,13 @@ {\setvalue{\??ns:#1}{#2}% \setvalue{\??ns::#1}} +% \def\normalplacehead +% {\executeifdefined +% {\??ns::\numberheadalternative} +% {\getvalue{\??ns::\v!normal}}} + \def\normalplacehead - {\executeifdefined - {\??ns::\numberheadalternative} - {\getvalue{\??ns::\v!normal}}} + {\csname\??ns::\ifcsname\??ns::\numberheadalternative\endcsname\numberheadalternative\else\v!normal\fi\endcsname} \defineheadplacement[\v!paragraph][\v!vertical]#1#2% {\vbox diff --git a/tex/context/base/strc-sec.mkii b/tex/context/base/strc-sec.mkii index ef85d1e7a..0698ef93c 100644 --- a/tex/context/base/strc-sec.mkii +++ b/tex/context/base/strc-sec.mkii @@ -1325,6 +1325,25 @@ \let\fullsectionnumber\limitedfullsectionnumber +% from cont-new: + +\def\expandifnonempty#1% + {\@EA\ifx\csname#1\endcsname\empty + \expandafter\secondoftwoarguments + \else + \expandafter\firstoftwoarguments + \fi + {\csname#1\endcsname}} + +\def\@@sectiekoppeling#1% + {\expandifnonempty{\??ko#1\c!coupling}{#1}} + +\def\@@sectiesectie#1% + {\expandifnonempty{\??ko#1\c!section}{\@@sectiekoppeling{#1}}} + +\def\sectioncountervalue#1% + {\@@sectionvalue{\@@sectiesectie{#1}}} + % \dodododoconstructhead IS NON GROUPED, SO WE NEED TO RESTORE !!!! % % dit kan dus beter \everyaroundhead zijn diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv index 1768325f6..fef1dd01e 100644 --- a/tex/context/base/strc-sec.mkiv +++ b/tex/context/base/strc-sec.mkiv @@ -122,7 +122,8 @@ {\processcommalist[#1]{\dodosetupstructurehead{#2}}} \def\dodosetupstructurehead#1#2% - {\getparameters[\??nh#2][#1]% + {\edef\currentstructurehead{#2}% + \getparameters[\??nh#2][#1]% \the\everystructureheadsetup} \def\dodefinestructurehead[#1][#2]% @@ -218,25 +219,24 @@ \def\dodohandlestructureheadown[#1][#2]#3#4% {\settrue\currentstructureown - \dohandlestructurehead{#1}{\c!reference=#2,\c!ownnumber={#3},\c!title={#4}}{}} % name ref nr title -- + \dohandlestructurehead{#1}{\c!reference={#2},\c!ownnumber={#3},\c!title={#4}}{}} % name ref nr title -- \def\dodohandlestructureheadnop[#1][#2]#3% {\setfalse\currentstructureown - \dohandlestructurehead{#1}{\c!reference=#2,\c!title={#3}}{}} % name ref nr title -- + \dohandlestructurehead{#1}{\c!reference={#2},\c!title={#3}}{}} % name ref nr title -- \newtoks\everybeforestructurehead % hook, todo: before/after keys \newtoks\everyafterstructurehead % hook, todo: before/after keys \def\dodostartstructurehead[#1][#2][#3]% for the moment no grouping, too annoying with page breaks {\setfalse\currentstructureown - \globalpushmacro\currentstructurehead + %\globalpushmacro\currentstructurehead \xdef\currentstructurehead{#1}% \the\everybeforestructurehead \dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata \def\dostopstructurehead[#1]% - {\globalpopmacro\currentstructurehead - \doifnot{#1}\currentstructurehead{\writestatus\m!systems{missing \letterbackslash\e!stop#1}}% + {%\globalpopmacro\currentstructurehead \xdef\currentstructurehead{#1}% recover \the\everyafterstructurehead} @@ -300,11 +300,6 @@ \v!empty=>\settrue\structureheadleaveempty, \v!no=>\settrue\structureheadleaveempty\setfalse\structureheaddoplace]} -\def\setstructureheadreset % todo, also set resetset here - {\doifelse{\structureheadparameter\c!resetnumber}\v!no - {\setfalse\@@resetsubheadnumbers}% - {\settrue \@@resetsubheadnumbers}} - \def\setstructureheaddisplay {\doifelsevalue{\??nh:\structureheadparameter\c!alternative}\v!horizontal {\setfalse\structureheadisdisplay} @@ -329,17 +324,13 @@ \setfalse\structureheadshownumber \fi} -% \defconvertexpanded\asciititle{\getvalue{\??ko#1\c!expansion}}{#4}% - -% \unexpanded\def\\{\space} - \def\thestructureheadsynchonization {\pagetype[\currentstructureheadcoupling]% hm also number \normalexpanded{\noexpand\setmarking[\currentstructureheadcoupling]{\currentstructurelistnumber}}% \currentstructuresynchronize} \def\fullstructureheadnumber{\labeltexts{\structureheadparameter\c!label}{\structurenumber}} % todo -\def\fullstructureheadtitle {\structurecctvalue{titledata.title}} % todo +\def\fullstructureheadtitle {\structurevariable{titledata.title}} % no catcode! \let\currentstructurehead \empty \let\currentstructureheadcoupling\empty @@ -356,8 +347,10 @@ \c!name=#1, \c!number=\ifconditional\structureheadshownumber\v!yes\else\v!no\fi, \c!bookmark=, + \c!marking=, + \c!list=, \c!expansion=\structureheadparameter\c!expansion, - \c!reset=\structureheadparameter\c!reset, + \c!sectionresetset=\structureheadparameter\c!sectionresetset, \c!sectionseparatorset=\structureheadparameter\c!sectionseparatorset, \c!sectionconversionset=\structureheadparameter\c!sectionconversionset, \c!sectionconversion=\structureheadparameter\c!conversion, % just for compatibility @@ -401,7 +394,6 @@ \setstructureheadreference{#3}% will change \setstructureheadincrement \setstructureheadplacement - \setstructureheadreset \setstructureheaddisplay \setstructureheadnumber % @@ -496,15 +488,26 @@ {\docheckstructureheadbefore\docheckstructureheadlayout \structureheadparameter\c!inbetween} +% \def\emptystructureheadcorrection +% {\ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank) +% \vskip-\lineheight +% \dosomebreak\nobreak % \penalty10000 in vspacing +% \kern\zeropoint +% \prevdepth\strutdepth +% \fi} + +\def\emptystructureheadcorrection + {\ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank) + \penalty10000 % first ... we need to adapt this all to vspacing + \vskip-\lineheight + \kern\zeropoint + \prevdepth\strutdepth + \fi} + \def\dostructureheadspacingafteryes {\ifconditional\structureheadisdisplay - \dosomebreak\nobreak - \ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank) - \vskip-\lineheight - \dosomebreak\nobreak - \kern\zeropoint - \prevdepth\strutdepth - \fi + \dosomebreak\nobreak % needs to be adapted to vspacing + \emptystructureheadcorrection \structureheadparameter\c!after \fi} diff --git a/tex/context/base/strc-syn.lua b/tex/context/base/strc-syn.lua index 00ee2fdc2..d9b7b9a57 100644 --- a/tex/context/base/strc-syn.lua +++ b/tex/context/base/strc-syn.lua @@ -122,20 +122,10 @@ function joblists.finalize(data,options) local result = data.result data.metadata.nofsorted = #result local split = { } - local se = sorters.entries[options.language or sorters.defaultlanguage] or sorters.entries[sorters.defaultlanguage] for k=1,#result do local v = result[k] - local entry, tag = v.split[1], "" - if se and se[entry] then - if type(se[entry]) == "number" then - entry = se[entry] - end - tag = se[entry] - else - entry = 0 - tag = "unknown" - end - local s = split[entry] + local entry, tag = sorters.firstofsplit(v.split) + local s = split[entry] -- keeps track of change if not s then s = { tag = tag, data = { } } split[entry] = s diff --git a/tex/context/base/supp-box.tex b/tex/context/base/supp-box.tex index dc6833e6a..e2f537a8c 100644 --- a/tex/context/base/supp-box.tex +++ b/tex/context/base/supp-box.tex @@ -210,8 +210,7 @@ \if#1b\nextboxdp\zeropoint\fi\fi\fi\fi\fi} \def\finsm@sh % redefined plain macro - {\dowithnextbox - {\@EA\handletokens\@@smash\with\makesm@sh\flushnextbox}\normalhbox} + {\dowithnextbox{\@EA\handletokens\@@smash\with\makesm@sh\flushnextbox}\normalhbox} %D \starttabulate[|l|l|] %D \NC w \NC \ruledhbox{\smash [w]{This is some great smashing, isn't it?}} \NC \NR @@ -300,7 +299,7 @@ %D number. \def\getboxheight#1\of#2\box#3% - {\def\next{#1\ht\registercount\advance#1\dp\registercount}% + {\def\next{#1\dimexpr\ht\registercount+\dp\registercount\relax}% \afterassignment\next\registercount=#3} %D For a long time the following three macros were part of @@ -351,46 +350,92 @@ \newcount\noflines \newdimen\noflinesheight -\def\getnoflines {\xdogetnoflines\plusone } % compensated -\def\getroundednoflines{\xdogetnoflines\plustwo } % rounded -\def\getrawnoflines {\xdogetnoflines\plusthree} % truncated +% \def\getnoflines {\xdogetnoflines\plusone } % compensated +% \def\getroundednoflines{\xdogetnoflines\plustwo } % rounded +% \def\getrawnoflines {\xdogetnoflines\plusthree} % truncated +% +% \def\xdogetnoflines#1#2% +% {\noflinesheight#2\relax +% \ifzeropt\noflinesheight +% \noflines\zerocount +% \else\ifdim\noflinesheight>\zeropoint +% \ifcase#1\or +% \advance\noflinesheight-\roundingeps +% \divide\noflinesheight\openlineheight +% \noflines\noflinesheight +% \advance\noflines\plusone +% \or +% \advance\noflinesheight\roundingeps +% \divide\noflinesheight\openlineheight +% \noflines\noflinesheight +% \or +% \advance\noflinesheight\roundingeps +% \advance\noflinesheight.5\openlineheight +% \divide\noflinesheight\openlineheight +% \noflines\noflinesheight +% \fi +% \else +% \ifcase#1\or +% \advance\noflinesheight\roundingeps +% \divide\noflinesheight\openlineheight +% \noflines\noflinesheight +% \advance\noflines\minusone +% \or +% \advance\noflinesheight-\roundingeps +% \divide\noflinesheight\openlineheight +% \noflines\noflinesheight +% \or +% \advance\noflinesheight-\roundingeps +% \advance\noflinesheight-.5\openlineheight +% \divide\noflinesheight\openlineheight +% \noflines\noflinesheight +% \fi +% \fi\fi} -\def\xdogetnoflines#1#2% - {\noflinesheight#2\relax +\def\getnoflines#1% + {\noflinesheight#1\relax \ifzeropt\noflinesheight \noflines\zerocount - \else\ifdim#2>\zeropoint - \ifcase#1\or - \advance\noflinesheight-\roundingeps - \divide\noflinesheight\openlineheight - \noflines\noflinesheight - \advance\noflines\plusone - \or - \advance\noflinesheight\roundingeps - \divide\noflinesheight\openlineheight - \noflines\noflinesheight - \or - \advance\noflinesheight\roundingeps - \advance\noflinesheight.5\openlineheight - \divide\noflinesheight\openlineheight - \noflines\noflinesheight - \fi + \else\ifdim\noflinesheight>\zeropoint + \advance\noflinesheight-\roundingeps + \divide\noflinesheight\openlineheight + \noflines\noflinesheight + \advance\noflines\plusone \else - \ifcase#1\or - \advance\noflinesheight\roundingeps - \divide\noflinesheight\openlineheight - \noflines\noflinesheight - \advance\noflines\minusone - \or - \advance\noflinesheight-\roundingeps - \divide\noflinesheight\openlineheight - \noflines\noflinesheight - \or - \advance\noflinesheight-\roundingeps - \advance\noflinesheight-.5\openlineheight - \divide\noflinesheight\openlineheight - \noflines\noflinesheight - \fi + \advance\noflinesheight\roundingeps + \divide\noflinesheight\openlineheight + \noflines\noflinesheight + \advance\noflines\minusone + \fi\fi} + +\def\getroundednoflines#1% + {\noflinesheight#1\relax + \ifzeropt\noflinesheight + \noflines\zerocount + \else\ifdim\noflinesheight>\zeropoint + \advance\noflinesheight\roundingeps + \divide\noflinesheight\openlineheight + \noflines\noflinesheight + \else + \advance\noflinesheight-\roundingeps + \divide\noflinesheight\openlineheight + \noflines\noflinesheight + \fi\fi} + +\def\getrawnoflines#1% + {\noflinesheight#1\relax + \ifzeropt\noflinesheight + \noflines\zerocount + \else\ifdim\noflinesheight>\zeropoint + \advance\noflinesheight\roundingeps + \advance\noflinesheight.5\openlineheight + \divide\noflinesheight\openlineheight + \noflines\noflinesheight + \else + \advance\noflinesheight-\roundingeps + \advance\noflinesheight-.5\openlineheight + \divide\noflinesheight\openlineheight + \noflines\noflinesheight \fi\fi} %D Let's proof that it works: @@ -430,7 +475,7 @@ %D \determinenoflines{\definedfont[Sans at 40pt]test\\test} %D \stoptyping -\def\determinenoflines +\def\determinenoflines % can be mkiv'd {\bgroup \forgetall \let\crlf\endgraf @@ -521,6 +566,14 @@ \def\dododowithnextbox {\aftergroup\dodowithnextbox} +\long\def\dowithnextboxcs#1% + {\let\dodowithnextbox#1% + \afterassignment\dododowithnextbox + \setbox\nextbox} + +\def\dododowithnextbox + {\aftergroup\dodowithnextbox} + %D So in fact we get: %D %D \starttyping @@ -619,14 +672,13 @@ %D Some well known friends, but we implement them our own %D way. We want the macros to work in both math and text mode. -\def\dorlap{\begingroup\dowithnextbox{\normalhbox to \zeropoint - {\flushnextbox\normalhss}\endgroup}\normalhbox} - -\def\dollap{\begingroup\dowithnextbox{\normalhbox to \zeropoint - {\normalhss\flushnextbox}\endgroup}\normalhbox} +\def\dodorlap{\normalhbox to \zeropoint{\flushnextbox\normalhss}\endgroup} +\def\dodollap{\normalhbox to \zeropoint{\normalhss\flushnextbox}\endgroup} +\def\dodoclap{\normalhbox to \zeropoint{\normalhss\flushnextbox\normalhss}\endgroup} -\def\doclap{\begingroup\dowithnextbox{\normalhbox to \zeropoint - {\normalhss\flushnextbox\normalhss}\endgroup}\normalhbox} +\def\dorlap{\begingroup\dowithnextboxcs\dodorlap\normalhbox} +\def\dollap{\begingroup\dowithnextboxcs\dodollap\normalhbox} +\def\doclap{\begingroup\dowithnextboxcs\dodoclap\normalhbox} \def\domathclap{\mathpalette\dodomathclap} \def\dodomathclap#1#2{\doclap{$\mathsurround\zeropoint#1#2$}} \def\domathllap{\mathpalette\dodomathllap} \def\dodomathllap#1#2{\dollap{$\mathsurround\zeropoint#1#2$}} @@ -636,11 +688,11 @@ \unexpanded\def\llap{\mathortext\domathllap\dollap} \unexpanded\def\clap{\mathortext\domathclap\doclap} -\def\tlap{\begingroup\dowithnextbox{\normalvbox to \zeropoint - {\normalvss\flushnextbox}\endgroup}\normalvbox} +\def\dodotlap{\normalvbox to \zeropoint{\normalvss\flushnextbox}\endgroup} +\def\dodoblap{\normalvbox to \zeropoint{\flushnextbox\normalvss}\endgroup} -\def\blap{\begingroup\dowithnextbox{\normalvbox to \zeropoint - {\flushnextbox\normalvss}\endgroup}\normalvbox} +\def\tlap{\begingroup\dowithnextboxcs\dodotlap\normalvbox} +\def\blap{\begingroup\dowithnextboxcs\dodoblap\normalvbox} %D \macros %D {beginofshapebox, @@ -1327,7 +1379,7 @@ %\def\limitatetext##1##2##3{##1}% \def ! \let\limitatetext\firstofthreearguments \fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! ! - \dowithnextbox\dolimitatetext\normalhbox} + \dowithnextboxcs\dolimitatetext\normalhbox} \def\dolimitatetext#1#2% {\doifelsenothing{#1} @@ -2389,13 +2441,17 @@ %D %D A few more boxes. -\def\lhbox{\dowithnextbox{\normalhbox to \hsize{\flushnextbox\hss }}\normalhbox} -\def\mhbox{\dowithnextbox{\normalhbox to \hsize{\hss\flushnextbox\hss}}\normalhbox} -\def\rhbox{\dowithnextbox{\normalhbox to \hsize{\hss\flushnextbox }}\normalhbox} +\def\dodolhbox{\normalhbox to \hsize{\flushnextbox\hss }} +\def\dodomhbox{\normalhbox to \hsize{\hss\flushnextbox\hss}} +\def\dodorhbox{\normalhbox to \hsize{\hss\flushnextbox }} + +\def\lhbox{\dowithnextboxcs\dodolhbox\normalhbox} +\def\mhbox{\dowithnextboxcs\dodomhbox\normalhbox} +\def\rhbox{\dowithnextboxcs\dodorhbox\normalhbox} -\let\lefthbox =\lhbox -\let\midhbox =\mhbox -\let\righthbox=\rhbox +\let\lefthbox \lhbox +\let\midhbox \mhbox +\let\righthbox\rhbox %D \macros %D {boxofsize} diff --git a/tex/context/base/supp-emp.tex b/tex/context/base/supp-emp.mkii index 15489bca7..15489bca7 100644 --- a/tex/context/base/supp-emp.tex +++ b/tex/context/base/supp-emp.mkii diff --git a/tex/context/base/supp-eps.tex b/tex/context/base/supp-eps.mkii index 5684b25dd..5684b25dd 100644 --- a/tex/context/base/supp-eps.tex +++ b/tex/context/base/supp-eps.mkii diff --git a/tex/context/base/supp-lan.tex b/tex/context/base/supp-lan.tex deleted file mode 100644 index 8d781546f..000000000 --- a/tex/context/base/supp-lan.tex +++ /dev/null @@ -1,1377 +0,0 @@ -%D \module -%D [ file=supp-lan, -%D version=1997.03.20, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Language Options, -%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 \gdef\starttest -%D {\blank -%D \noindent -%D \halign\bgroup\tt##\hskip2em&##\hskip2em&##\cr} -%D -%D \gdef\stoptest -%D {\egroup -%D \blank} -%D -%D \gdef\test#1% -%D {\defconvertedargument\ascii{#1}\ascii&\hyphenatedword{#1}\cr} - -%D One of \TEX's strong points in building paragraphs is the way -%D hyphenations are handled. Although for real good hyphenation -%D of non||english languages some extensions to the program are -%D needed, fairly good results can be reached with the standard -%D mechanisms and an additional macro, at least in Dutch. - -\unprotect - -\writestatus{loading}{ConTeXt Support Macros / Language Options} - -%D \CONTEXT\ originates in the wish to typeset educational -%D materials, especially in a technical environment. In -%D production oriented environments, a lot of compound words -%D are used. Because the Dutch language poses no limits on -%D combining words, we often favor putting dashes between those -%D words, because it facilitates reading, at least for those -%D who are not that accustomed to it. -%D -%D In \TEX\ compound words, separated by a hyphen, are not -%D hyphenated at all. In spite of the multiple pass paragraph -%D typesetting this can lead to parts of words sticking into -%D the margin. The solution lays in saying \type -%D {spoelwater||terugwinunit} instead of \type -%D {spoelwater-terugwinunit}. By using a one character command -%D like \type {|}, delimited by the same character \type {|}, -%D we get ourselves both a decent visualization (in \TEXEDIT\ -%D and colored verbatim we color these commands yellow) and an -%D efficient way of combining words. -%D -%D The sequence \type{||} simply leads to two words connected by -%D a hyphen. Because we want to distinguish such a hyphen from -%D the one inserted when \TEX\ hyphenates a word, we use a bit -%D longer one. -%D -%D \hyphenation {spoel-wa-ter te-rug-win-unit} -%D -%D \starttest -%D \test {spoelwater||terugwinunit} -%D \stoptest -%D -%D As we already said, the \type{|} is a command. This commands -%D accepts an optional argument before it's delimiter, which is -%D also a \type{|}. -%D -%D \hyphenation {po-ly-meer che-mie} -%D -%D \starttest -%D \test {polymeer|*|chemie} -%D \stoptest -%D -%D Arguments like \type{*} are not interpreted and inserted -%D directly, in contrary to arguments like: -%D -%D \starttest -%D \test {polymeer|~|chemie} -%D \test {|(|polymeer|)|chemie} -%D \test {polymeer|(|chemie|)| } -%D \stoptest -%D -%D Although such situations seldom occur |<|we typeset thousands -%D of pages before we encountered one that forced us to enhance -%D this mechanism|>| we also have to take care of comma's. -%D -%D \hyphenation {uit-stel-len} -%D -%D \starttest -%D \test {op||, in|| en uitstellen} -%D \stoptest -%D -%D The next special case (concerning quotes) was brought to my -%D attention by Piet Tutelaers, one of the driving forces -%D behind rebuilding hyphenation patterns for the dutch -%D language.\footnote{In 1996 the spelling of the dutch -%D language has been slightly reformed which made this topic -%D actual again.} We'll also take care of this case. -%D -%D \starttest -%D \test {AOW|'|er} -%D \test {cd|'|tje} -%D \test {ex|-|PTT|'|er} -%D \test {rock|-|'n|-|roller} -%D \stoptest -%D -%D Tobias Burnus pointed out that I should also support -%D something like -%D -%D \starttest -%D \test {well|_|known} -%D \stoptest -%D -%D to stress the compoundness of hyphenated words. -%D -%D Of course we also have to take care of the special case: -%D -%D \starttest -%D \test {text||color and ||font} -%D \stoptest - -%D \macros -%D {installdiscretionaries} -%D -%D The mechanism described here is one of the older inner parts -%D of \CONTEXT. The most recent extensions concerns some -%D special cases as well as the possibility to install other -%D characters as delimiters. The prefered way of specifying -%D compound words is using \type{||}, which is installed by: -%D -%D \starttyping -%D \installdiscretionaries || - -%D \stoptyping -%D -%D Some alternative definitions are: -%D -%D \startbuffer -%D \installdiscretionaries ** - -%D \installdiscretionaries ++ - -%D \installdiscretionaries // - -%D \installdiscretionaries ~~ - -%D \stopbuffer -%D -%D \typebuffer -%D -%D after which we can say: -%D -%D \bgroup -%D \getbuffer -%D \starttest -%D \test {test**test**test} -%D \test {test++test++test} -%D \test {test//test//test} -%D \test {test~~test~~test} -%D \stoptest -%D \egroup - -%D \macros -%D {compoundhyphen, -%D beginofsubsentence,endofsubsentence} -%D -%D Now let's go to the macros. First we define some variables. -%D In the main \CONTEXT\ modules these can be tuned by a setup -%D command. Watch the (maybe) better looking compound hyphen. - -% I've added \hbox's so that in mathmode we get proper chars - -\def\compoundhyphen {\hbox{-\kern-.25ex-}} -\def\beginofsubsentence {\hbox{---}} -\def\endofsubsentence {\hbox{---}} - -%D The last two variables are needed for subsentences -%D |<|like this one|>| which we did not yet mention. -%D -%D We want to enable breaking but at the same time don't want -%D compound characters like |-| or || to be separated from the -%D words. \TEX\ hackers will recognise the next two macro's: - -\def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} -\def\postwordbreak {\penalty\zerocount\prewordbreak} - -%D We first show the original implementation, which only -%D supports \type{|} as command and delimiter. Before -%D activating \type{|} we save it's value: -%D -%D \starttyping -%D \edef\domathmodediscretionary{\string|} -%D \stoptyping -%D -%D after which we're ready to define it's meaning to: -%D -%D \starttyping -%D \catcode`\|=\@@active -%D -%D \unexpanded\def|% -%D {\ifmmode -%D \expandafter\domathmodediscretionary -%D \else -%D \expandafter\dotextmodediscretionary -%D \fi} -%D \stoptyping -%D -%D We need a two stage \type{\futurelet} because we want to -%D look ahead for both the compound character definition and -%D the (optional) comma that follows it, and because we want to -%D prevent that \TEX\ puts this comma on the next line. We use -%D \type{\next} for easy and fast checking of the argument, we -%D save this argument (which can consist of more tokens) and -%D also save the character following the \type{|#1|} in -%D \type{\nextnext}. -%D -%D \starttyping -%D \def\dotextmodediscretionary% -%D {\bgroup -%D \futurelet\next\dodotextmodediscretionary} -%D -%D \def\dodotextmodediscretionary#1|% -%D {\def\betweendiscretionaries{#1}% -%D \futurelet\nextnext\dododotextmodediscretionary} -%D \stoptyping -%D -%D The main macro consists of quite some \type{\ifx} tests -%D while \type{\checkafterdiscretionary} handles the commas. -%D We show the simplified version here: -%D -%D \starttyping -%D \def\dododotextmodediscretionary% -%D {\let\nextnextnext=\egroup -%D \ifx |\next -%D \checkafterdiscretionary -%D \prewordbreak\hbox{\compoundhyphen\nextnext}\allowbreak\postwordbreak -%D \else\ifx=\next -%D \prewordbreak\compoundhyphen -%D \else\ifx~\next -%D \discretionary{-}{}{\thinspace}\postwordbreak -%D \else\ifx(\next -%D \prewordbreak\discretionary{}{(-}{(}\prewordbreak -%D \else\ifx)\next -%D \prewordbreak\discretionary{-)}{}{)}\prewordbreak -%D \else\ifx'\next -%D \prewordbreak\discretionary{-}{}{'}\postwordbreak -%D \else -%D \checkafterdiscretionary -%D \prewordbreak\hbox{\betweendiscretionaries\nextnext}\allowbreak\postwordbreak -%D \fi\fi\fi\fi\fi\fi -%D \nextnextnext} -%D -%D \def\checkafterdiscretionary% -%D {\ifx,\nextnext -%D \def\nextnextnext{\afterassignment\egroup\let\next=}% -%D \else -%D \let\nextnext=\relax -%D \fi} -%D \stoptyping -%D -%D Handling \type{(} and \type{)} is a a bit special, because -%D \TEX\ sees them as decent hyphenation points, according to -%D their \type{\lccode} being non||zero. For the same reason, -%D later on in this module we cannot manipulate the -%D \type{\lccode} but take the \type{\uccode}. - -%D The most recent implementation is more advanced. As -%D demonstrated we can install delimiters, like: -%D -%D \starttyping -%D \installdiscretionaries || \compoundhyphen -%D \stoptyping -%D -%D This time we have to use a bit more clever way of saving the -%D math mode specification of the character we're going to -%D make active. We also save the user supplied compound hyphen. -%D We show the a bit more traditional implementation first. -%D -%D \starttyping -%D \def\installdiscretionaries#1% -%D {\catcode`#1\@@other -%D \expandafter\doinstalldiscretionaries\string#1} -%D -%D \def\doinstalldiscretionaries#1% -%D {\setvalue{mathmodediscretionary#1}{#1}% -%D \catcode`#1\@@active -%D \dodoinstalldiscretionaries} -%D -%D \def\dodoinstalldiscretionaries#1#2% -%D {\setvalue{textmodediscretionary\string#1}{#2}% -%D \unexpanded\def#1{\discretionarycommand#1}} -%D \stoptyping -%D -%D A bit more \CATCODE\ and character trickery enables us to -%D discard the two intermediate steps. This trick originates -%D on page~394 of the \TEX book, in the appendix full of -%D dirty tricks. The second argument has now become redundant, -%D but I decided to reserve it for future use. At least it -%D remembers us of the symmetry. - -\def\installdiscretionaries#1#2#3% - {\setevalue{\strippedcsname\mathmodediscretionary\string#1}{\detokenize{#1}}% - \setvalue {\strippedcsname\textmodediscretionary\string#1}{#3}% - \catcode`#1=\@@active - \scratchcounter=\the\uccode`~ - \uccode`~=`#1 - \uppercase{\unexpanded\def~{\discretionarycommand~}}% - \uccode`~=\scratchcounter} - -\def\domathmodediscretionary#1% - {\getvalue{\strippedcsname\mathmodediscretionary\string#1}} - -\def\discretionarycommand - {\relax\ifmmode - \expandafter\domathmodediscretionary - \else - \expandafter\dotextmodediscretionary - \fi} - -%D The next piece of code is a torture test for this previous -%D macro. The \type {\relax} before the \type {\ifmmode} is -%D needed because of the alignment scanner (in \ETEX\ this -%D problem is not present because there a protected macro is -%D not expanded. Thanks to Tobias Burnus for providing this -%D example. -%D -%D \startformula -%D \left|f(x_n)-{1\over2}\right| = -%D {\cases{|{1\over2}-x_n| &for $0\le x_n < {1\over2}$\cr -%D |x_n-{1\over2}| &for ${1\over2}<x_n\le1$ \cr}} -%D \stopformula - -%D \macros -%D {defineactivecharacter} -%D -%D In \type {lang-ger.tex} we define some language specific -%D commands for german input, like: -%D -%D \starttyping -%D \startlanguagespecifics[de] -%D \installcompoundcharacter "a {{\moveaccent{-.1ex}\"a\midworddiscretionary}} -%D \stoplanguagespecifics -%D \stoptyping -%D -%D Occasionally we have to redefine such an active character, -%D like in: -%D -%D \starttyping -%D \startencoding[pdfdoc] -%D \startlanguagespecifics[de] -%D \defineactivecharacter " {\"} -%D \stoplanguagespecifics -%D \stopencoding -%D \stoptyping -%D -%D Here is the command we used: - -% \def\next{#2}% \unexpanded\def\next is wrong in non||etex -% \uppercase{\let~\next}% - -\def\defineactivecharacter #1 #2% - {\catcode`#1=\@@active - \scratchcounter=\the\uccode`~ - \uccode`~=`#1\relax - \uppercase{\def\next{~}}% - %\expandafter\unexpanded\expandafter\def\next{#2}% - \expandafter\def\next{#2}% unexpanded goes wrong in pdfdoc - \uccode`~=\scratchcounter} - -%D The next alternative also supports character numbers: - -\def\defineactivecharacter #1 #2% - {\scratchcounter\the\uccode`~ - \expandafter\doifnumberelse\expandafter{\string#1} - {\catcode #1=\@@active \uccode`~= #1\relax} - {\catcode`#1=\@@active \uccode`~=`#1\relax}% - \uppercase{\def\next{~}}% - %\expandafter\unexpanded\expandafter\def\next{#2}% - \expandafter\def\next{#2}% unexpanded goes wrong in pdfdoc - \uccode`~\scratchcounter} - -%D One reason for abusing the \type{~} is that it is already -%D an active character, so it is unlikely to appear as argument. - -%D The next implementation is about 20\% faster; 1M -%D definitions on a 1Gig machine takes about 19 seconds -%D (against 24 for the previous alternative). - -\chardef\activehackcode=`~ - -% \def\defineactivecharacter #1 % -% {\scratchcounter\the\uccode\activehackcode -% \uccode\activehackcode\expandafter\doifnumberelse -% \expandafter{\string#1}\empty`#1% -% \catcode\uccode\activehackcode\@@active -% \uppercase{\def\next{~}}% -% \uccode\activehackcode\scratchcounter -% \expandafter\def\next}% unexpanded goes wrong in pdfdoc - -%D But ... - -\def\defineactivecharacter #1 #2% - {\scratchcounter\uccode\activehackcode - \uccode\activehackcode\expandafter\doifnumberelse - \expandafter{\string#1}\empty`#1% - \catcode\uccode\activehackcode\@@active - \uppercase{\def\next{~}}% - \uccode\activehackcode\scratchcounter - % unexpanded goes wrong in pdfdoc - \@EA\@EA\@EA\def\@EA\next\@EA{\@EA\dohandleactivecharacter\next{#2}}} - -\let\dohandleactivecharacter\secondoftwoarguments - -\def\donthandleactivecharacter#1#2{\noexpand#1} - -%D A goody: - -\def\makecharacteractive #1 % - {\catcode`#1\active} - -%D Although adapting character codes and making characters -%D active can interfere with other features of macropackages, -%D normally there should be no problems with things like: -%D -%D \starttyping -%D \installdiscretionaries || + -%D \installdiscretionaries ++ = -%D \stoptyping -%D -%D The real work is done by the next set of macros. We have -%D to use a double \type{\futurelet} because we have to take -%D following characters into account. - -\def\dotextmodediscretionary#1% - {\bgroup - \def\dodotextmodediscretionary##1#1% - {\def\betweendiscretionary{##1}% - \futurelet\nextnext\dododotextmodediscretionary}% - \let\discretionarycommand=#1% - \def\textmodediscretionary% - {\getvalue{\strippedcsname\textmodediscretionary\string#1}}% - \futurelet\next\dodotextmodediscretionary} - -\def\dododotextmodediscretionary - {\let\nextnextnext\egroup - \ifx\discretionarycommand\next - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak - \egroup - \else\ifx=\next - \prewordbreak\textmodediscretionary - \else\ifx~\next - \prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak - \else\ifx_\next - \prewordbreak\discretionary{\textmodediscretionary} - {\textmodediscretionary}{\textmodediscretionary}\prewordbreak - \else\ifx(\next - \ifdim\lastskip>\zeropoint\relax - (\prewordbreak - \else - \prewordbreak\discretionary{}{(-}{(}\prewordbreak - \fi - \else\ifx)\next - \ifx\nextnext\blankspace - \prewordbreak)\relax - \else - \prewordbreak\discretionary{-)}{}{)}\prewordbreak - \fi - \else\ifx'\next - \prewordbreak\discretionary{-}{}{'}\postwordbreak - \else\ifx<\next - \beginofsubsentence\prewordbreak\beginofsubsentencespacing - \else\ifnum\uccode`>=\nextuccode - \endofsubsentencespacing\prewordbreak\endofsubsentence - \else - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak - \discretionary{\hbox{\betweendiscretionary}}{}{\hbox{\betweendiscretionary}}% - \allowbreak\postwordbreak - \egroup - \fi\fi\fi\fi\fi\fi\fi\fi\fi - \nextnextnext} - -\def\checkbeforediscretionary - {\ifvmode\dontleavehmode\fi - \ifhmode - \begingroup - \setbox\scratchbox\lastbox - \ifdim\wd\scratchbox=\zeropoint - \let\postwordbreak\prewordbreak - \fi - \box\scratchbox\relax - \endgroup - \fi} - -\def\checkafterdiscretionary - {\ifx,\nextnext - \def\nextnextnext{\afterassignment\egroup\let\next=}% - \else - \let\nextnext\relax - \fi} - -%D The macro \type{\checkbeforediscretionary} takes care of -%D loners like \type{||word}, while it counterpart -%D \type{\checkafterdiscretionary} is responsible for handling -%D the comma. - -%D \macros -%D {beginofsubsentencespacing,endofsubsentencespacing} -%D -%D In the previous macros we provided two hooks which can be -%D used to support nested sub||sentences. In \CONTEXT\ these -%D hooks are used to insert a small space when needed. - -\let\beginofsubsentencespacing=\relax -\let\endofsubsentencespacing =\relax - -%D Before we show some more tricky alternative, we first install -%D the mechanism: - -\installdiscretionaries || \compoundhyphen - -%D \macros -%D {fakecompoundhyphen} -%D -%D In headers and footers as well as in active pieces of text -%D we need a dirty hack. Try to imagine what is needed to -%D savely break the next text across a line and at the same -%D time make the words interactive. -%D -%D \starttyping -%D \goto{Some||Long||Word} -%D \stoptyping - -\def\currentspaceskip - {\interwordspace\!!plus\interwordstretch\!!minus\interwordshrink\relax} - -% \def\fakecompoundhyphen% wrong -% {\def|##1|{\compoundhyphen\nobreak\hskip-\currentspaceskip\allowbreak}} - -\ifx\newsignal\undefined - - \let\fakecompoundhyphen\relax - -\else - - \newsignal\compoundbreakpoint - - % \def\fakecompoundhyphen% - % {\def|##1|% - % {\doifelsenothing{##1}{\compoundhyphen}{##1}% - % \kern\compoundbreakpoint\allowbreak}} - - \def\fakecompoundhyphen - {\def\|{\mathortext\vert\dofakecompoundhyphen}} - - \def\dofakecompoundhyphen - {\def##1|% - {\doifelsenothing{##1}\compoundhyphen{##1}% - \kern\compoundbreakpoint\allowbreak}} - -\fi - -%D One of the drawbacks of this mechanism is that characters can -%D be made active afterwards. The next alternative can be used -%D in such situations. This time we don't compare the arguments -%D directly but use the \type{\uccode}'s instead. \TEX\ -%D initializes these codes of the alphabetics glyphs to their -%D uppercase counterparts. Normally the other characters remain -%D zero. If so, we can use the \type{\uccode} as a signal. - -%D \macros -%D {enableactivediscretionaries} -%D -%D The more advanced mechanism is activated by calling: -%D -%D \starttyping -%D \enableactivediscretionaries -%D \stoptyping -%D -%D which is defined as: - -\def\enableactivediscretionaries - {\uccode`'=`'\relax \uccode`~=`~\relax \uccode`_=`_\relax - \uccode`(=`(\relax \uccode`)=`)\relax \uccode`==`=\relax - \uccode`<=`<\relax \uccode`>=`>\relax - \let\dotextmodediscretionary \activedotextmodediscretionary - \let\dododotextmodediscretionary\activedododotextmodediscretionary} - -%D We only have to redefine two macros. While saving the -%D \type{\uccode} in a macro we have to take care of empty -%D arguments, like in \type{||}. - -\def\activedotextmodediscretionary#1% - {\bgroup - \def\dodotextmodediscretionary##1#1% - {\def\betweendiscretionary{##1}% - \def\nextuccode####1####2\relax% - {\ifcat\noexpand####1\noexpand\relax - \edef\nextuccode{0}% - \else - \edef\nextuccode{\the\uccode`####1}% - \fi}% - \nextuccode##1@\relax - \futurelet\nextnext\dododotextmodediscretionary}% - \let\discretionarycommand=#1% - \def\textmodediscretionary% - {\getvalue{\strippedcsname\textmodediscretionary\string#1}}% - \futurelet\next\dodotextmodediscretionary} - -%D This time we use \type{\ifnum}: - -\def\activedododotextmodediscretionary - {\let\nextnextnext\egroup - \ifx\discretionarycommand\next - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak - \egroup - \else\ifnum\uccode`==\nextuccode - \prewordbreak\textmodediscretionary - \else\ifnum\uccode`~=\nextuccode - \prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak - \else\ifnum\uccode`_=\nextuccode - \prewordbreak\discretionary{\textmodediscretionary} - {\textmodediscretionary}{\textmodediscretionary}\prewordbreak - \else\ifnum\uccode`(=\nextuccode - \ifdim\lastskip>\zeropoint\relax - (\prewordbreak - \else - \prewordbreak\discretionary{}{(-}{(}\prewordbreak - \fi - \else\ifnum\uccode`)=\nextuccode - \ifx\nextnext\blankspace - \prewordbreak)\relax - \else - \prewordbreak\discretionary{-)}{}{)}\prewordbreak - \fi - \else\ifnum\uccode`'=\nextuccode - \prewordbreak\discretionary{-}{}{'}\postwordbreak - \else\ifnum\uccode`<=\nextuccode - \beginofsubsentence\prewordbreak\beginofsubsentencespacing - \else\ifnum\uccode`>=\nextuccode - \endofsubsentencespacing\prewordbreak\endofsubsentence - \else - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - %\prewordbreak\hbox{\betweendiscretionary\nextnext}\allowbreak - \prewordbreak - \discretionary{\hbox{\betweendiscretionary}}{}{\hbox{\betweendiscretionary}}% - \allowbreak\postwordbreak - \egroup - \fi\fi\fi\fi\fi\fi\fi\fi\fi - \nextnextnext} % no lookahead in commands - -%D Now we can safely do things like: \enableactivediscretionaries -%D -%D \starttyping -%D \catcode`<=\@@active \def<{hello there} -%D \catcode`>=\@@active \def>{hello there} -%D \catcode`(=\@@active \def({hello there} -%D \catcode`)=\@@active \def){hello there} -%D \stoptyping -%D -%D In normal day||to||day production of texts this kind of -%D activation is seldom used.\footnote{In the \CONTEXT\ manual -%D the \type{<} and \type{>} are made active and used for some -%D cross||reference trickery.} If so, we have to take care of -%D the math mode explicitly, just like we did when making -%D \type{|} active. It can be confusing too, especially when we -%D load macropackages afterwards that make use of \type{<} in -%D \type{\ifnum} or \type{\ifdim} statements. - -%D And then came the Polish users, and who can deny them? Like -%D the German \TEX\ users demand an active \type {"}, some -%D Polish users like using the \type {/}. The next alternative -%D is a bit slower but far the most robust alternative. As a -%D bonus it also offers \type {|^|} and even \type {|||} which -%D both result in a breakable|^|bar. -%D -%D The trick we use here is to convert the argument to a -%D string and compare this string to string'd tokens. - -\def\activedotextmodediscretionary#1% - {\bgroup - \let\nextnextnext\egroup -% \def\handlecompoundcharacter##1% new, needed for polish -% {\getvalue{\@nc@\string##1}}% where / is active - \def\next##1#1% - {\def\next{\activedododotextmodediscretionary#1{##1}}% - \futurelet\nextnext\next}% - \next} - -\def\activedododotextmodediscretionary#1#2% - {\defconvertedargument\discretionarytoken{#2}% - \def\textmodediscretionary - {\getvalue{\strippedcsname\textmodediscretionary\string#1}}% - \ifx#1\nextnext % takes care of ||| and +++ and ...... - \prewordbreak\discretionary{\hbox{$#1$}}{}{\hbox{$#1$}}% - \allowbreak\postwordbreak - \def\nextnextnext{\afterassignment\egroup\let\next=}% - \else\ifx\discretionarytoken\empty - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - % this was: - % \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak - % but an hbox blocks a possible \discretionary - \prewordbreak\textmodediscretionary\nextnext\allowbreak\postwordbreak - \egroup - \else\defconvertedargument\next=\ifx\next\discretionarytoken - \prewordbreak\textmodediscretionary - \else\defconvertedargument\next~\ifx\next\discretionarytoken - \prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak - \else\defconvertedargument\next_\ifx\next\discretionarytoken - \prewordbreak\discretionary{\textmodediscretionary} - {\textmodediscretionary}{\textmodediscretionary}\prewordbreak - \else\defconvertedargument\next(\ifx\next\discretionarytoken - \ifdim\lastskip>\zeropoint\relax - (\prewordbreak - \else - \prewordbreak\discretionary{}{(-}{(}\prewordbreak - \fi - \else\defconvertedargument\next)\ifx\next\discretionarytoken - \ifx\nextnext\blankspace - \prewordbreak)\relax - \else\ifx\nextnext\space - \prewordbreak)\relax - \else - \prewordbreak\discretionary{-)}{}{)}\prewordbreak - \fi\fi - \else\defconvertedargument\next'\ifx\next\discretionarytoken - \prewordbreak\discretionary{-}{}{'}\postwordbreak - \else\defconvertedargument\next<\ifx\next\discretionarytoken - \beginofsubsentence\prewordbreak\beginofsubsentencespacing - \else\defconvertedargument\next>\ifx\next\discretionarytoken - \endofsubsentencespacing\prewordbreak\endofsubsentence - \else\defconvertedargument\next^\ifx\next\discretionarytoken - \prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}% - \allowbreak\postwordbreak - \else - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak - \discretionary{\hbox{#2}}{}{\hbox{#2}}% - \allowbreak\postwordbreak - \egroup - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \nextnextnext} % no lookahead in commands - -%D Since most things in \CONTEXT\ are configurable, we -%D slightly change the previous definition so that we can -%D install new functionality outside this module. We also -%D support lookahead (over the egroup). - -\def\@tmd@{@@tmd@@} - -\def\activedododotextmodediscretionary#1#2% - {\defconvertedargument\discretionarytoken{#2}% - \def\textmodediscretionary% - {\getvalue{\strippedcsname\textmodediscretionary\string#1}}% - \ifx\discretionarytoken\empty - \ifx#1\nextnext % takes care of ||| and +++ and ...... - \prewordbreak\discretionary{\hbox{$#1$}}{}{\hbox{$#1$}}% - \allowbreak\postwordbreak - \def\nextnextnext{\afterassignment\egroup\let\next=}% - \else - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - % the next line has been changed (20050203) - % \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak - % but an hbox blocks a possible \discretionary - \prewordbreak\textmodediscretionary\nextnext\allowbreak\postwordbreak - \egroup - \fi - \else\expandafter\ifx\csname\@tmd@\discretionarytoken\endcsname\relax - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak - \discretionary{\hbox{#2}}{}{\hbox{#2}}% - \allowbreak\postwordbreak - \egroup - \else\ifx\nextnextnext\egroup % so we can properly do things afterward - \@EA\egroup - \@EA\let\@EA\nextnextnext\@EA\empty - \csname\@tmd@\discretionarytoken\endcsname - \else - \csname\@tmd@\discretionarytoken\endcsname - \fi\fi\fi - \nextnextnext} % lookahead in commands - -\def\definetextmodediscretionary #1 - {\defconvertedargument\ascii{#1}% - \setvalue{\@tmd@\ascii}} - -\definetextmodediscretionary {} % empty case, also handled in parser - {\prewordbreak\compoundhyphen\allowbreak\postwordbreak} - -\definetextmodediscretionary ~ - {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak} - -\definetextmodediscretionary _ - {\prewordbreak - \discretionary{\compoundhyphen}{\compoundhyphen}{\compoundhyphen}% - \prewordbreak} - -\definetextmodediscretionary ( - {\ifdim\lastskip>\zeropoint - (\prewordbreak - \else - \prewordbreak\discretionary{}{(-}{(}\prewordbreak - \fi} - -\definetextmodediscretionary ) - {\ifx\nextnext\blankspace - \prewordbreak)\relax - \else\ifx\nextnext\space - \prewordbreak)\relax - \else - \prewordbreak\discretionary{-)}{}{)}\prewordbreak - \fi\fi} - -\definetextmodediscretionary ' - {\prewordbreak\discretionary{-}{}{'}\postwordbreak} - -\definetextmodediscretionary < - {\beginofsubsentence\prewordbreak\beginofsubsentencespacing} - -\definetextmodediscretionary > - {\endofsubsentencespacing\prewordbreak\endofsubsentence} - -% \definetextmodediscretionary . % not yet definitive -% {\prewordbreak\midsentence\prewordbreak} - -\definetextmodediscretionary = - {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen} - -\definetextmodediscretionary ^ - {\prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}% - \allowbreak\postwordbreak} - -% french - -\definetextmodediscretionary : - {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{:}:} - -\definetextmodediscretionary ; - {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{;};} - -\definetextmodediscretionary ? - {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{?}?} - -\definetextmodediscretionary ! - {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{!}!} - -\definetextmodediscretionary * - {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak} - -% spanish - -\definetextmodediscretionary ?? - {\prewordbreak\questiondown} - -\definetextmodediscretionary !! - {\prewordbreak\exclamdown} - -\ifx\hspaceamount\undefined - - \def\hspaceamount#1#2{16667em} - -\fi - -%D Since we don't have to bother about active characters any -%D longer, we end up with a pretty simple activating macro: - -\def\enableactivediscretionaries - {\let\dotextmodediscretionary=\activedotextmodediscretionary} - -%D Done somewhere else: \type {\enableactivediscretionaries}. - -%D \macros -%D {directdiscretionary} -%D -%D In those situations where the nature of characters is -%D less predictable, we can use the more direct approach: - -%D Beware: an \type {\ignorespaces} in a definition works -%D okay here, but not in the main mechanism because there -%D we have \type {\nextnextnext}. - -\unexpanded\def\directdiscretionary#1% - {\defconvertedargument\discretionarytoken{#1}% - \let\textmodediscretionary\compoundhyphen - \expandafter\ifx\csname\@tmd@\string#1\endcsname\relax - \prewordbreak - \discretionary{\hbox{#1}}{}{\hbox{#1}}% - \allowbreak\postwordbreak - \else - \csname\@tmd@\string#1\endcsname - \fi} - -%D \macros -%D {installcompoundcharacter} -%D -%D When Tobias Burnus started translating the dutch manual of -%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support -%D the \type{german.sty} method of handling compound -%D characters, especially the umlaut. This package is meant for -%D use with \PLAIN\ \TEX\ as well as \LATEX. -%D -%D I decided to implement compound character support as -%D versatile as possible. As a result one can define his own -%D compound character support, like: -%D -%D \starttyping -%D \installcompoundcharacter "a {\"a} -%D \installcompoundcharacter "e {\"e} -%D \installcompoundcharacter "i {\"i} -%D \installcompoundcharacter "u {\"u} -%D \installcompoundcharacter "o {\"o} -%D \installcompoundcharacter "s {\SS} -%D \stoptyping -%D -%D or even -%D -%D \starttyping -%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}} -%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}} -%D \stoptyping -%D -%D The support is not limited to alphabetic characters, so the -%D next definition is also valid. -%D -%D \starttyping -%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}} -%D \stoptyping -%D -%D The implementation looks familiar and uses the same tricks as -%D mentioned earlier in this module. We take care of two -%D arguments, which complicates things a bit. - -\def\@nc@{@nc@} % normal character -\def\@nn@{@nn@} % normal catcode -\def\@cc@{@cc@} % compound character -\def\@cs@{@cs@} % compound characters - -% \def\installcompoundcharacter #1#2#3 #4% {#4} no grouping -% {\setvalue{\@nc@\string#1}{\char`#1}% -% \ifnum\catcode`#1=\@@active \else -% \setevalue{\@nn@\string#1}{\number\catcode`#1}% new -% \fi -% \def\!!stringa{#3}% -% \ifx\!!stringa\empty -% \setvalue{\@cc@\string#1\string#2}{#4}% -% \else -% \setvalue{\@cs@\string#1\string#2\string#3}{#4}% -% \fi -% \catcode`#1=\@@active -% \scratchcounter=\the\uccode`~ -% \uccode`~=`#1 -% \uppercase{\unexpanded\def~{\handlecompoundcharacter~}}% -% \uccode`~=\scratchcounter} - -\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping - {\chardef\thecompoundcharacter`#1% - %\@EA\def\csname\@nc@\string#1\endcsname{\char`#1}% - \@EA\chardef\csname\@nc@\string#1\endcsname\thecompoundcharacter - \ifnum\catcode\thecompoundcharacter=\@@active \else - \@EA\edef\csname\@nn@\string#1\endcsname - {\number\catcode\thecompoundcharacter}% - \fi - \def\!!stringa{#3}% - \@EA\def\csname\ifx\!!stringa\empty - \@cc@\string#1\string#2% - \else - \@cs@\string#1\string#2\string#3% - \fi\endcsname{#4}% - \catcode\thecompoundcharacter\@@active - \scratchcounter\uccode\activehackcode - \uccode\activehackcode\thecompoundcharacter - \uppercase{\unexpanded\def~{\handlecompoundcharacter~}}% - \uccode\activehackcode\scratchcounter} - -%D A compound character can be reset with the following -%D command. -%D -%D \starttyping -%D \restorecompoundcharacter / -%D \stoptyping - -\def\restorecompoundcharacter#1% new - {\catcode`#1=\csname\@nn@\string#1\endcsname\relax} - -%D We can also ignore definitions (needed in for instance \XML). Beware, -%D this macro is supposed to be used grouped! - -\def\ignorecompoundcharacter - {\def\installcompoundcharacter##1 ##2{}} - -%D In handling the compound characters we have to take care of -%D \type{\bgroup} and \type{\egroup} tokens, so we end up with -%D a multi||step interpretation macro. We look ahead for a -%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being -%D no user of this mechanism, the credits for testing them goes -%D to Tobias Burnus, the first german user of \CONTEXT. -%D -%D We define these macros as \type{\long} because we can -%D expect \type{\par} tokens. We need to look into the future -%D with \type{\futurelet} to prevent spaces from -%D disappearing. - -% \def\handlecompoundcharacter#1% -% {\def\dohandlecompoundcharacter% -% {\ifx\next\bgroup -% %\def\next{\dodohandlecompoundcharacter#1}% % handle "{ee} -> \"ee -% %\let\next\relax % forget "{ee} -> ee -% \def\next{\handlecompoundcharacterone#1}% % ignore "{ee} -> "ee -% \else\ifx\next\egroup -% \def\next{\getvalue{\@nc@\string#1}}% -% \else\ifx\next\blankspace -% \def\next{\getvalue{\@nc@\string#1}}% -% \else -% \def\next{\dodohandlecompoundcharacter#1}% -% \fi\fi\fi -% \next}% -% \futurelet\next\dohandlecompoundcharacter} -% -% \def\dodohandlecompoundcharacter#1#2% -% {\def\dododohandlecompoundcharacter% Keep it here and -% {\ifx\next\bgroup % preserve spaces! -% \def\next{\handlecompoundcharacterone#1#2}% -% \else\ifx\next\egroup -% \def\next{\handlecompoundcharacterone#1#2}% -% \else\ifx\next\blankspace -% \def\next{\handlecompoundcharacterone#1#2}% -% \else -% \def\next{\handlecompoundcharactertwo#1#2}% -% \fi\fi\fi -% \next}% -% \futurelet\next\dododohandlecompoundcharacter} - -\def\handlecompoundcharacter#1% - {\def\xhandlecompoundcharacter{\dohandlecompoundcharacter{#1}}% - \futurelet\next\xhandlecompoundcharacter} - -\def\dohandlecompoundcharacter - {\ifx\next\bgroup - %\@EA\dodohandlecompoundcharacter % handle "{ee} -> \"ee - %\@EA\gobbleoneargument % forget "{ee} -> ee - \@EA\handlecompoundcharacterone % ignore "{ee} -> "ee - \else\ifx\next\egroup - \@EAEAEA\donohandlecompoundcharacter - \else\ifx\next\blankspace - \@EA\@EAEAEA\@EA\donohandlecompoundcharacter - \else - \@EA\@EAEAEA\@EA\dodohandlecompoundcharacter - \fi\fi\fi} - -\def\donohandlecompoundcharacter#1{\csname\@nc@\string#1\endcsname} - -\def\dododohandlecompoundcharacter - {\ifx\next\bgroup - \@EA\handlecompoundcharacterone - \else\ifx\next\egroup - \@EAEAEA\handlecompoundcharacterone - \else\ifx\next\blankspace - \@EA\@EAEAEA\@EA\handlecompoundcharacterone - \else - \@EA\@EAEAEA\@EA\handlecompoundcharactertwo - \fi\fi\fi} - -\def\dodohandlecompoundcharacter#1#2% preserve space - {\def\xdodohandlecompoundcharacter{\dododohandlecompoundcharacter#1#2}% - \futurelet\next\xdodohandlecompoundcharacter} - -%D Besides taken care of the grouping and space tokens, we have -%D to deal with three situations. First we look if the next -%D character equals the first one, if so, then we just insert -%D the original. Next we look if indeed a compound character is -%D defined. We either execute the compound character or just -%D insert the first. So we have -%D -%D \starttyping -%D <key><key> <key><known> <key><unknown> -%D \stoptyping -%D -%D In later modules we will see how these commands are used. - -\long\def\handlecompoundcharacterone#1#2% - {\if\string#1\string#2% was: \ifx#1#2% - %\def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}}% - \def\next{\getvalue{\@nc@\string#1}}% - \else\ifcsname\@cc@\string#1\string#2\endcsname - \def\next{\getvalue{\@cc@\string#1\string#2}}% - \else - \def\next{\getvalue{\@nc@\string#1}#2}% - \fi\fi - \next} - -\long\def\handlecompoundcharactertwo#1#2#3% - {\if\string#1\string#2% was: \ifx#1#2% - %\def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}#3}% - \def\next{\getvalue{\@nc@\string#1}#3}% - \else\ifcsname\@cs@\string#1\string#2\string#3\endcsname - \def\next{\getvalue{\@cs@\string#1\string#2\string#3}}% - \else\ifcsname\@cc@\string#1\string#2\endcsname - \def\next{\getvalue{\@cc@\string#1\string#2}#3}% - \else - \def\next{\getvalue{\@nc@\string#1}#2#3}% - \fi\fi\fi - \next} - -%D For very obscure applications (see for an application \type -%D {lang-sla.tex}) we provide: - -\def\dosimplifiedcompoundcharacter#1% - {#1} - -\def\simplifiedcompoundcharacter#1#2% - {\ifcsname\@cc@\string#1\string#2\endcsname - \@EA\@EA\@EA\dosimplifiedcompoundcharacter\csname\@cc@\string#1\string#2\endcsname - \else - #2% - \fi} - -%D \macros -%D {midworddiscretionary} -%D -%D If needed, one can add a discretionary hyphen using \type -%D {\midworddiscretionary}. This macro does the same as -%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented -%D earlier, this one also looks ahead for spaces and grouping -%D tokens. - -\def\domidworddiscretionary - {\ifx\next\blankspace\else - \ifx\next\bgroup \else - \ifx\next\egroup \else - \discretionary{-}{}{}% - \fi\fi\fi} - -\def\midworddiscretionary% - {\futurelet\next\domidworddiscretionary} - -%D \macros -%D {hyphenatedurl} -%D -%D For those who want to put full \URL's in a text, we offer -%D -%D \startbuffer -%D \hyphenatedurl{http://optimist.optimist/optimist/optimist.optimist#optimist} -%D \stopbuffer -%D -%D \typebuffer -%D -%D which breaks at the appropriate places. Watch the \type{#} -%D hack. -%D -%D When passed as argument, like in \type {\goto}, one needs -%D to substitute a \type {\\} for each \type{#}. -%D -%D \startbuffer -%D \hyphenatedurl{http://this.is.a.rather/strange/reference#indeed} -%D \stopbuffer -%D -%D \typebuffer - -\ifx\\\undefined \let\\\crlf \fi - -\chardef\urlsplitmode=1 - -% 0 => don't split -% 1 => . : na, rest voor -% 2 => alles na -% 3 => alles voor - -% \bgroup \catcode`\~=\active \catcode`\/=\active - -% Why not convert to ascii first? I will redo this one! - -\bgroup \catcode`\~=\active \catcode`\/=\active - -\unexpanded\gdef\hyphenatedurl#1% {}{} handles accents - {\bgroup - \ifnum\hyphenpenalty<10000 \else - \def\discretionary##1##2##3{##1\allowbreak##2}% - \fi - \obeyhyphens - \def\splitbefore##1% - {\setbox\scratchbox=\hbox{##1{}{}}% - \ifcase\urlsplitmode - \box\scratchbox - \or - \postwordbreak\box\scratchbox\prewordbreak - \or - \prewordbreak\discretionary{\box\scratchbox}{}{\box\scratchbox}\prewordbreak - \else - \postwordbreak\box\scratchbox\prewordbreak - \fi}% - \def\splitafter##1% - {\ifcase\urlsplitmode - ##1{}{}% - \or - \prewordbreak\discretionary{##1{}{}}{}{##1{}{}}\prewordbreak - \or - \prewordbreak\discretionary{##1{}{}}{}{##1{}{}}\prewordbreak - \else - \prewordbreak\discretionary{}{##1{}{}}{##1{}{}}\prewordbreak - \fi}% - \def\splitanyway##1% - {\prewordbreak##1\prewordbreak}% - \def\flushurl% - {\savedurl\let\savedurl\empty}% - \def\\% - {\spliturl\#}% - \let\~=\lettertilde\let~=\~% - \let\/=\letterslash\let/=\/% - \let\savedurl\empty - \scratchcounter\zerocount % used for hyphenmethod - \handletokens#1\with\scanurl\savedurl - \egroup} - -\egroup - -%D This would be better, but it spoils \type {\~} and so: -%D -%D \starttyping -%D \defconvertedargument\ascii{#1} -%D \expandafter\handletokens\ascii\with\scanurl -%D \stoptyping - -\chardef\urlhyphenmethod=0 - -\def\scanurl#1% - {\advance\scratchcounter\plusone - \ifx#1\blankspace - \flushurl\splitanyway\normalspace - \else\ifx#1\ % - \flushurl\splitanyway\normalspace - \else\ifx#1\space - \flushurl\splitanyway\normalspace - \else\ifx#1\~% - \flushurl\splitbefore\~% - \else\ifx#1\#% - \flushurl\splitbefore\#% - \else\ifx#1\&% - \flushurl\splitbefore\&% - \else\ifx#1\%% - \flushurl\splitbefore\%% - \else\ifx#1\_% - \flushurl\splitbefore\_% - \else\if\noexpand#1\relax - #1% - \else\ifnum\catcode`#1=8 - \flushurl\splitbefore\_% - \else\ifnum\catcode`#1=6 - \flushurl\splitbefore\#% - \else\ifnum\catcode`#1=4 - \flushurl\splitbefore\&% - \else\expandafter\if\string#1\lettertilde - \flushurl\splitbefore\~% - \else\expandafter\if\string#1\letterpercent - \flushurl\splitbefore\%% - \else\expandafter\if\string#1\letterunderscore - \flushurl\splitbefore\_% - \else\expandafter\if\string#1\letterquestionmark - \flushurl\splitafter\letterquestionmark - \else\expandafter\if\string#1\letterat - \flushurl\splitafter\letterat - \else\expandafter\if\string#1\letterslash - \edef\savedurl{\savedurl\letterslash}% - \else\expandafter\if\string#1+% - \flushurl\splitafter+% - \else\expandafter\if\string#1:% - \flushurl\splitafter:% - \else\expandafter\if\string#1.% - \flushurl\splitafter.% - \else\expandafter\if\string#1(% - \flushurl\splitbefore(% - \else\expandafter\if\string#1)% - \flushurl\splitafter)% - \else - \ifx\savedurl\empty\else - \splitbefore\savedurl - \let\savedurl\empty - \fi - \ifcase\urlhyphenmethod - \string#1% - \else - \ifnum\scratchcounter>\plusthree % so, \http: will not break - \edef\savedurl{\string#1}% - \else - \string#1% - \fi - \fi - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} - -% \setupinteraction[state=start] -% \def\gotoURL#1{\useURL[foo][#1]\goto{\url[foo]}[url(foo)]} -% \starttext -% \endgraf \chardef\urlhyphenmethod=0 -% \hsize1pt\gotoURL{http://www.physik.fu-berlin.de/SomeVeryVeryVeryLongDirectory/And/AQuiteLongFileName.html} -% \endgraf \chardef\urlhyphenmethod=1 -% \hsize1pt\gotoURL{http://www.physik.fu-berlin.de/SomeVeryVeryVeryLongDirectory/And/AQuiteLongFileName.html} -% \stoptext - -% \useencoding[ffr] -% \mainlanguage[fr] -% \starttext -% \hyphenatedurl{http://somewhere.to/go} -% \stoptext - -%D When Joop Susan asked (on the \CONTEXT\ mailing list) how -%D to handle url's passed as argument, the following solutions -%D came to my mind: -%D -%D \starttyping -%D \def\whateverurl#1% -%D {{\def~{\string~}\useURL[dummy][#1]\goto{\url[dummy]}[URL(dummy)]}} -%D -%D \def\whateverurl#1% -%D {{\let~\lettertilde\useURL[dummy][#1]\goto{\url[dummy]}[URL(dummy)]}} -%D -%D \def\whateverurl#1% -%D {\defconvertedargument\ascii{#1}% -%D \expanded{\useURL[dummy][\ascii]}\goto{\url[dummy]}[URL(dummy)]} -%D \stoptyping - -%D \macros -%D {hyphenatedfile} -%D -%D For the moment we treat filenames in a similar way, -%D -%D \starttyping -%D \hyphenatedfile{here/there/filename.suffix} -%D \stoptyping - -\let\hyphenatedfile\hyphenatedurl - -% to be finished -% -% \def\hyphenatedstring#1% -% {\bgroup -% \nohyphens -% \def\next##1{##1\doif{##1}{-}{\allowbreak}}% -% \handletokens#1\with\next -% \egroup} -% -% {\hsize1cm\hyphenatedstring{ABXXXXXXXXXXC-12345-12345}} - -%D \macros -%D {disablediscretionaries,disablecompoundcharacter} -%D -%D Occasionally we need to disable this mechanism. For the -%D moment we assume that \type {|} is used. - -\def\disablediscretionaries - {\def|##1|{\string##1}% - \def\directdiscretionary##1{\string##1}} - -\def\disablecompoundcharacters - {\let\handlecompoundcharacter\string} - -%D \macros -%D {normalcompound} -%D -%D Handy in for instance XML: - -\ifx\normalcompound\undefined \let\normalcompound=| \fi - -\protect \endinput diff --git a/tex/context/base/supp-mis.tex b/tex/context/base/supp-mis.mkii index 5b45d8b9d..5b45d8b9d 100644 --- a/tex/context/base/supp-mis.tex +++ b/tex/context/base/supp-mis.mkii diff --git a/tex/context/base/supp-mpe.tex b/tex/context/base/supp-mpe.mkii index 67b27919c..67b27919c 100644 --- a/tex/context/base/supp-mpe.tex +++ b/tex/context/base/supp-mpe.mkii diff --git a/tex/context/base/supp-mps.tex b/tex/context/base/supp-mps.mkii index 9864cd9a1..9864cd9a1 100644 --- a/tex/context/base/supp-mps.tex +++ b/tex/context/base/supp-mps.mkii diff --git a/tex/context/base/supp-mrk.tex b/tex/context/base/supp-mrk.mkii index eb1865471..eb1865471 100644 --- a/tex/context/base/supp-mrk.tex +++ b/tex/context/base/supp-mrk.mkii diff --git a/tex/context/base/supp-pat.tex b/tex/context/base/supp-pat.mkii index d91083076..d91083076 100644 --- a/tex/context/base/supp-pat.tex +++ b/tex/context/base/supp-pat.mkii diff --git a/tex/context/base/supp-pdf.tex b/tex/context/base/supp-pdf.mkii index c54b0c6bc..c54b0c6bc 100644 --- a/tex/context/base/supp-pdf.tex +++ b/tex/context/base/supp-pdf.mkii diff --git a/tex/context/base/supp-ran.mkii b/tex/context/base/supp-ran.mkii index d595fffaf..0c07099ed 100644 --- a/tex/context/base/supp-ran.mkii +++ b/tex/context/base/supp-ran.mkii @@ -46,7 +46,7 @@ %D \getrandomseed\randomseed %D \stoptyping -\input thrd-ran.tex +\input thrd-ran.mkii \ifx\uniformdeviate\undefined diff --git a/tex/context/base/supp-spe.tex b/tex/context/base/supp-spe.mkii index 8cb8e2ac1..8cb8e2ac1 100644 --- a/tex/context/base/supp-spe.tex +++ b/tex/context/base/supp-spe.mkii diff --git a/tex/context/base/supp-tpi.tex b/tex/context/base/supp-tpi.mkii index ac38ea392..9b2ac9328 100644 --- a/tex/context/base/supp-tpi.tex +++ b/tex/context/base/supp-tpi.mkii @@ -23,10 +23,10 @@ \endinput \fi -\ifx\undefined\writestatus \input supp-mis \relax \fi -\ifx\undefined\mimmickspecials \input supp-spe \relax \fi -\ifx\undefined\MPgraphicbox \input supp-mps \relax \fi -\ifx\undefined\dogetEPSboundingbox \input supp-eps \relax \fi +\ifx\undefined\writestatus \input supp-mis.mkii \relax \fi +\ifx\undefined\mimmickspecials \input supp-spe.mkii \relax \fi +\ifx\undefined\MPgraphicbox \input supp-mps.mkii \relax \fi +\ifx\undefined\dogetEPSboundingbox \input supp-eps.mkii \relax \fi \writestatus{loading}{ConTeXt Support Macros / TPIC Conversion} diff --git a/tex/context/base/symb-ini.tex b/tex/context/base/symb-ini.mkii index 291e22790..f7bffd240 100644 --- a/tex/context/base/symb-ini.tex +++ b/tex/context/base/symb-ini.mkii @@ -87,19 +87,6 @@ \def\directsymbol#1#2% no \relax, there can be an argument, see lists {\executeifdefined{\??ss:#1:#2}\firstofoneargument} -% \def\dosymbol[#1][#2]% -% {\nosymboltrue -% \ifsecondargument -% \doifinsymbolset{#1}{#2}{\dodosymbol{#1}{#2}}% -% \fi -% \ifnosymbol -% \edef\currentsymbol{#1}% -% \the\symbolsetups -% \ifnosymbol -% \redosymbol\currentsymbol -% \fi -% \fi} - % We support both: % % Test test \symbol[whatever]\ test \symbol[whatever]. @@ -268,7 +255,7 @@ %D %D \showsetup{showsymbolset} -\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run} +\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run.mkii} %D \macros %D {usesymbols} diff --git a/tex/context/base/symb-ini.mkiv b/tex/context/base/symb-ini.mkiv new file mode 100644 index 000000000..253a7c41c --- /dev/null +++ b/tex/context/base/symb-ini.mkiv @@ -0,0 +1,281 @@ +%D \module +%D [ file=symb-ini, +%D version=1998.07.20, +%D title=\CONTEXT\ Symbol Libraries, +%D subtitle=Basic Symbols Commands, +%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 The macros described here used to be part of the \type +%D {core-con} module. I decided to move them here when +%D symbolsets saw the light. Let their light shine. + +\writestatus{loading}{ConTeXt Symbol Libraries / Initialization} + +\unprotect + +%D \macros +%D {definesymbol, symbol} +%D +%D Converting numbers or levels into a character, romannumeral, +%D symbol or something else, is supported by many \CONTEXT\ +%D commands. Therefore we need a mechanism for linking such +%D numbers to their counterparts. +%D +%D First we take care of symbols. These are for instance used +%D in enumerations and itemizations. We have: +%D +%D \showsetup{definesymbol} +%D \showsetup{symbol} +%D +%D Symbols are simply linked to a tag. Such tags can be numbers +%D or strings. +%D +%D \starttyping +%D \definesymbol [1] [$\bullet$] +%D \definesymbol [level 5] [$\star$] +%D \stoptyping + +% ss:tag -> symbol +% ss:set:tag -> symbol out of set +% sstag -> list of symbols in set + +\def\definesymbol + {\dotripleempty\dodefinesymbol} + +% \def\dodefinesymbol[#1][#2][#3]% class name meaning +% {\ifthirdargument +% \setvalue{\??ss:#1:#2}{#3}% +% \doifsomething{#1}{\addvalue{\??ss*#1}{#2}}% +% \else +% \setvalue{\??ss:\currentsymboldef:#1}{#2}% +% \fi} + +\def\dodefinesymbol[#1][#2][#3]% class name meaning + {\ifthirdargument + \setvalue{\??ss:#1:#2}{#3}% + \doifsomething{#1}{\addvalue{\??ss*#1}{#2}}% + \else + \setvalue{\??ss:\currentsymboldef:#1}{#2}% + \addvalue{\??ss*\currentsymboldef}{#1}% + \fi} + +\def\doifinsymbolsetelse#1#2{\doifdefinedelse{\??ss:#1:#2}} +\def\doifinsymbolset #1#2{\doifdefined {\??ss:#1:#2}} +\def\doifsymbolsetelse #1{\doifdefinedelse{\??ss*#1}} + +\def\symbolset#1{\executeifdefined{\??ss*#1}\empty} % no [#1], to be used in commalists etc + +%D Since symbols are used frequently in interactive +%D documents, we speed up this one. Well, that was history, +%D since now we simplified things a bit, because the low +%D level macros have been sped up now and then. + +\unexpanded\def\symbol % This one always gobbles spaces, + {\dodoubleempty\dosymbol} % so never change it again! + +\newif\ifnosymbol \newtoks\everysymbol + +\def\dodosymbol#1#2% \relax's prevent lookahead problems + {\nosymbolfalse{\the\everysymbol\csname\??ss:#1:#2\endcsname\relax}\relax} + +\def\directsymbol#1#2% no \relax, there can be an argument, see lists + {\executeifdefined{\??ss:#1:#2}\firstofoneargument} + +% We support both: +% +% Test test \symbol[whatever]\ test \symbol[whatever]. +% Test test \symbol{whatever} test \symbol{whatever}. + +\def\dosymbol % so we also handle \symbol{name} + {\iffirstargument % which is nicer with following spaces + \expandafter\donormalsymbol + \else + \expandafter\dospecialsymbol + \fi} + +\def\dospecialsymbol[#1][#2]#3% + {\firstargumenttrue + \secondargumentfalse + \donormalsymbol[#3][]} + +\def\donormalsymbol[#1][#2]% + {\nosymboltrue + \ifsecondargument + \edef\currentsymbol{#2}% + \doifinsymbolset{#1}{#2}{\dodosymbol{#1}{#2}}% + \else + \edef\currentsymbol{#1}% + \fi + \ifnosymbol + \the\symbolsetups + \ifnosymbol + \redosymbol\currentsymbol + \fi + \fi} + +\def\fetchsymbol#1% + {\ifnosymbol + \doifinsymbolset{#1}\currentsymbol{\dodosymbol{#1}\currentsymbol}% + \fi} + +\def\redosymbol#1% +% {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty{#1}}{#1}} % more efficient: + {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty}\firstofoneargument{#1}} + +% % % % % +% this should go in symb-fig, to be loaded after core-fig + +%D \macros +%D {definefiguresymbol} +%D +%D To simplify defining figure symbols, we offer: +%D +%D \showsetup{definefiguresymbol} +%D +%D By default, such symbols scale along the current bodyfont +%D size or running font size (which is better). + +\def\defaultsymbolfactor{10} +\def\defaultsymbolheight{1.25ex} + +\def\figuresymbol + {\dodoubleempty\dofiguresymbol} + +\ifx\externalfigure \undefined \def\externalfigure[#1][#2]{#1} \fi +\ifx\resetexternalfigures\undefined \let\resetexternalfigures\relax \fi + +\def\dofiguresymbol[#1][% #2]% + {\externalfigure[#1][\c!reset=\v!yes,\c!symbol=\v!yes,\c!height=\defaultsymbolheight,}% #2]} + +\appendtoks \resetexternalfigures \to \everysymbol + +\def\definefiguresymbol + {\dotripleempty\dodefinefiguresymbol} + +\def\dodefinefiguresymbol[#1][#2][#3]% + {\ifsecondargument + \definesymbol[#1][{\dofiguresymbol[#2][#3]}]% + \fi} + +% but for the moment we keep it here +% % % % % % + +%\def\objectsymbol[#1]% +% {\dopresetfieldsymbol{#1}\dogetfieldsymbol{#1}} + +%D \macros +%D {doifsymboldefinedelse} +%D +%D A handy private one: + +% a bit messy + +\def\xfetchsymbol#1% + {\ifnosymbol + \doifinsymbolset{#1}\currentsymbol\nosymbolfalse + \fi} + +\def\xredosymbol#1% + {\doifinsymbolset\empty\currentsymbol\nosymbolfalse} + +\def\doifsymboldefinedelse#1% + {\bgroup + \edef\currentsymbol{#1}% + \let\fetchsymbol\xfetchsymbol + \nosymboltrue + \the\symbolsetups + \ifnosymbol + \xredosymbol\currentsymbol + \ifnosymbol + \egroup\@EAEAEA\secondoftwoarguments + \else + \egroup\@EAEAEA\firstoftwoarguments + \fi + \else + \egroup\@EA\firstoftwoarguments + \fi} + +%D \macros +%D {setupsymbolset,startsymbolset} +%D +%D From these macro definitions one can deduce that symbols can +%D be grouped in symbol sets: +%D +%D \starttyping +%D \startsymbolset [navigation 1] +%D \definefiguresymbol [Next] [mp-symb.1] +%D \definefiguresymbol [Prev] [mp-symb.2] +%D \stopsymbolset +%D \stoptyping +%D +%D Such a symbol can be typeset with: +%D +%D \starttyping +%D \setupsymbolset[navigation 1]\symbol[Next] +%D \stoptyping +%D +%D or simply: +%D +%D \starttyping +%D \symbol[navigation 1][Next] +%D \stoptyping +%D +%D Formally: +%D +%D \showsetup{setupsymbolset} +%D \showsetup{startsymbolset} + +\let\currentsymboldef\empty + +\def\startsymbolset[#1] + {\def\currentsymboldef{#1}} + +\def\stopsymbolset + {\let\currentsymboldef\empty} + +\newtoks\symbolsetups + +\def\setupsymbolset[#1]% + {\prependtoksonce\fetchsymbol{#1}\to\symbolsetups} + +\def\resetsymbolset + {\symbolsetups\emptytoks} + +\def\forcesymbolset[#1]% + {\symbolsetups{\fetchsymbol{#1}}} + +%D \macros +%D {showsymbolset} +%D +%D \showsetup{showsymbolset} + +\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run.mkiv} + +%D \macros +%D {usesymbols} +%D +%D \showsetup{usesymbols} + +\def\dousesymbols#1% + {\makeshortfilename[\truefilename{\f!symbolprefix#1}]% + \startreadingfile + \readsysfile\shortfilename + {\showmessage\m!symbols1{#1}} + \donothing + \stopreadingfile} + +\def\usesymbols[#1]% + {\processcommalist[#1]\dousesymbols} + +%D As longs as symbols are linked to levels or numbers, we can +%D also use the conversion mechanism, but in for instance the +%D itemization macros, we prefer symbols because they can more +%D easier be (partially) redefined. + +\protect \endinput diff --git a/tex/context/base/symb-jmn.tex b/tex/context/base/symb-jmn.tex index 392cac552..1ed65d16e 100644 --- a/tex/context/base/symb-jmn.tex +++ b/tex/context/base/symb-jmn.tex @@ -40,8 +40,13 @@ \loadmapfile[original-base.map] % \loadmapfile [original-context-symbol.map] -\definefontsynonym[NavigationNormal] [hans] -\definefontsynonym[NavigationShadowed] [hans-sh] +\ifnum\texengine=\luatexengine + \definefontsynonym[NavigationNormal] [hans.tfm] + \definefontsynonym[NavigationShadowed] [hans-sh.tfm] +\else + \definefontsynonym[NavigationNormal] [hans] + \definefontsynonym[NavigationShadowed] [hans-sh] +\fi \definefontsynonym[NavigationFont] [NavigationNormal] %definefontsynonym[NavigationFont] [NavigationShadowed] diff --git a/tex/context/base/symb-nav.tex b/tex/context/base/symb-nav.tex index 1dd451538..90a798e01 100644 --- a/tex/context/base/symb-nav.tex +++ b/tex/context/base/symb-nav.tex @@ -15,11 +15,13 @@ \loadmapfile[original-base.map] % \loadmapfile [original-context-symbol.map] -\definefontsynonym [ContextNavigation] [contnav] +\ifnum\texengine=\luatexengine + \definefontsynonym [ContextNavigation] [contnav.tfm] +\else + \definefontsynonym [ContextNavigation] [contnav] +\fi -% \def\ContextNavigationGlyph#1{\getglyph{ContextNavigation}{\char#1}} - -\def\ContextNavigationGlyph#1{\getrawglyph{contnav}{\char#1}} +\def\ContextNavigationGlyph#1{\getglyph{ContextNavigation}{\char#1}} \startsymbolset [navigation 1] diff --git a/tex/context/base/symb-run.tex b/tex/context/base/symb-run.mkii index 4e714832c..4e714832c 100644 --- a/tex/context/base/symb-run.tex +++ b/tex/context/base/symb-run.mkii diff --git a/tex/context/base/symb-run.mkiv b/tex/context/base/symb-run.mkiv new file mode 100644 index 000000000..4e714832c --- /dev/null +++ b/tex/context/base/symb-run.mkiv @@ -0,0 +1,54 @@ +%D \module +%D [ file=symb-run, % code moved from symb-ini +%D version=1998.07.20, +%D title=\CONTEXT\ Symbol Libraries, +%D subtitle=Runtime Macros, +%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. + +\unprotect + +\gdef\doshowsymbolset[#1][#2]% todo: make nicer, use legend or so + {\vbox\bgroup + \blank + \getparameters[\??ss][\c!n=5,#2]% + \forcesymbolset[#1]% + \doifsymbolsetelse{#1} + {\global\let\allfigures\empty + \doglobal\newcounter\figurecounter + \setupcolors[\c!state=\v!start]% to prevent mps color conversion + \dontcomplain + \def\doshowsymbols% global needed due to grouping in alignment + {\expanded{\globalprocesscommalist[\symbolset{#1}]}\docommand}% + \def\docommand##1% + {\vbox + {\forgetall + \tttf + \halign + {\hss\quad####\strut\quad\hss\cr + \symbol[##1]\quad{\red\ruledhbox{\black\symbol[##1]}}\cr + \tfx##1\cr}}% + \doglobal\increment\figurecounter + \ifnum\figurecounter=\@@ssn + \doglobal\newcounter\figurecounter + \def\next{\crcr\noalign{\vskip1ex}}% + \else + \def\next{&}% + \fi + \next}% + \tabskip\zeropoint \!!plus 1fill + \halign to \hsize + {&\hss##\hss\cr\doshowsymbols\crcr}}% + {}% + \blank + \egroup} + +\gdef\showsymbolset + {\dodoubleempty\doshowsymbolset} + +\protect \endinput diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv index 620c43eef..89aa21df1 100644 --- a/tex/context/base/syst-aux.mkiv +++ b/tex/context/base/syst-aux.mkiv @@ -297,7 +297,6 @@ {\def\nextoptionalcommandyes{#1}% \def\nextoptionalcommandnop{#2}% \futurelet\nexttoken\inspectnextoptionalcharacter} - \def\inspectnextoptionalcharacter {\ifx\nexttoken\blankspace \@EA\reinspectnextoptionalcharacter @@ -317,7 +316,6 @@ {\def\nextbgroupcommandyes{#1}% \def\nextbgroupcommandnop{#2}% \futurelet\nexttoken\inspectnextbgroupcharacter} - \def\inspectnextbgroupcharacter {\ifx\nexttoken\blankspace \@EA\reinspectnextbgroupcharacter @@ -331,6 +329,37 @@ \@EA\nextbgroupcommandnop \fi} +\let\nextparenthesischaractertoken( + +\long\def\doifnextparenthesiselse#1#2% + {\def\nextparenthesiscommandyes{#1}% + \def\nextparenthesiscommandnop{#2}% + \futurelet\nexttoken\inspectnextparenthesischaracter} +\def\inspectnextparenthesischaracter + {\ifx\nexttoken\blankspace + \@EA\reinspectnextparenthesischaracter + \else + \@EA\inspectnextparenthesischaracterindeed + \fi} +\def\inspectnextparenthesischaracterindeed + {\ifx\nexttoken\nextparenthesischaractertoken + \@EA\nextparenthesiscommandyes + \else + \@EA\nextparenthesiscommandnop + \fi} + +%D The next one is handy in predictable situations: + +\def\doiffastoptionalcheckelse + {\futurelet\nexttoken\dodoiffastoptionalcheckelse} + +\def\dodoiffastoptionalcheckelse + {\ifx\nexttoken\nextoptionalcharactertoken + \expandafter\firstoftwoarguments + \else + \expandafter\secondoftwoarguments + \fi} + %D This macro uses some auxiliary macros. Although we were able %D to program quite complicated things, I only understood these %D after rereading the \TEX book. The trick is in using a @@ -1499,14 +1528,14 @@ \expandafter\rawprocesscommaitem \fi#2} -\def\rawprocesscommalist[#1]#2% accepteert ook [\cs] +\unexpanded\def\rawprocesscommalist[#1]#2% accepteert ook [\cs] {\global\advance\commalevel \plusone \expandafter\let\csname\s!next\the\commalevel\endcsname#2% \expandafter\rawprocesscommaitem#1,],% \relax \global\advance\commalevel \minusone } \def\rawprocesscommacommand[#1]% not really needed - {\expanded{\rawprocesscommalist[#1]}} + {\normalexpanded{\rawprocesscommalist[#1]}} % \def\rawdoifinsetelse#1#2{\doifinstringelse{,#1,}{,#2,}} % \def\rawdoifinset #1#2{\doifinstring {,#1,}{,#2,}} @@ -2020,13 +2049,13 @@ \expandafter\quitcommalist \fi} -\def\getfromcommalist[#1]#2[#3]% +\unexpanded\def\getfromcommalist[#1]#2[#3]% {\let\commalistelement\empty \commalistcounter#3\relax \processcommalist[#1]\p!dogetfromcommalist} -\def\getfromcommacommand[#1]% - {\expanded{\getfromcommalist[#1]}} +\unexpanded\def\getfromcommacommand[#1]% + {\normalexpanded{\getfromcommalist[#1]}} %D Watertight (and efficient) solutions are hard to find, due %D to the handling of braces during parameters passing and @@ -3013,10 +3042,10 @@ {\catcode`.=0 .catcode`.\ 12 .xdef.letterbackslash{.string\}} % hack \fi -\def\strippedcsname#1% this permits \strippedcsname{\xxx} and \strippedcsname{xxx} - {\expandafter\dostrippedcsname\string#1} +\def\checkedstrippedcsname#1% this permits \strippedcsname{\xxx} and \strippedcsname{xxx} + {\expandafter\docheckedstrippedcsname\string#1} -\def\dostrippedcsname#1% +\def\docheckedstrippedcsname#1% {\if\noexpand#1\letterbackslash\else#1\fi} %D \macros @@ -3032,7 +3061,7 @@ %D \macros %D {newconditional, %D settrue, setfalse, -%D ifconditional} +%D ifconditional,then} %D %D \TEX's lacks boolean variables, although the \PLAIN\ format %D implements \type{\newif}. The main disadvantage of this @@ -3074,8 +3103,10 @@ \def\settrue #1{\let#1\zerocount} \def\setfalse#1{\let#1\plusone} -\let\newconditional = \setfalse -\let\ifconditional = \ifcase +\let\newconditional\setfalse +\let\ifconditional \ifcase + +\let\then\relax % so that we can say: \ifnum1>2\then -) %D \macros %D {ifzeropt} @@ -3164,7 +3195,7 @@ \else \let\nextrecurse\exitstepwiserecurse \fi - \fi\expanded{\nextrecurse{\number#1}{\number#2}{\number#3}}} + \fi\normalexpanded{\noexpand\nextrecurse{\number#1}{\number#2}{\number#3}}} \long\def\dodostepwiserecurse#1#2#3% from to step {\ifnum#1>#2\relax @@ -3393,7 +3424,7 @@ \else \let\nextrecurse\exitstepwiserecurse \fi - \fi\expanded{\nextrecurse{\number#1}{\number#2}{\number#3}}} + \fi\normalexpanded{\noexpand\nextrecurse{\number#1}{\number#2}{\number#3}}} \long\def\doloop#1% {\global\advance\outerrecurse \plusone @@ -3636,25 +3667,6 @@ %D \doifassignmentelse {...} {then ...} {else ...} %D \stoptyping -% \def\doifassignmentelse#1% -% {\convertargument#1\to\ascii -% \doifinstringelse=\ascii} - -% \def\doifassignmentelse#1% -% {\edef\ascii{\detokenize{#1}}% -% \ifx\ascii\empty -% \expandafter\secondoftwoarguments -% \else -% \expandafter\docheckifassignmentelse -% \fi} - -% \long\def\dodoifassignmentelse -% {\expandafter\dododoifnotassignmentelse\ascii=@@\@end@ -% \expandafter\secondoftwoarguments -% \else -% \expandafter\firstoftwoarguments -% \fi} - \long\def\docheckifassignmentelse#1=#2#3\@end@{\if#2@}% \long\def\doifassignmentelse#1% @@ -4347,7 +4359,7 @@ #4{#1}% \else\ifnum#1<\zerocount \bgroup\scratchcounter#1% - \expanded{\egroup\noexpand\dorecurse{\number-\scratchcounter}}{#4{-#2#3}}% + \normalexpanded{\egroup\noexpand\dorecurse{\number-\scratchcounter}}{#4{-#2#3}}% \else\ifx#2+% \dorecurse{#1}{#4{#3}}% \else @@ -4495,6 +4507,8 @@ \dodoglobal#1\emptytoks \the\@@scratchtoks\relax} +% better: \def\flushtoks#1{\normalexpanded{\noexpand\dodoglobal#1\emptytoks\the#\relax}} + \let\dotoks\the %D \macros @@ -6865,4 +6879,9 @@ % \showvalue{mylist} +%D A variant for \type {\executeifdefined}: + +\def\expandcheckedcsname#1#2#3% + {\csname#1\ifcsname#1#2\endcsname#2\else#3\fi\endcsname} + \protect \endinput diff --git a/tex/context/base/syst-ext.tex b/tex/context/base/syst-ext.mkii index bd1c02050..2ef1053d3 100644 --- a/tex/context/base/syst-ext.tex +++ b/tex/context/base/syst-ext.mkii @@ -459,7 +459,7 @@ %D \macros %D {newconditional, %D settrue, setfalse, -%D ifconditional} +%D ifconditional,then} %D %D \TEX's lacks boolean variables, although the \PLAIN\ format %D implements \type{\newif}. The main disadvantage of this @@ -501,6 +501,8 @@ \let\newconditional = \setfalse \let\ifconditional = \ifcase +\let\then\relax % so that we can say \ifnum1>2\then -) + %D \macros %D {ifzeropt} %D diff --git a/tex/context/base/syst-gen.tex b/tex/context/base/syst-gen.mkii index 993512b74..993512b74 100644 --- a/tex/context/base/syst-gen.tex +++ b/tex/context/base/syst-gen.mkii diff --git a/tex/context/base/syst-ini.tex b/tex/context/base/syst-ini.tex index c334b1cf6..50999d813 100644 --- a/tex/context/base/syst-ini.tex +++ b/tex/context/base/syst-ini.tex @@ -182,8 +182,8 @@ \countdef \lastallocatedfamily = 43 \lastallocatedfamily = \minallocatedfamily \countdef \lastallocatedattribute = 44 \lastallocatedattribute = \minallocatedregister -\countdef \mincountervalue = 125 \mincountervalue = -"7FFFFFFF -\countdef \maxcountervalue = 126 \maxcountervalue = "7FFFFFFF +\countdef \mincountervalue = 125 \mincountervalue = -"7FFFFFFF % beware, we use index 125 at the lua end +\countdef \maxcountervalue = 126 \maxcountervalue = "7FFFFFFF % beware, we use index 126 at the lua end \countdef \minusone = 127 \minusone = -1 \chardef \zerocount = 0 \chardef \plusone = 1 diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua index e3d3ce01a..6df1b7b44 100644 --- a/tex/context/base/syst-lua.lua +++ b/tex/context/base/syst-lua.lua @@ -13,8 +13,6 @@ local ctxcatcodes = tex.ctxcatcodes commands = commands or { } cs = commands -- shorter -ctx = ctx or { } -- special context namespace, code might move from there - function commands.writestatus(a,b,c,...) if c then texiowrite_nl(format("%-16s: %s\n",a,format(b,c,...))) diff --git a/tex/context/base/syst-new.tex b/tex/context/base/syst-new.mkii index 53ba18ffd..53ba18ffd 100644 --- a/tex/context/base/syst-new.tex +++ b/tex/context/base/syst-new.mkii diff --git a/tex/context/base/syst-tex.tex b/tex/context/base/syst-tex.mkii index a8aea2683..a8aea2683 100644 --- a/tex/context/base/syst-tex.tex +++ b/tex/context/base/syst-tex.mkii diff --git a/tex/context/base/tabl-ltb.tex b/tex/context/base/tabl-ltb.mkii index e45fb1bc1..0ff64047e 100644 --- a/tex/context/base/tabl-ltb.tex +++ b/tex/context/base/tabl-ltb.mkii @@ -815,6 +815,16 @@ \startlinetablerun \readfile{#1}\donothing\donothing\stoplinetablerun \egroup} +% will go away: + +\def\processlinetableXMLfile#1% + {\bgroup + \let\startlinetable\donothing + \let\stoplinetable \donothing + \startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis + \startlinetablerun \processXMLfile{#1}\stoplinetablerun + \egroup} + \protect \endinput \doifnotmode{demo}{\endinput} diff --git a/tex/context/base/tabl-ltb.mkiv b/tex/context/base/tabl-ltb.mkiv new file mode 100644 index 000000000..0ff64047e --- /dev/null +++ b/tex/context/base/tabl-ltb.mkiv @@ -0,0 +1,866 @@ +%D \module +%D [ file=core-ltb, +%D version=2002.10.31, +%D title=\CONTEXT\ Table Macros, +%D subtitle=Line Tables, +%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. + +% testfile: tfmetrics.tex + +% todo: als nx>1, dan in geval van rek tussenruimte berekenen en optellen +% bij breedte, dus: nx nog niet gebruiken in combinatie met rek ! ! ! ! ! + +% This module is experimental, undocumented, and currently only set up +% eTeX. It provides a mechanism for typesetting very large tables, +% spanning many pages horizontally and vertically, with repeated +% header lines and (entry) columns, tab tracking, color, etc. In does +% two passes over a table, which is why the table goes into a +% buffer or file. As said, tables can be real huge. + +% \BH \BC .. \EC \BC .. \EC \EH % append +% \BR \BC .. \EC \BC .. \EC \ER +% +% or +% +% \NC .. \NC .. \NC \NR (todo: optional last \NC) + +% alternative: +% +% (1) direct run, save content in macro, but only if needed +% +% todo +% +% (2) buffered table content +% +% \startbuffer +% \startlinetablehead +% \stoplinetablehead +% \startlinetablebody +% \stoplinetablebody +% \stopbuffer +% +% \processlinetablebuffer[buffer] +% +% in buffer : head and body +% +% (3) unbuffered run, multipass +% +% - run with starting width zero / prev run +% - clip on prev run +% - flush real widths + +\writestatus{loading}{ConTeXt Table Macros / Line Tables} + +\unprotect + +\chardef\linetablesplitstate\zerocount +\chardef\linetableheadstate \zerocount + +\edef\??ler{\??le:r:} +\edef\??lec{\??le:c:} +\edef\??lew{\??le:w:} +\edef\??leh{\??le:h:} +\edef\??led{\??le:d:} + +\newif\iflinetablepreroll +\newif\ifinlinetable + +\newcount\linetablecolumn +\newcount\linetablesubcol +\newdimen\linetablewidth +\newdimen\linetableheight +\newbox \linetablecell + +\let\noflinetablecolumns\!!zerocount +\let\noflinetablerows \!!zerocount +\let\noflinetablelines \!!zerocount +\let\noflinetableparts \!!zerocount +\let\linetablepart \!!plusone +\let\linetablestep \!!plusone +\let\linetableline \!!zerocount +\let\linetablerow \!!zerocount +\let\linetablerows \!!zerocount + +\initializetablebox \zerocount % holds repeater + +\chardef\linetablehmode \zerocount +\chardef\linetablepage \zerocount +\chardef\linetablerepeat\zerocount + +\def\setuplinetable + {\dotripleempty\dosetuplinetable} + +\def\dosetuplinetable[#1][#2][#3]% + {\ifthirdargument + \getparameters[\??le:#1:#2][#3]% + \else\ifsecondargument + \getparameters[\??lec#1][#2]% + \else + \getparameters[\??le][#1]% + \fi\fi} + +\setuplinetable + [\c!n=\!!maxcard, + \c!lines=\!!maxcard, + \c!nx=\plusone, + \c!nleft=0, + \c!repeat=\v!yes, % when \c!nleft>0, repeat on both pages + \c!before=, + \c!after=, + \c!inbetween=\page, + \c!distance=\zeropoint, + \c!stretch=\v!no, + \c!align=\c!right, + \c!leftoffset=.25ex, + \c!rightoffset=\linetableparameter\c!leftoffset, + \c!maxwidth=\zeropoint, + \c!width=5em, + \c!height=\v!fit, % \v!line = faster + \c!background=, + \c!backgroundcolor=] + +\def\linetableparameter#1% + {\csname\??le#1\endcsname} + +\def\doifelselinetablecparameter#1% + {\ifcsname\??lec\number\linetablecolumn#1\endcsname + \expandafter\firstoftwoarguments + \else + \expandafter\secondoftwoarguments + \fi} + +\def\linetablecparameter#1% + {\csname + \ifcsname\??lec\number\linetablecolumn#1\endcsname + \??lec\number\linetablecolumn + \else + \??le + \fi + #1\endcsname} + +\def\linetablerparameter#1% faster, leaner and meaner + {\csname + \ifnum\linetablerow=\zerocount % geen ifcase + \ifcsname\??ler\v!header#1\endcsname + \??ler\v!header#1% + \else\ifcsname\??ler0#1\endcsname + \??ler0#1% + \else + \s!empty + \fi\fi + \else + \ifcsname\??ler\number\linetablerow#1\endcsname + \??ler\number\linetablerow#1% + \else\ifcsname\??ler\v!oddeven\linetablerow#1\endcsname + \??ler\v!oddeven\linetablerow#1% + \else + \s!empty + \fi\fi + \fi + \endcsname} + +\def\setnoftableslines + {\doifelse{\linetableparameter\c!lines}\v!fit + {% whitespace already added by vertical strut + \ifdim\pagegoal<\maxdimen + \scratchdimen\pagegoal + \advance\scratchdimen -\pagetotal + \else + \scratchdimen\textheight + \fi + \getrawnoflines\scratchdimen + \xdef\noflinetablelines{\the\noflines} +\iflinetablepreroll \else \ifnum\noflinetablelines<\plustwo + \page \setnoftableslines +\fi \fi +} + {\xdef\noflinetablelines{\linetableparameter\c!lines}}} + +\def\startlinetablecell + {\dosingleempty\dostartlinetablecell} + +\def\dostartlinetablecell[#1]% + {\global\setbox\linetablecell\hbox\bgroup + \iffirstargument + \getparameters[\??lec\number\linetablecolumn][#1]% + \fi + \xdef\linetablestep{\linetablecparameter\c!nx}% + \ifcase\linetablestep\or + \scratchdimen\linetablecparameter\c!width + \scratchskip \linetablecparameter\c!distance + \else + \scratchdimen \zeropoint + \scratchskip \zeropoint + \scratchcounter\linetablecolumn + \dorecurse\linetablestep + {\advance\scratchdimen\linetablecparameter\c!width + %\advance\scratchskip \linetablecparameter\c!distance + \global\advance \linetablecolumn\plusone + \advance\scratchskip \linetablecparameter\c!distance + }% + \global\linetablecolumn\scratchcounter + \fi + \chardef\linetablemode + \iflinetablepreroll + \ifdim\scratchdimen>\zeropoint \zerocount \else \plustwo \fi + \else + \zerocount + \fi + \ifcase\linetablemode + \ifcase\linetablehmode + % nothing + \or + % fit, keep it simple + \or + \chardef\linetablemode\plusone % line + \else + % some already calculated height + \fi + \fi + \setbox\scratchbox\hbox + \bgroup + \dontcomplain + \hskip\linetablecparameter\c!leftoffset\relax + % 0 = width, unknown height + % 1 = width, fixed height + % 2 = no width, auto hsize + \ifnum\linetablemode<\plustwo + \advance\scratchdimen-\linetablecparameter\c!leftoffset + \advance\scratchdimen-\linetablecparameter\c!rightoffset + \fi + \ifcase\linetablemode + \dosetraggedcommand{\linetablecparameter\c!align}% + \vtop \ifdim\linetableheight>\zeropoint to\linetableheight \fi \bgroup + \hsize\scratchdimen + \raggedcommand + \else + \setalignmentswitch{\linetablecparameter\c!align}% + \hbox \ifcase\linetablemode \or to\scratchdimen \fi \bgroup + \ifcase\alignmentswitch\hss\or\hss\fi + \fi + \dostartattributes{\??lec\number\linetablecolumn}\c!style\c!color\empty + \begstrut \ignorespaces} + +% \def\stoplinetablecell +% {\unskip \endstrut +% \dostopattributes +% \ifcase\linetablemode +% \endgraf +% \else +% \ifcase\alignmentswitch\else\hss\fi +% \fi +% \egroup +% \hskip\linetablecparameter\c!rightoffset +% \egroup +% \iflinetablepreroll +% \box\scratchbox +% \else +% \doif{\linetablecparameter\c!background}\v!color +% {\backgroundline[\linetablecparameter\c!backgroundcolor]}% +% {\box\scratchbox}% +% \fi +% \egroup} + +\newconditional\linetableautoheight \settrue\linetableautoheight + +\def\stoplinetablecell + {\unskip \endstrut + \dostopattributes + \ifcase\linetablemode + \endgraf + \else + \ifcase\alignmentswitch\else\hss\fi + \fi + \egroup + \hskip\linetablecparameter\c!rightoffset + \egroup + \iflinetablepreroll + \box\scratchbox + \else + \doifelse{\linetablecparameter\c!background}\v!color + {\ifconditional\linetableautoheight + \hbox{\blackrule + [ \c!color=\linetablecparameter\c!backgroundcolor, + \c!height=\linetablerparameter{x\c!height}, + \c!depth=\linetablerparameter{x\c!depth}, + \c!width=\wd\scratchbox]% + \hskip-\wd\scratchbox\box\scratchbox}% + \else + \backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}% + \fi}% + {\box\scratchbox}% + \fi + \egroup} + +% \def\stoplinetablecell +% {\unskip \endstrut +% \dostopattributes +% \ifcase\linetablemode +% \endgraf +% \else +% \ifcase\alignmentswitch\else\hss\fi +% \fi +% \egroup +% \hskip\linetablecparameter\c!rightoffset +% \egroup +% \iflinetablepreroll +% \box\scratchbox +% \else +% \doifelse{\linetablecparameter\c!background}\v!color +% {\ifconditional\linetableautoheight +% % \hbox{\blackrule +% % [ \c!color=\linetablecparameter\c!backgroundcolor, +% % \c!height=\linetablerparameter{x\c!height}, +% % \c!depth=\linetablerparameter{x\c!depth}, +% % \c!width=\wd\scratchbox]% +% % \hskip-\wd\scratchbox\box\scratchbox}% +% \dp\scratchbox\linetablerparameter{x\c!depth}% +% \ht\scratchbox\linetablerparameter{x\c!height}% +% \framed +% [\c!offset=\v!overlay, +% \c!frameoffset=.5\linewidth, +% \c!leftframe=\v!off,\c!rightframe=\v!off, +% \c!background=\v!color, +% \c!backgroundcolor=\linetablecparameter\c!backgroundcolor% +% ]{\box\scratchbox}% +% \else +% \backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}% +% \fi}% +% {\box\scratchbox}% +% \fi +% \egroup} + +\def\savelinetablepart + {\global\setbox\tablebox\linetablepart + \ifnum\linetablepart=\zerocount + \box\scratchbox % just storing + \else + \vbox + {\ifvoid\tablebox\linetablepart\else\unvbox\tablebox\linetablepart\fi + \doif{\linetablerparameter\c!background}\v!color + {\backgroundline[\linetablerparameter\c!backgroundcolor]}% + {\box\scratchbox}% is also arg to \backgroundline + \endgraf + \linetablerparameter\c!after}% + \fi} + +\def\flushlinetableparts + {\doglobal\increment\linetableline + \ifnum\linetableline<\noflinetablelines + % keep collecting + \else + \iflinetablepreroll + % forget about them + \else + \dorecurse\noflinetableparts + {\let\linetablepart\recurselevel + \dp\tablebox\linetablepart\strutdepth + % noindent en endgraf needed else whitespace mess-up! + \whitespace % here not after verticalstrut + \ifdim\topskipgap=\zeropoint\else + \verticalstrut\nobreak\kern-\struttotal\kern-\parskip\nobreak\nointerlineskip % fix topskip + \fi + \noindent\strut\hbox to \hsize{\box\tablebox\linetablepart\hss}\endgraf + \ifnum\linetablepart<\noflinetableparts\relax + \linetableparameter\c!inbetween + \fi}% + \ifnum\linetablerows<\noflinetablerows\relax + \linetableparameter\c!inbetween + \else + % after, later + \fi + \chardef\linetableheadstate\plusthree + \global\setbox\tablebox\zerocount\emptybox % here + \fi + % reset \linetablerow will be an option, currently + % starts at zero after split + \globallet\linetablerow\!!zerocount + \globallet\linetableline\!!zerocount + \global\chardef\linetablepage\zerocount + \global\linetablewidth\zeropoint + \setnoftableslines + \fi} + +\def\startlinetablepart + {\global\linetablesubcol\zerocount + \setbox\scratchbox\hbox\bgroup + \doconvertfont{\linetablerparameter\c!style}% + \startcolor[\linetablerparameter\c!color]% + \ignorespaces} + +\def\stoplinetablepart + {\ifnum\linetablepart>\zerocount + \unskip \unskip % remove last intercolumn skip (distance+fill) + \fi + \stopcolor + \egroup + \iflinetablepreroll \else + \ifcase\linetablepart + % we're collecting the repeater + \else + \scratchdimen\hsize \advance\scratchdimen-\wd\scratchbox\relax + \ifdim\scratchdimen>\linetableparameter\c!stretch\else + \setbox\scratchbox\hbox to \hsize{\unhbox\scratchbox}% + \fi + \fi + \fi} + +\def\checklinetablepart + {\global\advance\linetablewidth\wd\linetablecell + \global\advance\linetablecolumn\linetablestep + \global\advance\linetablesubcol\linetablestep + \relax + %\message{\the\linetablecolumn,\the\linetablesubcol}\wait + % from now on the column counter is already incremented + \ifcase\linetablesplitstate + \iflinetablepreroll \else + \box\linetablecell + % the columncounter is one ahead ! +% \hskip\linetablecparameter\c!afstand + \hskip\scratchskip + \fi + %%% + \donefalse + \ifcase\linetablerepeat\else + % van te voren berekenen + \scratchcounter\linetablecolumn\advance\scratchcounter-\plustwo + \ifnum\linetablerepeat=\scratchcounter + \donetrue % collecting repeater + \fi + \fi + %%%% + \ifdone + % collecting repeater + \else + \ifnum\linetablecolumn>\getvalue{\??le::\linetablepart}\relax + \donetrue + \fi + \fi + \ifdone + \stoplinetablepart + \iflinetablepreroll \else + \savelinetablepart + \fi + \ifcase\linetablepage \or + \global\chardef\linetablepage \plustwo + \else + \global\chardef\linetablepage \plusone + \fi + \doglobal\increment\linetablepart + \global\linetablewidth\wd\tablebox\zerocount + \startlinetablepart + \fi + \else + \donefalse + \!!doneafalse + \ifcase\linetablerepeat\else + % van te voren berekenen + \scratchcounter\linetablecolumn \advance\scratchcounter-\plustwo + \ifnum\linetablerepeat=\scratchcounter + \donetrue % collecting repeater + \fi + \fi + \ifdone + \!!doneatrue + % collecting repeater + \else\ifdim\linetablewidth>\hsize + \donetrue + \else +% \global\advance\linetablewidth\linetablecparameter\c!afstand\relax + \global\advance\linetablewidth\scratchskip + \ifdim\linetablewidth>\hsize % ? + \donetrue + \fi + \fi\fi + \ifdone + \stoplinetablepart + \savelinetablepart + \ifcase\linetablepage \or + \global\chardef\linetablepage \plustwo + \else + \global\chardef\linetablepage \plusone + \fi + \doglobal\increment\linetablepart + \ifnum\linetablepart>\noflinetableparts + \globallet\noflinetableparts\linetablepart + \initializetablebox\linetablepart + \fi + \global\linetablewidth\wd\linetablecell + \startlinetablepart + \if!!doneb \else \ifcase\linetablerepeat \else + % check for left/right page + \ifcase\linetablepage\donetrue\or\donetrue\or\donefalse\fi\ifdone + % insert repeater + \global\advance\linetablewidth\wd\tablebox\zerocount + \iflinetablepreroll\kern\wd\else\unhcopy\fi\tablebox\zerocount + \fi + \fi \fi + \fi + \iflinetablepreroll \else + \box\linetablecell + % the columncounter is one ahead ! +% \hskip\linetablecparameter\c!afstand +% \hskip\scratchskip +\dorecurse\linetablestep{\strut\hfil}% + \hskip\scratchskip + \fi + \fi} + +% \linetableparameter\c!var -> \@@levar (when no classes) + +\def\startlinetablerun % to do: quit when nested + {\bgroup + \inlinetabletrue + % autowidth + \doif{\linetableparameter\c!maxwidth}\v!fit + {\setuplinetable[\c!maxwidth=\zeropoint]}% + \processaction + [\linetableparameter\c!stretch] + [ \v!no=>{\setuplinetable[\c!stretch=\maxdimen]},% no stretch + \v!yes=>{\setuplinetable[\c!stretch=\zeropoint]}]% max stretch + \chardef\linetablerepeat\linetableparameter\c!nleft + \chardef\linetablesplitstate % = + \ifdim\linetableparameter\c!maxwidth>\zeropoint + \zerocount \else \plusone + \fi + % optional prevdepth correction + \iflinetablepreroll + \globallet\noflinetablerows\!!zerocount + \else + \linetableparameter\c!before + \fi + \globallet\linetablerows\!!zerocount + \globallet\noflinetablecolumns\!!zerocount + \globallet\noflinetableparts\!!zerocount + \!!counta\zerocount + \def\docommand##1% + {\doglobal\increment\noflinetableparts + \advance\!!counta##1% + \setxvalue{\??le::\noflinetableparts}{\the\!!counta}}% + \processcommacommand[\linetableparameter\c!n]\docommand + \initializetableboxes\noflinetableparts + \ifcase\linetablerepeat + \globallet\linetablepart\!!plusone + \else + \globallet\linetablepart\!!zerocount % repeater + \fi + \globallet\linetablestep\!!plusone + \globallet\linetableline\!!zerocount + \globallet\linetablerow \!!zerocount + \global\linetablecolumn \zerocount + \global\linetablesubcol \zerocount + \global\linetablewidth \zeropoint +\iflinetablepreroll \else \ifdim\pagetotal>\zeropoint + \verticalstrut\kern-\struttotal +\fi \fi + \setnoftableslines + \checklinetablepage + \let\BR\linetableBR + \let\ER\linetableER + \let\BH\linetableBR + \let\EH\linetableER + \let\BC\linetableBC + \let\EC\linetableEC + \let\NC\linetableNC + \let\NR\linetableNR + \flushlinetablehead} + +\def\stoplinetablerun + {\globallet\linetableline\!!maxcard + \chardef\linetableheadstate\zerocount % blocked + \flushlinetableparts + \iflinetablepreroll \else + \linetableparameter\c!after + \fi + \globallet\linetablepart \!!zerocount + \globallet\noflinetableparts\!!zerocount + \egroup} + +% \def\checklinecolumnwidth +% {\ifundefined{\??lew\number\linetablecolumn}% +% \donetrue +% \else\ifdim\getvalue{\??lew\number\linetablecolumn}<\wd\linetablecell +% \donetrue +% \else +% \donefalse +% \fi\fi +% \ifdone +% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}% +% \fi} +% +% \def\checklinecolumnwidth +% {\ifcsname\??lew\number\linetablecolumn\endcsname +% \ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell +% \donetrue +% \else +% \donefalse +% \fi +% \else +% \donetrue +% \fi +% \ifdone +% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}% +% \fi} + +% \def\checklinecolumnwidth +% {\expandafter\xdef\csname\??lew\number\linetablecolumn\endcsname +% {\expandafter\ifx\csname\??lew\number\linetablecolumn\endcsname\relax +% \the\wd\linetablecell +% \else\ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell +% \the\wd\linetablecell +% \else +% \csname\??lew\number\linetablecolumn\endcsname +% \fi\fi}} + +\def\checklinecolumndimension#1#2#3% + {\expandafter\xdef\csname#1\number#3\endcsname + {\expandafter\ifx\csname#1\number#3\endcsname\relax + \the#2\linetablecell + \else\ifdim\csname#1\number#3\endcsname<#2\linetablecell + \the#2\linetablecell + \else + \csname#1\number#3\endcsname + \fi\fi}} + +\def\checklinecolumnwidth {\checklinecolumndimension\??lew\wd\linetablecolumn} +\def\checklinecolumnheight{\checklinecolumndimension\??leh\ht\linetablerow} +\def\checklinecolumndepth {\checklinecolumndimension\??led\dp\linetablerow} + +\def\linetableBR + {\dosingleempty\dolinetableBR} + +\def\dolinetableBR[#1]% #1 not yet implemented + {\ifnum\linetableheadstate=1\else + \doglobal\increment\linetablerow + \doglobal\increment\linetablerows + \fi + \global\linetablecolumn\plusone + \global\linetablesubcol\plusone +% \linetableheight\linetablerparameter\c!height +% +% \ifx\linetableheight\empty +% % nothing +% \else\ifx\linetableheight\v!fit +% % keep it simple +% \else\ifx\linetableheight\v!line +% \chardef\linetablemode\plusone +% \else +% \!!heighta\linetableheight +% \advance\!!heighta-\strutdepth +% \fi\fi\fi +% + \linetableheight\zeropoint + \edef\!!stringa{\linetablerparameter\c!height}% + \ifx\!!stringa\empty + \chardef\linetablehmode\zerocount + \else\ifx\!!stringa\v!fit + \chardef\linetablehmode\plusone + \else\ifx\!!stringa\v!line + \chardef\linetablehmode\plustwo + \else + \linetableheight\!!stringa + \advance\linetableheight-\strutdepth + \fi\fi\fi +% + \startlinetablepart} + +\def\linetableBC + {\startlinetablecell} + +\def\linetableEC + {\stoplinetablecell + \iflinetablepreroll + \checklinecolumnwidth + \checklinecolumnheight + \checklinecolumndepth + \fi + \checklinetablepart} + +\def\linetableER + {% \stoplinetablecell + % no \box\linetablecell, i.e. dummy columnn, last \NC \NR + \stoplinetablepart + \savelinetablepart + \advance\linetablecolumn \minusone + \ifnum\linetablecolumn>\noflinetablecolumns + \xdef\noflinetablecolumns{\number\linetablecolumn}% + \fi + \flushlinetableparts + \global\linetablecolumn\zerocount + \global\linetablewidth \zeropoint + \ifcase\linetablerepeat + \globallet\linetablepart\!!plusone + \else + \globallet\linetablepart\!!zerocount % repeater + \fi + \checklinetablepage + \flushlinetablehead} + +\def\checklinetablepage + {\global\chardef\linetablepage\zerocount + \ifcase\linetablerepeat \else \ifcase\linetablepage + \doif{\linetableparameter\c!repeat}\v!no + {\global\chardef\linetablepage\doifoddpageelse\plusone\plustwo}% + \fi \fi} + +\def\flushlinetablehead + {\ifcase\linetableheadstate + % 0 blocked + \or + % 1 doing head + \or + % 2 head done + \or + % 3 trigger flush + \chardef\linetableheadstate\plusone + \the\@@linetablehead\relax + \chardef\linetableheadstate\plustwo + \fi} + +\def\linetableNC % first time special treatment + {\relax + \ifcase\linetablecolumn + \linetableBR + \else + \linetableEC + \fi + \linetableBC} % beware, this will result in BR BC EC BC NR + +\def\linetableNR + {\stoplinetablecell % dummy + \linetableER} + +\def\startlinetable + {\startlinetablerun} + +\def\stoplinetable + {\stoplinetablerun} + +\def\startlinetableanalysis + {\bgroup + \linetableprerolltrue + \trialtypesettingtrue + \startlinetablerun} + +\def\stoplinetableanalysis + {\stoplinetablerun + \egroup + \globallet\noflinetablerows\linetablerows + \dorecurse\noflinetablerows % global, from last run {\linetableparameter\c!n} + {%\writestatus{linetable}{\recurselevel->\getvalue{\??lew\recurselevel}}% + \setevalue{\??ler\recurselevel x\c!height}{\getvalue{\??leh\recurselevel}}% + \setevalue{\??ler\recurselevel x\c!depth }{\getvalue{\??led\recurselevel}}% + \letgvalue{\??leh\recurselevel}\!!zeropoint + \letgvalue{\??led\recurselevel}\!!zeropoint} + \dorecurse\noflinetablecolumns % global, from last run {\linetableparameter\c!n} + {%\writestatus{linetable}{\recurselevel->\getvalue{\??lew\recurselevel}}% + \setevalue{\??lec\recurselevel\c!width}{\getvalue{\??lew\recurselevel}}% + \letgvalue{\??lew\recurselevel}\!!zeropoint}} % init next table + +% todo: store in box instead of macro + +\newtoks \@@linetablehead + +\long\def\startlinetablehead#1\stoplinetablehead + {\ifinlinetable + \@@linetablehead\emptytoks + \fi + \chardef\linetableheadstate3 % full + \@@linetablehead{#1}% + \ifinlinetable + \flushlinetablehead + \fi} + +\def\linetableBH + {\ifx\EC\relax + % signal, grabbing lines + \else + \@@linetablehead\emptytoks + \fi + \pushmacro\BC + \pushmacro\EC + \def\BC##1\EC{\appendtoks##1\to\@@linetablehead}% + \let\EC\relax} % signal + +\def\linetableEH + {\popmacro\EC + \popmacro\BC + \@EA\startlinetablehead\the\@@linetablehead\stoplinetablehead} + +\let\startlinetablebody\donothing +\let\stoplinetablebody \donothing + +\def\processlinetablebuffer + {\dosingleempty\doprocesslinetablebuffer} + +\def\doprocesslinetablebuffer[#1]% + {\bgroup + \let\startlinetable\donothing + \let\stoplinetable \donothing + \startlinetableanalysis\getbuffer[#1]\stoplinetableanalysis + \startlinetablerun \getbuffer[#1]\stoplinetablerun + \egroup} + +\def\processlinetablefile#1% + {\bgroup + \let\startlinetable\donothing + \let\stoplinetable \donothing + \startlinetableanalysis\readfile{#1}\donothing\donothing\stoplinetableanalysis + \startlinetablerun \readfile{#1}\donothing\donothing\stoplinetablerun + \egroup} + +% will go away: + +\def\processlinetableXMLfile#1% + {\bgroup + \let\startlinetable\donothing + \let\stoplinetable \donothing + \startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis + \startlinetablerun \processXMLfile{#1}\stoplinetablerun + \egroup} + +\protect \endinput + +\doifnotmode{demo}{\endinput} + +\setuplinetable[n=6,m={2,2,2},lines=25] % m ? + +\setuplinetable[c][1] [width=2cm,background=color,backgroundcolor=red] +\setuplinetable[c][4] [width=3cm,background=color,backgroundcolor=yellow] +\setuplinetable[c][6] [width=3cm,background=color,backgroundcolor=magenta] +\setuplinetable[r][odd] [background=color,backgroundcolor=gray] +\setuplinetable[r][even][background=color,backgroundcolor=green] + +\starttext + +\showframe \showstruts + +\setupcolors[state=start] + +\setuppagenumbering[alternative=doublesided]\page[left] + +\startlinetable +\NC aaa\crlf aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR +\dorecurse{100}{\NC aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR} +\stoplinetable + +\startlinetable +\NC[style=slanted,color=green,background=color,backgroundcolor=darkred,nx=2,uitlijnen=middle] xxx + \NC yy \NC ddddd \NC eeee \NC ff \NC \NR +\dorecurse{100}{\NC aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR} +\stoplinetable + +% \startbuffer[lt] +% \NC aaa\crlf aaa \NC bb \NC c \NC ddddd \NC ee \NC ff \NC \NR +% \NC aaa\crlf aaa \NC b \NC cc \NC ddd \NC eeee \NC f \NC \NR +% \stopbuffer +% +% \processlinetablebuffer[lt] + +\stoptext diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv index ca932a5d9..e7df3b281 100644 --- a/tex/context/base/tabl-ntb.mkiv +++ b/tex/context/base/tabl-ntb.mkiv @@ -665,7 +665,6 @@ \processaction [\tbltblheader] [\v!repeat=>\multipleTBLheadstrue]% - \localcolortrue \presetallTABLEparameters \ExpandFirstAfter\processallactionsinset [\tbltbloption] @@ -955,7 +954,7 @@ \ifx\!!stringa\empty \box\scratchbox \else - \normalexpanded{\noexpand\gotobox{\box\scratchbox}[\!!stringa]}% + \normalexpanded{\noexpand\directgotobox{\box\scratchbox}[\!!stringa]}% to be checked \fi \box\scratchbox} diff --git a/tex/context/base/tabl-nte.tex b/tex/context/base/tabl-nte.mkii index cde64a033..cde64a033 100644 --- a/tex/context/base/tabl-nte.tex +++ b/tex/context/base/tabl-nte.mkii diff --git a/tex/context/base/tabl-nte.mkiv b/tex/context/base/tabl-nte.mkiv new file mode 100644 index 000000000..cde64a033 --- /dev/null +++ b/tex/context/base/tabl-nte.mkiv @@ -0,0 +1,107 @@ +%D \module +%D [ file=core-nte, +%D version=2009.03.08, +%D title=\CONTEXT\ Table Macros, +%D subtitle=Natural Tables Extensions, +%D author=Hans Hagen \& Wolfgang Schuster, +%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. + +\writestatus{loading}{ConTeXt Table Module / Natural Tables Extensions} + +\unprotect + +%D This module is suggested by Wolfgang Schuster who also prototyped +%D it and came up with the rationale: +%D +%D This module provides an easy way to use natural in a similiar +%D way as the older table module (based on the \TABLE\ macros) and +%D the newer tabulate module. +%D +%D You can see the advantage in the following table, once created +%D with the new macros and once with the normal macros provided +%D with the natural table module. +%D +%D Let us start with the original macros: +%D +%D \starttyping +%D \bTABLE +%D \bTR +%D \bTD Text 1 \eTD +%D \bTD Text 2 \eTD +%D \eTR +%D \bTR +%D \bTD Text 3 \eTD +%D \bTD Text 4 \eTD +%D \eTR +%D \eTABLE +%D \stoptyping +%D +%D Watch how the new macros use less code: +%D +%D \starttyping +%D \startTABLE +%D \NC Text 1 \NC Text 2 \NC\NR +%D \NC Text 3 \NC Text 4 \NC\NR +%D \stopTABLE +%D \stoptyping +%D +%D The actual code differs from the prototype that it does not need +%D to collect whole rows and parse them but looks ahead instead. + +\def\startTABLE + {\dosingleempty\dostartTABLE} + +\def\dostartTABLE[#1]% + {\bgroup + \bTABLE[#1]% + \let\NC\doTABLENC + \let\NR\doTABLENR + \let\bTR\relax + \let\bTD\relax + \let\bTH\relax + \let\bTN\relax} + +\def\stopTABLE + {\eTABLE + \egroup} + +\newconditional\inTABLEnc + +\unexpanded\def\doTABLENR + {\eTR + \setfalse\inTABLEnc} + +\unexpanded\def\doTABLENC + {\futurelet\next\dodoTABLENC} + +\def\dodoTABLENC + {\ifx\next\doTABLENR \else + \expandafter\dododoTABLENC + \fi} + +% \long\def\dododoTABLENC#1\NC +% {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi +% \parseTD[][]#1\eTD\NC} + +\long\def\dododoTABLENC#1\NC + {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi + \dodoubleempty\parseTD#1\eTD\NC} + +%D The related structure commands are also available: + +\unexpanded\def\startTABLEhead{\dosingleempty\dostartTABLEhead} \let\stopTABLEhead\relax +\unexpanded\def\startTABLEnext{\dosingleempty\dostartTABLEnext} \let\stopTABLEnext\relax +\unexpanded\def\startTABLEbody{\dosingleempty\dostartTABLEbody} \let\stopTABLEbody\relax +\unexpanded\def\startTABLEfoot{\dosingleempty\dostartTABLEfoot} \let\stopTABLEfoot\relax + +\long\def\dostartTABLEhead[#1]#2\stopTABLEhead{\appendtoks\doTABLEsection[#1]{#2}\to\TBLhead} +\long\def\dostartTABLEnext[#1]#2\stopTABLEnext{\appendtoks\doTABLEsection[#1]{#2}\to\TBLnext} +\long\def\dostartTABLEbody[#1]#2\stopTABLEbody{\appendtoks\doTABLEsection[#1]{#2}\to\TBLbody} +\long\def\dostartTABLEfoot[#1]#2\stopTABLEfoot{\appendtoks\doTABLEsection[#1]{#2}\to\TBLfoot} + +\protect \endinput diff --git a/tex/context/base/tabl-pln.tex b/tex/context/base/tabl-pln.mkii index 39bb50f23..39bb50f23 100644 --- a/tex/context/base/tabl-pln.tex +++ b/tex/context/base/tabl-pln.mkii diff --git a/tex/context/base/tabl-pln.mkiv b/tex/context/base/tabl-pln.mkiv new file mode 100644 index 000000000..39bb50f23 --- /dev/null +++ b/tex/context/base/tabl-pln.mkiv @@ -0,0 +1,91 @@ +%D The following bunch of macros come from plain \TEX\ by +%D Don Knuth and deal with basic alignment. We just include +%D them here so that they can be used if needed. Normally, +%D \CONTEXT\ users will fall back on one of the three table +%D environments. +%D +%D The hidden names are somewhat adapted and we use other +%D local variables. + +\writestatus{loading}{ConTeXt Table Macros / Plain Tabular} + +\unprotect + +\newif \if@@plnusetab +\newif \if@@plncr +\newbox \@@plntabs +\newbox \@@plntabsyet +\newbox \@@plntabsdone +\newdimen \@@plntabdimen + +\def\cleartabs % visible + {\global\setbox\@@plntabsyet\null + \setbox\@@plntabs\null} + +\def\settabs % visible + {\setbox\@@plntabs\null + \futurelet\next\@@plnsettabs} + +\def\tabalign % visible + {\@@plnusetabtrue\@@plnmaketabbox} + +\let\+\tabalign % no outer here (can be overloaded) + +\def\@@plnsettabs + {\ifx\next\+% + \def\nxt{\afterassignment\@@plnsettab\let\nxt}% + \else + \let\nxt\@@plnsetcols + \fi + \let\next\relax + \nxt} + +\def\@@plnsettab + {\let\nxt\relax + \@@plnusetabfalse\@@plnmaketabbox} + +\def\@@plnsetcols#1\columns + {\scratchcounter#1% + \@@plntabdimen\hsize + \loop + \ifnum\scratchcounter>\zerocount \@nother + \repeat} + +\def\@nother + {\scratchdimen\@@plntabdimen + \divide\scratchdimen\scratchcounter + \setbox\@@plntabs\hbox{\hbox to\scratchdimen{}\unhbox\@@plntabs}% + \advance\@@plntabdimen-\scratchdimen + \advance\scratchcounter\minusone} + +\def\@@plnmaketabbox + {\begingroup + \global\setbox\@@plntabsyet\copy\@@plntabs + \global\setbox\@@plntabsdone\null + \def\cr + {\@@plncrtrue\crcr\egroup\egroup + \if@@plnusetab\unvbox\zerocount\lastbox\fi\endgroup + \setbox\@@plntabs\hbox{\unhbox\@@plntabsyet\unhbox\@@plntabsdone}}% + \setbox\zerocount\vbox\bgroup\@@plncrfalse + \ialign\bgroup&\@@plnbegintabbox##\@@plnendtabbox\crcr} + +\def\@@plnbegintabbox + {\setbox\zerocount\hbox\bgroup} + +\def\@@plnendtabbox + {\if@@plncr + \egroup % now \box\zerocount holds the column + \else + \hss\egroup + \global\setbox\@@plntabsyet\hbox + {\unhbox\@@plntabsyet\global\setbox\plusone\lastbox}% now \box\plusone holds its size + \ifvoid\plusone + \global\setbox\plusone\hbox to\wd\zerocount{}% + \else + \setbox\zerocount\hbox to\wd\plusone{\unhbox\zerocount}% + \fi + \global\setbox\@@plntabsdone\hbox{\box\plusone\unhbox\@@plntabsdone}% + \fi + \box\zerocount} + +\protect \endinput diff --git a/tex/context/base/tabl-tab.tex b/tex/context/base/tabl-tab.mkii index 361369ea2..e3bfca9c3 100644 --- a/tex/context/base/tabl-tab.tex +++ b/tex/context/base/tabl-tab.mkii @@ -16,6 +16,14 @@ % By now it makes more sense to merge the patches into the original % and clean that one up too. +% \starttable[|||] +% \HL +% \VL test \VS test \VL \FR +% \VL test \VD test \VL \MR +% \VL test \VT test \VL \LR +% \HL +% \stoptable + % Don't change the splitter: % % ... \NR diff --git a/tex/context/base/tabl-tab.mkiv b/tex/context/base/tabl-tab.mkiv new file mode 100644 index 000000000..429f41add --- /dev/null +++ b/tex/context/base/tabl-tab.mkiv @@ -0,0 +1,2515 @@ +%D \module +%D [ file=core-tab, +%D version=1997.10.10, +%D title=\CONTEXT\ Table Macros, +%D subtitle=\TABLE\ Embedding, +%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 Table Macros / TaBlE Embedding} + +% By now it makes more sense to merge the patches into the original +% and clean that one up too. + +% \starttable[|||] +% \HL +% \VL test \VS test \VL \FR +% \VL test \VD test \VL \MR +% \VL test \VT test \VL \LR +% \HL +% \stoptable + +% Don't change the splitter: +% +% ... \NR +% \TABLEnoalign{\page}\TABLEhead +% \NC ... + +% e-tex: reverse rows or vadjust or ... in tables +% \ifalign +% \xhrule : calls for 'special' with width +% BUG: +% +% \starttable[|l|l|] +% \HL +% \RL\FR \VL Head 1 \VL Head 2 \VL\FR +% \RL\LR \VL Head A \VL Head B \VL\LR % niet grijs ?? +% \HL +% \VL 1 \VL 2 \VL\FR +% \VL a \VL b \VL\LR +% \HL +% \stoptable + +% melden als in kleur conflict, uitgestelde test op \SR\SR + +% verengelsen +% interface + +% footnotes flushen +% \......TABLE........ namen +% kolommen testen +% unbreakable kop definieren +% voetnoten +% meldingen +% als direct \use{max} dan fout +% \BREAKPOINT +% breedte lijn telt +% errors: ook gray in handle + +% \AR -> als in DL dan \DR + +% nieuw: +% +% \NL / \NL[blanko] is skip, nog default? +% geen \HL in a row +% \HL[n] +% \VL[n] + remembers +% c{colorspec} key +% \HC[color][width] +% \VC[color] +% meldingen row, column, use, advise +% \AR: UITSTELLEN / EXPERIMENTEEL + +% WAARDELOZE ERROR HANDLER +% THIS RENEWED MODULE WORKS OK BUT STILL LOOKS BAD + +%D We felt no need to write our own table building macros, +%D simply because Michael Wichura made a terrific one. This +%D package is quite complete and well documented. In \CONTEXT\ +%D we provide a shell for consistent spacing as well as color +%D support. Implementing these features without adapting the +%D original macros is not trivial. One easilly gets conflicts +%D with \type{\omit}, \type{\span} and \type{\noalign}, which +%D means that we end up postponing and overloading macros, +%D mostly global. Now, let's start with loading the main +%D macros: + +\doifundefined{BeginTable}{\doinputonce{table.tex}} + +\unprotect + +%D \macros +%D {inintable, ifsplittables} +%D +%D First we declare some variables. These show a bit what we +%D are dealing with. First we introdoce some booleans that +%D enable us, inside as well as outside this module, to +%D determine in what mode we are. + +\newif\ifintable +\newif\ifsplittables + +%D \macros +%D {tracetablestrue} +%D +%D When I documented this module, I felt the need for tracing +%D options. After implementing this feature, I also added +%D warnings, error recovery and automatic spacing. + +\newif\iftracetables + +%D We show this feature in an eample that also shows some of +%D the basic table typesetting commands. +%D +%D \startbuffer +%D \starttable[|||] +%D \HL +%D \VL first \VL second \VL\AR +%D \HL +%D \VL alfa \VL 1 \VL\AR +%D \VL beta \VL 2 \VL\AR +%D \VL gamma \VL 3 \VL\AR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \startcombination +%D {\tracetablesfalse\getbuffer} {\type{\tracetablesfalse}} +%D {\tracetablestrue\getbuffer} {\type{\tracetablestrue}} +%D \stopcombination +%D +%D This table is specified as: +%D +%D \typebuffer +%D +%D This examples shows about the minimum of commands needed to +%D typeset such a table. In this table, the \type {\AR} is +%D automatically translated into the more primitive (but more +%D verbose) commands \type {\SR}, \type {\FR}, \type {\MR} and +%D \type {\LR} commands. +%D +%D \startbuffer +%D \starttables[|||] +%D \HL +%D \VL first \VL second \VL\AR +%D \HL +%D \VL alfa \VL 1 \VL\AR +%D \VL beta \VL 2 \VL\AR +%D \VL gamma \VL 3 \VL\AR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D When we use the split table feature, we get a bit more +%D information. +%D +%D {\tracetablesfalse\getbuffer} +%D +%D Sometimes in tables information shows up that is not typed +%D in by the user. These messages give a cue in what aspect a +%D table definition is wrong. +%D +%D \startbuffer +%D \starttable[||||] +%D \HL +%D \VL first second \VL third \VL\AR +%D \HL +%D \VL alfa \VL 1 \VL a \VL\AR +%D \VL beta \VL 2 \VL b \VL +%D \VL gamma \VL \THREE{3} c \VL\AR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \typebuffer +%D +%D Those terrible table has three errors, which all show up in +%D typeset messages. Errors cannot always recovered 100\% and +%D therefore can result in two or more succesive messages, like +%D in the last row. +%D +%D \getbuffer + +%D Bringing color into tables is complicated by the mere fact +%D that color is not part of \TEX. The main complication is +%D that we don't know in advance how wide a column will be. I +%D implemented color support in tables in the early 90's +%D because I needed it for some articles on color. I have to +%D admit that I seldom use the mechanism. +%D +%D Most color support in \CONTEXT\ makes use of colored rules. +%D At first sight, one is tempted to implement colors in tables +%D in a similar way, but as said, we don't know the dimensions +%D in advance. It turns out however that we don't have to, +%D simply because alignments take care of stretching rules to +%D the appropritate dimensions. This means that we can provide +%D backgrounds by coloring rules with the height of a row, +%D skipping upwards and finally drawing the content, like in: +%D +%D \gdef\ShowExample +%D {\startfiguretext +%D {none} +%D {\getbuffer} +%D \typebuffer +%D \stopfiguretext} +%D +%D \startbuffer +%D \starttable[|c|c|] +%D \HL +%D \BL[2] \SR +%D \VL test \VL test \VL\SR +%D \HL +%D \VL test \VL test \VL\FR +%D \VL test \VL test \VL\MR +%D \VL test \VL test \VL\LR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample +%D +%D Just to be complete we show how the other columns can be +%D given a background. Later we will provide more details over +%D the commands used. +%D +%D \startbuffer +%D \starttable[|c|c|c|] +%D \HL +%D \BL[3] \SR +%D \VL test \VL test \VL test \VL\SR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample +%D +%D \startbuffer +%D \starttable[|c|c|c|] +%D \HL +%D \BC \BL[2] \SR +%D \VL test \VL test \VL test \VL\SR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample +%D +%D \startbuffer +%D \starttable[|c|c|c|] +%D \HL +%D \BC \BC \BL \SR +%D \VL test \VL test \VL test \VL\SR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample +%D +%D \startbuffer +%D \starttable[|c|c|c|] +%D \HL +%D \BC \BL \SR +%D \VL test \VL test \VL test \VL\SR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample +%D +%D \startbuffer +%D \starttable[|c|c|c|] +%D \BL \BL \SR +%D \HL +%D \VL test \VL test \VL test \VL\SR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample + +%D In these examples we can clearly see that for being a real +%D background, the color or gray specification has to precede +%D the content. Just to keep things simple, we can recall this +%D specification later on: +%D +%D \startbuffer +%D \starttable[|c|c|c|] +%D \BC \BL \SR +%D \HL +%D \VL test \VL test \VL test \VL\SR +%D \HL +%D \BR\FR +%D \VL test \VL test \VL test \VL\FR +%D \BR\MR +%D \VL test \VL test \VL test \VL\MR +%D \BR\LR +%D \VL test \VL test \VL test \VL\LR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample +%D +%D Close study learns that we can put the specification +%D before or after the \type{\HL}, whatever suits best. Keeping +%D track of these specifications is taken care of by the next +%D variables: + +\newif \ifTABLEgrayline % executing gray line +\newif \ifTABLEgraydone % gray line executed +\newtoks \TABLEgraytoks % gray line specification + +\newif\ifTABLEinbreak + +%D Nog vervangen: + +\def\c!Table{Table} +\def\m!TABLE{TABLE} + +%D We already saw that the table macros report errors and +%D provide automatic spacing. These features can only be +%D implemented by keeping track of the state, often the last +%D command on a row. + +\chardef\TABLEunknown = 0 + +\chardef\TABLEseparaterow = 1 +\chardef\TABLEfirstrow = 2 +\chardef\TABLEmidrow = 3 +\chardef\TABLElastrow = 4 +\chardef\TABLErule = 5 +\chardef\TABLEskip = 6 +\chardef\TABLEautorow = 7 + +\chardef\TABLEforcefirstrow = 1 +\chardef\TABLEforcelastrow = 2 + +\chardef\TABLEmissingrow = 1 +\chardef\TABLEmissingcolumn = 2 +\chardef\TABLEspanoverflow = 3 +\chardef\TABLEdivisionoverflow = 4 + +%D We store these states using efficient \type {\chardef}'s. +%D Like most variables, these are global ones. When needed, +%D especially when we flush the backgrounds, we can temporary +%D disable the assignment. + +\newif\ifsetTABLEaction + +\def\setTABLEaction#1% + {\ifsetTABLEaction\global\chardef\TABLEaction#1\fi} + +\def\setTABLEforce#1% + {\ifsetTABLEaction\global\chardef\TABLEforce#1\fi} + +\def\setTABLEerror#1% + {\global\chardef\TABLEerror#1} + +%D Before we come to using these variables, we redefine and/or +%D adapt some \TABLE\ macros. Within \TABLE's the \type{|} and +%D \type{"} have special meanings in templates and are active +%D during. Their meaning can therefore conflict with those +%D elsewhere defined. To be compatible with traditional \TABLE\ +%D as well as \CONTEXT's \type{||} and the active \type{"} +%D extensions for my german friends, we do some catcode magic. + +\newif\ifForgetTableBarAndQuote \ForgetTableBarAndQuotetrue + +% \bgroup + +% \catcode`\|=\@@active +% \catcode`\"=\@@active +% +% \gdef\pushouterbarandquote +% {\ifForgetTableBarAndQuote +% \ifnum\catcode`\|=\@@active \let\outertablebar |\else\let\outertablebar \relax\fi +% \ifnum\catcode`\"=\@@active \let\outertablequote"\else\let\outertablequote\relax\fi +% \let|\letterbar +% \let"\letterdoublequote +% \fi} +% +% \gdef\popouterbarandquote +% {\ifForgetTableBarAndQuote +% \ifx\outertablebar \relax\else\let|\outertablebar \fi +% \ifx\outertablequote\relax\else\let"\outertablequote\fi +% \else +% \redefinetablebarandquote +% \fi} +% +% \egroup +% +% \def\ObeyTableBarAndQuote +% {\ForgetTableBarAndQuotefalse +% \ifintable +% \redefinetablebarandquote +% \fi} + +\let\ActivateBarAndQuote \relax +\let\ObeyTableBarAndQuote\relax +\let\pushouterbarandquote\relax +\let\popouterbarandquote \relax + +%D \macros +%D {ObeyTableBarAndQuote} +%D +%D As said, the \type{|} and \type{"} active characters are +%D often used for other purposes. By default, the outside +%D meanings are therefore preserved and available inside +%D tables. If for some reason one wants to use the \TABLE\ +%D primitives, one can say: +%D +%D \starttyping +%D \ObeyTableBarAndQuote +%D \stoptyping +%D +%D To keep things verbose, as well as to show what \TABLE\ +%D commands we affect, we show some meanings. + +\def\normalTABLEshortrule {\!ttShortHrule} % \- +\def\normalTABLElongrule {\!ttLongHrule} % \= +\def\normalTABLEfullrule {\!ttFullHrule} % \_ +\def\normalTABLEendofrow {\!ttEndOfRow} % \\ +\def\normalTABLEsimplebar {\unskip\!ttRightGlue&&} % | +\def\normalTABLEcomplexbar {\unskip\!ttRightGlue&\omit\!ttAlternateVrule} % \| +\def\normalTABLEquote {\unskip\!ttRightGlue&\omit&} % " +\def\normalTABLElineformat {\normalTABLEendofrow+} +\def\normalTABLElineending {\normalTABLEendofrow0 } +\def\normalTABLEsinglerule {&\normalTABLElongrule&} +\def\normalTABLEmultirule#1{&\use{#1}\normalTABLElongrule&} + +%D The next hack is dedicated to Tobias, who found out that +%D paragraph entries don't break well. + +\def\TABLEhack{\hskip\zeropoint} + +%D The first attemp to solve this problem was: +%D +%D \starttyping +%D \def\normalTABLEquote% +%D {\unskip\TABLEhack\!ttRightGlue&\omit&\TABLEhack} +%D \stoptyping +%D +%D But, as usual, this interfered with \type {\omit}. +%D +%D The next attempt is redefining some core \TABLE\ macro:. +%D This works ok, but breaks for instance the~\type{b} +%D key handling. +%D +%D \starttyping +%D \def\!tfAdjoinPriorColumn% +%D {\ifnum\!taColumnNumber=0 +%D \!taPreamble=\!taRuleColumnTemplate +%D ... +%D \if!taOnceOnlyTabskip +%D \!thToksEdef\!taDataColumnTemplate= +%D {\TABLEhack####\TABLEhack\tabskip\the\!taLastRegularTabskip} +%D \else +%D \!taDataColumnTemplate{\TABLEhack##\TABLEhack}% +%D \fi +%D ... +%D \ReadFormatKeys} +%D \stoptyping + +% \newdimen\TABLEparheight + +\def\BeginTableParBox#1% + {\setbox\scratchbox\vtop\bgroup % \setbox added + \hsize#1\relax + \dontcomplain + \restoretablelineskips + \normalbaselines + \let~\!ttTie + \let\-\!ttDH + \blank[\v!disable]% % added + \the\EveryTableParBox} + +\def\EndTableParBox + {\removelastskip % itemize or so + \endgraf + \ifnum\prevgraf>\zerocount % we want at least + \verticalstrut \nowhitespace \vskip-\struttotal % one line of text + \egroup + \ifdim\dp\scratchbox>\lineheight % see (*) for an + \getnoflines{\dp\scratchbox}% % example of where + \dp\scratchbox\zeropoint % saving can go + \setbox\scratchbox % terrible wrong + \vtop to \noflines\lineheight{\box\scratchbox}% + \fi % esp between rows + \else % of paragraphs + \egroup + \fi +% \getboxheight\scratchdimen\of\box\scratchbox\relax% compensate for +% \ifdim\scratchdimen>\TABLEparheight % funny depth of +% \global\TABLEparheight\scratchdimen % multi-line box +% \fi % i.e. vtop + \box\scratchbox} + +% We also need to patch away the interfering math switch: + +% \mathpunctuationtrue + +% test, test +% \starttable[|c|] +% \NC1,,10\NC\AR +% \stoptable +% test, test + +\def\!ttBeginTableA[#1]{% + \if #1u% % "unboxed" table + \ifmmode + \def\!ttEndTable{% % user had better be in display math mode + \relax}% % and have only one table at the outer level + \else % user had better be in vertical mode + \bgroup + \def\!ttEndTable{% + \egroup}% + \fi + \else + %\hbox\bgroup $ + %\def\!ttEndTable{% + % \egroup % for the \vtop, \vbox, or \vcenter, yet to come + % $% for math mode + % \egroup}% for the \hbox + %\if #1t% + % \vtop + %\else + % \if #1b% + % \vbox + % \else + % \vcenter % math mode was essential for this + % \fi + %\fi + % + \hbox\bgroup + \def\!ttEndTable{\egroup\egroup}% + \if#1t% + \vtop + \else\if#1b% + \vbox + \else + \def\!ttEndTable{\egroup$\egroup}% + %$\vcenter + \scratchtoks\everymath\everymath\emptytoks$\everymath\scratchtoks\vcenter + \fi\fi + % + \bgroup % for the \vtop, \vbox, or \vcenter + \fi + \advance\!taRecursionLevel 1 % RecursionLevel governs initialization + \let\!ttRightGlue=\relax % This may be changed by \JustCenter, etc + \everycr\emptytoks % ={} + \ifnum \!taRecursionLevel=1 + \!ttInitializeTable + \fi} + +%D The next redefinition is more robust than the original: + +\def\SetTableToWidth#1% + {\doifelsenothing{#1}{\!taTableSpread\emptytoks}{\!taTableSpread{to #1}}} + +% (*) Try this one with \type {direction} and {girection}; +% the \PPCHTEX\ manual is a nice testcase. +% +% \startoverlay +% {\starttable[ | l w(2cm) | w(8cm) | ] +% \HL +% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR +% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR +% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR +% \HL +% \stoptable} +% {\starttable[ | l w(2cm) | p(8cm) | ] +% \HL +% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR +% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR +% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR +% \HL +% \stoptable} +% \stopoverlay +% \vskip2cm +% \starttable[ | l w(2cm) | p(8cm) | ] +% \HL +% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR +% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR +% \HL +% \stoptable +% \vskip2cm +% \starttable[ | l w(2cm) | p(8cm) | ] +% \HL +% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \FR +% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR +% \HL +% \stoptable + +%D To give an impression of what the (well documented) source +%D of \TABLE\ looks like, we first implement an alternative for +%D the numeric keys. The quantity keys (\type{q} and \type{Q}) +%D support the more european way of writing numbers: +%D +%D \startnarrower +%D 100.000.000,00 instead of 100,000,000.00 +%D \stopnarrower +%D +%D The next table shows how to use these keys. We use braces +%D instead of brackets because we need brackets to specify the +%D format. +%D +%D \startbuffer +%D \starttable{|q[00,000]|Q[00,00]|} +%D \HL +%D \VL -1,2 \VL 12,35 \VL\FR +%D \VL 11,203 \VL 2,4 \VL\LR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample +%D +%D Although a more efficient implementation is possible |<|we +%D can for instance share common macros|>| we just adapt a copy +%D of the numeric ones. To permit double loading of this +%D module, we check for the existence of one of the macros. + +\letvalue{!tk<\string q>}=\undefined +\letvalue{!tk<\string Q>}=\undefined + +%D We just copy the original {\em comments}. +%D +%D \em Key \type{q}: quantity item, non||math mode. + +\NewFormatKey q% + {\letempty\!tqStyle + \futurelet\!tnext\!tqTestForBracket} + +%D \em Key \type{Q}: quantity item, math mode. + +\NewFormatKey Q% + {\def\!tqStyle{$}% + \futurelet\!tnext\!tqTestForBracket} + +%D \em Note: the space between a quantity entry and the +%D following \type{|}, \type{"}, or \type{\|} is mandatory. +%D empty quantity entries are not allowed: use \type{{}} or +%D \type{\omit} instead. +%D +%D \em Test for bracket: invoked by the keys \type{q} and +%D \type{Q}. + +\def\!tqTestForBracket + {\ifx[\!tnext + \!thx\!tqGetArgument + \else + \!thx\!tqGetCode + \fi} + +%D \em Get code: e.g. \type{4}, or \type{4,0}, \type{0,4}, or +%D \type{10,2}. + +\def\!tqGetCode#1 % note the blank + {\!tqConvertCode #1,,!} + +%D \em Convert code: e.g. converts above to \type{[0000]}, +%D \type{[0000,]}, \type{[,0000]}, \type{[0000000000,00]}. + +\def\!tqConvertCode #1,#2,#3!% + {\begingroup + \aftergroup\edef + \aftergroup\!ttemp + \aftergroup{% + \aftergroup[% + \!taCountA #1 + \!thLoop + \ifnum \!taCountA>\zerocount + \advance\!taCountA \minusone + \aftergroup0 + \repeat + \def\!ttemp{#3}% + \ifx\!ttemp\empty + \else + \aftergroup, + \!taCountA #2 + \!thLoop + \ifnum\!taCountA>\zerocount + \advance\!taCountA \minusone + \aftergroup0 + \repeat + \fi + \aftergroup]\aftergroup}% + \endgroup\relax + \!thx\!tqGetArgument\!ttemp} + +%D \em Get argument: +%D +%D \starttyping +%D <sample left field> <optional, sample right field> +%D \stoptyping + +\def\!tqGetArgument[#1]% + {\!tqMakeQuantityTemplate\!tqStyle#1,,!} + +%D \em Make quantity template. + +\def\!tqMakeQuantityTemplate#1#2,#3,#4!% #1=<empty> or $ + {\def\!ttemp{#4}% + \ifx\!ttemp\empty + \!taDimenC\zeropoint + \else + \setbox0\hbox{\mathsurround\zeropoint #1,#3#1}% + \!taDimenC\wd0 + \fi + \setbox0\hbox{\mathsurround\zeropoint #1#2#1}% + \!thToksEdef\!taDataColumnTemplate + ={\noexpand\!tqSetQuantityItem{\the\wd0 }{\the\!taDimenC}{#1}% + \the\!taDataColumnTemplate}% + \ReadFormatKeys} + +%D \em Set numeric item. + +\def\!tqSetQuantityItem #1#2#3#4 % + {\!tqSetQuantityItemA{#1}{#2}{#3}#4,,!} + +\def\!tqSetQuantityItemA #1#2#3#4,#5,#6!% + {\def\!ttemp{#6}% + \hbox to #1{\hss\mathsurround\zeropoint#3#4#3}% + \hbox to #2{\ifx\!ttemp\empty\else\mathsurround\zeropoint#3,#5#3\fi\hss}} + +%D Here ends the Q||extension. Did you watch the clever use +%D of aftergroup in \type{\!tqConvertCode}. + +% %D We also (have to) define a key for \type{\cap}: +% +% \letvalue{!tk<\string K>}=\undefined +% +% \NewFormatKey K% +% {\ReadFormatKeys b\smallcapped} + +%D A few pages back we saw backgrounds, further on we will see +%D colored rules, and here we provide a means to color the +%D entries in a column. (We can of course always use the normal +%D color commands for individual entries.) We could not use the +%D lowercase~\type{c}, because that one is used to force {\em +%D centering}. +%D +%D \startbuffer +%D \starttable[|C{red}|C{green}|C{blue}|] +%D \VL R(ed) \VL G(reen) \VL B(lue) \VL\SR +%D \stoptable +%D \stopbuffer +%D +%D \ShowExample + +\letvalue{!tk<\string C>}=\undefined + +\NewFormatKey C#1% + {\ReadFormatKeys b{\startcolor[#1]} a{\stopcolor}} + +%D So now we have three new keys: +%D +%D \starttable[|||] +%D \HL +%D \NC \bf key \NC \bf meaning \NC\AR +%D \HL +%D \NC Q[x,y] \NC math mode formatted numbers \NC\AR +%D \NC q[x,y] \NC text mode formatted numbers \NC\AR +%D \NC C{identifier} \NC column entry color \NC\AR +%D \HL +%D \stoptable + +%D To be compatible with the tabulate environment, we also +%D support the \type {l}, \type {c} and \type {r} keys for +%D paragraph entries. + +\letvalue{!tk<\string l>}=\undefined +\letvalue{!tk<\string c>}=\undefined +\letvalue{!tk<\string r>}=\undefined +\letvalue{!tk<\string x>}=\undefined % not that needed + +\NewFormatKey c% + {\prependtoks\raggedcenter\to\!taDataColumnTemplate + \ReadFormatKeys \LeftGlue\hfil \RightGlue\hfil} + +\NewFormatKey l% + {\prependtoks\raggedright\to\!taDataColumnTemplate + \ReadFormatKeys \LeftGlue\empty \RightGlue\hfil} + +\NewFormatKey r% + {\prependtoks\raggedleft\to\!taDataColumnTemplate + \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty} + +\NewFormatKey x% + {\prependtoks\notragged\to\!taDataColumnTemplate + \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty} + +\appendtoks \TABLEparalignment \to \EveryTableParBox + +\def\!tfReFormat#1% + {\the \!taLeftGlue + \vbox{\forgetall\ialign{\span\the\!taDataColumnTemplate\cr#1\cr}}% + \the \!taRightGlue + \kern\zeropoint} % prevents \unskip / really needed + +%D Later on, we're going to implement multiple page table +%D support, therefore the next \TABLE\ macro needs to be +%D slightly adapted, i.c. the penalty is removed. We also +%D add basic color support. + +\def\!ttFullHruleA + {\!ttGetHalfRuleThickness + \startglobalTABLEcolor % added + \hrule\!thHeight\dimen0\!thDepth\dimen0 + \stopglobalTABLEcolor % added + %\penalty0 % removed + \egroup} + +%D We'll see that when we want to give a vertical rule a color, +%D we have to set and reset states. After heavy testing it +%D proved most useful to extend a \TABLE\ primitive with some +%D hooks. One thing to keep in mind is that \type{&} keeps +%D assignments local. Again, we add basic color support. + +\let\TABLEbeforebar\empty +\let\TABLEafterbar \empty + +\def\@VLn{1} +\def\@VLd{.125em} + +\def\do!ttInsertVrule % will be merged in 2005 + {\vrule \!thWidth + \ifnum\!tgCode=\plusone + \ifx\!tgValue\empty + \LineThicknessFactor + \else + \!tgValue + \fi + \LineThicknessUnit + \else + \!tgValue + \fi + \hskip\@VLd} + +\def\!ttInsertVrule + {\hfil + \TABLEbeforebar % added + \startglobalTABLEcolor % added + % we could do without this speedup, some day merge 'm + \ifcase\@VLn\or + \do!ttInsertVrule + \unskip + \else + \dorecurse\@VLn\do!ttInsertVrule + \gdef\@VLn{1}% + \unskip + \fi + \stopglobalTABLEcolor % added + \TABLEafterbar % added + \hfil + &} + +%D The next two macros are only adapted to basis rule +%D color support. + +\def\!tfSetVrule + {\!thToksEdef\!taRuleColumnTemplate= + {\noexpand\hfil + \noexpand\startglobalTABLEcolor % added + \noexpand\vrule + \noexpand\!thWidth + \ifnum\!tgCode=\plusone + \ifx\!tgValue\empty + \the\LineThicknessFactor + \else + \!tgValue + \fi + \!taLTU + \else + \!tgValue + \fi + ####% + \noexpand\hfil + \noexpand\stopglobalTABLEcolor % added + \the\!taRuleColumnTemplate}% + \!tfAdjoinPriorColumn} + +\def\!ttShortHruleA + {\!ttGetHalfRuleThickness + \startglobalTABLEcolor % added + \leaders\hrule\!thHeight\dimen0\!thDepth\dimen0\hfill + \stopglobalTABLEcolor % added + \null + \ignorespaces} + +%D We already showed the next one, but here we slightly adapt +%D the macro by adding an \type{\expandafter}. The space after +%D \type{#1} is crucial! + +\def\normalTABLEcomplexbar#1% + {\unskip\!ttRightGlue&\omit\expandafter\!ttAlternateVrule#1 } + +%D To get rid of interfering \type{\omit}'s when we are +%D checking the number of columns and reporting problems. The +%D extensions concern the second level check, the first +%D subbranch and advancing the column. + +\ifx\mscount\undefined \newcount\mscount \fi + +\def\!ttuse#1% + {\ifnum#1>\plusone + \omit + \global\TABLEdivisionfalse + \scratchcounter\currentTABLEcolumn % added + \advance\scratchcounter #1% % added + \advance\scratchcounter \minusone % added + \ifnum\scratchcounter>\maxTABLEcolumn % added + \def\next % added + {\setTABLEerror\TABLEspanoverflow % added + \handleTABLEerror}% % added + \else % added + \def\next % added + {\global\advance\currentTABLEcolumn #1% % added + \global\advance\currentTABLEcolumn \minusone % added + \mscount#1% \mscount is in Plain + \advance\mscount \minusone + \advance\mscount \mscount + \!thLoop + \ifnum\mscount>\plusone + \spanomit \advance\mscount\minusone + \repeat + \span}% + \fi % added + \else % added + \def\next % conflicts with possible next \omit % added + {\global\advance\currentTABLEcolumn \plusone}% % added + \fi + \next} % added + +% \starttable[|c|c|c|c|] +% \HL +% \VL {test} \VL \TWO{} \VL test \VL\FR +% \DL \DC \DL\DR +% \VL {test} \VL \TWO{} \VL test \VL\LR +% \HL +% \stoptable + +%D All commands that are executed between rows are to be put in +%D \type {\noalign}. We can however not verify if we (that is +%D \TABLE) does or did not enter this mode. A moderate dirty +%D but useful trick is using our own alternative:\footnote{Once +%D one has entered the stage of redefining \TEX\ primitives, +%D such hacks become a second nature. However, redefining \type +%D {\omit} and \type{\span} is not that easy.} + +\def\TABLEnoalign + {\noalign\bgroup\let\noalign\relax\let\next=} + +%D \macros +%D {starttable} +%D +%D The rest of this module is not easy to comprehend, mainly +%D because we have to take care of: +%D +%D \startitemize[packed] +%D \item \type{\startitemize[template]} +%D \item \type{\startitemize{template}} +%D \item \type{\startitemize[predefined]} +%D \stopitemize +%D +%D as well as: +%D +%D \startitemize[continue] +%D \item restart after table break +%D \stopitemize +%D +%D The official specification of the start command is: +%D +%D \showsetup{starttable} + +\newconditional\tablerepeathead +\newconditional\tablerepeattail + +\def\starttable + {\bgroup + \doif\@@tisplit\v!auto + {\ifinsidesplitfloat\let\@@tisplit\v!yes\fi}% + \doifinsetelse\@@tisplit{\v!yes,\v!repeat} + {\def\stoptable{\stoptables\egroup}% + \starttables} + {\doifelsenothing\@@tiframe + {\ifinsidefloat\else\startbaselinecorrection\fi} + {\startframedcontent[\@@tiframe]}% + \postponenotes + \firststagestartTABLE}} + +\def\stoptable + {\chuckTABLEautorow % before the tail, else noalign problem + \insertTABLEtail + \TABLEnoalign{\globalletempty\@@TABLEhead}% + \TABLEnoalign{\globalletempty\@@TABLEtail}% + \finishTABLE + \doifelsenothing\@@tiframe + {\ifinsidefloat\else + \stopbaselinecorrection + \goodbreak % compensates all the nobreaks + \fi} + \stopframedcontent + \egroup} + +%D Before we can grab the argument, we have to make sure that +%D the \CATCODES\ are set. The first stage takes care of that. + +\def\firststagestartTABLE + {\bgroup % kan-ie weg? + \global\intabletrue + \pushouterbarandquote + %catcode`\|=\@@other + \complexorsimple\secondstagestartTABLE} + +\def\simplesecondstagestartTABLE#1% + {\complexsecondstagestartTABLE[{#1}]} + +%D \macros +%D {definetabletemplate} +%D +%D The complex (and main) start macro first takes care of the +%D predefined case. Such a predefined setup looks like: +%D +%D \starttyping +%D \definetabletemplate[test][|||] +%D +%D \starttable[test] +%D \VL test \VL test \VL\AR +%D \VL test \VL test \VL\AR +%D \VL test \VL test \VL\AR +%D \stoptable +%D \stoptyping +%D +%D The implementation of the definition macro is not that +%D complicated: + +\def\definetabletemplate % to be redone + {\bgroup + \catcode`\|=\@@other + \doquadrupleempty\dodefinetabletemplate} + +\def\dodefinetabletemplate[#1][#2][#3][#4]% + {\ifsecondargument + \setgvalue{\c!Table#1}{\douseTABLEtemplate{#2}{#3}{#4}}% + \fi + \egroup} + +\def\douseTABLEtemplate#1#2#3% + {\gdef\TABLEhead{\getvalue{@@TABLEhead#2}}% + \gdef\TABLEtail{\getvalue{@@TABLEtail#3}}% + \complexsecondstagestartTABLE[#1]} + +%D The optional third and fourth arguments define which table +%D head and tail to use. +%D +%D \starttyping +%D \definetabletemplate[test][|||][before][after] +%D \stoptyping +%D +%D This also means that one can define table heads and tails +%D by name! +%D +%D \starttyping +%D \starttablehead[before] +%D \HL \VL first \VL second \VL \SR \HL +%D \stoptablehead +%D \stoptyping +%D +%D Templates defined this way get protected names, that cannot +%D conflict with existing commands. +%D +%D \showsetup{definetabletemplate} +%D +%D The second half of the next macro prepares table +%D splitting. + +\def\insertTABLEhead + {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEhead}% + \TABLEhead + \TABLEnoalign{\global\setfalse\preventTABLEbreak}} + +\def\insertTABLEtail + {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEtail}% + \TABLEtail + \TABLEnoalign{\global\setfalse\preventTABLEbreak}} + +% \def\dorestartTABLE#1% +% {\gdef\restartTABLE{#1}% +% \restartTABLE +% \insertTABLEhead +% \ifsplittables \ifconditional \tablerepeattail +% \TABLEnoalign{\goodbreak}% +% \insertTABLEtail +% \TABLEnoalign{\goodbreak}% +% \fi \fi} + +\def\verysimpleTableHL + {\TABLEnoalign{\expandafter\normalTABLEfullrule\@@tiHLheight}} + +\def\dorestartTABLE#1% + {\gdef\restartTABLE{#1}% + \restartTABLE + \TABLEnoalign{\globalpushmacro\simpleTableHL\global\let\simpleTableHL\verysimpleTableHL}% + \insertTABLEhead + \ifsplittables \ifconditional \tablerepeattail + \TABLEnoalign{\goodbreak}% + \insertTABLEtail + \TABLEnoalign{\goodbreak}% + \fi \fi + \TABLEnoalign{\globalpopmacro\simpleTableHL}} + +\bgroup \catcode`|=\@@other \catcode`"=\@@other + +\gdef\complexsecondstagestartTABLE#1[#2]% brr nested mess + {\bgroup + \@@useotherbar + \@@useotherquote + \global\setfalse\someTABLEhead + \global\setfalse\someTABLEtail + \expanded{\doifinstringelse{|}{#2}} + {\xdef\restartTABLE{\noexpand\dorestartTABLE{\noexpand\thirdstagestartTABLE{#2}}}} + {\doifdefinedelse{\c!Table#2} + {\gdef\restartTABLE{\getvalue{\c!Table#2}}} + {\gdef\restartTABLE{\dorestartTABLE{\getvalue{#2}}}}}% + \egroup + \restartTABLE} + +\egroup + +%D The third stage involves a lot of (re)sets, which we will +%D explain later. + +%D The next definition is convenient and more in tune with +%D \CONTEXT. + +\let \everytable \EveryTable + +%D We immediately use this register: + +\appendtoks + \fixedspaces + \let\_\normalunderscore +\to \everytable + +%D Now we can start the table. + +\def\thirdstagestartTABLE#1% + {\global\setTABLEactiontrue + \setTABLEaction\TABLEunknown + \setTABLEforce\TABLEunknown + \setTABLEerror\TABLEunknown + \global\TABLEgraylinefalse + \global\TABLEgraydonefalse + \globalletempty\TABLEgrayline + \globalletempty\nextTABLEgrayline + \globalletempty\TABLEgraylineerror + \globalletempty\TABLEgraylinestatus + \resetVLvalues + \appendtoks\popouterbarandquote\to\EveryTable + \appendtoks\localTABLEsetup\to\EveryTable + \BeginTable[\ifsplittables u\else b\fi]% + \defineTABLEunits + \defineTABLEsteps + \defineTABLErules + \defineTABLEdivisions + \defineTABLEshorthands + \defineTABLEbackgrounds + \defineTABLEendings + \forgetall % added + \doifsomething{#1} + {\def\TABLEformat{#1}% + \getTABLEnofcolumns\TABLEformat + % more modern is to use catcode tables + \expandafter\BeginFormat\TABLEformat\EndFormat}} + +\def\finishTABLE + {\chuckTABLEautorow + \unskip\crcr + \EndTable + \global\intablefalse + \egroup} + +%D \macros +%D {starttables} +%D +%D Split tables are specified using the plural form of the +%D start and stop commands. +%D +%D \showsetup{starttables} +%D +%D For example: +%D +%D \starttyping +%D \starttables[|||] +%D \HL +%D \VL element \VL atom weight \VL\AR +%D \HL +%D \VL ....... \VL ........... \VL\AR +%D \VL ....... \VL ........... \VL\AR +%D \HL +%D \stoptables +%D \stoptyping + +\newbox\tablecontentbox + +\def\starttables + {\bgroup + \splittablestrue + \doifelse\@@tisplit\v!repeat + {\settrue \tablerepeathead\settrue \tablerepeattail} + {\setfalse\tablerepeathead\setfalse\tablerepeattail}% + \flushnotes + \setbox\tablecontentbox\vbox\bgroup + \forgetall + \global\TABLEinbreakfalse + \firststagestartTABLE} + +% \def\stoptables +% {\ifconditional\tablerepeattail\else\insertTABLEtail\fi +% \finishTABLE +% \egroup +% \dosplittablebox\tablecontentbox +% \flushnotes +% \egroup} + +\def\stoptables + {\chuckTABLEautorow % AM: before the tail, else noalign problem + \ifconditional\tablerepeattail\else\insertTABLEtail\fi + \finishTABLE + \egroup +\dontcomplain + \dosplittablebox\tablecontentbox + \flushnotes + \egroup} + +\newdimen\TABLEcaptionheight % obsolete + +\def\dosplittablebox#1% + {\resettsplit + \def\tsplitminimumfreelines{2}% + \def\tsplitminimumfreespace{\TABLEcaptionheight}% + \setbox\tsplitcontent\box#1% + \ifconditional\tablerepeathead \ifconditional\someTABLEhead + \setbox\tsplithead\vsplit\tsplitcontent to \lineheight + \setbox\tsplithead\vbox{\unvbox\tsplithead}% + \fi \fi + \ifconditional\tablerepeattail \ifconditional\someTABLEtail + \setbox\tsplittail\vsplit\tsplitcontent to \lineheight + \setbox\tsplittail\vbox{\unvbox\tsplittail}% + \fi \fi + \ifinsidefloat\else + \def\tsplitbeforeresult{\startbaselinecorrection}% + \def\tsplitafterresult {\stopbaselinecorrection}% + \fi + \handletsplit} + +%D When the table in the previous example is split across +%D pages, only the first gets a head. We could have said +%D something like: +%D +%D \starttyping +%D \starttablekop +%D \HL +%D \VL element \VL atom weight \VL\AR +%D \HL +%D \stoptablekop +%D +%D \starttablestaart +%D \HL +%D \stoptablestaart +%D +%D \starttables[|||] +%D \VL ....... \VL ........... \VL\AR +%D \VL ....... \VL ........... \VL\AR +%D \stoptables +%D \stoptyping +%D +%D This time each split table gets a head line and ends with +%D a rule. Keep in mind that such heads also apply to the +%D unbroken ones and should be defined local (grouped) if +%D needed. The rather complicated definition below is due to +%D the fact that the stopcondition is interface language +%D dependant. + +\let\@@TABLEhead\empty \def\TABLEhead{\@@TABLEhead} +\let\@@TABLEtail\empty \def\TABLEtail{\@@TABLEtail} + +\letvalue{\e!start\v!tablehead}=\undefined +\letvalue{\e!stop \v!tablehead}=\undefined +\letvalue{\e!start\v!tabletail}=\undefined +\letvalue{\e!stop \v!tabletail}=\undefined + +\expanded + {\def\csname\e!start\v!tablehead\endcsname##1\csname\e!stop\v!tablehead\endcsname% + {\noexpand\setTABLEhead##1\noexpand\end}} + +\expanded + {\def\csname\e!start\v!tabletail\endcsname##1\csname\e!stop\v!tabletail\endcsname% + {\noexpand\setTABLEtail##1\noexpand\end}} + +%D The second argument is a dummy one, by scanning for it, we +%D get rid of interfering spaces. + +\def\setTABLEhead{\dodoubleempty\dosetTABLEhead} +\def\setTABLEtail{\dodoubleempty\dosetTABLEtail} + +\newconditional\preventTABLEbreak +\newconditional\someTABLEhead + +\def\dosetTABLEhead[#1][#2]#3\end{\setvalue{@@TABLEhead#1}{\TABLEnoalign{\global\settrue\someTABLEhead}#3}} +\def\dosetTABLEtail[#1][#2]#3\end{\setvalue{@@TABLEtail#1}{\TABLEnoalign{\global\settrue\someTABLEtail}#3}} + +%D Redudant \type{\HL}'s are removed automatically, so +%D mid||lines can be used without problems. + +%D We need an alternative for the normal complex or simple +%D commands, because assignments in these system commands +%D conflict with \type{\noalign}. This alternative is about +%D as efficient as possible. + +\def\complexorsimpleTable#1#2% + {\csname\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#1\endcsname#2} + +%D The next one is used in \type{\VL} cum suis and honours +%D the next grouping. + +\def\docomplexorsimpleTable#1#2% + {\ifx\next\bgroup\@EA#2\else\@EA\dodocomplexorsimpleTable\@EA#1\@EA#2\fi} + +\def\dodocomplexorsimpleTable#1#2#3% + {\if[\noexpand#3\@EA#1\else\@EA#2\fi#3} + +%D The order of the next macros is more or less random. First +%D we implement error recovery. Errors are reported to the +%D screen and log file as well as visualized in the table in +%D teletype. + +\def\handleTABLEerror + {\ifTABLEgrayline \else + \ifnum\TABLEerror=\TABLEunknown \else + \setTABLEaction\TABLEunknown + \globalletempty\checkTABLEautorow + \globalletempty\chuckTABLEautorow + \fi + \ifcase\TABLEerror + % no error + \or + % \TABLEmissingrow + \tttf [missing row]% + \writestatus\m!TABLE{missing row}% + \SR + \or + % \TABLEmissingcolumn + \fillTABLEcolumns + \tttf [missing column]% + \writestatus\m!TABLE{missing column}% + \SR + \or + % \TABLEspanoverflow + \fillTABLEcolumns + \tttf [columnspan too large]% + \writestatus\m!TABLE{columnspan too large}% + \SR + \or + % \TABLEdivisionoverflow + \fillTABLEcolumns + \tttf [division line too long]% + \writestatus\m!TABLE{division line too long}% + \SR + \fi + \fi + \ifnum\TABLEerror=\TABLEunknown \else + \finishTABLErow + \fi} + +\def\finishTABLErow + {\crcr + \TABLEnoalign + {\nobreak + \setTABLEaction\TABLEunknown + \setTABLEerror\TABLEunknown + \globalletempty\checkTABLEautorow + \globalletempty\chuckTABLEautorow + \global\currentTABLEcolumn\zerocount}} + +\def\fillTABLEcolumns + {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \else + \global\advance\currentTABLEcolumn \plusone + \normalTABLEquote + \expandafter\fillTABLEcolumns + \fi} + +%D Next we enter the more complicated area of column and row +%D switching. I won't go into much detail from now on, but just +%D mention the general principles. +%D +%D \startitemize[3*ruim] +%D \sym{\type{\SR}} end a separate row (between rules) +%D \sym{\type{\FR}} end a first row (after a rule) +%D \sym{\type{\MR}} end a mid row (between text lines) +%D \sym{\type{\LR}} end a last row (before a rule) +%D \stopitemize +%D +%D and best of all: +%D +%D \startitemize[continue] +%D \sym{\type{\AR}} end a row with automatic spacing +%D \stopitemize +%D +%D As far as possible, we report confusing situations. In +%D most cases one can use \type{\AR}, which transfigurates +%D itself into one of the other types. +%D +%D \starttyping +%D \starttable[||] +%D \HL +%D \VL a separate row \VL\SR +%D \HL +%D \VL a first row \VL\FR +%D \VL a mid row \VL\MR +%D \VL a last row \VL\LR +%D \HL +%D \stoptable +%D \stoptyping +%D +%D In this example we could have used \type{\AR} without +%D problems. +%D +%D Color or gray scale backgrounds precede the content. They +%D are passed over horizontal (division) lines when needed. +%D Errors in the color template are traced elsewhere. Here we +%D only check for inconsistent spacing. Due to the way \TEX\ +%D handles alignments, we cannot automate spacing for colored +%D rows and columns. + +\chardef\TABLErowzero=0 + +\def\checkTABLErow#1% pure for message purposes + {\unskip % added + \ifTABLEgraydone + \defconvertedargument\asciia{#1}% + \defconvertedcommand \asciib\TABLEendBCL + \ifx\asciia\asciib \else + \writestatus\m!TABLE{confusing \asciia\space and \asciib}% + \gdef\TABLEgraylineerror% + {\globalletempty\TABLEgraylineerror + [\asciia\unskip<->\asciib\unskip]}% + \fi + \global\TABLEgraydonefalse + \fi} + +\def\defineTABLEendings + {\let\SR\TableSR + \let\FR\TableFR + \let\MR\TableMR + \let\LR\TableLR + \let\AR\TableAR} + +\def\TableSR + {\ifTABLEgrayline \else + \ifnum\TABLEaction=\TABLEfirstrow + \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}% + \else\ifnum\TABLEaction=\TABLEmidrow + \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}% + \else\ifnum\TABLEaction=\TABLEmidrow + \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}% + \fi\fi\fi + \fi + \checkTABLErow\SR + \endTABLErow\TABLEseparaterow\TABLErowfactor\TABLErowfactor} + +\def\TableFR + {\ifTABLEgrayline \else + \ifnum\TABLEaction=\TABLEmidrow + \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}% + \else\ifnum\TABLEaction=\TABLElastrow + \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}% + \fi\fi + \fi + \checkTABLErow\FR + \endTABLErow\TABLEfirstrow\TABLErowfactor\TABLErowzero} + +\def\TableMR + {\ifTABLEgrayline \else + \ifnum\TABLEaction=\TABLErule + \writestatus\m!TABLE{change \string\MR\space into \string\FR/\string\SR}% + \else\ifnum\TABLEaction=\TABLElastrow + \writestatus\m!TABLE{change \string\MR\space into \string\FR}% + \fi\fi + \fi + \checkTABLErow\MR + \endTABLErow\TABLEmidrow00} + +\def\TableLR + {\ifTABLEgrayline \else + \ifnum\TABLEaction=\TABLErule + \writestatus\m!TABLE{change \string\LR\space into \string\FR/\string\SR}% + \fi + \fi + \checkTABLErow\LR + \endTABLErow\TABLElastrow\TABLErowzero\TABLErowfactor} + +%D \macros +%D {ifcheckTABLEcolums} +%D +%D +%D The next macros handle the actual row ending. This macro +%D also take care of space corrections due to table splitting +%D when \type{\MR} and collegues are used. When tracing is +%D enabled, the corrections as well as the values used to +%D determine the available space are shown (in color). By default +%D checking is off. + +\newif\ifcheckTABLEcolumns + +\let\beforeTABLEline\empty +\let\afterTABLEline \empty + +\def\doendTABLErow#1#2#3% + {\handleTABLEbreak#2#3% + \beforeTABLEline + \ifcase#1\relax + % unknown + \or + \endofTABLEline[blue][\SR->\SR]\TABLErowfactor\TABLErowfactor + \or + \endofTABLEline[red][\FR->\FR]\TABLErowfactor\TABLErowzero + \or + \ifnum\TABLEforce=\TABLEforcelastrow + \endofTABLEline[red][\MR->\LR]\TABLErowzero\TABLErowfactor + \else\ifnum\TABLEforce=\TABLEforcefirstrow + \endofTABLEline[red][\MR->\FR]\TABLErowfactor\TABLErowzero + \else + \endofTABLEline[green][\MR->\MR]\TABLErowzero\TABLErowzero + \fi\fi + \or + \endofTABLEline[red][\LR->\LR]\TABLErowzero\TABLErowfactor + \fi + \TABLEnoalign + {\setTABLEforce\TABLEunknown + \global\currentTABLEcolumn\zerocount}% + \afterTABLEline} + +\def\endTABLErow#1#2#3% + {\setTABLEaction#1% + \ifTABLEgrayline + \finishTABLErow + \else + \ifnum\currentTABLEcolumn>\maxTABLEcolumn + \doendTABLErow{#1}{#2}{#3}% + \else\ifcheckTABLEcolumns + \setTABLEerror\TABLEmissingcolumn + \handleTABLEerror + \else + \doendTABLErow{#1}{#2}{#3}% + \fi\fi + \fi} + +%D Handling \type{\AR} is postponed till the next row. The +%D check takes care of the first and mid rows, the chuck macro +%D |<|how about that name|>| handles the last row. + +\def\TableAR + {\ifTABLEgraydone + \globalletempty\checkTABLEautorow + \globalletempty\chuckTABLEautorow + \global\TABLEgraydonefalse + \TABLEendBCL + \else + \globallet\checkTABLEautorow\docheckTABLEautorow + \globallet\chuckTABLEautorow\dochuckTABLEautorow + \fi} + +\let\checkTABLEautorow\empty +\let\chuckTABLEautorow\empty + +\def\docheckTABLEautorow + {\globallet\checkTABLEautorow\empty + \ifnum\TABLEaction=\TABLErule \FR + \else\ifnum\TABLEaction=\TABLEunknown \FR + \else \MR + \fi\fi} + +\def\dochuckTABLEautorow + {\globalletempty\checkTABLEautorow + \globalletempty\chuckTABLEautorow + \ifnum\TABLEaction=\TABLErule \SR + \else\ifnum\TABLEaction=\TABLEunknown \SR + \else \LR + \fi\fi} + +%D When a table is split, we also add a tail and when present +%D we repeat the table head. + +\def\handleTABLEbreak#1#2% + {\globalletempty\beforeTABLEline + \gdef\afterTABLEline{\TABLEnoalign{\ifconditional\preventTABLEbreak\nobreak\else\goodbreak\fi}}} + +%D When tables are split, the spacing before and after a +%D horizontal rule is corrected according to what we expect. + +\def\endofTABLEline[#1][#2->#3]#4#5% + {\ifx#2#3\else + \writestatus\m!TABLE{\string#2\space changed into \string#3}% + \fi + \iftracetables + \bgroup + \tttf\space + \ifnum\TABLEerror=\TABLEunknown + \ifx#2#3\else\string#2->\fi + \else + ->% + \fi + \color[#1]{\string#3}% + \ifx\TABLEgraylineerror\empty + \space\TABLEgraylinestatus + \else + \space\TABLEgraylineerror + \fi + \egroup + \else\ifx\TABLEgraylineerror\empty \else + % \bgroup + % \tttf\space\TABLEgraylineerror + % \egroup + \fi\fi + \globalletempty\TABLEgraylinestatus + \globalletempty\TABLEgraylineerror + \expandafter\normalTABLElineformat#4#5\crcr % \crcr nodig ? + \TABLEnoalign{\nobreak\global\setTABLEactiontrue}} + +%D In order to prevent (as good as possible) alignment overflow +%D and therefore \TEX\ error messages, we check the maximum +%D number of columns. We keep track of the current column and +%D maximum column by means of two \COUNTERS. Keep in mind that +%D the number of \type{|}'s and \type{\VL}'s or alike is always +%D one more than the number of columns. + +\newcount\currentTABLEcolumn +\newcount\maxTABLEcolumn + +%D While defining this macro we change the \CATCODE\ of +%D \type{|}. When counting the bars, we use a non active +%D representation of the bar, simply because we cannot be sure +%D if the bar is active or not.\footnote{Normally it is, but +%D \TABLE\ changes the catcode when needed.} + +\bgroup + \catcode`\|=\@@other \gdef\@@otherbar {|} + \catcode`\"=\@@other \gdef\@@otherquote {"} + \catcode`\|=\@@active \gdef\@@useotherbar {\let|\@@otherbar} + \catcode`\"=\@@active \gdef\@@useotherquote{\let"\@@otherquote} +\egroup + +\bgroup \catcode`\|=\@@other + +\gdef\getTABLEnofcolumns#1% + {\bgroup + \cleanupfeatures % needed ! + \@@useotherbar + \@@useotherquote + \expanded{\defconvertedargument\noexpand\ascii{#1}}% + \@EA\doglobal\@EA\counttoken\@EA|\@EA\in\ascii\to\maxTABLEcolumn + \global\advance\maxTABLEcolumn \minusone + % in case of & counting, divide by 2 + \egroup} + +\egroup + +\def\!ttDoHalign + {\edef\restoretablelineskips + {\baselineskip \the\baselineskip + \lineskiplimit\the\lineskiplimit + \lineskip \the\lineskip + \tabskip \the\tabskip}% + \baselineskip \zeropoint + \lineskiplimit\zeropoint + \lineskip \zeropoint + \tabskip \zeropoint + % does not work in normal tex + % \expanded{\getTABLEnofcolumns{\the\!taPreamble}}% added + \halign \the\!taTableSpread \bgroup + \span\the\!taPreamble + \ifx \!tfRowOfWidths \empty \else \!tfRowOfWidths \cr \fi} + +%D \startitemize[3*ruim] +%D \sym{\type{\VL}} a vertical line +%D \sym{\type{\VC}} a vertical colored line +%D \sym{\type{\HL}} a horizontal line +%D \sym{\type{\HC}} a horizontal colored line +%D \stopitemize + +% \def\defineTABLErules +% {\let\VL\TableVL +% \let\VC\TableVC +% \let\HL\TableHL +% \let\HC\TableHC} + +\def\defineTABLErules + {\let\VL\TableVL + \let\VC\TableVC + \let\HL\TableHL + \let\HC\TableHC + \let\VS\TableVS + \let\VD\TableVD + \let\VT\TableVT + \let\VN\TableVN} + +\def\TableVL + {\checkTABLEautorow + \nextTABLEgrayline + \ifnum\currentTABLEcolumn>\maxTABLEcolumn + \setTABLEerror\TABLEmissingrow + \handleTABLEerror + \else + \global\advance\currentTABLEcolumn \plusone + \expandafter\doTableVL + \fi} + +\def\doTableVL + {\futurelet\next\dodoTableVL} + +\def\dodoTableVL + {\docomplexorsimpleTable\complexTableVL\simpleTableVL} + +\def\complexTableVL[#1]% + {\scratchcounter=0#1% + \multiply\scratchcounter \@@tiVLwidth + \setxvalue{wVL\the\currentTABLEcolumn}{\the\scratchcounter}% + \simpleTableVL} + +\def\simpleTableVL + {\doifundefined{wVL\the\currentTABLEcolumn}% + {\setgvalue{wVL\the\currentTABLEcolumn}{\@@tiVLwidth}}% + \gdef\TABLEbeforebar + {\getvalue{bVL\the\currentTABLEcolumn}% + \letgvalueempty{bVL\the\currentTABLEcolumn}}% + \gdef\TABLEafterbar + {\getvalue{eVL\the\currentTABLEcolumn}% + \letgvalueempty{eVL\the\currentTABLEcolumn}}% + \edef\@@tiVLwidth{\getvalue{wVL\the\currentTABLEcolumn}}% + \expanded{\normalTABLEcomplexbar\@@tiVLwidth\space}}% \relax breaks \use + +% \starttable[|||] +% \HL +% \VL test \VS test \VL \FR +% \VL test \VD test \VL \MR +% \VL test \VT test \VL \LR +% \HL +% \stoptable + +\def\TableVS {\VN1} +\def\TableVD {\VN2} +\def\TableVT {\VN3} +\def\TableVN#1{\gdef\@VLn{#1}\VL} + +\def\resetVLvalues + {\dostepwiserecurse\zerocount\maxTABLEcolumn\plusone + {\setgvalue{wVL\recurselevel}{\@@tiVLwidth}% + \letgvalueempty{bVL\recurselevel}% + \letgvalueempty{eVL\recurselevel}}% + \global\currentTABLEcolumn\zerocount} + +\def\TableVC + {\checkTABLEautorow + \nextTABLEgrayline + \ifnum\currentTABLEcolumn>\maxTABLEcolumn + \setTABLEerror\TABLEmissingrow + \handleTABLEerror + \else + \global\advance\currentTABLEcolumn \plusone + \expandafter\doTableVC + \fi} + +\def\doTableVC + {\futurelet\next\dodoTableVC} + +\def\dodoTableVC + {\docomplexorsimpleTable\complexTableVC\simpleTableVC} + +\def\complexTableVC[#1]% + {\global\setvalue{bVC\the\currentTABLEcolumn}{\startcolor[#1]}% + \global\setvalue{eVC\the\currentTABLEcolumn}{\stopcolor}% + \simpleTableVC} + +\def\simpleTableVC + {\global\setvalue{bVL\the\currentTABLEcolumn}% + {\getvalue{bVC\the\currentTABLEcolumn}}% + \global\setvalue{eVL\the\currentTABLEcolumn}% + {\getvalue{eVC\the\currentTABLEcolumn}}% + \doTableVL} + +\def\TableHL + {\ifnum\currentTABLEcolumn>\maxTABLEcolumn + \chuckTABLEautorow + \else\ifnum\currentTABLEcolumn=\zerocount + %\chuckTABLEautorow + \TABLEnoalign + {\globalletempty\checkTABLEautorow + \globalletempty\chuckTABLEautorow}% + \else + \setTABLEerror\TABLEmissingcolumn + \handleTABLEerror + \fi\fi + \complexorsimpleTable{HL}} + +\def\complexTableHL[#1]% + {\TABLEnoalign + {\scratchcounter0#1% + \multiply\scratchcounter \@@tiHLheight + \edef\@@tiHLheight{\the\scratchcounter}% + \simpleTableHL}} + +\def\simpleTableHL + {\TABLEnoalign + {\nobreak + \ifnum\TABLEaction=\TABLErule + \writestatus\m!TABLE{skipping \string\HL}% \statusmessage + \else + \ifnum\TABLEaction=\TABLEmidrow + \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}% + \else\ifnum\TABLEaction=\TABLEfirstrow + \writestatus\m!TABLE{change \string\MR\space into \string\SR}% + \fi\fi + \startHLcommand + \expandafter\normalTABLEfullrule\@@tiHLheight + \stopHLcommand + \globalletempty\startHLcommand + \globalletempty\stopHLcommand + \accountTABLElinewidth + \fi + \setTABLEaction\TABLErule + \nobreak}} + +\let\startHLcommand\empty +\let\stopHLcommand \empty + +\def\TableHC + {\complexorsimpleTable{HC}} + +\def\complexTableHC[#1]% + {\TABLEnoalign + {\gdef\startHCcommand{\startcolor[#1]}% + \gdef\stopHCcommand {\stopcolor}}% + \simpleTableHC} + +\def\simpleTableHC + {\TABLEnoalign + {\globallet\startHLcommand\startHCcommand + \globallet\stopHLcommand \stopHCcommand}% + \HL} + +%D \startitemize[3*ruim] +%D \sym{\type{\NL}} a vertical skip +%D \sym{\type{\NR}} goto the next row +%D \sym{\type{\NC}} goto the next column +%D \sym{\type{\FC}} a first column +%D \sym{\type{\MC}} a mid column +%D \sym{\type{\LC}} a last column +%D \stopitemize + +% n+1 uitleggen + +\def\defineTABLEsteps + {\let\NL\TableNL + \let\NR\TableNR + \let\NC\TableNC + \let\FC\TableNC + \let\MC\TableNC + \let\LC\TableNC} + +\def\TableNL + {\complexorsimpleTable{NL}} + +\def\complexTableNL[#1]% + {\TABLEnoalign + {\edef\@@tiNL{#1}% + \simpleTableNL}}% + +\def\simpleTableNL + {\TABLEnoalign + {\nobreak + \setbox0\vbox{\blank[\@@tiNL]}% + \vskip\ht0 + \nobreak}} + +\def\TableNR + {\ifnum\currentTABLEcolumn>\maxTABLEcolumn + \global\currentTABLEcolumn\zerocount + \normalTABLElineending + \else + \setTABLEerror\TABLEmissingcolumn + \handleTABLEerror + \fi + \TABLEnoalign + {\nobreak + \setTABLEaction\TABLEunknown}} + +\def\TableNC + {\checkTABLEautorow + \nextTABLEgrayline + \ifnum\currentTABLEcolumn>\maxTABLEcolumn + \setTABLEerror\TABLEmissingrow + \handleTABLEerror + \else + \global\advance\currentTABLEcolumn \plusone + \normalTABLEquote + \fi} + +% \bgroup +% \catcode`\|=\@@active +% \catcode`\"=\@@active +% \gdef\redefinetablebarandquote +% {\def|{\VL}% % \normalTABLEsimplebar +% \def\|##1{\VL[##1]}% % \normalTABLEcomplexbar +% \def"{\NC}} % \normalTABLEquote +% \egroup + +\let\redefinetablebarandquote\relax + +%D \startitemize[3*ruim] +%D \sym{\type{\DL}} +%D \sym{\type{\DV}} (\type{\VD}) +%D \sym{\type{\DC}} +%D \sym{\type{\DR}} +%D \stopitemize + +\newif\ifTABLEdivision + +% \def\defineTABLEdivisions +% {\global\TABLEdivisionfalse % in start +% \let\DL\TableDL +% \let\DC\TableDC +% \let\DV\TableDV +% \let\VD\TableDV +% \let\DR\TableDR} + +\def\defineTABLEdivisions + {\global\TABLEdivisionfalse % in start + \let\DL\TableDL + \let\DC\TableDC + \let\DV\TableDV + \let\DR\TableDR} + +\def\checkTABLEdivision + {\ifTABLEdivision \else + \chuckTABLEautorow + \global\currentTABLEcolumn\zerocount + \global\TABLEdivisiontrue + \fi} + +\def\TableDL + {\checkTABLEdivision + \complexorsimpleTable{DL}} + +\def\simpleTableDL + {\complexTableDL[1]} + +\def\complexTableDL[#1]% + {\ifnum\TABLEaction=\TABLErule + \writestatus\m!TABLE{skipping \string\DL}% + \else + \ifnum\TABLEaction=\TABLEmidrow + \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}% + \else\ifnum\TABLEaction=\TABLEfirstrow + \writestatus\m!TABLE{change \string\MR\space into \string\SR}% + \fi\fi + \setTABLEaction=\TABLEunknown + \ifnum\currentTABLEcolumn>\maxTABLEcolumn + \setTABLEerror\TABLEmissingrow + \handleTABLEerror + \fi + %\startHLcommand + \ifnum#1=\plusone + \global\advance\currentTABLEcolumn \plustwo + \let\next\normalTABLEsinglerule + \else + \ifnum#1<\maxTABLEcolumn + \global\advance\currentTABLEcolumn \plusone + \def\next{\normalTABLEmultirule{#1}}% + \else + \setTABLEerror\TABLEdivisionoverflow + \let\next\handleTABLEerror + \fi + \fi + \next + %\stopHLcommand + %\globalletempty\startHLcommand + %\globalletempty\stopHLcommand + \fi} + +\def\TableDV + {\TableDCV\normalTABLEsimplebar} + +\def\TableDC + {\TableDCV\normalTABLEquote} + +\def\TableDCV#1% + {\checkTABLEdivision + \checkTABLEautorow + \ifnum\currentTABLEcolumn>\maxTABLEcolumn + \setTABLEerror\TABLEmissingrow + \handleTABLEerror + \else + \global\advance\currentTABLEcolumn \plusone + #1% + \fi} + +\def\TableDR + {\ifnum\currentTABLEcolumn<\maxTABLEcolumn % silent recovery + %\setTABLEerror\TABLEmissingcolumn % some day warning + %\handleTABLEerror + \finishTABLErow + \else + \global\currentTABLEcolumn\zerocount % nog check + \normalTABLElineending + \fi + \TABLEnoalign + {\nobreak + \global\TABLEdivisionfalse + \accountTABLElinewidth % temporary solution + \setTABLEaction\TABLErule}} + +\def\accountTABLElinewidth + {\scratchdimen\LineThicknessUnit} + +%D \startitemize[3*ruim] +%D \sym{\type{\BC}} +%D \sym{\type{\BR}} +%D \sym{\type{\BACKGROUND}} +%D \sym{\type{\CL}} +%D \sym{\type{\RL}} +%D \sym{\type{\BL}} +%D \sym{\type{\RASTER}} +%D \sym{\type{\COLOR}} +%D \stopitemize + +% definieer: \BC \BL +% herhaal: \BR +% definieer: \CL \RL (eerste \CL[green] = hele row! / \CL[1,green]) +% dus: \CL en \RL mix tussen \HL en \BL + +\def\defineTABLEbackgrounds + {\let\BC \TableBC + \let\BL \TableBL + \let\BR \TableBR + \let\BACKGROUND\TableBR + \let\CL \TableCL + \let\RL \TableRL + \let\COLOR \TableCOLOR + \let\RASTER \TableRASTER + \globallet\lastTABLEc\@@tibackgroundcolor + \globallet\lastTABLEr\@@tibackgroundscreen + \doifinsetelse\@@tibackground{c,color} % \v!color + {\global\chardef\TABLEcr\plusone} + {\global\chardef\TABLEcr\plustwo}} + +\def\TableBC + {\ifTABLEgrayline + \normalTABLEquote + \else + \TABLEnoalign\bgroup + \globallet\nextTABLEgrayline\executeTABLEgrayline + \globalletempty\TABLEgrayline % new + \let\BL\doTableBL + \let\BC\doTableBC + \expandafter\doTableBC + \fi} + +\def\doTableBC + {\addtoTABLEgrayline{\BC}% + \gobbleTableBCL} + +\def\TableBL + {\TABLEnoalign\bgroup + \globallet\nextTABLEgrayline\executeTABLEgrayline + \globalletempty\TABLEgrayline % new + \let\BL\doTableBL + \let\CL\doTableCL + \let\RL\doTableRL + \let\BC\doTableBC + \doTableBL} + +\def\doTableBL + {\complexorsimpleTable{BL}} + +\def\simpleTableBL + {\complexTableBL[,]} + +\def\complexTableBL[#1]% + {\analyzeTABLEcr[#1]% + \handleTABLEcr} + +\def\TableBR#1% + {\TABLEnoalign + {\globallet\nextTABLEgrayline\executeTABLEgrayline + \checkTABLEgrayline#1\BR + \global\TABLEgraylinetrue}} + +\def\analyzeTABLEcr[#1]% + {\doanalyzeTABLEcr[#1,,]} + +\def\doanalyzeTABLEcr[#1,#2,#3]% + {\doifnumberelse{#1x} % Is the x still needed here? + {\dodoanalyzeTABLEcr[#1,#2,#3]} + {\dodoanalyzeTABLEcr[1,#1,#2]}} + +\def\dodoanalyzeTABLEcr[#1,#2,#3]% + {\global\chardef\TABLEn#1\relax + \processaction + [#2] + [ c=>\global\chardef\TABLEcr1,% + color=>\global\chardef\TABLEcr1,% + r=>\global\chardef\TABLEcr2,% + raster=>\global\chardef\TABLEcr2]% + \ifcase\TABLEcr \or + \doifsomething{#3}{\xdef\lastTABLEc{#3}}% + \or + \doifsomething{#3}{\xdef\lastTABLEr{#3}}% + \fi} + +\def\handleTABLEcr + {\relax % else funny side effect + \ifcase\TABLEcr + % Can't happen! + \or + \addtoTABLEgrayline{\complexTableCOLOR[\the\TABLEn,\lastTABLEc]}% + \else + \addtoTABLEgrayline{\complexTableRASTER[\the\TABLEn,\lastTABLEr]}% + \fi + \gobbleTableBCL} + +\def\analyzeTABLEcrl#1[#2]% + {\doanalyzeTABLEcrl#1[#2,,]} + +\def\doanalyzeTABLEcrl#1[#2,#3,#4]% + {\doifnumberelse{#2x} % x ???????????????????? + {\dodoanalyzeTABLEcr[#2,#1,#3]} + {\dodoanalyzeTABLEcr[\ifTABLEgrayline1\else\maxTABLEcolumn\fi,#1,#2]}} + +\def\TableCL + {\TABLEnoalign\bgroup + \globallet\nextTABLEgrayline\executeTABLEgrayline + \globalletempty\TABLEgrayline % new + \let\BL\doTableBL + \let\CL\doTableCL + \let\RL\doTableRL + \let\BC\doTableBC + \doTableCL} + +\def\doTableCL + {\complexorsimpleTable{CL}} + +\def\simpleTableCL% nog eens \'e\'en lijn van maken + {\BL[\the\maxTABLEcolumn,c,\lastTABLEc]} + +\def\complexTableCL[#1]% + {\analyzeTABLEcrl{c}[#1]% + \handleTABLEcr} + +\def\TableRL + {\TABLEnoalign\bgroup + \globallet\nextTABLEgrayline\executeTABLEgrayline + \globalletempty\TABLEgrayline % new + \let\BL\doTableBL + \let\CL\doTableCL + \let\RL\doTableRL + \let\BC\doTableBC + \doTableRL} + +\def\doTableRL + {\complexorsimpleTable{RL}} + +\def\simpleTableRL + {\BL[\the\maxTABLEcolumn,r,\lastTABLEr]} + +\def\complexTableRL[#1]% + {\analyzeTABLEcrl{r}[#1]% + \handleTABLEcr} + +\def\checkTABLEgrayline#1#2% + {\!!doneatrue + \ifx#1\AR + \!!doneafalse + \else\ifx#1\SR\else\ifx#1\FR\else\ifx#1\MR\else\ifx#1\LR\else + \!!doneafalse + \fi\fi\fi\fi\fi + \if!!donea + \gdef\TABLEgraylinestatus + {[\string#1]}% + \gdef\TABLEendBCL + {#1}% + \else + \gdef\TABLEgraylineerror + {[\string#2\string#1->\string#2\string\SR]}% + \gdef\TABLEendBCL + {\SR}% + \fi} + +\def\endTABLErowGL#1#2#3% + {\ifcase#1\relax + % unknown + \or + \doPreTableGL\TABLErowfactor\TABLErowfactor + \or + \doPreTableGL\TABLErowfactor\TABLErowzero + \or + \ifnum\TABLEforce=\TABLEforcelastrow + \doPreTableGL\TABLErowzero\TABLErowfactor + \else\ifnum\TABLEforce=\TABLEforcefirstrow + \doPreTableGL\TABLErowfactor\TABLErowzero + \else + \doPreTableGL\TABLErowzero\TABLErowzero + \fi\fi + \or + \doPreTableGL\TABLErowzero\TABLErowfactor + \fi} + +\def\doPreTableGL#1#2% betere namen + {\xdef\OldLineThicknessFactor{\the\LineThicknessFactor}% + \xdef\OldLineThicknessUnit{\the\LineThicknessUnit}% + \global\LineThicknessFactor\plusone + \setbox0\hbox{\AugmentedTableStrut{#1}{#2}}% + \getboxheight\dimen0\of\box0\relax + \xdef\TABLEgraylineHeight{\the\dimen0}% + \global\LineThicknessUnit\TABLEgraylineHeight} + +\def\doPostTableGL + {\global\LineThicknessFactor\OldLineThicknessFactor + \global\LineThicknessUnit \OldLineThicknessUnit} + +% kan simpeler + +\def\docomplexTableCOLOR[#1]% + {\dodocomplexTableGL\startcolor \stopcolor [#1,\lastTABLEc,,]} + +\gdef\docomplexTableRASTER[#1]% + {\dodocomplexTableGL\startraster\stopraster[#1,\lastTABLEr,,]} + +\def\dodocomplexTableGL#1#2[#3,#4,#5,#6]% + {\doifelsenothing{#4}{#1[#5]}{#1[#4]}% + \doPreTableGL\TABLEendofrowheight\TABLEendofrowdepth + \ifnum#3=\plusone % else conflict with \omit in \= + \let\next\normalTABLEsinglerule + \else + \def\next{\normalTABLEmultirule{#3}}% + \fi + \next + \doPostTableGL + #2} + +\def\TableBACKGROUND + {\TableBR} + +\def\simpleTableRASTER #1{\docomplexTableRASTER[1]#1} +\def\complexTableRASTER[#1]{\docomplexTableRASTER[#1]} +\def\simpleTableCOLOR {\docomplexTableCOLOR [1]} +\def\complexTableCOLOR [#1]{\docomplexTableCOLOR [#1]} + +\def\TableRASTER{\complexorsimpleTable{RASTER}} +\def\TableCOLOR {\complexorsimpleTable{COLOR}} + +\def\addtoTABLEgrayline#1% + {\TABLEgraytoks\expandafter{\TABLEgrayline}% + \xdef\TABLEgrayline{\the\TABLEgraytoks\noexpand#1}} + +\def\setTableBCL#1#2% + {\ifx#1#2% + \gdef\TABLEgraylinestatus{[\string#1]}% + \gdef\TABLEendBCL{#1}% + \addtoTABLEgrayline{#1}% + \else + \gdef\TABLEgraylineerror{[\string#1->\string#2]}% + \gdef\TABLEendBCL{#2}% + \addtoTABLEgrayline{#2}% + \fi} + +\def\gobbleTableBCL#1% + {\ifx#1\BC \let\next\doTableBC \else + \ifx#1\BL \let\next\doTableBL \else + \ifx#1\SR \setTableBCL\SR\SR \let\next\egroup \else + \ifx#1\FR \setTableBCL\FR\FR \let\next\egroup \else + \ifx#1\MR \setTableBCL\MR\MR \let\next\egroup \else + \ifx#1\LR \setTableBCL\LR\LR \let\next\egroup \else + \setTableBCL #1\SR \let\next\egroup + \fi\fi\fi\fi\fi\fi + \next} + +\def\executeTABLEgrayline + {\TABLEnoalign + {\def\BC + {\advance\currentTABLEcolumn \plusone}% + \def\dodocomplexTableGL##1##2[##3,##4,##5,##6]% + {\BC\advance\currentTABLEcolumn ##3 }% + \let\endTABLErow\endTABLEgrayrow + \currentTABLEcolumn\zerocount + \TABLEgrayline\TABLEendBCL % determine n of columns and height + \advance\currentTABLEcolumn \minusone + \ifnum\currentTABLEcolumn>\maxTABLEcolumn + % error message too long line + \globalletempty\TABLEgrayline + \else + % \message{n of color columns: \the\currentTABLEcolumn}\wait + \global\TABLEgraylinetrue % vanaf hier nog checken + \fi + \global\currentTABLEcolumn\zerocount}% + \unskip\TABLEgrayline\TABLEendBCL + \TABLEnoalign + {\nobreak + \vskip-\TABLEgraylineHeight + \nobreak + \global\setTABLEactiontrue + \global\currentTABLEcolumn\zerocount + \globalletempty\nextTABLEgrayline + \global\TABLEgraydonetrue + \global\TABLEgraylinefalse}} + +\def\endTABLEgrayrow#1#2#3% + {\ifcase#1\relax + \global\chardef\TABLEendofrowheight\TABLErowfactor + \global\chardef\TABLEendofrowdepth \TABLErowfactor + \or + \global\chardef\TABLEendofrowheight\TABLErowfactor + \global\chardef\TABLEendofrowdepth \TABLErowfactor + \or + \global\chardef\TABLEendofrowheight\TABLErowfactor + \global\chardef\TABLEendofrowdepth \TABLErowzero + \or + \ifnum\TABLEforce=\TABLEforcelastrow + \global\chardef\TABLEendofrowheight\TABLErowzero + \global\chardef\TABLEendofrowdepth \TABLErowfactor + \else\ifnum\TABLEforce=\TABLEforcefirstrow + \global\chardef\TABLEendofrowheight\TABLErowfactor + \global\chardef\TABLEendofrowdepth \TABLErowzero + \else + \global\chardef\TABLEendofrowheight\TABLErowzero + \global\chardef\TABLEendofrowdepth \TABLErowzero + \fi\fi + \or + \global\chardef\TABLEendofrowheight\TABLErowzero + \global\chardef\TABLEendofrowdepth \TABLErowfactor + \fi} + +\def\defineTABLEshorthands% + {\def\SPAN##1{\use{##1}}% + \def\TWO {\use2}% + \def\THREE {\use3}% + \def\FOUR {\use4}% + \def\FIVE {\use5}% + \def\SIX {\use6}% + \def\REF {\ReFormat}} + +\def\defineTABLEunits + {\processaction + [\@@tidistance] + [ \v!none=>\OpenUp00\def\LOW{\Lower6 }, + \v!small=>\OpenUp00\def\LOW{\Lower6 }, % == baseline + \v!medium=>\OpenUp11\def\LOW{\Lower7 }, + \v!big=>\OpenUp22\def\LOW{\Lower8 }]% + \doifelse\@@tidistance\v!none + {\chardef\TABLErowfactor\zerocount} + {\chardef\TABLErowfactor\plustwo }} + +\def\dohandlebar % here ? + {\ifmmode + \@EA\domathmodebar + \else\ifintable + \@EAEAEA\domathmodebar + \else + \@EAEAEA\dotextmodebar + \fi\fi} + +% De macro's t.b.v. instellingen. + +\def\setuptables + {\dosingleargument\dosetuptables} + +\def\dosetuptables[#1]% + {\getparameters[\??ti][#1]% + \processaction + [\@@tialign] + [ \v!right=>\def\TABLEparalignment{\raggedright}, + \v!left=>\def\TABLEparalignment{\raggedleft}, + \v!middle=>\def\TABLEparalignment{\raggedcenter}, + \s!default=>\def\TABLEparalignment{\notragged}, + \s!unknown=>\def\TABLEparalignment{\notragged}]% + \assignalfadimension\@@tiVL\@@tiVLwidth 246% + \assignalfadimension\@@tiHL\@@tiHLheight246} + +\def\localTABLEsetup + {\@@ticommands\relax + \expanded{\switchtobodyfont[\@@tibodyfont]}% + \StrutHeightFactor 8 + \StrutDepthFactor 4 + \LineThicknessFactor4 + \NormalTLTU {.1pt}% + \NormalTSU {\normalbaselineskip\divide\StrutUnit 12 }% + \NormalTableUnits} + +%D And then I wrote the tabulate environment. That +%D alternative supports setting the rule thickness and color, +%D so here is the table alternative. + +\let\startglobalTABLEcolor\empty +\let\stopglobalTABLEcolor \empty + +\def\localTABLEsetup + {\@@ticommands\relax + % bodyfont + \expanded{\switchtobodyfont[\@@tibodyfont]}% + % linecolor + \doifsomething\@@tirulecolor + {\def\startglobalTABLEcolor{\startcolor[\@@tirulecolor]}% + \def\stopglobalTABLEcolor {\stopcolor}}% + % linethickness + \LineThicknessFactor4 + \scratchdimen\@@tirulethickness + \divide\scratchdimen \LineThicknessFactor + \expanded{\NormalTLTU{\the\scratchdimen}}% + % spacing, was depth=4 height=8 (counters, sigh, now macros) + \doifelse\@@tiheight\v!strut + {\let\StrutHeightFactor\@@itheight} + {\let\StrutHeightFactor\@@tiheight}% + \doifelse\@@tidepth\v!strut + {\let\StrutDepthFactor\@@itdepth} + {\let\StrutDepthFactor\@@tidepth}% + \scratchdimen\StrutHeightFactor\points \multiply\scratchdimen 10% + \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}% + \scratchdimen\StrutDepthFactor \points \multiply\scratchdimen 10% + \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}% + % units + \NormalTSU{\normalbaselineskip\divide\StrutUnit 12 }% + \NormalTableUnits} + +\def\OpenUp#1#2% + {\scratchdimen\StrutHeightFactor \points \advance\scratchdimen #1\points + \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}% + \scratchdimen\StrutDepthFactor \points \advance\scratchdimen #2\points + \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}} + +%D As one can see, we didn't only add color, but also more +%D control over spacing. +%D +%D \startbuffer[a] +%D \starttable[|c|] +%D \HL +%D \VL \strut test \VL \FR +%D \VL \strut test \VL \MR +%D \VL \strut test \VL \MR +%D \VL \strut test \VL \LR +%D \HL +%D \stoptable +%D \stopbuffer +%D +%D \startbuffer[b] +%D \starttabulate[|c|] +%D \HL +%D \NC test \NC \NR +%D \NC test \NC \NR +%D \NC test \NC \NR +%D \NC test \NC \NR +%D \HL +%D \stoptabulate +%D \stopbuffer +%D +%D In the next example, the first table is defined as: +%D +%D \typebuffer[a] +%D +%D and the second one as: +%D +%D \typebuffer[b] +%D +%D The first table is typeset using the default height and +%D depth factors .8 and .4. The second table has both factors +%D set to \type {strut}, and the third table shows what +%D happens when we set the values to zero. The rightmost table +%D is typeset using the tabulate environment. +%D +%D \startcombination[4*1] +%D {$\vcenter{\getbuffer[a]}$} +%D {\hbox{h=.8 d=.4}} +%D {\setuptables[height=strut,depth=strut]$\vcenter{\getbuffer[a]}$} +%D {\hbox{h=d=\type{strut}}} +%D {\setuptables[height=0,depth=0]$\vcenter{\getbuffer[a]}$} +%D {\hbox{h=d=0}} +%D {$\vcenter{\getbuffer[b]}$} +%D {\hbox{tabulate}} +%D \stopcombination + +\setuptables + [HL=\v!medium, + VL=\v!medium, + NL=\v!small, + \c!frame=, + \c!align=\v!right, + \c!depth=.40, % \v!strut + \c!height=.80, % \v!strut + \c!rulethickness=\linewidth, + \c!rulecolor=, + \c!distance=\v!medium, + \c!bodyfont=\the\bodyfontsize, + \c!commands=, + \c!background=\v!screen, + \c!backgroundscreen=\@@rsscreen, + \c!backgroundcolor=, + \c!split=\v!auto] + +\def\ifintabel{\ifintable} % upward compatible + +\protect \endinput diff --git a/tex/context/base/tabl-tbl.tex b/tex/context/base/tabl-tbl.mkii index 15e827e68..15e827e68 100644 --- a/tex/context/base/tabl-tbl.tex +++ b/tex/context/base/tabl-tbl.mkii diff --git a/tex/context/base/tabl-tbl.mkiv b/tex/context/base/tabl-tbl.mkiv new file mode 100644 index 000000000..af2b50c86 --- /dev/null +++ b/tex/context/base/tabl-tbl.mkiv @@ -0,0 +1,1472 @@ +%D \module +%D [ file=core-tbl, +%D version=1998.11.03, +%D title=\CONTEXT\ Table Macros, +%D subtitle=Text Flow Tabulation, +%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 Table Macros / Tabulation} + +% \processbetween gebruiken in head/tail macros + +\unprotect + +%D I can probably reimplement this using a \LUA||\TEX\ combination +%D but it does not pay of in development time. If I need something +%D else I will write it from scratch anyway. + +% watch out: don't change this model else trialtypesetting +% compatibility problems + +% watch out, cells expand pretty late on a per row basis + +% |p2|p3| 2:3 +% spanning + +% Be careful with changing the hsize calculation in p mode; +% the following code works quite well: +% +% \setupfield [line][location=low,height=1.2\lineheight,width=\hsize] +% \definefield [test] [line] [line] [] +% +% \starttabulate[|l|p|] +% \NC test \NC \field [test] \NC \NR +% \stoptabulate + +% In-text tabbing environment +% +% \starttabulate[| separated template] % eg [|l|p|] or [|l|p|p|] +% \NC ... \NC ... \NC\NR +% \stoptabulate +% +% with: two pass auto width calculation when no p-width +% specified, even with multiple p's, see examples. + +% TaBlE compatible specifications: +% +% l align column/paragraph left +% r align column/paragraph right +% c align column/paragraph center +% p p(dimen) of automatisch als alleen p +% w column width +% f font#1 +% B bold +% I italic +% S slanted +% T type +% R roman +% m math +% M display math +% h hook (inner level or par lines) +% b before (may be command#1) +% a after +% i i<n> skip left of column +% j i<n> skip right of column +% k i<n> skip around column + +% s setups + +% g g{char} align at char +% . align at . +% , align at , + +% Still to be done + +% N math numbers (best hook into existing digits mechanism) +% n numbers (best hook into existing digits mechanism) +% Q math numbers (best hook into existing digits mechanism) +% q numbers (best hook into existing digits mechanism) +% ~ \hskip.5em +% | check + +% nesting + +% 10 evt auto stack; dan wel andere signal dan void nodig + +% present but not yet 100% ok +% +% \FL top hrule +% \ML mid hrule (with auto split) +% \LL bottom hrule +% \HL + +% \VL as soon as needed +% color as soon as needed + +% \EQ \RQ \HQ equal (raw, hook) +% \NC \RC \HC normal (raw, hook) +% +% \NR + +% \HR : rule with lineheight + +% \autotabulaterule : with lineheight, not first/last +% \autotabulateline : spaced, not first/last +% \tabulaterule : with lineheight +% \tabulateline : spaced + +% tricky: align scans ahead, over # and expands ones before +% while doing + +% new: +% +% \starttabulate[|cg{.}|cg{,}|cg{,}|] +% \NC period \NC comma \NC comma \NC\NR +% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR +% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR +% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR +% \NG 10 \NG 10 \NG 0,00 \NC\NR +% \stoptabulate +% +% \starttabulate[|c.|c,|c,|] +% \NC period \NC comma \NC comma \NC\NR +% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR +% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR +% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR +% \NG 10 \NG 10 \NG 0,00 \NC\NR +% \stoptabulate + +% nice demo (for BG) +% +% \starttabulate[|r|b{$\star$}|ra{\percent}|b{=}|r|] +% \NC 500 \NC \NC 60 \NC \NC 300 \NC \NR +% \NC 500 \NC \NC 55 \NC \NC 275 \NC \NR +% \NC 500 \NC \NC 50 \NC \NC 250 \NC \NR +% \NC 500 \NC \NC 45 \NC \NC 225 \NC \NR +% \NC 500 \NC \NC 40 \NC \NC 200 \NC \NR +% \NC 500 \NC \NC 35 \NC \NC 175 \NC \NR +% \NC 500 \NC \NC 30 \NC \NC 150 \NC \NR +% \NC 500 \NC \NC 25 \NC \NC 125 \NC \NR +% \NC 500 \NC \NC 20 \NC \NC 100 \NC \NR +% \stoptabulate + +\newtoks \tabulatepreamble +\newtoks \tabulatebefore +\newtoks \tabulateafter +\newtoks \tabulatebmath +\newtoks \tabulateemath +\newtoks \tabulatefont +\newtoks \tabulatesettings +\newtoks \tabulatedummy + +\newcount \nofautotabulate +\newcount \tabulatecolumns +\newcount \tabulatecolumn + +\newcount \tabulateminplines +\newcount \tabulatemaxplines + +\newif \ifautotabulate +\newif \ifsplittabulate \splittabulatetrue + +\newif \ifhandletabulatepbreak \handletabulatepbreaktrue +\newif \iftabulatenopbreak \tabulatenopbreakfalse + +\newif \iftabulateequal +\newif \iftracetabulate +\newif \ifframedtabulate + +\newdimen \tabulatepwidth +\newdimen \tabulatewidth +\newdimen \tabulateunit +\newdimen \tabulatemaxpheight + +\newbox \tabulatebox + +% [|lg{.}|] => \NG 12.34 \NC + +\gdef\handletabulatecharalign#1 % space delimited ! + {\edef\alignmentclass{\the\tabulatecolumn}% + \edef\alignmentcharacter{\csname\??tt:a:\the\tabulatecolumn\endcsname}% + \ifcase\tabulatepass\or + \setfirstpasscharacteralign\checkalignment{#1}% + \fi % force hsize + \setsecondpasscharacteralign\checkalignment{#1}} + +\def\noftabcolumns{16} + +\def\tablebox#1% + {\csname\??tt:b:\number#1\endcsname} + +\def\initializetablebox#1% also used elsewhere + {\ifcsname\??tt:b:\number#1\endcsname + \global\setbox\csname\??tt:b:\number#1\endcsname\emptybox + \else + \expandafter\newbox\csname\??tt:b:\number#1\endcsname + \fi} + +\def\initializetableboxes#1% + {\scratchcounter#1\relax + \doinitializetableboxes} + +\def\doinitializetableboxes + {\ifnum\scratchcounter>\zerocount + \initializetablebox\scratchcounter + \advance\scratchcounter\minusone + \expandafter\doinitializetableboxes + \fi} + +\initializetableboxes\noftabcolumns + +\def\dodotabulatenobreak + {\nobreak + \iftracetabulate + \red\hrule\!!height.5\linewidth\!!depth.5\linewidth + \par + \kern-\linewidth + \nobreak + \fi} + +\def\dotabulatenobreak + {\noalign{\dodotabulatenobreak}} + +\unexpanded\def\notabulatehook + {} + +\unexpanded\def\checktabulatehook + {\ifnum\tabulatetype<\plustwo + \glet\tabulatehook\notabulatehook + \else + \glet\tabulatehook\dotabulatehook + \fi} + +\unexpanded\def\checktabulatesetups + {\csname\??tt:s:\the\tabulatecolumn\endcsname} + +\let\pretabrule \donothing +\let\posttabrule\donothing + +% 0 = NC column next EQ equal column +% 1 = RC column raw RQ equal column raw +% 2 = HC column hook HQ equal column hook +% some entries can be left out if we test for them being set + +% \def\dodosettabulatepreamble#1#2% +% {\ifzeropt\tabulatewidth +% \ifcase\tabulatemodus\relax +% \let\preamblebox\empty +% \else +% \def\preamblebox{\autotabulatetrue}% +% \fi +% \else +% \ifcase\tabulatemodus\relax +% \edef\preamblebox{\hbox to \the\tabulatewidth}% +% \else +% \edef\preamblebox{\hsize\the\tabulatewidth}% +% \fi +% \fi +% % +% % less bytes +% % +% %\edef\preamblebox% +% % {\ifcase\tabulatewidth +% % \ifcase\tabulatemodus\relax\else\noexpand\autotabulatetrue\fi +% % \els +% % \ifcase\tabulatemodus\relax\hbox to\else\hsize\fi\the\tabulatewidth +% % \fi}% +% % +% \@EA\appendtoks \@EA&\@EA\hskip\pretabskip\pretabrule##&\to\!!toksa +% \appendtoks \ignorespaces\to\!!toksa +% \@EA\appendtoks\@EA\global\@EA\tabulatecolumn\the\tabulatecolumns\relax\to\!!toksa +% \appendtoks \checktabulatesetups\to\!!toksa +% \appendtoks \checktabulatehook\to\!!toksa +% \@EA\appendtoks \preamblebox\to\!!toksa +% \appendtoks \bgroup\bbskip\bgroup#1\to\!!toksa +% \appendtoks\ifnum\tabulatetype=\plusone \else \to\!!toksa +% \@EA\appendtoks \the\tabulatebmath\to\!!toksa +% \@EA\appendtoks \the\tabulatefont\to\!!toksa +% \@EA\appendtoks \the\tabulatesettings\to\!!toksa +% \@EA\appendtoks \the\tabulatebefore\to\!!toksa +% \appendtoks\fi \to\!!toksa +% \appendtoks \bgroup\ignorespaces\to\!!toksa +% % +% \appendtoks \tabulatehook##\to\!!toksa +% % +% %%\doifdefinedelse{\??tt:a:\tabulatecolumns} +% %\doifdefinedelse{\??tt:a:\the\tabulatecolumns} +% % {\appendtoks\handletabulatecharalign## \to\!!toksa} +% % {\appendtoks\tabulatehook ##\to \!!toksa}% +% % waarom kan ik hier geen \xx{##} geven, om een of +% % andere reden passeert dan tex de hele regel (incl \NC's) +% % als argument; elke delimiter <> space gaat trouwens fout +% \appendtoks \unskip\unskip\ifmmode\else\endgraf\fi\egroup\to\!!toksa +% \appendtoks\ifnum\tabulatetype=1 \else \to\!!toksa +% \@EA\appendtoks \the\tabulateafter\to\!!toksa +% \@EA\appendtoks \the\tabulateemath\to\!!toksa +% \appendtoks\fi \to\!!toksa +% \appendtoks #2\egroup\egroup\to\!!toksa +% \@EA\appendtoks \@EA&\@EA\posttabrule\@EA\hskip\postabskip##\to\!!toksa +% \appendtoks\NC\to\tabulatedummy +% \let\bbskip\empty +% \def\pretabskip{.5\tabulateunit}% +% \let\postabskip\pretabskip +% \let\gettabulateexit\dogettabulateexit +% \tabulatewidth\zeropoint} +% +% speedup: + +% is grouping really needed here? + +\unexpanded\def\beforetabulateentry{\ignorespaces\tabulatehook} +\unexpanded\def\aftertabulateentry {\unskip\unskip\ifmmode\else\endgraf\fi} + +\def\dodosettabulatepreamble#1#2% only makes sense for many tabulates + {\normalexpanded{\!!toksa{\the\!!toksa + &\hskip\pretabskip\noexpand\pretabrule##&% + % \ignorespaces + \global\tabulatecolumn\the\tabulatecolumns\relax + \checktabulatesetups % unexpandable + \checktabulatehook % unexpandable + \ifzeropt\tabulatewidth + \ifcase\tabulatemodus\else + \noexpand\autotabulatetrue + \fi + \else + \ifnum\tabulatemodus=\zeropoint + \hbox to + \else + \hsize + \fi + \the\tabulatewidth + \fi + \bgroup + \noexpand\bbskip + \bgroup % we cannot combine the if because a cell may have only one ## + \noexpand#1% + \noexpand\ifnum\noexpand\tabulatetype=\plusone\noexpand\else + \the\tabulatebmath + \the\tabulatefont + \the\tabulatesettings + \the\tabulatebefore + \noexpand\fi + % grouping needs to be outside macros (or expandable), nice test + % example \NC \string & \NC which will fail otherwise (mk) + \bgroup + \beforetabulateentry + ##% + \aftertabulateentry + \egroup + \noexpand\ifnum\noexpand\tabulatetype=\plusone\noexpand\else + \the\tabulateafter + \the\tabulateemath + \noexpand\fi + \noexpand#2% + \egroup + \egroup + &\noexpand\posttabrule\hskip\postabskip##% + }}% + \appendtoks\NC\to\tabulatedummy + \let\bbskip\empty % ? + \def\pretabskip{.5\tabulateunit}% + \let\postabskip\pretabskip + \let\gettabulateexit\dogettabulateexit + \tabulatewidth\zeropoint} + +\setvalue{\??tt>\meaning x}{\let\tabulatealign\zerocount\settabulatepreamble} % internal +\setvalue{\??tt>\meaning l}{\let\tabulatealign\plusone\settabulatepreamble} +\setvalue{\??tt>\meaning r}{\let\tabulatealign\plustwo\settabulatepreamble} +\setvalue{\??tt>\meaning c}{\let\tabulatealign\plusthree\settabulatepreamble} +\setvalue{\??tt>\meaning p}{\gettabulateparagraph} +\setvalue{\??tt>\meaning s}{\gettabulatesetups} +\setvalue{\??tt>\meaning w}{\gettabulatewidth} +\setvalue{\??tt>\meaning f}{\gettabulatefont} +\setvalue{\??tt>\meaning B}{\tabulatefont{\bf}\settabulatepreamble} +\setvalue{\??tt>\meaning I}{\tabulatefont{\it}\settabulatepreamble} +\setvalue{\??tt>\meaning S}{\tabulatefont{\sl}\settabulatepreamble} +\setvalue{\??tt>\meaning T}{\tabulatefont{\tt}\settabulatepreamble} +\setvalue{\??tt>\meaning R}{\tabulatefont{\rm}\settabulatepreamble} +\setvalue{\??tt>\meaning m}{\tabulatebmath{$}\tabulateemath{$}\settabulatepreamble} +\setvalue{\??tt>\meaning M}{\tabulatebmath{$\displaystyle}\tabulateemath{$}\settabulatepreamble} +\setvalue{\??tt>\meaning h}{\gettabulatehook} +\setvalue{\??tt>\meaning b}{\gettabulatebefore} +\setvalue{\??tt>\meaning a}{\gettabulateafter} +\setvalue{\??tt>\meaning i}{\gettabulatepreskip} +\setvalue{\??tt>\meaning j}{\gettabulateposskip} +\setvalue{\??tt>\meaning k}{\gettabulatepreposskip} +\setvalue{\??tt>\meaning X}{\gettabulateexit} % internal +\setvalue{\??tt>\meaning e}{\appendtoks\global\tabulateequaltrue\to\tabulatesettings\settabulatepreamble} +\setvalue{\??tt>\meaning ~}{\appendtoks\fixedspaces\to\tabulatesettings\settabulatepreamble} +\setvalue{\??tt>\meaning g}{\gettabulatealign} +\setvalue{\??tt>\meaning .}{\gettabulatealign.} +\setvalue{\??tt>\meaning ,}{\gettabulatealign,} + +\setvalue{\??tt>\s!unknown}{\message{unknown preamble key [\meaning\next]}\settabulatepreamble} +\letvalue{\??tt>\meaning\relax}\donothing + +\def\dosettabulatepreamble + {\csname\??tt>\ifcsname\??tt>\meaning\next\endcsname\meaning\next\else\s!unknown\fi\endcsname} + +\def\dogettabulateexit + {\let\postabskip\!!zeropoint + \settabulatepreamble} + +\let\gettabulateexit\dogettabulateexit + +\def\gettabulatepreskip#1% + {\doifnumberelse{#1} + {\edef\pretabskip{\the\dimenexpr#1\tabulateunit}\let\next\empty} + {\edef\pretabskip{\the\dimenexpr.5\tabulateunit}\def\next{#1}}% + \@EA\settabulatepreamble\next} + +\def\gettabulateposskip#1% + {\doifnumberelse{#1} + {\edef\postabskip{\the\dimexpr#1\tabulateunit}\let\next\empty} + {\edef\postabskip{\the\dimexpr.5\tabulateunit}\def\next{#1}}% + \let\gettabulateexit\settabulatepreamble + \@EA\settabulatepreamble\next} + +\def\gettabulatepreposskip#1% + {\doifnumberelse{#1} + {\edef\pretabskip{\the\dimenexpr#1\tabulateunit}\let\next\empty} + {\edef\pretabskip{\the\dimenexpr.5\tabulateunit}\def\next{#1}}% + \let\postabskip\pretabskip + \let\gettabulateexit\settabulatepreamble + \@EA\settabulatepreamble\next} + +\def\gettabulatesetups#1% + {\setvalue{\??tt:s:\the\tabulatecolumns}{\setups[#1]}% + \settabulatepreamble} + +\def\gettabulatehook#1% + {\setvalue{\??tt:h:\the\tabulatecolumns}{#1}% + \settabulatepreamble} + +\def\gettabulatealign#1% + {\setvalue{\??tt:a:\the\tabulatecolumns}{#1}% + \settabulatepreamble} + +\def\gettabulatebefore#1% + {\tabulatebefore{#1}% + \settabulatepreamble} + +\def\gettabulateafter#1% + {\tabulateafter{#1}% + \settabulatepreamble} + +\def\gettabulatefont#1% + {\tabulatefont{#1}% + \settabulatepreamble} + +\def\gettabulatewidth + {\let\tabulatemodus\zerocount + \let\tabulatedimen\zerocount + \doifnextparenthesiselse\dogettabulatewidth\settabulatepreamble} + +\def\gettabulateparagraph + {\doifnextparenthesiselse + {\let\tabulatemodus\plusone + \let\tabulatedimen\plusone + \dogettabulatewidth} + {\let\tabulatemodus\plustwo + \let\tabulatedimen\zerocount + \settabulatepreamble}} + +% \startbuffer +% \toplinebox{\framed[width=3cm,height=2cm]{tufte}} +% \stopbuffer +% \starttabulate[|p(fixed)|p|] +% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR} +% \stoptabulate +% \starttabulate[|p(fit)|p|] +% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR} +% \stoptabulate + +\def\dogettabulatewidth(#1)% + {\processallactionsinset % can be made faster + [#1]% + [ \v!fit=>\let\tabulatemodus\plusthree, + \v!fixed=>\let\tabulatemodus\plusthree + \tabulatenopbreaktrue, + \s!unknown=>\tabulatewidth#1\relax]% + \ifnum\tabulatedimen=\plusone + \global\advance\tabulatepwidth\tabulatewidth + \fi + \settabulatepreamble} + +\def\settabulatepreamble + {\afterassignment\dosettabulatepreamble\let\next=} + +\def\tabulateraggedright {\ifnum\tabulatetype=\plusone \else\raggedright \fi} +\def\tabulateraggedcenter{\ifnum\tabulatetype=\plusone \else\raggedcenter\fi} +\def\tabulateraggedleft {\ifnum\tabulatetype=\plusone \else\raggedleft \fi} +\def\tabulatenotragged {\ifnum\tabulatetype=\plusone \else\notragged \fi} +\def\tabulatehss {\ifnum\tabulatetype=\plusone \else\hss \fi} % never change this to a fill + +\def\tabulatebskipraggedright {\bskip\tabulateraggedright } +\def\tabulatebskipraggedleft {\bskip\tabulateraggedleft } +\def\tabulatebskipraggedcenter{\bskip\tabulateraggedcenter} + +\def\tabulatesetpreamblewidthnormal + {\ifcase\tabulatealign\relax + \dodosettabulatepreamble\empty \tabulatehss \or + \dodosettabulatepreamble\empty \tabulatehss \or + \dodosettabulatepreamble\tabulatehss\empty \or + \dodosettabulatepreamble\tabulatehss\tabulatehss \fi} + +\def\tabulatesetpreamblewidthfixed + {\ifcase\tabulatealign\relax + \dodosettabulatepreamble\bskip \eskip \or + \dodosettabulatepreamble\tabulatebskipraggedright \eskip \or + \dodosettabulatepreamble\tabulatebskipraggedleft \eskip \or + \dodosettabulatepreamble\tabulatebskipraggedcenter\eskip \fi} + +\def\tabulatesetpreamblewidthauto + {\global\advance\nofautotabulate\plusone + \ifcase\tabulatealign\relax + \dodosettabulatepreamble\bskip \eskip \or + \dodosettabulatepreamble\tabulatebskipraggedright \eskip \or + \dodosettabulatepreamble\tabulatebskipraggedleft \eskip \or + \dodosettabulatepreamble\tabulatebskipraggedcenter\eskip \fi} + +\def\tabulatesetpreamblewidthsimple + {\dodosettabulatepreamble\xbskip\xeskip} + +\bgroup \catcode`\|=\@@other + +\gdef\nexttabulate#1|% + {\let\tabulatealign\@@tabulatealign + \let\tabulatemodus\zerocount + \let\tabulatedimen\zerocount + \tabulatebefore \emptytoks + \tabulateafter \emptytoks + \tabulatebmath \emptytoks + \tabulateemath \emptytoks + \tabulatefont \emptytoks + \tabulatesettings\emptytoks + \global\advance\tabulatecolumns\plusone + \expandafter\let\csname\??tt:s:\the\tabulatecolumns\endcsname\donothing + \settabulatepreamble#1\relax\relax % permits i without n + \ifcase\tabulatemodus\relax + \tabulatesetpreamblewidthnormal + \or % fixed width + \tabulatesetpreamblewidthfixed + \or % auto width + \tabulatesetpreamblewidthauto + \or % simple + \tabulatesetpreamblewidthsimple + \fi + \futurelet\next\donexttabulate} + +\egroup + +\def\donexttabulate + {\ifx\next\relax\else + \expandafter\nexttabulate + \fi} + +\def\splitofftabulatebox % overloaded in anch-pgr + {\dontcomplain + \global\setbox\tabulatebox % % % global ? % % % + \vsplit\tablebox\tabulatecolumn to \lineheight + \setbox\tabulatebox\normalvbox + {\unvbox\tabulatebox}% + \setbox\tabulatebox\hbox to \wd\tabulatebox + {\hss\dotabulatehook{\box\tabulatebox}\hss}% + \ht\tabulatebox\strutht + \dp\tabulatebox\strutdp + \box\tabulatebox} + +\def\dotabulatehook {\csname\??tt:h:\the\tabulatecolumn\endcsname} +\def\dotabulatealign{\csname\??tt:a:\the\tabulatecolumn\endcsname} + +\def\resettabulatepheight + {\global\tabulateminplines\plusone + \ifdim\tabulatemaxpheight>\zeropoint + \getnoflines\tabulatemaxpheight + \global\tabulatemaxplines\noflines + \else + \global\tabulatemaxplines\zerocount + \fi + \global\tabulatemaxpheight\zeropoint} + +\def\settabulatepheight + {\scratchdimen\ht\tablebox\tabulatecolumn\relax + \ifdim\scratchdimen>\tabulatemaxpheight + \global\tabulatemaxpheight\scratchdimen + \fi} + +% \def\handletabulatepbreak +% {\TABLEnoalign +% {\ifhandletabulatepbreak +% \iftabulatenopbreak +% \dotabulatenobreak +% \else\ifnum\tabulatemaxplines>\plusone +% \ifnum\tabulateminplines=\plusone +% \dotabulatenobreak +% \fi +% \global\advance\tabulateminplines\plusone +% \ifnum\tabulateminplines=\tabulatemaxplines\relax +% \dotabulatenobreak +% \fi +% \fi \fi +% \fi}} + +\def\dohandletabulatepbreak + {\ifhandletabulatepbreak + \iftabulatenopbreak + \dotabulatenobreak + \else\ifnum\tabulatemaxplines>\plusone + \ifnum\tabulateminplines=\plusone + \dotabulatenobreak + \fi + \global\advance\tabulateminplines\plusone + \ifnum\tabulateminplines=\tabulatemaxplines\relax + \dotabulatenobreak + \fi + \fi \fi + \fi} + +\def\handletabulatepbreak + {\TABLEnoalign{\dohandletabulatepbreak}} + +%D \startbuffer +%D \starttabulate[|c|p|p|] +%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR +%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR +%D \NC 2 \NC \thinrules[n=3] \NC \thinrules[n=3] \NC\NR +%D \NC 3 \NC oh yes \NC simply no \NC\NR +%D \NC 4 \NC very true \NC as false as can be \NC\NR +%D \NC 5 \NC \thinrules[n=5] \NC \thinrules[n=5] \NC\NR +%D \NC 6 \NC \thinrules[n=3] \NC \thinrules[n=4] \NC\NR +%D \stoptabulate +%D \stopbuffer +%D +%D \typebuffer {\tracetabulatetrue\getbuffer} +%D +%D \startbuffer +%D \starttabulate[|c|p|p|] +%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR +%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR +%D \NC 2 \NC oh yes \NC simply no \NC\NR +%D \NC 3 \NC very true \NC as false as can be \NC\NR +%D \NC 4 \NC the whole truth \NC but the truth \NC\NR +%D \stoptabulate +%D \stopbuffer +%D +%D \typebuffer {\tracetabulatetrue\getbuffer} + +% \definetabulate +% \redefinetabulate +% \starttabulate[preamble] +% \starttabulate -> \starttabulate[|l|p|] + +\bgroup \catcode`\|=\@@other + +\gdef\definetabulate + {\dotripleempty\dodefinetabulate} + +\gdef\dodefinetabulate[#1][#2][#3]% + {\ifthirdargument + \ifcsname\??tt#1::\c!unit\endcsname \else + \copyparameters + [\??tt#1::][\??tt\v!tabulate::]% + [\c!frame,\c!distance,\c!unit,\c!before,\c!bodyfont,\c!after, + \c!inner,\c!indenting,\c!margin,\c!align,\c!header,\c!title, + \c!rulecolor,\c!rulethickness,\c!split,EQ]% + \fi + \copyparameters + [\??tt#1::#2][\??tt#1::]% + [\c!unit,\c!distance,\c!before,\c!bodyfont,\c!after, + \c!inner,\c!indenting,\c!frame,\c!split,\c!header,\c!title, + \c!margin,\c!align,\c!rulecolor,\c!rulethickness,EQ]% + \setvalue{\e!start#1::#2}{\dofinalstarttabulate[#1][#2][#3]}% + \setvalue{\e!start#1}{\bgroup\dosubstarttabulate[#1]}% + \letvalue{\??tt#1-\v!header}\empty + \letvalue{\??tt#1-\v!footer }\empty + \else\ifsecondargument + \definetabulate[#1][][#2]% + \else + \definetabulate[#1][][|l|p|]% + \fi\fi} + +\egroup + +\let\tabulateheadcontent\empty +\let\tabulatetailcontent\empty + +\newconditional\tabulatesomeamble + +\def\processtabulateheadcontent + {\TABLEnoalign{\global\settrue\tabulatesomeamble}% + \csname\??tt\currenttabulate-\v!header\endcsname + \TABLEnoalign{\global\setfalse\tabulatesomeamble}}% + +\def\processtabulatetailcontent + {\TABLEnoalign{\global\settrue\tabulatesomeamble}% + \csname\??tt\currenttabulate-\v!footer\endcsname + \TABLEnoalign{\global\setfalse\tabulatesomeamble}}% + +\def\checkfulltabulatecontent % - needed, else confusion with \c!header + {\ifcsname\??tt\currenttabulate-\v!header\endcsname + \let\tabulateheadcontent\processtabulateheadcontent + \else + \let\tabulateheadcontent\empty + \fi + \ifcsname\??tt\currenttabulate-\v!footer\endcsname + \let\tabulatetailcontent\processtabulatetailcontent + \else + \let\tabulatetailcontent\empty + \fi} + +% \def\fulltabulatecontent +% {\tabulateheadcontent +% \tabulatecontent +% \tabulatetailcontent} + +\def\fulltabulatecontent + {\tabulateheadcontent + \tabulatecontent + \tabulatetailcontent + \removefunnytabulateline} + +\def\removefunnytabulateline + {\ifhmode + \strut\crcr + \TABLEnoalign{\kern-\lineheight}% + \fi} + +\setvalue{\e!start\v!tabulatehead}% + {\dosingleempty\dostartstarttabulatehead} + +\def\dostartstarttabulatehead[#1]% + {\processcontent{\e!stop\v!tabulatehead}\next + {\letvalue{\??tt\iffirstargument#1\else\v!tabulate\fi::-\v!header}\next}} + +\setvalue{\e!start\v!tabulatetail}% + {\dosingleempty\dostartstarttabulatetail} + +\def\dostartstarttabulatetail[#1]% + {\processcontent{\e!stop\v!tabulatetail}\next + {\letvalue{\??tt\iffirstargument#1\else\v!tabulate\fi::-\v!footer}\next}} + +\def\dosubstarttabulate + {\dodoubleempty\dodosubstarttabulate} + +\def\dodosubstarttabulate[#1][#2]% + {\csname\e!start#1::\ifcsname\e!start#1::#2\endcsname#2\fi\endcsname} + +\setvalue{\e!start\v!tabulate}% + {\bgroup\dodoubleempty\donormalstarttabulate} + +\bgroup + +\gdef\donormalstarttabulate[#1][#2]% + {\ifsecondargument + \getparameters[\??tt\v!tabulate::][#2]% + \fi + \iffirstargument + \def\next{\dofinalstarttabulate[\v!tabulate][][#1]}% + \else + \def\next{\dofinalstarttabulate[\v!tabulate][][|l|p|]}% + \fi + \next} + +\egroup + +% The much neede hook: + +\newtoks\everytabulate + +% An example of its usage: + +\appendtoks \optimizeverbatimfalse \to \everytabulate +\appendtoks \let\recodeverbatimmode\plustwo \to \everytabulate + +% A status variable: + +\chardef\tabulatepass=0 + +\def\tabulateparameter#1{\csname\??tt\currenttabulate#1\endcsname} + +\bgroup + \catcode`\|=\@@other \gdef\@@otherbar{|} + \catcode`\|=\@@active \gdef\@@useotherbar{\let|\@@otherbar} +\egroup + +\def\doparsetabulate + {\futurelet\next\dodoparsetabulate} + +\def\dodoparsetabulate % \@EAEAEA gebruiken + {\ifx\next\relax + % exit + \else\ifx*\next + \let\next\dorepeatparsetabulate + \else\ifx\bgroup\next + \let\next\dododoparsetabulate + \else + \let\next\dodododoparsetabulate + \fi\fi\fi + \next}% + +\def\dorepeatparsetabulate*#1#2% + {\dorecurse{#1}{\!!toksb\expandafter{\the\!!toksb#2}}% \dorecurse{#1}{\appendtoks#2\to\!!toksb}% + \doparsetabulate} + +\def\dododoparsetabulate#1% + {\!!toksb\expandafter{\the\!!toksb{#1}}% \appendtoks{#1}\to\!!toksb + \doparsetabulate} + +\def\dodododoparsetabulate#1% + {\!!toksb\expandafter{\the\!!toksb#1}% \appendtoks#1\to\!!toksb + \doparsetabulate} + +\setvalue{\??tt:\c!split:\v!yes }{\splittabulatetrue} +\setvalue{\??tt:\c!split:\v!repeat}{\splittabulatetrue} +\setvalue{\??tt:\c!split:\v!no }{\splittabulatefalse} +\setvalue{\??tt:\c!split:\v!auto }{\ifinsidefloat\ifinsidesplitfloat\else\splittabulatefalse\fi\fi} + +\def\dofinalstarttabulate[#1][#2][#3]% identifier sub preamble + {\edef\currenttabulate{#1::#2}% + \ifinsidefloat \else + \whitespace + \tabulateparameter\c!before + \fi + \bgroup + \resetcharacteralign + % todo: spacing around tabulate when bodyfont is set + % expansion en test needed ? + \splittabulatetrue + \csname\??tt:\c!split:\tabulateparameter\c!split\endcsname + \doifvaluesomething{\??tt\currenttabulate\c!bodyfont} + {\expanded{\switchtobodyfont[\tabulateparameter\c!bodyfont]}}% + \postponenotes % new, to be tested / will be configurable + \let\tabulatepass\plusone + \widowpenalty\zerocount % otherwise lines are not broken + \clubpenalty \zerocount % but overlap in funny ways + \the\everytabulate + \tabulateparameter\c!inner + \doifelsevalue{\??tt\currenttabulate\c!indenting}\v!yes + {\edef\tabulateindent{\the\dimexpr\leftskip+\hangindent+\parindent}}% \ctxparindent + {\edef\tabulateindent{\the\dimexpr\leftskip+\hangindent }}% + \global\tabulatecolumn\zerocount + \!!toksb\emptytoks + \bgroup + \@@useotherbar + \normalexpanded{\egroup\noexpand\doparsetabulate#3\relax}% + \processcontent + {\e!stop#1}% \currenttabulate} + \tabulatecontent + {\@EA\processtabulate\@EA[\the\!!toksb]}} + +\chardef\tabulatetype=0 + +% 0 = NC column next EQ equal column +% 1 = RC column raw RQ equal column raw +% 2 = HC column hook HQ equal column hook + +\newif\iftabulatefirstflushed + +\def\tabulateEQ + {\iftabulatefirstflushed\else\tabulateparameter{EQ}\fi + \global\tabulateequalfalse} + +% \def\tabulatenormalcolumn#1% +% {&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&} +% +% \def\tabulateequalcolumn#1% +% {&\tabulateEQ&\global\chardef\tabulatetype#1&} +% +% however, \unskip en \ignorespaces permit usage in complex XML/\starttabulate + +\def\tabulatenormalcolumn#1% + {\unskip&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&% + \ignorespaces} + +\def\tabulateequalcolumn#1% + {\unskip&\tabulateEQ&\global\chardef\tabulatetype#1&% + \ignorespaces} + +\def\tabulateautocolumn + {\tabulatenormalcolumn\zerocount + \ifnum\tabulatecolumn>\tabulatecolumns\relax + \expandafter\NR + \else + \expandafter\ignorespaces % interferes with the more tricky hooks + \fi} + +\def\setquicktabulate#1% see \startlegend \startgiven + {\let#1\tabulateautocolumn + \let\\\tabulateautocolumn} + +\def\dotabulateruleseperator % can be sped up (will do when used frequently) + {\bgroup + \let\factor\!!plusone + \scratchskip\strutdp + \ExpandFirstAfter\processallactionsinset + [\tabulateparameter\c!distance] + [ \v!blank=>\scratchskip\bigskipamount, + \v!depth=>\scratchskip\strutdp, + \v!small=>\def\factor{.25}, + \v!medium=>\def\factor{.5}, + \v!big=>, + \v!none=>\scratchskip\zeropoint\def\factor{0}, + \v!grid=>\scratchskip\zeropoint\def\factor{0}, + \s!unknown=>\scratchskip\commalistelement]% + \scratchdimen\factor\scratchskip + \ifconditional\tabulatesomeamble\kern\else\vskip\fi\scratchdimen % new + \egroup} + +\def\dodotabulaterule#1% + {\color + [\tabulateparameter\c!rulecolor] + {\scratchdimen\tabulateparameter\c!rulethickness#1}} + +\def\dotabulaterule + {\dodotabulaterule + {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax + \doifvalue{\??tt\currenttabulate\c!distance}\v!grid + {\kern-\scratchdimen}}} % experimental tm-prikkels + +\def\dotabulatelinerule + {\multispan\totaltabulatecolumns % \multispan is a plain macro + % for the moment this one + \strut\hskip\tabulateparameter\c!margin + % neg values are ok ! + \hskip\tabulateindent % new august 2003 + \dodotabulaterule + {\!!heighta.5\lineheight + \advance\!!heighta-\strutdepth + \!!deptha-\!!heighta + \advance\!!deptha\scratchdimen + \leaders\hrule\!!height\!!heighta\!!depth\!!deptha\hfill}% + \cr} + +%D When set to true, no (less) break optimization is done. + +\newif\iftolerantTABLEbreak + +%D The main processing macro is large but splitting it up +%D would make things less clear. + +\def\doregistertabulateparoptions + {\iftrialtypesetting \else + \registerparoptions + \ifinsidefloat + % that is, an unbreakable one + \glet\registertabulateparoptions\empty + \else + % unsafe in crossing pages, at each b... + % \glet\registertabulateparoptions\empty + \fi + \fi} + +\appendtoks + \glet\registertabulateparoptions\doregistertabulateparoptions +\to \everytabulate + +\newtoks\everytabulaterow + +\appendtoks + \registertabulateparoptions +\to \everytabulaterow + +\def\flushtabulateindent + {\ifnum\tabulatecolumn=\zerocount + \hbox to \tabulateindent + {% we now have a local hsize, and since we want to + % register positional info (i.e. real hsizes) we + % need to reconstitute the original hsize + \advance\hsize\tabulateindent + % this is indeed rather messy and took a few hours + % to dis/uncover + \the\everytabulaterow + \hss}% + \fi} + +\def\totaltabulatecolumns{0} + +\def\handletabulatedigits{\digits} + +%D Beware, we cannot use \type {\unexpanded} on \type {\HL} +%D cum suis, since \TEX's hard coded noalign lookahead fails +%D on it! I mistakenly added this for a while. + +\chardef\tabulaterepeathead\zerocount + +\newcount\noftabulatelines +\newcount\totalnoftabulatelines +\newcount\minusnoftabulatelines + +\setvalue{\??tt:\c!align:\v!normal}{0} +\setvalue{\??tt:\c!align:\v!right }{1} +\setvalue{\??tt:\c!align:\v!left }{2} +\setvalue{\??tt:\c!align:\v!middle}{3} + +\setvalue{\??tt:\c!header:\v!repeat}{\plusone} +\setvalue{\??tt:\c!header:\v!text }{\plustwo} + +\newtoks\everyaftertabulaterow + +\def\tabulatebskipone {\setbox\tabulatebox\vbox\bgroup\glet\tabulatehook\notabulatehook} +\def\tabulateeskipone {\par\egroup\glet\tabulatehook\dotabulatehook} +\def\tabulatexbskipone{\hbox\bgroup\vbox\bgroup\glet\tabulatehook\notabulatehook} +\def\tabulatexeskipone{\par\egroup\egroup\glet\tabulatehook\dotabulatehook} + +\def\tabulatebaselinecorrection + {\def\dobaselinecorrection + {\vskip-\prevdepth + \vskip\strutdp + \vskip\strutdp}% + \baselinecorrection} + +\unexpanded\def\tabulateNCone{\tabulatenormalcolumn0} +\unexpanded\def\tabulateRCone{\tabulatenormalcolumn1} +\unexpanded\def\tabulateHCone{\tabulatenormalcolumn2} +\unexpanded\def\tabulateEQone{\tabulateequalcolumn 0} +\unexpanded\def\tabulateRQone{\tabulateequalcolumn 1} +\unexpanded\def\tabulateHQone{\tabulateequalcolumn 2} +\unexpanded\def\tabulateNGone{\NC\handletabulatecharalign} +\unexpanded\def\tabulateNNone{\NC\handletabulatedigits} % new, undocumented, test first +\unexpanded\def\tabulateNDone{\NC\handletabulatedigits} % same, for old times sake +\unexpanded\def\tabulateHRone{\doHR\zerocount} +\unexpanded\def\tabulateHLone{\doHL\zerocount} + +\unexpanded\def\tabulateNRone % next row + {\global\advance\noftabulatelines\plusone + \global\tabulatefirstflushedfalse + \global\tabulateequalfalse + \global\tabulatecolumn\zerocount + \resettabulatepheight + \unskip\unskip\crcr\flushtabulated + \TABLEnoalign + {\the\everyaftertabulaterow}% + \TABLEnoalign + {\iftolerantTABLEbreak\else + \ifconditional\tabulatesomeamble \ifcase\tabulaterepeathead \else + \allowbreak + \fi \fi + \ifnum\noftabulatelines=\plusone + \dotabulatenobreak + \else\ifnum\noftabulatelines=\minusnoftabulatelines + \ifnum\tabulatemaxplines<\plustwo + \dotabulatenobreak + \else + \allowbreak % needed with pbreak prevention + \fi + \else + \allowbreak % needed with pbreak prevention + \fi\fi + \fi + \global\tabulatefirstflushedfalse}} + +\def\tabulatebbskiptwo + {\ifvoid\tablebox\tabulatecolumn + \ifx\flushtabulatedindeed\empty\else + \setbox0\hbox + \fi + \fi} + +\def\tabulatebskiptwoeskip + {\par\egroup + \settabulatepheight + \glet\tabulatehook\dotabulatehook + \splitofftabulatebox} + +\def\tabulatebskiptwo + {\ifvoid\tablebox\tabulatecolumn + \global\setbox\tablebox\tabulatecolumn\vbox + \bgroup + \glet\tabulatehook\notabulatehook + \ifautotabulate\hsize\tabulatewidth\fi + % \begstrut % interferes with pre-\pars + % evt: \appendtoks\begstrut\to\everypar + \ignorespaces + \let\eskip\tabulatebskiptwoeskip + \else + \let\eskip\empty + \dontcomplain + \glet\tabulatehook\dotabulatehook + \expandafter\splitofftabulatebox + \fi} + +\def\tabulatexbskiptwo{\bskip} +\def\tabulatexeskiptwo{\eskip} + +% \def\tabulateflushtabulatedtwo +% {\TABLEnoalign % noalign % no interference ! +% {\glet\flushtabulatedindeed\empty +% \global\tabulatecolumn\zerocount +% \handletabulatepbreak +% \dorecurse\tabulatecolumns % was: \noftabcolumns +% {\ifvoid\tablebox\recurselevel\else +% \gdef\flushtabulatedindeed{\the\tabulatedummy}% +% \fi}% +% \global\tabulatefirstflushedtrue}% +% \flushtabulatedindeed} + +\def\dotabulateflushtabulatedtwo + {\glet\flushtabulatedindeed\empty + \global\tabulatecolumn\zerocount + \handletabulatepbreak + \dorecurse\tabulatecolumns % was: \noftabcolumns + {\ifvoid\tablebox\recurselevel\else + \gdef\flushtabulatedindeed{\the\tabulatedummy}% + \fi}% + \global\tabulatefirstflushedtrue} + +\def\tabulateflushtabulatedtwo + {\TABLEnoalign{\dotabulateflushtabulatedtwo}% + \flushtabulatedindeed} + +\def\tabulatebskipthree + {\vtop\bgroup + \ifautotabulate\hsize\tabulatewidth\fi + % \begstrut % interferes with pre-\pars + % evt: \appendtoks\begstrut\to\everypar + \ignorespaces} + +\def\tabulateeskipthree % vertical strut added august 2003 + {\par\verticalstrut\vskip-\struttotal\egroup} + +\def\tabulatedoHLfour#1% #1 ignored + {\TABLEnoalign + {\csname + \ifnum\noftabulatelines=\zerocount F\else + \ifnum\noftabulatelines=\totalnoftabulatelines L\else + M\fi\fi + L\endcsname}}% + +\def\tabulatedoHRfour#1% horizontal rule line (break untested) + {\TABLEnoalign + {\globallet\TABLEautoline\dotabulatelinerule + \ifcase#1\or + \ifnum\noftabulatelines=\zerocount + \gdef\TABLEautoline{\TABLEnoalign{}}% + \else\ifnum\noftabulatelines=\totalnoftabulatelines + \gdef\TABLEautoline{\TABLEnoalign{}}% + \fi\fi + \fi + \dotabulatenobreak}% + \TABLEautoline + \TABLEnoalign + {\nobreak + \ifx\TABLEautoline\dotabulatelinerule\kern-\lineheight\fi + \ifnum\noftabulatelines=\totalnoftabulatelines + \@EA\dotabulatenobreak + \else + \@EA\allowbreak + \fi}% + \TABLEautoline + \TABLEnoalign + {\dotabulatenobreak}} + +\def\tabulateFLfive{\TABLEnoalign + {\ifinsidefloat\else + \doifemptyvalue{\??tt\currenttabulate\c!before} % no expansion + {\tabulatebaselinecorrection}% + \fi + \dotabulaterule + \dotabulatenobreak + \dotabulateruleseperator + \prevdepth\strutdp + \dotabulatenobreak}} + +\def\tabulateMLfive{\TABLEnoalign + {\dotabulateruleseperator + \dotabulaterule + \ifnum\noftabulatelines>\plusone + \ifnum\noftabulatelines<\minusnoftabulatelines + \vskip\topskip\allowbreak\vskip-\topskip + \vskip-\tabulateparameter\c!rulethickness + \dotabulaterule + \fi + \fi + \dotabulateruleseperator}} + +\def\tabulateLLfive{\TABLEnoalign + {\dotabulatenobreak + \dotabulateruleseperator + \dotabulatenobreak + \dotabulaterule + \ifinsidefloat\else + \doifemptyvalue{\??tt\currenttabulate\c!after} % no expansion + {\vskip\strutdp + \verticalstrut + \vskip-\struttotal}% + \fi}} + +\def\tabulateHLfive + {\doHL\zerocount} + +\def\tabulaterule {\HR}% a rule with lineheight +\def\tabulateline {\HL}% just a spaced rule +\def\tabulateautorule{\doHR\plusone}% +\def\tabulateautoline{\doHL\plusone}% + +\bgroup \catcode`\|=\@@other + +\gdef\processtabulate[|#1|]% in the process of optimizing + {\tabulateunit\tabulateparameter\c!unit + \checkfulltabulatecontent + \globallet\tabulateruledepth \!!zeropoint + \globallet\tabulateruleheight\!!zeropoint + \edef\@@tabulatealign{\executeifdefined{\??tt:\c!align:\tabulateparameter\c!align}0}% + \let\pretabskip\!!zeropoint + \def\postabskip{.5\tabulateunit}% + \global\tabulatecolumns\zerocount + \global\nofautotabulate\zerocount + \global\noftabulatelines\zerocount + \totalnoftabulatelines\noftabulatelines + \minusnoftabulatelines\noftabulatelines + \global\tabulatepwidth\zeropoint + \global\tabulateequalfalse + \resettabulatepheight + \ifinsidesplitfloat + \donetrue + \else\ifinsidefloat + \donefalse + \else + \donetrue + \fi\fi + \ifdone + \chardef\tabulaterepeathead\executeifdefined{\??tt:\c!header:\tabulateparameter\c!header}\zerocount + \fi + \let\NC\tabulateNCone + \let\RC\tabulateRCone + \let\HC\tabulateHCone + \let\EQ\tabulateEQone + \let\RQ\tabulateRQone + \let\HQ\tabulateHQone + \let\NG\tabulateNGone + \let\NN\tabulateNNone + \let\ND\tabulateNDone + \let\HR\tabulateHRone + \let\HL\tabulateHLone + \let\NR\tabulateNRone + \let\HL\empty % not needed ? ? ? + \let\SR\NR \let\AR\NR + \let\FL\empty \let\FR\NR + \let\ML\empty \let\MR\NR + \let\LL\empty \let\LR\NR + \let\doHR\gobbleoneargument + \let\doHL\gobbleoneargument + \glet\flushtabulated\empty + \tabskip\zeropoint + \ifdim\tabulateparameter\c!margin>\zeropoint + \!!toksa{&\flushtabulateindent\strut##\tabskip\tabulateparameter\c!margin\strut&##\tabskip\zeropoint}% + \else + \!!toksa{&\flushtabulateindent\strut##&##\tabskip\zeropoint}% + \fi + \tabulatewidth\zeropoint + \nexttabulate #1X|\relax + \edef\totaltabulatecolumns{\the\numexpr3*\tabulatecolumns+4}% + \tabulatewidth\zeropoint + \initializetableboxes\tabulatecolumns + \appendtoks&##\global\advance\tabulatecolumn\plusone\to\!!toksa + \appendtoks\NC\unskip\unskip\crcr\flushtabulated\to\tabulatedummy % no count + \global\tabulatecolumn\zerocount + \resettabulatepheight + \let\bskip \tabulatebskipone + \let\eskip \tabulateeskipone + \let\xbskip\tabulatexbskipone + \let\xeskip\tabulatexeskipone + \glet\tabulatehook\dotabulatehook + \doifvalue{\??tt\currenttabulate\c!indenting}\v!no\forgetparindent + \ifinsidefloat + \let\tabulateindent\!!zeropoint + \else + \setlocalhsize \hsize\localhsize + \fi + \dontcomplain + \forgetall % hm, interference with \forgetparindent ^^^ probably bug, to be solved + \setbox0\vbox % outside \if because of line counting + {\notesenabledfalse + \let\tabulateindent\!!zeropoint + \trialtypesettingtrue % very important + \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}}% + \ifnum\nofautotabulate>\zerocount + % so, even if the natural size is larger, in the final + % run, we force the calculated width + \tabulatewidth\dimexpr\hsize-\wd0-\tabulatepwidth\relax + \ifnum\nofautotabulate>\zerocount + \divide\tabulatewidth \nofautotabulate\relax + \fi + \fi + \let\xbskip\tabulatexbskiptwo + \let\xeskip\tabulatexeskiptwo + \ifsplittabulate + \splittopskip\strutht + \glet\flushtabulatedindeed\empty + \let\bbskip\tabulatebbskiptwo + \let\bskip\tabulatebskiptwo + \glet\flushtabulated\tabulateflushtabulatedtwo + \else + % tabhook op alles ? + \let\bskip\tabulatebskipthree + \let\eskip\tabulateeskipthree + \fi + \totalnoftabulatelines\noftabulatelines + \minusnoftabulatelines\numexpr\noftabulatelines+\minusone\relax + \global\noftabulatelines\zerocount + \let\doHL\tabulatedoHLfour + \let\doHR\tabulatedoHRfour + \doifelsevalue{\??tt\currenttabulate\c!rule}\v!line + {\let\HL\HR + \let\tabulateautoline\tabulateautorule + \let\tabulateline\tabulaterule}% + {\let\HL\tabulateHLfive}% + \let\FL\tabulateFLfive + \let\ML\tabulateMLfive + \let\LL\tabulateLLfive + \let\tabulatepass\plustwo + % + \ifcase\tabulaterepeathead + \ifinsidesplitfloat + \setbox\tabulatebox\vbox \bgroup + \else + \startframedcontent[\tabulateparameter\c!frame]% + \fi + \else + \setbox\tabulatebox\vbox \bgroup + \fi + % + \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}% + \prevdepth\strutdp % nog eens beter, temporary hack + \doifvalue{\??tt\currenttabulate\c!distance}\v!grid{\vskip-\strutdp}% experimental tm-prikkels + % + \ifcase\tabulaterepeathead + \ifinsidesplitfloat + \egroup \splittabulatebox\tabulatebox + \else + \stopframedcontent + \fi + \else + \egroup \splittabulatebox\tabulatebox + \fi + % + \egroup + \ifinsidefloat \else + \tabulateparameter\c!after + \fi + \egroup} + +\egroup + +% \setuptabulate[split=yes,header=text,title=Vervolg van Tabel] +% +% % \starttabulatehead +% % \NC test \NC hans\NC \NR +% % \stoptabulatehead +% +% \starttabulate +% \NC test \NC \input tufte \relax \NC \NR +% \NC test \NC \input knuth \relax \NC \NR +% \NC test \NC \input knuth \relax \NC \NR +% \NC test \NC \input tufte \relax \NC \NR +% \NC test \NC \input tufte \relax \NC \NR +% \NC test \NC \input tufte \relax \NC \NR +% \stoptabulate + +\def\splittabulatebox#1% #1 <> 0/2 / derived from the one in core-ntb.tex + {\ifinsidesplitfloat + \dosplittabulatebox#1% + \else\ifinsidefloat + \unvbox#1% + \else + \dosplittabulatebox#1% + \fi\fi} + +\def\dosplittabulatebox#1% + {\resettsplit + \def\tsplitminimumfreelines{2}% + \def\tsplitminimumfreespace{0pt}% + \setbox\tsplitcontent\box#1% + \ifcase\tabulaterepeathead\or + \setbox\tsplithead\vsplit\tsplitcontent to \lineheight + \setbox\tsplithead\vbox{\unvbox\tsplithead}% + \or + \setbox\tsplithead\vbox{\hbox{\strut\tabulateparameter\c!title}}% + \fi + \handletsplit} + +%D \starttyping +%D \setuptabulate[split=no,rule=line] +%D +%D \starttabulate +%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule +%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule +%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule +%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule +%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule +%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule +%D \stoptabulate +%D \stoptyping + +% \starttabulatie[|mc|] +% \NC \digits{100.000,00} \NC\NR +% \NC \digits{@10.000,00} \NC\NR +% \NC \digits{@@@.100,00} \NC\NR +% \NC \digits{@@@.@10,@@} \NC\NR +% \NC \digits{@@@.@@1,@@} \NC\NR +% \stoptabulatie +% +% \starttabulatie[|mc|] +% \ND 100.000,00 \NC\NR +% \ND @10.000,00 \NC\NR +% \ND @@@.100,00 \NC\NR +% \ND @@@.@10,@@ \NC\NR +% \ND @@@.@@1,@@ \NC\NR +% \stoptabulatie +% +% \starttabulatie[|c|] +% \ND $100.000,00$ \NC\NR +% \ND $@10.000,00$ \NC\NR +% \ND $@@@.100,00$ \NC\NR +% \ND $@@@.@10,@@$ \NC\NR +% \ND $@@@.@@1,@@$ \NC\NR +% \stoptabulatie +% +% \starttabulatie[|c|] +% \NC $\digits 100.000,00 $ \NC\NR +% \NC $\digits @10.000,00 $ \NC\NR +% \NC $\digits @@@.100,00 $ \NC\NR +% \NC $\digits @@@.@10,@@ $ \NC\NR +% \NC $\digits @@@.@@1,@@ $ \NC\NR +% \stoptabulatie +% +% \starttabulatie[|c|] +% \NC \digits $100.000,00$ \NC\NR +% \NC \digits $@10.000,00$ \NC\NR +% \NC \digits $@@@.100,00$ \NC\NR +% \NC \digits $@@@.@10,@@$ \NC\NR +% \NC \digits $@@@.@@1,@@$ \NC\NR +% \stoptabulatie + +\def\setuptabulate + {\dotripleempty\dosetuptabulate} + +\def\dosetuptabulate[#1][#2][#3]% + {\ifthirdargument + \getparameters[\??tt#1::#2][#3]% + \else\ifsecondargument + \getparameters[\??tt#1::][#2]% + \else + \getparameters[\??tt\v!tabulate::][#1]% + \fi\fi} + +\setuptabulate + [\c!unit=1em, + EQ={:}, + \c!frame=\v!off, + \c!bodyfont=, + \c!rule=\v!normal, + \c!rulecolor=, + \c!rulethickness=\linewidth, + \c!inner=, + \c!before=\blank, + \c!after=\blank, + \c!distance={\v!depth,\v!medium}, + \c!align=\v!normal, + \c!margin=\!!zeropoint, + \c!split=\v!auto, + \c!header=\v!yes, + \c!title=, + \c!indenting=\v!no] + +\protect \endinput diff --git a/tex/context/base/tabl-tsp.tex b/tex/context/base/tabl-tsp.mkii index 49bb7ad90..49bb7ad90 100644 --- a/tex/context/base/tabl-tsp.tex +++ b/tex/context/base/tabl-tsp.mkii diff --git a/tex/context/base/tabl-tsp.mkiv b/tex/context/base/tabl-tsp.mkiv new file mode 100644 index 000000000..49bb7ad90 --- /dev/null +++ b/tex/context/base/tabl-tsp.mkiv @@ -0,0 +1,427 @@ +%D \module +%D [ file=tabl-tsp, +%D version=2000.10.20, +%D title=\CONTEXT\ Table Macros, +%D subtitle=Splitting, +%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 Table Macros / Splitting} + +%D The code in this file is move here from other places. + +\unprotect + +% only to be used with single tokens (will be prim) + +\ifx\htdp\undefined \def\htdp#1{\dimexpr\ht#1+\dp#1\relax} \fi + +%D Although the name resembles floats, and therefore this should be +%D a page module, we decided to make it core functionality because the +%D table code depends on it. Othrwise there would be too much +%D overloading afterwards involved. Actually, the float part is rather +%D generic and not that related to floats. + +% \splitfloat [settings] {\placetable[optional args]{test}} {content} + +\definenumber + [\??si] + [\c!way=\v!by\v!text, + \c!conversion=\@@siconversion] + +\def\setupfloatsplitting + {\dodoubleargument\getparameters[\??si]} + +\newif\ifinsidesplitfloat % will become chardef + +\newtoks \everysplitfloatsetup + +\def\splitfloat + {\dosingleempty\dosplitfloat} + +\ifx\floatcaptionsuffix\undefined \else + \let\floatcaptionsuffix\empty % will become \splitfloatcaptionsuffix +\fi + +\def\extrasplitfloatlines{0} + +\def\dosplitfloat[#1]#2% nog dubbele refs + {\bgroup + \global\setfalse\splitfloatdone + \aftergroup\checksplitfloat + \insidefloattrue + \insidesplitfloattrue + \getparameters[\??si][#1]% + \resetnumber[\??si]% + \def\floatcaptionsuffix{\convertednumber[\??si]}% + \let\extrasplitfloatlines\@@silines + \the\everysplitfloatsetup + \def\splitfloatcommand{#2}% + \global\settrue \onlyonesplitofffloat + \global\setfalse\somenextplitofffloat + \dopushsavedfloats + \@@sibefore + \let\next} % \bgroup + +\def\checksplitfloat + {\ifconditional\splitfloatdone\else + \blank{\tttf \getmessage\m!floatblocks{13}\empty}\blank + \showmessage\m!floatblocks{13}\empty + \fi} + +\settrue \onlyonesplitofffloat +\setfalse\somenextplitofffloat + +%D When \type {inbetween} is made empty instead of the +%D default \type {\page}, we will get delayed flushing +%D and text may continue below the graphic. +%D +%D \starttyping +%D \dorecurse{2}{\input tufte } +%D +%D \splitfloat[lines=auto,inbetween=] +%D {\placetable{\dorecurse{5}{test\recurselevel\endgraf}}} +%D {\bTABLE[split=yes] +%D \bTR \bTD 11 \eTD \bTD \input tufte \eTD \eTR +%D \bTR \bTD 12 \eTD \bTD \input zapf \eTD \eTR +%D \bTR \bTD 13 \eTD \bTD \input bryson \eTD \eTR +%D \bTR \bTD 14 \eTD \bTD test \eTD \eTR +%D \bTR \bTD 21 \eTD \bTD \input tufte \eTD \eTR +%D \bTR \bTD 22 \eTD \bTD \input zapf \eTD \eTR +%D \bTR \bTD 23 \eTD \bTD \input bryson \eTD \eTR +%D \bTR \bTD 24 \eTD \bTD test \eTD \eTR +%D \bTR \bTD 31 \eTD \bTD \input tufte \eTD \eTR +%D \bTR \bTD 32 \eTD \bTD \input zapf \eTD \eTR +%D \bTR \bTD 33 \eTD \bTD \input bryson \eTD \eTR +%D \bTR \bTD 34 \eTD \bTD test \eTD \eTR +%D \eTABLE} +%D +%D \dorecurse{10}{\input tufte } +%D \stoptyping + +\newconditional\splitfloatdone + +\def\dodowithsplitofffloat + {\dowithnextbox + {\forgetall + \dontcomplain + \global\settrue\splitfloatdone + \chardef\nodelocationmode\zerocount % bypass auto-renumbering + \incrementnumber[\??si]% + \ifcase\rawnumber[\??si]\or \ifconditional\onlyonesplitofffloat + \let\floatcaptionsuffix\empty + \fi \fi + \bgroup + \ifconditional\somenextplitofffloat + \settrue\retainfloatnumber +\notesenabledfalse % best here, experimental, brrr; test with note in caption + \else + \setfalse\retainfloatnumber + \fi + \splitfloatcommand{\box\nextbox}% + \egroup + \ifconditional\somenextplitofffloat + \doifelsenothing\@@siinbetween + {\ifconditional\splitfloatfirstdone\else\page\fi} + \@@siinbetween + \else + \@@siafter + \dopopsavedfloats + \doflushsavedfloats + \fi + \global\settrue\splitfloatfirstdone}% + \vbox} + +\def\nodowithsplitofffloat + {\dowithnextbox + {\forgetall + \dontcomplain + \box\nextbox % maybe an option to unvbox + \global\settrue\splitfloatfirstdone}% + \vbox} + +\def\dochecksplitofffloat#1% box + {\ifinsidesplitfloat + \ifdim\ht#1=\zeropoint + \global\setfalse\somenextplitofffloat + \else + \global\settrue \somenextplitofffloat + \global\setfalse\onlyonesplitofffloat + \fi + \fi} + +\def\analyzesplitfloatcaption#1% depends on page-flt + {\doif\extrasplitfloatlines\v!auto + {\bgroup + \settrue\retainfloatnumber + \chardef\nodelocationmode\zerocount + \forcelocalfloats + \setuplocalfloats[\c!before=,\c!after=,\c!inbetween=]% + \splitfloatcommand{\hbox to \wd#1{\strut}}% dummy line + \setbox\scratchbox\vbox{\flushlocalfloats}% + \getnoflines{\ht\scratchbox}% + \resetlocalfloats + \advance\noflines\minusone % compensate dummy line + \expanded{\egroup\noexpand\edef\noexpand\extrasplitfloatlines{\the\noflines}}}} + +% \def\analyzesplitfloatcaption#1% +% {\edef\extrasplitfloatlines{11}} + +\def\dowithsplitofffloat % nextbox + {\ifinsidesplitfloat + \expandafter\dodowithsplitofffloat + \else + \expandafter\nodowithsplitofffloat + \fi} + +\def\doifnotinsidesplitfloat + {\ifinsidesplitfloat\expandafter\gobbleoneargument\fi} + +%D Some defaults: + +\setupfloatsplitting + [\c!conversion=\v!character, % \v!romannumerals + \c!lines=3, + \c!before=, + \c!inbetween=\page, + \c!after=] + +%D Table splitter, on top of previous code: + +\newbox\tsplitcontent +\newbox\tsplitresult +\newbox\tsplithead +\newbox\tsplitnext +\newbox\tsplittail + +\def\resettsplit{% only \def's starting a a new line are seen by the dep checker + \def\tsplitminimumfreelines{0}% + \def\tsplitminimumfreespace{0pt}% + \setbox\tsplitcontent \vbox{}% + \setbox\tsplitresult \vbox{}% + \setbox\tsplithead \vbox{}% + \setbox\tsplitnext \vbox{}% + \setbox\tsplittail \vbox{}% + \let\tsplitbeforeresult\donothing + \let\tsplitafterresult \donothing + \let\tsplitinbetween \donothing + \let\tsplitbefore \donothing + \let\tsplitafter \donothing + \let\postprocesstsplit \donothing +} + +\resettsplit + +% todo: keep tail to rest, so we need a lookahead + +\newconditional\splitfloatfirstdone + +\def\handletsplit + {\analyzesplitfloatcaption\tsplitcontent + \global\setfalse\splitfloatfirstdone + \testpagesync % new, sync, but still tricky + [\tsplitminimumfreelines] + [\dimexpr\tsplitminimumfreespace+\extrasplitfloatlines\lineheight\relax]% + \setbox\scratchbox\vbox{\tsplitinbetween}% + \edef\tsplitinbetweenheight{\the\htdp\scratchbox}% etex + \!!doneafalse + \doloop + {\ifinsidecolumns + % brrr, assumes empty columns + \global\setfalse\splitfloatfirstdone + \scratchdimen\textheight + \!!donectrue + \else + \ifconditional\splitfloatfirstdone + \scratchdimen\textheight + \!!donectrue + \else\ifdim\pagegoal<\maxdimen + \scratchdimen\dimexpr\pagegoal-\pagetotal\relax + \!!donecfalse + \else + \scratchdimen\textheight + \!!donectrue + \fi\fi + \fi + \scratchdimen\dimexpr\scratchdimen-\tsplitinbetweenheight-\tsplitminimumfreespace-\extrasplitfloatlines\lineheight\relax + \ifdim\htdp\tsplittail>\zeropoint + \advance\scratchdimen-\htdp\tsplittail + \fi + \setbox\tsplitresult\vbox + {\ifdim\ht\tsplithead>\zeropoint + \unvcopy\tsplithead + \tsplitinbetween + \fi}% + \if!!donea\else\ifdim\ht\tsplitnext>\zeropoint + \setbox\tsplithead\box\tsplitnext + \fi\fi + \!!doneatrue + \ifdim\ht\tsplitresult>\zeropoint + \!!donedtrue % table head + \else + \!!donedfalse % no tablehead + \fi + \splittopskip\zeropoint + \doloop + {\setbox\scratchbox\vsplit\tsplitcontent to \onepoint % \lineheight + \setbox\scratchbox\vbox{\unvbox\scratchbox}% + \ifdim\dimexpr\scratchdimen-\htdp\scratchbox-\htdp\tsplitresult\relax>\zeropoint + \setbox\tsplitresult\vbox + {\unvbox\tsplitresult + \tsplitinbetween + \unvbox\scratchbox}% + \ifvoid\tsplitcontent \exitloop \fi + \else\if!!doned + % we only have a tablehead so far + \setbox\tsplitresult\vbox{\unvbox\tsplitresult\unvbox\scratchbox}% + \exitloop + \else\if!!donec + % we have text height available, but the (one) cell is too + % large to fit, so, in order to avoid loops/deadcycles we do: + \setbox\tsplitresult\vbox + {\unvbox\tsplitresult + \tsplitinbetween + \unvbox\scratchbox}% + \exitloop + \else + \setbox\tsplitcontent\vbox + {\unvbox\scratchbox + \tsplitinbetween + \ifvoid\tsplitcontent\else\unvbox\tsplitcontent\fi}% + \exitloop + \fi\fi\fi + \!!donedfalse + \!!donecfalse}% + \postprocesstsplit + \dochecksplitofffloat\tsplitcontent + \ifvoid\tsplitcontent + \setbox\tsplitresult\vbox + {\unvbox\tsplitresult + \tsplitinbetween + \unvcopy\tsplittail}% + \dowithsplitofffloat{\tsplitbeforeresult\box\tsplitresult\tsplitafterresult}% + \doifnotinsidesplitfloat\tsplitafter + \endgraf + \exitloop + \else + % hack + \ifdim\pagegoal<\maxdimen + \global\pagegoal\dimexpr\pagegoal+\lineheight\relax % etex + \fi + % brrr + \ifdim\ht\tsplitresult>\zeropoint + \setbox\tsplitresult\vbox + {\unvbox\tsplitresult + \tsplitinbetween + \unvcopy\tsplittail}% + \dowithsplitofffloat{\tsplitbeforeresult\box\tsplitresult\tsplitafterresult}% + \doifnotinsidesplitfloat\tsplitafter + \endgraf + \fi + \ifinsidecolumns + \doifnotinsidesplitfloat\goodbreak + \else + \doifnotinsidesplitfloat\page + \fi + \fi}% + \global\setfalse\splitfloatfirstdone} % we can use this one for tests + +\protect \endinput + +% test cases + +% \setupTABLE[split=repeat] +% +% \input tufte \endgraf +% \splitfloat[lines=11] +% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}} +% {\bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE} +% \input tufte \page +% +% \input tufte \endgraf +% \splitfloat[lines=0] +% {} +% {\bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE} +% \input tufte \endgraf \page +% +% \input tufte \endgraf +% \bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE +% \input tufte \page + +% \setuptabulate[split=yes] +% +% \input tufte \endgraf +% \splitfloat[lines=11] +% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}} +% {\starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate} +% \input tufte \page +% +% \input tufte \endgraf +% \splitfloat[lines=0] +% {} +% {\starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate} +% \input tufte \page +% +% \input tufte \endgraf +% \starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate +% \input tufte \page + +% \setuptables[split=yes] +% +% \newtoks\TestToks +% +% \TestToks\emptytoks +% \appendtoks\starttablehead\to\TestToks +% \dorecurse{3}{\appendtoks\VL head \VL head \VL \SR\to\TestToks} +% \appendtoks\stoptablehead\to\TestToks +% \appendtoks\starttabletail\to\TestToks +% \dorecurse{3}{\appendtoks\VL tail \VL tail \VL \SR\to\TestToks} +% \appendtoks\stoptabletail\to\TestToks +% \appendtoks\starttables[|c|c|]\to\TestToks +% \dorecurse{100}{\appendtoks\VL test \VL test \VL \SR\to\TestToks} +% \appendtoks\stoptables\to\TestToks +% +% \input tufte \endgraf +% \splitfloat[lines=auto] % [lines=11] +% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}} +% {\the\TestToks} +% \input tufte \page +% +% \input tufte \endgraf +% \splitfloat[lines=0] +% {} +% {\the\TestToks} +% \input tufte \page +% +% \input tufte \endgraf +% \the\TestToks +% \input tufte \page +% +% multiple floats +% +% \starttext +% \dorecurse{3}{\input tufte } \endgraf +% \dorecurse{5}{\placefigure{}{\framed[height=.5\textheight]{}}} +% \splitfloat[lines=auto,inbetween=] +% {\placetable{\dorecurse{5}{test\recurselevel\endgraf}}} +% {\bTABLE[split=yes] +% \bTR \bTD 11 \eTD \bTD \input tufte \eTD \eTR +% \bTR \bTD 12 \eTD \bTD \input zapf \eTD \eTR +% \bTR \bTD 13 \eTD \bTD \input bryson \eTD \eTR +% \bTR \bTD 14 \eTD \bTD test \eTD \eTR +% \bTR \bTD 21 \eTD \bTD \input tufte \eTD \eTR +% \bTR \bTD 22 \eTD \bTD \input zapf \eTD \eTR +% \bTR \bTD 23 \eTD \bTD \input bryson \eTD \eTR +% \bTR \bTD 24 \eTD \bTD test \eTD \eTR +% \bTR \bTD 31 \eTD \bTD \input tufte \eTD \eTR +% \bTR \bTD 32 \eTD \bTD \input zapf \eTD \eTR +% \bTR \bTD 33 \eTD \bTD \input bryson \eTD \eTR +% \bTR \bTD 34 \eTD \bTD test \eTD \eTR +% \eTABLE} +% \dorecurse{10}{\input tufte } +% \stoptext diff --git a/tex/context/base/task-ini.lua b/tex/context/base/task-ini.lua index 0049cf512..7ba20fa20 100644 --- a/tex/context/base/task-ini.lua +++ b/tex/context/base/task-ini.lua @@ -9,37 +9,43 @@ if not modules then modules = { } end modules ['task-ini'] = { -- this is a temporary solution, we need to isolate some modules and then -- the load order can determine the trickery to be applied to node lists -tasks.appendaction("processors", "normalizers", "fonts.collections.process", nil) -tasks.appendaction("processors", "normalizers", "fonts.checkers.missing", nil) +tasks.appendaction("processors", "normalizers", "fonts.collections.process") +tasks.appendaction("processors", "normalizers", "fonts.checkers.missing") -tasks.appendaction("processors", "characters", "chars.handle_mirroring", nil, "notail") -tasks.appendaction("processors", "characters", "chars.handle_casing", nil, "notail") -tasks.appendaction("processors", "characters", "chars.handle_breakpoints", nil, "notail") -tasks.appendaction("processors", "characters", "scripts.preprocess", nil, "notail") -- this will be more generalized +tasks.appendaction("processors", "characters", "chars.handle_mirroring") +tasks.appendaction("processors", "characters", "chars.handle_casing") +tasks.appendaction("processors", "characters", "chars.handle_breakpoints") +tasks.appendaction("processors", "characters", "scripts.preprocess") -tasks.appendaction("processors", "words", "kernel.hyphenation", nil) -tasks.appendaction("processors", "words", "languages.words.check", nil, "notail") +tasks.appendaction("processors", "words", "kernel.hyphenation") +tasks.appendaction("processors", "words", "languages.words.check") -tasks.appendaction("processors", "fonts", "nodes.process_characters", nil, "notail") -tasks.appendaction("processors", "fonts", "nodes.inject_kerns", nil, "nohead") -tasks.appendaction("processors", "fonts", "nodes.protect_glyphs", nil, "nohead") -tasks.appendaction("processors", "fonts", "kernel.ligaturing", nil) -tasks.appendaction("processors", "fonts", "kernel.kerning", nil) +tasks.appendaction("processors", "fonts", "nodes.process_characters") +tasks.appendaction("processors", "fonts", "nodes.inject_kerns") +tasks.appendaction("processors", "fonts", "nodes.protect_glyphs", nil, "nohead") +tasks.appendaction("processors", "fonts", "kernel.ligaturing") +tasks.appendaction("processors", "fonts", "kernel.kerning") -tasks.appendaction("processors", "lists", "lists.handle_spacing", nil, "notail") -tasks.appendaction("processors", "lists", "lists.handle_kerning", nil, "notail") +tasks.appendaction("processors", "lists", "lists.handle_spacing") +tasks.appendaction("processors", "lists", "lists.handle_kerning") -tasks.appendaction("shipouts", "normalizers", "nodes.cleanup_page", nil, "notail") +tasks.appendaction("shipouts", "normalizers", "nodes.cleanup_page") +tasks.appendaction("shipouts", "normalizers", "nodes.add_references") +tasks.appendaction("shipouts", "normalizers", "nodes.add_destinations") -tasks.appendaction("shipouts", "finishers", "shipouts.handle_color", nil, "notail") -tasks.appendaction("shipouts", "finishers", "shipouts.handle_transparency", nil, "notail") -tasks.appendaction("shipouts", "finishers", "shipouts.handle_overprint", nil, "notail") -tasks.appendaction("shipouts", "finishers", "shipouts.handle_negative", nil, "notail") -tasks.appendaction("shipouts", "finishers", "shipouts.handle_effect", nil, "notail") -tasks.appendaction("shipouts", "finishers", "shipouts.handle_viewerlayer", nil, "notail") +tasks.appendaction("shipouts", "finishers", "shipouts.handle_color") +tasks.appendaction("shipouts", "finishers", "shipouts.handle_transparency") +tasks.appendaction("shipouts", "finishers", "shipouts.handle_overprint") +tasks.appendaction("shipouts", "finishers", "shipouts.handle_negative") +tasks.appendaction("shipouts", "finishers", "shipouts.handle_effect") +tasks.appendaction("shipouts", "finishers", "shipouts.handle_viewerlayer") -tasks.appendaction("math", "normalizers", "noads.relocate_characters", nil, "nohead") -tasks.appendaction("math", "normalizers", "noads.resize_characters", nil, "nohead") -tasks.appendaction("math", "normalizers", "noads.respace_characters", nil, "nohead") +tasks.appendaction("math", "normalizers", "noads.relocate_characters", nil, "nohead") +tasks.appendaction("math", "normalizers", "noads.resize_characters", nil, "nohead") +tasks.appendaction("math", "normalizers", "noads.respace_characters", nil, "nohead") -tasks.appendaction("math", "builders", "noads.mlist_to_hlist", nil, "notail") +tasks.appendaction("math", "builders", "noads.mlist_to_hlist") + +-- quite experimental + +tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust") diff --git a/tex/context/base/thrd-ran.tex b/tex/context/base/thrd-ran.mkii index 276a4f624..276a4f624 100644 --- a/tex/context/base/thrd-ran.tex +++ b/tex/context/base/thrd-ran.mkii diff --git a/tex/context/base/thrd-trg.tex b/tex/context/base/thrd-trg.mkii index c0106f5a3..c0106f5a3 100644 --- a/tex/context/base/thrd-trg.tex +++ b/tex/context/base/thrd-trg.mkii diff --git a/tex/context/base/todo-mkii.tex b/tex/context/base/todo-mkii.tex deleted file mode 100644 index 5a0f340bd..000000000 --- a/tex/context/base/todo-mkii.tex +++ /dev/null @@ -1 +0,0 @@ -MKII Todo List diff --git a/tex/context/base/todo-mkiv.tex b/tex/context/base/todo-mkiv.tex deleted file mode 100644 index 94fd6d478..000000000 --- a/tex/context/base/todo-mkiv.tex +++ /dev/null @@ -1,6 +0,0 @@ -MKIV Todo List - --- language dependent case swapping (using char-map.lua) --- figures (locating and scaling) --- numbering --- cross references diff --git a/tex/context/base/trac-inf.lua b/tex/context/base/trac-inf.lua index 41a9e7b48..d83dc8d2f 100644 --- a/tex/context/base/trac-inf.lua +++ b/tex/context/base/trac-inf.lua @@ -107,6 +107,7 @@ function statistics.show(reporter) reporter(s[1],r,n) end end + texio.write_nl("") -- final newline statistics.enable = false end end diff --git a/tex/context/base/trac-log.lua b/tex/context/base/trac-log.lua index 1fb25c5c7..d05bc9fec 100644 --- a/tex/context/base/trac-log.lua +++ b/tex/context/base/trac-log.lua @@ -9,6 +9,7 @@ if not modules then modules = { } end modules ['luat-log'] = { -- this is old code that needs an overhaul local write_nl, write, format = texio.write_nl or print, texio.write or io.write, string.format +local texcount = tex and tex.count if texlua then write_nl = print @@ -88,10 +89,8 @@ function logs.tex.line(fmt,...) -- new end end -local texcount = tex and tex.count - function logs.tex.start_page_number() - local real, user, sub = texcount[0], texcount[1], texcount[2] + local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno if real > 0 then if user > 0 then if sub > 0 then @@ -146,7 +145,7 @@ function logs.xml.stop_run() end function logs.xml.start_page_number() - write_nl(format("<p real='%s' page='%s' sub='%s'", texcount[0], texcount[1], texcount[2])) + write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno)) end function logs.xml.stop_page_number() diff --git a/tex/context/base/trac-tra.lua b/tex/context/base/trac-tra.lua index 8a51d33b9..aa18c3d98 100644 --- a/tex/context/base/trac-tra.lua +++ b/tex/context/base/trac-tra.lua @@ -148,7 +148,11 @@ trackers = trackers or { } local data, done = { }, { } local function set(what,value) - for w in gmatch(lower(what),"[^, ]+") do + if type(what) == "string" then + what = aux.settings_to_array(what) + end + for i=1,#what do + local w = what[i] for d, f in next, data do if done[d] then -- prevent recursion due to wildcards diff --git a/tex/context/base/trac-vis.mkiv b/tex/context/base/trac-vis.mkiv index 23ded2af9..c76666e92 100644 --- a/tex/context/base/trac-vis.mkiv +++ b/tex/context/base/trac-vis.mkiv @@ -343,7 +343,7 @@ \dp\scratchbox\ruleddepth \wd\scratchbox\zeropoint \resetcolorseparation - \localstartcolor[\defaulttextcolor]% + \startcolor[\defaulttextcolor]% \box\scratchbox \ifx\cutmarksymbol\relax \else \setbox\scratchbox\normalvbox @@ -360,7 +360,7 @@ \wd\scratchbox\zeropoint \box\scratchbox \fi - \localstopcolor + \stopcolor \box#1}% \wd#1=\ruledwidth \ht#1=\ruledheight @@ -407,21 +407,21 @@ \c!m=#3##1\else0\fi, \c!y=#4##1\else0\fi, \c!k=0]% - \localstartcolor[\s!dummy]% + \startcolor[\s!dummy]% \hrule \!!width 3em \!!height \scratchdimen \!!depth \zeropoint - \localstopcolor + \stopcolor \ifdim\scratchdimen>1ex \vskip-\scratchdimen \vbox to \scratchdimen {\vss \hbox to 3em {\hss - \localstartcolor[\s!white]% + \startcolor[\s!white]% \ifdim##1\points=\zeropoint#1\else##1\fi - \localstopcolor + \stopcolor \hss}% \vss}% \fi}}% @@ -441,21 +441,21 @@ \c!m=##4##2\else0\fi, \c!y=##5##2\else0\fi, \c!k=##6##2\else0\fi]% - \localstartcolor[\s!dummy]% + \startcolor[\s!dummy]% \vrule \!!width \scratchdimen \!!height \colormarklength \!!depth \zeropoint - \localstopcolor + \stopcolor \ifdim\scratchdimen>2em \hskip-\scratchdimen \vbox to \colormarklength {\vss \hbox to \scratchdimen {\hss - \localstartcolor[\s!white]% + \startcolor[\s!white]% \ifdim##2\points=.5\points##2~\fi##1% - \localstopcolor + \stopcolor \hss} \vss}% \fi}% @@ -480,19 +480,19 @@ \divide\scratchdimen 14 \def\docommand##1% {\definecolor[\s!dummy][\c!s=##1]% - \localstartcolor[\s!dummy]% + \startcolor[\s!dummy]% \vrule \!!width \scratchdimen \!!height \colormarklength \!!depth \zeropoint - \localstopcolor + \stopcolor \ifdim\scratchdimen>2em \hskip-\scratchdimen \vbox to \colormarklength {\vss - \localstartcolor[\s!white]% + \startcolor[\s!white]% \hbox to \scratchdimen{\hss##1\hss} - \localstopcolor + \stopcolor \vss}% \fi}% \processcommalist[1,.95,.9,.85,.8,.75,.7,.6,.5,.4,.3,.2,.1,0]\docommand}} diff --git a/tex/context/base/type-akb.tex b/tex/context/base/type-akb.tex deleted file mode 100644 index 7c02144d5..000000000 --- a/tex/context/base/type-akb.tex +++ /dev/null @@ -1,253 +0,0 @@ -%D \module -%D [ file=type-akb, -%D version=2001.07.08, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Adobe's Famous Gang of Fonts, -%D author=Patrick Gundlach, -%D date=\currentdate, -%D copyright={Patrick Gundlach / 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. - -%D Last Change: Tue Mar 18 16:01:03 2003 - -%D This module is written by Patrick Gundlach (patrick@gundla.ch) -%D and maps to the standard postscript fonts conforming the -%D psnfss system as used by \LaTeX. -%D -%D \starttyping -%D \setupencoding[default=texnansi] -%D \usetypescript[adobekb][\defaultencoding] -%D \stoptyping -%D -%D The following is not needed since the file is already -%D registered: -%D -%D \starttyping -%D \usetypescriptfile[akb] -%D \stoptyping - -\starttypescriptcollection[adobe kb mappings] - -\starttypescript [adobekb] [8r] - -\loadmapfile[8r-base.map] - -\definefontsynonym [8r-utmr8a] [ptmr8r] [encoding=8r] -\definefontsynonym [8r-utmri8a] [ptmri8r] [encoding=8r] -\definefontsynonym [8r-utmb8a] [ptmb8r] [encoding=8r] -\definefontsynonym [8r-utmbi8a] [ptmbi8r] [encoding=8r] - -\definefontsynonym [8r-utmr8a-slanted-167] [ptmro8r] [encoding=8r] -\definefontsynonym [8r-utmb8a-slanted-167] [ptmbo8r] [encoding=8r] - -\definefontsynonym [8r-uhvr8a] [phvr8r] [encoding=8r] -\definefontsynonym [8r-uhvro8a] [phvro8r] [encoding=8r] -\definefontsynonym [8r-uhvb8a] [phvb8r] [encoding=8r] -\definefontsynonym [8r-uhvbo8a] [phvbo8r] [encoding=8r] - -\definefontsynonym [8r-ucrr8a] [pcrr8r] [encoding=8r] -\definefontsynonym [8r-ucrb8a] [pcrb8r] [encoding=8r] -\definefontsynonym [8r-ucrro8a] [pcrro8r] [encoding=8r] -\definefontsynonym [8r-ucrbo8a] [pcrbo8r] [encoding=8r] - -\definefontsynonym [8r-uplr8a] [pplr8r] [encoding=8r] -\definefontsynonym [8r-uplri8a] [pplri8r] [encoding=8r] -\definefontsynonym [8r-uplb8a] [pplb8r] [encoding=8r] -\definefontsynonym [8r-uplbi8a] [pplbi8r] [encoding=8r] -\definefontsynonym [8r-uplr8a-slanted-167] [pplro8r] [encoding=8r] -\definefontsynonym [8r-uplb8a-slanted-167] [pplbo8r] [encoding=8r] -\definefontsynonym [8r-uplr8a-capitalized-800] [pplr8r] [encoding=8r] - -\definefontsynonym [8r-ubkl8a] [pbkl8r] [encoding=8r] -\definefontsynonym [8r-ubkli8a] [pbkli8r] [encoding=8r] -\definefontsynonym [8r-ubkd8a] [pbkd8r] [encoding=8r] -\definefontsynonym [8r-ubkdi8a] [pbkdi8r] [encoding=8r] -\definefontsynonym [8r-ubkl8a-slanted-167] [pbklo8r] [encoding=8r] -\definefontsynonym [8r-ubkd8a-slanted-167] [pbkdo8r] [encoding=8r] -\definefontsynonym [8r-ubkl8a-capitalized-800] [pbkl8r] [encoding=8r] - -\definefontsynonym [8r-uzcmi8a] [pzcmi8r] [encoding=8r] - -\definefontsynonym [8r-putr8a] [putr8r] [encoding=8r] -\definefontsynonym [8r-putri8a] [putri8r] [encoding=8r] -\definefontsynonym [8r-putb8a] [putr8r] [encoding=8r] -\definefontsynonym [8r-putbi8a] [putbi8r] [encoding=8r] -\definefontsynonym [8r-putr8a-slanted-167] [putro8r] [encoding=8r] -\definefontsynonym [8r-putb8a-slanted-167] [putbo8r] [encoding=8r] -\definefontsynonym [8r-putr8a-capitalized-800] [putr8r] [encoding=8r] - -\definefontsynonym [8r-bchr8a] [bchr8r] [encoding=8r] -\definefontsynonym [8r-bchri8a] [bchri8r] [encoding=8r] -\definefontsynonym [8r-bchb8a] [bchb8r] [encoding=8r] -\definefontsynonym [8r-bchbi8a] [bchbi8r] [encoding=8r] -\definefontsynonym [8r-bchr8a-slanted-167] [bchro8r] [encoding=8r] -\definefontsynonym [8r-bchb8a-slanted-167] [bchbo8r] [encoding=8r] -\definefontsynonym [8r-bchr8a-capitalized-800] [bchr8r] [encoding=8r] - -\stoptypescript - -\starttypescript [adobekb,berry] [ec] - -\loadmapfile[8r-base.map] -\loadmapfile[ec-base.map] - -\definefontsynonym [ec-utmr8a] [ptmr8t] [encoding=ec] -\definefontsynonym [ec-utmri8a] [ptmri8t] [encoding=ec] -\definefontsynonym [ec-utmb8a] [ptmb8t] [encoding=ec] -\definefontsynonym [ec-utmbi8a] [ptmbi8t] [encoding=ec] - -\definefontsynonym [ec-utmr8a-slanted-167] [ptmro8t] [encoding=ec] -\definefontsynonym [ec-utmb8a-slanted-167] [ptmbo8t] [encoding=ec] - -\definefontsynonym [ec-uhvr8a] [phvr8t] [encoding=ec] -\definefontsynonym [ec-uhvro8a] [phvro8t] [encoding=ec] -\definefontsynonym [ec-uhvb8a] [phvb8t] [encoding=ec] -\definefontsynonym [ec-uhvbo8a] [phvbo8t] [encoding=ec] - -\definefontsynonym [ec-ucrr8a] [pcrr8t] [encoding=ec] -\definefontsynonym [ec-ucrb8a] [pcrb8t] [encoding=ec] -\definefontsynonym [ec-ucrro8a] [pcrro8t] [encoding=ec] -\definefontsynonym [ec-ucrbo8a] [pcrbo8t] [encoding=ec] - -\definefontsynonym [ec-uplr8a] [pplr8t] [encoding=ec] -\definefontsynonym [ec-uplri8a] [pplri8t] [encoding=ec] -\definefontsynonym [ec-uplb8a] [pplb8t] [encoding=ec] -\definefontsynonym [ec-uplbi8a] [pplbi8t] [encoding=ec] -\definefontsynonym [ec-uplr8a-slanted-167] [pplro8t] [encoding=ec] -\definefontsynonym [ec-uplb8a-slanted-167] [pplbo8t] [encoding=ec] -\definefontsynonym [ec-uplr8a-capitalized-800] [pplr8t] [encoding=ec] - -\definefontsynonym [ec-ubkl8a] [pbkl8t] [encoding=ec] -\definefontsynonym [ec-ubkli8a] [pbkli8t] [encoding=ec] -\definefontsynonym [ec-ubkd8a] [pbkd8t] [encoding=ec] -\definefontsynonym [ec-ubkdi8a] [pbkdi8t] [encoding=ec] -\definefontsynonym [ec-ubkl8a-slanted-167] [pbklo8t] [encoding=ec] -\definefontsynonym [ec-ubkd8a-slanted-167] [pbkdo8t] [encoding=ec] -\definefontsynonym [ec-ubkl8a-capitalized-800] [pbkl8t] [encoding=ec] - -\definefontsynonym [ec-uzcmi8a] [pzcmi8t] [encoding=ec] - -\definefontsynonym [ec-putr8a] [putr8t] [encoding=ec] -\definefontsynonym [ec-putri8a] [putri8t] [encoding=ec] -\definefontsynonym [ec-putb8a] [putr8t] [encoding=ec] -\definefontsynonym [ec-putbi8a] [putbi8t] [encoding=ec] -\definefontsynonym [ec-putr8a-slanted-167] [putro8t] [encoding=ec] -\definefontsynonym [ec-putb8a-slanted-167] [putbo8t] [encoding=ec] -\definefontsynonym [ec-putr8a-capitalized-800] [putr8t] [encoding=ec] - -\definefontsynonym [ec-bchr8a] [bchr8t] [encoding=ec] -\definefontsynonym [ec-bchri8a] [bchri8t] [encoding=ec] -\definefontsynonym [ec-bchb8a] [bchb8t] [encoding=ec] -\definefontsynonym [ec-bchbi8a] [bchbi8t] [encoding=ec] -\definefontsynonym [ec-bchr8a-slanted-167] [bchro8t] [encoding=ec] -\definefontsynonym [ec-bchb8a-slanted-167] [bchbo8t] [encoding=ec] -\definefontsynonym [ec-bchr8a-capitalized-800] [bchr8t] [encoding=ec] - -\stoptypescript - -% the following fonts are normally not present on tex live - -\starttypescript [adobekb,berry] [texnansi] - -\loadmapfile[texnansi-base.map] - -\definefontsynonym [texnansi-utmr8a] [ptmr8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmri8a] [ptmri8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmb8a] [ptmb8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmbi8a] [ptmbi8y] [encoding=texnansi] - -\definefontsynonym [texnansi-utmr8a-slanted-167] [ptmro8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmb8a-slanted-167] [ptmbo8y] [encoding=texnansi] - -\definefontsynonym [texnansi-uhvr8a] [phvr8y] [encoding=texnansi] -\definefontsynonym [texnansi-uhvro8a] [phvro8y] [encoding=texnansi] -\definefontsynonym [texnansi-uhvb8a] [phvb8y] [encoding=texnansi] -\definefontsynonym [texnansi-uhvbo8a] [phvbo8y] [encoding=texnansi] - -\definefontsynonym [texnansi-ucrr8a] [pcrr8y] [encoding=texnansi] -\definefontsynonym [texnansi-ucrb8a] [pcrb8y] [encoding=texnansi] -\definefontsynonym [texnansi-ucrro8a] [pcrro8y] [encoding=texnansi] -\definefontsynonym [texnansi-ucrbo8a] [pcrbo8y] [encoding=texnansi] - -\definefontsynonym [texnansi-uplr8a] [pplr8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplri8a] [pplri8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplb8a] [pplb8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplbi8a] [pplbi8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplr8a-slanted-167] [pplro8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplb8a-slanted-167] [pplbo8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplr8a-capitalized-800] [pplr8y] [encoding=texnansi] - -\definefontsynonym [texnansi-ubkl8a] [pbkl8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkli8a] [pbkli8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkd8a] [pbkd8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkdi8a] [pbkdi8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkl8a-slanted-167] [pbklo8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkd8a-slanted-167] [pbkdo8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkl8a-capitalized-800] [pbkl8y] [encoding=texnansi] - -\definefontsynonym [texnansi-uzcmi8a] [pzcmi8y] [encoding=texnansi] - -\definefontsynonym [texnansi-putr8a] [putr8y] [encoding=texnansi] -\definefontsynonym [texnansi-putri8a] [putri8y] [encoding=texnansi] -\definefontsynonym [texnansi-putb8a] [putr8y] [encoding=texnansi] -\definefontsynonym [texnansi-putbi8a] [putbi8y] [encoding=texnansi] -\definefontsynonym [texnansi-putr8a-slanted-167] [putro8y] [encoding=texnansi] -\definefontsynonym [texnansi-putb8a-slanted-167] [putbo8y] [encoding=texnansi] -\definefontsynonym [texnansi-putr8a-capitalized-800] [putr8y] [encoding=texnansi] - -\definefontsynonym [texnansi-bchr8a] [bchr8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchri8a] [bchri8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchb8a] [bchb8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchbi8a] [bchbi8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchr8a-slanted-167] [bchro8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchb8a-slanted-167] [bchbo8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchr8a-capitalized-800] [bchr8y] [encoding=texnansi] - -\stoptypescript - -\starttypescript [adobekb,berry] [t5] % there are no adobe metrics - -\loadmapfile[t5-base.map] - -\definefontsynonym [t5-utmr8a] [utmr8v] [encoding=t5] -\definefontsynonym [t5-utmri8a] [utmri8v] [encoding=t5] -\definefontsynonym [t5-utmb8a] [utmb8v] [encoding=t5] -\definefontsynonym [t5-utmbi8a] [utmbi8v] [encoding=t5] - -\definefontsynonym [t5-utmr8a-slanted-167] [utmro8v] [encoding=t5] -\definefontsynonym [t5-utmb8a-slanted-167] [utmbo8v] [encoding=t5] - -\definefontsynonym [t5-uhvr8a] [uhvr8v] [encoding=t5] -\definefontsynonym [t5-uhvro8a] [uhvro8v] [encoding=t5] -\definefontsynonym [t5-uhvb8a] [uhvb8v] [encoding=t5] -\definefontsynonym [t5-uhvbo8a] [uhvbo8v] [encoding=t5] - -\definefontsynonym [t5-ucrr8a] [ucrr8v] [encoding=t5] -\definefontsynonym [t5-ucrb8a] [ucrb8v] [encoding=t5] -\definefontsynonym [t5-ucrro8a] [ucrro8v] [encoding=t5] -\definefontsynonym [t5-ucrbo8a] [ucrbo8v] [encoding=t5] - -\definefontsynonym [t5-uplr8a] [uplr8v] [encoding=t5] -\definefontsynonym [t5-uplri8a] [uplri8v] [encoding=t5] -\definefontsynonym [t5-uplb8a] [uplb8v] [encoding=t5] -\definefontsynonym [t5-uplbi8a] [uplbi8v] [encoding=t5] -\definefontsynonym [t5-uplr8a-slanted-167] [uplro8v] [encoding=t5] -\definefontsynonym [t5-uplb8a-slanted-167] [uplbo8v] [encoding=t5] -\definefontsynonym [t5-uplr8a-capitalized-800] [uplr8v] [encoding=t5] - -\definefontsynonym [t5-ubkl8a] [ubkl8v] [encoding=t5] -\definefontsynonym [t5-ubkli8a] [ubkli8v] [encoding=t5] -\definefontsynonym [t5-ubkd8a] [ubkd8v] [encoding=t5] -\definefontsynonym [t5-ubkdi8a] [ubkdi8v] [encoding=t5] -\definefontsynonym [t5-ubkl8a-slanted-167] [ubklo8v] [encoding=t5] -\definefontsynonym [t5-ubkd8a-slanted-167] [ubkdo8v] [encoding=t5] -\definefontsynonym [t5-ubkl8a-capitalized-800] [ubkl8v] [encoding=t5] - -\stoptypescript - -\stoptypescriptcollection - -\endinput diff --git a/tex/context/base/type-dis.tex b/tex/context/base/type-dis.tex deleted file mode 100644 index 55bee181b..000000000 --- a/tex/context/base/type-dis.tex +++ /dev/null @@ -1,241 +0,0 @@ -%D \module -%D [ file=type-dis, -%D version=2005.01.26, % moved from type-enc.tex 2001.04.12, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Distribution scripts, -%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 The next section is obsolete. Although we prefer the original metrics -%D it seems that distributions no longer ship the u-variants, which means -%D that users (if they want) need to fall back to the p-variants. The usual -%D font mess. - -\endinput - -\starttypescriptcollection[distributed fonts] - -\starttypescript [berry] [8r] - -% \setupencoding[default=8r] - -\definefontsynonym [8r-utmr8a] [utmr8r] [encoding=8r] -\definefontsynonym [8r-utmri8a] [utmri8r] [encoding=8r] -\definefontsynonym [8r-utmb8a] [utmb8r] [encoding=8r] -\definefontsynonym [8r-utmbi8a] [utmbi8r] [encoding=8r] - -\definefontsynonym [8r-utmr8a-slanted-167] [utmro8r] [encoding=8r] -\definefontsynonym [8r-utmb8a-slanted-167] [utmbo8r] [encoding=8r] - -\definefontsynonym [8r-uhvr8a] [uhvr8r] [encoding=8r] -\definefontsynonym [8r-uhvro8a] [uhvro8r] [encoding=8r] -\definefontsynonym [8r-uhvb8a] [uhvb8r] [encoding=8r] -\definefontsynonym [8r-uhvbo8a] [uhvbo8r] [encoding=8r] - -\definefontsynonym [8r-ucrr8a] [ucrr8r] [encoding=8r] -\definefontsynonym [8r-ucrb8a] [ucrb8r] [encoding=8r] -\definefontsynonym [8r-ucrro8a] [ucrro8r] [encoding=8r] -\definefontsynonym [8r-ucrbo8a] [ucrbo8r] [encoding=8r] - -\definefontsynonym [8r-uplr8a] [uplr8r] [encoding=8r] -\definefontsynonym [8r-uplri8a] [uplri8r] [encoding=8r] -\definefontsynonym [8r-uplb8a] [uplb8r] [encoding=8r] -\definefontsynonym [8r-uplbi8a] [uplbi8r] [encoding=8r] -\definefontsynonym [8r-uplr8a-slanted-167] [uplro8r] [encoding=8r] -\definefontsynonym [8r-uplb8a-slanted-167] [uplbo8r] [encoding=8r] -\definefontsynonym [8r-uplr8a-capitalized-800] [uplr8r] [encoding=8r] - -\definefontsynonym [8r-ubkl8a] [ubkl8r] [encoding=8r] -\definefontsynonym [8r-ubkli8a] [ubkli8r] [encoding=8r] -\definefontsynonym [8r-ubkd8a] [ubkd8r] [encoding=8r] -\definefontsynonym [8r-ubkdi8a] [ubkdi8r] [encoding=8r] -\definefontsynonym [8r-ubkl8a-slanted-167] [ubklo8r] [encoding=8r] -\definefontsynonym [8r-ubkd8a-slanted-167] [ubkdo8r] [encoding=8r] -\definefontsynonym [8r-ubkl8a-capitalized-800] [ubkl8r] [encoding=8r] - -\definefontsynonym [8r-uzcmi8a] [uzcmi8r] [encoding=8r] - -\definefontsynonym [8r-putr8a] [putr8r] [encoding=8r] -\definefontsynonym [8r-putri8a] [putri8r] [encoding=8r] -\definefontsynonym [8r-putb8a] [putr8r] [encoding=8r] -\definefontsynonym [8r-putbi8a] [putbi8r] [encoding=8r] -\definefontsynonym [8r-putr8a-slanted-167] [putro8r] [encoding=8r] -\definefontsynonym [8r-putb8a-slanted-167] [putbo8r] [encoding=8r] -\definefontsynonym [8r-putr8a-capitalized-800] [putr8r] [encoding=8r] - -\definefontsynonym [8r-bchr8a] [bchr8r] [encoding=8r] -\definefontsynonym [8r-bchri8a] [bchri8r] [encoding=8r] -\definefontsynonym [8r-bchb8a] [bchb8r] [encoding=8r] -\definefontsynonym [8r-bchbi8a] [bchbi8r] [encoding=8r] -\definefontsynonym [8r-bchr8a-slanted-167] [bchro8r] [encoding=8r] -\definefontsynonym [8r-bchb8a-slanted-167] [bchbo8r] [encoding=8r] -\definefontsynonym [8r-bchr8a-capitalized-800] [bchr8r] [encoding=8r] - -\stoptypescript - -\starttypescript [berry] [ec] - -% \setupencoding[default=ec] - -\definefontsynonym [ec-utmr8a] [utmr8t] [encoding=ec] -\definefontsynonym [ec-utmri8a] [utmri8t] [encoding=ec] -\definefontsynonym [ec-utmb8a] [utmb8t] [encoding=ec] -\definefontsynonym [ec-utmbi8a] [utmbi8t] [encoding=ec] - -\definefontsynonym [ec-utmr8a-slanted-167] [utmro8t] [encoding=ec] -\definefontsynonym [ec-utmb8a-slanted-167] [utmbo8t] [encoding=ec] - -\definefontsynonym [ec-uhvr8a] [uhvr8t] [encoding=ec] -\definefontsynonym [ec-uhvro8a] [uhvro8t] [encoding=ec] -\definefontsynonym [ec-uhvb8a] [uhvb8t] [encoding=ec] -\definefontsynonym [ec-uhvbo8a] [uhvbo8t] [encoding=ec] - -\definefontsynonym [ec-ucrr8a] [ucrr8t] [encoding=ec] -\definefontsynonym [ec-ucrb8a] [ucrb8t] [encoding=ec] -\definefontsynonym [ec-ucrro8a] [ucrro8t] [encoding=ec] -\definefontsynonym [ec-ucrbo8a] [ucrbo8t] [encoding=ec] - -\definefontsynonym [ec-uplr8a] [uplr8t] [encoding=ec] -\definefontsynonym [ec-uplri8a] [uplri8t] [encoding=ec] -\definefontsynonym [ec-uplb8a] [uplb8t] [encoding=ec] -\definefontsynonym [ec-uplbi8a] [uplbi8t] [encoding=ec] -\definefontsynonym [ec-uplr8a-slanted-167] [uplro8t] [encoding=ec] -\definefontsynonym [ec-uplb8a-slanted-167] [uplbo8t] [encoding=ec] -\definefontsynonym [ec-uplr8a-capitalized-800] [uplr8t] [encoding=ec] - -\definefontsynonym [ec-ubkl8a] [ubkl8t] [encoding=ec] -\definefontsynonym [ec-ubkli8a] [ubkli8t] [encoding=ec] -\definefontsynonym [ec-ubkd8a] [ubkd8t] [encoding=ec] -\definefontsynonym [ec-ubkdi8a] [ubkdi8t] [encoding=ec] -\definefontsynonym [ec-ubkl8a-slanted-167] [ubklo8t] [encoding=ec] -\definefontsynonym [ec-ubkd8a-slanted-167] [ubkdo8t] [encoding=ec] -\definefontsynonym [ec-ubkl8a-capitalized-800] [ubkl8t] [encoding=ec] - -\definefontsynonym [ec-uzcmi8a] [uzcmi8t] [encoding=ec] - -\definefontsynonym [ec-putr8a] [putr8t] [encoding=ec] -\definefontsynonym [ec-putri8a] [putri8t] [encoding=ec] -\definefontsynonym [ec-putb8a] [putr8t] [encoding=ec] -\definefontsynonym [ec-putbi8a] [putbi8t] [encoding=ec] -\definefontsynonym [ec-putr8a-slanted-167] [putro8t] [encoding=ec] -\definefontsynonym [ec-putb8a-slanted-167] [putbo8t] [encoding=ec] -\definefontsynonym [ec-putr8a-capitalized-800] [putr8t] [encoding=ec] - -\definefontsynonym [ec-bchr8a] [bchr8t] [encoding=ec] -\definefontsynonym [ec-bchri8a] [bchri8t] [encoding=ec] -\definefontsynonym [ec-bchb8a] [bchb8t] [encoding=ec] -\definefontsynonym [ec-bchbi8a] [bchbi8t] [encoding=ec] -\definefontsynonym [ec-bchr8a-slanted-167] [bchro8t] [encoding=ec] -\definefontsynonym [ec-bchb8a-slanted-167] [bchbo8t] [encoding=ec] -\definefontsynonym [ec-bchr8a-capitalized-800] [bchr8t] [encoding=ec] - -\stoptypescript - -% the following fonts are normally not present on tex live - -\starttypescript [berry] [texnansi] - -% \setupencoding[default=texnansi] - -\definefontsynonym [texnansi-utmr8a] [utmr8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmri8a] [utmri8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmb8a] [utmb8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmbi8a] [utmbi8y] [encoding=texnansi] - -\definefontsynonym [texnansi-utmr8a-slanted-167] [ptmro8y] [encoding=texnansi] -\definefontsynonym [texnansi-utmb8a-slanted-167] [ptmbo8y] [encoding=texnansi] - -\definefontsynonym [texnansi-uhvr8a] [uhvr8y] [encoding=texnansi] -\definefontsynonym [texnansi-uhvro8a] [uhvro8y] [encoding=texnansi] -\definefontsynonym [texnansi-uhvb8a] [uhvb8y] [encoding=texnansi] -\definefontsynonym [texnansi-uhvbo8a] [uhvbo8y] [encoding=texnansi] - -\definefontsynonym [texnansi-ucrr8a] [pcrr8y] [encoding=texnansi] -\definefontsynonym [texnansi-ucrb8a] [pcrb8y] [encoding=texnansi] -\definefontsynonym [texnansi-ucrro8a] [pcrro8y] [encoding=texnansi] -\definefontsynonym [texnansi-ucrbo8a] [pcrbo8y] [encoding=texnansi] - -\definefontsynonym [texnansi-uplr8a] [uplr8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplri8a] [uplri8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplb8a] [uplb8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplbi8a] [uplbi8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplr8a-slanted-167] [uplro8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplb8a-slanted-167] [uplbo8y] [encoding=texnansi] -\definefontsynonym [texnansi-uplr8a-capitalized-800] [uplr8y] [encoding=texnansi] - -\definefontsynonym [texnansi-ubkl8a] [ubkl8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkli8a] [ubkli8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkd8a] [ubkd8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkdi8a] [ubkdi8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkl8a-slanted-167] [ubklo8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkd8a-slanted-167] [ubkdo8y] [encoding=texnansi] -\definefontsynonym [texnansi-ubkl8a-capitalized-800] [ubkl8y] [encoding=texnansi] - -\definefontsynonym [texnansi-uzcmi8a] [uzcmi8y] [encoding=texnansi] - -\definefontsynonym [texnansi-putr8a] [putr8y] [encoding=texnansi] -\definefontsynonym [texnansi-putri8a] [putri8y] [encoding=texnansi] -\definefontsynonym [texnansi-putb8a] [putr8y] [encoding=texnansi] -\definefontsynonym [texnansi-putbi8a] [putbi8y] [encoding=texnansi] -\definefontsynonym [texnansi-putr8a-slanted-167] [putro8y] [encoding=texnansi] -\definefontsynonym [texnansi-putb8a-slanted-167] [putbo8y] [encoding=texnansi] -\definefontsynonym [texnansi-putr8a-capitalized-800] [putr8y] [encoding=texnansi] - -\definefontsynonym [texnansi-bchr8a] [bchr8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchri8a] [bchri8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchb8a] [bchb8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchbi8a] [bchbi8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchr8a-slanted-167] [bchro8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchb8a-slanted-167] [bchbo8y] [encoding=texnansi] -\definefontsynonym [texnansi-bchr8a-capitalized-800] [bchr8y] [encoding=texnansi] - -\stoptypescript - -\starttypescript [berry] [t5] - -% \setupencoding[default=t5] - -\definefontsynonym [t5-utmr8a] [utmr8v] [encoding=t5] -\definefontsynonym [t5-utmri8a] [utmri8v] [encoding=t5] -\definefontsynonym [t5-utmb8a] [utmb8v] [encoding=t5] -\definefontsynonym [t5-utmbi8a] [utmbi8v] [encoding=t5] - -\definefontsynonym [t5-utmr8a-slanted-167] [utmro8v] [encoding=t5] -\definefontsynonym [t5-utmb8a-slanted-167] [utmbo8v] [encoding=t5] - -\definefontsynonym [t5-uhvr8a] [uhvr8v] [encoding=t5] -\definefontsynonym [t5-uhvro8a] [uhvro8v] [encoding=t5] -\definefontsynonym [t5-uhvb8a] [uhvb8v] [encoding=t5] -\definefontsynonym [t5-uhvbo8a] [uhvbo8v] [encoding=t5] - -\definefontsynonym [t5-ucrr8a] [ucrr8v] [encoding=t5] -\definefontsynonym [t5-ucrb8a] [ucrb8v] [encoding=t5] -\definefontsynonym [t5-ucrro8a] [ucrro8v] [encoding=t5] -\definefontsynonym [t5-ucrbo8a] [ucrbo8v] [encoding=t5] - -\definefontsynonym [t5-uplr8a] [uplr8v] [encoding=t5] -\definefontsynonym [t5-uplri8a] [uplri8v] [encoding=t5] -\definefontsynonym [t5-uplb8a] [uplb8v] [encoding=t5] -\definefontsynonym [t5-uplbi8a] [uplbi8v] [encoding=t5] -\definefontsynonym [t5-uplr8a-slanted-167] [uplro8v] [encoding=t5] -\definefontsynonym [t5-uplb8a-slanted-167] [uplbo8v] [encoding=t5] -\definefontsynonym [t5-uplr8a-capitalized-800] [uplr8v] [encoding=t5] - -\definefontsynonym [t5-ubkl8a] [ubkl8v] [encoding=t5] -\definefontsynonym [t5-ubkli8a] [ubkli8v] [encoding=t5] -\definefontsynonym [t5-ubkd8a] [ubkd8v] [encoding=t5] -\definefontsynonym [t5-ubkdi8a] [ubkdi8v] [encoding=t5] -\definefontsynonym [t5-ubkl8a-slanted-167] [ubklo8v] [encoding=t5] -\definefontsynonym [t5-ubkd8a-slanted-167] [ubkdo8v] [encoding=t5] -\definefontsynonym [t5-ubkl8a-capitalized-800] [ubkl8v] [encoding=t5] - -\stoptypescript - -\stoptypescriptcollection - -\endinput diff --git a/tex/context/base/type-enc.tex b/tex/context/base/type-enc.tex deleted file mode 100644 index d43f84326..000000000 --- a/tex/context/base/type-enc.tex +++ /dev/null @@ -1,1182 +0,0 @@ -%D \module -%D [ file=type-enc, -%D version=2001.04.12, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Encoding scripts, -%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. - -% texfont --ven=public --col=antt --enc=ec --sou=auto -% texfont --ven=public --col=antp --enc=ec --sou=auto -% texfont --ven=urw --col=palatino --enc=ec --sou=auto -% texfont --ven-lucas --col=sun --enc=ec --sou=. - -% \usetypescript [all] [modern] [texnansi] -% \setupbodyfont[reset] \setupbodyfont[cmr] -% \starttext \showfont[Serif] \stoptext - -% done: in type-dis.tex we remap the missing encoding-lm* files onto old metrics -% todo: we should consider handling qx in the same maner, remap qx-* in type-dis.tex -% todo: cyr fonts should be handled in the same way: t2b-lmr10 -> lbrm1000 - -\starttypescriptcollection[encodings] - -\starttypescript[all][modern,latin-modern][all] - - % fallbacks, no math in latin modern - - \definefontsynonym[lmff10] [cmff10] - \definefontsynonym[lmfi10] [cmfi10] - \definefontsynonym[lmfib8] [cmfib8] - \definefontsynonym[lmtex10] [cmtex10] - \definefontsynonym[lmtex8] [cmtex8] - \definefontsynonym[lmtex9] [cmtex9] - -\stoptypescript - -\starttypescript [serif] [modern,latin-modern] [texnansi,ec,qx,t5] - - \definefontsynonym [LMRoman10-DemiOblique] [\typescriptthree-lmbo10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Bold] [\typescriptthree-lmbx10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Bold] [\typescriptthree-lmbx12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman5-Bold] [\typescriptthree-lmbx5] [encoding=\typescriptthree] - \definefontsynonym [LMRoman6-Bold] [\typescriptthree-lmbx6] [encoding=\typescriptthree] - \definefontsynonym [LMRoman7-Bold] [\typescriptthree-lmbx7] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Bold] [\typescriptthree-lmbx8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Bold] [\typescriptthree-lmbx9] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-BoldItalic] [\typescriptthree-lmbxi10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-BoldOblique] [\typescriptthree-lmbxo10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-CapsRegular] [\typescriptthree-lmcsc10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-CapsOblique] [\typescriptthree-lmcsco10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Regular] [\typescriptthree-lmr10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Regular] [\typescriptthree-lmr12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman17-Regular] [\typescriptthree-lmr17] [encoding=\typescriptthree] - \definefontsynonym [LMRoman5-Regular] [\typescriptthree-lmr5] [encoding=\typescriptthree] - \definefontsynonym [LMRoman6-Regular] [\typescriptthree-lmr6] [encoding=\typescriptthree] - \definefontsynonym [LMRoman7-Regular] [\typescriptthree-lmr7] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Regular] [\typescriptthree-lmr8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Regular] [\typescriptthree-lmr9] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Italic] [\typescriptthree-lmri10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Italic] [\typescriptthree-lmri12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman7-Italic] [\typescriptthree-lmri7] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Italic] [\typescriptthree-lmri8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Italic] [\typescriptthree-lmri9] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Oblique] [\typescriptthree-lmro10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Oblique] [\typescriptthree-lmro12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman17-Oblique] [\typescriptthree-lmro17] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Oblique] [\typescriptthree-lmro8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Oblique] [\typescriptthree-lmro9] [encoding=\typescriptthree] - - \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic] [encoding=\typescriptthree] - \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [sans] [modern,latin-modern] [texnansi,ec,qx,t5] - - \definefontsynonym [LMSans10-Regular] [\typescriptthree-lmss10] [encoding=\typescriptthree] - \definefontsynonym [LMSans12-Regular] [\typescriptthree-lmss12] [encoding=\typescriptthree] - \definefontsynonym [LMSans17-Regular] [\typescriptthree-lmss17] [encoding=\typescriptthree] - \definefontsynonym [LMSans8-Regular] [\typescriptthree-lmss8] [encoding=\typescriptthree] - \definefontsynonym [LMSans9-Regular] [\typescriptthree-lmss9] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-BoldOblique] [\typescriptthree-lmssbo10] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-Bold] [\typescriptthree-lmssbx10] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-DemiCondensed] [\typescriptthree-lmssdc10] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-DemiCondensedOblique] [\typescriptthree-lmssdo10] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-Oblique] [\typescriptthree-lmsso10] [encoding=\typescriptthree] - \definefontsynonym [LMSans12-Oblique] [\typescriptthree-lmsso12] [encoding=\typescriptthree] - \definefontsynonym [LMSans17-Oblique] [\typescriptthree-lmsso17] [encoding=\typescriptthree] - \definefontsynonym [LMSans8-Oblique] [\typescriptthree-lmsso8] [encoding=\typescriptthree] - \definefontsynonym [LMSans9-Oblique] [\typescriptthree-lmsso9] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-Regular] [\typescriptthree-lmssq8] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-BoldOblique] [\typescriptthree-lmssqbo8] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-Bold] [\typescriptthree-lmssqbx8] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-Oblique] [\typescriptthree-lmssqo8] [encoding=\typescriptthree] - - \definefontsynonym [LMSans-Regular] [LMSans10-Regular] [encoding=\typescriptthree] - \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique] [encoding=\typescriptthree] - \definefontsynonym [LMSans-Bold] [LMSans10-Bold] [encoding=\typescriptthree] - \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed] [encoding=\typescriptthree] - \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique] [encoding=\typescriptthree] - \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] [texnansi,ec,qx,t5] - - \definefontsynonym [LMTypewriter10-CapsRegular] [\typescriptthree-lmtcsc10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-CapsOblique] [\typescriptthree-lmtcso10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Light] [\typescriptthree-lmtl10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-LightOblique] [\typescriptthree-lmtlo10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-LightCondensed] [\typescriptthree-lmtlc10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-LightCondensedOblique] [\typescriptthree-lmtlco10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Dark] [\typescriptthree-lmtk10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-DarkOblique] [\typescriptthree-lmtko10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Regular] [\typescriptthree-lmtt10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter12-Regular] [\typescriptthree-lmtt12] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter8-Regular] [\typescriptthree-lmtt8] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter9-Regular] [\typescriptthree-lmtt9] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Italic] [\typescriptthree-lmtti10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Oblique] [\typescriptthree-lmtto10] [encoding=\typescriptthree] - - \definefontsynonym [LMTypewriterVarWd10-Regular] [\typescriptthree-lmvtt10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-Oblique] [\typescriptthree-lmvtto10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-Light] [\typescriptthree-lmvtl10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-LightOblique] [\typescriptthree-lmvtlo10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-Dark] [\typescriptthree-lmvtk10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\typescriptthree-lmvtko10] [encoding=\typescriptthree] - - \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique][encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique] [encoding=\typescriptthree] - - \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [math] [modern,latin-modern] - - \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5] - \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7] - \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10] - \definefontsynonym [LMMathSymbols5-Italic] [lmsy5] - \definefontsynonym [LMMathSymbols6-Italic] [lmsy6] - \definefontsynonym [LMMathSymbols7-Italic] [lmsy7] - \definefontsynonym [LMMathSymbols8-Italic] [lmsy8] - \definefontsynonym [LMMathSymbols9-Italic] [lmsy9] - \definefontsynonym [LMMathSymbols10-Italic] [lmsy10] - \definefontsynonym [LMMathExtension10-Regular] [lmex10] - \definefontsynonym [LMMathItalic5-Italic] [lmmi5] - \definefontsynonym [LMMathItalic6-Italic] [lmmi6] - \definefontsynonym [LMMathItalic7-Italic] [lmmi7] - \definefontsynonym [LMMathItalic8-Italic] [lmmi8] - \definefontsynonym [LMMathItalic9-Italic] [lmmi9] - \definefontsynonym [LMMathItalic10-Italic] [lmmi10] - \definefontsynonym [LMMathItalic12-Italic] [lmmi12] - \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5] - \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7] - \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10] - - \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] - \definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic] - \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] - \definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic] - \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] - -\stoptypescript - -% todo: map these onto verbose names - -\starttypescript [serif] [modern,latin-modern,computer-modern] [texnansi,ec,qx,t5] - - \definefontsynonym [cmr5] [\typescriptthree-lmr5] [encoding=\typescriptthree] - \definefontsynonym [cmr6] [\typescriptthree-lmr6] [encoding=\typescriptthree] - \definefontsynonym [cmr7] [\typescriptthree-lmr7] [encoding=\typescriptthree] - \definefontsynonym [cmr8] [\typescriptthree-lmr8] [encoding=\typescriptthree] - \definefontsynonym [cmr9] [\typescriptthree-lmr9] [encoding=\typescriptthree] - \definefontsynonym [cmr10] [\typescriptthree-lmr10] [encoding=\typescriptthree] - \definefontsynonym [cmr12] [\typescriptthree-lmr12] [encoding=\typescriptthree] - \definefontsynonym [cmr17] [\typescriptthree-lmr17] [encoding=\typescriptthree] - - \definefontsynonym [cmbx5] [\typescriptthree-lmbx5] [encoding=\typescriptthree] - \definefontsynonym [cmbx6] [\typescriptthree-lmbx6] [encoding=\typescriptthree] - \definefontsynonym [cmbx7] [\typescriptthree-lmbx7] [encoding=\typescriptthree] - \definefontsynonym [cmbx8] [\typescriptthree-lmbx8] [encoding=\typescriptthree] - \definefontsynonym [cmbx9] [\typescriptthree-lmbx9] [encoding=\typescriptthree] - \definefontsynonym [cmbx10] [\typescriptthree-lmbx10] [encoding=\typescriptthree] - \definefontsynonym [cmbx12] [\typescriptthree-lmbx12] [encoding=\typescriptthree] - - \definefontsynonym [cmsl10] [\typescriptthree-lmro10] [encoding=\typescriptthree] - \definefontsynonym [cmsl12] [\typescriptthree-lmro12] [encoding=\typescriptthree] - \definefontsynonym [cmsl8] [\typescriptthree-lmro8] [encoding=\typescriptthree] - \definefontsynonym [cmsl9] [\typescriptthree-lmro9] [encoding=\typescriptthree] - - \definefontsynonym [cmti7] [\typescriptthree-lmri7] [encoding=\typescriptthree] - \definefontsynonym [cmti8] [\typescriptthree-lmri8] [encoding=\typescriptthree] - \definefontsynonym [cmti9] [\typescriptthree-lmri9] [encoding=\typescriptthree] - \definefontsynonym [cmti10] [\typescriptthree-lmri10] [encoding=\typescriptthree] - \definefontsynonym [cmti12] [\typescriptthree-lmri12] [encoding=\typescriptthree] - - \definefontsynonym [cmb10] [\typescriptthree-lmb10] [encoding=\typescriptthree] - \definefontsynonym [cmbsl10] [\typescriptthree-lmbo10] [encoding=\typescriptthree] - \definefontsynonym [cmbxsl10] [\typescriptthree-lmbxo10] [encoding=\typescriptthree] - \definefontsynonym [cmbxti10] [\typescriptthree-lmbxi10] [encoding=\typescriptthree] - - \definefontsynonym [cmcsc10] [\typescriptthree-lmcsc10] [encoding=\typescriptthree] - \definefontsynonym [cmcscsl10][\typescriptthree-lmcsco10] [encoding=\typescriptthree] - - \definefontsynonym [cmr12 ][rm-lmr12] % hack needed to fool math roman - \definefontsynonym [cmr10 ][rm-lmr10] % into not messing around with - \definefontsynonym [cmr9 ] [rm-lmr9] % encodings, probably no longer - \definefontsynonym [cmr8 ] [rm-lmr8] % needed now - \definefontsynonym [cmr7 ] [rm-lmr7] % - \definefontsynonym [cmr6 ] [rm-lmr6] % no space appended here, needs - \definefontsynonym [cmr5 ] [rm-lmr5] % some testing - -\stoptypescript - -\starttypescript [sans] [modern,latin-modern,computer-modern] [texnansi,ec,qx,t5] - - \definefontsynonym [cmss8] [\typescriptthree-lmss8] [encoding=\typescriptthree] - \definefontsynonym [cmss9] [\typescriptthree-lmss9] [encoding=\typescriptthree] - \definefontsynonym [cmss10] [\typescriptthree-lmss10] [encoding=\typescriptthree] - \definefontsynonym [cmss12] [\typescriptthree-lmss12] [encoding=\typescriptthree] - \definefontsynonym [cmss17] [\typescriptthree-lmss17] [encoding=\typescriptthree] - - \definefontsynonym [cmssi10] [\typescriptthree-lmsso10] [encoding=\typescriptthree] - \definefontsynonym [cmssi12] [\typescriptthree-lmsso12] [encoding=\typescriptthree] - \definefontsynonym [cmssi17] [\typescriptthree-lmsso17] [encoding=\typescriptthree] - \definefontsynonym [cmssi8] [\typescriptthree-lmsso8] [encoding=\typescriptthree] - \definefontsynonym [cmssi9] [\typescriptthree-lmsso9] [encoding=\typescriptthree] - - \definefontsynonym [cmssq8] [\typescriptthree-lmssq8] [encoding=\typescriptthree] - \definefontsynonym [cmssqb8] [\typescriptthree-lmssqbx8] [encoding=\typescriptthree] - \definefontsynonym [cmssqbi8] [\typescriptthree-lmssqbo8] [encoding=\typescriptthree] - \definefontsynonym [cmssqi8] [\typescriptthree-lmssqo8] [encoding=\typescriptthree] - - \definefontsynonym [cmssbx10] [\typescriptthree-lmssbx10] [encoding=\typescriptthree] - \definefontsynonym [cmssdc10] [\typescriptthree-lmssdc10] [encoding=\typescriptthree] - \definefontsynonym [cmssbi10] [\typescriptthree-lmssbo10] [encoding=\typescriptthree] - \definefontsynonym [cmssdi10] [\typescriptthree-lmssdo10] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [mono] [modern,latin-modern,computer-modern] [texnansi,ec,qx,t5] - - \definefontsynonym [cmtt8] [\typescriptthree-lmtt8] [encoding=\typescriptthree] - \definefontsynonym [cmtt9] [\typescriptthree-lmtt9] [encoding=\typescriptthree] - \definefontsynonym [cmtt10] [\typescriptthree-lmtt10] [encoding=\typescriptthree] - \definefontsynonym [cmtt12] [\typescriptthree-lmtt12] [encoding=\typescriptthree] - - \definefontsynonym [cmitt10] [\typescriptthree-lmtti10] [encoding=\typescriptthree] - \definefontsynonym [cmsltt10] [\typescriptthree-lmtto10] [encoding=\typescriptthree] - - \definefontsynonym [cmvtt10] [\typescriptthree-lmvtt10] [encoding=\typescriptthree] - \definefontsynonym [cmvtti10] [\typescriptthree-lmvtto] [encoding=\typescriptthree] - - \definefontsynonym [cmtcsc10] [\typescriptthree-lmtcsc10] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [math] [modern,latin-modern,computer-modern] - - \definefontsynonym [cmbsy5] [lmbsy5] - \definefontsynonym [cmbsy7] [lmbsy7] - \definefontsynonym [cmbsy10] [lmbsy10] - \definefontsynonym [cmsy5] [lmsy5] - \definefontsynonym [cmsy6] [lmsy6] - \definefontsynonym [cmsy7] [lmsy7] - \definefontsynonym [cmsy8] [lmsy8] - \definefontsynonym [cmsy9] [lmsy9] - \definefontsynonym [cmsy10] [lmsy10] - \definefontsynonym [cmex10] [lmex10] - \definefontsynonym [cmmi5] [lmmi5] - \definefontsynonym [cmmi6] [lmmi6] - \definefontsynonym [cmmi7] [lmmi7] - \definefontsynonym [cmmi8] [lmmi8] - \definefontsynonym [cmmi9] [lmmi9] - \definefontsynonym [cmmi10] [lmmi10] - \definefontsynonym [cmmi12] [lmmi12] - \definefontsynonym [cmmib5] [lmmib5] - \definefontsynonym [cmmib7] [lmmib7] - \definefontsynonym [cmmib10] [lmmib10] - -\stoptypescript - -%D {\em Comments by Victor Figurnov:} the wcmb10, wcmbx10, -%D \unknown\ fonts below are taken from the Paradissa -%D collection by Basil Malyshev. These fonts don't conform t2a -%D encoding but are in MS Windows Cyrillic codepage 1251 -%D encoding. These fonts contain only 33 russian letters in -%D upper and lower case, the number sign, and guillemots. But -%D even among these characters only the basic 32 russian -%D letters (in upper and lower case) will be typeset correctly -%D with this definition. The letters cyrillicYO and -%D cyrillicyo, as well as number sign (textnumero) and -%D guillemots won't be typeset properly, because these symbols -%D have different positions in t2a and MS CP1251 encodings. -%D -%D I think that the russian lh fonts and|/|or cm-super provide -%D better alternatives (type1). Therefore, the names below -%D match those of cm-super (\type {0NNN} instead of \type -%D {NNN}, i.e.\ four digit numbers). - -\starttypescript [serif] [computer-modern] [cyr] - \definefontsynonym [cmb10] [wcmb10] [encoding=t2a] - \definefontsynonym [cmbsy10] [wcmbsy10] [encoding=t2a] - \definefontsynonym [cmbx10] [wcmbx10] [encoding=t2a] - \definefontsynonym [cmbx12] [wcmbx12] [encoding=t2a] - \definefontsynonym [cmbx5] [wcmbx5] [encoding=t2a] - \definefontsynonym [cmbx6] [wcmbx6] [encoding=t2a] - \definefontsynonym [cmbx7] [wcmbx7] [encoding=t2a] - \definefontsynonym [cmbx8] [wcmbx8] [encoding=t2a] - \definefontsynonym [cmbx9] [wcmbx9] [encoding=t2a] - \definefontsynonym [cmbxsl10] [wcmbxsl10] [encoding=t2a] - \definefontsynonym [cmbxti10] [wcmbxti10] [encoding=t2a] - \definefontsynonym [cmcsc10] [wcmcsc10] [encoding=t2a] - %definefontsynonym [cmdunh10] [wcmdunh10] [encoding=t2a] - \definefontsynonym [cminch] [wcminch] [encoding=t2a] - \definefontsynonym [cmr10] [wcmr10] [encoding=t2a] - \definefontsynonym [cmr12] [wcmr12] [encoding=t2a] - \definefontsynonym [cmr17] [wcmr17] [encoding=t2a] - \definefontsynonym [cmr5] [wcmr5] [encoding=t2a] - \definefontsynonym [cmr6] [wcmr6] [encoding=t2a] - \definefontsynonym [cmr7] [wcmr7] [encoding=t2a] - \definefontsynonym [cmr8] [wcmr8] [encoding=t2a] - \definefontsynonym [cmr9] [wcmr9] [encoding=t2a] - \definefontsynonym [cmsl10] [wcmsl10] [encoding=t2a] - \definefontsynonym [cmsl12] [wcmsl12] [encoding=t2a] - \definefontsynonym [cmsl8] [wcmsl8] [encoding=t2a] - \definefontsynonym [cmsl9] [wcmsl9] [encoding=t2a] - \definefontsynonym [cmti10] [wcmti10] [encoding=t2a] - \definefontsynonym [cmti12] [wcmti12] [encoding=t2a] - \definefontsynonym [cmti7] [wcmti7] [encoding=t2a] - \definefontsynonym [cmti8] [wcmti8] [encoding=t2a] - \definefontsynonym [cmti9] [wcmti9] [encoding=t2a] - \definefontsynonym [cmu10] [wcmu10] [encoding=t2a] -\stoptypescript - -\starttypescript [sans] [computer-modern] [cyr] - \definefontsynonym [cmss10] [wcmss10] [encoding=t2a] - \definefontsynonym [cmss12] [wcmss12] [encoding=t2a] - \definefontsynonym [cmss17] [wcmss17] [encoding=t2a] - \definefontsynonym [cmss8] [wcmss8] [encoding=t2a] - \definefontsynonym [cmss9] [wcmss9] [encoding=t2a] - %definefontsynonym [cmssbi10] [wcmssbi10] [encoding=t2a] - \definefontsynonym [cmssbx10] [wcmssbx10] [encoding=t2a] - \definefontsynonym [cmssdc10] [wcmssdc10] [encoding=t2a] - \definefontsynonym [cmssi10] [wcmssi10] [encoding=t2a] - \definefontsynonym [cmssi12] [wcmssi12] [encoding=t2a] - \definefontsynonym [cmssi17] [wcmssi17] [encoding=t2a] - \definefontsynonym [cmssi8] [wcmssi8] [encoding=t2a] - \definefontsynonym [cmssi9] [wcmssi9] [encoding=t2a] - \definefontsynonym [cmssq8] [wcmssq8] [encoding=t2a] - \definefontsynonym [cmssqi8] [wcmssqi8] [encoding=t2a] -\stoptypescript - -\starttypescript [mono] [computer-modern] [cyr] - \definefontsynonym [cmitt10] [wcmitt10] [encoding=t2a] - \definefontsynonym [cmsltt10] [wcmsltt10] [encoding=t2a] - \definefontsynonym [cmtt10] [wcmtt10] [encoding=t2a] - \definefontsynonym [cmtt12] [wcmtt12] [encoding=t2a] - \definefontsynonym [cmtt8] [wcmtt8] [encoding=t2a] - \definefontsynonym [cmtt9] [wcmtt9] [encoding=t2a] - %definefontsynonym [cmvtt10] [wcmvtt10] [encoding=t2a] -\stoptypescript - -\definetypescriptprefix [c:t2a] [la] -\definetypescriptprefix [c:t2b] [lb] -\definetypescriptprefix [c:t2c] [lc] -\definetypescriptprefix [c:x2] [rx] - -\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [cmb10] [\typescriptprefix{c:\typescriptthree}rb1000] [encoding=\typescriptthree] - \definefontsynonym [cmbx10] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] - \definefontsynonym [cmbx12] [\typescriptprefix{c:\typescriptthree}bx1200] [encoding=\typescriptthree] - \definefontsynonym [cmbx5] [\typescriptprefix{c:\typescriptthree}bx0500] [encoding=\typescriptthree] - \definefontsynonym [cmbx6] [\typescriptprefix{c:\typescriptthree}bx0600] [encoding=\typescriptthree] - \definefontsynonym [cmbx7] [\typescriptprefix{c:\typescriptthree}bx0700] [encoding=\typescriptthree] - \definefontsynonym [cmbx8] [\typescriptprefix{c:\typescriptthree}bx0800] [encoding=\typescriptthree] - \definefontsynonym [cmbx9] [\typescriptprefix{c:\typescriptthree}bx0900] [encoding=\typescriptthree] - \definefontsynonym [cmbxsl10] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] - \definefontsynonym [cmbxti10] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] - \definefontsynonym [cmcsc10] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] - \definefontsynonym [cmdunh10] [\typescriptprefix{c:\typescriptthree}dh1000] [encoding=\typescriptthree] - \definefontsynonym [cmff10] [\typescriptprefix{c:\typescriptthree}ff1000] [encoding=\typescriptthree] - \definefontsynonym [cmfi10] [\typescriptprefix{c:\typescriptthree}fi1000] [encoding=\typescriptthree] - \definefontsynonym [cmfib8] [\typescriptprefix{c:\typescriptthree}fb0800] [encoding=\typescriptthree] - %\definefontsynonym [cminch] [\typescriptprefix{c:\typescriptthree}inch00] [encoding=\typescriptthree] - \definefontsynonym [cmr10] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] - \definefontsynonym [cmr12] [\typescriptprefix{c:\typescriptthree}rm1200] [encoding=\typescriptthree] - \definefontsynonym [cmr17] [\typescriptprefix{c:\typescriptthree}rm1700] [encoding=\typescriptthree] - \definefontsynonym [cmr5] [\typescriptprefix{c:\typescriptthree}rm0500] [encoding=\typescriptthree] - \definefontsynonym [cmr6] [\typescriptprefix{c:\typescriptthree}rm0600] [encoding=\typescriptthree] - \definefontsynonym [cmr7] [\typescriptprefix{c:\typescriptthree}rm0700] [encoding=\typescriptthree] - \definefontsynonym [cmr8] [\typescriptprefix{c:\typescriptthree}rm0800] [encoding=\typescriptthree] - \definefontsynonym [cmr9] [\typescriptprefix{c:\typescriptthree}rm0900] [encoding=\typescriptthree] - \definefontsynonym [cmsl10] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] - \definefontsynonym [cmsl12] [\typescriptprefix{c:\typescriptthree}sl1200] [encoding=\typescriptthree] - \definefontsynonym [cmsl8] [\typescriptprefix{c:\typescriptthree}sl0800] [encoding=\typescriptthree] - \definefontsynonym [cmsl9] [\typescriptprefix{c:\typescriptthree}sl0900] [encoding=\typescriptthree] - \definefontsynonym [cmtcsc10] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] - \definefontsynonym [cmti10] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] - \definefontsynonym [cmti12] [\typescriptprefix{c:\typescriptthree}ti1200] [encoding=\typescriptthree] - \definefontsynonym [cmti7] [\typescriptprefix{c:\typescriptthree}ti0700] [encoding=\typescriptthree] - \definefontsynonym [cmti8] [\typescriptprefix{c:\typescriptthree}ti0800] [encoding=\typescriptthree] - \definefontsynonym [cmti9] [\typescriptprefix{c:\typescriptthree}ti0900] [encoding=\typescriptthree] - \definefontsynonym [cmu10] [\typescriptprefix{c:\typescriptthree}ui1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [cmss10] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] - \definefontsynonym [cmss12] [\typescriptprefix{c:\typescriptthree}ss1200] [encoding=\typescriptthree] - \definefontsynonym [cmss17] [\typescriptprefix{c:\typescriptthree}ss1700] [encoding=\typescriptthree] - \definefontsynonym [cmss8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] - \definefontsynonym [cmss9] [\typescriptprefix{c:\typescriptthree}ss0900] [encoding=\typescriptthree] - \definefontsynonym [cmssbx10] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] - %\definefontsynonym [cmssdc10] [\typescriptprefix{c:\typescriptthree}ssdc1000] [encoding=\typescriptthree] - \definefontsynonym [cmssi10] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] - \definefontsynonym [cmssi12] [\typescriptprefix{c:\typescriptthree}si1200] [encoding=\typescriptthree] - \definefontsynonym [cmssi17] [\typescriptprefix{c:\typescriptthree}si1700] [encoding=\typescriptthree] - \definefontsynonym [cmssi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] - \definefontsynonym [cmssi9] [\typescriptprefix{c:\typescriptthree}si0900] [encoding=\typescriptthree] - \definefontsynonym [cmssq8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] - \definefontsynonym [cmssqi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [cmitt10] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] - \definefontsynonym [cmsltt10] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] - \definefontsynonym [cmtt10] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] - \definefontsynonym [cmtt12] [\typescriptprefix{c:\typescriptthree}tt1200] [encoding=\typescriptthree] - \definefontsynonym [cmtt8] [\typescriptprefix{c:\typescriptthree}tt0800] [encoding=\typescriptthree] - \definefontsynonym [cmtt9] [\typescriptprefix{c:\typescriptthree}tt0900] [encoding=\typescriptthree] - \definefontsynonym [cmvtt10] [\typescriptprefix{c:\typescriptthree}vt1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [serif] [computer-modern] [lcy] - \definefontsynonym [cmb10] [lhb10] [encoding=lcy] - \definefontsynonym [cmbx10] [lhbx10] [encoding=lcy] - \definefontsynonym [cmbx12] [lhbx12] [encoding=lcy] - \definefontsynonym [cmbx5] [lhbx5] [encoding=lcy] - \definefontsynonym [cmbx6] [lhbx6] [encoding=lcy] - \definefontsynonym [cmbx7] [lhbx7] [encoding=lcy] - \definefontsynonym [cmbx8] [lhbx8] [encoding=lcy] - \definefontsynonym [cmbx9] [lhbx9] [encoding=lcy] - \definefontsynonym [cmbxsl10] [lhbxsl10] [encoding=lcy] - \definefontsynonym [cmbxti10] [lhbxti10] [encoding=lcy] - \definefontsynonym [cmcsc10] [lhcsc10] [encoding=lcy] - \definefontsynonym [cmdunh10] [lhdunh10] [encoding=lcy] - \definefontsynonym [cmff10] [lhff10] [encoding=lcy] - \definefontsynonym [cmfi10] [lhfi10] [encoding=lcy] - \definefontsynonym [cmfib8] [lhfib8] [encoding=lcy] - \definefontsynonym [cminch] [lhinch] [encoding=lcy] - \definefontsynonym [cmr10] [lhr10] [encoding=lcy] - \definefontsynonym [cmr12] [lhr12] [encoding=lcy] - \definefontsynonym [cmr17] [lhr17] [encoding=lcy] - \definefontsynonym [cmr5] [lhr5] [encoding=lcy] - \definefontsynonym [cmr6] [lhr6] [encoding=lcy] - \definefontsynonym [cmr7] [lhr7] [encoding=lcy] - \definefontsynonym [cmr8] [lhr8] [encoding=lcy] - \definefontsynonym [cmr9] [lhr9] [encoding=lcy] - \definefontsynonym [cmsl10] [lhsl10] [encoding=lcy] - \definefontsynonym [cmsl12] [lhsl12] [encoding=lcy] - \definefontsynonym [cmsl8] [lhsl8] [encoding=lcy] - \definefontsynonym [cmsl9] [lhsl9] [encoding=lcy] - \definefontsynonym [cmtcsc10] [lhtcsc10] [encoding=lcy] - \definefontsynonym [cmtex10] [lhtex10] [encoding=lcy] - \definefontsynonym [cmtex8] [lhtex8] [encoding=lcy] - \definefontsynonym [cmtex9] [lhtex9] [encoding=lcy] - \definefontsynonym [cmti10] [lhti10] [encoding=lcy] - \definefontsynonym [cmti12] [lhti12] [encoding=lcy] - \definefontsynonym [cmti7] [lhti7] [encoding=lcy] - \definefontsynonym [cmti8] [lhti8] [encoding=lcy] - \definefontsynonym [cmti9] [lhti9] [encoding=lcy] - \definefontsynonym [cmu10] [lhu10] [encoding=lcy] -\stoptypescript - -\starttypescript [sans] [computer-modern] [lcy] - \definefontsynonym [cmss10] [lhss10] [encoding=lcy] - \definefontsynonym [cmss12] [lhss12] [encoding=lcy] - \definefontsynonym [cmss17] [lhss17] [encoding=lcy] - \definefontsynonym [cmss8] [lhss8] [encoding=lcy] - \definefontsynonym [cmss9] [lhss9] [encoding=lcy] - \definefontsynonym [cmssbi10] [lhssbi10] [encoding=lcy] - \definefontsynonym [cmssbx10] [lhssbx10] [encoding=lcy] - \definefontsynonym [cmssdc10] [lhssdc10] [encoding=lcy] - \definefontsynonym [cmssi10] [lhssi10] [encoding=lcy] - \definefontsynonym [cmssi12] [lhssi12] [encoding=lcy] - \definefontsynonym [cmssi17] [lhssi17] [encoding=lcy] - \definefontsynonym [cmssi8] [lhssi8] [encoding=lcy] - \definefontsynonym [cmssi9] [lhssi9] [encoding=lcy] - \definefontsynonym [cmssq8] [lhssq8] [encoding=lcy] - \definefontsynonym [cmssqi8] [lhssqi8] [encoding=lcy] -\stoptypescript - -\starttypescript [mono] [computer-modern] [lcy] - \definefontsynonym [cmitt10] [lhitt10] [encoding=lcy] - \definefontsynonym [cmsltt10] [lhsltt10] [encoding=lcy] - \definefontsynonym [cmtt10] [lhtt10] [encoding=lcy] - \definefontsynonym [cmtt12] [lhtt12] [encoding=lcy] - \definefontsynonym [cmtt8] [lhtt8] [encoding=lcy] - \definefontsynonym [cmtt9] [lhtt9] [encoding=lcy] - \definefontsynonym [cmvtt10] [lhvtt10] [encoding=lcy] -\stoptypescript - -\starttypescript [serif] [modern,computer-modern,latin-modern] [default] - \definefontsynonym [ComputerModern] [LMRoman-Regular] - \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic] - \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique] - \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold] - \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic] - \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique] - \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular] - \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique] -\stoptypescript - -\starttypescript [sans] [modern,computer-modern,latin-modern] % [default] - \definefontsynonym [ComputerModernSans] [LMSans-Regular] - \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique] - \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique] - \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold] - \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique] - \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique] - \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular] - \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique] -\stoptypescript - -\starttypescript [mono] [modern,computer-modern,latin-modern] % [default] - \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular] - \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic] - \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique] - \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark] - \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % ! - \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique] - \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular] - \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique] - \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular] -\stoptypescript - -\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] % [default] - \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular] - \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique] - \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique] - \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark] - \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular] - \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique] -\stoptypescript - -\starttypescript [math] [modern,computer-modern,latin-modern] % [default] - % watch the space, it prevents remapping - \definefontsynonym [ComputerModernMath-Roman] [lmr10 ] - \definefontsynonym [ComputerModernMath-Extension] [lmex10] - \definefontsynonym [ComputerModernMath-Italic] [lmmi10] - \definefontsynonym [ComputerModernMath-Symbol] [lmsy10] -\stoptypescript - -\starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] % [default] - % watch the space, it prevents remapping - \definefontsynonym [ComputerModernMath-Roman-Bold] [lmb10 ] - \definefontsynonym [ComputerModernMath-Extension] [lmex10] - \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10] - \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10] -\stoptypescript - -% Till we have cyrilic in lm: - -% \usetypescript[modern-base][t2a] -% \setupbodyfont[modern,10pt] - -\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [ComputerModern] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModern-Italic] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModern-Slanted] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModern-Bold] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModern-BoldItalic] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModern-BoldSlanted] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModern-Caps] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModern-CapsSlanted] [\typescriptprefix{c:\typescriptthree}sc1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [ComputerModernSans] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernSans-Italic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModernSans-Slanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModernSans-Bold] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernSans-BoldItalic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModernSans-BoldSlanted] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernSans-Caps] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernSans-CapsSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [ComputerModernMono] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModernMono-Italic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModernMono-Slanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernMono-Bold] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernMono-BoldItalic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernMono-BoldSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] - \definefontsynonym [ComputerModernMono-Caps] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] - %definefontsynonym [ComputerModernMono-CapsSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] -\stoptypescript - -% Computer Concrete (AMS) - -\starttypescript [serif] [concrete] [default] - \definefontsynonym [ComputerConcrete] [ccr10] - \definefontsynonym [ComputerConcrete-Italic] [ccti10] - \definefontsynonym [ComputerConcrete-Slanted] [ccsl10] - \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete] - \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic] - \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted] - \definefontsynonym [ComputerConcrete-Caps] [cccsc10] -\stoptypescript - -% Euler (AMS) - -\starttypescript [math] [euler] [default] - \definefontsynonym [Euler-Roman] [zeurm10] - \definefontsynonym [Euler-Extension] [zeuex10] - \definefontsynonym [Euler-Symbol] [zeusm10] - \definefontsynonym [Euler-Fraktur] [eufm10] -\stoptypescript - -\starttypescript [boldmath,bfmath] [euler] [default] - \definefontsynonym [Euler-Roman-Bold] [zeurb10] - \definefontsynonym [Euler-Extension] [zeuex10] - \definefontsynonym [Euler-Symbol-Bold] [zeusb10] - \definefontsynonym [Euler-Fraktur-Bold] [eufb10] -\stoptypescript - -% AMS (AMS) - -\starttypescript [math] [modern,computer-modern,latin-modern,ams] [default] - \definefontsynonym [AMS-SymbolA] [msam10] - \definefontsynonym [AMS-SymbolB] [msbm10] -\stoptypescript - -% Fourier (Utopia) - -\starttypescript [math] [fourier] [default,ec] - \definefontsynonym [Fourier-Math-Letters] [futr8t] [encoding=ec] - %\definefontsynonym [Fourier-Math-Letters] [futmi] - \definefontsynonym [Fourier-Math-Letters-Italic] [futmii] - \definefontsynonym [Fourier-Math-Symbols] [futsy] - \definefontsynonym [Fourier-Math-Extension] [fourier-mex] -\stoptypescript - -\starttypescript [serif] [fourier] [ec] - \definefontsynonym [Fourier-Regular] [futr8t] [encoding=ec] - \definefontsynonym [Fourier-Slanted] [futro8t] [encoding=ec] - \definefontsynonym [Fourier-Italic] [futri8t] [encoding=ec] - \definefontsynonym [Fourier-RegularCaps] [futrc8t] [encoding=ec] - \definefontsynonym [Fourier-Bold] [futb8t] [encoding=ec] - \definefontsynonym [Fourier-BoldSlanted] [futbo8t] [encoding=ec] - \definefontsynonym [Fourier-BoldItalic] [futbi8t] [encoding=ec] - \definefontsynonym [Fourier-BoldCaps] [futbc8t] [encoding=ec] - - \definefontsynonym [Fourier-Regular-Expert] [futr9e] [encoding=ec] - \definefontsynonym [Fourier-Slanted-Expert] [futro9e] [encoding=ec] - \definefontsynonym [Fourier-Italic-Expert] [futri9e] [encoding=ec] - \definefontsynonym [Fourier-RegularCaps-Expert] [futrc9e] [encoding=ec] - \definefontsynonym [Fourier-Semi-Expert] [futs9e] [encoding=ec] - \definefontsynonym [Fourier-SemiSlanted-Expert] [futso9e] [encoding=ec] - \definefontsynonym [Fourier-SemiItalic-Expert] [futsi9e] [encoding=ec] - \definefontsynonym [Fourier-SemiCaps-Expert] [futsc9e] [encoding=ec] - \definefontsynonym [Fourier-Bold-Expert] [futb9e] [encoding=ec] - \definefontsynonym [Fourier-BoldSlanted-Expert] [futbo9e] [encoding=ec] - \definefontsynonym [Fourier-BoldItalic-Expert] [futbi9e] [encoding=ec] - \definefontsynonym [Fourier-Black-Expert] [futc9e] [encoding=ec] - - \definefontsynonym [Fourier-Regular-OldStyle] [futr9d] [encoding=ec] - \definefontsynonym [Fourier-Slanted-OldStyle] [futro9d] [encoding=ec] - \definefontsynonym [Fourier-Italic-OldStyle] [futri9d] [encoding=ec] - \definefontsynonym [Fourier-RegularCaps-OldStyle] [futrc9d] [encoding=ec] - \definefontsynonym [Fourier-Semi-OldStyle] [futs9d] [encoding=ec] - \definefontsynonym [Fourier-SemiSlanted-OldStyle] [futso9d] [encoding=ec] - \definefontsynonym [Fourier-SemiItalic-OldStyle] [futsi9d] [encoding=ec] - \definefontsynonym [Fourier-SemiCaps-OldStyle] [futsc9d] [encoding=ec] - \definefontsynonym [Fourier-Bold-OldStyle] [futb9d] [encoding=ec] - \definefontsynonym [Fourier-BoldSlanted-OldStyle] [futbo9d] [encoding=ec] - \definefontsynonym [Fourier-BoldItalic-OldStyle] [futbi9d] [encoding=ec] - \definefontsynonym [Fourier-Black-OldStyle] [futc9d] [encoding=ec] -\stoptypescript - -% Courier (URW) - -\starttypescript [mono] [courier] [texnansi,ec,8r,t5] - \definefontsynonym [Courier] [\typescriptthree-ucrr8a] [encoding=\typescriptthree] - \definefontsynonym [Courier-Bold] [\typescriptthree-ucrb8a] [encoding=\typescriptthree] - \definefontsynonym [Courier-Oblique] [\typescriptthree-ucrro8a] [encoding=\typescriptthree] - \definefontsynonym [Courier-BoldOblique] [\typescriptthree-ucrbo8a] [encoding=\typescriptthree] -\stoptypescript - -% alternative 1 -% -% \definefontsynonym[qx-ucrr8a] [qcrr] -% \definefontsynonym[qx-ucrb8a] [qcrb] -% \definefontsynonym[qx-ucrr08a] [qcrri] -% \definefontsynonym[qx-ucrbo8a] [qcrbi] -% -% alternative 2 - -\starttypescript [mono] [courier] [qx] - \definefontsynonym [Courier] [qcrr] [encoding=qx] - \definefontsynonym [Courier-Bold] [qcrb] [encoding=qx] - \definefontsynonym [Courier-Oblique] [qcrri] [encoding=qx] - \definefontsynonym [Courier-BoldOblique] [qcrbi] [encoding=qx] -\stoptypescript - -% Helvetica (URW) - -\starttypescript [sans] [helvetica] [texnansi,ec,8r,t5] - \definefontsynonym [Helvetica] [\typescriptthree-uhvr8a] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-Italic] [\typescriptthree-uhvri8a] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-Oblique] [\typescriptthree-uhvro8a] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-Bold] [\typescriptthree-uhvb8a] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-BoldItalic] [\typescriptthree-uhvbi8a] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-BoldOblique] [\typescriptthree-uhvbo8a] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [sans] [helvetica] [qx] % narrow - \definefontsynonym [Helvetica] [qhvr] [encoding=qx] % qhvcr - \definefontsynonym [Helvetica-Italic] [qhvri] [encoding=qx] % qhvcri - \definefontsynonym [Helvetica-Oblique] [qhvri] [encoding=qx] % qhvcri - \definefontsynonym [Helvetica-Bold] [qhvb] [encoding=qx] % qhvcb - \definefontsynonym [Helvetica-BoldItalic] [qhvbi] [encoding=qx] % qhvcbi - \definefontsynonym [Helvetica-BoldOblique] [qhvbi] [encoding=qx] % qhvcbi -\stoptypescript - -% Times Roman (URW) - -\starttypescript [serif] [times] [texnansi,ec,8r,t5] - \definefontsynonym [Times-Roman] [\typescriptthree-utmr8a] [encoding=\typescriptthree] - \definefontsynonym [Times-Italic] [\typescriptthree-utmri8a] [encoding=\typescriptthree] - \definefontsynonym [Times-Bold] [\typescriptthree-utmb8a] [encoding=\typescriptthree] - \definefontsynonym [Times-BoldItalic] [\typescriptthree-utmbi8a] [encoding=\typescriptthree] - - \definefontsynonym [Times-Slanted] [\typescriptthree-utmr8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Times-BoldSlanted] [\typescriptthree-utmb8a-slanted-167] [encoding=\typescriptthree] - - \definefontsynonym [Times] [Times-Roman] -\stoptypescript - -\starttypescript [serif] [times] [qx] - \definefontsynonym [Times-Roman] [qtmr] [encoding=qx] - \definefontsynonym [Times-Italic] [qtmri] [encoding=qx] - \definefontsynonym [Times-Bold] [qtmb] [encoding=qx] - \definefontsynonym [Times-BoldItalic] [qtmbi] [encoding=qx] - - \definefontsynonym [Times-Slanted] [Times-Italic] - \definefontsynonym [Times-BoldSlanted] [Times-BoldItalic] - - \definefontsynonym [Times] [Times-Roman] -\stoptypescript - -% Math Times (tx) - -\starttypescript [math] [times] [all] - \definefontsynonym [Times-Roman-Upright] [txr] - \definefontsynonym [Times-Roman-Italic] [txi] - \definefontsynonym [Times-Roman-Slanted] [txsl] - \definefontsynonym [Times-Roman-Caps] [txsc] - \definefontsynonym [Times-Companion-Upright] [tcxr] - \definefontsynonym [Times-Companion-Italic] [tcxi] - \definefontsynonym [Times-Companion-Slanted] [tcxsl] - \definefontsynonym [Times-Math-Italic] [txmi] - \definefontsynonym [Times-Math-Symbols] [txsy] - \definefontsynonym [Times-Math-Extension] [txex] - \definefontsynonym [Times-Math-SymbolsA] [txsya] - \definefontsynonym [Times-Math-SymbolsB] [txsyb] - \definefontsynonym [Times-Math-SymbolsC] [txsyc] - \definefontsynonym [Times-Math-Italic-A] [txmia] - \definefontsynonym [Times-Math-Extension-A] [txexa] -\stoptypescript - -% Antykwa Torunska (GUST) - -% \starttypescript [serif] [antykwa-torunska] [texnansi,ec,8r] -% \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] -% \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] -% \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] -% \stoptypescript - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec,t2a,t2b,t2c,greek] - \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalic] [\typescriptthree-anttbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Light] [\typescriptthree-anttl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalic] [\typescriptthree-anttli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Medium] [\typescriptthree-anttm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalic] [\typescriptthree-anttmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBold] [\typescriptthree-anttcb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalic] [\typescriptthree-anttcbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLight] [\typescriptthree-anttcl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalic][\typescriptthree-anttcli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedium] [\typescriptthree-anttcm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalic] [\typescriptthree-anttcmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondRegular] [\typescriptthree-anttcr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalic] [\typescriptthree-anttcri] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec] - \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttbcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttlcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttlicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttmcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttrcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttricap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcbcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttclcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttclicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcmcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcrcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcricap] [encoding=\typescriptthree] -\stoptypescript - -% duplicates ? ? -% atl: no: fallbacks for the named variants - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c,greek] - \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c] - \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] -\stoptypescript - -% mabye no -Regular etc -% dunny reverse of condlight lightcond - -\starttypescript [math] [antykwa-torunska] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr] - \definefontsynonym [AntykwaTorunska-Math-Letters-RegularItalic] [mi-anttri] - \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz] - \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-light] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl] - \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli] - \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz] - \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-cond] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegularItalic] [mi-anttcri] - \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz] - \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-lightcond] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli] - \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz] - \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl] -\stoptypescript - -% Antykwa Poltawskiego (GUST) - -\starttypescript [serif] [antykwa-poltawskiego] [texnansi,ec,8r] - \definefontsynonym [AntykwaPoltawskiego-Regular] [\typescriptthree-antpr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaPoltawskiego-Bold] [\typescriptthree-antpb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaPoltawskiego-Italic] [\typescriptthree-antpri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\typescriptthree-antpbi] [encoding=\typescriptthree] -\stoptypescript - -% Iwona (JMN) - -% maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic - -\starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond] [texnansi,ec,el,qx,t5] - \definefontsynonym[Iwona-Light] [\typescriptthree-iwonal] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Regular] [\typescriptthree-iwonar] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Medium] [\typescriptthree-iwonam] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Bold] [\typescriptthree-iwonab] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Heavy] [\typescriptthree-iwonah] [encoding=\typescriptthree] - \definefontsynonym[Iwona-LightItalic] [\typescriptthree-iwonali] [encoding=\typescriptthree] - \definefontsynonym[Iwona-RegularItalic] [\typescriptthree-iwonari] [encoding=\typescriptthree] - \definefontsynonym[Iwona-MediumItalic] [\typescriptthree-iwonami] [encoding=\typescriptthree] - \definefontsynonym[Iwona-BoldItalic] [\typescriptthree-iwonabi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-HeavyItalic] [\typescriptthree-iwonahi] [encoding=\typescriptthree] - - \definefontsynonym[Iwona-CapsLight] [\typescriptthree-iwonalcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsRegular] [\typescriptthree-iwonarcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsMedium] [\typescriptthree-iwonamcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsBold] [\typescriptthree-iwonabcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsHeavy] [\typescriptthree-iwonahcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsLightItalic] [\typescriptthree-iwonalicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsRegularItalic] [\typescriptthree-iwonaricap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsMediumItalic] [\typescriptthree-iwonamicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsBoldItalic] [\typescriptthree-iwonabicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsHeavyItalic] [\typescriptthree-iwonahicap] [encoding=\typescriptthree] - - \definefontsynonym[Iwona-CondLight] [\typescriptthree-iwonacl] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondRegular] [\typescriptthree-iwonacr] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondMedium] [\typescriptthree-iwonacm] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondBold] [\typescriptthree-iwonacb] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondHeavy] [\typescriptthree-iwonach] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondLightItalic] [\typescriptthree-iwonacli] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondRegularItalic] [\typescriptthree-iwonacri] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondMediumItalic] [\typescriptthree-iwonacmi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondBoldItalic] [\typescriptthree-iwonacbi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondHeavyItalic] [\typescriptthree-iwonachi] [encoding=\typescriptthree] - - \definefontsynonym[Iwona-CondCapsLight] [\typescriptthree-iwonaclcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsRegular] [\typescriptthree-iwonacrcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsMedium] [\typescriptthree-iwonacmcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsBold] [\typescriptthree-iwonacbcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsHeavy] [\typescriptthree-iwonachcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsLightItalic] [\typescriptthree-iwonaclicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsRegularItalic] [\typescriptthree-iwonacricap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsMediumItalic] [\typescriptthree-iwonacmicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsBoldItalic] [\typescriptthree-iwonacbicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondCapsHeavyItalic] [\typescriptthree-iwonachicap] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [math] [iwona] [default] - \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar] - \definefontsynonym [Iwona-Math-Letters-RegularItalic] [mi-iwonari] - \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz] - \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar] -\stoptypescript - -\starttypescript [math] [iwona-light] [default] - \definefontsynonym [Iwona-Math-Letters-Light] [rm-iwonal] - \definefontsynonym [Iwona-Math-Letters-LightItalic] [mi-iwonali] - \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz] - \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal] -\stoptypescript - -\starttypescript [math] [iwona-medium] [default] - \definefontsynonym [Iwona-Math-Letters-Medium] [rm-iwonam] - \definefontsynonym [Iwona-Math-Letters-MediumItalic] [mi-iwonami] - \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz] - \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam] -\stoptypescript - -\starttypescript [math] [iwona-heavy] [default] - \definefontsynonym [Iwona-Math-Letters-Heavy] [rm-iwonah] - \definefontsynonym [Iwona-Math-Letters-HeavyItalic] [mi-iwonahi] - \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz] - \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah] -\stoptypescript - -% Kurier (JMN) - -\starttypescript [sans] [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5] - \definefontsynonym[Kurier-Light] [\typescriptthree-kurierl] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Regular] [\typescriptthree-kurierr] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Medium] [\typescriptthree-kurierm] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Bold] [\typescriptthree-kurierb] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Heavy] [\typescriptthree-kurierh] [encoding=\typescriptthree] - \definefontsynonym[Kurier-LightItalic] [\typescriptthree-kurierli] [encoding=\typescriptthree] - \definefontsynonym[Kurier-RegularItalic] [\typescriptthree-kurierri] [encoding=\typescriptthree] - \definefontsynonym[Kurier-MediumItalic] [\typescriptthree-kuriermi] [encoding=\typescriptthree] - \definefontsynonym[Kurier-BoldItalic] [\typescriptthree-kurierbi] [encoding=\typescriptthree] - \definefontsynonym[Kurier-HeavyItalic] [\typescriptthree-kurierhi] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [math] [kurier] [default] - \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr] - \definefontsynonym [Kurier-Math-Letters-RegularItalic] [mi-kurierri] - \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz] - \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr] -\stoptypescript - -\starttypescript [math] [kurier-light] [default] - \definefontsynonym [Kurier-Math-Letters-Light] [rm-kurierl] - \definefontsynonym [Kurier-Math-Letters-LightItalic] [mi-kurierli] - \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz] - \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl] -\stoptypescript - -\starttypescript [math] [kurier-medium] [default] - \definefontsynonym [Kurier-Math-Letters-Medium] [rm-kurierm] - \definefontsynonym [Kurier-Math-Letters-MediumItalic] [mi-kuriermi] - \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz] - \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm] -\stoptypescript - -% Palatino (URW) - -\starttypescript [serif] [palatino] [texnansi,ec,8r,t5] - \definefontsynonym [Palatino] [\typescriptthree-uplr8a] [encoding=\typescriptthree] - \definefontsynonym [Palatino-Italic] [\typescriptthree-uplri8a] [encoding=\typescriptthree] - \definefontsynonym [Palatino-Bold] [\typescriptthree-uplb8a] [encoding=\typescriptthree] - \definefontsynonym [Palatino-BoldItalic] [\typescriptthree-uplbi8a] [encoding=\typescriptthree] - - \definefontsynonym [Palatino-Slanted] [\typescriptthree-uplr8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Palatino-BoldSlanted] [\typescriptthree-uplb8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Palatino-Caps] [\typescriptthree-uplr8a-capitalized-800] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [serif] [palatino] [qx] - \definefontsynonym [Palatino] [qplr] [encoding=qx] - \definefontsynonym [Palatino-Italic] [qplri] [encoding=qx] - \definefontsynonym [Palatino-Bold] [qplb] [encoding=qx] - \definefontsynonym [Palatino-BoldItalic] [qplbi] [encoding=qx] - - \definefontsynonym [Palatino-Slanted] [Palatino-Italic] - \definefontsynonym [Palatino-BoldSlanted] [Palatino-BoldItalic] - \definefontsynonym [Palatino-Caps] [Palatino] -\stoptypescript - -% bonus definitions - -% when these fonts are in tex live ... -% -% \definefontsynonym [Palatino-Caps] [TeXPalladioL-SC] [encoding=\typescriptthree] - -\starttypescript [serif] [palatino] [ec,texnansi,8r] - - \definefontsynonym[TeXPalladioL-BoldItalicOsF][\typescriptthree-fplbij8a][encoding=\typescriptthree] - \definefontsynonym[TeXPalladioL-BoldOsF] [\typescriptthree-fplbj8a] [encoding=\typescriptthree] - \definefontsynonym[TeXPalladioL-SC] [\typescriptthree-fplrc8a] [encoding=\typescriptthree] - \definefontsynonym[TeXPalladioL-ItalicOsF] [\typescriptthree-fplrij8a][encoding=\typescriptthree] - -\stoptypescript - -% Palatino Math (PX) - -\starttypescript [math] [palatino] [all] - \definefontsynonym [Palatino-Roman-Upright] [pxr] - \definefontsynonym [Palatino-Roman-Italic] [pxi] - \definefontsynonym [Palatino-Roman-Slanted] [pxsl] - \definefontsynonym [Palatino-Roman-Caps] [pxsc] - \definefontsynonym [Palatino-Companion-Upright] [pcxr] - \definefontsynonym [Palatino-Companion-Italic] [pcxi] - \definefontsynonym [Palatino-Companion-Slanted] [pcxsl] - \definefontsynonym [Palatino-Math-Italic] [pxmi] - \definefontsynonym [Palatino-Math-Symbols] [pxsy] - \definefontsynonym [Palatino-Math-Extension] [pxex] - \definefontsynonym [Palatino-Math-SymbolsA] [pxsya] - \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb] - \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc] - \definefontsynonym [Palatino-Math-Italic-A] [pxmia] - \definefontsynonym [Palatino-Math-Extension-A] [pxexa] -\stoptypescript - -% Bookman (URW) - -\starttypescript [serif] [bookman] [ec,texnansi,8r,t5] - \definefontsynonym [Bookman-Light] [\typescriptthree-ubkl8a] [encoding=\typescriptthree] - \definefontsynonym [Bookman-LightItalic] [\typescriptthree-ubkli8a] [encoding=\typescriptthree] - \definefontsynonym [Bookman-DemiBold] [\typescriptthree-ubkd8a] [encoding=\typescriptthree] - \definefontsynonym [Bookman-DemiBoldItalic] [\typescriptthree-ubkdi8a] [encoding=\typescriptthree] - \definefontsynonym [Bookman-LightSlanted] [\typescriptthree-ubkl8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Bookman-DemiBoldSlanted] [\typescriptthree-ubkd8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Bookman-Light-Caps] [\typescriptthree-ubkl8a-capitalized-800] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [serif] [bookman] [qx] - \definefontsynonym [Bookman-Light] [qbkr] [encoding=qx] - \definefontsynonym [Bookman-LightItalic] [qbkri] [encoding=qx] - \definefontsynonym [Bookman-DemiBold] [qbkb] [encoding=qx] - \definefontsynonym [Bookman-DemiBoldItalic] [qbkbi] [encoding=qx] - - \definefontsynonym [Bookman-LightSlanted] [Bookman-LightItalic] - \definefontsynonym [Bookman-DemiBoldSlanted] [Bookman-DemiBoldItalic] - \definefontsynonym [Bookman-Light-Caps] [Bookman-Light] -\stoptypescript - -% Chancery (URW) - -\starttypescript [calligraphy] [chancery] [ec,texnansi,8r] - \definefontsynonym [Chancery] [\typescriptthree-uzcmi8a] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [calligraphy] [chancery] [qx] - \definefontsynonym [Chancery] [qzcmi] [encoding=qx] -\stoptypescript - -% New Century Schoolbook (URW) - -\starttypescript [serif] [schoolbook] [ec,texnansi,8r,t5] - \definefontsynonym [Schoolbook-Roman] [\typescriptthree-uncr8a] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-Italic] [\typescriptthree-uncri8a] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-Bold] [\typescriptthree-uncb8a] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-BoldItalic] [\typescriptthree-uncbi8a] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-RomanSlanted] [\typescriptthree-uncr8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-BoldSlanted] [\typescriptthree-uncb8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-Roman-Caps] [\typescriptthree-uncr8a-capitalized-800] [encoding=\typescriptthree] -\stoptypescript - -% Utopia (Adobe) - -\starttypescript [serif] [utopia] [ec,texnansi] - \definefontsynonym [Utopia-Regular] [\typescriptthree-putr8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Italic] [\typescriptthree-putri8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Bold] [\typescriptthree-putb8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-BoldItalic] [\typescriptthree-putbi8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Slanted] [\typescriptthree-putr8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Utopia-BoldSlanted] [\typescriptthree-putb8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Regular-Caps][\typescriptthree-putr8a-capitalized-800] [encoding=\typescriptthree] -\stoptypescript - -% Charter (Bitstream) - -\starttypescript [serif] [charter] [ec,texnansi,8r] - \definefontsynonym [Charter-Roman] [\typescriptthree-bchr8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-Italic] [\typescriptthree-bchri8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-Bold] [\typescriptthree-bchb8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-BoldItalic] [\typescriptthree-bchbi8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-Slanted] [\typescriptthree-bchr8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Charter-BoldSlanted][\typescriptthree-bchb8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Charter-Roman-Caps] [\typescriptthree-bchr8a-capitalized-800] [encoding=\typescriptthree] -\stoptypescript - -% Whatever else we need: - -\starttypescript - \definefontsynonym [ZapfDingbats] [uzdr] - \definefontsynonym [RalfSmithFormalScript] [rsfs10] - \definefontsynonym [MartinVogel] [fmvr8x] -\stoptypescript - -\stoptypescriptcollection - -\endinput diff --git a/tex/context/base/type-exa.tex b/tex/context/base/type-exa.tex deleted file mode 100644 index 29f882f02..000000000 --- a/tex/context/base/type-exa.tex +++ /dev/null @@ -1,27 +0,0 @@ -%D \module -%D [ file=type-exa, -%D version=2001.04.12, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Example scripts, -%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 The examples are moved to \type {type-one}, \type {type-otf} and -%D \type {type-buy}. - -\starttypescript [fallback,modern,modern-base] [il2] - \usetypescript[\typescriptone][ec] - \enableregime[il2] -\stoptypescript - -\starttypescript [fallback,modern,modern-base] [pl0] - \usetypescript[\typescriptone][qx] - \enableregime[pl0] -\stoptypescript - -\endinput diff --git a/tex/context/base/type-ini.mkii b/tex/context/base/type-ini.mkii index fa7b7934f..9372f8dc3 100644 --- a/tex/context/base/type-ini.mkii +++ b/tex/context/base/type-ini.mkii @@ -84,8 +84,7 @@ \usetypescriptfile[\f!typeprefix xtx] \else \usetypescriptfile[\f!typeprefix one] - %usetypescriptfile[\f!typeprefix gyr] % to be merged into one - \usetypescriptfile[\f!typeprefix akb] % will go away when gyre is merged + %usetypescriptfile[\f!typeprefix akb] % we have gyre now \fi \usetypescriptfile[\f!typeprefix loc] @@ -591,10 +590,6 @@ % we can use \rawgetparameters or \rawgeteparameters -\ifx\mkdodefinetypeface\undefined - \let\mkdodefinetypeface\gobblefivearguments -\fi - \def\dodefinetypeface[#1][#2][#3][#4][#5][#6]% {\dododefinetypeface[#1][#2]% \iffifthargument % sixth is optional @@ -736,7 +731,7 @@ \the\scratchtoks \fi} -\fetchruntimecommand \typetypescript {\f!typeprefix\s!run} +\fetchruntimecommand \typetypescript {\f!typeprefix\s!run.mkii} % \usetypescript [berry] [ec] diff --git a/tex/context/base/type-ini.mkiv b/tex/context/base/type-ini.mkiv index 42c45bdaa..bffc220fa 100644 --- a/tex/context/base/type-ini.mkiv +++ b/tex/context/base/type-ini.mkiv @@ -201,75 +201,6 @@ \setfalse\quittingtypescript \fi} -% % not faster, unless maybe toks -% -% \newcount\nofloadedtypescripts -% -% \def\startloadedtypescript -% {\dotripleempty\dostartloadedtypescript} -% -% \let\stoploadedtypescript\relax -% -% \long\def\dostartloadedtypescript[#1][#2][#3]#4\stoptypescript -% {\global\advance\nofloadedtypescripts\plusone -% \long\setgvalue{\??ts=>\the\nofloadedtypescripts}{#4}% -% \edef\temp% -% {\iffirstargument [#1]\fi -% \ifsecondargument[#2]\fi -% \ifthirdargument [#3]\fi -% \noexpand\csname\??ts=>\the\nofloadedtypescripts\noexpand\endcsname}% -% \global\loadedtypescripts\@EA\@EA\@EA{\@EA\the\@EA\loadedtypescripts\@EA\starttypescript\temp\stoptypescript}} -% -% \def\startloadedtypescriptcollection -% {\dosingleempty\dostartloadedtypescriptcollection} -% -% \def\dostartloadedtypescriptcollection[#1]{} -% \def\stoploadedtypescriptcollection {} -% -% \def\dododousetypescript#1% -% {\setfalse\quittingtypescript -% \pushmacro\currenttypefile -% \def\currenttypefile{#1}% -% \ifconditional\preloadingtypescripts -% % load files once, and use saved data -% \def\loadedtypescripts{\csname\??ts:\c!file:#1\endcsname}% -% \@EAEAEA\ifx\loadedtypescripts\relax -% \@EAEAEA\newtoks\loadedtypescripts -% \bgroup -% % -% \let\starttypescript \startloadedtypescript -% \let\stoptypescript \stoploadedtypescript -% \let\starttypescriptcollection\startloadedtypescriptcollection -% \let\stoptypescriptcollection \stoploadedtypescriptcollection -% % -% \startreadingfile -% \pushendofline -% \unprotect -% \readfile\currenttypefile\donothing\donothing -% \protect -% \popendofline -% \stopreadingfile -% \egroup -% \fi -% %\message{[\space\currenttypefile}% -% \the\loadedtypescripts -% %\message{\ifconditional\quittingtypescript quit\space\fi]}% -% \else -% % process files each time -% \startreadingfile -% \pushendofline -% \unprotect -% \readfile\currenttypefile\donothing\donothing -% \protect -% \popendofline -% \stopreadingfile -% \fi -% \popmacro\currenttypefile -% \ifconditional\quittingtypescript -% \quitcommalist -% \setfalse\quittingtypescript -% \fi} - \def\usetypescriptonce {\dotripleempty\dousetypescriptonce} @@ -486,12 +417,9 @@ \def\dodoloadmapline[#1][#2]% {\loadallfontmapfiles % ! ! ! \ifsecondargument - \immediatewriteutilitycommand{\usedmapline{#1}{#2}}% \doloadmapline{#1}{#2}% special \else - \loadmapline[=][#1]% - %\immediatewriteutilitycommand{\usedmapline{=}{#2}}% - %\doloadmapline{=}{#1}% special + \doloadmapline{=}{#1}% special \fi} % since this is driver dependent, and since we may set map files @@ -506,16 +434,16 @@ % hm, the timing of when pdftex needs the map file info keeps changing; % it's really time to move to map line support -% \appendtoks \loadallfontmapfiles \to \everyPDFximage -% \appendtoks \loadallfontmapfiles \to \everystarttext -% \appendtoks \loadallfontmapfiles \to \everybeforepagebody +% \everybeforeshipout \expandafter % will move as it is backend dependent +% {\expandafter\appendtoks +% \expandafter\loadallfontmapfiles +% \expandafter\to +% \expandafter\pageboundsettings +% \the\everybeforeshipout} -\everybeforeshipout \expandafter - {\expandafter\appendtoks - \expandafter\loadallfontmapfiles - \expandafter\to - \expandafter\pageboundsettings - \the\everybeforeshipout} +\appendtoks + \loadallfontmapfiles +\to \pageboundsettings \newif\ifautoloadmapfiles @@ -577,13 +505,9 @@ % #1=main #2=rm #3=serif #4=fontname #5=size #6=settings -\def\typefaceencoding{\defaultencoding} - % we can use \rawgetparameters or \rawgeteparameters -\ifx\mkdodefinetypeface\undefined - \let\mkdodefinetypeface\gobblefivearguments -\fi +\def\typefaceencoding{\defaultencoding} \def\dodefinetypeface[#1][#2][#3][#4][#5][#6]% {\dododefinetypeface[#1][#2]% @@ -600,9 +524,14 @@ \letvalue{\fontclass\s!fallbacks}\@@tsfallbacks % new per 12/10/2008 \saverelativefontsize{#2}\relativefontsize % fall back \savemathtextstyle\@@tstext % math text style (new per 28/4/2006) - \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4] / \typefaceencoding}\fi -% \usetypescript[#3,\t!map][#4][\t!name,\t!default,\typefaceencoding,\t!special]% map is needed for backward cmp - \usetypescript[#3][#4][\t!name,\t!default,\typefaceencoding]% typefaceencoding=empty forces [#3][#4] + \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi + % we need to keep typefaceencoding for a while as it can still be used to filter + % old scripts as we just strip the texnansi- prefix + \ifx\typefaceencoding\t!default + \usetypescript[#3][#4][\t!name,\t!default]% will be default some day + \else + \usetypescript[#3][#4][\t!name,\t!default,\typefaceencoding]% + \fi \usetypescript[#3][#5][\t!size]% \popmacro\fontclass \popmacro\typefaceencoding @@ -613,6 +542,32 @@ \getparameters[\??tf#1#2][#3]% \fi\fi\fi} +% will become (once we've adapted the typescripts): +% +% \def\dodefinetypeface[#1][#2][#3][#4][#5][#6]% +% {\dododefinetypeface[#1][#2]% +% \iffifthargument % sixth is optional +% % we need to expand since in #6 there can be a \typescripttwo +% \normalexpanded{\noexpand\getparameters[\??ts][\s!rscale=\plusone,\s!features=,\s!fallbacks=,\s!text=,#6]}% \geteparameters +% \pushmacro\relativefontsize +% \pushmacro\fontclass +% \let\relativefontsize\@@tsrscale +% \setcurrentfontclass{#1}% +% \letvalue{\fontclass\s!features }\@@tsfeatures % new per 16/6/2007 +% \letvalue{\fontclass\s!fallbacks}\@@tsfallbacks % new per 12/10/2008 +% \saverelativefontsize{#2}\relativefontsize % fall back +% \savemathtextstyle\@@tstext % math text style (new per 28/4/2006) +% \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi +% \usetypescript[#3][#4][\t!name,\t!default,\empty]% brr, this empty, no encoding +% \usetypescript[#3][#5][\t!size]% +% \popmacro\fontclass +% \popmacro\relativefontsize +% \else\iffourthargument +% \definetypeface[#1][#2][#3][#4][\s!default]% +% \else\ifthirdargument +% \getparameters[\??tf#1#2][#3]% +% \fi\fi\fi} + \def\dododefinetypeface[#1][#2]% saveguard against redefinition {\doifsomething{#1} {\ifcsname\??tf#1\s!default\endcsname \else @@ -639,11 +594,11 @@ #1[#4]% \else\ifx\fontclass\empty #1[\c!rm]% + \else\ifcsname\??tf\fontclass\s!default\endcsname + #1[\csname\??tf\fontclass\s!default\endcsname]% \else - \doifdefinedelse{\??tf\fontclass\s!default} - {#1[\getvalue{\??tf\fontclass\s!default}]} - {#1[\c!rm]}% - \fi \fi + #1[\c!rm]% + \fi \fi \fi \ifmmode\mr\else\tf\fi} % needed ? \def\usetypefile[#1]% recurses on path ! @@ -700,6 +655,6 @@ \the\scratchtoks \fi} -\fetchruntimecommand \typetypescript {\f!typeprefix\s!run} +\fetchruntimecommand \typetypescript {\f!typeprefix\s!run.mkiv} % will become module \protect \endinput diff --git a/tex/context/base/type-map.tex b/tex/context/base/type-map.tex deleted file mode 100644 index 5a581a78b..000000000 --- a/tex/context/base/type-map.tex +++ /dev/null @@ -1,197 +0,0 @@ -%D \module -%D [ file=type-map, -%D version=2001.04.12, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Mapfile scripts, -%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. - -\starttypescriptcollection[map files] - -%D This one plays safe: - -\starttypescript [map] [base] [all] - \loadmapfile[original-base.map] - \loadmapfile[ec-base.map] - \loadmapfile[texnansi-base.map] - \loadmapfile[8r-base.map] - \loadmapfile[qx-base.map] - \loadmapfile[t5-base.map] -\stoptypescript - -\starttypescript [map] [base,euler,ams] [all] - \loadmapfile[original-ams-base.map] - %loadmapfile[original-ams-cmr.map] - \loadmapfile[original-ams-euler.map] - %loadmapfile[original-public-lm.map] -\stoptypescript - -% This is the base map file, load it to be sure. - -\starttypescript [map] [all] [ec,8r,texnansi,qx,t5] - \loadmapfile[original-base.map] - \loadmapfile[\typescriptthree-base.map] -\stoptypescript - -% if we were in full control, we could have -% -% \starttypescript [berry] [ec] -% \loadmapfile[ec-base.map] -% \stoptypescript - -% cmr and related - -\starttypescript [map] [cmr,lm,lmr] - %loadmapfile[original-public-lm.map] - \loadmapfile[original-ams-base.map] - \loadmapfile[original-ams-euler.map] -\stoptypescript - -% cyrillic - -\starttypescript [map] [computer-modern] [t2a,t2b,t2c,x2] - \loadmapfile[subset-cmsuper-\typescriptthree.map] - \loadmapfile[cm-super-\typescriptthree.map] -\stoptypescript - -% latin modern (watch the unfortunate \quote {lm-encoding} order -% in the name; for the moment we ship copies of the map files. - -\starttypescript [map] [modern,modern-vari,modern-cond,computer-modern,latin-modern,latin-modern-vari,latin-modern-cond,] [ec,texnansi,qx,t5] - % this was what we had at the start and what fits best into our naming scheme - % well, all those changes in lm gave too many user problem reports so i revert to: - % \loadmapfile[\typescriptthree-public-lm.map] - % this one also fits into the naming scheme but has been dropped by the distributers - % \loadmapfile[\typescriptthree-lm.map] - % this is what the latest distributions provide - \loadmapfile[lm-\typescriptthree.map] % maybe some day - \loadmapfile[lm-math.map] - \loadmapfile[lm-rm.map] -\stoptypescript - -% \usetypescript [map] [latin-modern-os] [ec] % lm is loaded under ec regime -% \starttext -% Is onze Frans nu 41, 52, 63, 74, 85 of 96 jaar \quote {old}? -% \stoptext - -\starttypescript [map] [latin-modern-os] [ec,texnansi,qx,t5] - \loadmapfile[\typescriptthree-os-public-lm.map] -\stoptypescript - -% the next applies to texfont generated metrics - -\starttypescript [map] [utopia] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-adobe-utopia.map] -\stoptypescript - -\starttypescript [map] [charter] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-bitstrea-charter.map] -\stoptypescript - -% \starttypescript [map] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,ec,qx,t5,t2a,t2b,t2c,default] -% \loadmapfile[\typescriptthree-antt.map] -% \loadmapfile[rm-antt.map] -% \loadmapfile[mi-antt.map] -% \loadmapfile[sy-antt.map] -% \loadmapfile[ex-antt.map] -% \stoptypescript - -\starttypescript [map] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,ec,qx,t5,t2a,t2b,t2c,default] - \loadmapfile[antt-\typescriptthree.map] - \loadmapfile[antt-rm.map] - \loadmapfile[antt-mi.map] - \loadmapfile[antt-sy.map] - \loadmapfile[antt-ex.map] -\stoptypescript - -\starttypescript [map] [antykwa-poltawskiego] [ec,texnansi,qx,t5] - \loadmapfile[\typescriptthree-public-antp.map] -\stoptypescript - -% \starttypescript [map] [iwona,iwona-light,iwona-medium,iwona-heavy] [ec,texnansi,qx,t5] -% \loadmapfile[\typescriptthree-iwona.map] -% \loadmapfile[rm-iwona.map] -% \loadmapfile[mi-iwona.map] -% \loadmapfile[sy-iwona.map] -% \loadmapfile[ex-iwona.map] -% \stoptypescript - -\starttypescript [map] [iwona,iwona-light,iwona-medium,iwona-heavy] [ec,texnansi,qx,t5] - \loadmapfile[iwona-\typescriptthree.map] - \loadmapfile[iwona-rm.map] - \loadmapfile[iwona-mi.map] - \loadmapfile[iwona-sy.map] - \loadmapfile[iwona-ex.map] -\stoptypescript - -% \starttypescript [map] [kurier,kurier-light,kurier-medium,kurier-heavy] [ec,texnansi,qx,t5,default] -% \loadmapfile[\typescriptthree-kurier.map] -% \loadmapfile[rm-kurier.map] -% \loadmapfile[mi-kurier.map] -% \loadmapfile[sy-kurier.map] -% \loadmapfile[ex-kurier.map] -% \stoptypescript - -\starttypescript [map] [kurier,kurier-light,kurier-medium,kurier-heavy] [ec,texnansi,qx,t5,default] - \loadmapfile[kurier-\typescriptthree.map] - \loadmapfile[kurier-rm.map] - \loadmapfile[kurier-mi.map] - \loadmapfile[kurier-sy.map] - \loadmapfile[kurier-ex.map] -\stoptypescript - -% \starttypescript [map] [bookman] [ec,texnansi,t5,8r] -% \loadmapfile[\typescriptthree-urw-bookman.map] -% \stoptypescript - -% \starttypescript [map] [courier] [ec,texnansi,t5,8r] -% \loadmapfile[\typescriptthree-urw-courier.map] -% \stoptypescript - -% \starttypescript [map] [helvetica] [ec,texnansi,t5,8r] -% \loadmapfile[\typescriptthree-urw-helvetica.map] -% \stoptypescript - -% \starttypescript [map] [palatino] [ec,texnansi,t5,8r] -% \loadmapfile[\typescriptthree-urw-palatino.map] -% %loadmapfile[\typescriptthree-public-pfl.map] -% \stoptypescript - -% \starttypescript [map] [times] [ec,texnansi,t5,8r] -% \loadmapfile[\typescriptthree-urw-times.map] -% \stoptypescript - -% \starttypescript [map] [chancery] [ec,texnansi,t5,8r] -% \loadmapfile[\typescriptthree-urw-zapfchan.map] -% \stoptypescript - -% \starttypescript [map] [schoolbook] [ec,texnansi,t5,8r] -% \loadmapfile[\typescriptthree-urw-ncntrsbk.map] -% \stoptypescript - -% once i can be sure that the map files are in the tree, i will -% use those instead of original (too many variants anyway) - -\starttypescript [map] [palatino] [default,ec,texnansi,t5,8r] - \loadmapfile[original-youngryu-px.map] -\stoptypescript - -\starttypescript [map] [times] [default,ec,texnansi,t5,8r] - \loadmapfile[original-youngryu-tx.map] -\stoptypescript - -% to do: maybe original, maybe not - -\starttypescript [map] [fourier] [ec] - \loadmapfile[fourier.map] - \loadmapfile[fourier-utopia-expert.map] -\stoptypescript - -\stoptypescriptcollection - -\endinput diff --git a/tex/context/base/type-old.tex b/tex/context/base/type-old.tex deleted file mode 100644 index 881deeefe..000000000 --- a/tex/context/base/type-old.tex +++ /dev/null @@ -1,320 +0,0 @@ -%D \module -%D [ file=type-old, -%D version=2005.09.07, % moved from type-*.tex -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Ghosts from the Past, -%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. - -\endinput - -% \starttypescript[all][modern,latin-modern,computer-modern][pl0] -% -% \definefontsynonym[pl0-lmb10] [plb10] [encoding=pl0] -% \definefontsynonym[pl0-lmbo10] [plbsl10] [encoding=pl0] -% \definefontsynonym[pl0-lmbx10] [plbx10] [encoding=pl0] -% \definefontsynonym[pl0-lmbx12] [plbx12] [encoding=pl0] -% \definefontsynonym[pl0-lmbx5] [plbx5] [encoding=pl0] -% \definefontsynonym[pl0-lmbx6] [plbx6] [encoding=pl0] -% \definefontsynonym[pl0-lmbx7] [plbx7] [encoding=pl0] -% \definefontsynonym[pl0-lmbx8] [plbx8] [encoding=pl0] -% \definefontsynonym[pl0-lmbx9] [plbx9] [encoding=pl0] -% \definefontsynonym[pl0-lmbxi10] [plbxti10] [encoding=pl0] -% \definefontsynonym[pl0-lmbxo10] [plbxsl10] [encoding=pl0] -% \definefontsynonym[pl0-lmcsc10] [plcsc10] [encoding=pl0] -% \definefontsynonym[pl0-lmcsco10][plcscsl10][encoding=pl0] -% \definefontsynonym[pl0-lmr10] [plr10] [encoding=pl0] -% \definefontsynonym[pl0-lmr12] [plr12] [encoding=pl0] -% \definefontsynonym[pl0-lmr17] [plr17] [encoding=pl0] -% \definefontsynonym[pl0-lmr5] [plr5] [encoding=pl0] -% \definefontsynonym[pl0-lmr6] [plr6] [encoding=pl0] -% \definefontsynonym[pl0-lmr7] [plr7] [encoding=pl0] -% \definefontsynonym[pl0-lmr8] [plr8] [encoding=pl0] -% \definefontsynonym[pl0-lmr9] [plr9] [encoding=pl0] -% \definefontsynonym[pl0-lmri10] [plti10] [encoding=pl0] -% \definefontsynonym[pl0-lmri12] [plti12] [encoding=pl0] -% \definefontsynonym[pl0-lmri7] [plti7] [encoding=pl0] -% \definefontsynonym[pl0-lmri8] [plti8] [encoding=pl0] -% \definefontsynonym[pl0-lmri9] [plti9] [encoding=pl0] -% \definefontsynonym[pl0-lmro10] [plsl10] [encoding=pl0] -% \definefontsynonym[pl0-lmro12] [plsl12] [encoding=pl0] -% \definefontsynonym[pl0-lmro8] [plsl8] [encoding=pl0] -% \definefontsynonym[pl0-lmro9] [plsl9] [encoding=pl0] -% \definefontsynonym[pl0-lmss10] [plss10] [encoding=pl0] -% \definefontsynonym[pl0-lmss12] [plss12] [encoding=pl0] -% \definefontsynonym[pl0-lmss17] [plss17] [encoding=pl0] -% \definefontsynonym[pl0-lmss8] [plss8] [encoding=pl0] -% \definefontsynonym[pl0-lmss9] [plss9] [encoding=pl0] -% \definefontsynonym[pl0-lmssbo10][plssbi10] [encoding=pl0] -% \definefontsynonym[pl0-lmssbx10][plssbx10] [encoding=pl0] -% \definefontsynonym[pl0-lmssdc10][plssdc10] [encoding=pl0] -% \definefontsynonym[pl0-lmssdo10][plssdi10] [encoding=pl0] -% \definefontsynonym[pl0-lmsso10] [plssi10] [encoding=pl0] -% \definefontsynonym[pl0-lmsso12] [plssi12] [encoding=pl0] -% \definefontsynonym[pl0-lmsso17] [plssi17] [encoding=pl0] -% \definefontsynonym[pl0-lmsso8] [plssi8] [encoding=pl0] -% \definefontsynonym[pl0-lmsso9] [plssi9] [encoding=pl0] -% \definefontsynonym[pl0-lmssq8] [plssq8] [encoding=pl0] -% \definefontsynonym[pl0-lmssqbo8][plssqbi8] [encoding=pl0] -% \definefontsynonym[pl0-lmssqbx8][plssqb8] [encoding=pl0] -% \definefontsynonym[pl0-lmssqo8] [plssqi8] [encoding=pl0] -% \definefontsynonym[pl0-lmtcsc10][pltcsc10] [encoding=pl0] -% \definefontsynonym[pl0-lmtt10] [pltt10] [encoding=pl0] -% \definefontsynonym[pl0-lmtt12] [pltt12] [encoding=pl0] -% \definefontsynonym[pl0-lmtt8] [pltt8] [encoding=pl0] -% \definefontsynonym[pl0-lmtt9] [pltt9] [encoding=pl0] -% \definefontsynonym[pl0-lmtti10] [pltti10] [encoding=pl0] -% \definefontsynonym[pl0-lmtto10] [plsltt10] [encoding=pl0] -% \definefontsynonym[pl0-lmvtt10] [plvtt10] [encoding=pl0] -% \definefontsynonym[pl0-lmvtto10][plvtti10] [encoding=pl0] -% -% \stoptypescript - -% \starttypescript[all][modern,latin-modern,computer-modern][il2] -% -% \definefontsynonym[il2-lmb10] [csb10] [encoding=il2] -% \definefontsynonym[il2-lmbo10] [csbsl10] [encoding=il2] -% \definefontsynonym[il2-lmbx10] [csbx10] [encoding=il2] -% \definefontsynonym[il2-lmbx12] [csbx12] [encoding=il2] -% \definefontsynonym[il2-lmbx5] [csbx5] [encoding=il2] -% \definefontsynonym[il2-lmbx6] [csbx6] [encoding=il2] -% \definefontsynonym[il2-lmbx7] [csbx7] [encoding=il2] -% \definefontsynonym[il2-lmbx8] [csbx8] [encoding=il2] -% \definefontsynonym[il2-lmbx9] [csbx9] [encoding=il2] -% \definefontsynonym[il2-lmbxi10] [csbxti10] [encoding=il2] -% \definefontsynonym[il2-lmbxo10] [csbxsl10] [encoding=il2] -% \definefontsynonym[il2-lmcsc10] [cscsc10] [encoding=il2] -% \definefontsynonym[il2-lmcsco10][cscscls10][encoding=il2] -% \definefontsynonym[il2-lmr10] [csr10] [encoding=il2] -% \definefontsynonym[il2-lmr12] [csr12] [encoding=il2] -% \definefontsynonym[il2-lmr17] [csr17] [encoding=il2] -% \definefontsynonym[il2-lmr5] [csr5] [encoding=il2] -% \definefontsynonym[il2-lmr6] [csr6] [encoding=il2] -% \definefontsynonym[il2-lmr7] [csr7] [encoding=il2] -% \definefontsynonym[il2-lmr8] [csr8] [encoding=il2] -% \definefontsynonym[il2-lmr9] [csr9] [encoding=il2] -% \definefontsynonym[il2-lmri10] [csti10] [encoding=il2] -% \definefontsynonym[il2-lmri12] [csti12] [encoding=il2] -% \definefontsynonym[il2-lmri7] [csti7] [encoding=il2] -% \definefontsynonym[il2-lmri8] [csti8] [encoding=il2] -% \definefontsynonym[il2-lmri9] [csti9] [encoding=il2] -% \definefontsynonym[il2-lmro10] [cssl10] [encoding=il2] -% \definefontsynonym[il2-lmro12] [cssl12] [encoding=il2] -% \definefontsynonym[il2-lmro8] [cssl8] [encoding=il2] -% \definefontsynonym[il2-lmro9] [cssl9] [encoding=il2] -% \definefontsynonym[il2-lmss10] [csss10] [encoding=il2] -% \definefontsynonym[il2-lmss12] [csss12] [encoding=il2] -% \definefontsynonym[il2-lmss17] [csss17] [encoding=il2] -% \definefontsynonym[il2-lmss8] [csss8] [encoding=il2] -% \definefontsynonym[il2-lmss9] [csss9] [encoding=il2] -% \definefontsynonym[il2-lmssbo10][csssbi10] [encoding=il2] -% \definefontsynonym[il2-lmssbx10][csssbx10] [encoding=il2] -% \definefontsynonym[il2-lmssdc10][csssdc10] [encoding=il2] -% \definefontsynonym[il2-lmssdo10][csssdi10] [encoding=il2] -% \definefontsynonym[il2-lmsso10] [csssi10] [encoding=il2] -% \definefontsynonym[il2-lmsso12] [csssi12] [encoding=il2] -% \definefontsynonym[il2-lmsso17] [csssi17] [encoding=il2] -% \definefontsynonym[il2-lmsso8] [csssi8] [encoding=il2] -% \definefontsynonym[il2-lmsso9] [csssi9] [encoding=il2] -% \definefontsynonym[il2-lmssq8] [csssq8] [encoding=il2] -% \definefontsynonym[il2-lmssqbo8][csssqbi8] [encoding=il2] -% \definefontsynonym[il2-lmssqbx8][csssqb8] [encoding=il2] -% \definefontsynonym[il2-lmssqo8] [csssqi8] [encoding=il2] -% \definefontsynonym[il2-lmtcsc10][cstcsc10] [encoding=il2] -% \definefontsynonym[il2-lmtt10] [cstt10] [encoding=il2] -% \definefontsynonym[il2-lmtt12] [cstt12] [encoding=il2] -% \definefontsynonym[il2-lmtt8] [cstt8] [encoding=il2] -% \definefontsynonym[il2-lmtt9] [cstt9] [encoding=il2] -% \definefontsynonym[il2-lmtti10] [cstti10] [encoding=il2] -% \definefontsynonym[il2-lmtto10] [cssltt10] [encoding=il2] -% \definefontsynonym[il2-lmvtt10] [csvtt10] [encoding=il2] -% \definefontsynonym[il2-lmvtto10][csvtti10] [encoding=il2] -% -% \stoptypescript - -% \starttypescript[all][modern,latin-modern,computer-modern][t5] -% -% \definefontsynonym[t5-lmb10] [vnb10] [encoding=t5] -% \definefontsynonym[t5-lmbo10] [vnbsl10] [encoding=t5] -% \definefontsynonym[t5-lmbx10] [vnbx10] [encoding=t5] -% \definefontsynonym[t5-lmbx12] [vnbx12] [encoding=t5] -% \definefontsynonym[t5-lmbx5] [vnbx5] [encoding=t5] -% \definefontsynonym[t5-lmbx6] [vnbx6] [encoding=t5] -% \definefontsynonym[t5-lmbx7] [vnbx7] [encoding=t5] -% \definefontsynonym[t5-lmbx8] [vnbx8] [encoding=t5] -% \definefontsynonym[t5-lmbx9] [vnbx9] [encoding=t5] -% \definefontsynonym[t5-lmbxi10] [vnbxti10] [encoding=t5] -% \definefontsynonym[t5-lmbxo10] [vnbxsl10] [encoding=t5] -% \definefontsynonym[t5-lmcsc10] [vncsc10] [encoding=t5] -% \definefontsynonym[t5-lmcsco10][vncscsl10][encoding=t5] -% \definefontsynonym[t5-lmr10] [vnr10] [encoding=t5] -% \definefontsynonym[t5-lmr12] [vnr12] [encoding=t5] -% \definefontsynonym[t5-lmr17] [vnr17] [encoding=t5] -% \definefontsynonym[t5-lmr5] [vnr5] [encoding=t5] -% \definefontsynonym[t5-lmr6] [vnr6] [encoding=t5] -% \definefontsynonym[t5-lmr7] [vnr7] [encoding=t5] -% \definefontsynonym[t5-lmr8] [vnr8] [encoding=t5] -% \definefontsynonym[t5-lmr9] [vnr9] [encoding=t5] -% \definefontsynonym[t5-lmri10] [vnti10] [encoding=t5] -% \definefontsynonym[t5-lmri12] [vnti12] [encoding=t5] -% \definefontsynonym[t5-lmri7] [vnti7] [encoding=t5] -% \definefontsynonym[t5-lmri8] [vnti8] [encoding=t5] -% \definefontsynonym[t5-lmri9] [vnti9] [encoding=t5] -% \definefontsynonym[t5-lmro10] [vnsl10] [encoding=t5] -% \definefontsynonym[t5-lmro12] [vnsl12] [encoding=t5] -% \definefontsynonym[t5-lmro8] [vnsl8] [encoding=t5] -% \definefontsynonym[t5-lmro9] [vnsl9] [encoding=t5] -% \definefontsynonym[t5-lmss10] [vnss10] [encoding=t5] -% \definefontsynonym[t5-lmss12] [vnss12] [encoding=t5] -% \definefontsynonym[t5-lmss17] [vnss17] [encoding=t5] -% \definefontsynonym[t5-lmss8] [vnss8] [encoding=t5] -% \definefontsynonym[t5-lmss9] [vnss9] [encoding=t5] -% \definefontsynonym[t5-lmssbo10][vnssbi10] [encoding=t5] -% \definefontsynonym[t5-lmssbx10][vnssbx10] [encoding=t5] -% \definefontsynonym[t5-lmssdc10][vnssdc10] [encoding=t5] -% \definefontsynonym[t5-lmssdo10][vnssdi10] [encoding=t5] -% \definefontsynonym[t5-lmsso10] [vnssi10] [encoding=t5] -% \definefontsynonym[t5-lmsso12] [vnssi12] [encoding=t5] -% \definefontsynonym[t5-lmsso17] [vnssi17] [encoding=t5] -% \definefontsynonym[t5-lmsso8] [vnssi8] [encoding=t5] -% \definefontsynonym[t5-lmsso9] [vnssi9] [encoding=t5] -% \definefontsynonym[t5-lmssq8] [vnssq8] [encoding=t5] -% \definefontsynonym[t5-lmssqbo8][vnssqbi8] [encoding=t5] -% \definefontsynonym[t5-lmssqbx8][vnssqb8] [encoding=t5] -% \definefontsynonym[t5-lmssqo8] [vnssqi8] [encoding=t5] -% \definefontsynonym[t5-lmtcsc10][vntcsc10] [encoding=t5] -% \definefontsynonym[t5-lmtt10] [vntt10] [encoding=t5] -% \definefontsynonym[t5-lmtt12] [vntt12] [encoding=t5] -% \definefontsynonym[t5-lmtt8] [vntt8] [encoding=t5] -% \definefontsynonym[t5-lmtt9] [vntt9] [encoding=t5] -% \definefontsynonym[t5-lmtti10] [vntti10] [encoding=t5] -% \definefontsynonym[t5-lmtto10] [vnsltt10] [encoding=t5] -% \definefontsynonym[t5-lmvtt10] [vnvtt10] [encoding=t5] -% \definefontsynonym[t5-lmvtto10][vnvtti10] [encoding=t5] -% -% \stoptypescript - -% \starttypescript [cmr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [aer] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,ec] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [csr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,il2] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [plr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,pl0] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [vnr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,t5] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [map] [il2,csr] -% \loadmapfile[original-public-csr.map] -% \stoptypescript - -% \starttypescript [map] [pl0,plr] -% \loadmapfile[original-public-plr.map] -% \stoptypescript - -% \starttypescript [map] [vnr] -% \loadmapfile[original-public-vnr.map] -% \stoptypescript - -% \starttypescript [map] [il2,csr] -% \loadmapfile[il2-public-lm.map] -% \stoptypescript - -% \starttypescript [map] [pl0,plr] -% \loadmapfile[pl0-public-lm.map] -% \stoptypescript - -% \starttypescript [map] [t5,vnr] -% \loadmapfile[t5-public-lm.map] -% \stoptypescript - -% support for alternative shapes has been removed from latin modern -% -% \starttypescript [map] [latin-modern-var] [ec,texnansi,qx,t5,pl0,il2] -% \loadmapfile[\typescriptthree-var-exclusive-public-lm.map] -% \stoptypescript - -% \starttypescript [map] [cmr] -% \loadmapfile[original-ams-cmr.map] -% \loadmapfile[original-ams-euler.map] -% \stoptypescript -% \starttypescript [map] [lm,lmr] -% \loadmapfile[original-public-lm.map] -% \stoptypescript - -% per 20050201 we moved to latin modern for plr/csr/vnr -% -% \starttypescript [map] [base] [all] -% \loadmapfile[original-public-plr.map] -% \loadmapfile[original-public-csr.map] -% \loadmapfile[original-public-vnr.map] -% \stoptypescript - -% \starttypescript [cmr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [plr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,pl0] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [csr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,il2] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [aer] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,ec] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [vnr] -% \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,t5] -% \usemathcollection[default] -% \stoptypescript - -% \starttypescript [ant] -% \usetypescript [serif] [antykwa-torunska] [name,\defaultencoding] -% \usetypescript [serif] [default] [size] -% \usetypescript [all] [antykwa-torunska] [\defaultencoding] -% \stoptypescript - -% \starttypescript [ppl] -% \usetypescript [serif] [palatino] [name,\defaultencoding] -% \usetypescript [serif] [default] [size] -% \usetypescript [all] [palatino] [\defaultencoding] -% \stoptypescript - -% %D With thanks to Berthold Horn from YandY for providing me -% %D evaluation copies of the MathTimePlus fonts. -% -% \starttypescript [tim] -% \usetypescript [math] [times] [all] -% \usetypescript [math] [default] [size] -% \usemathcollection[tim] -% \usetypescript [all] [times] [\defaultencoding] -% \stoptypescript - -\endinput diff --git a/tex/context/base/type-omg.tex b/tex/context/base/type-omg.tex deleted file mode 100644 index 606b8449b..000000000 --- a/tex/context/base/type-omg.tex +++ /dev/null @@ -1,204 +0,0 @@ -%D \module -%D [ file=type-omg, -%D version=2002.05.15, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Basic \OMEGA\ Gamma Definitions, -%D author={Idris Samawi Hamid, Hans Hagen}, -%D date=\currentdate, -%D copyright={PRAGMA-ADE, Idris Samawi Hamid}] -% -%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 need to document this module a bit. See \type {m-gamma} -%D for more information. - -\definestyle [normalvariant] [\nv] [] % so we can get ucvtt (Unicode Variable Typewriter) - -%D omarab: - -\starttypescriptcollection[omega] - -\starttypescript [naskh] [omega] [name] - - \definefontsynonym [OmegaArabic] [omarab] - \definefontsynonym [OmegaArabic-Bold] [omarabb] - - \definefontsynonym [Naskh] [OmegaArabic] - \definefontsynonym [NaskhBold] [OmegaArabic-Bold] - -\stoptypescript - -\starttypescript [naskh] [omega] [size] - - \definebodyfont - [20.7pt,17.3pt,14.4pt,12pt,11pt,10pt,9pt,8pt,7pt,6pt] - [rm] - [tf=Naskh sa 1, - bf=NaskhBold sa 1, - it=Naskh sa 1, - sl=Naskh sa 1, - bi=NaskhBold sa 1, - bs=NaskhBold sa 1, - sc=Naskh sa 1] - -\usetypescript [math] [computer-modern] [size] - -\stoptypescript - -\starttypescript [OmegaArab] - - \definebodyfontenvironment - [omarb] - [default] - [interlinespace=3ex] - - \definetypeface [omarb] [rm] [naskh] [omega] [omega] - -\stoptypescript - -%D omlgc: - -\starttypescript [serif] [omega] [name] - - \definefontsynonym [OmegaSerif] [omlgc] - \definefontsynonym [OmegaSerif-Bold] [omlgcb] - \definefontsynonym [OmegaSerif-Italic] [omlgci] - \definefontsynonym [OmegaSerif-Slanted] [omlgci] - \definefontsynonym [OmegaSerif-BoldItalic] [omlgcbi] - \definefontsynonym [OmegaSerif-BoldSlanted][omlgcbi] - \definefontsynonym [OmegaSerif-Caps] [omlgc] - - \definefontsynonym [Serif] [OmegaSerif] - \definefontsynonym [SerifBold] [OmegaSerif-Bold] - \definefontsynonym [SerifItalic] [OmegaSerif-Italic] - \definefontsynonym [SerifSlanted] [OmegaSerif-Slanted] - \definefontsynonym [SerifBoldItalic] [OmegaSerif-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [OmegaSerif-BoldSlanted] - \definefontsynonym [SerifCaps] [OmegaSerif-Caps] - -\stoptypescript - -\starttypescript [mono] [omega] [name] - - \definefontsynonym [OmegaMono] [uctt10] - \definefontsynonym [OmegaMono-Italic] [ucitt10] - \definefontsynonym [OmegaMono-Slanted] [ucsltt10] - \definefontsynonym [OmegaMono-Bold] [uctt10] - \definefontsynonym [OmegaMono-BoldItalic] [ucitt10] - \definefontsynonym [OmegaMono-BoldSlanted] [ucsltt10] - \definefontsynonym [OmegaMono-Caps] [uctt10] - \definefontsynonym [OmegaMono-Variable] [ucvtt10] - - \definefontsynonym [Mono] [OmegaMono] - \definefontsynonym [MonoBold] [OmegaMono-Bold] - \definefontsynonym [MonoItalic] [OmegaMono-Italic] - \definefontsynonym [MonoSlanted] [OmegaMono-Slanted] - \definefontsynonym [MonoBoldItalic] [OmegaMono-BoldItalic] - \definefontsynonym [MonoBoldSlanted] [OmegaMono-BoldSlanted] - \definefontsynonym [MonoCaps] [OmegaMono-Caps] - \definefontsynonym [MonoVariable] [OmegaMono-Variable] - -\stoptypescript - -\starttypescript [serif] [omega] [size] - - \definebodyfont - [20.7pt,17.3pt,14.4pt,12pt,11pt,10pt,9pt,8pt,7pt,6pt,5pt,4pt] - [rm] - [tf=Serif sa 1, - bf=SerifBold sa 1, - it=SerifItalic sa 1, - sl=SerifSlanted sa 1, - bi=SerifBoldItalic sa 1, - bs=SerifBoldSlanted sa 1, - sc=SerifCaps sa 1] - -\usetypescript [math,sans] [computer-modern] [size] - -\stoptypescript - -%D In order to get default Unicode Variable Typewriter, -%D uncomment the first \type {\definebodyfont} and then -%D comment the rest of this typescript. - -\starttypescript [mono] [omega] [size] - -% \definebodyfont -% [20.7pt,17.3pt,14.4pt,12pt,11pt,10pt,9pt,8pt,7pt,6pt,5pt,4pt] -% [rm] -% [tf=MonoVariable sa 1, -% bf=MonoBold sa 1 -% it=MonoItalic sa 1, -% sl=MonoSlanted sa 1, -% bi=MonoBoldItali sa 1, -% bs=MonoBoldSlanted sa 1, -% sc=MonoCaps sa 1] - - \definebodyfont - [20.7pt,17.3pt,14.4pt,12pt,11pt] - [tt] - [tf=uctt12 sa 1, - bf=uctt12 sa 1, - it=ucitt10 sa 1, - sl=ucsltt10 sa 1, - bi=ucitt10 sa 1, - bs=ucsltt10 sa 1, - sc=uctt10 sa 1, - nv=ucvtt10 sa 1] - - \definebodyfont - [10pt] - [tt] - [tf=uctt10 at 10pt, - bf=uctt10 at 10pt, - it=ucitt10 at 10pt, - sl=ucsltt10 at 10pt, - bi=ucitt10 at 10pt, - bs=ucsltt10 at 10pt, - sc=uctt10 at 10pt, - nv=ucvtt10 at 10pt] - - \definebodyfont - [9pt] - [tt] - [tf=uctt9 at 9pt, - bf=uctt9 at 9pt, - it=ucitt10 at 9pt, - sl=ucsltt10 at 9pt, - bi=ucitt10 at 9pt, - bs=ucsltt10 at 9pt, - sc=uctt10 at 9pt, - nv=ucvtt10 at 9pt] - - \definebodyfont - [8pt,7pt,6pt,5pt,4pt] - [tt] - [tf=uctt8 sa 1, - bf=uctt8 sa 1, - it=ucitt10 sa 1, - sl=ucsltt10 sa 1, - bi=ucitt10 sa 1, - bs=ucsltt10 sa 1, - sc=uctt10 sa 1, - nv=ucvtt10 sa 1] - -\stoptypescript - -\starttypescript [OmegaLGC] - - \definebodyfontenvironment - [omlgc] - [default] - [interlinespace=2.8ex] - - \definetypeface [omlgc] [rm] [serif] [omega] [omega] - \definetypeface [omlgc] [tt] [mono] [omega] [omega] - -\stoptypescript - -\stoptypescriptcollection - -\endinput diff --git a/tex/context/base/type-one.mkii b/tex/context/base/type-one.mkii new file mode 100644 index 000000000..b456d7e64 --- /dev/null +++ b/tex/context/base/type-one.mkii @@ -0,0 +1,1185 @@ +%D \module +%D [ file=type-one, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Type One 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. + +%D This file merges the traditional enc, syn and map files into one. If +%D you think that it looks messy you're right. It shows some history of +%D \TEX\ fonts and the development towards latin modern. + +% texfont --ven=public --col=antt --enc=ec --sou=auto +% texfont --ven=public --col=antp --enc=ec --sou=auto +% texfont --ven=urw --col=palatino --enc=ec --sou=auto +% texfont --ven-lucas --col=sun --enc=ec --sou=. + +% \usetypescript [all] [modern] [texnansi] +% \setupbodyfont[reset] \setupbodyfont[cmr] +% \starttext \showfont[Serif] \stoptext + +\starttypescriptcollection[examples] + +\starttypescript [fallback] [texnansi,ec,qx,t5,default] + \definetypeface [] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern] [texnansi,ec,qx,t5,default] + \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [modern] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern-base] [texnansi,ec,qx,t5,default] + \definetypeface [modern] [rm] [serif] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [tt] [mono] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [mm] [math] [modern] [default] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern-base] [t2a,t2b,t2c,x2] + \definetypeface [modern] [rm] [serif] [computer-modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [ss] [sans] [computer-modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [tt] [mono] [computer-modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [mm] [math] [computer-modern] [default] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [postscript] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo] + \definetypeface [postscript] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9] + \definetypeface [postscript] [tt] [mono] [courier] [default] [encoding=\typescripttwo,rscale=1.1] + \definetypeface [postscript] [mm] [math] [times] [default] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [times,termes] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9] + \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05] + \definetypeface [\typescriptone] [mm] [math] [times] [default] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [palatino,pagella] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo,rscale=1.075] + \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.075] + \definetypeface [\typescriptone] [mm] [math] [palatino] [default] [encoding=default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [fourier] [ec] + \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec] + \definetypeface [fourier] [ss] [sans] [modern] [default] [encoding=ec,rscale=1.07] + \definetypeface [fourier] [tt] [mono] [modern] [default] [encoding=ec,rscale=1.07] + \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default] + \quittypescriptscanning +\stoptypescript + +% handy + +\starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it + \definefontsynonym [Simple] [cmvtt10] + \setupfontsynonym [Simple] [handling=pure] +\stoptypescript + +\starttypescript [modernvariable] [texnansi,ec,qx,8r,t5] + \definetypeface [modernvariable] [rm] [serif] [simple] [default] [encoding=\typescripttwo] + \definetypeface [modernvariable] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modernvariable] [tt] [mono] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modernvariable] [mm] [math] [modern] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [optima] [texnansi,ec,qx] + \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo] + \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo] + \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] + \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [antykwa-torunska] [texnansi,ec,8r,uc,t5,t2a] + \definetypeface[antykwa][rm][serif][antykwa-torunska] [default][encoding=\typescripttwo] + \definetypeface[antykwa][ss][sans] [modern] [default][encoding=\typescripttwo,rscale=1.05] + \definetypeface[antykwa][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] + \definetypeface[antykwa][mm][math] [antykwa-torunska] [default][encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [schoolbook,schola] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [bookman,bonum] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [chancery,chorus] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] [texnansi,ec,8r,uc,t2a] + \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss] + \quittypescriptscanning +\stoptypescript + +\starttypescript [helvetica,heros] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo,rscale=1.15] + \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.15] + \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default,rscale=1.15] + \quittypescriptscanning +\stoptypescript + +\starttypescript [avantgarde,adventor] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [ss] [sans] [adventor] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo,rscale=1.15] + \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.15] + \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [courier,cursor] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] + \quittypescriptscanning +\stoptypescript + +\stoptypescriptcollection + +\starttypescriptcollection[typeone] + +\starttypescript [map] [all] + \loadmapfile[original-base.map] + \loadmapfile[original-ams-base.map] +\stoptypescript + +\starttypescript[all][modern,latin-modern][all] + % fallbacks, no math in latin modern + \definefontsynonym[lmdunh10][cmdunh10] + \definefontsynonym[lmff10] [cmff10] + \definefontsynonym[lmfi10] [cmfi10] + \definefontsynonym[lmfib8] [cmfib8] + \definefontsynonym[lmtex10] [cmtex10] + \definefontsynonym[lmtex8] [cmtex8] + \definefontsynonym[lmtex9] [cmtex9] + \loadmapfile[original-public-lm.map] +\stoptypescript + +\starttypescript [serif] [modern,latin-modern] [texnansi,ec,qx,t5] + \definefontsynonym [LMRoman5-Regular] [\typescriptthree-lmr5] [encoding=\typescriptthree] + \definefontsynonym [LMRoman6-Regular] [\typescriptthree-lmr6] [encoding=\typescriptthree] + \definefontsynonym [LMRoman7-Regular] [\typescriptthree-lmr7] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Regular] [\typescriptthree-lmr8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Regular] [\typescriptthree-lmr9] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Regular] [\typescriptthree-lmr10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Regular] [\typescriptthree-lmr12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman17-Regular] [\typescriptthree-lmr17] [encoding=\typescriptthree] + \definefontsynonym [LMRoman5-Bold] [\typescriptthree-lmbx5] [encoding=\typescriptthree] + \definefontsynonym [LMRoman6-Bold] [\typescriptthree-lmbx6] [encoding=\typescriptthree] + \definefontsynonym [LMRoman7-Bold] [\typescriptthree-lmbx7] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Bold] [\typescriptthree-lmbx8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Bold] [\typescriptthree-lmbx9] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Bold] [\typescriptthree-lmbx10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Bold] [\typescriptthree-lmbx12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman7-Italic] [\typescriptthree-lmri7] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Italic] [\typescriptthree-lmri8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Italic] [\typescriptthree-lmri9] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Italic] [\typescriptthree-lmri10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Italic] [\typescriptthree-lmri12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-BoldItalic] [\typescriptthree-lmbxi10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Oblique] [\typescriptthree-lmro8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Oblique] [\typescriptthree-lmro9] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Oblique] [\typescriptthree-lmro10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Oblique] [\typescriptthree-lmro12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman17-Oblique] [\typescriptthree-lmro17] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-BoldOblique] [\typescriptthree-lmbxo10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Demi] [\typescriptthree-lmb10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-DemiOblique] [\typescriptthree-lmbo10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-CapsRegular] [\typescriptthree-lmcsc10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-CapsOblique] [\typescriptthree-lmcsco10] [encoding=\typescriptthree] + + \definefontsynonym [LMRoman10-Dunhill] [\typescriptthree-lmdunh10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-DunhillOblique] [\typescriptthree-lmduno10] [encoding=\typescriptthree] + \loadmapfile[lm-\typescriptthree.map] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern] [texnansi,ec,qx,t5] + \definefontsynonym [LMSans8-Regular] [\typescriptthree-lmss8] [encoding=\typescriptthree] + \definefontsynonym [LMSans9-Regular] [\typescriptthree-lmss9] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-Regular] [\typescriptthree-lmss10] [encoding=\typescriptthree] + \definefontsynonym [LMSans12-Regular] [\typescriptthree-lmss12] [encoding=\typescriptthree] + \definefontsynonym [LMSans17-Regular] [\typescriptthree-lmss17] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-Bold] [\typescriptthree-lmssbx10] [encoding=\typescriptthree] + \definefontsynonym [LMSans8-Oblique] [\typescriptthree-lmsso8] [encoding=\typescriptthree] + \definefontsynonym [LMSans9-Oblique] [\typescriptthree-lmsso9] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-Oblique] [\typescriptthree-lmsso10] [encoding=\typescriptthree] + \definefontsynonym [LMSans12-Oblique] [\typescriptthree-lmsso12] [encoding=\typescriptthree] + \definefontsynonym [LMSans17-Oblique] [\typescriptthree-lmsso17] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-BoldOblique] [\typescriptthree-lmssbo10] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-DemiCondensed] [\typescriptthree-lmssdc10] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-DemiCondensedOblique] [\typescriptthree-lmssdo10] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-Regular] [\typescriptthree-lmssq8] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-Bold] [\typescriptthree-lmssqbx8] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-Oblique] [\typescriptthree-lmssqo8] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-BoldOblique] [\typescriptthree-lmssqbo8] [encoding=\typescriptthree] + \loadmapfile[lm-\typescriptthree.map] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] [texnansi,ec,qx,t5] + \definefontsynonym [LMTypewriter8-Regular] [\typescriptthree-lmtt8] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter9-Regular] [\typescriptthree-lmtt9] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Regular] [\typescriptthree-lmtt10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter12-Regular] [\typescriptthree-lmtt12] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Italic] [\typescriptthree-lmtti10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Oblique] [\typescriptthree-lmtto10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-CapsRegular] [\typescriptthree-lmtcsc10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-CapsOblique] [\typescriptthree-lmtcso10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Light] [\typescriptthree-lmtl10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-LightOblique] [\typescriptthree-lmtlo10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-LightCondensed] [\typescriptthree-lmtlc10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-LightCondensedOblique] [\typescriptthree-lmtlco10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Dark] [\typescriptthree-lmtk10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-DarkOblique] [\typescriptthree-lmtko10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Unslanted] [\typescriptthree-lmu10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-Regular] [\typescriptthree-lmvtt10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-Oblique] [\typescriptthree-lmvtto10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-Light] [\typescriptthree-lmvtl10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-LightOblique] [\typescriptthree-lmvtlo10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-Dark] [\typescriptthree-lmvtk10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\typescriptthree-lmvtko10] [encoding=\typescriptthree] + \loadmapfile[lm-\typescriptthree.map] +\stoptypescript + +\starttypescript [math] [modern,latin-modern] + \definefontsynonym [LMMathRoman5-Regular] [rm-lmr5] + \definefontsynonym [LMMathRoman6-Regular] [rm-lmr6] + \definefontsynonym [LMMathRoman7-Regular] [rm-lmr7] + \definefontsynonym [LMMathRoman8-Regular] [rm-lmr8] + \definefontsynonym [LMMathRoman9-Regular] [rm-lmr9] + \definefontsynonym [LMMathRoman10-Regular] [rm-lmr10] + \definefontsynonym [LMMathRoman12-Regular] [rm-lmr12] + \definefontsynonym [LMMathRoman17-Regular] [rm-lmr17] + \definefontsynonym [LMMathRoman5-Bold] [rm-lmbx5] + \definefontsynonym [LMMathRoman6-Bold] [rm-lmbx6] + \definefontsynonym [LMMathRoman7-Bold] [rm-lmbx7] + \definefontsynonym [LMMathRoman8-Bold] [rm-lmbx8] + \definefontsynonym [LMMathRoman9-Bold] [rm-lmbx9] + \definefontsynonym [LMMathRoman10-Bold] [rm-lmbx10] + \definefontsynonym [LMMathRoman12-Bold] [rm-lmbx12] + \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5] + \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7] + \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10] + \definefontsynonym [LMMathSymbols5-Italic] [lmsy5] + \definefontsynonym [LMMathSymbols6-Italic] [lmsy6] + \definefontsynonym [LMMathSymbols7-Italic] [lmsy7] + \definefontsynonym [LMMathSymbols8-Italic] [lmsy8] + \definefontsynonym [LMMathSymbols9-Italic] [lmsy9] + \definefontsynonym [LMMathSymbols10-Italic] [lmsy10] + \definefontsynonym [LMMathExtension10-Regular] [lmex10] + \definefontsynonym [LMMathItalic5-Italic] [lmmi5] + \definefontsynonym [LMMathItalic6-Italic] [lmmi6] + \definefontsynonym [LMMathItalic7-Italic] [lmmi7] + \definefontsynonym [LMMathItalic8-Italic] [lmmi8] + \definefontsynonym [LMMathItalic9-Italic] [lmmi9] + \definefontsynonym [LMMathItalic10-Italic] [lmmi10] + \definefontsynonym [LMMathItalic12-Italic] [lmmi12] + \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5] + \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7] + \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10] + \usemathcollection[default] + \loadmapfile[lm-math.map] + \loadmapfile[lm-rm.map] +\stoptypescript + +%D {\em Comments by Victor Figurnov:} the wcmb10, wcmbx10, +%D \unknown\ fonts below are taken from the Paradissa +%D collection by Basil Malyshev. These fonts don't conform t2a +%D encoding but are in MS Windows Cyrillic codepage 1251 +%D encoding. These fonts contain only 33 russian letters in +%D upper and lower case, the number sign, and guillemots. But +%D even among these characters only the basic 32 russian +%D letters (in upper and lower case) will be typeset correctly +%D with this definition. The letters cyrillicYO and +%D cyrillicyo, as well as number sign (textnumero) and +%D guillemots won't be typeset properly, because these symbols +%D have different positions in t2a and MS CP1251 encodings. +%D +%D I think that the russian lh fonts and|/|or cm-super provide +%D better alternatives (type1). Therefore, the names below +%D match those of cm-super (\type {0NNN} instead of \type +%D {NNN}, i.e.\ four digit numbers). + +\starttypescript [serif] [computer-modern] [cyr] + \definefontsynonym [cmb10] [wcmb10] [encoding=t2a] + \definefontsynonym [cmbsy10] [wcmbsy10] [encoding=t2a] + \definefontsynonym [cmbx10] [wcmbx10] [encoding=t2a] + \definefontsynonym [cmbx12] [wcmbx12] [encoding=t2a] + \definefontsynonym [cmbx5] [wcmbx5] [encoding=t2a] + \definefontsynonym [cmbx6] [wcmbx6] [encoding=t2a] + \definefontsynonym [cmbx7] [wcmbx7] [encoding=t2a] + \definefontsynonym [cmbx8] [wcmbx8] [encoding=t2a] + \definefontsynonym [cmbx9] [wcmbx9] [encoding=t2a] + \definefontsynonym [cmbxsl10] [wcmbxsl10] [encoding=t2a] + \definefontsynonym [cmbxti10] [wcmbxti10] [encoding=t2a] + \definefontsynonym [cmcsc10] [wcmcsc10] [encoding=t2a] + %definefontsynonym [cmdunh10] [wcmdunh10] [encoding=t2a] + \definefontsynonym [cminch] [wcminch] [encoding=t2a] + \definefontsynonym [cmr10] [wcmr10] [encoding=t2a] + \definefontsynonym [cmr12] [wcmr12] [encoding=t2a] + \definefontsynonym [cmr17] [wcmr17] [encoding=t2a] + \definefontsynonym [cmr5] [wcmr5] [encoding=t2a] + \definefontsynonym [cmr6] [wcmr6] [encoding=t2a] + \definefontsynonym [cmr7] [wcmr7] [encoding=t2a] + \definefontsynonym [cmr8] [wcmr8] [encoding=t2a] + \definefontsynonym [cmr9] [wcmr9] [encoding=t2a] + \definefontsynonym [cmsl10] [wcmsl10] [encoding=t2a] + \definefontsynonym [cmsl12] [wcmsl12] [encoding=t2a] + \definefontsynonym [cmsl8] [wcmsl8] [encoding=t2a] + \definefontsynonym [cmsl9] [wcmsl9] [encoding=t2a] + \definefontsynonym [cmti10] [wcmti10] [encoding=t2a] + \definefontsynonym [cmti12] [wcmti12] [encoding=t2a] + \definefontsynonym [cmti7] [wcmti7] [encoding=t2a] + \definefontsynonym [cmti8] [wcmti8] [encoding=t2a] + \definefontsynonym [cmti9] [wcmti9] [encoding=t2a] + \definefontsynonym [cmu10] [wcmu10] [encoding=t2a] +\stoptypescript + +\starttypescript [sans] [computer-modern] [cyr] + \definefontsynonym [cmss10] [wcmss10] [encoding=t2a] + \definefontsynonym [cmss12] [wcmss12] [encoding=t2a] + \definefontsynonym [cmss17] [wcmss17] [encoding=t2a] + \definefontsynonym [cmss8] [wcmss8] [encoding=t2a] + \definefontsynonym [cmss9] [wcmss9] [encoding=t2a] + %definefontsynonym [cmssbi10] [wcmssbi10] [encoding=t2a] + \definefontsynonym [cmssbx10] [wcmssbx10] [encoding=t2a] + \definefontsynonym [cmssdc10] [wcmssdc10] [encoding=t2a] + \definefontsynonym [cmssi10] [wcmssi10] [encoding=t2a] + \definefontsynonym [cmssi12] [wcmssi12] [encoding=t2a] + \definefontsynonym [cmssi17] [wcmssi17] [encoding=t2a] + \definefontsynonym [cmssi8] [wcmssi8] [encoding=t2a] + \definefontsynonym [cmssi9] [wcmssi9] [encoding=t2a] + \definefontsynonym [cmssq8] [wcmssq8] [encoding=t2a] + \definefontsynonym [cmssqi8] [wcmssqi8] [encoding=t2a] +\stoptypescript + +\starttypescript [mono] [computer-modern] [cyr] + \definefontsynonym [cmitt10] [wcmitt10] [encoding=t2a] + \definefontsynonym [cmsltt10] [wcmsltt10] [encoding=t2a] + \definefontsynonym [cmtt10] [wcmtt10] [encoding=t2a] + \definefontsynonym [cmtt12] [wcmtt12] [encoding=t2a] + \definefontsynonym [cmtt8] [wcmtt8] [encoding=t2a] + \definefontsynonym [cmtt9] [wcmtt9] [encoding=t2a] + %definefontsynonym [cmvtt10] [wcmvtt10] [encoding=t2a] +\stoptypescript + +\definetypescriptprefix [c:t2a] [la] +\definetypescriptprefix [c:t2b] [lb] +\definetypescriptprefix [c:t2c] [lc] +\definetypescriptprefix [c:x2] [rx] + +\starttypescript [all] [computer-modern] [t2a,t2b,t2c,x2] + \loadmapfile[subset-cmsuper-\typescriptthree.map] + \loadmapfile[subset-cmsuper-\typescriptthree.map] + \loadmapfile[cm-super-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [cmb10] [\typescriptprefix{c:\typescriptthree}rb1000] [encoding=\typescriptthree] + \definefontsynonym [cmbx10] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] + \definefontsynonym [cmbx12] [\typescriptprefix{c:\typescriptthree}bx1200] [encoding=\typescriptthree] + \definefontsynonym [cmbx5] [\typescriptprefix{c:\typescriptthree}bx0500] [encoding=\typescriptthree] + \definefontsynonym [cmbx6] [\typescriptprefix{c:\typescriptthree}bx0600] [encoding=\typescriptthree] + \definefontsynonym [cmbx7] [\typescriptprefix{c:\typescriptthree}bx0700] [encoding=\typescriptthree] + \definefontsynonym [cmbx8] [\typescriptprefix{c:\typescriptthree}bx0800] [encoding=\typescriptthree] + \definefontsynonym [cmbx9] [\typescriptprefix{c:\typescriptthree}bx0900] [encoding=\typescriptthree] + \definefontsynonym [cmbxsl10] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] + \definefontsynonym [cmbxti10] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] + \definefontsynonym [cmcsc10] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] + \definefontsynonym [cmdunh10] [\typescriptprefix{c:\typescriptthree}dh1000] [encoding=\typescriptthree] + \definefontsynonym [cmff10] [\typescriptprefix{c:\typescriptthree}ff1000] [encoding=\typescriptthree] + \definefontsynonym [cmfi10] [\typescriptprefix{c:\typescriptthree}fi1000] [encoding=\typescriptthree] + \definefontsynonym [cmfib8] [\typescriptprefix{c:\typescriptthree}fb0800] [encoding=\typescriptthree] + %\definefontsynonym [cminch] [\typescriptprefix{c:\typescriptthree}inch00] [encoding=\typescriptthree] + \definefontsynonym [cmr10] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] + \definefontsynonym [cmr12] [\typescriptprefix{c:\typescriptthree}rm1200] [encoding=\typescriptthree] + \definefontsynonym [cmr17] [\typescriptprefix{c:\typescriptthree}rm1700] [encoding=\typescriptthree] + \definefontsynonym [cmr5] [\typescriptprefix{c:\typescriptthree}rm0500] [encoding=\typescriptthree] + \definefontsynonym [cmr6] [\typescriptprefix{c:\typescriptthree}rm0600] [encoding=\typescriptthree] + \definefontsynonym [cmr7] [\typescriptprefix{c:\typescriptthree}rm0700] [encoding=\typescriptthree] + \definefontsynonym [cmr8] [\typescriptprefix{c:\typescriptthree}rm0800] [encoding=\typescriptthree] + \definefontsynonym [cmr9] [\typescriptprefix{c:\typescriptthree}rm0900] [encoding=\typescriptthree] + \definefontsynonym [cmsl10] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] + \definefontsynonym [cmsl12] [\typescriptprefix{c:\typescriptthree}sl1200] [encoding=\typescriptthree] + \definefontsynonym [cmsl8] [\typescriptprefix{c:\typescriptthree}sl0800] [encoding=\typescriptthree] + \definefontsynonym [cmsl9] [\typescriptprefix{c:\typescriptthree}sl0900] [encoding=\typescriptthree] + \definefontsynonym [cmtcsc10] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] + \definefontsynonym [cmti10] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] + \definefontsynonym [cmti12] [\typescriptprefix{c:\typescriptthree}ti1200] [encoding=\typescriptthree] + \definefontsynonym [cmti7] [\typescriptprefix{c:\typescriptthree}ti0700] [encoding=\typescriptthree] + \definefontsynonym [cmti8] [\typescriptprefix{c:\typescriptthree}ti0800] [encoding=\typescriptthree] + \definefontsynonym [cmti9] [\typescriptprefix{c:\typescriptthree}ti0900] [encoding=\typescriptthree] + \definefontsynonym [cmu10] [\typescriptprefix{c:\typescriptthree}ui1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [cmss10] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] + \definefontsynonym [cmss12] [\typescriptprefix{c:\typescriptthree}ss1200] [encoding=\typescriptthree] + \definefontsynonym [cmss17] [\typescriptprefix{c:\typescriptthree}ss1700] [encoding=\typescriptthree] + \definefontsynonym [cmss8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] + \definefontsynonym [cmss9] [\typescriptprefix{c:\typescriptthree}ss0900] [encoding=\typescriptthree] + \definefontsynonym [cmssbx10] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] + %\definefontsynonym [cmssdc10] [\typescriptprefix{c:\typescriptthree}ssdc1000] [encoding=\typescriptthree] + \definefontsynonym [cmssi10] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] + \definefontsynonym [cmssi12] [\typescriptprefix{c:\typescriptthree}si1200] [encoding=\typescriptthree] + \definefontsynonym [cmssi17] [\typescriptprefix{c:\typescriptthree}si1700] [encoding=\typescriptthree] + \definefontsynonym [cmssi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] + \definefontsynonym [cmssi9] [\typescriptprefix{c:\typescriptthree}si0900] [encoding=\typescriptthree] + \definefontsynonym [cmssq8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] + \definefontsynonym [cmssqi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [cmitt10] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] + \definefontsynonym [cmsltt10] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] + \definefontsynonym [cmtt10] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] + \definefontsynonym [cmtt12] [\typescriptprefix{c:\typescriptthree}tt1200] [encoding=\typescriptthree] + \definefontsynonym [cmtt8] [\typescriptprefix{c:\typescriptthree}tt0800] [encoding=\typescriptthree] + \definefontsynonym [cmtt9] [\typescriptprefix{c:\typescriptthree}tt0900] [encoding=\typescriptthree] + \definefontsynonym [cmvtt10] [\typescriptprefix{c:\typescriptthree}vt1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [serif] [computer-modern] [lcy] + \definefontsynonym [cmb10] [lhb10] [encoding=lcy] + \definefontsynonym [cmbx10] [lhbx10] [encoding=lcy] + \definefontsynonym [cmbx12] [lhbx12] [encoding=lcy] + \definefontsynonym [cmbx5] [lhbx5] [encoding=lcy] + \definefontsynonym [cmbx6] [lhbx6] [encoding=lcy] + \definefontsynonym [cmbx7] [lhbx7] [encoding=lcy] + \definefontsynonym [cmbx8] [lhbx8] [encoding=lcy] + \definefontsynonym [cmbx9] [lhbx9] [encoding=lcy] + \definefontsynonym [cmbxsl10] [lhbxsl10] [encoding=lcy] + \definefontsynonym [cmbxti10] [lhbxti10] [encoding=lcy] + \definefontsynonym [cmcsc10] [lhcsc10] [encoding=lcy] + \definefontsynonym [cmdunh10] [lhdunh10] [encoding=lcy] + \definefontsynonym [cmff10] [lhff10] [encoding=lcy] + \definefontsynonym [cmfi10] [lhfi10] [encoding=lcy] + \definefontsynonym [cmfib8] [lhfib8] [encoding=lcy] + \definefontsynonym [cminch] [lhinch] [encoding=lcy] + \definefontsynonym [cmr10] [lhr10] [encoding=lcy] + \definefontsynonym [cmr12] [lhr12] [encoding=lcy] + \definefontsynonym [cmr17] [lhr17] [encoding=lcy] + \definefontsynonym [cmr5] [lhr5] [encoding=lcy] + \definefontsynonym [cmr6] [lhr6] [encoding=lcy] + \definefontsynonym [cmr7] [lhr7] [encoding=lcy] + \definefontsynonym [cmr8] [lhr8] [encoding=lcy] + \definefontsynonym [cmr9] [lhr9] [encoding=lcy] + \definefontsynonym [cmsl10] [lhsl10] [encoding=lcy] + \definefontsynonym [cmsl12] [lhsl12] [encoding=lcy] + \definefontsynonym [cmsl8] [lhsl8] [encoding=lcy] + \definefontsynonym [cmsl9] [lhsl9] [encoding=lcy] + \definefontsynonym [cmtcsc10] [lhtcsc10] [encoding=lcy] + \definefontsynonym [cmtex10] [lhtex10] [encoding=lcy] + \definefontsynonym [cmtex8] [lhtex8] [encoding=lcy] + \definefontsynonym [cmtex9] [lhtex9] [encoding=lcy] + \definefontsynonym [cmti10] [lhti10] [encoding=lcy] + \definefontsynonym [cmti12] [lhti12] [encoding=lcy] + \definefontsynonym [cmti7] [lhti7] [encoding=lcy] + \definefontsynonym [cmti8] [lhti8] [encoding=lcy] + \definefontsynonym [cmti9] [lhti9] [encoding=lcy] + \definefontsynonym [cmu10] [lhu10] [encoding=lcy] +\stoptypescript + +\starttypescript [sans] [computer-modern] [lcy] + \definefontsynonym [cmss10] [lhss10] [encoding=lcy] + \definefontsynonym [cmss12] [lhss12] [encoding=lcy] + \definefontsynonym [cmss17] [lhss17] [encoding=lcy] + \definefontsynonym [cmss8] [lhss8] [encoding=lcy] + \definefontsynonym [cmss9] [lhss9] [encoding=lcy] + \definefontsynonym [cmssbi10] [lhssbi10] [encoding=lcy] + \definefontsynonym [cmssbx10] [lhssbx10] [encoding=lcy] + \definefontsynonym [cmssdc10] [lhssdc10] [encoding=lcy] + \definefontsynonym [cmssi10] [lhssi10] [encoding=lcy] + \definefontsynonym [cmssi12] [lhssi12] [encoding=lcy] + \definefontsynonym [cmssi17] [lhssi17] [encoding=lcy] + \definefontsynonym [cmssi8] [lhssi8] [encoding=lcy] + \definefontsynonym [cmssi9] [lhssi9] [encoding=lcy] + \definefontsynonym [cmssq8] [lhssq8] [encoding=lcy] + \definefontsynonym [cmssqi8] [lhssqi8] [encoding=lcy] +\stoptypescript + +\starttypescript [mono] [computer-modern] [lcy] + \definefontsynonym [cmitt10] [lhitt10] [encoding=lcy] + \definefontsynonym [cmsltt10] [lhsltt10] [encoding=lcy] + \definefontsynonym [cmtt10] [lhtt10] [encoding=lcy] + \definefontsynonym [cmtt12] [lhtt12] [encoding=lcy] + \definefontsynonym [cmtt8] [lhtt8] [encoding=lcy] + \definefontsynonym [cmtt9] [lhtt9] [encoding=lcy] + \definefontsynonym [cmvtt10] [lhvtt10] [encoding=lcy] +\stoptypescript + +% + +\starttypescript [math] [modern,computer-modern,latin-modern] % [default] + % watch the space, it prevents remapping + \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10]% [lmr10 ] + \definefontsynonym [ComputerModernMath-Extension] [lmex10] + \definefontsynonym [ComputerModernMath-Italic] [lmmi10] + \definefontsynonym [ComputerModernMath-Symbol] [lmsy10] +\stoptypescript + +\starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] % [default] + % watch the space, it prevents remapping + \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10] % [lmb10 ] + \definefontsynonym [ComputerModernMath-Extension] [lmex10] + \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10] + \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10] +\stoptypescript + +% Till we have cyrilic in lm: + +% \usetypescript[modern-base][t2a] +% \setupbodyfont[modern,10pt] + +\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [Serif] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] + \definefontsynonym [SerifItalic] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] + \definefontsynonym [SerifSlanted] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] + \definefontsynonym [SerifBold] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] + \definefontsynonym [SerifBoldItalic] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] + \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] + \definefontsynonym [SerifCaps] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] + \definefontsynonym [SerifCapsSlanted] [\typescriptprefix{c:\typescriptthree}sc1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [Sans] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] + \definefontsynonym [SansItalic] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] + \definefontsynonym [SansSlanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] + \definefontsynonym [SansBold] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] + \definefontsynonym [SansBoldItalic] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree] + \definefontsynonym [SansBoldSlanted] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree] + \definefontsynonym [SansCaps] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] + \definefontsynonym [SansCapsSlanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [Mono] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] + \definefontsynonym [MonoItalic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] + \definefontsynonym [MonoSlanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] + \definefontsynonym [MonoBold] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] + \definefontsynonym [MonoBoldItalic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] + \definefontsynonym [MonoBoldSlanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] + \definefontsynonym [MonoCaps] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] + \definefontsynonym [MonoCapsSlanted] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] +\stoptypescript + +% Computer Concrete (AMS) + +\starttypescript [serif] [concrete] [default] + \definefontsynonym [ComputerConcrete] [ccr10] + \definefontsynonym [ComputerConcrete-Italic] [ccti10] + \definefontsynonym [ComputerConcrete-Slanted] [ccsl10] + \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete] + \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic] + \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted] + \definefontsynonym [ComputerConcrete-Caps] [cccsc10] +\stoptypescript + +% Euler (AMS) + +\starttypescript [math] [euler] [default] + \definefontsynonym [Euler-Roman] [zeurm10] + \definefontsynonym [Euler-Extension] [zeuex10] + \definefontsynonym [Euler-Symbol] [zeusm10] + \definefontsynonym [Euler-Fraktur] [eufm10] + \usemathcollection[eul] + \loadmapfile[original-ams-euler.map] +\stoptypescript + +\starttypescript [boldmath,bfmath] [euler] [default] + \definefontsynonym [Euler-Roman-Bold] [zeurb10] + \definefontsynonym [Euler-Extension] [zeuex10] + \definefontsynonym [Euler-Symbol-Bold] [zeusb10] + \definefontsynonym [Euler-Fraktur-Bold] [eufb10] + \usemathcollection[eul] + \loadmapfile[original-ams-euler.map] +\stoptypescript + +% AMS (AMS) + +\starttypescript [math] [modern,computer-modern,latin-modern,ams] [default] + \definefontsynonym [AMS-SymbolA] [msam10] + \definefontsynonym [AMS-SymbolB] [msbm10] + \usemathcollection[default] +\stoptypescript + +% Fourier (Utopia) + +\starttypescript [math] [fourier] [default,ec] + \definefontsynonym [Fourier-Math-Letters] [futr8t] [encoding=ec] + %definefontsynonym [Fourier-Math-Letters] [futmi] + \definefontsynonym [Fourier-Math-Letters-Italic] [futmii] + \definefontsynonym [Fourier-Math-Symbols] [futsy] + \definefontsynonym [Fourier-Math-Extension] [fourier-mex] + \usemathcollection[fou] + \loadmapfile[fourier.map] +\stoptypescript + +\starttypescript [serif] [fourier] [ec] + \definefontsynonym [Fourier-Regular] [futr8t] [encoding=ec] + \definefontsynonym [Fourier-Slanted] [futro8t] [encoding=ec] + \definefontsynonym [Fourier-Italic] [futri8t] [encoding=ec] + \definefontsynonym [Fourier-RegularCaps] [futrc8t] [encoding=ec] + \definefontsynonym [Fourier-Bold] [futb8t] [encoding=ec] + \definefontsynonym [Fourier-BoldSlanted] [futbo8t] [encoding=ec] + \definefontsynonym [Fourier-BoldItalic] [futbi8t] [encoding=ec] + \definefontsynonym [Fourier-BoldCaps] [futbc8t] [encoding=ec] + \definefontsynonym [Fourier-Regular-Expert] [futr9e] [encoding=ec] + \definefontsynonym [Fourier-Slanted-Expert] [futro9e] [encoding=ec] + \definefontsynonym [Fourier-Italic-Expert] [futri9e] [encoding=ec] + \definefontsynonym [Fourier-RegularCaps-Expert] [futrc9e] [encoding=ec] + \definefontsynonym [Fourier-Semi-Expert] [futs9e] [encoding=ec] + \definefontsynonym [Fourier-SemiSlanted-Expert] [futso9e] [encoding=ec] + \definefontsynonym [Fourier-SemiItalic-Expert] [futsi9e] [encoding=ec] + \definefontsynonym [Fourier-SemiCaps-Expert] [futsc9e] [encoding=ec] + \definefontsynonym [Fourier-Bold-Expert] [futb9e] [encoding=ec] + \definefontsynonym [Fourier-BoldSlanted-Expert] [futbo9e] [encoding=ec] + \definefontsynonym [Fourier-BoldItalic-Expert] [futbi9e] [encoding=ec] + \definefontsynonym [Fourier-Black-Expert] [futc9e] [encoding=ec] + \definefontsynonym [Fourier-Regular-OldStyle] [futr9d] [encoding=ec] + \definefontsynonym [Fourier-Slanted-OldStyle] [futro9d] [encoding=ec] + \definefontsynonym [Fourier-Italic-OldStyle] [futri9d] [encoding=ec] + \definefontsynonym [Fourier-RegularCaps-OldStyle] [futrc9d] [encoding=ec] + \definefontsynonym [Fourier-Semi-OldStyle] [futs9d] [encoding=ec] + \definefontsynonym [Fourier-SemiSlanted-OldStyle] [futso9d] [encoding=ec] + \definefontsynonym [Fourier-SemiItalic-OldStyle] [futsi9d] [encoding=ec] + \definefontsynonym [Fourier-SemiCaps-OldStyle] [futsc9d] [encoding=ec] + \definefontsynonym [Fourier-Bold-OldStyle] [futb9d] [encoding=ec] + \definefontsynonym [Fourier-BoldSlanted-OldStyle] [futbo9d] [encoding=ec] + \definefontsynonym [Fourier-BoldItalic-OldStyle] [futbi9d] [encoding=ec] + \definefontsynonym [Fourier-Black-OldStyle] [futc9d] [encoding=ec] + \loadmapfile[fourier.map] + \loadmapfile[fourier-utopia-expert.map] +\stoptypescript + +% Antykwa Torunska (GUST) + +% \starttypescript [serif] [antykwa-torunska] [texnansi,ec,8r] +% \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] +% \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] +% \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] +% \stoptypescript + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec,t2a,t2b,t2c,greek] + \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalic] [\typescriptthree-anttbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Light] [\typescriptthree-anttl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalic] [\typescriptthree-anttli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Medium] [\typescriptthree-anttm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalic] [\typescriptthree-anttmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondRegular] [\typescriptthree-anttcr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalic] [\typescriptthree-anttcri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBold] [\typescriptthree-anttcb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalic] [\typescriptthree-anttcbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLight] [\typescriptthree-anttcl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalic][\typescriptthree-anttcli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedium] [\typescriptthree-anttcm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalic] [\typescriptthree-anttcmi] [encoding=\typescriptthree] + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec] + \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttrcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttricap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttbcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttlcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttlicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttmcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcrcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcricap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcbcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttclcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttclicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcmcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmicap] [encoding=\typescriptthree] + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +% duplicates ? ? +% atl: no: fallbacks for the named variants + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c,greek] + \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c] + \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +% mabye no -Regular etc +% dunny reverse of condlight lightcond + +\starttypescript [math] [antykwa-torunska] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr] + \definefontsynonym [AntykwaTorunska-Math-Letters-Italic] [mi-anttri] + \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz] + \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-light] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl] + \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli] + \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz] + \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-cond] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondItalic] [mi-anttcri] + \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz] + \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-lightcond] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli] + \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz] + \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl] +\stoptypescript + +\starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [default] + \usemathcollection[default] + \loadmapfile[antt-rm.map] + \loadmapfile[antt-mi.map] + \loadmapfile[antt-sy.map] + \loadmapfile[antt-ex.map] +\stoptypescript + +% Antykwa Poltawskiego (GUST) + +\starttypescript [serif] [antykwa-poltawskiego] [texnansi,ec,8r] + \definefontsynonym [AntykwaPoltawskiego-Regular] [\typescriptthree-antpr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaPoltawskiego-Bold] [\typescriptthree-antpb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaPoltawskiego-Italic] [\typescriptthree-antpri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\typescriptthree-antpbi] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-public-antp.map] +\stoptypescript + +% Iwona (JMN) + +% maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic + +\starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond] [texnansi,ec,el,qx,t5] + \definefontsynonym[Iwona-Regular] [\typescriptthree-iwonar] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Italic] [\typescriptthree-iwonari] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Bold] [\typescriptthree-iwonab] [encoding=\typescriptthree] + \definefontsynonym[Iwona-BoldItalic] [\typescriptthree-iwonabi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Light-Regular] [\typescriptthree-iwonal] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Light-Italic] [\typescriptthree-iwonali] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Medium-Regular] [\typescriptthree-iwonam] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Medium-Italic] [\typescriptthree-iwonami] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Heavy-Regular] [\typescriptthree-iwonah] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Heavy-Italic] [\typescriptthree-iwonahi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsRegular] [\typescriptthree-iwonarcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsItalic] [\typescriptthree-iwonaricap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsBold] [\typescriptthree-iwonabcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsBoldItalic] [\typescriptthree-iwonabicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsLight-Regular] [\typescriptthree-iwonalcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsLight-Italic] [\typescriptthree-iwonalicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsMedium-Regular] [\typescriptthree-iwonamcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsMedium-Italic] [\typescriptthree-iwonamicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsHeavy-Regular] [\typescriptthree-iwonahcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsHeavy-Italic] [\typescriptthree-iwonahicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondRegular] [\typescriptthree-iwonacr] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondItalic] [\typescriptthree-iwonacri] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondBold] [\typescriptthree-iwonacb] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondBoldItalic] [\typescriptthree-iwonacbi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondLight-Regular] [\typescriptthree-iwonacl] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondLight-Italic] [\typescriptthree-iwonacli] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondMedium-Regular] [\typescriptthree-iwonacm] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondMedium-Italic] [\typescriptthree-iwonacmi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondHeavy-Regular] [\typescriptthree-iwonach] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondHeavy-Italic] [\typescriptthree-iwonachi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondRegular] [\typescriptthree-iwonacrcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondItalic] [\typescriptthree-iwonacricap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondBold] [\typescriptthree-iwonacbcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondBoldItalic] [\typescriptthree-iwonacbicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondLight-Regular] [\typescriptthree-iwonaclcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondLight-Italic] [\typescriptthree-iwonaclicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondMedium-Regular][\typescriptthree-iwonacmcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondMedium-Italic] [\typescriptthree-iwonacmicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondHeavy-Regular] [\typescriptthree-iwonachcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsCondHeavy-Italic] [\typescriptthree-iwonachicap] [encoding=\typescriptthree] + \loadmapfile[iwona-\typescriptthree.map] +\stoptypescript + +\starttypescript [math] [iwona] [default] + \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar] + \definefontsynonym [Iwona-Math-Letters-Italic] [mi-iwonari] + \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz] + \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar] +\stoptypescript + +\starttypescript [math] [iwona-light] [default] + \definefontsynonym [Iwona-Math-Letters-Light-Regular] [rm-iwonal] + \definefontsynonym [Iwona-Math-Letters-Light-Italic] [mi-iwonali] + \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz] + \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal] +\stoptypescript + +\starttypescript [math] [iwona-medium] [default] + \definefontsynonym [Iwona-Math-Letters-Medium-Regular][rm-iwonam] + \definefontsynonym [Iwona-Math-Letters-Medium-Italic] [mi-iwonami] + \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz] + \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam] +\stoptypescript + +\starttypescript [math] [iwona-heavy] [default] + \definefontsynonym [Iwona-Math-Letters-Heavy-Regular] [rm-iwonah] + \definefontsynonym [Iwona-Math-Letters-Heavy-Italic] [mi-iwonahi] + \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz] + \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah] +\stoptypescript + +\starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default] + \usemathcollection[default] + \loadmapfile[iwona-rm.map] + \loadmapfile[iwona-mi.map] + \loadmapfile[iwona-sy.map] + \loadmapfile[iwona-ex.map] +\stoptypescript + +% Kurier (JMN) + +\starttypescript [sans] [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5] + \definefontsynonym[Kurier-Regular] [\typescriptthree-kurierr] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Italic] [\typescriptthree-kurierri] [encoding=\typescriptthree] + \definefontsynonym[Kurier-RegularItalic] [Kurier-Italic] + \definefontsynonym[Kurier-Bold] [\typescriptthree-kurierb] [encoding=\typescriptthree] + \definefontsynonym[Kurier-BoldItalic] [\typescriptthree-kurierbi] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Light] [\typescriptthree-kurierl] [encoding=\typescriptthree] + \definefontsynonym[Kurier-LightItalic] [\typescriptthree-kurierli] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Medium] [\typescriptthree-kurierm] [encoding=\typescriptthree] + \definefontsynonym[Kurier-MediumItalic] [\typescriptthree-kuriermi] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Heavy] [\typescriptthree-kurierh] [encoding=\typescriptthree] + \definefontsynonym[Kurier-HeavyItalic] [\typescriptthree-kurierhi] [encoding=\typescriptthree] + \loadmapfile[kurier-\typescriptthree.map] +\stoptypescript + +\starttypescript [math] [kurier] [default] + \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr] + \definefontsynonym [Kurier-Math-Letters-Italic] [mi-kurierri] + \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz] + \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr] +\stoptypescript + +\starttypescript [math] [kurier-light] [default] + \definefontsynonym [Kurier-Math-Letters-Light-Regular] [rm-kurierl] + \definefontsynonym [Kurier-Math-Letters-Light-Italic] [mi-kurierli] + \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz] + \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl] +\stoptypescript + +\starttypescript [math] [kurier-medium] [default] + \definefontsynonym [Kurier-Math-Letters-Medium-Regular][rm-kurierm] + \definefontsynonym [Kurier-Math-Letters-Medium-Italic] [mi-kuriermi] + \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz] + \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm] +\stoptypescript + +\starttypescript [math] [kurier,kurier-light,kurier-medium] [default] + \usemathcollection[default] + \loadmapfile[kurier-rm.map] + \loadmapfile[kurier-mi.map] + \loadmapfile[kurier-sy.map] + \loadmapfile[kurier-ex.map] +\stoptypescript + +\starttypescript [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5] + \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.05] + \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss] + \quittypescriptscanning +\stoptypescript + +% Utopia (Adobe) + +\starttypescript [serif] [utopia] [ec,texnansi] + \definefontsynonym [Utopia-Regular] [\typescriptthree-putr8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Italic] [\typescriptthree-putri8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Bold] [\typescriptthree-putb8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-BoldItalic] [\typescriptthree-putbi8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Slanted] [\typescriptthree-putr8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Utopia-BoldSlanted] [\typescriptthree-putb8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Regular-Caps][\typescriptthree-putr8a-capitalized-800] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-adobe-utopia.map] +\stoptypescript + +% Charter (Bitstream) + +\starttypescript [serif] [charter] [ec,texnansi,8r] + \definefontsynonym [Charter-Roman] [\typescriptthree-bchr8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-Italic] [\typescriptthree-bchri8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-Bold] [\typescriptthree-bchb8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-BoldItalic] [\typescriptthree-bchbi8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-Slanted] [\typescriptthree-bchr8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Charter-BoldSlanted][\typescriptthree-bchb8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Charter-Roman-Caps] [\typescriptthree-bchr8a-capitalized-800] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-bitstrea-charter.map] +\stoptypescript + +% Whatever else we need: + +\starttypescript + \definefontsynonym [ZapfDingbats] [uzdr] + \definefontsynonym [RalfSmithFormalScript] [rsfs10] + \definefontsynonym [MartinVogel] [fmvr8x] +\stoptypescript + +% +% TeXGyre +% +% We now use tex-gyre fonts by default ... + +\definetypescriptprefix [f:pagella] [pl] \definetypescriptprefix [f:palatino] [pl] +\definetypescriptprefix [f:termes] [tm] \definetypescriptprefix [f:times] [tm] +\definetypescriptprefix [f:heros] [hv] \definetypescriptprefix [f:helvetica] [hv] +\definetypescriptprefix [f:bonum] [bk] \definetypescriptprefix [f:bookman] [bk] +\definetypescriptprefix [f:schola] [cs] \definetypescriptprefix [f:schoolbook] [cs] +\definetypescriptprefix [f:adventor][ag] %definetypescriptprefix [f:adventor] [ag] +\definetypescriptprefix [f:cursor] [cr] \definetypescriptprefix [f:courier] [cr] +\definetypescriptprefix [f:chorus] [zc] \definetypescriptprefix [f:chancery] [zc] % not the full set + +\starttypescript [serif,sans,mono] [pagella,palatino,termes,times,adventor,bonum,bookman,cursor,courier,heros,helvetica,schola,schoolbook] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi] [encoding=\typescriptthree] + \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif,sans,mono] [pagella,palatino,termes,times,adventor,bonum,bookman,cursor,courier,heros,helvetica,schola,schoolbook] [ec,texnansi,cs,qx,rm,t5,l7x] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r-sc] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri-sc] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b-sc] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi-sc] [encoding=\typescriptthree] + \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif] [chorus,chancery] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] + \definefontsynonym [TeXGyreChorus-MediumItalic] [\typescriptthree-qzcmi] [encoding=\typescriptthree] + \loadmapfile[qzc-\typescriptthree.map] +\stoptypescript + +% bonus definitions + +% when these fonts are in tex live ... +% +% \definefontsynonym [Palatino-Caps] [TeXPalladioL-SC] [encoding=\typescriptthree] +% +% \starttypescript [serif] [palatino] [ec,texnansi] +% \definefontsynonym[TeXPalladioL-BoldItalicOsF][\typescriptthree-fplbij8a][encoding=\typescriptthree] +% \definefontsynonym[TeXPalladioL-BoldOsF] [\typescriptthree-fplbj8a] [encoding=\typescriptthree] +% \definefontsynonym[TeXPalladioL-SC] [\typescriptthree-fplrc8a] [encoding=\typescriptthree] +% \definefontsynonym[TeXPalladioL-ItalicOsF] [\typescriptthree-fplrij8a][encoding=\typescriptthree] +% \loadmapfile[\typescriptthree-urw-palatino.map] +% \stoptypescript + +% Palatino Math (px) + +\starttypescript [math] [palatino] [all] + \definefontsynonym [Palatino-Roman-Upright] [pxr] + \definefontsynonym [Palatino-Roman-Italic] [pxi] + \definefontsynonym [Palatino-Roman-Slanted] [pxsl] + \definefontsynonym [Palatino-Roman-Caps] [pxsc] + \definefontsynonym [Palatino-Companion-Upright] [pcxr] + \definefontsynonym [Palatino-Companion-Italic] [pcxi] + \definefontsynonym [Palatino-Companion-Slanted] [pcxsl] + \definefontsynonym [Palatino-Math-Italic] [pxmi] + \definefontsynonym [Palatino-Math-Symbols] [pxsy] + \definefontsynonym [Palatino-Math-Extension] [pxex] + \definefontsynonym [Palatino-Math-SymbolsA] [pxsya] + \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb] + \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc] + \definefontsynonym [Palatino-Math-Italic-A] [pxmia] + \definefontsynonym [Palatino-Math-Extension-A] [pxexa] + \usemathcollection[default] + \loadmapfile[original-youngryu-px.map] +\stoptypescript + +% Times Math (tx) + +\starttypescript [math] [times] [all] + \definefontsynonym [Times-Roman-Upright] [txr] + \definefontsynonym [Times-Roman-Italic] [txi] + \definefontsynonym [Times-Roman-Slanted] [txsl] + \definefontsynonym [Times-Roman-Caps] [txsc] + \definefontsynonym [Times-Companion-Upright] [tcxr] + \definefontsynonym [Times-Companion-Italic] [tcxi] + \definefontsynonym [Times-Companion-Slanted] [tcxsl] + \definefontsynonym [Times-Math-Italic] [txmi] + \definefontsynonym [Times-Math-Symbols] [txsy] + \definefontsynonym [Times-Math-Extension] [txex] + \definefontsynonym [Times-Math-SymbolsA] [txsya] + \definefontsynonym [Times-Math-SymbolsB] [txsyb] + \definefontsynonym [Times-Math-SymbolsC] [txsyc] + \definefontsynonym [Times-Math-Italic-A] [txmia] + \definefontsynonym [Times-Math-Extension-A] [txexa] + \usemathcollection[default] + \loadmapfile[original-youngryu-tx.map] +\stoptypescript + +%D These are just fallbacks in case anyone stil uses the old names (might also be removed?). + +% +% TeXGyrePagella +% +\starttypescript [serif] [palatino] + \definefontsynonym [Palatino] [TeXGyrePagella-Regular] + \definefontsynonym [Palatino-Italic] [TeXGyrePagella-Italic] + \definefontsynonym [Palatino-Bold] [TeXGyrePagella-Bold] + \definefontsynonym [Palatino-BoldItalic] [TeXGyrePagella-BoldItalic] + \definefontsynonym [Palatino-Slanted] [TeXGyrePagella-Italic] + \definefontsynonym [Palatino-BoldSlanted] [TeXGyrePagella-BoldItalic] + \definefontsynonym [Palatino-Caps] [TeXGyrePagella-Caps] +\stoptypescript +% +% TeXGyreTermes +% +\starttypescript [serif] [times] + \definefontsynonym [Times-Roman] [TeXGyreTermes-Regular] + \definefontsynonym [Times-Italic] [TeXGyreTermes-Italic] + \definefontsynonym [Times-Bold] [TeXGyreTermes-Bold] + \definefontsynonym [Times-BoldItalic] [TeXGyreTermes-BoldItalic] + \definefontsynonym [Times-Slanted] [TeXGyreTermes-Italic] + \definefontsynonym [Times-BoldSlanted] [TeXGyreTermes-BoldItalic] + \definefontsynonym [Times-Caps] [TeXGyreTermes-Caps] +\stoptypescript +% +% TeXGyreHeros +% +\starttypescript [sans] [helvetica] + \definefontsynonym [Helvetica] [TeXGyreHeros-Regular] + \definefontsynonym [Helvetica-Oblique] [TeXGyreHeros-Italic] + \definefontsynonym [Helvetica-Bold] [TeXGyreHeros-Bold] + \definefontsynonym [Helvetica-BoldOblique] [TeXGyreHeros-BoldItalic] + \definefontsynonym [Helvetica-Caps] [TeXGyreHeros-Caps] +\stoptypescript +% +% TeXGyreBonum +% +\starttypescript [serif] [bookman] + \definefontsynonym [Bookman-Light] [TeXGyreBonum-Regular] + \definefontsynonym [Bookman-LightItalic] [TeXGyreBonum-Italic] + \definefontsynonym [Bookman-DemiBold] [TeXGyreBonum-Bold] + \definefontsynonym [Bookman-DemiBoldItalic] [TeXGyreBonum-BoldItalic] + \definefontsynonym [Bookman-LightSlanted] [TeXGyreBonum-Italic] + \definefontsynonym [Bookman-DemiBoldSlanted] [TeXGyreBonum-BoldItalic] + \definefontsynonym [Bookman-Light-Caps] [TeXGyreBonum-Caps] +\stoptypescript +% +% TeXGyreScola +% +\starttypescript [serif] [schoolbook] + \definefontsynonym [Schoolbook-Roman] [TeXGyreScola-Regular] + \definefontsynonym [Schoolbook-Italic] [TeXGyreScola-Italic] + \definefontsynonym [Schoolbook-Bold] [TeXGyreScola-Bold] + \definefontsynonym [Schoolbook-BoldItalic] [TeXGyreScola-BoldItalic] + \definefontsynonym [Schoolbook-Slanted] [TeXGyreScola-Italic] + \definefontsynonym [Schoolbook-BoldSlanted] [TeXGyreScola-BoldItalic] + \definefontsynonym [Schoolbook-Roman-Caps] [TeXGyreScola-Caps] +\stoptypescript +% +% TeXGyreAdventor +% +% +% TeXGyreCursor +% +\starttypescript [mono] [courier] + \definefontsynonym [Courier] [TeXGyreCursor-Regular] + \definefontsynonym [Courier-Bold] [TeXGyreCursor-Bold] + \definefontsynonym [Courier-Oblique] [TeXGyreCursor-Italic] + \definefontsynonym [Courier-BoldOblique] [TeXGyreCursor-BoldItalic] + \fakecontrolspace +\stoptypescript +% +% TeXGyreChorus +% +\starttypescript [calligraphy] [chancery] + \definefontsynonym [Chancery] [TeXGyreChorus-MediumItalic] +\stoptypescript + +\stoptypescriptcollection + +\endinput diff --git a/tex/context/base/type-one.mkiv b/tex/context/base/type-one.mkiv new file mode 100644 index 000000000..6f64dff0a --- /dev/null +++ b/tex/context/base/type-one.mkiv @@ -0,0 +1,16 @@ +%D \module +%D [ file=type-one, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Type One 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. + +% We use open type fonts in \MKIV. + +\endinput diff --git a/tex/context/base/type-one.tex b/tex/context/base/type-one.tex index b456d7e64..bd18eb281 100644 --- a/tex/context/base/type-one.tex +++ b/tex/context/base/type-one.tex @@ -11,1175 +11,6 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This file merges the traditional enc, syn and map files into one. If -%D you think that it looks messy you're right. It shows some history of -%D \TEX\ fonts and the development towards latin modern. - -% texfont --ven=public --col=antt --enc=ec --sou=auto -% texfont --ven=public --col=antp --enc=ec --sou=auto -% texfont --ven=urw --col=palatino --enc=ec --sou=auto -% texfont --ven-lucas --col=sun --enc=ec --sou=. - -% \usetypescript [all] [modern] [texnansi] -% \setupbodyfont[reset] \setupbodyfont[cmr] -% \starttext \showfont[Serif] \stoptext - -\starttypescriptcollection[examples] - -\starttypescript [fallback] [texnansi,ec,qx,t5,default] - \definetypeface [] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [modern] [texnansi,ec,qx,t5,default] - \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [modern] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [modern-base] [texnansi,ec,qx,t5,default] - \definetypeface [modern] [rm] [serif] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [tt] [mono] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [mm] [math] [modern] [default] [encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [modern-base] [t2a,t2b,t2c,x2] - \definetypeface [modern] [rm] [serif] [computer-modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [ss] [sans] [computer-modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [tt] [mono] [computer-modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [mm] [math] [computer-modern] [default] [encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [postscript] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo] - \definetypeface [postscript] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9] - \definetypeface [postscript] [tt] [mono] [courier] [default] [encoding=\typescripttwo,rscale=1.1] - \definetypeface [postscript] [mm] [math] [times] [default] [encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [times,termes] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9] - \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05] - \definetypeface [\typescriptone] [mm] [math] [times] [default] [encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [palatino,pagella] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo,rscale=1.075] - \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.075] - \definetypeface [\typescriptone] [mm] [math] [palatino] [default] [encoding=default] - \quittypescriptscanning -\stoptypescript - -\starttypescript [fourier] [ec] - \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec] - \definetypeface [fourier] [ss] [sans] [modern] [default] [encoding=ec,rscale=1.07] - \definetypeface [fourier] [tt] [mono] [modern] [default] [encoding=ec,rscale=1.07] - \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default] - \quittypescriptscanning -\stoptypescript - -% handy - -\starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it - \definefontsynonym [Simple] [cmvtt10] - \setupfontsynonym [Simple] [handling=pure] -\stoptypescript - -\starttypescript [modernvariable] [texnansi,ec,qx,8r,t5] - \definetypeface [modernvariable] [rm] [serif] [simple] [default] [encoding=\typescripttwo] - \definetypeface [modernvariable] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modernvariable] [tt] [mono] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modernvariable] [mm] [math] [modern] [default] - \quittypescriptscanning -\stoptypescript - -\starttypescript [optima] [texnansi,ec,qx] - \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo] - \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo] - \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] - \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [antykwa-torunska] [texnansi,ec,8r,uc,t5,t2a] - \definetypeface[antykwa][rm][serif][antykwa-torunska] [default][encoding=\typescripttwo] - \definetypeface[antykwa][ss][sans] [modern] [default][encoding=\typescripttwo,rscale=1.05] - \definetypeface[antykwa][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] - \definetypeface[antykwa][mm][math] [antykwa-torunska] [default][encoding=\typescripttwo] - \quittypescriptscanning -\stoptypescript - -\starttypescript [schoolbook,schola] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] - \quittypescriptscanning -\stoptypescript - -\starttypescript [bookman,bonum] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] - \quittypescriptscanning -\stoptypescript - -\starttypescript [chancery,chorus] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] - \quittypescriptscanning -\stoptypescript - -\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] [texnansi,ec,8r,uc,t2a] - \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss] - \quittypescriptscanning -\stoptypescript - -\starttypescript [helvetica,heros] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo,rscale=1.15] - \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.15] - \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default,rscale=1.15] - \quittypescriptscanning -\stoptypescript - -\starttypescript [avantgarde,adventor] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [ss] [sans] [adventor] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo,rscale=1.15] - \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.15] - \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] - \quittypescriptscanning -\stoptypescript - -\starttypescript [courier,cursor] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default] - \quittypescriptscanning -\stoptypescript - -\stoptypescriptcollection - -\starttypescriptcollection[typeone] - -\starttypescript [map] [all] - \loadmapfile[original-base.map] - \loadmapfile[original-ams-base.map] -\stoptypescript - -\starttypescript[all][modern,latin-modern][all] - % fallbacks, no math in latin modern - \definefontsynonym[lmdunh10][cmdunh10] - \definefontsynonym[lmff10] [cmff10] - \definefontsynonym[lmfi10] [cmfi10] - \definefontsynonym[lmfib8] [cmfib8] - \definefontsynonym[lmtex10] [cmtex10] - \definefontsynonym[lmtex8] [cmtex8] - \definefontsynonym[lmtex9] [cmtex9] - \loadmapfile[original-public-lm.map] -\stoptypescript - -\starttypescript [serif] [modern,latin-modern] [texnansi,ec,qx,t5] - \definefontsynonym [LMRoman5-Regular] [\typescriptthree-lmr5] [encoding=\typescriptthree] - \definefontsynonym [LMRoman6-Regular] [\typescriptthree-lmr6] [encoding=\typescriptthree] - \definefontsynonym [LMRoman7-Regular] [\typescriptthree-lmr7] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Regular] [\typescriptthree-lmr8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Regular] [\typescriptthree-lmr9] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Regular] [\typescriptthree-lmr10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Regular] [\typescriptthree-lmr12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman17-Regular] [\typescriptthree-lmr17] [encoding=\typescriptthree] - \definefontsynonym [LMRoman5-Bold] [\typescriptthree-lmbx5] [encoding=\typescriptthree] - \definefontsynonym [LMRoman6-Bold] [\typescriptthree-lmbx6] [encoding=\typescriptthree] - \definefontsynonym [LMRoman7-Bold] [\typescriptthree-lmbx7] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Bold] [\typescriptthree-lmbx8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Bold] [\typescriptthree-lmbx9] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Bold] [\typescriptthree-lmbx10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Bold] [\typescriptthree-lmbx12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman7-Italic] [\typescriptthree-lmri7] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Italic] [\typescriptthree-lmri8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Italic] [\typescriptthree-lmri9] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Italic] [\typescriptthree-lmri10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Italic] [\typescriptthree-lmri12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-BoldItalic] [\typescriptthree-lmbxi10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman8-Oblique] [\typescriptthree-lmro8] [encoding=\typescriptthree] - \definefontsynonym [LMRoman9-Oblique] [\typescriptthree-lmro9] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Oblique] [\typescriptthree-lmro10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman12-Oblique] [\typescriptthree-lmro12] [encoding=\typescriptthree] - \definefontsynonym [LMRoman17-Oblique] [\typescriptthree-lmro17] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-BoldOblique] [\typescriptthree-lmbxo10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-Demi] [\typescriptthree-lmb10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-DemiOblique] [\typescriptthree-lmbo10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-CapsRegular] [\typescriptthree-lmcsc10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-CapsOblique] [\typescriptthree-lmcsco10] [encoding=\typescriptthree] - - \definefontsynonym [LMRoman10-Dunhill] [\typescriptthree-lmdunh10] [encoding=\typescriptthree] - \definefontsynonym [LMRoman10-DunhillOblique] [\typescriptthree-lmduno10] [encoding=\typescriptthree] - \loadmapfile[lm-\typescriptthree.map] -\stoptypescript - -\starttypescript [sans] [modern,latin-modern] [texnansi,ec,qx,t5] - \definefontsynonym [LMSans8-Regular] [\typescriptthree-lmss8] [encoding=\typescriptthree] - \definefontsynonym [LMSans9-Regular] [\typescriptthree-lmss9] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-Regular] [\typescriptthree-lmss10] [encoding=\typescriptthree] - \definefontsynonym [LMSans12-Regular] [\typescriptthree-lmss12] [encoding=\typescriptthree] - \definefontsynonym [LMSans17-Regular] [\typescriptthree-lmss17] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-Bold] [\typescriptthree-lmssbx10] [encoding=\typescriptthree] - \definefontsynonym [LMSans8-Oblique] [\typescriptthree-lmsso8] [encoding=\typescriptthree] - \definefontsynonym [LMSans9-Oblique] [\typescriptthree-lmsso9] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-Oblique] [\typescriptthree-lmsso10] [encoding=\typescriptthree] - \definefontsynonym [LMSans12-Oblique] [\typescriptthree-lmsso12] [encoding=\typescriptthree] - \definefontsynonym [LMSans17-Oblique] [\typescriptthree-lmsso17] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-BoldOblique] [\typescriptthree-lmssbo10] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-DemiCondensed] [\typescriptthree-lmssdc10] [encoding=\typescriptthree] - \definefontsynonym [LMSans10-DemiCondensedOblique] [\typescriptthree-lmssdo10] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-Regular] [\typescriptthree-lmssq8] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-Bold] [\typescriptthree-lmssqbx8] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-Oblique] [\typescriptthree-lmssqo8] [encoding=\typescriptthree] - \definefontsynonym [LMSansQuotation8-BoldOblique] [\typescriptthree-lmssqbo8] [encoding=\typescriptthree] - \loadmapfile[lm-\typescriptthree.map] -\stoptypescript - -\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] [texnansi,ec,qx,t5] - \definefontsynonym [LMTypewriter8-Regular] [\typescriptthree-lmtt8] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter9-Regular] [\typescriptthree-lmtt9] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Regular] [\typescriptthree-lmtt10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter12-Regular] [\typescriptthree-lmtt12] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Italic] [\typescriptthree-lmtti10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Oblique] [\typescriptthree-lmtto10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-CapsRegular] [\typescriptthree-lmtcsc10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-CapsOblique] [\typescriptthree-lmtcso10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Light] [\typescriptthree-lmtl10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-LightOblique] [\typescriptthree-lmtlo10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-LightCondensed] [\typescriptthree-lmtlc10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-LightCondensedOblique] [\typescriptthree-lmtlco10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Dark] [\typescriptthree-lmtk10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-DarkOblique] [\typescriptthree-lmtko10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriter10-Unslanted] [\typescriptthree-lmu10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-Regular] [\typescriptthree-lmvtt10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-Oblique] [\typescriptthree-lmvtto10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-Light] [\typescriptthree-lmvtl10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-LightOblique] [\typescriptthree-lmvtlo10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-Dark] [\typescriptthree-lmvtk10] [encoding=\typescriptthree] - \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\typescriptthree-lmvtko10] [encoding=\typescriptthree] - \loadmapfile[lm-\typescriptthree.map] -\stoptypescript - -\starttypescript [math] [modern,latin-modern] - \definefontsynonym [LMMathRoman5-Regular] [rm-lmr5] - \definefontsynonym [LMMathRoman6-Regular] [rm-lmr6] - \definefontsynonym [LMMathRoman7-Regular] [rm-lmr7] - \definefontsynonym [LMMathRoman8-Regular] [rm-lmr8] - \definefontsynonym [LMMathRoman9-Regular] [rm-lmr9] - \definefontsynonym [LMMathRoman10-Regular] [rm-lmr10] - \definefontsynonym [LMMathRoman12-Regular] [rm-lmr12] - \definefontsynonym [LMMathRoman17-Regular] [rm-lmr17] - \definefontsynonym [LMMathRoman5-Bold] [rm-lmbx5] - \definefontsynonym [LMMathRoman6-Bold] [rm-lmbx6] - \definefontsynonym [LMMathRoman7-Bold] [rm-lmbx7] - \definefontsynonym [LMMathRoman8-Bold] [rm-lmbx8] - \definefontsynonym [LMMathRoman9-Bold] [rm-lmbx9] - \definefontsynonym [LMMathRoman10-Bold] [rm-lmbx10] - \definefontsynonym [LMMathRoman12-Bold] [rm-lmbx12] - \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5] - \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7] - \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10] - \definefontsynonym [LMMathSymbols5-Italic] [lmsy5] - \definefontsynonym [LMMathSymbols6-Italic] [lmsy6] - \definefontsynonym [LMMathSymbols7-Italic] [lmsy7] - \definefontsynonym [LMMathSymbols8-Italic] [lmsy8] - \definefontsynonym [LMMathSymbols9-Italic] [lmsy9] - \definefontsynonym [LMMathSymbols10-Italic] [lmsy10] - \definefontsynonym [LMMathExtension10-Regular] [lmex10] - \definefontsynonym [LMMathItalic5-Italic] [lmmi5] - \definefontsynonym [LMMathItalic6-Italic] [lmmi6] - \definefontsynonym [LMMathItalic7-Italic] [lmmi7] - \definefontsynonym [LMMathItalic8-Italic] [lmmi8] - \definefontsynonym [LMMathItalic9-Italic] [lmmi9] - \definefontsynonym [LMMathItalic10-Italic] [lmmi10] - \definefontsynonym [LMMathItalic12-Italic] [lmmi12] - \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5] - \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7] - \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10] - \usemathcollection[default] - \loadmapfile[lm-math.map] - \loadmapfile[lm-rm.map] -\stoptypescript - -%D {\em Comments by Victor Figurnov:} the wcmb10, wcmbx10, -%D \unknown\ fonts below are taken from the Paradissa -%D collection by Basil Malyshev. These fonts don't conform t2a -%D encoding but are in MS Windows Cyrillic codepage 1251 -%D encoding. These fonts contain only 33 russian letters in -%D upper and lower case, the number sign, and guillemots. But -%D even among these characters only the basic 32 russian -%D letters (in upper and lower case) will be typeset correctly -%D with this definition. The letters cyrillicYO and -%D cyrillicyo, as well as number sign (textnumero) and -%D guillemots won't be typeset properly, because these symbols -%D have different positions in t2a and MS CP1251 encodings. -%D -%D I think that the russian lh fonts and|/|or cm-super provide -%D better alternatives (type1). Therefore, the names below -%D match those of cm-super (\type {0NNN} instead of \type -%D {NNN}, i.e.\ four digit numbers). - -\starttypescript [serif] [computer-modern] [cyr] - \definefontsynonym [cmb10] [wcmb10] [encoding=t2a] - \definefontsynonym [cmbsy10] [wcmbsy10] [encoding=t2a] - \definefontsynonym [cmbx10] [wcmbx10] [encoding=t2a] - \definefontsynonym [cmbx12] [wcmbx12] [encoding=t2a] - \definefontsynonym [cmbx5] [wcmbx5] [encoding=t2a] - \definefontsynonym [cmbx6] [wcmbx6] [encoding=t2a] - \definefontsynonym [cmbx7] [wcmbx7] [encoding=t2a] - \definefontsynonym [cmbx8] [wcmbx8] [encoding=t2a] - \definefontsynonym [cmbx9] [wcmbx9] [encoding=t2a] - \definefontsynonym [cmbxsl10] [wcmbxsl10] [encoding=t2a] - \definefontsynonym [cmbxti10] [wcmbxti10] [encoding=t2a] - \definefontsynonym [cmcsc10] [wcmcsc10] [encoding=t2a] - %definefontsynonym [cmdunh10] [wcmdunh10] [encoding=t2a] - \definefontsynonym [cminch] [wcminch] [encoding=t2a] - \definefontsynonym [cmr10] [wcmr10] [encoding=t2a] - \definefontsynonym [cmr12] [wcmr12] [encoding=t2a] - \definefontsynonym [cmr17] [wcmr17] [encoding=t2a] - \definefontsynonym [cmr5] [wcmr5] [encoding=t2a] - \definefontsynonym [cmr6] [wcmr6] [encoding=t2a] - \definefontsynonym [cmr7] [wcmr7] [encoding=t2a] - \definefontsynonym [cmr8] [wcmr8] [encoding=t2a] - \definefontsynonym [cmr9] [wcmr9] [encoding=t2a] - \definefontsynonym [cmsl10] [wcmsl10] [encoding=t2a] - \definefontsynonym [cmsl12] [wcmsl12] [encoding=t2a] - \definefontsynonym [cmsl8] [wcmsl8] [encoding=t2a] - \definefontsynonym [cmsl9] [wcmsl9] [encoding=t2a] - \definefontsynonym [cmti10] [wcmti10] [encoding=t2a] - \definefontsynonym [cmti12] [wcmti12] [encoding=t2a] - \definefontsynonym [cmti7] [wcmti7] [encoding=t2a] - \definefontsynonym [cmti8] [wcmti8] [encoding=t2a] - \definefontsynonym [cmti9] [wcmti9] [encoding=t2a] - \definefontsynonym [cmu10] [wcmu10] [encoding=t2a] -\stoptypescript - -\starttypescript [sans] [computer-modern] [cyr] - \definefontsynonym [cmss10] [wcmss10] [encoding=t2a] - \definefontsynonym [cmss12] [wcmss12] [encoding=t2a] - \definefontsynonym [cmss17] [wcmss17] [encoding=t2a] - \definefontsynonym [cmss8] [wcmss8] [encoding=t2a] - \definefontsynonym [cmss9] [wcmss9] [encoding=t2a] - %definefontsynonym [cmssbi10] [wcmssbi10] [encoding=t2a] - \definefontsynonym [cmssbx10] [wcmssbx10] [encoding=t2a] - \definefontsynonym [cmssdc10] [wcmssdc10] [encoding=t2a] - \definefontsynonym [cmssi10] [wcmssi10] [encoding=t2a] - \definefontsynonym [cmssi12] [wcmssi12] [encoding=t2a] - \definefontsynonym [cmssi17] [wcmssi17] [encoding=t2a] - \definefontsynonym [cmssi8] [wcmssi8] [encoding=t2a] - \definefontsynonym [cmssi9] [wcmssi9] [encoding=t2a] - \definefontsynonym [cmssq8] [wcmssq8] [encoding=t2a] - \definefontsynonym [cmssqi8] [wcmssqi8] [encoding=t2a] -\stoptypescript - -\starttypescript [mono] [computer-modern] [cyr] - \definefontsynonym [cmitt10] [wcmitt10] [encoding=t2a] - \definefontsynonym [cmsltt10] [wcmsltt10] [encoding=t2a] - \definefontsynonym [cmtt10] [wcmtt10] [encoding=t2a] - \definefontsynonym [cmtt12] [wcmtt12] [encoding=t2a] - \definefontsynonym [cmtt8] [wcmtt8] [encoding=t2a] - \definefontsynonym [cmtt9] [wcmtt9] [encoding=t2a] - %definefontsynonym [cmvtt10] [wcmvtt10] [encoding=t2a] -\stoptypescript - -\definetypescriptprefix [c:t2a] [la] -\definetypescriptprefix [c:t2b] [lb] -\definetypescriptprefix [c:t2c] [lc] -\definetypescriptprefix [c:x2] [rx] - -\starttypescript [all] [computer-modern] [t2a,t2b,t2c,x2] - \loadmapfile[subset-cmsuper-\typescriptthree.map] - \loadmapfile[subset-cmsuper-\typescriptthree.map] - \loadmapfile[cm-super-\typescriptthree.map] -\stoptypescript - -\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [cmb10] [\typescriptprefix{c:\typescriptthree}rb1000] [encoding=\typescriptthree] - \definefontsynonym [cmbx10] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] - \definefontsynonym [cmbx12] [\typescriptprefix{c:\typescriptthree}bx1200] [encoding=\typescriptthree] - \definefontsynonym [cmbx5] [\typescriptprefix{c:\typescriptthree}bx0500] [encoding=\typescriptthree] - \definefontsynonym [cmbx6] [\typescriptprefix{c:\typescriptthree}bx0600] [encoding=\typescriptthree] - \definefontsynonym [cmbx7] [\typescriptprefix{c:\typescriptthree}bx0700] [encoding=\typescriptthree] - \definefontsynonym [cmbx8] [\typescriptprefix{c:\typescriptthree}bx0800] [encoding=\typescriptthree] - \definefontsynonym [cmbx9] [\typescriptprefix{c:\typescriptthree}bx0900] [encoding=\typescriptthree] - \definefontsynonym [cmbxsl10] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] - \definefontsynonym [cmbxti10] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] - \definefontsynonym [cmcsc10] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] - \definefontsynonym [cmdunh10] [\typescriptprefix{c:\typescriptthree}dh1000] [encoding=\typescriptthree] - \definefontsynonym [cmff10] [\typescriptprefix{c:\typescriptthree}ff1000] [encoding=\typescriptthree] - \definefontsynonym [cmfi10] [\typescriptprefix{c:\typescriptthree}fi1000] [encoding=\typescriptthree] - \definefontsynonym [cmfib8] [\typescriptprefix{c:\typescriptthree}fb0800] [encoding=\typescriptthree] - %\definefontsynonym [cminch] [\typescriptprefix{c:\typescriptthree}inch00] [encoding=\typescriptthree] - \definefontsynonym [cmr10] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] - \definefontsynonym [cmr12] [\typescriptprefix{c:\typescriptthree}rm1200] [encoding=\typescriptthree] - \definefontsynonym [cmr17] [\typescriptprefix{c:\typescriptthree}rm1700] [encoding=\typescriptthree] - \definefontsynonym [cmr5] [\typescriptprefix{c:\typescriptthree}rm0500] [encoding=\typescriptthree] - \definefontsynonym [cmr6] [\typescriptprefix{c:\typescriptthree}rm0600] [encoding=\typescriptthree] - \definefontsynonym [cmr7] [\typescriptprefix{c:\typescriptthree}rm0700] [encoding=\typescriptthree] - \definefontsynonym [cmr8] [\typescriptprefix{c:\typescriptthree}rm0800] [encoding=\typescriptthree] - \definefontsynonym [cmr9] [\typescriptprefix{c:\typescriptthree}rm0900] [encoding=\typescriptthree] - \definefontsynonym [cmsl10] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] - \definefontsynonym [cmsl12] [\typescriptprefix{c:\typescriptthree}sl1200] [encoding=\typescriptthree] - \definefontsynonym [cmsl8] [\typescriptprefix{c:\typescriptthree}sl0800] [encoding=\typescriptthree] - \definefontsynonym [cmsl9] [\typescriptprefix{c:\typescriptthree}sl0900] [encoding=\typescriptthree] - \definefontsynonym [cmtcsc10] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] - \definefontsynonym [cmti10] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] - \definefontsynonym [cmti12] [\typescriptprefix{c:\typescriptthree}ti1200] [encoding=\typescriptthree] - \definefontsynonym [cmti7] [\typescriptprefix{c:\typescriptthree}ti0700] [encoding=\typescriptthree] - \definefontsynonym [cmti8] [\typescriptprefix{c:\typescriptthree}ti0800] [encoding=\typescriptthree] - \definefontsynonym [cmti9] [\typescriptprefix{c:\typescriptthree}ti0900] [encoding=\typescriptthree] - \definefontsynonym [cmu10] [\typescriptprefix{c:\typescriptthree}ui1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [cmss10] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] - \definefontsynonym [cmss12] [\typescriptprefix{c:\typescriptthree}ss1200] [encoding=\typescriptthree] - \definefontsynonym [cmss17] [\typescriptprefix{c:\typescriptthree}ss1700] [encoding=\typescriptthree] - \definefontsynonym [cmss8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] - \definefontsynonym [cmss9] [\typescriptprefix{c:\typescriptthree}ss0900] [encoding=\typescriptthree] - \definefontsynonym [cmssbx10] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] - %\definefontsynonym [cmssdc10] [\typescriptprefix{c:\typescriptthree}ssdc1000] [encoding=\typescriptthree] - \definefontsynonym [cmssi10] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] - \definefontsynonym [cmssi12] [\typescriptprefix{c:\typescriptthree}si1200] [encoding=\typescriptthree] - \definefontsynonym [cmssi17] [\typescriptprefix{c:\typescriptthree}si1700] [encoding=\typescriptthree] - \definefontsynonym [cmssi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] - \definefontsynonym [cmssi9] [\typescriptprefix{c:\typescriptthree}si0900] [encoding=\typescriptthree] - \definefontsynonym [cmssq8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] - \definefontsynonym [cmssqi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [cmitt10] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] - \definefontsynonym [cmsltt10] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] - \definefontsynonym [cmtt10] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] - \definefontsynonym [cmtt12] [\typescriptprefix{c:\typescriptthree}tt1200] [encoding=\typescriptthree] - \definefontsynonym [cmtt8] [\typescriptprefix{c:\typescriptthree}tt0800] [encoding=\typescriptthree] - \definefontsynonym [cmtt9] [\typescriptprefix{c:\typescriptthree}tt0900] [encoding=\typescriptthree] - \definefontsynonym [cmvtt10] [\typescriptprefix{c:\typescriptthree}vt1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [serif] [computer-modern] [lcy] - \definefontsynonym [cmb10] [lhb10] [encoding=lcy] - \definefontsynonym [cmbx10] [lhbx10] [encoding=lcy] - \definefontsynonym [cmbx12] [lhbx12] [encoding=lcy] - \definefontsynonym [cmbx5] [lhbx5] [encoding=lcy] - \definefontsynonym [cmbx6] [lhbx6] [encoding=lcy] - \definefontsynonym [cmbx7] [lhbx7] [encoding=lcy] - \definefontsynonym [cmbx8] [lhbx8] [encoding=lcy] - \definefontsynonym [cmbx9] [lhbx9] [encoding=lcy] - \definefontsynonym [cmbxsl10] [lhbxsl10] [encoding=lcy] - \definefontsynonym [cmbxti10] [lhbxti10] [encoding=lcy] - \definefontsynonym [cmcsc10] [lhcsc10] [encoding=lcy] - \definefontsynonym [cmdunh10] [lhdunh10] [encoding=lcy] - \definefontsynonym [cmff10] [lhff10] [encoding=lcy] - \definefontsynonym [cmfi10] [lhfi10] [encoding=lcy] - \definefontsynonym [cmfib8] [lhfib8] [encoding=lcy] - \definefontsynonym [cminch] [lhinch] [encoding=lcy] - \definefontsynonym [cmr10] [lhr10] [encoding=lcy] - \definefontsynonym [cmr12] [lhr12] [encoding=lcy] - \definefontsynonym [cmr17] [lhr17] [encoding=lcy] - \definefontsynonym [cmr5] [lhr5] [encoding=lcy] - \definefontsynonym [cmr6] [lhr6] [encoding=lcy] - \definefontsynonym [cmr7] [lhr7] [encoding=lcy] - \definefontsynonym [cmr8] [lhr8] [encoding=lcy] - \definefontsynonym [cmr9] [lhr9] [encoding=lcy] - \definefontsynonym [cmsl10] [lhsl10] [encoding=lcy] - \definefontsynonym [cmsl12] [lhsl12] [encoding=lcy] - \definefontsynonym [cmsl8] [lhsl8] [encoding=lcy] - \definefontsynonym [cmsl9] [lhsl9] [encoding=lcy] - \definefontsynonym [cmtcsc10] [lhtcsc10] [encoding=lcy] - \definefontsynonym [cmtex10] [lhtex10] [encoding=lcy] - \definefontsynonym [cmtex8] [lhtex8] [encoding=lcy] - \definefontsynonym [cmtex9] [lhtex9] [encoding=lcy] - \definefontsynonym [cmti10] [lhti10] [encoding=lcy] - \definefontsynonym [cmti12] [lhti12] [encoding=lcy] - \definefontsynonym [cmti7] [lhti7] [encoding=lcy] - \definefontsynonym [cmti8] [lhti8] [encoding=lcy] - \definefontsynonym [cmti9] [lhti9] [encoding=lcy] - \definefontsynonym [cmu10] [lhu10] [encoding=lcy] -\stoptypescript - -\starttypescript [sans] [computer-modern] [lcy] - \definefontsynonym [cmss10] [lhss10] [encoding=lcy] - \definefontsynonym [cmss12] [lhss12] [encoding=lcy] - \definefontsynonym [cmss17] [lhss17] [encoding=lcy] - \definefontsynonym [cmss8] [lhss8] [encoding=lcy] - \definefontsynonym [cmss9] [lhss9] [encoding=lcy] - \definefontsynonym [cmssbi10] [lhssbi10] [encoding=lcy] - \definefontsynonym [cmssbx10] [lhssbx10] [encoding=lcy] - \definefontsynonym [cmssdc10] [lhssdc10] [encoding=lcy] - \definefontsynonym [cmssi10] [lhssi10] [encoding=lcy] - \definefontsynonym [cmssi12] [lhssi12] [encoding=lcy] - \definefontsynonym [cmssi17] [lhssi17] [encoding=lcy] - \definefontsynonym [cmssi8] [lhssi8] [encoding=lcy] - \definefontsynonym [cmssi9] [lhssi9] [encoding=lcy] - \definefontsynonym [cmssq8] [lhssq8] [encoding=lcy] - \definefontsynonym [cmssqi8] [lhssqi8] [encoding=lcy] -\stoptypescript - -\starttypescript [mono] [computer-modern] [lcy] - \definefontsynonym [cmitt10] [lhitt10] [encoding=lcy] - \definefontsynonym [cmsltt10] [lhsltt10] [encoding=lcy] - \definefontsynonym [cmtt10] [lhtt10] [encoding=lcy] - \definefontsynonym [cmtt12] [lhtt12] [encoding=lcy] - \definefontsynonym [cmtt8] [lhtt8] [encoding=lcy] - \definefontsynonym [cmtt9] [lhtt9] [encoding=lcy] - \definefontsynonym [cmvtt10] [lhvtt10] [encoding=lcy] -\stoptypescript - -% - -\starttypescript [math] [modern,computer-modern,latin-modern] % [default] - % watch the space, it prevents remapping - \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10]% [lmr10 ] - \definefontsynonym [ComputerModernMath-Extension] [lmex10] - \definefontsynonym [ComputerModernMath-Italic] [lmmi10] - \definefontsynonym [ComputerModernMath-Symbol] [lmsy10] -\stoptypescript - -\starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] % [default] - % watch the space, it prevents remapping - \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10] % [lmb10 ] - \definefontsynonym [ComputerModernMath-Extension] [lmex10] - \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10] - \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10] -\stoptypescript - -% Till we have cyrilic in lm: - -% \usetypescript[modern-base][t2a] -% \setupbodyfont[modern,10pt] - -\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [Serif] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] - \definefontsynonym [SerifItalic] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] - \definefontsynonym [SerifSlanted] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] - \definefontsynonym [SerifBold] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] - \definefontsynonym [SerifBoldItalic] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] - \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] - \definefontsynonym [SerifCaps] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] - \definefontsynonym [SerifCapsSlanted] [\typescriptprefix{c:\typescriptthree}sc1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [Sans] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] - \definefontsynonym [SansItalic] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] - \definefontsynonym [SansSlanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] - \definefontsynonym [SansBold] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] - \definefontsynonym [SansBoldItalic] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree] - \definefontsynonym [SansBoldSlanted] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree] - \definefontsynonym [SansCaps] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] - \definefontsynonym [SansCapsSlanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] - \definefontsynonym [Mono] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] - \definefontsynonym [MonoItalic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] - \definefontsynonym [MonoSlanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] - \definefontsynonym [MonoBold] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] - \definefontsynonym [MonoBoldItalic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] - \definefontsynonym [MonoBoldSlanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] - \definefontsynonym [MonoCaps] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] - \definefontsynonym [MonoCapsSlanted] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] -\stoptypescript - -% Computer Concrete (AMS) - -\starttypescript [serif] [concrete] [default] - \definefontsynonym [ComputerConcrete] [ccr10] - \definefontsynonym [ComputerConcrete-Italic] [ccti10] - \definefontsynonym [ComputerConcrete-Slanted] [ccsl10] - \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete] - \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic] - \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted] - \definefontsynonym [ComputerConcrete-Caps] [cccsc10] -\stoptypescript - -% Euler (AMS) - -\starttypescript [math] [euler] [default] - \definefontsynonym [Euler-Roman] [zeurm10] - \definefontsynonym [Euler-Extension] [zeuex10] - \definefontsynonym [Euler-Symbol] [zeusm10] - \definefontsynonym [Euler-Fraktur] [eufm10] - \usemathcollection[eul] - \loadmapfile[original-ams-euler.map] -\stoptypescript - -\starttypescript [boldmath,bfmath] [euler] [default] - \definefontsynonym [Euler-Roman-Bold] [zeurb10] - \definefontsynonym [Euler-Extension] [zeuex10] - \definefontsynonym [Euler-Symbol-Bold] [zeusb10] - \definefontsynonym [Euler-Fraktur-Bold] [eufb10] - \usemathcollection[eul] - \loadmapfile[original-ams-euler.map] -\stoptypescript - -% AMS (AMS) - -\starttypescript [math] [modern,computer-modern,latin-modern,ams] [default] - \definefontsynonym [AMS-SymbolA] [msam10] - \definefontsynonym [AMS-SymbolB] [msbm10] - \usemathcollection[default] -\stoptypescript - -% Fourier (Utopia) - -\starttypescript [math] [fourier] [default,ec] - \definefontsynonym [Fourier-Math-Letters] [futr8t] [encoding=ec] - %definefontsynonym [Fourier-Math-Letters] [futmi] - \definefontsynonym [Fourier-Math-Letters-Italic] [futmii] - \definefontsynonym [Fourier-Math-Symbols] [futsy] - \definefontsynonym [Fourier-Math-Extension] [fourier-mex] - \usemathcollection[fou] - \loadmapfile[fourier.map] -\stoptypescript - -\starttypescript [serif] [fourier] [ec] - \definefontsynonym [Fourier-Regular] [futr8t] [encoding=ec] - \definefontsynonym [Fourier-Slanted] [futro8t] [encoding=ec] - \definefontsynonym [Fourier-Italic] [futri8t] [encoding=ec] - \definefontsynonym [Fourier-RegularCaps] [futrc8t] [encoding=ec] - \definefontsynonym [Fourier-Bold] [futb8t] [encoding=ec] - \definefontsynonym [Fourier-BoldSlanted] [futbo8t] [encoding=ec] - \definefontsynonym [Fourier-BoldItalic] [futbi8t] [encoding=ec] - \definefontsynonym [Fourier-BoldCaps] [futbc8t] [encoding=ec] - \definefontsynonym [Fourier-Regular-Expert] [futr9e] [encoding=ec] - \definefontsynonym [Fourier-Slanted-Expert] [futro9e] [encoding=ec] - \definefontsynonym [Fourier-Italic-Expert] [futri9e] [encoding=ec] - \definefontsynonym [Fourier-RegularCaps-Expert] [futrc9e] [encoding=ec] - \definefontsynonym [Fourier-Semi-Expert] [futs9e] [encoding=ec] - \definefontsynonym [Fourier-SemiSlanted-Expert] [futso9e] [encoding=ec] - \definefontsynonym [Fourier-SemiItalic-Expert] [futsi9e] [encoding=ec] - \definefontsynonym [Fourier-SemiCaps-Expert] [futsc9e] [encoding=ec] - \definefontsynonym [Fourier-Bold-Expert] [futb9e] [encoding=ec] - \definefontsynonym [Fourier-BoldSlanted-Expert] [futbo9e] [encoding=ec] - \definefontsynonym [Fourier-BoldItalic-Expert] [futbi9e] [encoding=ec] - \definefontsynonym [Fourier-Black-Expert] [futc9e] [encoding=ec] - \definefontsynonym [Fourier-Regular-OldStyle] [futr9d] [encoding=ec] - \definefontsynonym [Fourier-Slanted-OldStyle] [futro9d] [encoding=ec] - \definefontsynonym [Fourier-Italic-OldStyle] [futri9d] [encoding=ec] - \definefontsynonym [Fourier-RegularCaps-OldStyle] [futrc9d] [encoding=ec] - \definefontsynonym [Fourier-Semi-OldStyle] [futs9d] [encoding=ec] - \definefontsynonym [Fourier-SemiSlanted-OldStyle] [futso9d] [encoding=ec] - \definefontsynonym [Fourier-SemiItalic-OldStyle] [futsi9d] [encoding=ec] - \definefontsynonym [Fourier-SemiCaps-OldStyle] [futsc9d] [encoding=ec] - \definefontsynonym [Fourier-Bold-OldStyle] [futb9d] [encoding=ec] - \definefontsynonym [Fourier-BoldSlanted-OldStyle] [futbo9d] [encoding=ec] - \definefontsynonym [Fourier-BoldItalic-OldStyle] [futbi9d] [encoding=ec] - \definefontsynonym [Fourier-Black-OldStyle] [futc9d] [encoding=ec] - \loadmapfile[fourier.map] - \loadmapfile[fourier-utopia-expert.map] -\stoptypescript - -% Antykwa Torunska (GUST) - -% \starttypescript [serif] [antykwa-torunska] [texnansi,ec,8r] -% \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] -% \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] -% \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] -% \stoptypescript - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec,t2a,t2b,t2c,greek] - \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalic] [\typescriptthree-anttbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Light] [\typescriptthree-anttl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalic] [\typescriptthree-anttli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Medium] [\typescriptthree-anttm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalic] [\typescriptthree-anttmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondRegular] [\typescriptthree-anttcr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalic] [\typescriptthree-anttcri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBold] [\typescriptthree-anttcb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalic] [\typescriptthree-anttcbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLight] [\typescriptthree-anttcl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalic][\typescriptthree-anttcli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedium] [\typescriptthree-anttcm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalic] [\typescriptthree-anttcmi] [encoding=\typescriptthree] - \loadmapfile[antt-\typescriptthree.map] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec] - \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttrcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttricap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttbcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttlcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttlicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttmcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcrcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcricap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcbcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttclcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttclicap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcmcap] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmicap] [encoding=\typescriptthree] - \loadmapfile[antt-\typescriptthree.map] -\stoptypescript - -% duplicates ? ? -% atl: no: fallbacks for the named variants - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c,greek] - \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] - \loadmapfile[antt-\typescriptthree.map] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c] - \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] - \loadmapfile[antt-\typescriptthree.map] -\stoptypescript - -% mabye no -Regular etc -% dunny reverse of condlight lightcond - -\starttypescript [math] [antykwa-torunska] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr] - \definefontsynonym [AntykwaTorunska-Math-Letters-Italic] [mi-anttri] - \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz] - \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-light] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl] - \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli] - \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz] - \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-cond] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondItalic] [mi-anttcri] - \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz] - \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-lightcond] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli] - \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz] - \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl] -\stoptypescript - -\starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [default] - \usemathcollection[default] - \loadmapfile[antt-rm.map] - \loadmapfile[antt-mi.map] - \loadmapfile[antt-sy.map] - \loadmapfile[antt-ex.map] -\stoptypescript - -% Antykwa Poltawskiego (GUST) - -\starttypescript [serif] [antykwa-poltawskiego] [texnansi,ec,8r] - \definefontsynonym [AntykwaPoltawskiego-Regular] [\typescriptthree-antpr] [encoding=\typescriptthree] - \definefontsynonym [AntykwaPoltawskiego-Bold] [\typescriptthree-antpb] [encoding=\typescriptthree] - \definefontsynonym [AntykwaPoltawskiego-Italic] [\typescriptthree-antpri] [encoding=\typescriptthree] - \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\typescriptthree-antpbi] [encoding=\typescriptthree] - \loadmapfile[\typescriptthree-public-antp.map] -\stoptypescript - -% Iwona (JMN) - -% maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic - -\starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond] [texnansi,ec,el,qx,t5] - \definefontsynonym[Iwona-Regular] [\typescriptthree-iwonar] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Italic] [\typescriptthree-iwonari] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Bold] [\typescriptthree-iwonab] [encoding=\typescriptthree] - \definefontsynonym[Iwona-BoldItalic] [\typescriptthree-iwonabi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Light-Regular] [\typescriptthree-iwonal] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Light-Italic] [\typescriptthree-iwonali] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Medium-Regular] [\typescriptthree-iwonam] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Medium-Italic] [\typescriptthree-iwonami] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Heavy-Regular] [\typescriptthree-iwonah] [encoding=\typescriptthree] - \definefontsynonym[Iwona-Heavy-Italic] [\typescriptthree-iwonahi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsRegular] [\typescriptthree-iwonarcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsItalic] [\typescriptthree-iwonaricap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsBold] [\typescriptthree-iwonabcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsBoldItalic] [\typescriptthree-iwonabicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsLight-Regular] [\typescriptthree-iwonalcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsLight-Italic] [\typescriptthree-iwonalicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsMedium-Regular] [\typescriptthree-iwonamcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsMedium-Italic] [\typescriptthree-iwonamicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsHeavy-Regular] [\typescriptthree-iwonahcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsHeavy-Italic] [\typescriptthree-iwonahicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondRegular] [\typescriptthree-iwonacr] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondItalic] [\typescriptthree-iwonacri] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondBold] [\typescriptthree-iwonacb] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondBoldItalic] [\typescriptthree-iwonacbi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondLight-Regular] [\typescriptthree-iwonacl] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondLight-Italic] [\typescriptthree-iwonacli] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondMedium-Regular] [\typescriptthree-iwonacm] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondMedium-Italic] [\typescriptthree-iwonacmi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondHeavy-Regular] [\typescriptthree-iwonach] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CondHeavy-Italic] [\typescriptthree-iwonachi] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondRegular] [\typescriptthree-iwonacrcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondItalic] [\typescriptthree-iwonacricap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondBold] [\typescriptthree-iwonacbcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondBoldItalic] [\typescriptthree-iwonacbicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondLight-Regular] [\typescriptthree-iwonaclcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondLight-Italic] [\typescriptthree-iwonaclicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondMedium-Regular][\typescriptthree-iwonacmcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondMedium-Italic] [\typescriptthree-iwonacmicap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondHeavy-Regular] [\typescriptthree-iwonachcap] [encoding=\typescriptthree] - \definefontsynonym[Iwona-CapsCondHeavy-Italic] [\typescriptthree-iwonachicap] [encoding=\typescriptthree] - \loadmapfile[iwona-\typescriptthree.map] -\stoptypescript - -\starttypescript [math] [iwona] [default] - \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar] - \definefontsynonym [Iwona-Math-Letters-Italic] [mi-iwonari] - \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz] - \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar] -\stoptypescript - -\starttypescript [math] [iwona-light] [default] - \definefontsynonym [Iwona-Math-Letters-Light-Regular] [rm-iwonal] - \definefontsynonym [Iwona-Math-Letters-Light-Italic] [mi-iwonali] - \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz] - \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal] -\stoptypescript - -\starttypescript [math] [iwona-medium] [default] - \definefontsynonym [Iwona-Math-Letters-Medium-Regular][rm-iwonam] - \definefontsynonym [Iwona-Math-Letters-Medium-Italic] [mi-iwonami] - \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz] - \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam] -\stoptypescript - -\starttypescript [math] [iwona-heavy] [default] - \definefontsynonym [Iwona-Math-Letters-Heavy-Regular] [rm-iwonah] - \definefontsynonym [Iwona-Math-Letters-Heavy-Italic] [mi-iwonahi] - \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz] - \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah] -\stoptypescript - -\starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default] - \usemathcollection[default] - \loadmapfile[iwona-rm.map] - \loadmapfile[iwona-mi.map] - \loadmapfile[iwona-sy.map] - \loadmapfile[iwona-ex.map] -\stoptypescript - -% Kurier (JMN) - -\starttypescript [sans] [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5] - \definefontsynonym[Kurier-Regular] [\typescriptthree-kurierr] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Italic] [\typescriptthree-kurierri] [encoding=\typescriptthree] - \definefontsynonym[Kurier-RegularItalic] [Kurier-Italic] - \definefontsynonym[Kurier-Bold] [\typescriptthree-kurierb] [encoding=\typescriptthree] - \definefontsynonym[Kurier-BoldItalic] [\typescriptthree-kurierbi] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Light] [\typescriptthree-kurierl] [encoding=\typescriptthree] - \definefontsynonym[Kurier-LightItalic] [\typescriptthree-kurierli] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Medium] [\typescriptthree-kurierm] [encoding=\typescriptthree] - \definefontsynonym[Kurier-MediumItalic] [\typescriptthree-kuriermi] [encoding=\typescriptthree] - \definefontsynonym[Kurier-Heavy] [\typescriptthree-kurierh] [encoding=\typescriptthree] - \definefontsynonym[Kurier-HeavyItalic] [\typescriptthree-kurierhi] [encoding=\typescriptthree] - \loadmapfile[kurier-\typescriptthree.map] -\stoptypescript - -\starttypescript [math] [kurier] [default] - \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr] - \definefontsynonym [Kurier-Math-Letters-Italic] [mi-kurierri] - \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz] - \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr] -\stoptypescript - -\starttypescript [math] [kurier-light] [default] - \definefontsynonym [Kurier-Math-Letters-Light-Regular] [rm-kurierl] - \definefontsynonym [Kurier-Math-Letters-Light-Italic] [mi-kurierli] - \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz] - \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl] -\stoptypescript - -\starttypescript [math] [kurier-medium] [default] - \definefontsynonym [Kurier-Math-Letters-Medium-Regular][rm-kurierm] - \definefontsynonym [Kurier-Math-Letters-Medium-Italic] [mi-kuriermi] - \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz] - \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm] -\stoptypescript - -\starttypescript [math] [kurier,kurier-light,kurier-medium] [default] - \usemathcollection[default] - \loadmapfile[kurier-rm.map] - \loadmapfile[kurier-mi.map] - \loadmapfile[kurier-sy.map] - \loadmapfile[kurier-ex.map] -\stoptypescript - -\starttypescript [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5] - \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.05] - \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss] - \quittypescriptscanning -\stoptypescript - -% Utopia (Adobe) - -\starttypescript [serif] [utopia] [ec,texnansi] - \definefontsynonym [Utopia-Regular] [\typescriptthree-putr8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Italic] [\typescriptthree-putri8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Bold] [\typescriptthree-putb8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-BoldItalic] [\typescriptthree-putbi8a] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Slanted] [\typescriptthree-putr8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Utopia-BoldSlanted] [\typescriptthree-putb8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Utopia-Regular-Caps][\typescriptthree-putr8a-capitalized-800] [encoding=\typescriptthree] - \loadmapfile[\typescriptthree-adobe-utopia.map] -\stoptypescript - -% Charter (Bitstream) - -\starttypescript [serif] [charter] [ec,texnansi,8r] - \definefontsynonym [Charter-Roman] [\typescriptthree-bchr8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-Italic] [\typescriptthree-bchri8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-Bold] [\typescriptthree-bchb8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-BoldItalic] [\typescriptthree-bchbi8a] [encoding=\typescriptthree] - \definefontsynonym [Charter-Slanted] [\typescriptthree-bchr8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Charter-BoldSlanted][\typescriptthree-bchb8a-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Charter-Roman-Caps] [\typescriptthree-bchr8a-capitalized-800] [encoding=\typescriptthree] - \loadmapfile[\typescriptthree-bitstrea-charter.map] -\stoptypescript - -% Whatever else we need: - -\starttypescript - \definefontsynonym [ZapfDingbats] [uzdr] - \definefontsynonym [RalfSmithFormalScript] [rsfs10] - \definefontsynonym [MartinVogel] [fmvr8x] -\stoptypescript - -% -% TeXGyre -% -% We now use tex-gyre fonts by default ... - -\definetypescriptprefix [f:pagella] [pl] \definetypescriptprefix [f:palatino] [pl] -\definetypescriptprefix [f:termes] [tm] \definetypescriptprefix [f:times] [tm] -\definetypescriptprefix [f:heros] [hv] \definetypescriptprefix [f:helvetica] [hv] -\definetypescriptprefix [f:bonum] [bk] \definetypescriptprefix [f:bookman] [bk] -\definetypescriptprefix [f:schola] [cs] \definetypescriptprefix [f:schoolbook] [cs] -\definetypescriptprefix [f:adventor][ag] %definetypescriptprefix [f:adventor] [ag] -\definetypescriptprefix [f:cursor] [cr] \definetypescriptprefix [f:courier] [cr] -\definetypescriptprefix [f:chorus] [zc] \definetypescriptprefix [f:chancery] [zc] % not the full set - -\starttypescript [serif,sans,mono] [pagella,palatino,termes,times,adventor,bonum,bookman,cursor,courier,heros,helvetica,schola,schoolbook] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi] [encoding=\typescriptthree] - \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map] -\stoptypescript - -\starttypescript [serif,sans,mono] [pagella,palatino,termes,times,adventor,bonum,bookman,cursor,courier,heros,helvetica,schola,schoolbook] [ec,texnansi,cs,qx,rm,t5,l7x] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r-sc] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri-sc] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b-sc] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi-sc] [encoding=\typescriptthree] - \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map] -\stoptypescript - -\starttypescript [serif] [chorus,chancery] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x] - \definefontsynonym [TeXGyreChorus-MediumItalic] [\typescriptthree-qzcmi] [encoding=\typescriptthree] - \loadmapfile[qzc-\typescriptthree.map] -\stoptypescript - -% bonus definitions - -% when these fonts are in tex live ... -% -% \definefontsynonym [Palatino-Caps] [TeXPalladioL-SC] [encoding=\typescriptthree] -% -% \starttypescript [serif] [palatino] [ec,texnansi] -% \definefontsynonym[TeXPalladioL-BoldItalicOsF][\typescriptthree-fplbij8a][encoding=\typescriptthree] -% \definefontsynonym[TeXPalladioL-BoldOsF] [\typescriptthree-fplbj8a] [encoding=\typescriptthree] -% \definefontsynonym[TeXPalladioL-SC] [\typescriptthree-fplrc8a] [encoding=\typescriptthree] -% \definefontsynonym[TeXPalladioL-ItalicOsF] [\typescriptthree-fplrij8a][encoding=\typescriptthree] -% \loadmapfile[\typescriptthree-urw-palatino.map] -% \stoptypescript - -% Palatino Math (px) - -\starttypescript [math] [palatino] [all] - \definefontsynonym [Palatino-Roman-Upright] [pxr] - \definefontsynonym [Palatino-Roman-Italic] [pxi] - \definefontsynonym [Palatino-Roman-Slanted] [pxsl] - \definefontsynonym [Palatino-Roman-Caps] [pxsc] - \definefontsynonym [Palatino-Companion-Upright] [pcxr] - \definefontsynonym [Palatino-Companion-Italic] [pcxi] - \definefontsynonym [Palatino-Companion-Slanted] [pcxsl] - \definefontsynonym [Palatino-Math-Italic] [pxmi] - \definefontsynonym [Palatino-Math-Symbols] [pxsy] - \definefontsynonym [Palatino-Math-Extension] [pxex] - \definefontsynonym [Palatino-Math-SymbolsA] [pxsya] - \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb] - \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc] - \definefontsynonym [Palatino-Math-Italic-A] [pxmia] - \definefontsynonym [Palatino-Math-Extension-A] [pxexa] - \usemathcollection[default] - \loadmapfile[original-youngryu-px.map] -\stoptypescript - -% Times Math (tx) - -\starttypescript [math] [times] [all] - \definefontsynonym [Times-Roman-Upright] [txr] - \definefontsynonym [Times-Roman-Italic] [txi] - \definefontsynonym [Times-Roman-Slanted] [txsl] - \definefontsynonym [Times-Roman-Caps] [txsc] - \definefontsynonym [Times-Companion-Upright] [tcxr] - \definefontsynonym [Times-Companion-Italic] [tcxi] - \definefontsynonym [Times-Companion-Slanted] [tcxsl] - \definefontsynonym [Times-Math-Italic] [txmi] - \definefontsynonym [Times-Math-Symbols] [txsy] - \definefontsynonym [Times-Math-Extension] [txex] - \definefontsynonym [Times-Math-SymbolsA] [txsya] - \definefontsynonym [Times-Math-SymbolsB] [txsyb] - \definefontsynonym [Times-Math-SymbolsC] [txsyc] - \definefontsynonym [Times-Math-Italic-A] [txmia] - \definefontsynonym [Times-Math-Extension-A] [txexa] - \usemathcollection[default] - \loadmapfile[original-youngryu-tx.map] -\stoptypescript - -%D These are just fallbacks in case anyone stil uses the old names (might also be removed?). - -% -% TeXGyrePagella -% -\starttypescript [serif] [palatino] - \definefontsynonym [Palatino] [TeXGyrePagella-Regular] - \definefontsynonym [Palatino-Italic] [TeXGyrePagella-Italic] - \definefontsynonym [Palatino-Bold] [TeXGyrePagella-Bold] - \definefontsynonym [Palatino-BoldItalic] [TeXGyrePagella-BoldItalic] - \definefontsynonym [Palatino-Slanted] [TeXGyrePagella-Italic] - \definefontsynonym [Palatino-BoldSlanted] [TeXGyrePagella-BoldItalic] - \definefontsynonym [Palatino-Caps] [TeXGyrePagella-Caps] -\stoptypescript -% -% TeXGyreTermes -% -\starttypescript [serif] [times] - \definefontsynonym [Times-Roman] [TeXGyreTermes-Regular] - \definefontsynonym [Times-Italic] [TeXGyreTermes-Italic] - \definefontsynonym [Times-Bold] [TeXGyreTermes-Bold] - \definefontsynonym [Times-BoldItalic] [TeXGyreTermes-BoldItalic] - \definefontsynonym [Times-Slanted] [TeXGyreTermes-Italic] - \definefontsynonym [Times-BoldSlanted] [TeXGyreTermes-BoldItalic] - \definefontsynonym [Times-Caps] [TeXGyreTermes-Caps] -\stoptypescript -% -% TeXGyreHeros -% -\starttypescript [sans] [helvetica] - \definefontsynonym [Helvetica] [TeXGyreHeros-Regular] - \definefontsynonym [Helvetica-Oblique] [TeXGyreHeros-Italic] - \definefontsynonym [Helvetica-Bold] [TeXGyreHeros-Bold] - \definefontsynonym [Helvetica-BoldOblique] [TeXGyreHeros-BoldItalic] - \definefontsynonym [Helvetica-Caps] [TeXGyreHeros-Caps] -\stoptypescript -% -% TeXGyreBonum -% -\starttypescript [serif] [bookman] - \definefontsynonym [Bookman-Light] [TeXGyreBonum-Regular] - \definefontsynonym [Bookman-LightItalic] [TeXGyreBonum-Italic] - \definefontsynonym [Bookman-DemiBold] [TeXGyreBonum-Bold] - \definefontsynonym [Bookman-DemiBoldItalic] [TeXGyreBonum-BoldItalic] - \definefontsynonym [Bookman-LightSlanted] [TeXGyreBonum-Italic] - \definefontsynonym [Bookman-DemiBoldSlanted] [TeXGyreBonum-BoldItalic] - \definefontsynonym [Bookman-Light-Caps] [TeXGyreBonum-Caps] -\stoptypescript -% -% TeXGyreScola -% -\starttypescript [serif] [schoolbook] - \definefontsynonym [Schoolbook-Roman] [TeXGyreScola-Regular] - \definefontsynonym [Schoolbook-Italic] [TeXGyreScola-Italic] - \definefontsynonym [Schoolbook-Bold] [TeXGyreScola-Bold] - \definefontsynonym [Schoolbook-BoldItalic] [TeXGyreScola-BoldItalic] - \definefontsynonym [Schoolbook-Slanted] [TeXGyreScola-Italic] - \definefontsynonym [Schoolbook-BoldSlanted] [TeXGyreScola-BoldItalic] - \definefontsynonym [Schoolbook-Roman-Caps] [TeXGyreScola-Caps] -\stoptypescript -% -% TeXGyreAdventor -% -% -% TeXGyreCursor -% -\starttypescript [mono] [courier] - \definefontsynonym [Courier] [TeXGyreCursor-Regular] - \definefontsynonym [Courier-Bold] [TeXGyreCursor-Bold] - \definefontsynonym [Courier-Oblique] [TeXGyreCursor-Italic] - \definefontsynonym [Courier-BoldOblique] [TeXGyreCursor-BoldItalic] - \fakecontrolspace -\stoptypescript -% -% TeXGyreChorus -% -\starttypescript [calligraphy] [chancery] - \definefontsynonym [Chancery] [TeXGyreChorus-MediumItalic] -\stoptypescript - -\stoptypescriptcollection +\loadmarkfile{type-one} \endinput diff --git a/tex/context/base/type-otf.mkiv b/tex/context/base/type-otf.mkiv index 09ec22856..7ca3e62fb 100644 --- a/tex/context/base/type-otf.mkiv +++ b/tex/context/base/type-otf.mkiv @@ -115,60 +115,6 @@ \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [file:lmmonoproplt10-boldoblique] [features=default] \stoptypescript -% \starttypescript [math] [modern,latin-modern] -% \definefontsynonym [LMMathRoman5-Regular] [rm-lmr5] -% \definefontsynonym [LMMathRoman6-Regular] [rm-lmr6] -% \definefontsynonym [LMMathRoman7-Regular] [rm-lmr7] -% \definefontsynonym [LMMathRoman8-Regular] [rm-lmr8] -% \definefontsynonym [LMMathRoman9-Regular] [rm-lmr9] -% \definefontsynonym [LMMathRoman10-Regular] [rm-lmr10] -% \definefontsynonym [LMMathRoman12-Regular] [rm-lmr12] -% \definefontsynonym [LMMathRoman17-Regular] [rm-lmr17] -% \definefontsynonym [LMMathRoman5-Bold] [rm-lmbx5] -% \definefontsynonym [LMMathRoman6-Bold] [rm-lmbx6] -% \definefontsynonym [LMMathRoman7-Bold] [rm-lmbx7] -% \definefontsynonym [LMMathRoman8-Bold] [rm-lmbx8] -% \definefontsynonym [LMMathRoman9-Bold] [rm-lmbx9] -% \definefontsynonym [LMMathRoman10-Bold] [rm-lmbx10] -% \definefontsynonym [LMMathRoman12-Bold] [rm-lmbx12] -% \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5] -% \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7] -% \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10] -% \definefontsynonym [LMMathSymbols5-Italic] [lmsy5] -% \definefontsynonym [LMMathSymbols6-Italic] [lmsy6] -% \definefontsynonym [LMMathSymbols7-Italic] [lmsy7] -% \definefontsynonym [LMMathSymbols8-Italic] [lmsy8] -% \definefontsynonym [LMMathSymbols9-Italic] [lmsy9] -% \definefontsynonym [LMMathSymbols10-Italic] [lmsy10] -% \definefontsynonym [LMMathExtension10-Regular] [lmex10] -% \definefontsynonym [LMMathItalic5-Italic] [lmmi5] -% \definefontsynonym [LMMathItalic6-Italic] [lmmi6] -% \definefontsynonym [LMMathItalic7-Italic] [lmmi7] -% \definefontsynonym [LMMathItalic8-Italic] [lmmi8] -% \definefontsynonym [LMMathItalic9-Italic] [lmmi9] -% \definefontsynonym [LMMathItalic10-Italic] [lmmi10] -% \definefontsynonym [LMMathItalic12-Italic] [lmmi12] -% \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5] -% \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7] -% \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10] -% \loadmapfile[lm-math.map] -% \loadmapfile[lm-rm.map] -% \stoptypescript - -% \starttypescript [math] [modern,computer-modern,latin-modern] -% \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10] -% \definefontsynonym [ComputerModernMath-Extension] [lmex10] -% \definefontsynonym [ComputerModernMath-Italic] [lmmi10] -% \definefontsynonym [ComputerModernMath-Symbol] [lmsy10] -% \stoptypescript - -% \starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] -% \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10] -% \definefontsynonym [ComputerModernMath-Extension] [lmex10] -% \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10] -% \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10] -% \stoptypescript - \starttypescript [math] [modern,latin-modern,computer-modern] \definefontsynonym[LMMathRoman5-Regular] [LMMath5-Regular@lmroman5-math] \definefontsynonym[LMMathRoman6-Regular] [LMMath6-Regular@lmroman6-math] @@ -179,49 +125,24 @@ \definefontsynonym[LMMathRoman12-Regular][LMMath12-Regular@lmroman12-math] \definefontsynonym[LMMathRoman17-Regular][LMMath17-Regular@lmroman17-math] -% \definefontsynonym[LMMathRoman-Regular] [LMMath10-Regular@lmroman10-math] - - \definefontsynonym[MathRoman] [LMMath10-Regular@lmroman10-math] + \definefontsynonym[LMMathRoman5-Bold] [LMMath10-Bold@lmroman10-boldmath] + \definefontsynonym[LMMathRoman6-Bold] [LMMath10-Bold@lmroman10-boldmath] + \definefontsynonym[LMMathRoman7-Bold] [LMMath10-Bold@lmroman10-boldmath] + \definefontsynonym[LMMathRoman8-Bold] [LMMath10-Bold@lmroman10-boldmath] + \definefontsynonym[LMMathRoman9-Bold] [LMMath10-Bold@lmroman10-boldmath] + \definefontsynonym[LMMathRoman10-Bold] [LMMath10-Bold@lmroman10-boldmath] + \definefontsynonym[LMMathRoman12-Bold] [LMMath10-Bold@lmroman10-boldmath] + \definefontsynonym[LMMathRoman17-Bold] [LMMath10-Bold@lmroman10-boldmath] - \definefontsynonym[xcmr12][LMMath12-Regular@lmroman12-math] - \definefontsynonym[xcmr10][LMMath10-Regular@lmroman10-math] - \definefontsynonym[xcmr9] [LMMath9-Regular@lmroman9-math] - \definefontsynonym[xcmr8] [LMMath8-Regular@lmroman8-math] - \definefontsynonym[xcmr7] [LMMath7-Regular@lmroman7-math] - \definefontsynonym[xcmr6] [LMMath6-Regular@lmroman6-math] - \definefontsynonym[xcmr5] [LMMath5-Regular@lmroman5-math] + % are these needed? + % + % \definefontsynonym[MathRoman][LMMath10-Regular@lmroman10-math] + % \definefontsynonym[MathBold] [LMMath10-Bold@lmroman10-boldmath] \loadmapfile[lm-math.map] \loadmapfile[lm-rm.map] \stoptypescript -% Euler (AMS) - -\starttypescript [math] [euler] - \definefontsynonym [Euler-Roman] [zeurm10] - \definefontsynonym [Euler-Extension] [zeuex10] - \definefontsynonym [Euler-Symbol] [zeusm10] - \definefontsynonym [Euler-Fraktur] [eufm10] - - \loadmapfile[original-ams-euler.map] -\stoptypescript - -\starttypescript [boldmath,bfmath] [euler] - \definefontsynonym [Euler-Roman-Bold] [zeurb10] - \definefontsynonym [Euler-Extension] [zeuex10] - \definefontsynonym [Euler-Symbol-Bold] [zeusb10] - \definefontsynonym [Euler-Fraktur-Bold] [eufb10] - - \loadmapfile[original-ams-euler.map] -\stoptypescript - -% AMS (AMS) - -\starttypescript [math] [modern,computer-modern,latin-modern,ams] - \definefontsynonym [AMS-SymbolA] [msam10] - \definefontsynonym [AMS-SymbolB] [msbm10] -\stoptypescript - % TeXGyre \definetypescriptprefix [f:pagella] [pagella] \definetypescriptprefix [f:palatino] [pagella] @@ -254,26 +175,6 @@ % Times Math (tx) -% \starttypescript [math] [times] [all] -% \definefontsynonym [Times-Roman-Upright] [txr] -% \definefontsynonym [Times-Roman-Italic] [txi] -% \definefontsynonym [Times-Roman-Slanted] [txsl] -% \definefontsynonym [Times-Roman-Caps] [txsc] -% \definefontsynonym [Times-Companion-Upright] [tcxr] -% \definefontsynonym [Times-Companion-Italic] [tcxi] -% \definefontsynonym [Times-Companion-Slanted] [tcxsl] -% \definefontsynonym [Times-Math-Italic] [txmi] -% \definefontsynonym [Times-Math-Symbols] [txsy] -% \definefontsynonym [Times-Math-Extension] [txex] -% \definefontsynonym [Times-Math-SymbolsA] [txsya] -% \definefontsynonym [Times-Math-SymbolsB] [txsyb] -% \definefontsynonym [Times-Math-SymbolsC] [txsyc] -% \definefontsynonym [Times-Math-Italic-A] [txmia] -% \definefontsynonym [Times-Math-Extension-A] [txexa] -% \loadmapfile[original-youngryu-tx.map] -% \usemathcollection[default] -% \stoptypescript - \starttypescript [math][times][all] \definefontsynonym[MathRoman][txmath@tx-math] \loadmapfile[original-youngryu-tx.map] @@ -281,26 +182,6 @@ % Palatino Math (px) -% \starttypescript [math] [palatino] [all] -% \definefontsynonym [Palatino-Roman-Upright] [pxr] -% \definefontsynonym [Palatino-Roman-Italic] [pxi] -% \definefontsynonym [Palatino-Roman-Slanted] [pxsl] -% \definefontsynonym [Palatino-Roman-Caps] [pxsc] -% \definefontsynonym [Palatino-Companion-Upright] [pcxr] -% \definefontsynonym [Palatino-Companion-Italic] [pcxi] -% \definefontsynonym [Palatino-Companion-Slanted] [pcxsl] -% \definefontsynonym [Palatino-Math-Italic] [pxmi] -% \definefontsynonym [Palatino-Math-Symbols] [pxsy] -% \definefontsynonym [Palatino-Math-Extension] [pxex] -% \definefontsynonym [Palatino-Math-SymbolsA] [pxsya] -% \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb] -% \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc] -% \definefontsynonym [Palatino-Math-Italic-A] [pxmia] -% \definefontsynonym [Palatino-Math-Extension-A] [pxexa] -% \loadmapfile[original-youngryu-px.map] -% \usemathcollection[default] -% \stoptypescript - \starttypescript [math][palatino][all] \definefontsynonym[MathRoman][pxmath@px-math] \loadmapfile[original-youngryu-px.map] @@ -344,41 +225,41 @@ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [file:AntykwaTorunskaCondMed-Italic] [features=smallcaps] \stoptypescript -\starttypescript [math] [antykwa-torunska] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr] - \definefontsynonym [AntykwaTorunska-Math-Letters-Italic] [mi-anttri] - \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz] - \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-light] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl] - \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli] - \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz] - \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-cond] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondItalic] [mi-anttcri] - \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz] - \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-lightcond] [default] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl] - \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli] - \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz] - \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl] -\stoptypescript - -\starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] - \usemathcollection[default] - \loadmapfile[antt-rm.map] - \loadmapfile[antt-mi.map] - \loadmapfile[antt-sy.map] - \loadmapfile[antt-ex.map] -\stoptypescript +% \starttypescript [math] [antykwa-torunska] [default] +% \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr] +% \definefontsynonym [AntykwaTorunska-Math-Letters-Italic] [mi-anttri] +% \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz] +% \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr] +% \stoptypescript +% +% \starttypescript [math] [antykwa-torunska-light] [default] +% \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl] +% \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli] +% \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz] +% \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl] +% \stoptypescript +% +% \starttypescript [math] [antykwa-torunska-cond] [default] +% \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr] +% \definefontsynonym [AntykwaTorunska-Math-Letters-CondItalic] [mi-anttcri] +% \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz] +% \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr] +% \stoptypescript +% +% \starttypescript [math] [antykwa-torunska-lightcond] [default] +% \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl] +% \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli] +% \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz] +% \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl] +% \stoptypescript +% +% \starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] +% \usemathcollection[default] +% \loadmapfile[antt-rm.map] +% \loadmapfile[antt-mi.map] +% \loadmapfile[antt-sy.map] +% \loadmapfile[antt-ex.map] +% \stoptypescript % Antykwa Poltawskiego (GUST) @@ -444,34 +325,6 @@ \stoptypescript -% \starttypescript [math] [iwona] [default] -% \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar] -% \definefontsynonym [Iwona-Math-Letters-Italic] [mi-iwonari] -% \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz] -% \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar] -% \stoptypescript - -% \starttypescript [math] [iwona-light] [default] -% \definefontsynonym [Iwona-Math-Letters-Light-Regular] [rm-iwonal] -% \definefontsynonym [Iwona-Math-Letters-Light-Italic] [mi-iwonali] -% \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz] -% \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal] -% \stoptypescript - -% \starttypescript [math] [iwona-medium] [default] -% \definefontsynonym [Iwona-Math-Letters-Medium-Regular][rm-iwonam] -% \definefontsynonym [Iwona-Math-Letters-Medium-Italic] [mi-iwonami] -% \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz] -% \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam] -% \stoptypescript - -% \starttypescript [math] [iwona-heavy] [default] -% \definefontsynonym [Iwona-Math-Letters-Heavy-Regular] [rm-iwonah] -% \definefontsynonym [Iwona-Math-Letters-Heavy-Italic] [mi-iwonahi] -% \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz] -% \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah] -% \stoptypescript - % [all] is redundant \starttypescript [math][iwona][all] @@ -610,9 +463,6 @@ \starttypescript [math] [mathtimes] [all] \definefontsynonym[MathRoman][mathtimes@mathtimes-math] \loadmapfile[mathtime.map] -% \pdfmapline{=mtsyn < mtsyn.pfb} -% \pdfmapline{=mtmiz < mtmiz.pfb} -% \pdfmapline{=mtex < mtex.pfb} \stoptypescript \starttypescript [mathtimes] diff --git a/tex/context/base/type-run.tex b/tex/context/base/type-run.mkii index 1b64c102e..1b64c102e 100644 --- a/tex/context/base/type-run.tex +++ b/tex/context/base/type-run.mkii diff --git a/tex/context/base/type-run.mkiv b/tex/context/base/type-run.mkiv new file mode 100644 index 000000000..1b64c102e --- /dev/null +++ b/tex/context/base/type-run.mkiv @@ -0,0 +1,51 @@ +%D \module +%D [ file=type-run, +%D version=2001.04.20, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Runtime Macros, +%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. + +\unprotect + +\gdef\typetypescript + {\dotripleempty\dotypetypescript} + +\gdef\dotypetypescript[#1][#2][#3]% + {\bgroup + \def\dochecktypescript##1##2% script use + {\doifelsenothing{##1##2} + {\donetrue} + {\ExpandBothAfter\doifcommonelse{##1}{##2}\donetrue\donefalse}} + \edef\typescriptone {\truetypescript{#1}}% + \edef\typescripttwo {\truetypescript{#2}}% + \edef\typescriptthree{\truetypescript{#3}}% + \def\starttypescript + {\bgroup + \obeylines % else we loose the first line due to lookahead + \dotripleempty\dostarttypescript} + \def\dostarttypescript[##1][##2][##3]% + {\long\def\next####1\stoptypescript{\egroup} + \dochecktypescript{##1}\typescriptone \ifdone + \dochecktypescript{##2}\typescripttwo \ifdone + \dochecktypescript{##3}\typescriptthree\ifdone + \def\next% + {\def\stoptypescript{\egroup\type{\stoptypescript}} + % what follows now is quite ugly + \skipfirstverbatimlinefalse + \type{\starttypescript} + \doifsomething{##1}{\type{[##1]}} + \doifsomething{##2}{\type{[##2]}} + \doifsomething{##3}{\type{[##3]}} + \processdisplayverbatim{\stoptypescript}}% + \fi\fi\fi + \next} + \processcommacommand[\typescriptfiles]\ReadFile % \dodousetypescript + \egroup} + +\protect \endinput diff --git a/tex/context/base/type-siz.mkii b/tex/context/base/type-siz.mkii index 0ad737cf2..6bf7f01f4 100644 --- a/tex/context/base/type-siz.mkii +++ b/tex/context/base/type-siz.mkii @@ -245,8 +245,8 @@ % hack to prevent mapping of filenames, watch the space! before % latin modern came aroudn we needed this trick to make sure that % we loaded the raw cmr12 etc instead of the ones mapped onto - % an encoding - + % an encoding (this trick is no longer needed with lm) + % % \definefontsynonym[xcmr12][cmr12 ] % \definefontsynonym[xcmr10][cmr10 ] % \definefontsynonym[xcmr9] [cmr9 ] @@ -255,6 +255,14 @@ % \definefontsynonym[xcmr6] [cmr6 ] % \definefontsynonym[xcmr5] [cmr5 ] + \definefontsynonym[xcmr12][rm-lmr12] + \definefontsynonym[xcmr10][rm-lmr10] + \definefontsynonym[xcmr9] [rm-lmr9] + \definefontsynonym[xcmr8] [rm-lmr8] + \definefontsynonym[xcmr7] [rm-lmr7] + \definefontsynonym[xcmr6] [rm-lmr6] + \definefontsynonym[xcmr5] [rm-lmr5] + \definebodyfont [12pt] [mm] [mr=xcmr12, ex=cmex10 at 12pt, diff --git a/tex/context/base/type-siz.mkiv b/tex/context/base/type-siz.mkiv index 2c234e86a..ab31c415f 100644 --- a/tex/context/base/type-siz.mkiv +++ b/tex/context/base/type-siz.mkiv @@ -13,360 +13,224 @@ \starttypescriptcollection[size-mkiv] -% todo: instead of assuming designsize we will set it explicitly (saves these -% -1000 problems at the lua end) - -% cmr - \starttypescript [serif] [computer-modern] [size] \definebodyfont [12pt] [rm] - [tf=cmr12, - bf=cmbx12, - it=cmti12, - sl=cmsl12, - bi=cmbxti10 at 12pt, - bs=cmbxsl10 at 12pt, - sc=cmcsc10 at 12pt] + [tf=LMRoman12-Regular, + bf=LMRoman12-Bold, + it=LMRoman12-Italic, + sl=LMRoman12-Oblique, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [11pt] [rm] - [tf=cmr10 at 11pt, - bf=cmbx10 at 11pt, - sl=cmsl10 at 11pt, - it=cmti10 at 11pt, - bi=cmbxti10 at 11pt, - bs=cmbxsl10 at 11pt, - sc=cmcsc10 at 11pt] + [tf=LMRoman10-Regular sa 1, + bf=LMRoman10-Bold sa 1, + it=LMRoman10-Italic sa 1, + sl=LMRoman10-Oblique sa 1, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [10pt] [rm] - [tf=cmr10, - bf=cmbx10, - it=cmti10, - sl=cmsl10, - bi=cmbxti10, - bs=cmbxsl10, - sc=cmcsc10] + [tf=LMRoman10-Regular, + bf=LMRoman10-Bold, + it=LMRoman10-Italic, + sl=LMRoman10-Oblique, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [9pt] [rm] - [tf=cmr9, - bf=cmbx9, - it=cmti9, - sl=cmsl9, - bi=cmbxti10 at 9pt, - bs=cmbxsl10 at 9pt, - sc=cmcsc10 at 9pt] + [tf=LMRoman9-Regular, + bf=LMRoman9-Bold, + it=LMRoman9-Italic, + sl=LMRoman9-Oblique, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [8pt] [rm] - [tf=cmr8, - bf=cmbx8, - it=cmti8, - sl=cmsl8, - bi=cmbxti10 at 8pt, - bs=cmbxsl10 at 8pt, - sc=cmcsc10 at 8pt] + [tf=LMRoman8-Regular, + bf=LMRoman8-Bold, + it=LMRoman8-Italic, + sl=LMRoman8-Oblique, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [7pt] [rm] - [tf=cmr7, - bf=cmbx7, - it=cmti10 at 7pt, - sl=cmsl10 at 7pt, - bi=cmbxti10 at 7pt, - bs=cmbxsl10 at 7pt, - sc=cmcsc10 at 7pt] + [tf=LMRoman7-Regular, + bf=LMRoman7-Bold, + it=LMRoman7-Italic sa 1, + sl=LMRoman8-Oblique sa 1, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [6pt] [rm] - [tf=cmr6, - bf=cmbx6, - it=cmti10 at 6pt, - sl=cmsl10 at 6pt, - bi=cmbxti10 at 6pt, - bs=cmbxsl10 at 6pt, - sc=cmcsc10 at 6pt] + [tf=LMRoman6-Regular, + bf=LMRoman6-Bold, + it=LMRoman7-Italic sa 1, + sl=LMRoman8-Oblique sa 1, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [5pt] [rm] - [tf=cmr5, - bf=cmbx5, - it=cmti10 at 5pt, - sl=cmsl10 at 5pt, - bi=cmbxti10 at 5pt, - bs=cmbxsl10 at 5pt, - sc=cmcsc10 at 5pt] + [tf=LMRoman5-Regular, + bf=LMRoman5-Bold, + it=LMRoman7-Italic sa 1, + sl=LMRoman8-Oblique sa 1, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [4pt] [rm] - [tf=cmr10 at 4pt, - bf=cmbx10 at 4pt, - it=cmti10 at 4pt, - sl=cmsl10 at 4pt, - bi=cmbxti10 at 4pt, - bs=cmbxsl10 at 4pt, - sc=cmr10 at 4pt] + [tf=LMRoman5-Regular sa 1, + bf=LMRoman5-Bold sa 1, + it=LMRoman7-Italic sa 1, + sl=LMRoman8-Oblique sa 1, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \definebodyfont [14.4pt,17.3pt,20.7pt] [rm] - [tf=cmr12 sa 1, - bf=cmbx12 sa 1, - it=cmti12 sa 1, - sl=cmsl12 sa 1, - bi=cmbxti10 sa 1, - bs=cmbxsl10 sa 1, - sc=cmcsc10 sa 1] + [tf=LMRoman12-Regular sa 1, + bf=LMRoman12-Bold sa 1, + it=LMRoman12-Italic sa 1, + sl=LMRoman12-Oblique sa 1, + bi=LMRoman10-BoldItalic sa 1, + bs=LMRoman10-BoldObliqu sa 1, + sc=LMRoman10-CapsRegular sa 1] \stoptypescript \starttypescript [sans] [computer-modern] [size] \definebodyfont [12pt] [ss] - [tf=cmss12, - bf=cmssbx10 at 12pt, - it=cmssi12, - sl=cmssi12, - bi=cmssbx10 at 12pt, - bs=cmssbx10 at 12pt, - sc=cmss10 at 12pt] + [tf=LMSans12-Regular, + bf=LMSans10-Bold sa 1, + it=LMSans12-Oblique, + sl=LMSans12-Oblique, + bi=LMSans10-BoldOblique sa 1, + bs=LMSans10-BoldOblique sa 1, + sc=LMSans12-Regular] \definebodyfont [11pt] [ss] - [tf=cmss10 at 11pt, - bf=cmssbx10 at 11pt, - it=cmssi10 at 11pt, - sl=cmssi10 at 11pt, - bi=cmssbx10 at 11pt, - bs=cmssbx10 at 11pt, - sc=cmss10 at 11pt] + [tf=LMSans10-Regular sa 1, + bf=LMSans10-Bold sa 1, + it=LMSans10-Oblique sa 1, + sl=LMSans10-Oblique sa 1, + bi=LMSans10-BoldOblique sa 1, + bs=LMSans10-BoldOblique sa 1, + sc=LMSans10-Regular sa 1] \definebodyfont [10pt] [ss] - [tf=cmss10, - bf=cmssbx10, - it=cmssi10, - sl=cmssi10, - bi=cmssbx10, - bs=cmssbx10, - sc=cmss10] + [tf=LMSans10-Regular, + bf=LMSans10-Bold, + it=LMSans10-Oblique, + sl=LMSans10-Oblique, + bi=LMSans10-BoldOblique, + bs=LMSans10-BoldOblique, + sc=LMSans10-Regular] \definebodyfont [9pt] [ss] - [tf=cmss9, - bf=cmssbx10 at 9pt, - it=cmssi9, - sl=cmssi9, - bi=cmssbx10 at 9pt, - bs=cmssbx10 at 9pt, - sc=cmss9] + [tf=LMSans9-Regular, + bf=LMSans10-Bold sa 1, + it=LMSans9-Oblique sa 1, + sl=LMSans9-Oblique sa 1, + bi=LMSans10-BoldOblique sa 1, + bs=LMSans10-BoldOblique sa 1, + sc=LMSans9-Regular] \definebodyfont [8pt] [ss] - [tf=cmss8, - bf=cmssbx10 at 8pt, - it=cmssi8, - sl=cmssi8, - bi=cmssbx10 at 8pt, - bs=cmssbx10 at 8pt, - sc=cmss8] - - \definebodyfont [7pt] [ss] - [tf=cmss10 at 7pt, - bf=cmssbx10 at 7pt, - it=cmssi10 at 7pt, - sl=cmssi10 at 7pt, - bs=cmssbx10 at 7pt, - bi=cmssbx10 at 7pt, - sc=cmss10 at 7pt] - - \definebodyfont [6pt] [ss] - [tf=cmss10 at 6pt, - bf=cmssbx10 at 6pt, - it=cmssi10 at 6pt, - sl=cmssi10 at 6pt, - bs=cmssbx10 at 6pt, - bi=cmssbx10 at 6pt, - sc=cmss10 at 6pt] - - \definebodyfont [5pt] [ss] - [tf=cmss10 at 5pt, - bf=cmssbx10 at 5pt, - it=cmssi10 at 5pt, - sl=cmssi10 at 5pt, - bs=cmssbx10 at 5pt, - bi=cmssbx10 at 5pt, - sc=cmss10 at 5pt] - - \definebodyfont [4pt] [ss] - [tf=cmss10 at 4pt, - bf=cmssbx10 at 4pt, - it=cmssi10 at 4pt, - sl=cmssi10 at 4pt, - bs=cmssbx10 at 4pt, - bi=cmssbx10 at 4pt, - sc=cmss10 at 4pt] + [tf=LMSans8-Regular, + bf=LMSans10-Bold sa 1, + it=LMSans8-Oblique, + sl=LMSans8-Oblique, + bi=LMSans10-BoldOblique sa 1, + bs=LMSans10-BoldOblique sa 1, + sc=LMSans8-Regular] + + \definebodyfont [7pt,6pt,5pt,4pt] [ss] + [tf=LMSans8-Regular sa 1, + bf=LMSans10-Bold sa 1, + it=LMSans8-Oblique sa 1, + sl=LMSans8-Oblique sa 1, + bi=LMSans10-BoldOblique sa 1, + bs=LMSans10-BoldOblique sa 1, + sc=LMSans8-Regular sa 1] \definebodyfont [14.4pt,17.3pt,20.7pt] [ss] - [tf=cmss12 sa 1, - bf=cmssbx10 sa 1, - it=cmssi12 sa 1, - sl=cmssi12 sa 1, - bi=cmssbx10 sa 1, - bs=cmssbx10 sa 1, - sc=cmss12 sa 1] + [tf=LMSans12-Regular sa 1, + bf=LMSans10-Bold sa 1, + it=LMSans12-Oblique sa 1, + sl=LMSans12-Oblique sa 1, + bi=LMSans10-BoldOblique sa 1, + bs=LMSans10-BoldOblique sa 1, + sc=LMSans12-Regular sa 1] \stoptypescript \starttypescript [mono] [computer-modern] [size] \definebodyfont [12pt] [tt] - [tf=cmtt12, - sl=cmsltt10 at 12pt, - it=cmitt10 at 12pt, - sc=cmtcsc10 at 12pt] + [tf=LMTypewriter12-Regular, + it=LMTypewriter10-Italic sa 1, + sl=LMTypewriter10-Oblique sa 1, + bf=LMTypewriter10-Dark sa 1, + bs=LMTypewriter10-DarkOblique sa 1, + sc=LMTypewriter10-CapsRegular sa 1] \definebodyfont [9pt] [tt] - [tf=cmtt9, - sl=cmsltt10 at 9pt, - it=cmitt10 at 9pt, - sc=cmtcsc10 at 9pt] + [tf=LMTypewriter9-Regular, + it=LMTypewriter10-Italic sa 1, + sl=LMTypewriter10-Oblique sa 1, + bf=LMTypewriter10-Dark sa 1, + bs=LMTypewriter10-DarkOblique sa 1, + sc=LMTypewriter10-CapsRegular sa 1] \definebodyfont [8pt] [tt] - [tf=cmtt8, - sl=cmsltt10 at 8pt, - it=cmitt10 at 8pt, - sc=cmtcsc10 at 8pt] + [tf=LMTypewriter8-Regular, + it=LMTypewriter10-Italic sa 1, + sl=LMTypewriter10-Oblique sa 1, + bf=LMTypewriter10-Dark sa 1, + bs=LMTypewriter10-DarkOblique sa 1, + sc=LMTypewriter10-CapsRegular sa 1] \definebodyfont [11pt,10pt,7pt,6pt,5pt,4pt] [tt] - [tf=cmtt10 sa 1, - sl=cmsltt10 sa 1, - it=cmitt10 sa 1, - sc=cmtcsc10 sa 1] + [tf=LMTypewriter10-Regular sa 1, + it=LMTypewriter10-Italic sa 1, + sl=LMTypewriter10-Oblique sa 1, + bf=LMTypewriter10-Dark sa 1, + bs=LMTypewriter10-DarkOblique sa 1, + sc=LMTypewriter10-CapsRegular sa 1] \definebodyfont [14.4pt,17.3pt,20.7pt] [tt] - [tf=cmtt12 sa 1, - sl=cmsltt10 sa 1, - it=cmitt10 sa 1, - sc=cmtcsc10 sa 1] + [tf=LMTypewriter12-Regular sa 1, + it=LMTypewriter10-Italic sa 1, + sl=LMTypewriter10-Oblique sa 1, + bf=LMTypewriter10-Dark sa 1, + bs=LMTypewriter10-DarkOblique sa 1, + sc=LMTypewriter10-CapsRegular sa 1] \stoptypescript \starttypescript [math] [modern,computer-modern,latin-modern] [size] - \definebodyfont [12pt] [mm] - [mr=xcmr12] - - \definebodyfont [11pt] [mm] - [mr=xcmr10 at 11pt] - - \definebodyfont [10pt] [mm] - [mr=xcmr10] - - \definebodyfont [9pt] [mm] - [mr=xcmr9] - - \definebodyfont [8pt] [mm] - [mr=xcmr8] - - \definebodyfont [7pt] [mm] - [mr=xcmr7] - - \definebodyfont [6pt] [mm] - [mr=xcmr6] - - \definebodyfont [5pt] [mm] - [mr=xcmr5] - - \definebodyfont [4pt] [mm] - [mr=xcmr5 at 4pt] - - \definebodyfont [14.4pt,17.3pt,20.7pt] [mm] - [mr=xcmr12 sa 1] - -\stoptypescript - -\starttypescript [boldmath] [modern,computer-modern,latin-modern] [size] - - \definebodyfont [12pt] [mm] [mr=xcmb12] - \definebodyfont [11pt] [mm] [mr=xcmb10 at 11pt] - \definebodyfont [10pt] [mm] [mr=xcmb10] - \definebodyfont [9pt] [mm] [mr=xcmb9] - \definebodyfont [8pt] [mm] [mr=xcmb8] - \definebodyfont [7pt] [mm] [mr=xcmb7] - \definebodyfont [6pt] [mm] [mr=xcmb6] - \definebodyfont [5pt] [mm] [mr=xcmb5] - \definebodyfont [4pt] [mm] [mr=xcmb5 at 4pt] - - \definebodyfont [14.4pt,17.3pt,20.7pt] [mm] [mr=xcmb12 sa 1] - -\stoptypescript - -\starttypescript [math] [euler] [size] - - \definebodyfont [9pt,10pt,11pt,12pt,14.4pt,17.3pt,20.7pt] [mm] - [mr=zeurm10 sa 1, - ex=zeuex10 sa 1, - sy=zeusm10 sa 1, - mi=eufm10 sa 1] - - \definebodyfont [6pt,7pt,8pt] [mm] - [mr=zeurm7 sa 1, - sy=zeusm7 sa 1, - mi=eufm7 sa 1, - ex=zeuex10 sa 1] - - \definebodyfont [5pt] [mm] - [mr=zeurm5, - sy=zeusm5, - mi=eufm5, - ex=zeuex10 at 5pt] - -\stoptypescript - -\starttypescript [bfmath] [euler] [size] - - \definebodyfont [9pt,10pt,11pt,12pt,14.4pt,17.3pt,20.7pt] [mm] - [mrbf=zeurb10 sa 1, - exbf=zeuex10 sa 1, - sybf=zeusb10 sa 1, - mibf=eufb10 sa 1] - - \definebodyfont [6pt,7pt,8pt] [mm] - [mrbf=zeurb7 sa 1, - sybf=zeusb7 sa 1, - mibf=eufb7 sa 1, - exbf=zeuex10 sa 1] - - \definebodyfont [5pt] [mm] - [mrbf=zeurb5, - sybf=zeusb5, - mibf=eufb5, - exbf=zeuex10 at 5pt] - -\stoptypescript - -\starttypescript [boldmath] [euler] [size] - - \definebodyfont [9pt,10pt,11pt,12pt,14.4pt,17.3pt,20.7pt] [mm] - [mr=zeurb10 sa 1, - ex=zeuex10 sa 1, - sy=zeusb10 sa 1, - mi=eufb10 sa 1] - - \definebodyfont [6pt,7pt,8pt] [mm] - [mr=zeurb7 sa 1, - sy=zeusb7 sa 1, - mi=eufb7 sa 1, - ex=zeuex10 sa 1] - - \definebodyfont [5pt] [mm] - [mr=zeurb5, - sy=zeusb5, - mi=eufb5, - ex=zeuex10 at 5pt] - -\stoptypescript - -\starttypescript [math] [times] [size] - - \mapfontsize [5pt] [6.0pt] - \mapfontsize [6pt] [6.8pt] - \mapfontsize [7pt] [7.6pt] - \mapfontsize [8pt] [8.4pt] - \mapfontsize [9pt] [9.2pt] - \mapfontsize [10pt] [10pt] - \mapfontsize [11pt] [10.8pt] - \mapfontsize [12pt] [11.6pt] - \mapfontsize [14.4pt] [13.2pt] + \definebodyfont [12pt] [mm] [mr=LMMathRoman12-Regular sa 1, mb=LMMathRoman12-Bold sa 1] + \definebodyfont [11pt] [mm] [mr=LMMathRoman10-Regular sa 1, mb=LMMathRoman10-Bold sa 1] + \definebodyfont [10pt] [mm] [mr=LMMathRoman10-Regular sa 1, mb=LMMathRoman10-Bold sa 1] + \definebodyfont [9pt] [mm] [mr=LMMathRoman9-Regular sa 1, mb=LMMathRoman9-Bold sa 1] + \definebodyfont [8pt] [mm] [mr=LMMathRoman8-Regular sa 1, mb=LMMathRoman8-Bold sa 1] + \definebodyfont [7pt] [mm] [mr=LMMathRoman7-Regular sa 1, mb=LMMathRoman7-Bold sa 1] + \definebodyfont [6pt] [mm] [mr=LMMathRoman6-Regular sa 1, mb=LMMathRoman6-Bold sa 1] + \definebodyfont [5pt] [mm] [mr=LMMathRoman5-Regular sa 1, mb=LMMathRoman5-Bold sa 1] + \definebodyfont [4pt] [mm] [mr=LMMathRoman5-Regular sa 1, mb=LMMathRoman5-Bold sa 1] + + \definebodyfont [14.4pt,17.3pt,20.7pt] [mm] [mr=LMMathRoman12-Regular sa 1, mb=LMMathRoman12-Bold sa 1] \stoptypescript diff --git a/tex/context/base/type-spe.tex b/tex/context/base/type-spe.tex deleted file mode 100644 index 0fd2abadd..000000000 --- a/tex/context/base/type-spe.tex +++ /dev/null @@ -1,49 +0,0 @@ -%D \module -%D [ file=type-spe, -%D version=2001.04.12, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Special scripts, -%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. - -% \controlspace -> enco files -% no special, always - -\starttypescriptcollection[special features] - -\starttypescript [mono] [courier,lucida] [special] - \def\controlspace{\getglyph{ComputerModernMono}{\char32}} -\stoptypescript - -\starttypescript [math] [modern,computer-modern,latin-modern,ams] [special] - \usemathcollection[default] -\stoptypescript - -\starttypescript [math,boldmath] [lucida] [special] - \usemathcollection[lbr] -\stoptypescript - -\starttypescript [math] [times] [special] - \usemathcollection[default] -\stoptypescript - -\starttypescript [math] [palatino] [special] - \usemathcollection[default] -\stoptypescript - -\starttypescript [math] [fourier] [special] - \usemathcollection[fou] -\stoptypescript - -\starttypescript [math,boldmath] [euler] [special] - \usemathcollection[eul] -\stoptypescript - -\stoptypescriptcollection - -\endinput diff --git a/tex/context/base/type-syn.tex b/tex/context/base/type-syn.tex deleted file mode 100644 index 554694c6e..000000000 --- a/tex/context/base/type-syn.tex +++ /dev/null @@ -1,880 +0,0 @@ -%D \module -%D [ file=type-syn, -%D version=2001.04.12, -%D title=\CONTEXT\ Typescript Macros, -%D subtitle=Filename scripts, -%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. - -\starttypescriptcollection[synonyms] - -% Computer Modern Roman : Donald Knuth -% Latin Modern: LM Font Revision Team - -% LM math vs CM math (analysis by Taco): -% -% lmex10.tfm % identical -% lmmi5.tfm % identical -% lmmi6.tfm % identical -% lmmi7.tfm % identical -% lmmi8.tfm % identical -% lmmi9.tfm % identical -% lmmi10.tfm % identical -% lmmi12.tfm % identical -% lmmib10.tfm % identical -% lmsy5.tfm % extra chars: 254,255 (octal) -% lmsy6.tfm % extra chars: 254,255 (octal) -% lmsy7.tfm % extra chars: 254,255 (octal) -% lmsy8.tfm % extra chars: 254,255 (octal) -% lmsy9.tfm % extra chars: 254,255 (octal) -% lmsy10.tfm % extra chars: 254,255 (octal) -% lmbsy10.tfm % extra chars: 254,255 (octal) -% -% From the 'AMS' set: -% -% lmmib5.tfm % identical -% lmmib7.tfm % identical -% lmbsy5.tfm % extra chars: 254,255 (octal) -% lmbsy7.tfm % extra chars: 254,255 (octal) -% -% The two extra characters are: -% -% /lessorequalslant -% /greaterorequalslant - -\starttypescript [serif] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [Serif] [LMRoman-Regular] - \definefontsynonym [SerifBold] [LMRoman-Bold] - \definefontsynonym [SerifItalic] [LMRoman-Italic] - \definefontsynonym [SerifSlanted] [LMRoman-Oblique] - \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique] - \definefontsynonym [SerifCaps] [LMRoman-CapsRegular] - \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique] -\stoptypescript - -\starttypescript [sans] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [Sans] [LMSans-Regular] - \definefontsynonym [SansBold] [LMSans-Bold] - \definefontsynonym [SansItalic] [LMSans-Oblique] - \definefontsynonym [SansSlanted] [LMSans-Oblique] - \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique] - \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique] - \definefontsynonym [SansCaps] [LMSans-Regular] - \definefontsynonym [SansCapsSlanted] [LMSans-Oblique] -\stoptypescript - -\starttypescript [mono] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [Mono] [LMTypewriter-Regular] - \definefontsynonym [MonoBold] [LMTypewriter-Dark] - \definefontsynonym [MonoItalic] [LMTypewriter-Italic] - \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique] - \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique] - \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique] - \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular] - \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique] - \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular] -\stoptypescript - -\starttypescript [math] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [MathRoman] [LMRoman-Regular] - \definefontsynonym [MathExtension] [LMMathExtension-Regular] - \definefontsynonym [MathItalic] [LMMathItalic-Italic] - \definefontsynonym [MathSymbol] [LMMathSymbols-Italic] -\stoptypescript - -\starttypescript [boldmath] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [MathRoman] [LMRoman-Bold] - \definefontsynonym [MathExtension] [LMMathExtension-Regular] - \definefontsynonym [MathItalic] [LMMathItalic-BoldItalic] - \definefontsynonym [MathSymbol] [LMMathSymbols-BoldItalic] -\stoptypescript - -\starttypescript [bfmath] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [MathRomanBold] [LMRoman-Bold] - \definefontsynonym [MathExtension] [LMMathExtension-Regular] - \definefontsynonym [MathItalicBold] [LMMathItalic-BoldItalic] - \definefontsynonym [MathSymbolBold] [LMMathSymbols-BoldItalic] -\stoptypescript - -\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name] - \definefontsynonym [Serif] [LMTypewriterVarWd-Regular] - \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique] - \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique] - \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark] - \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular] - \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique] -\stoptypescript - -\starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name] - \definefontsynonym [Mono] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique] - \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique] - \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed] -\stoptypescript - -\starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name] - \definefontsynonym [Mono] [LMTypewriter-Light] - \definefontsynonym [MonoBold] [LMTypewriter-Light] - \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique] - \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique] - \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light] - \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light] - \definefontsynonym [MonoCaps] [LMTypewriter-Light] - \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light] -\stoptypescript - -% This will change some day. - -\starttypescript [math] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [msbm10] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [cmsy10] -\stoptypescript - -% Concrete Modern Roman : Donald Knuth - -\starttypescript [serif] [concrete] [name] - \definefontsynonym [Serif] [ComputerConcrete] - \definefontsynonym [SerifBold] [ComputerConcrete] - \definefontsynonym [SerifItalic] [ComputerConcrete-Italic] - \definefontsynonym [SerifSlanted] [ComputerConcrete-Slanted] - \definefontsynonym [SerifBoldItalic] [ComputerConcrete-Italic] - \definefontsynonym [SerifBoldSlanted] [ComputerConcrete-Slanted] - \definefontsynonym [SerifCaps] [ComputerConcrete-Caps] -\stoptypescript - -% Euler : Hermann Zapf - -\starttypescript [math] [euler] [name] - \definefontsynonym [MathRoman] [Euler-Roman] % mr - \definefontsynonym [MathItalic] [Euler-Fraktur] % mi - \definefontsynonym [MathExtension] [Euler-Extension] % ex - \definefontsynonym [MathSymbol] [Euler-Symbol] % sy -\stoptypescript - -\starttypescript [boldmath] [euler] [name] - \definefontsynonym [MathRoman] [Euler-Roman-Bold] % mr - \definefontsynonym [MathItalic] [Euler-Fraktur-Bold] % mi - \definefontsynonym [MathExtension] [Euler-Extension] % ex - \definefontsynonym [MathSymbol] [Euler-Symbol-Bold] % sy -\stoptypescript - -\starttypescript [bfmath] [euler] [name] - \definefontsynonym [MathRomanBold] [Euler-Roman-Bold] % mr - \definefontsynonym [MathItalicBold] [Euler-Fraktur-Bold] % mi - \definefontsynonym [MathExtension] [Euler-Extension] % ex - \definefontsynonym [MathSymbolBold] [Euler-Symbol-Bold] % sy -\stoptypescript - -\starttypescript [math] [euler] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [MathItalic] - \definefontsynonym [Gothic] [MathItalic] - \definefontsynonym [Calligraphic] [MathSymbol] -\stoptypescript - -\starttypescript [boldmath] [euler] [name] - \definefontsynonym [OldStyle] [MathItalicBold] - \definefontsynonym [Fraktur] [MathItalicBold] - \definefontsynonym [Gothic] [MathItalicBold] - \definefontsynonym [Calligraphic] [MathSymbolBold] -\stoptypescript - -% American Math Society : Michael Spivak - -\starttypescript [math] [modern,computer-modern,latin-modern,ams] [name] - \definefontsynonym [MathAlpha] [AMS-SymbolA] - \definefontsynonym [MathBeta] [AMS-SymbolB] -\stoptypescript - -% Antykwa Torunska : - -\starttypescript [serif] [antykwa-torunska] [name] - \definefontsynonym [Serif] [AntykwaTorunska-Regular] - \definefontsynonym [SerifBold] [AntykwaTorunska-Bold] - \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-light] [name] - \definefontsynonym [Serif] [AntykwaTorunska-Light] - \definefontsynonym [SerifBold] [AntykwaTorunska-Medium] - \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-cond] [name] - \definefontsynonym [Serif] [AntykwaTorunska-CondRegular] - \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold] - \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-lightcond] [name] - \definefontsynonym [Serif] [AntykwaTorunska-CondLight] - \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium] - \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light] - \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium] - \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap] - - \definefontvariant [Serif][lt][Light] - - \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular] - \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold] - \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap] - - \definefontvariant [Serif][cond][Cond] - -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-light] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular] - \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold] - \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic] - \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic] - \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap] - - \definefontvariant [Serif][dk][Dark] - - \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight] - \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium] - \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap] - - \definefontvariant [Serif][cond][Cond] - -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-cond] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight] - \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium] - \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap] - - \definefontvariant [Serif][lt][Light] - - \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular] - \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold] - \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic] - \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic] - \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap] - - \definefontvariant [Serif][exp][Exp] - -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-lightcond] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular] - \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold] - \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap] - - \definefontvariant [Serif][dk][Dark] - - \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light] - \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium] - \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap] - - \definefontvariant [Serif][exp][Exp] - -\stoptypescript - -% maybe no -Regular etc - -\starttypescript [math] [antykwa-torunska-light] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light] -\stoptypescript - -\starttypescript [math] [antykwa-torunska] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-RegularItalic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-cond] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondRegularItalic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-lightcond] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight] -\stoptypescript - -% Antykwa Poltawskiego : - -\starttypescript [serif] [antykwa-poltawskiego] [name] - \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular] - \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold] - \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic] - \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic] - \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold] - \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold] - \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular] -\stoptypescript - -% Baskerville : -% -% \starttypescript [serif] [baskerville] [name] -% \definefontsynonym [Serif] [Baskerville] -% \definefontsynonym [SerifBold] [Baskerville-Bold] -% \definefontsynonym [SerifItalic] [Baskerville-Italic] -% \definefontsynonym [SerifSlanted] [Baskerville-Italic] -% \definefontsynonym [SerifBoldItalic] [Baskerville-BoldItalic] -% \definefontsynonym [SerifBoldSlanted] [Baskerville-BoldItalic] -% \definefontsynonym [SerifCaps] [Baskerville] -% \stoptypescript -% -% % Garamond : -% -% \starttypescript [serif] [garamond] [name] -% \definefontsynonym [Serif] [Garamond-Normal] -% \definefontsynonym [SerifBold] [Garamond] -% \definefontsynonym [SerifItalic] [Garamond-Medium-Italic] -% \definefontsynonym [SerifSlanted] [Garamond-Medium-Italic] -% \definefontsynonym [SerifBoldItalic] [Garamond-Medium-Italic] -% \definefontsynonym [SerifBoldSlanted] [Garamond-Medium-Italic] -% \definefontsynonym [SerifCaps] [Garamond] -% \stoptypescript - -% Iwona - -\starttypescript [sans] [iwona-light] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Light] - \definefontsynonym [SansItalic] [Iwona-LightItalic] - \definefontsynonym [SansBold] [Iwona-Medium] - \definefontsynonym [SansBoldItalic] [Iwona-MediumItalic] - \definefontsynonym [SansCaps] [Iwona-CapsLight] - \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic] -\stoptypescript - -\starttypescript [sans] [iwona-light-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsLight] - \definefontsynonym [SansItalic] [Iwona-CapsLightItalic] - \definefontsynonym [SansBold] [Iwona-CapsMedium] - \definefontsynonym [SansBoldItalic] [Iwona-CapsMediumItalic] -\stoptypescript - -\starttypescript [sans] [iwona] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Regular] - \definefontsynonym [SansItalic] [Iwona-RegularItalic] - \definefontsynonym [SansBold] [Iwona-Bold] - \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic] - \definefontsynonym [SansCaps] [Iwona-CapsRegular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsRegularItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsBold] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsRegular] - \definefontsynonym [SansItalic] [Iwona-CapsRegularItalic] - \definefontsynonym [SansBold] [Iwona-CapsBold] - \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-medium] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Medium] - \definefontsynonym [SansItalic] [Iwona-MediumItalic] - \definefontsynonym [SansBold] [Iwona-Heavy] - \definefontsynonym [SansBoldItalic] [Iwona-HeavyItalic] - \definefontsynonym [SansCaps] [Iwona-CapsHeavy] - \definefontsynonym [SansItalicCaps] [Iwona-CapsMediumItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic] -\stoptypescript - -\starttypescript [sans] [iwona-medium-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsHeavy] - \definefontsynonym [SansItalic] [Iwona-CapsMediumItalic] - \definefontsynonym [SansBold] [Iwona-CapsHeavy] - \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavyItalic] -\stoptypescript - -\starttypescript [sans] [iwona-heavy] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Heavy] - \definefontsynonym [SansItalic] [Iwona-HeavyItalic] - \definefontsynonym [SansBold] [Iwona-Heavy] - \definefontsynonym [SansBoldItalic] [Iwona-HeavyItalic] - \definefontsynonym [SansCaps] [Iwona-CapsHeavy] - \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavyItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic] -\stoptypescript - -\starttypescript [sans] [iwona-heavy-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [SansCaps] [Iwona-CapsHeavy] - \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavyItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic] -\stoptypescript - -\starttypescript [sans] [iwona-light-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondLight] - \definefontsynonym [SansItalic] [Iwona-CondLightItalic] - \definefontsynonym [SansBold] [Iwona-CondMedium] - \definefontsynonym [SansBoldItalic] [Iwona-CondMediumItalic] - \definefontsynonym [SansCaps] [Iwona-CondCapsLight] - \definefontsynonym [SansItalicCaps] [Iwona-CondCapsLightItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CondCapsMedium] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsMediumItalic] -\stoptypescript - -\starttypescript [sans] [iwona-light-cond-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondCapsLight] - \definefontsynonym [SansItalic] [Iwona-CondCapsLightItalic] - \definefontsynonym [SansBold] [Iwona-CondCapsMedium] - \definefontsynonym [SansBoldItalic] [Iwona-CondCapsMediumItalic] -\stoptypescript - -\starttypescript [sans] [iwona-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondRegular] - \definefontsynonym [SansItalic] [Iwona-CondRegularItalic] - \definefontsynonym [SansBold] [Iwona-CondBold] - \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic] - \definefontsynonym [SansCaps] [Iwona-CondCapsRegular] - \definefontsynonym [SansItalicCaps] [Iwona-CondCapsRegularItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CondCapsBold] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-cond-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondCapsRegular] - \definefontsynonym [SansItalic] [Iwona-CondCapsRegularItalic] - \definefontsynonym [SansBold] [Iwona-CondCapsBold] - \definefontsynonym [SansBoldItalic] [Iwona-CondCapsBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-medium-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondMedium] - \definefontsynonym [SansItalic] [Iwona-CondMediumItalic] - \definefontsynonym [SansBold] [Iwona-CondHeavy] - \definefontsynonym [SansBoldItalic] [Iwona-CondHeavyItalic] - \definefontsynonym [SansCaps] [Iwona-CondCapsHeavy] - \definefontsynonym [SansItalicCaps] [Iwona-CondCapsMediumItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CondCapsHeavy] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsHeavyItalic] -\stoptypescript - -\starttypescript [sans] [iwona-medium-cond-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondCapsHeavy] - \definefontsynonym [SansItalic] [Iwona-CondCapsMediumItalic] - \definefontsynonym [SansBold] [Iwona-CondCapsHeavy] - \definefontsynonym [SansBoldItalic] [Iwona-CondCapsHeavyItalic] -\stoptypescript - -\starttypescript [math] [iwona-light] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-LightItalic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Light] -\stoptypescript - -\starttypescript [math] [iwona] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-RegularItalic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular] -\stoptypescript - -\starttypescript [math] [iwona-medium] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-MediumItalic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium] -\stoptypescript - -\starttypescript [math] [iwona-heavy] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-HeavyItalic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy] -\stoptypescript - -% Kurier - -\starttypescript [sans] [kurier-light] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Kurier-Light] - \definefontsynonym [SansItalic] [Kurier-LightItalic] - \definefontsynonym [SansBold] [Kurier-Medium] - \definefontsynonym [SansBoldItalic] [Kurier-MediumItalic] -\stoptypescript - -\starttypescript [sans] [kurier] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Kurier-Regular] - \definefontsynonym [SansItalic] [Kurier-RegularItalic] - \definefontsynonym [SansBold] [Kurier-Bold] - \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic] -\stoptypescript - -\starttypescript [sans] [kurier-medium] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Kurier-Medium] - \definefontsynonym [SansItalic] [Kurier-MediumItalic] - \definefontsynonym [SansBold] [Kurier-Heavy] - \definefontsynonym [SansBoldItalic] [Kurier-HeavyItalic] -\stoptypescript - -\starttypescript [math] [kurier-light] [name] - \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light] - \definefontsynonym [MathItalic] [Kurier-Math-Letters-LightItalic] - \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light] - \definefontsynonym [MathExtension] [Kurier-Math-Extension-Light] -\stoptypescript - -\starttypescript [math] [kurier] [name] - \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular] - \definefontsynonym [MathItalic] [Kurier-Math-Letters-RegularItalic] - \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular] - \definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular] -\stoptypescript - -\starttypescript [math] [kurier-medium] [name] - \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium] - \definefontsynonym [MathItalic] [Kurier-Math-Letters-MediumItalic] - \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium] - \definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium] -\stoptypescript - -% Bookman : - -\starttypescript [serif] [bookman] [name] - \definefontsynonym [Serif] [Bookman-Light] - \definefontsynonym [SerifItalic] [Bookman-LightItalic] - \definefontsynonym [SerifBold] [Bookman-DemiBold] - \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic] - \definefontsynonym [SerifSlanted] [Bookman-LightSlanted] - \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted] - \definefontsynonym [SerifCaps] [Bookman-Light-Caps] -\stoptypescript - -% Chancery : Zapf - -\starttypescript [calligraphy] [chancery] [name] - \definefontsynonym [Calligraphy] [Chancery] -\stoptypescript - -% Schoolbook : - -\starttypescript [serif] [schoolbook] [name] - \definefontsynonym [Serif] [Schoolbook-Roman] - \definefontsynonym [SerifItalic] [Schoolbook-Italic] - \definefontsynonym [SerifBold] [Schoolbook-Bold] - \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic] - \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted] - \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted] - \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps] -\stoptypescript - -% Utopia : Adobe - -\starttypescript [serif] [utopia] [name] - \definefontsynonym [Serif] [Utopia-Regular] - \definefontsynonym [SerifItalic] [Utopia-Italic] - \definefontsynonym [SerifBold] [Utopia-Bold] - \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic] - \definefontsynonym [SerifSlanted] [Utopia-Slanted] - \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted] - \definefontsynonym [SerifCaps] [Utopia-Regular-Caps] -\stoptypescript - -% Fourier : Michael Bovani - -\starttypescript [serif] [fourier] [name] - \definefontsynonym [Serif] [Fourier-Regular] - \definefontsynonym [SerifSlanted] [Fourier-Slanted] - \definefontsynonym [SerifItalic] [Fourier-Italic] - \definefontsynonym [SerifCaps] [Fourier-RegularCaps] - \definefontsynonym [SerifBold] [Fourier-Bold] - \definefontsynonym [SerifBoldSlanted] [Fourier-BoldSlanted] - \definefontsynonym [SerifBoldItalic] [Fourier-BoldItalic] - \definefontsynonym [SerifBoldCaps] [Fourier-BoldCaps] - - \definefontsynonym [Serif-Expert] [Fourier-Regular-Expert] - \definefontsynonym [SerifSlanted-Expert] [Fourier-Slanted-Expert] - \definefontsynonym [SerifItalic-Expert] [Fourier-Italic-Expert] - \definefontsynonym [SerifCaps-Expert] [Fourier-RegularCaps-Expert] - \definefontsynonym [SerifSemiBold-Expert] [Fourier-Semi-Expert] - \definefontsynonym [SerifSemiSlanted-Expert] [Fourier-SemiSlanted-Expert] - \definefontsynonym [SerifSemiItalic-Expert] [Fourier-SemiItalic-Expert] - \definefontsynonym [SerifSemiCaps-Expert] [Fourier-SemiCaps-Expert] - \definefontsynonym [SerifBold-Expert] [Fourier-Bold-Expert] - \definefontsynonym [SerifBoldSlanted-Expert] [Fourier-BoldSlanted-Expert] - \definefontsynonym [SerifBoldItalic-Expert] [Fourier-BoldItalic-Expert] - \definefontsynonym [SerifBlack-Expert] [Fourier-Black-Expert] - - \definefontsynonym [Serif-OldStyle] [Fourier-Regular-OldStyle] - \definefontsynonym [SerifSlanted-OldStyle] [Fourier-Slanted-OldStyle] - \definefontsynonym [SerifItalic-OldStyle] [Fourier-Italic-OldStyle] - \definefontsynonym [SerifCaps-OldStyle] [Fourier-RegularCaps-OldStyle] - \definefontsynonym [SerifSemiBold-OldStyle] [Fourier-Semi-OldStyle] - \definefontsynonym [SerifSemiSlanted-OldStyle] [Fourier-SemiSlanted-OldStyle] - \definefontsynonym [SerifSemiItalic-OldStyle] [Fourier-SemiItalic-OldStyle] - \definefontsynonym [SerifSemiCaps-OldStyle] [Fourier-SemiCaps-OldStyle] - \definefontsynonym [SerifBold-OldStyle] [Fourier-Bold-OldStyle] - \definefontsynonym [SerifBoldSlanted-OldStyle] [Fourier-BoldSlanted-OldStyle] - \definefontsynonym [SerifBoldItalic-OldStyle] [Fourier-BoldItalic-OldStyle] - \definefontsynonym [SerifBlack-OldStyle] [Fourier-Black-OldStyle] - \definefontsynonym [SerifBlackSlanted-OldStyle] [Fourier-BlackSlanted-OldStyle] -\stoptypescript - -\starttypescript [math] [fourier] [name] - \definefontsynonym [MathRoman] [Fourier-Math-Letters] - \definefontsynonym [MathItalic] [Fourier-Math-Letters-Italic] - \definefontsynonym [MathSymbol] [Fourier-Math-Symbols] - \definefontsynonym [MathExtension] [Fourier-Math-Extension] -\stoptypescript - -\starttypescript [math] [fourier] [name] % todo - \definefontsynonym [OldStyle] [Serif-OldStyle] % strange, no oldstyles - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [msbm10] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [eusm10] -\stoptypescript - -% Charter : - -\starttypescript [serif] [charter] [name] - \definefontsynonym [Serif] [Charter-Roman] - \definefontsynonym [SerifItalic] [Charter-Italic] - \definefontsynonym [SerifBold] [Charter-Bold] - \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic] - \definefontsynonym [SerifSlanted] [Charter-Slanted] - \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted] - \definefontsynonym [SerifCaps] [Charter-Roman-Caps] -\stoptypescript - -% Times : - -\starttypescript [serif] [times] [name] - \definefontsynonym [Serif] [Times-Roman] - \definefontsynonym [SerifBold] [Times-Bold] - \definefontsynonym [SerifItalic] [Times-Italic] - \definefontsynonym [SerifSlanted] [Times-Italic] - \definefontsynonym [SerifBoldItalic] [Times-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic] - \definefontsynonym [SerifCaps] [Times-Roman] -\stoptypescript - -\starttypescript [math] [times] [name] - \definefontsynonym [MathRoman] [Times-Roman-Upright] - \definefontsynonym [MathExtension] [Times-Math-Extension] - \definefontsynonym [MathItalic] [Times-Math-Italic] - \definefontsynonym [MathSymbol] [Times-Math-Symbols] - \definefontsynonym [MathAlpha] [Times-Math-SymbolsA] - \definefontsynonym [MathBeta] [Times-Math-SymbolsB] -\stoptypescript - -\starttypescript [math] [times] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [MathBeta] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [eusm10] -\stoptypescript - -% Helvetica : - -\starttypescript [sans] [helvetica] [name] - \definefontsynonym [Sans] [Helvetica] - \definefontsynonym [SansBold] [Helvetica-Bold] - \definefontsynonym [SansItalic] [Helvetica-Oblique] - \definefontsynonym [SansSlanted] [Helvetica-Oblique] - \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique] - \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique] - \definefontsynonym [SansCaps] [Helvetica] -\stoptypescript - -\starttypescript [math] [helvetica] [name] - \definefontsynonym [MathRoman] [Helvetica-MathRoman] - \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols] - \definefontsynonym [MathItalic] [Helvetica-MathItalics] - \definefontsynonym [MathSymbol] [Helvetica-MathSymbols] -\stoptypescript - -% Courier : - -\starttypescript [mono] [courier] [name] - \definefontsynonym [Mono] [Courier] - \definefontsynonym [MonoBold] [Courier-Bold] - \definefontsynonym [MonoItalic] [Courier-Oblique] - \definefontsynonym [MonoSlanted] [Courier-Oblique] - \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique] - \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique] - \definefontsynonym [MonoCaps] [Courier] -\stoptypescript - -% Palatino : Hermann Zapf / URW - -\starttypescript [serif] [palatino] [name] - \definefontsynonym [Serif] [Palatino] - \definefontsynonym [SerifBold] [Palatino-Bold] - \definefontsynonym [SerifItalic] [Palatino-Italic] - \definefontsynonym [SerifSlanted] [Palatino-Slanted] - \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted] - \definefontsynonym [SerifCaps] [Palatino-Caps] -\stoptypescript - -\starttypescript [math] [palatino] [name] - \definefontsynonym [MathRoman] [Palatino-Roman-Upright] - \definefontsynonym [MathExtension] [Palatino-Math-Extension] - \definefontsynonym [MathItalic] [Palatino-Math-Italic] - \definefontsynonym [MathSymbol] [Palatino-Math-Symbols] - \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA] - \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB] -\stoptypescript - -\starttypescript [math] [palatino] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [MathBeta] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [eusm10] -\stoptypescript - -% bonus definitions - -\starttypescript [serif] [palatino] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularOsF] [TeXPalladioL-SC] - \definefontsynonym [SerifItalicOsF] [TeXPalladioL-ItalicOsF] - \definefontsynonym [SerifBoldOsF] [TeXPalladioL-BoldOsF] - \definefontsynonym [SerifBoldItalicOsF][TeXPalladioL-BoldItalicOsF] - \definefontsynonym [SerifCapsOsF] [TeXPalladioL-SC] -\stoptypescript - -\stoptypescriptcollection - -\endinput diff --git a/tex/context/base/type-tmf.mkii b/tex/context/base/type-tmf.mkii new file mode 100644 index 000000000..3c17b0308 --- /dev/null +++ b/tex/context/base/type-tmf.mkii @@ -0,0 +1,1161 @@ +%D \module +%D [ file=type-tmf, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Core \TEX\ Fonts, +%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. + +\starttypescriptcollection[synonyms] + +% Computer Modern Roman : Donald Knuth +% Latin Modern: LM Font Revision Team + +% LM math vs CM math (analysis by Taco): +% +% lmex10.tfm % identical +% lmmi5.tfm % identical +% lmmi6.tfm % identical +% lmmi7.tfm % identical +% lmmi8.tfm % identical +% lmmi9.tfm % identical +% lmmi10.tfm % identical +% lmmi12.tfm % identical +% lmmib10.tfm % identical +% lmsy5.tfm % extra chars: 254,255 (octal) +% lmsy6.tfm % extra chars: 254,255 (octal) +% lmsy7.tfm % extra chars: 254,255 (octal) +% lmsy8.tfm % extra chars: 254,255 (octal) +% lmsy9.tfm % extra chars: 254,255 (octal) +% lmsy10.tfm % extra chars: 254,255 (octal) +% lmbsy10.tfm % extra chars: 254,255 (octal) +% +% From the 'AMS' set: +% +% lmmib5.tfm % identical +% lmmib7.tfm % identical +% lmbsy5.tfm % extra chars: 254,255 (octal) +% lmbsy7.tfm % extra chars: 254,255 (octal) +% +% The two extra characters are: +% +% /lessorequalslant +% /greaterorequalslant + +\starttypescript [serif] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Serif] [LMRoman-Regular] + \definefontsynonym [SerifBold] [LMRoman-Bold] + \definefontsynonym [SerifItalic] [LMRoman-Italic] + \definefontsynonym [SerifSlanted] [LMRoman-Oblique] + \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique] + \definefontsynonym [SerifCaps] [LMRoman-CapsRegular] + \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique] +\stoptypescript + +\starttypescript [sans] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Sans] [LMSans-Regular] + \definefontsynonym [SansBold] [LMSans-Bold] + \definefontsynonym [SansItalic] [LMSans-Oblique] + \definefontsynonym [SansSlanted] [LMSans-Oblique] + \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique] + \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique] + \definefontsynonym [SansCaps] [LMSans-Regular] + \definefontsynonym [SansCapsSlanted] [LMSans-Oblique] +\stoptypescript + +\starttypescript [mono] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Mono] [LMTypewriter-Regular] + \definefontsynonym [MonoBold] [LMTypewriter-Dark] + \definefontsynonym [MonoItalic] [LMTypewriter-Italic] + \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique] + \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique] + \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular] +\stoptypescript + +\starttypescript [math] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [MathRoman] [LMMathRoman-Regular] + \definefontsynonym [MathExtension] [LMMathExtension-Regular] + \definefontsynonym [MathItalic] [LMMathItalic-Italic] + \definefontsynonym [MathSymbol] [LMMathSymbols-Italic] +\stoptypescript + +\starttypescript [boldmath] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [MathRoman] [LMMathRoman-Bold] + \definefontsynonym [MathExtension] [LMMathExtension-Regular] + \definefontsynonym [MathItalic] [LMMathItalic-BoldItalic] + \definefontsynonym [MathSymbol] [LMMathSymbols-BoldItalic] +\stoptypescript + +\starttypescript [bfmath] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [MathRomanBold] [LMMathRoman-Bold] + \definefontsynonym [MathExtension] [LMMathExtension-Regular] + \definefontsynonym [MathItalicBold] [LMMathItalic-BoldItalic] + \definefontsynonym [MathSymbolBold] [LMMathSymbols-BoldItalic] +\stoptypescript + +\starttypescript [math,boldmath,bfmath] [modern,computer-modern,latin-modern] [name] + \usemathcollection[default] +\stoptypescript + +\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name] + \definefontsynonym [Serif] [LMTypewriterVarWd-Regular] + \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique] + \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique] + \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark] + \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular] + \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique] +\stoptypescript + +\starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name] + \definefontsynonym [Mono] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique] + \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed] +\stoptypescript + +\starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name] + \definefontsynonym [Mono] [LMTypewriter-Light] + \definefontsynonym [MonoBold] [LMTypewriter-Light] + \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique] + \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light] + \definefontsynonym [MonoCaps] [LMTypewriter-Light] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light] +\stoptypescript + +% Later we will map the real fonts, here we just map synonyms. + +\starttypescript [serif] [modern,latin-modern] + \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique] + \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold] + \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic] + \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique] + \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular] + \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique] + \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular] + \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic] + \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern] + \definefontsynonym [LMSans-Regular] [LMSans10-Regular] + \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique] + \definefontsynonym [LMSans-Bold] [LMSans10-Bold] + \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed] + \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique] + \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] + \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular] + \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique] + \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light] + \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique] + \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed] + \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique] + \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark] + \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique] + \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular] + \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic] + \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique] + \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular] + \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique] + \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light] + \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique] + \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark] + \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique] +\stoptypescript + +\starttypescript [serif] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModern] [LMRoman-Regular] + \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic] + \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique] + \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold] + \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic] + \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique] + \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular] + \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique] +\stoptypescript + +\starttypescript [sans] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModernSans] [LMSans-Regular] + \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique] + \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique] + \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold] + \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique] + \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique] + \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular] + \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique] +\stoptypescript + +\starttypescript [mono] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular] + \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic] + \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique] + \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark] + \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % ! + \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique] + \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular] + \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique] + \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular] +\stoptypescript + +\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] + \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular] + \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique] + \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique] + \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark] + \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular] + \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique] +\stoptypescript + +\starttypescript [math] [modern,latin-modern] + \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular] + \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold] + \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] + \definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic] + \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] + \definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic] + \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] +\stoptypescript + +% can boldmath and bfmath be joined? +\starttypescript [boldmath] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold] + \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] + \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] + \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] +\stoptypescript + +\starttypescript [bfmath] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold] + \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] + \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] + \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] +\stoptypescript + +\starttypescript [serif] [modern,latin-modern,computer-modern] + \definefontsynonym [cmr5] [LMRoman5-Regular] + \definefontsynonym [cmr6] [LMRoman6-Regular] + \definefontsynonym [cmr7] [LMRoman7-Regular] + \definefontsynonym [cmr8] [LMRoman8-Regular] + \definefontsynonym [cmr9] [LMRoman9-Regular] + \definefontsynonym [cmr10] [LMRoman10-Regular] + \definefontsynonym [cmr12] [LMRoman12-Regular] + \definefontsynonym [cmr17] [LMRoman17-Regular] + \definefontsynonym [cmbx5] [LMRoman5-Bold] + \definefontsynonym [cmbx6] [LMRoman6-Bold] + \definefontsynonym [cmbx7] [LMRoman7-Bold] + \definefontsynonym [cmbx8] [LMRoman8-Bold] + \definefontsynonym [cmbx9] [LMRoman9-Bold] + \definefontsynonym [cmbx10] [LMRoman10-Bold] + \definefontsynonym [cmbx12] [LMRoman12-Bold] + \definefontsynonym [cmsl10] [LMRoman10-Oblique] + \definefontsynonym [cmsl12] [LMRoman12-Oblique] + \definefontsynonym [cmsl17] [LMRoman17-Oblique] + \definefontsynonym [cmsl8] [LMRoman8-Oblique] + \definefontsynonym [cmsl9] [LMRoman9-Oblique] + \definefontsynonym [cmti7] [LMRoman7-Italic] + \definefontsynonym [cmti8] [LMRoman8-Italic] + \definefontsynonym [cmti9] [LMRoman9-Italic] + \definefontsynonym [cmti10] [LMRoman10-Italic] + \definefontsynonym [cmti12] [LMRoman12-Italic] + \definefontsynonym [cmbsl10] [LMRoman10-DemiOblique] + \definefontsynonym [cmbxsl10] [LMRoman10-BoldOblique] + \definefontsynonym [cmbxti10] [LMRoman10-BoldItalic] + \definefontsynonym [cmcsc10] [LMRoman10-CapsRegular] + \definefontsynonym [cmcscsl10][LMRoman10-CapsOblique] + + %definefontsynonym [cmb10] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern,computer-modern] + \definefontsynonym [cmss8] [LMSans8-Regular] + \definefontsynonym [cmss9] [LMSans9-Regular] + \definefontsynonym [cmss10] [LMSans10-Regular] + \definefontsynonym [cmss12] [LMSans12-Regular] + \definefontsynonym [cmss17] [LMSans17-Regular] + \definefontsynonym [cmssi10] [LMSans10-Oblique] + \definefontsynonym [cmssi12] [LMSans12-Oblique] + \definefontsynonym [cmssi17] [LMSans17-Oblique] + \definefontsynonym [cmssi8] [LMSans8-Oblique] + \definefontsynonym [cmssi9] [LMSans9-Oblique] + \definefontsynonym [cmssq8] [LMSansQuotation8-Regular] + \definefontsynonym [cmssqb8] [LMSansQuotation8-Bold] + \definefontsynonym [cmssqbi8] [LMSansQuotation8-BoldOblique] + \definefontsynonym [cmssqi8] [LMSansQuotation8-Oblique] + \definefontsynonym [cmssbx10] [LMSans10-Bold] + \definefontsynonym [cmssdc10] [LMSans10-DemiCondensed] + \definefontsynonym [cmssbi10] [LMSans10-BoldOblique] + \definefontsynonym [cmssdi10] [LMSans10-DemiCondensedOblique] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,computer-modern] + \definefontsynonym [cmtt8] [LMTypewriter8-Regular] + \definefontsynonym [cmtt9] [LMTypewriter9-Regular] + \definefontsynonym [cmtt10] [LMTypewriter10-Regular] + \definefontsynonym [cmtt12] [LMTypewriter12-Regular] + \definefontsynonym [cmitt10] [LMTypewriter10-Italic] + \definefontsynonym [cmsltt10] [LMTypewriter10-Oblique] + \definefontsynonym [cmvtt10] [LMTypewriterVarWd10-Regular] + \definefontsynonym [cmvtti10] [LMTypewriterVarWd10-Oblique] + \definefontsynonym [cmtcsc10] [LMTypewriter10-CapsRegular] +\stoptypescript + +\starttypescript [math] [modern,latin-modern,computer-modern] + \definefontsynonym [cmbsy5] [LMMathSymbols5-BoldItalic] + \definefontsynonym [cmbsy7] [LMMathSymbols7-BoldItalic] + \definefontsynonym [cmbsy10] [LMMathSymbols10-BoldItalic] + \definefontsynonym [cmsy5] [LMMathSymbols5-Italic] + \definefontsynonym [cmsy6] [LMMathSymbols6-Italic] + \definefontsynonym [cmsy7] [LMMathSymbols7-Italic] + \definefontsynonym [cmsy8] [LMMathSymbols8-Italic] + \definefontsynonym [cmsy9] [LMMathSymbols9-Italic] + \definefontsynonym [cmsy10] [LMMathSymbols10-Italic] + \definefontsynonym [cmex10] [LMMathExtension10-Regular] + \definefontsynonym [cmmi5] [LMMathItalic5-Italic] + \definefontsynonym [cmmi6] [LMMathItalic6-Italic] + \definefontsynonym [cmmi7] [LMMathItalic7-Italic] + \definefontsynonym [cmmi8] [LMMathItalic8-Italic] + \definefontsynonym [cmmi9] [LMMathItalic9-Italic] + \definefontsynonym [cmmi10] [LMMathItalic10-Italic] + \definefontsynonym [cmmi12] [LMMathItalic12-Italic] + \definefontsynonym [cmmib5] [LMMathItalic5-BoldItalic] + \definefontsynonym [cmmib7] [LMMathItalic7-BoldItalic] + \definefontsynonym [cmmib10] [LMMathItalic10-BoldItalic] +\stoptypescript + +% This will change some day. + +\starttypescript [math] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [msbm10] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [cmsy10] +\stoptypescript + +% Concrete Modern Roman : Donald Knuth + +\starttypescript [serif] [concrete] [name] + \definefontsynonym [Serif] [ComputerConcrete] + \definefontsynonym [SerifBold] [ComputerConcrete] + \definefontsynonym [SerifItalic] [ComputerConcrete-Italic] + \definefontsynonym [SerifSlanted] [ComputerConcrete-Slanted] + \definefontsynonym [SerifBoldItalic] [ComputerConcrete-Italic] + \definefontsynonym [SerifBoldSlanted] [ComputerConcrete-Slanted] + \definefontsynonym [SerifCaps] [ComputerConcrete-Caps] +\stoptypescript + +% Euler : Hermann Zapf + +\starttypescript [math] [euler] [name] + \definefontsynonym [MathRoman] [Euler-Roman] % mr + \definefontsynonym [MathItalic] [Euler-Fraktur] % mi + \definefontsynonym [MathExtension] [Euler-Extension] % ex + \definefontsynonym [MathSymbol] [Euler-Symbol] % sy +\stoptypescript + +\starttypescript [boldmath] [euler] [name] + \definefontsynonym [MathRoman] [Euler-Roman-Bold] % mr + \definefontsynonym [MathItalic] [Euler-Fraktur-Bold] % mi + \definefontsynonym [MathExtension] [Euler-Extension] % ex + \definefontsynonym [MathSymbol] [Euler-Symbol-Bold] % sy +\stoptypescript + +\starttypescript [bfmath] [euler] [name] + \definefontsynonym [MathRomanBold] [Euler-Roman-Bold] % mr + \definefontsynonym [MathItalicBold] [Euler-Fraktur-Bold] % mi + \definefontsynonym [MathExtension] [Euler-Extension] % ex + \definefontsynonym [MathSymbolBold] [Euler-Symbol-Bold] % sy +\stoptypescript + +\starttypescript [math] [euler] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [MathItalic] + \definefontsynonym [Gothic] [MathItalic] + \definefontsynonym [Calligraphic] [MathSymbol] +\stoptypescript + +\starttypescript [boldmath] [euler] [name] + \definefontsynonym [OldStyle] [MathItalicBold] + \definefontsynonym [Fraktur] [MathItalicBold] + \definefontsynonym [Gothic] [MathItalicBold] + \definefontsynonym [Calligraphic] [MathSymbolBold] +\stoptypescript + +\starttypescript [math,boldmath,bfmath] [euler] [name] + \usemathcollection[eul] +\stoptypescript + +% American Math Society : Michael Spivak + +\starttypescript [math] [modern,computer-modern,latin-modern,ams] [name] + \definefontsynonym [MathAlpha] [AMS-SymbolA] + \definefontsynonym [MathBeta] [AMS-SymbolB] +\stoptypescript + +% Antykwa Torunska : + +\starttypescript [serif] [antykwa-torunska] [name] + \definefontsynonym [Serif] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBold] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-light] [name] + \definefontsynonym [Serif] [AntykwaTorunska-Light] + \definefontsynonym [SerifBold] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-cond] [name] + \definefontsynonym [Serif] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-lightcond] [name] + \definefontsynonym [Serif] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light] + \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][lt][Light] + + \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][cond][Cond] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-light] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][dk][Dark] + + \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][cond][Cond] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-cond] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][lt][Light] + + \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][exp][Exp] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-lightcond] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][dk][Dark] + + \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light] + \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][exp][Exp] + +\stoptypescript + +% maybe no -Regular etc + +\starttypescript [math] [antykwa-torunska-light] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [antykwa-torunska] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-Italic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-cond] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondItalic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-lightcond] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight] +\stoptypescript + +% Antykwa Poltawskiego : + +\starttypescript [serif] [antykwa-poltawskiego] [name] + \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular] + \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic] + \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic] + \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular] +\stoptypescript + +% Iwona + +\starttypescript [sans] [iwona-light] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Light-Regular] + \definefontsynonym [SansItalic] [Iwona-Light-Italic] + \definefontsynonym [SansBold] [Iwona-Medium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-Medium-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsLight] + \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic] +\stoptypescript + +\starttypescript [sans] [iwona-light-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsLight-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsLight-Italic] + \definefontsynonym [SansBold] [Iwona-CapsMedium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsMedium-Italic] +\stoptypescript + +\starttypescript [sans] [iwona] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Regular] + \definefontsynonym [SansItalic] [Iwona-Italic] + \definefontsynonym [SansBold] [Iwona-Bold] + \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic] + \definefontsynonym [SansCaps] [Iwona-CapsRegular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsBold] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsRegular] + \definefontsynonym [SansItalic] [Iwona-CapsItalic] + \definefontsynonym [SansBold] [Iwona-CapsBold] + \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Medium-Regular] + \definefontsynonym [SansItalic] [Iwona-Medium-Italic] + \definefontsynonym [SansBold] [Iwona-Heavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsMedium-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsMedium-Italic] + \definefontsynonym [SansBold] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-heavy] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Heavy-Regular] + \definefontsynonym [SansItalic] [Iwona-Heavy-Italic] + \definefontsynonym [SansBold] [Iwona-Heavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-heavy-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-light-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondLight-Regular] + \definefontsynonym [SansItalic] [Iwona-CondLight-Italic] + \definefontsynonym [SansBold] [Iwona-CondMedium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CondMedium-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsCondLight-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsCondLight-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsCondMedium-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondMedium-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-light-cond-caps,iwona-light-caps-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsCondLight-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsCondLight-Italic] + \definefontsynonym [SansBold] [Iwona-CapsCondMedium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsCondMedium-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondRegular] + \definefontsynonym [SansItalic] [Iwona-CondItalic] + \definefontsynonym [SansBold] [Iwona-CondBold] + \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic] + \definefontsynonym [SansCaps] [Iwona-CapsCondRegular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsCondItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsCondBold] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-cond-caps,iwona-caps-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsCondRegular] + \definefontsynonym [SansItalic] [Iwona-CapsCondItalic] + \definefontsynonym [SansBold] [Iwona-CapsCondBold] + \definefontsynonym [SansBoldItalic] [Iwona-CapsCondBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondMedium-Regular] + \definefontsynonym [SansItalic] [Iwona-CondMedium-Italic] + \definefontsynonym [SansBold] [Iwona-CondHeavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CondHeavy-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsCondMedium-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-cond-caps,iwona-medium-caps-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsCondMedium-Italic] + \definefontsynonym [SansBold] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsCondHeavy-Italic] +\stoptypescript + +\starttypescript [math] [iwona-light] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light-Regular] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-Light-Italic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [iwona] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-Italic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [iwona-medium] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium-Regular] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-Medium-Italic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium] +\stoptypescript + +\starttypescript [math] [iwona-heavy] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy-Regular] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-Heavy-Italic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy] +\stoptypescript + +% Kurier + +\starttypescript [sans] [kurier-light] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Light-Regular] + \definefontsynonym [SansItalic] [Kurier-Light-Italic] + \definefontsynonym [SansBold] [Kurier-Medium-Regular] + \definefontsynonym [SansBoldItalic] [Kurier-Medium-Italic] +\stoptypescript + +\starttypescript [sans] [kurier] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Regular] + \definefontsynonym [SansItalic] [Kurier-Italic] + \definefontsynonym [SansBold] [Kurier-Bold] + \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic] +\stoptypescript + +\starttypescript [sans] [kurier-medium] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Medium-Regular] + \definefontsynonym [SansItalic] [Kurier-Medium-Italic] + \definefontsynonym [SansBold] [Kurier-Heavy-Regular] + \definefontsynonym [SansBoldItalic] [Kurier-Heavy-Italic] +\stoptypescript + +\starttypescript [math] [kurier-light] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light-Regular] + \definefontsynonym [MathItalic] [Kurier-Math-Letters-Light-Italic] + \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light] + \definefontsynonym [MathExtension] [Kurier-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [kurier] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular] + \definefontsynonym [MathItalic] [Kurier-Math-Letters-Italic] + \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular] + \definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [kurier-medium] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium-Regular] + \definefontsynonym [MathItalic] [Kurier-Math-Letters-Medium-Italic] + \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium] + \definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium] +\stoptypescript + +% Bookman : + +\starttypescript [serif] [bookman] [name] + \definefontsynonym [Serif] [Bookman-Light] + \definefontsynonym [SerifItalic] [Bookman-LightItalic] + \definefontsynonym [SerifBold] [Bookman-DemiBold] + \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic] + \definefontsynonym [SerifSlanted] [Bookman-LightSlanted] + \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted] + \definefontsynonym [SerifCaps] [Bookman-Light-Caps] +\stoptypescript + +% Chancery : Zapf + +\starttypescript [calligraphy] [chancery] [name] + \definefontsynonym [Calligraphy] [Chancery] +\stoptypescript + +% Schoolbook : + +\starttypescript [serif] [schoolbook] [name] + \definefontsynonym [Serif] [Schoolbook-Roman] + \definefontsynonym [SerifItalic] [Schoolbook-Italic] + \definefontsynonym [SerifBold] [Schoolbook-Bold] + \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic] + \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted] + \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted] + \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps] +\stoptypescript + +% Utopia : Adobe + +\starttypescript [serif] [utopia] [name] + \definefontsynonym [Serif] [Utopia-Regular] + \definefontsynonym [SerifItalic] [Utopia-Italic] + \definefontsynonym [SerifBold] [Utopia-Bold] + \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic] + \definefontsynonym [SerifSlanted] [Utopia-Slanted] + \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted] + \definefontsynonym [SerifCaps] [Utopia-Regular-Caps] +\stoptypescript + +% Fourier : Michael Bovani + +\starttypescript [serif] [fourier] [name] + \definefontsynonym [Serif] [Fourier-Regular] + \definefontsynonym [SerifSlanted] [Fourier-Slanted] + \definefontsynonym [SerifItalic] [Fourier-Italic] + \definefontsynonym [SerifCaps] [Fourier-RegularCaps] + \definefontsynonym [SerifBold] [Fourier-Bold] + \definefontsynonym [SerifBoldSlanted] [Fourier-BoldSlanted] + \definefontsynonym [SerifBoldItalic] [Fourier-BoldItalic] + \definefontsynonym [SerifBoldCaps] [Fourier-BoldCaps] + + \definefontsynonym [Serif-Expert] [Fourier-Regular-Expert] + \definefontsynonym [SerifSlanted-Expert] [Fourier-Slanted-Expert] + \definefontsynonym [SerifItalic-Expert] [Fourier-Italic-Expert] + \definefontsynonym [SerifCaps-Expert] [Fourier-RegularCaps-Expert] + \definefontsynonym [SerifSemiBold-Expert] [Fourier-Semi-Expert] + \definefontsynonym [SerifSemiSlanted-Expert] [Fourier-SemiSlanted-Expert] + \definefontsynonym [SerifSemiItalic-Expert] [Fourier-SemiItalic-Expert] + \definefontsynonym [SerifSemiCaps-Expert] [Fourier-SemiCaps-Expert] + \definefontsynonym [SerifBold-Expert] [Fourier-Bold-Expert] + \definefontsynonym [SerifBoldSlanted-Expert] [Fourier-BoldSlanted-Expert] + \definefontsynonym [SerifBoldItalic-Expert] [Fourier-BoldItalic-Expert] + \definefontsynonym [SerifBlack-Expert] [Fourier-Black-Expert] + + \definefontsynonym [Serif-OldStyle] [Fourier-Regular-OldStyle] + \definefontsynonym [SerifSlanted-OldStyle] [Fourier-Slanted-OldStyle] + \definefontsynonym [SerifItalic-OldStyle] [Fourier-Italic-OldStyle] + \definefontsynonym [SerifCaps-OldStyle] [Fourier-RegularCaps-OldStyle] + \definefontsynonym [SerifSemiBold-OldStyle] [Fourier-Semi-OldStyle] + \definefontsynonym [SerifSemiSlanted-OldStyle] [Fourier-SemiSlanted-OldStyle] + \definefontsynonym [SerifSemiItalic-OldStyle] [Fourier-SemiItalic-OldStyle] + \definefontsynonym [SerifSemiCaps-OldStyle] [Fourier-SemiCaps-OldStyle] + \definefontsynonym [SerifBold-OldStyle] [Fourier-Bold-OldStyle] + \definefontsynonym [SerifBoldSlanted-OldStyle] [Fourier-BoldSlanted-OldStyle] + \definefontsynonym [SerifBoldItalic-OldStyle] [Fourier-BoldItalic-OldStyle] + \definefontsynonym [SerifBlack-OldStyle] [Fourier-Black-OldStyle] + \definefontsynonym [SerifBlackSlanted-OldStyle] [Fourier-BlackSlanted-OldStyle] +\stoptypescript + +\starttypescript [math] [fourier] [name] + \definefontsynonym [MathRoman] [Fourier-Math-Letters] + \definefontsynonym [MathItalic] [Fourier-Math-Letters-Italic] + \definefontsynonym [MathSymbol] [Fourier-Math-Symbols] + \definefontsynonym [MathExtension] [Fourier-Math-Extension] +\stoptypescript + +\starttypescript [math] [fourier] [name] % todo + \definefontsynonym [OldStyle] [Serif-OldStyle] % strange, no oldstyles + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [msbm10] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [eusm10] +\stoptypescript + +% Charter : + +\starttypescript [serif] [charter] [name] + \definefontsynonym [Serif] [Charter-Roman] + \definefontsynonym [SerifItalic] [Charter-Italic] + \definefontsynonym [SerifBold] [Charter-Bold] + \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic] + \definefontsynonym [SerifSlanted] [Charter-Slanted] + \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted] + \definefontsynonym [SerifCaps] [Charter-Roman-Caps] +\stoptypescript + +% Times : + +\starttypescript [serif] [times] [name] + \definefontsynonym [Serif] [Times-Roman] + \definefontsynonym [SerifBold] [Times-Bold] + \definefontsynonym [SerifItalic] [Times-Italic] + \definefontsynonym [SerifSlanted] [Times-Italic] + \definefontsynonym [SerifBoldItalic] [Times-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic] + \definefontsynonym [SerifCaps] [Times-Caps] +\stoptypescript + +\starttypescript [math] [times] [name] + \definefontsynonym [MathRoman] [Times-Roman-Upright] + \definefontsynonym [MathExtension] [Times-Math-Extension] + \definefontsynonym [MathItalic] [Times-Math-Italic] + \definefontsynonym [MathSymbol] [Times-Math-Symbols] + \definefontsynonym [MathAlpha] [Times-Math-SymbolsA] + \definefontsynonym [MathBeta] [Times-Math-SymbolsB] +\stoptypescript + +\starttypescript [math] [times] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [MathBeta] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [eusm10] +\stoptypescript + +% Helvetica : + +\starttypescript [sans] [helvetica] [name] + \definefontsynonym [Sans] [Helvetica] + \definefontsynonym [SansBold] [Helvetica-Bold] + \definefontsynonym [SansItalic] [Helvetica-Oblique] + \definefontsynonym [SansSlanted] [Helvetica-Oblique] + \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique] + \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique] + \definefontsynonym [SansCaps] [Helvetica-Caps] +\stoptypescript + +\starttypescript [math] [helvetica] [name] + \definefontsynonym [MathRoman] [Helvetica-MathRoman] + \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols] + \definefontsynonym [MathItalic] [Helvetica-MathItalics] + \definefontsynonym [MathSymbol] [Helvetica-MathSymbols] +\stoptypescript + +% Courier : + +\starttypescript [mono] [courier] [name] + \definefontsynonym [Mono] [Courier] + \definefontsynonym [MonoBold] [Courier-Bold] + \definefontsynonym [MonoItalic] [Courier-Oblique] + \definefontsynonym [MonoSlanted] [Courier-Oblique] + \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique] + \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique] + \definefontsynonym [MonoCaps] [Courier] +\stoptypescript + +% Palatino : Hermann Zapf / URW + +\starttypescript [serif] [palatino] [name] + \definefontsynonym [Serif] [Palatino] + \definefontsynonym [SerifBold] [Palatino-Bold] + \definefontsynonym [SerifItalic] [Palatino-Italic] + \definefontsynonym [SerifSlanted] [Palatino-Slanted] + \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted] + \definefontsynonym [SerifCaps] [Palatino-Caps] +\stoptypescript + +\starttypescript [math] [palatino] [name] + \definefontsynonym [MathRoman] [Palatino-Roman-Upright] + \definefontsynonym [MathExtension] [Palatino-Math-Extension] + \definefontsynonym [MathItalic] [Palatino-Math-Italic] + \definefontsynonym [MathSymbol] [Palatino-Math-Symbols] + \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA] + \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB] +\stoptypescript + +\starttypescript [math] [palatino] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [MathBeta] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [eusm10] +\stoptypescript + +% bonus definitions / will disappear + +\starttypescript [serif] [palatino] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularOsF] [TeXPalladioL-SC] + \definefontsynonym [SerifItalicOsF] [TeXPalladioL-ItalicOsF] + \definefontsynonym [SerifBoldOsF] [TeXPalladioL-BoldOsF] + \definefontsynonym [SerifBoldItalicOsF][TeXPalladioL-BoldItalicOsF] + \definefontsynonym [SerifCapsOsF] [TeXPalladioL-SC] +\stoptypescript + +% TeXGyre + +% name definitions & prefixes + +\definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella] +\definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes] +\definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros] +\definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum] +\definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola] +\definetypescriptprefix [n:adventor] [TeXGyreAdventor] %definetypescriptprefix [n:adventor] [TeXGyreAdventor] +\definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor] +\definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set + +\starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name] + \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [SerifSlanted] [SerifItalic] + \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic] + \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [SerifCaps] + \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [SerifSlantedCaps] [SerifItalicCaps] + \definefontsynonym [SerifBoldSlantedCaps] [SerifBoldItalicCaps] + \definefontsynonym [SerifCapsCaps] [SerifCaps] +\stoptypescript + +\starttypescript [serif] [chorus,chancery] [name] + \definefontsynonym [SerifMediumItalic] [TeXGyreChorus-MediumItalic] + \definefontsynonym [Serif] [SerifMediumItalic] + \definefontsynonym [SerifItalic] [SerifMediumItalic] + \definefontsynonym [SerifBold] [SerifMediumItalic] + \definefontsynonym [SerifBoldItalic] [SerifMediumItalic] + \definefontsynonym [SerifSlanted] [SerifMediumItalic] + \definefontsynonym [SerifBoldSlanted] [SerifMediumItalic] + \definefontsynonym [SerifCaps] [SerifMediumItalic] +\stoptypescript + +\starttypescript [calligraphy] [chorus,chancery] [name] + \definefontsynonym [Calligraphy] [TeXGyreChorus-MediumItalic] +\stoptypescript + +\starttypescript [sans] [heros,helvetica,adventor] [name] + \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [SansSlanted] [SansItalic] + \definefontsynonym [SansBoldSlanted] [SansBoldItalic] + \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + + \definefontvariant [Sans][osf][Caps] + \definefontvariant [Sans][sc] [Caps] + + \definefontsynonym [SansRegular] [Sans] + \definefontsynonym [SansRegularCaps] [SansCaps] + \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [SansSlantedCaps] [SansItalicCaps] + \definefontsynonym [SansBoldSlantedCaps] [SansBoldItalicCaps] + \definefontsynonym [SansCapsCaps] [SansCaps] +\stoptypescript + +\starttypescript [mono] [cursor,courier] [name] + \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [MonoSlanted] [MonoItalic] + \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] + + \definefontvariant [Mono][osf][Caps] + \definefontvariant [Mono][sc] [Caps] + + \definefontsynonym [MonoRegular] [Mono] + \definefontsynonym [MonoRegularCaps] [MonoCaps] + \definefontsynonym [MonoItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [MonoBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [MonoBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [MonoSlantedCaps] [MonoItalicCaps] + \definefontsynonym [MonoBoldSlantedCaps] [MonoBoldItalicCaps] + \definefontsynonym [MonoCapsCaps] [MonoCaps] +\stoptypescript + +\stoptypescriptcollection + +\endinput diff --git a/tex/context/base/type-tmf.mkiv b/tex/context/base/type-tmf.mkiv new file mode 100644 index 000000000..df7a180f0 --- /dev/null +++ b/tex/context/base/type-tmf.mkiv @@ -0,0 +1,933 @@ +%D \module +%D [ file=type-tmf, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Core \TEX\ Fonts, +%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. + +\starttypescriptcollection[synonyms] + +\starttypescript [serif] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Serif] [LMRoman-Regular] + \definefontsynonym [SerifBold] [LMRoman-Bold] + \definefontsynonym [SerifItalic] [LMRoman-Italic] + \definefontsynonym [SerifSlanted] [LMRoman-Oblique] + \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique] + \definefontsynonym [SerifCaps] [LMRoman-CapsRegular] + \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique] +\stoptypescript + +\starttypescript [sans] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Sans] [LMSans-Regular] + \definefontsynonym [SansBold] [LMSans-Bold] + \definefontsynonym [SansItalic] [LMSans-Oblique] + \definefontsynonym [SansSlanted] [LMSans-Oblique] + \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique] + \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique] + \definefontsynonym [SansCaps] [LMSans-Regular] + \definefontsynonym [SansCapsSlanted] [LMSans-Oblique] +\stoptypescript + +\starttypescript [mono] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Mono] [LMTypewriter-Regular] + \definefontsynonym [MonoBold] [LMTypewriter-Dark] + \definefontsynonym [MonoItalic] [LMTypewriter-Italic] + \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique] + \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique] + \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular] +\stoptypescript + +\starttypescript [math] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [MathRoman] [LMMathRoman-Regular] + %definefontsynonym [MathExtension] [LMMathExtension-Regular] + %definefontsynonym [MathItalic] [LMMathItalic-Italic] + %definefontsynonym [MathSymbol] [LMMathSymbols-Italic] +\stoptypescript + +\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name] + \definefontsynonym [Serif] [LMTypewriterVarWd-Regular] + \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique] + \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique] + \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark] + \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular] + \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique] +\stoptypescript + +\starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name] + \definefontsynonym [Mono] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique] + \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed] +\stoptypescript + +\starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name] + \definefontsynonym [Mono] [LMTypewriter-Light] + \definefontsynonym [MonoBold] [LMTypewriter-Light] + \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique] + \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light] + \definefontsynonym [MonoCaps] [LMTypewriter-Light] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light] +\stoptypescript + +% Later we will map the real fonts, here we just map synonyms. + +\starttypescript [serif] [modern,latin-modern] + \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique] + \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold] + \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic] + \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique] + \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular] + \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique] + \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular] + \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic] + \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern] + \definefontsynonym [LMSans-Regular] [LMSans10-Regular] + \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique] + \definefontsynonym [LMSans-Bold] [LMSans10-Bold] + \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed] + \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique] + \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] + \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular] + \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique] + \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light] + \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique] + \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed] + \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique] + \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark] + \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique] + \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular] + \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic] + \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique] + \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular] + \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique] + \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light] + \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique] + \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark] + \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique] +\stoptypescript + +\starttypescript [serif] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModern] [LMRoman-Regular] + \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic] + \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique] + \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold] + \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic] + \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique] + \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular] + \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique] +\stoptypescript + +\starttypescript [sans] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModernSans] [LMSans-Regular] + \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique] + \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique] + \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold] + \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique] + \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique] + \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular] + \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique] +\stoptypescript + +\starttypescript [mono] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular] + \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic] + \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique] + \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark] + \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % ! + \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique] + \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular] + \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique] + \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular] +\stoptypescript + +\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] + \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular] + \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique] + \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique] + \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark] + \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular] + \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique] +\stoptypescript + +\starttypescript [math] [modern,latin-modern] + \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular] + \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold] + %definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] + %definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic] + %definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] + %definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic] + %definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] +\stoptypescript + +% Antykwa Torunska : + +\starttypescript [serif] [antykwa-torunska] [name] + \definefontsynonym [Serif] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBold] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-light] [name] + \definefontsynonym [Serif] [AntykwaTorunska-Light] + \definefontsynonym [SerifBold] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-cond] [name] + \definefontsynonym [Serif] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-lightcond] [name] + \definefontsynonym [Serif] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light] + \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][lt][Light] + + \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][cond][Cond] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-light] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][dk][Dark] + + \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][cond][Cond] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-cond] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][lt][Light] + + \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][exp][Exp] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-lightcond] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][dk][Dark] + + \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light] + \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][exp][Exp] + +\stoptypescript + +% maybe no -Regular etc + +\starttypescript [math] [antykwa-torunska-light] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light] + %definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic] + %definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light] + %definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [antykwa-torunska] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular] + %definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-Italic] + %definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular] + %definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-cond] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular] + %definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondItalic] + %definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular] + %definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-lightcond] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight] + %definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic] + %definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight] + %definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight] +\stoptypescript + +% Antykwa Poltawskiego : + +\starttypescript [serif] [antykwa-poltawskiego] [name] + \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular] + \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic] + \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic] + \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular] +\stoptypescript + +% Iwona + +\starttypescript [sans] [iwona-light] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Light-Regular] + \definefontsynonym [SansItalic] [Iwona-Light-Italic] + \definefontsynonym [SansBold] [Iwona-Medium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-Medium-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsLight] + \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic] +\stoptypescript + +\starttypescript [sans] [iwona-light-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsLight-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsLight-Italic] + \definefontsynonym [SansBold] [Iwona-CapsMedium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsMedium-Italic] +\stoptypescript + +\starttypescript [sans] [iwona] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Regular] + \definefontsynonym [SansItalic] [Iwona-Italic] + \definefontsynonym [SansBold] [Iwona-Bold] + \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic] + \definefontsynonym [SansCaps] [Iwona-CapsRegular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsBold] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsRegular] + \definefontsynonym [SansItalic] [Iwona-CapsItalic] + \definefontsynonym [SansBold] [Iwona-CapsBold] + \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Medium-Regular] + \definefontsynonym [SansItalic] [Iwona-Medium-Italic] + \definefontsynonym [SansBold] [Iwona-Heavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsMedium-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsMedium-Italic] + \definefontsynonym [SansBold] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-heavy] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Heavy-Regular] + \definefontsynonym [SansItalic] [Iwona-Heavy-Italic] + \definefontsynonym [SansBold] [Iwona-Heavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-heavy-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-light-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondLight-Regular] + \definefontsynonym [SansItalic] [Iwona-CondLight-Italic] + \definefontsynonym [SansBold] [Iwona-CondMedium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CondMedium-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsCondLight-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsCondLight-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsCondMedium-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondMedium-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-light-cond-caps,iwona-light-caps-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsCondLight-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsCondLight-Italic] + \definefontsynonym [SansBold] [Iwona-CapsCondMedium-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsCondMedium-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondRegular] + \definefontsynonym [SansItalic] [Iwona-CondItalic] + \definefontsynonym [SansBold] [Iwona-CondBold] + \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic] + \definefontsynonym [SansCaps] [Iwona-CapsCondRegular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsCondItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsCondBold] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-cond-caps,iwona-caps-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsCondRegular] + \definefontsynonym [SansItalic] [Iwona-CapsCondItalic] + \definefontsynonym [SansBold] [Iwona-CapsCondBold] + \definefontsynonym [SansBoldItalic] [Iwona-CapsCondBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondMedium-Regular] + \definefontsynonym [SansItalic] [Iwona-CondMedium-Italic] + \definefontsynonym [SansBold] [Iwona-CondHeavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CondHeavy-Italic] + \definefontsynonym [SansCaps] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsCondMedium-Italic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondHeavy-Italic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-cond-caps,iwona-medium-caps-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansItalic] [Iwona-CapsCondMedium-Italic] + \definefontsynonym [SansBold] [Iwona-CapsCondHeavy-Regular] + \definefontsynonym [SansBoldItalic] [Iwona-CapsCondHeavy-Italic] +\stoptypescript + +\starttypescript [math] [iwona-light] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light-Regular] + %definefontsynonym [MathItalic] [Iwona-Math-Letters-Light-Italic] + %definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light] + %definefontsynonym [MathExtension] [Iwona-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [iwona] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular] + %definefontsynonym [MathItalic] [Iwona-Math-Letters-Italic] + %definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular] + %definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [iwona-medium] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium-Regular] + %definefontsynonym [MathItalic] [Iwona-Math-Letters-Medium-Italic] + %definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium] + %definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium] +\stoptypescript + +\starttypescript [math] [iwona-heavy] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy-Regular] + %definefontsynonym [MathItalic] [Iwona-Math-Letters-Heavy-Italic] + %definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy] + %definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy] +\stoptypescript + +% Kurier + +\starttypescript [sans] [kurier-light] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Light-Regular] + \definefontsynonym [SansItalic] [Kurier-Light-Italic] + \definefontsynonym [SansBold] [Kurier-Medium-Regular] + \definefontsynonym [SansBoldItalic] [Kurier-Medium-Italic] +\stoptypescript + +\starttypescript [sans] [kurier] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Regular] + \definefontsynonym [SansItalic] [Kurier-Italic] + \definefontsynonym [SansBold] [Kurier-Bold] + \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic] +\stoptypescript + +\starttypescript [sans] [kurier-medium] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Medium-Regular] + \definefontsynonym [SansItalic] [Kurier-Medium-Italic] + \definefontsynonym [SansBold] [Kurier-Heavy-Regular] + \definefontsynonym [SansBoldItalic] [Kurier-Heavy-Italic] +\stoptypescript + +\starttypescript [math] [kurier-light] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light-Regular] + %definefontsynonym [MathItalic] [Kurier-Math-Letters-Light-Italic] + %definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light] + %definefontsynonym [MathExtension] [Kurier-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [kurier] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular] + %definefontsynonym [MathItalic] [Kurier-Math-Letters-Italic] + %definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular] + %definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [kurier-medium] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium-Regular] + %definefontsynonym [MathItalic] [Kurier-Math-Letters-Medium-Italic] + %definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium] + %definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium] +\stoptypescript + +% Bookman : + +\starttypescript [serif] [bookman] [name] + \definefontsynonym [Serif] [Bookman-Light] + \definefontsynonym [SerifItalic] [Bookman-LightItalic] + \definefontsynonym [SerifBold] [Bookman-DemiBold] + \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic] + \definefontsynonym [SerifSlanted] [Bookman-LightSlanted] + \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted] + \definefontsynonym [SerifCaps] [Bookman-Light-Caps] +\stoptypescript + +% Chancery : Zapf + +\starttypescript [calligraphy] [chancery] [name] + \definefontsynonym [Calligraphy] [Chancery] +\stoptypescript + +% Schoolbook : + +\starttypescript [serif] [schoolbook] [name] + \definefontsynonym [Serif] [Schoolbook-Roman] + \definefontsynonym [SerifItalic] [Schoolbook-Italic] + \definefontsynonym [SerifBold] [Schoolbook-Bold] + \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic] + \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted] + \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted] + \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps] +\stoptypescript + +% Utopia : Adobe + +\starttypescript [serif] [utopia] [name] + \definefontsynonym [Serif] [Utopia-Regular] + \definefontsynonym [SerifItalic] [Utopia-Italic] + \definefontsynonym [SerifBold] [Utopia-Bold] + \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic] + \definefontsynonym [SerifSlanted] [Utopia-Slanted] + \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted] + \definefontsynonym [SerifCaps] [Utopia-Regular-Caps] +\stoptypescript + +% Fourier : Michael Bovani + +% \starttypescript [serif] [fourier] [name] +% \definefontsynonym [Serif] [Fourier-Regular] +% \definefontsynonym [SerifSlanted] [Fourier-Slanted] +% \definefontsynonym [SerifItalic] [Fourier-Italic] +% \definefontsynonym [SerifCaps] [Fourier-RegularCaps] +% \definefontsynonym [SerifBold] [Fourier-Bold] +% \definefontsynonym [SerifBoldSlanted] [Fourier-BoldSlanted] +% \definefontsynonym [SerifBoldItalic] [Fourier-BoldItalic] +% \definefontsynonym [SerifBoldCaps] [Fourier-BoldCaps] +% +% \definefontsynonym [Serif-Expert] [Fourier-Regular-Expert] +% \definefontsynonym [SerifSlanted-Expert] [Fourier-Slanted-Expert] +% \definefontsynonym [SerifItalic-Expert] [Fourier-Italic-Expert] +% \definefontsynonym [SerifCaps-Expert] [Fourier-RegularCaps-Expert] +% \definefontsynonym [SerifSemiBold-Expert] [Fourier-Semi-Expert] +% \definefontsynonym [SerifSemiSlanted-Expert] [Fourier-SemiSlanted-Expert] +% \definefontsynonym [SerifSemiItalic-Expert] [Fourier-SemiItalic-Expert] +% \definefontsynonym [SerifSemiCaps-Expert] [Fourier-SemiCaps-Expert] +% \definefontsynonym [SerifBold-Expert] [Fourier-Bold-Expert] +% \definefontsynonym [SerifBoldSlanted-Expert] [Fourier-BoldSlanted-Expert] +% \definefontsynonym [SerifBoldItalic-Expert] [Fourier-BoldItalic-Expert] +% \definefontsynonym [SerifBlack-Expert] [Fourier-Black-Expert] +% +% \definefontsynonym [Serif-OldStyle] [Fourier-Regular-OldStyle] +% \definefontsynonym [SerifSlanted-OldStyle] [Fourier-Slanted-OldStyle] +% \definefontsynonym [SerifItalic-OldStyle] [Fourier-Italic-OldStyle] +% \definefontsynonym [SerifCaps-OldStyle] [Fourier-RegularCaps-OldStyle] +% \definefontsynonym [SerifSemiBold-OldStyle] [Fourier-Semi-OldStyle] +% \definefontsynonym [SerifSemiSlanted-OldStyle] [Fourier-SemiSlanted-OldStyle] +% \definefontsynonym [SerifSemiItalic-OldStyle] [Fourier-SemiItalic-OldStyle] +% \definefontsynonym [SerifSemiCaps-OldStyle] [Fourier-SemiCaps-OldStyle] +% \definefontsynonym [SerifBold-OldStyle] [Fourier-Bold-OldStyle] +% \definefontsynonym [SerifBoldSlanted-OldStyle] [Fourier-BoldSlanted-OldStyle] +% \definefontsynonym [SerifBoldItalic-OldStyle] [Fourier-BoldItalic-OldStyle] +% \definefontsynonym [SerifBlack-OldStyle] [Fourier-Black-OldStyle] +% \definefontsynonym [SerifBlackSlanted-OldStyle] [Fourier-BlackSlanted-OldStyle] +% \stoptypescript +% +% \starttypescript [math] [fourier] [name] +% \definefontsynonym [MathRoman] [Fourier-Math-Letters] +% \definefontsynonym [MathItalic] [Fourier-Math-Letters-Italic] +% \definefontsynonym [MathSymbol] [Fourier-Math-Symbols] +% \definefontsynonym [MathExtension] [Fourier-Math-Extension] +% \stoptypescript +% +% \starttypescript [math] [fourier] [name] % todo +% \definefontsynonym [OldStyle] [Serif-OldStyle] % strange, no oldstyles +% \definefontsynonym [Fraktur] [eufm10] +% \definefontsynonym [Blackboard] [msbm10] +% \definefontsynonym [Gothic] [eufm10] +% \definefontsynonym [Calligraphic] [eusm10] +% \stoptypescript + +% Charter : + +\starttypescript [serif] [charter] [name] + \definefontsynonym [Serif] [Charter-Roman] + \definefontsynonym [SerifItalic] [Charter-Italic] + \definefontsynonym [SerifBold] [Charter-Bold] + \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic] + \definefontsynonym [SerifSlanted] [Charter-Slanted] + \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted] + \definefontsynonym [SerifCaps] [Charter-Roman-Caps] +\stoptypescript + +% Times : + +\starttypescript [serif] [times] [name] + \definefontsynonym [Serif] [Times-Roman] + \definefontsynonym [SerifBold] [Times-Bold] + \definefontsynonym [SerifItalic] [Times-Italic] + \definefontsynonym [SerifSlanted] [Times-Italic] + \definefontsynonym [SerifBoldItalic] [Times-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic] + \definefontsynonym [SerifCaps] [Times-Caps] +\stoptypescript + +% \starttypescript [math] [times] [name] +% \definefontsynonym [MathRoman] [Times-Roman-Upright] +% \definefontsynonym [MathExtension] [Times-Math-Extension] +% \definefontsynonym [MathItalic] [Times-Math-Italic] +% \definefontsynonym [MathSymbol] [Times-Math-Symbols] +% \definefontsynonym [MathAlpha] [Times-Math-SymbolsA] +% \definefontsynonym [MathBeta] [Times-Math-SymbolsB] +% \stoptypescript + +% \starttypescript [math] [times] [name] +% \definefontsynonym [OldStyle] [MathItalic] +% \definefontsynonym [Fraktur] [eufm10] +% \definefontsynonym [Blackboard] [MathBeta] +% \definefontsynonym [Gothic] [eufm10] +% \definefontsynonym [Calligraphic] [eusm10] +% \stoptypescript + +% Helvetica : + +\starttypescript [sans] [helvetica] [name] + \definefontsynonym [Sans] [Helvetica] + \definefontsynonym [SansBold] [Helvetica-Bold] + \definefontsynonym [SansItalic] [Helvetica-Oblique] + \definefontsynonym [SansSlanted] [Helvetica-Oblique] + \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique] + \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique] + \definefontsynonym [SansCaps] [Helvetica-Caps] +\stoptypescript + +\starttypescript [math] [helvetica] [name] + \definefontsynonym [MathRoman] [Helvetica-MathRoman] + \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols] + \definefontsynonym [MathItalic] [Helvetica-MathItalics] + \definefontsynonym [MathSymbol] [Helvetica-MathSymbols] +\stoptypescript + +% Courier : + +\starttypescript [mono] [courier] [name] + \definefontsynonym [Mono] [Courier] + \definefontsynonym [MonoBold] [Courier-Bold] + \definefontsynonym [MonoItalic] [Courier-Oblique] + \definefontsynonym [MonoSlanted] [Courier-Oblique] + \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique] + \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique] + \definefontsynonym [MonoCaps] [Courier] +\stoptypescript + +% Palatino : Hermann Zapf / URW + +\starttypescript [serif] [palatino] [name] + \definefontsynonym [Serif] [Palatino] + \definefontsynonym [SerifBold] [Palatino-Bold] + \definefontsynonym [SerifItalic] [Palatino-Italic] + \definefontsynonym [SerifSlanted] [Palatino-Slanted] + \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted] + \definefontsynonym [SerifCaps] [Palatino-Caps] +\stoptypescript + +% \starttypescript [math] [palatino] [name] +% \definefontsynonym [MathRoman] [Palatino-Roman-Upright] +% \definefontsynonym [MathExtension] [Palatino-Math-Extension] +% \definefontsynonym [MathItalic] [Palatino-Math-Italic] +% \definefontsynonym [MathSymbol] [Palatino-Math-Symbols] +% \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA] +% \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB] +% \stoptypescript + +% \starttypescript [math] [palatino] [name] +% \definefontsynonym [OldStyle] [MathItalic] +% \definefontsynonym [Fraktur] [eufm10] +% \definefontsynonym [Blackboard] [MathBeta] +% \definefontsynonym [Gothic] [eufm10] +% \definefontsynonym [Calligraphic] [eusm10] +% \stoptypescript + +% bonus definitions / will disappear + +\starttypescript [serif] [palatino] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularOsF] [TeXPalladioL-SC] + \definefontsynonym [SerifItalicOsF] [TeXPalladioL-ItalicOsF] + \definefontsynonym [SerifBoldOsF] [TeXPalladioL-BoldOsF] + \definefontsynonym [SerifBoldItalicOsF][TeXPalladioL-BoldItalicOsF] + \definefontsynonym [SerifCapsOsF] [TeXPalladioL-SC] +\stoptypescript + +% TeXGyre + +% name definitions & prefixes + +\definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella] +\definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes] +\definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros] +\definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum] +\definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola] +\definetypescriptprefix [n:adventor] [TeXGyreAdventor] %definetypescriptprefix [n:adventor] [TeXGyreAdventor] +\definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor] +\definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set + +\starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name] + \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [SerifSlanted] [SerifItalic] + \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic] + \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [SerifCaps] + \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [SerifSlantedCaps] [SerifItalicCaps] + \definefontsynonym [SerifBoldSlantedCaps] [SerifBoldItalicCaps] + \definefontsynonym [SerifCapsCaps] [SerifCaps] +\stoptypescript + +\starttypescript [serif] [chorus,chancery] [name] + \definefontsynonym [SerifMediumItalic] [TeXGyreChorus-MediumItalic] + \definefontsynonym [Serif] [SerifMediumItalic] + \definefontsynonym [SerifItalic] [SerifMediumItalic] + \definefontsynonym [SerifBold] [SerifMediumItalic] + \definefontsynonym [SerifBoldItalic] [SerifMediumItalic] + \definefontsynonym [SerifSlanted] [SerifMediumItalic] + \definefontsynonym [SerifBoldSlanted] [SerifMediumItalic] + \definefontsynonym [SerifCaps] [SerifMediumItalic] +\stoptypescript + +\starttypescript [calligraphy] [chorus,chancery] [name] + \definefontsynonym [Calligraphy] [TeXGyreChorus-MediumItalic] +\stoptypescript + +\starttypescript [sans] [heros,helvetica,adventor] [name] + \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [SansSlanted] [SansItalic] + \definefontsynonym [SansBoldSlanted] [SansBoldItalic] + \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + + \definefontvariant [Sans][osf][Caps] + \definefontvariant [Sans][sc] [Caps] + + \definefontsynonym [SansRegular] [Sans] + \definefontsynonym [SansRegularCaps] [SansCaps] + \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [SansSlantedCaps] [SansItalicCaps] + \definefontsynonym [SansBoldSlantedCaps] [SansBoldItalicCaps] + \definefontsynonym [SansCapsCaps] [SansCaps] +\stoptypescript + +\starttypescript [mono] [cursor,courier] [name] + \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [MonoSlanted] [MonoItalic] + \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] + + \definefontvariant [Mono][osf][Caps] + \definefontvariant [Mono][sc] [Caps] + + \definefontsynonym [MonoRegular] [Mono] + \definefontsynonym [MonoRegularCaps] [MonoCaps] + \definefontsynonym [MonoItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [MonoBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [MonoBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [MonoSlantedCaps] [MonoItalicCaps] + \definefontsynonym [MonoBoldSlantedCaps] [MonoBoldItalicCaps] + \definefontsynonym [MonoCapsCaps] [MonoCaps] +\stoptypescript + +\stoptypescriptcollection + +\endinput diff --git a/tex/context/base/type-tmf.tex b/tex/context/base/type-tmf.tex index c2deb8187..78ed89cf9 100644 --- a/tex/context/base/type-tmf.tex +++ b/tex/context/base/type-tmf.tex @@ -11,1163 +11,6 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\starttypescriptcollection[synonyms] - -% Computer Modern Roman : Donald Knuth -% Latin Modern: LM Font Revision Team - -% LM math vs CM math (analysis by Taco): -% -% lmex10.tfm % identical -% lmmi5.tfm % identical -% lmmi6.tfm % identical -% lmmi7.tfm % identical -% lmmi8.tfm % identical -% lmmi9.tfm % identical -% lmmi10.tfm % identical -% lmmi12.tfm % identical -% lmmib10.tfm % identical -% lmsy5.tfm % extra chars: 254,255 (octal) -% lmsy6.tfm % extra chars: 254,255 (octal) -% lmsy7.tfm % extra chars: 254,255 (octal) -% lmsy8.tfm % extra chars: 254,255 (octal) -% lmsy9.tfm % extra chars: 254,255 (octal) -% lmsy10.tfm % extra chars: 254,255 (octal) -% lmbsy10.tfm % extra chars: 254,255 (octal) -% -% From the 'AMS' set: -% -% lmmib5.tfm % identical -% lmmib7.tfm % identical -% lmbsy5.tfm % extra chars: 254,255 (octal) -% lmbsy7.tfm % extra chars: 254,255 (octal) -% -% The two extra characters are: -% -% /lessorequalslant -% /greaterorequalslant - -\starttypescript [serif] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [Serif] [LMRoman-Regular] - \definefontsynonym [SerifBold] [LMRoman-Bold] - \definefontsynonym [SerifItalic] [LMRoman-Italic] - \definefontsynonym [SerifSlanted] [LMRoman-Oblique] - \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique] - \definefontsynonym [SerifCaps] [LMRoman-CapsRegular] - \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique] -\stoptypescript - -\starttypescript [sans] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [Sans] [LMSans-Regular] - \definefontsynonym [SansBold] [LMSans-Bold] - \definefontsynonym [SansItalic] [LMSans-Oblique] - \definefontsynonym [SansSlanted] [LMSans-Oblique] - \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique] - \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique] - \definefontsynonym [SansCaps] [LMSans-Regular] - \definefontsynonym [SansCapsSlanted] [LMSans-Oblique] -\stoptypescript - -\starttypescript [mono] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [Mono] [LMTypewriter-Regular] - \definefontsynonym [MonoBold] [LMTypewriter-Dark] - \definefontsynonym [MonoItalic] [LMTypewriter-Italic] - \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique] - \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique] - \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique] - \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular] - \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique] - \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular] -\stoptypescript - -\starttypescript [math] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [MathRoman] [LMMathRoman-Regular] - \definefontsynonym [MathExtension] [LMMathExtension-Regular] - \definefontsynonym [MathItalic] [LMMathItalic-Italic] - \definefontsynonym [MathSymbol] [LMMathSymbols-Italic] -\stoptypescript - -% maybe we can by now just use: (to be tested first) - -\starttypescript [math] [modern,computer-modern,latin-modern] [name] - \definefontsynonym[xcmr12][rm-lmr12] - \definefontsynonym[xcmr10][rm-lmr10] - \definefontsynonym[xcmr9] [rm-lmr9] - \definefontsynonym[xcmr8] [rm-lmr8] - \definefontsynonym[xcmr7] [rm-lmr7] - \definefontsynonym[xcmr6] [rm-lmr6] - \definefontsynonym[xcmr5] [rm-lmr5] -\stoptypescript - -\starttypescript [boldmath] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [MathRoman] [LMMathRoman-Bold] - \definefontsynonym [MathExtension] [LMMathExtension-Regular] - \definefontsynonym [MathItalic] [LMMathItalic-BoldItalic] - \definefontsynonym [MathSymbol] [LMMathSymbols-BoldItalic] -\stoptypescript - -\starttypescript [bfmath] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [MathRomanBold] [LMMathRoman-Bold] - \definefontsynonym [MathExtension] [LMMathExtension-Regular] - \definefontsynonym [MathItalicBold] [LMMathItalic-BoldItalic] - \definefontsynonym [MathSymbolBold] [LMMathSymbols-BoldItalic] -\stoptypescript - -\starttypescript [math,boldmath,bfmath] [modern,computer-modern,latin-modern] [name] - \usemathcollection[default] -\stoptypescript - -\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name] - \definefontsynonym [Serif] [LMTypewriterVarWd-Regular] - \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique] - \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique] - \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark] - \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular] - \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique] -\stoptypescript - -\starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name] - \definefontsynonym [Mono] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique] - \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique] - \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed] - \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed] -\stoptypescript - -\starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name] - \definefontsynonym [Mono] [LMTypewriter-Light] - \definefontsynonym [MonoBold] [LMTypewriter-Light] - \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique] - \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique] - \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light] - \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light] - \definefontsynonym [MonoCaps] [LMTypewriter-Light] - \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light] -\stoptypescript - -% Later we will map the real fonts, here we just map synonyms. - -\starttypescript [serif] [modern,latin-modern] - \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique] - \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold] - \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic] - \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique] - \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular] - \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique] - \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular] - \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic] - \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique] -\stoptypescript - -\starttypescript [sans] [modern,latin-modern] - \definefontsynonym [LMSans-Regular] [LMSans10-Regular] - \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique] - \definefontsynonym [LMSans-Bold] [LMSans10-Bold] - \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed] - \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique] - \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique] -\stoptypescript - -\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] - \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular] - \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique] - \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light] - \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique] - \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed] - \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique] - \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark] - \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique] - \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular] - \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic] - \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique] - \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular] - \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique] - \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light] - \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique] - \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark] - \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique] -\stoptypescript - -\starttypescript [serif] [modern,computer-modern,latin-modern] - \definefontsynonym [ComputerModern] [LMRoman-Regular] - \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic] - \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique] - \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold] - \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic] - \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique] - \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular] - \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique] -\stoptypescript - -\starttypescript [sans] [modern,computer-modern,latin-modern] - \definefontsynonym [ComputerModernSans] [LMSans-Regular] - \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique] - \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique] - \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold] - \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique] - \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique] - \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular] - \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique] -\stoptypescript - -\starttypescript [mono] [modern,computer-modern,latin-modern] - \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular] - \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic] - \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique] - \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark] - \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % ! - \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique] - \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular] - \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique] - \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular] -\stoptypescript - -\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] - \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular] - \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique] - \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique] - \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark] - \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique] - \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular] - \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique] -\stoptypescript - -\starttypescript [math] [modern,latin-modern] - \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular] - \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold] - \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] - \definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic] - \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] - \definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic] - \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] -\stoptypescript - -% can boldmath and bfmath be joined? -\starttypescript [boldmath] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold] - \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] - \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] - \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] -\stoptypescript - -\starttypescript [bfmath] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold] - \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] - \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] - \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] -\stoptypescript - -\starttypescript [serif] [modern,latin-modern,computer-modern] - \definefontsynonym [cmr5] [LMRoman5-Regular] - \definefontsynonym [cmr6] [LMRoman6-Regular] - \definefontsynonym [cmr7] [LMRoman7-Regular] - \definefontsynonym [cmr8] [LMRoman8-Regular] - \definefontsynonym [cmr9] [LMRoman9-Regular] - \definefontsynonym [cmr10] [LMRoman10-Regular] - \definefontsynonym [cmr12] [LMRoman12-Regular] - \definefontsynonym [cmr17] [LMRoman17-Regular] - \definefontsynonym [cmbx5] [LMRoman5-Bold] - \definefontsynonym [cmbx6] [LMRoman6-Bold] - \definefontsynonym [cmbx7] [LMRoman7-Bold] - \definefontsynonym [cmbx8] [LMRoman8-Bold] - \definefontsynonym [cmbx9] [LMRoman9-Bold] - \definefontsynonym [cmbx10] [LMRoman10-Bold] - \definefontsynonym [cmbx12] [LMRoman12-Bold] - \definefontsynonym [cmsl10] [LMRoman10-Oblique] - \definefontsynonym [cmsl12] [LMRoman12-Oblique] - \definefontsynonym [cmsl17] [LMRoman17-Oblique] - \definefontsynonym [cmsl8] [LMRoman8-Oblique] - \definefontsynonym [cmsl9] [LMRoman9-Oblique] - \definefontsynonym [cmti7] [LMRoman7-Italic] - \definefontsynonym [cmti8] [LMRoman8-Italic] - \definefontsynonym [cmti9] [LMRoman9-Italic] - \definefontsynonym [cmti10] [LMRoman10-Italic] - \definefontsynonym [cmti12] [LMRoman12-Italic] - \definefontsynonym [cmbsl10] [LMRoman10-DemiOblique] - \definefontsynonym [cmbxsl10] [LMRoman10-BoldOblique] - \definefontsynonym [cmbxti10] [LMRoman10-BoldItalic] - \definefontsynonym [cmcsc10] [LMRoman10-CapsRegular] - \definefontsynonym [cmcscsl10][LMRoman10-CapsOblique] - - %definefontsynonym [cmb10] -\stoptypescript - -\starttypescript [sans] [modern,latin-modern,computer-modern] - \definefontsynonym [cmss8] [LMSans8-Regular] - \definefontsynonym [cmss9] [LMSans9-Regular] - \definefontsynonym [cmss10] [LMSans10-Regular] - \definefontsynonym [cmss12] [LMSans12-Regular] - \definefontsynonym [cmss17] [LMSans17-Regular] - \definefontsynonym [cmssi10] [LMSans10-Oblique] - \definefontsynonym [cmssi12] [LMSans12-Oblique] - \definefontsynonym [cmssi17] [LMSans17-Oblique] - \definefontsynonym [cmssi8] [LMSans8-Oblique] - \definefontsynonym [cmssi9] [LMSans9-Oblique] - \definefontsynonym [cmssq8] [LMSansQuotation8-Regular] - \definefontsynonym [cmssqb8] [LMSansQuotation8-Bold] - \definefontsynonym [cmssqbi8] [LMSansQuotation8-BoldOblique] - \definefontsynonym [cmssqi8] [LMSansQuotation8-Oblique] - \definefontsynonym [cmssbx10] [LMSans10-Bold] - \definefontsynonym [cmssdc10] [LMSans10-DemiCondensed] - \definefontsynonym [cmssbi10] [LMSans10-BoldOblique] - \definefontsynonym [cmssdi10] [LMSans10-DemiCondensedOblique] -\stoptypescript - -\starttypescript [mono] [modern,latin-modern,computer-modern] - \definefontsynonym [cmtt8] [LMTypewriter8-Regular] - \definefontsynonym [cmtt9] [LMTypewriter9-Regular] - \definefontsynonym [cmtt10] [LMTypewriter10-Regular] - \definefontsynonym [cmtt12] [LMTypewriter12-Regular] - \definefontsynonym [cmitt10] [LMTypewriter10-Italic] - \definefontsynonym [cmsltt10] [LMTypewriter10-Oblique] - \definefontsynonym [cmvtt10] [LMTypewriterVarWd10-Regular] - \definefontsynonym [cmvtti10] [LMTypewriterVarWd10-Oblique] - \definefontsynonym [cmtcsc10] [LMTypewriter10-CapsRegular] -\stoptypescript - -\starttypescript [math] [modern,latin-modern,computer-modern] - \definefontsynonym [cmbsy5] [LMMathSymbols5-BoldItalic] - \definefontsynonym [cmbsy7] [LMMathSymbols7-BoldItalic] - \definefontsynonym [cmbsy10] [LMMathSymbols10-BoldItalic] - \definefontsynonym [cmsy5] [LMMathSymbols5-Italic] - \definefontsynonym [cmsy6] [LMMathSymbols6-Italic] - \definefontsynonym [cmsy7] [LMMathSymbols7-Italic] - \definefontsynonym [cmsy8] [LMMathSymbols8-Italic] - \definefontsynonym [cmsy9] [LMMathSymbols9-Italic] - \definefontsynonym [cmsy10] [LMMathSymbols10-Italic] - \definefontsynonym [cmex10] [LMMathExtension10-Regular] - \definefontsynonym [cmmi5] [LMMathItalic5-Italic] - \definefontsynonym [cmmi6] [LMMathItalic6-Italic] - \definefontsynonym [cmmi7] [LMMathItalic7-Italic] - \definefontsynonym [cmmi8] [LMMathItalic8-Italic] - \definefontsynonym [cmmi9] [LMMathItalic9-Italic] - \definefontsynonym [cmmi10] [LMMathItalic10-Italic] - \definefontsynonym [cmmi12] [LMMathItalic12-Italic] - \definefontsynonym [cmmib5] [LMMathItalic5-BoldItalic] - \definefontsynonym [cmmib7] [LMMathItalic7-BoldItalic] - \definefontsynonym [cmmib10] [LMMathItalic10-BoldItalic] -\stoptypescript - -% This will change some day. - -\starttypescript [math] [modern,computer-modern,latin-modern] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [msbm10] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [cmsy10] -\stoptypescript - -% Concrete Modern Roman : Donald Knuth - -\starttypescript [serif] [concrete] [name] - \definefontsynonym [Serif] [ComputerConcrete] - \definefontsynonym [SerifBold] [ComputerConcrete] - \definefontsynonym [SerifItalic] [ComputerConcrete-Italic] - \definefontsynonym [SerifSlanted] [ComputerConcrete-Slanted] - \definefontsynonym [SerifBoldItalic] [ComputerConcrete-Italic] - \definefontsynonym [SerifBoldSlanted] [ComputerConcrete-Slanted] - \definefontsynonym [SerifCaps] [ComputerConcrete-Caps] -\stoptypescript - -% Euler : Hermann Zapf - -\starttypescript [math] [euler] [name] - \definefontsynonym [MathRoman] [Euler-Roman] % mr - \definefontsynonym [MathItalic] [Euler-Fraktur] % mi - \definefontsynonym [MathExtension] [Euler-Extension] % ex - \definefontsynonym [MathSymbol] [Euler-Symbol] % sy -\stoptypescript - -\starttypescript [boldmath] [euler] [name] - \definefontsynonym [MathRoman] [Euler-Roman-Bold] % mr - \definefontsynonym [MathItalic] [Euler-Fraktur-Bold] % mi - \definefontsynonym [MathExtension] [Euler-Extension] % ex - \definefontsynonym [MathSymbol] [Euler-Symbol-Bold] % sy -\stoptypescript - -\starttypescript [bfmath] [euler] [name] - \definefontsynonym [MathRomanBold] [Euler-Roman-Bold] % mr - \definefontsynonym [MathItalicBold] [Euler-Fraktur-Bold] % mi - \definefontsynonym [MathExtension] [Euler-Extension] % ex - \definefontsynonym [MathSymbolBold] [Euler-Symbol-Bold] % sy -\stoptypescript - -\starttypescript [math] [euler] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [MathItalic] - \definefontsynonym [Gothic] [MathItalic] - \definefontsynonym [Calligraphic] [MathSymbol] -\stoptypescript - -\starttypescript [boldmath] [euler] [name] - \definefontsynonym [OldStyle] [MathItalicBold] - \definefontsynonym [Fraktur] [MathItalicBold] - \definefontsynonym [Gothic] [MathItalicBold] - \definefontsynonym [Calligraphic] [MathSymbolBold] -\stoptypescript - -\starttypescript [math,boldmath,bfmath] [euler] [name] - \usemathcollection[eul] -\stoptypescript - -% American Math Society : Michael Spivak - -\starttypescript [math] [modern,computer-modern,latin-modern,ams] [name] - \definefontsynonym [MathAlpha] [AMS-SymbolA] - \definefontsynonym [MathBeta] [AMS-SymbolB] -\stoptypescript - -% Antykwa Torunska : - -\starttypescript [serif] [antykwa-torunska] [name] - \definefontsynonym [Serif] [AntykwaTorunska-Regular] - \definefontsynonym [SerifBold] [AntykwaTorunska-Bold] - \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-light] [name] - \definefontsynonym [Serif] [AntykwaTorunska-Light] - \definefontsynonym [SerifBold] [AntykwaTorunska-Medium] - \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-cond] [name] - \definefontsynonym [Serif] [AntykwaTorunska-CondRegular] - \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold] - \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-lightcond] [name] - \definefontsynonym [Serif] [AntykwaTorunska-CondLight] - \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium] - \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap] -\stoptypescript - -\starttypescript [serif] [antykwa-torunska] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light] - \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium] - \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap] - - \definefontvariant [Serif][lt][Light] - - \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular] - \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold] - \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap] - - \definefontvariant [Serif][cond][Cond] - -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-light] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular] - \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold] - \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic] - \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic] - \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap] - - \definefontvariant [Serif][dk][Dark] - - \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight] - \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium] - \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap] - - \definefontvariant [Serif][cond][Cond] - -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-cond] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight] - \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium] - \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic] - \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic] - \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap] - - \definefontvariant [Serif][lt][Light] - - \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular] - \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold] - \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic] - \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic] - \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic] - \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap] - - \definefontvariant [Serif][exp][Exp] - -\stoptypescript - -\starttypescript [serif] [antykwa-torunska-lightcond] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap] - \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap] - \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap] - \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap] - \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap] - \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap] - \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular] - \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold] - \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic] - \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic] - \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap] - - \definefontvariant [Serif][dk][Dark] - - \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light] - \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium] - \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic] - \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic] - \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap] - - \definefontvariant [Serif][exp][Exp] - -\stoptypescript - -% maybe no -Regular etc - -\starttypescript [math] [antykwa-torunska-light] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light] -\stoptypescript - -\starttypescript [math] [antykwa-torunska] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-Italic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-cond] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondItalic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular] -\stoptypescript - -\starttypescript [math] [antykwa-torunska-lightcond] [name] - \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight] - \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic] - \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight] - \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight] -\stoptypescript - -% Antykwa Poltawskiego : - -\starttypescript [serif] [antykwa-poltawskiego] [name] - \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular] - \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold] - \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic] - \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic] - \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold] - \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold] - \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular] -\stoptypescript - -% Iwona - -\starttypescript [sans] [iwona-light] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Light-Regular] - \definefontsynonym [SansItalic] [Iwona-Light-Italic] - \definefontsynonym [SansBold] [Iwona-Medium-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-Medium-Italic] - \definefontsynonym [SansCaps] [Iwona-CapsLight] - \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic] -\stoptypescript - -\starttypescript [sans] [iwona-light-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsLight-Regular] - \definefontsynonym [SansItalic] [Iwona-CapsLight-Italic] - \definefontsynonym [SansBold] [Iwona-CapsMedium-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-CapsMedium-Italic] -\stoptypescript - -\starttypescript [sans] [iwona] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Regular] - \definefontsynonym [SansItalic] [Iwona-Italic] - \definefontsynonym [SansBold] [Iwona-Bold] - \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic] - \definefontsynonym [SansCaps] [Iwona-CapsRegular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsBold] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsRegular] - \definefontsynonym [SansItalic] [Iwona-CapsItalic] - \definefontsynonym [SansBold] [Iwona-CapsBold] - \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-medium] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Medium-Regular] - \definefontsynonym [SansItalic] [Iwona-Medium-Italic] - \definefontsynonym [SansBold] [Iwona-Heavy-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic] - \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsMedium-Italic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] -\stoptypescript - -\starttypescript [sans] [iwona-medium-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansItalic] [Iwona-CapsMedium-Italic] - \definefontsynonym [SansBold] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavy-Italic] -\stoptypescript - -\starttypescript [sans] [iwona-heavy] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-Heavy-Regular] - \definefontsynonym [SansItalic] [Iwona-Heavy-Italic] - \definefontsynonym [SansBold] [Iwona-Heavy-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic] - \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] -\stoptypescript - -\starttypescript [sans] [iwona-heavy-caps] [name] - \setups[font:fallback:sans] - \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic] -\stoptypescript - -\starttypescript [sans] [iwona-light-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondLight-Regular] - \definefontsynonym [SansItalic] [Iwona-CondLight-Italic] - \definefontsynonym [SansBold] [Iwona-CondMedium-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-CondMedium-Italic] - \definefontsynonym [SansCaps] [Iwona-CapsCondLight-Regular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsCondLight-Italic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsCondMedium-Regular] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondMedium-Italic] -\stoptypescript - -\starttypescript [sans] [iwona-light-cond-caps,iwona-light-caps-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsCondLight-Regular] - \definefontsynonym [SansItalic] [Iwona-CapsCondLight-Italic] - \definefontsynonym [SansBold] [Iwona-CapsCondMedium-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-CapsCondMedium-Italic] -\stoptypescript - -\starttypescript [sans] [iwona-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondRegular] - \definefontsynonym [SansItalic] [Iwona-CondItalic] - \definefontsynonym [SansBold] [Iwona-CondBold] - \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic] - \definefontsynonym [SansCaps] [Iwona-CapsCondRegular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsCondItalic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsCondBold] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-cond-caps,iwona-caps-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsCondRegular] - \definefontsynonym [SansItalic] [Iwona-CapsCondItalic] - \definefontsynonym [SansBold] [Iwona-CapsCondBold] - \definefontsynonym [SansBoldItalic] [Iwona-CapsCondBoldItalic] -\stoptypescript - -\starttypescript [sans] [iwona-medium-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CondMedium-Regular] - \definefontsynonym [SansItalic] [Iwona-CondMedium-Italic] - \definefontsynonym [SansBold] [Iwona-CondHeavy-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-CondHeavy-Italic] - \definefontsynonym [SansCaps] [Iwona-CapsCondHeavy-Regular] - \definefontsynonym [SansItalicCaps] [Iwona-CapsCondMedium-Italic] - \definefontsynonym [SansBoldCaps] [Iwona-CapsCondHeavy-Regular] - \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondHeavy-Italic] -\stoptypescript - -\starttypescript [sans] [iwona-medium-cond-caps,iwona-medium-caps-cond] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Iwona-CapsCondHeavy-Regular] - \definefontsynonym [SansItalic] [Iwona-CapsCondMedium-Italic] - \definefontsynonym [SansBold] [Iwona-CapsCondHeavy-Regular] - \definefontsynonym [SansBoldItalic] [Iwona-CapsCondHeavy-Italic] -\stoptypescript - -\starttypescript [math] [iwona-light] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light-Regular] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-Light-Italic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Light] -\stoptypescript - -\starttypescript [math] [iwona] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-Italic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular] -\stoptypescript - -\starttypescript [math] [iwona-medium] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium-Regular] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-Medium-Italic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium] -\stoptypescript - -\starttypescript [math] [iwona-heavy] [name] - \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy-Regular] - \definefontsynonym [MathItalic] [Iwona-Math-Letters-Heavy-Italic] - \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy] - \definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy] -\stoptypescript - -% Kurier - -\starttypescript [sans] [kurier-light] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Kurier-Light-Regular] - \definefontsynonym [SansItalic] [Kurier-Light-Italic] - \definefontsynonym [SansBold] [Kurier-Medium-Regular] - \definefontsynonym [SansBoldItalic] [Kurier-Medium-Italic] -\stoptypescript - -\starttypescript [sans] [kurier] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Kurier-Regular] - \definefontsynonym [SansItalic] [Kurier-Italic] - \definefontsynonym [SansBold] [Kurier-Bold] - \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic] -\stoptypescript - -\starttypescript [sans] [kurier-medium] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [Kurier-Medium-Regular] - \definefontsynonym [SansItalic] [Kurier-Medium-Italic] - \definefontsynonym [SansBold] [Kurier-Heavy-Regular] - \definefontsynonym [SansBoldItalic] [Kurier-Heavy-Italic] -\stoptypescript - -\starttypescript [math] [kurier-light] [name] - \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light-Regular] - \definefontsynonym [MathItalic] [Kurier-Math-Letters-Light-Italic] - \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light] - \definefontsynonym [MathExtension] [Kurier-Math-Extension-Light] -\stoptypescript - -\starttypescript [math] [kurier] [name] - \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular] - \definefontsynonym [MathItalic] [Kurier-Math-Letters-Italic] - \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular] - \definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular] -\stoptypescript - -\starttypescript [math] [kurier-medium] [name] - \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium-Regular] - \definefontsynonym [MathItalic] [Kurier-Math-Letters-Medium-Italic] - \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium] - \definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium] -\stoptypescript - -% Bookman : - -\starttypescript [serif] [bookman] [name] - \definefontsynonym [Serif] [Bookman-Light] - \definefontsynonym [SerifItalic] [Bookman-LightItalic] - \definefontsynonym [SerifBold] [Bookman-DemiBold] - \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic] - \definefontsynonym [SerifSlanted] [Bookman-LightSlanted] - \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted] - \definefontsynonym [SerifCaps] [Bookman-Light-Caps] -\stoptypescript - -% Chancery : Zapf - -\starttypescript [calligraphy] [chancery] [name] - \definefontsynonym [Calligraphy] [Chancery] -\stoptypescript - -% Schoolbook : - -\starttypescript [serif] [schoolbook] [name] - \definefontsynonym [Serif] [Schoolbook-Roman] - \definefontsynonym [SerifItalic] [Schoolbook-Italic] - \definefontsynonym [SerifBold] [Schoolbook-Bold] - \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic] - \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted] - \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted] - \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps] -\stoptypescript - -% Utopia : Adobe - -\starttypescript [serif] [utopia] [name] - \definefontsynonym [Serif] [Utopia-Regular] - \definefontsynonym [SerifItalic] [Utopia-Italic] - \definefontsynonym [SerifBold] [Utopia-Bold] - \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic] - \definefontsynonym [SerifSlanted] [Utopia-Slanted] - \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted] - \definefontsynonym [SerifCaps] [Utopia-Regular-Caps] -\stoptypescript - -% Fourier : Michael Bovani - -\starttypescript [serif] [fourier] [name] - \definefontsynonym [Serif] [Fourier-Regular] - \definefontsynonym [SerifSlanted] [Fourier-Slanted] - \definefontsynonym [SerifItalic] [Fourier-Italic] - \definefontsynonym [SerifCaps] [Fourier-RegularCaps] - \definefontsynonym [SerifBold] [Fourier-Bold] - \definefontsynonym [SerifBoldSlanted] [Fourier-BoldSlanted] - \definefontsynonym [SerifBoldItalic] [Fourier-BoldItalic] - \definefontsynonym [SerifBoldCaps] [Fourier-BoldCaps] - - \definefontsynonym [Serif-Expert] [Fourier-Regular-Expert] - \definefontsynonym [SerifSlanted-Expert] [Fourier-Slanted-Expert] - \definefontsynonym [SerifItalic-Expert] [Fourier-Italic-Expert] - \definefontsynonym [SerifCaps-Expert] [Fourier-RegularCaps-Expert] - \definefontsynonym [SerifSemiBold-Expert] [Fourier-Semi-Expert] - \definefontsynonym [SerifSemiSlanted-Expert] [Fourier-SemiSlanted-Expert] - \definefontsynonym [SerifSemiItalic-Expert] [Fourier-SemiItalic-Expert] - \definefontsynonym [SerifSemiCaps-Expert] [Fourier-SemiCaps-Expert] - \definefontsynonym [SerifBold-Expert] [Fourier-Bold-Expert] - \definefontsynonym [SerifBoldSlanted-Expert] [Fourier-BoldSlanted-Expert] - \definefontsynonym [SerifBoldItalic-Expert] [Fourier-BoldItalic-Expert] - \definefontsynonym [SerifBlack-Expert] [Fourier-Black-Expert] - - \definefontsynonym [Serif-OldStyle] [Fourier-Regular-OldStyle] - \definefontsynonym [SerifSlanted-OldStyle] [Fourier-Slanted-OldStyle] - \definefontsynonym [SerifItalic-OldStyle] [Fourier-Italic-OldStyle] - \definefontsynonym [SerifCaps-OldStyle] [Fourier-RegularCaps-OldStyle] - \definefontsynonym [SerifSemiBold-OldStyle] [Fourier-Semi-OldStyle] - \definefontsynonym [SerifSemiSlanted-OldStyle] [Fourier-SemiSlanted-OldStyle] - \definefontsynonym [SerifSemiItalic-OldStyle] [Fourier-SemiItalic-OldStyle] - \definefontsynonym [SerifSemiCaps-OldStyle] [Fourier-SemiCaps-OldStyle] - \definefontsynonym [SerifBold-OldStyle] [Fourier-Bold-OldStyle] - \definefontsynonym [SerifBoldSlanted-OldStyle] [Fourier-BoldSlanted-OldStyle] - \definefontsynonym [SerifBoldItalic-OldStyle] [Fourier-BoldItalic-OldStyle] - \definefontsynonym [SerifBlack-OldStyle] [Fourier-Black-OldStyle] - \definefontsynonym [SerifBlackSlanted-OldStyle] [Fourier-BlackSlanted-OldStyle] -\stoptypescript - -\starttypescript [math] [fourier] [name] - \definefontsynonym [MathRoman] [Fourier-Math-Letters] - \definefontsynonym [MathItalic] [Fourier-Math-Letters-Italic] - \definefontsynonym [MathSymbol] [Fourier-Math-Symbols] - \definefontsynonym [MathExtension] [Fourier-Math-Extension] -\stoptypescript - -\starttypescript [math] [fourier] [name] % todo - \definefontsynonym [OldStyle] [Serif-OldStyle] % strange, no oldstyles - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [msbm10] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [eusm10] -\stoptypescript - -% Charter : - -\starttypescript [serif] [charter] [name] - \definefontsynonym [Serif] [Charter-Roman] - \definefontsynonym [SerifItalic] [Charter-Italic] - \definefontsynonym [SerifBold] [Charter-Bold] - \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic] - \definefontsynonym [SerifSlanted] [Charter-Slanted] - \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted] - \definefontsynonym [SerifCaps] [Charter-Roman-Caps] -\stoptypescript - -% Times : - -\starttypescript [serif] [times] [name] - \definefontsynonym [Serif] [Times-Roman] - \definefontsynonym [SerifBold] [Times-Bold] - \definefontsynonym [SerifItalic] [Times-Italic] - \definefontsynonym [SerifSlanted] [Times-Italic] - \definefontsynonym [SerifBoldItalic] [Times-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic] - \definefontsynonym [SerifCaps] [Times-Caps] -\stoptypescript - -\starttypescript [math] [times] [name] - \definefontsynonym [MathRoman] [Times-Roman-Upright] - \definefontsynonym [MathExtension] [Times-Math-Extension] - \definefontsynonym [MathItalic] [Times-Math-Italic] - \definefontsynonym [MathSymbol] [Times-Math-Symbols] - \definefontsynonym [MathAlpha] [Times-Math-SymbolsA] - \definefontsynonym [MathBeta] [Times-Math-SymbolsB] -\stoptypescript - -\starttypescript [math] [times] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [MathBeta] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [eusm10] -\stoptypescript - -% Helvetica : - -\starttypescript [sans] [helvetica] [name] - \definefontsynonym [Sans] [Helvetica] - \definefontsynonym [SansBold] [Helvetica-Bold] - \definefontsynonym [SansItalic] [Helvetica-Oblique] - \definefontsynonym [SansSlanted] [Helvetica-Oblique] - \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique] - \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique] - \definefontsynonym [SansCaps] [Helvetica-Caps] -\stoptypescript - -\starttypescript [math] [helvetica] [name] - \definefontsynonym [MathRoman] [Helvetica-MathRoman] - \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols] - \definefontsynonym [MathItalic] [Helvetica-MathItalics] - \definefontsynonym [MathSymbol] [Helvetica-MathSymbols] -\stoptypescript - -% Courier : - -\starttypescript [mono] [courier] [name] - \definefontsynonym [Mono] [Courier] - \definefontsynonym [MonoBold] [Courier-Bold] - \definefontsynonym [MonoItalic] [Courier-Oblique] - \definefontsynonym [MonoSlanted] [Courier-Oblique] - \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique] - \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique] - \definefontsynonym [MonoCaps] [Courier] -\stoptypescript - -% Palatino : Hermann Zapf / URW - -\starttypescript [serif] [palatino] [name] - \definefontsynonym [Serif] [Palatino] - \definefontsynonym [SerifBold] [Palatino-Bold] - \definefontsynonym [SerifItalic] [Palatino-Italic] - \definefontsynonym [SerifSlanted] [Palatino-Slanted] - \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted] - \definefontsynonym [SerifCaps] [Palatino-Caps] -\stoptypescript - -\starttypescript [math] [palatino] [name] - \definefontsynonym [MathRoman] [Palatino-Roman-Upright] - \definefontsynonym [MathExtension] [Palatino-Math-Extension] - \definefontsynonym [MathItalic] [Palatino-Math-Italic] - \definefontsynonym [MathSymbol] [Palatino-Math-Symbols] - \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA] - \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB] -\stoptypescript - -\starttypescript [math] [palatino] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [MathBeta] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [eusm10] -\stoptypescript - -% bonus definitions / will disappear - -\starttypescript [serif] [palatino] [name] - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularOsF] [TeXPalladioL-SC] - \definefontsynonym [SerifItalicOsF] [TeXPalladioL-ItalicOsF] - \definefontsynonym [SerifBoldOsF] [TeXPalladioL-BoldOsF] - \definefontsynonym [SerifBoldItalicOsF][TeXPalladioL-BoldItalicOsF] - \definefontsynonym [SerifCapsOsF] [TeXPalladioL-SC] -\stoptypescript - -% TeXGyre - -% name definitions & prefixes - -\definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella] -\definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes] -\definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros] -\definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum] -\definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola] -\definetypescriptprefix [n:adventor] [TeXGyreAdventor] %definetypescriptprefix [n:adventor] [TeXGyreAdventor] -\definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor] -\definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set - -\starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name] - \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] - \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] - \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] - \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] - \definefontsynonym [SerifSlanted] [SerifItalic] - \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic] - \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegular] [Serif] - \definefontsynonym [SerifRegularCaps] [SerifCaps] - \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] - \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] - \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] - \definefontsynonym [SerifSlantedCaps] [SerifItalicCaps] - \definefontsynonym [SerifBoldSlantedCaps] [SerifBoldItalicCaps] - \definefontsynonym [SerifCapsCaps] [SerifCaps] -\stoptypescript - -\starttypescript [serif] [chorus,chancery] [name] - \definefontsynonym [SerifMediumItalic] [TeXGyreChorus-MediumItalic] - \definefontsynonym [Serif] [SerifMediumItalic] - \definefontsynonym [SerifItalic] [SerifMediumItalic] - \definefontsynonym [SerifBold] [SerifMediumItalic] - \definefontsynonym [SerifBoldItalic] [SerifMediumItalic] - \definefontsynonym [SerifSlanted] [SerifMediumItalic] - \definefontsynonym [SerifBoldSlanted] [SerifMediumItalic] - \definefontsynonym [SerifCaps] [SerifMediumItalic] -\stoptypescript - -\starttypescript [calligraphy] [chorus,chancery] [name] - \definefontsynonym [Calligraphy] [TeXGyreChorus-MediumItalic] -\stoptypescript - -\starttypescript [sans] [heros,helvetica,adventor] [name] - \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] - \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] - \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] - \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] - \definefontsynonym [SansSlanted] [SansItalic] - \definefontsynonym [SansBoldSlanted] [SansBoldItalic] - \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - - \definefontvariant [Sans][osf][Caps] - \definefontvariant [Sans][sc] [Caps] - - \definefontsynonym [SansRegular] [Sans] - \definefontsynonym [SansRegularCaps] [SansCaps] - \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] - \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] - \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] - \definefontsynonym [SansSlantedCaps] [SansItalicCaps] - \definefontsynonym [SansBoldSlantedCaps] [SansBoldItalicCaps] - \definefontsynonym [SansCapsCaps] [SansCaps] -\stoptypescript - -\starttypescript [mono] [cursor,courier] [name] - \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] - \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic] - \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold] - \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] - \definefontsynonym [MonoSlanted] [MonoItalic] - \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] - - \definefontvariant [Mono][osf][Caps] - \definefontvariant [Mono][sc] [Caps] - - \definefontsynonym [MonoRegular] [Mono] - \definefontsynonym [MonoRegularCaps] [MonoCaps] - \definefontsynonym [MonoItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] - \definefontsynonym [MonoBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] - \definefontsynonym [MonoBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] - \definefontsynonym [MonoSlantedCaps] [MonoItalicCaps] - \definefontsynonym [MonoBoldSlantedCaps] [MonoBoldItalicCaps] - \definefontsynonym [MonoCapsCaps] [MonoCaps] -\stoptypescript - -\stoptypescriptcollection +\loadmarkfile{type-tmf} \endinput diff --git a/tex/context/base/typo-krn.lua b/tex/context/base/typo-krn.lua index 598db6c27..ea416477f 100644 --- a/tex/context/base/typo-krn.lua +++ b/tex/context/base/typo-krn.lua @@ -13,7 +13,7 @@ local utfchar = utf.char local has_attribute = node.has_attribute local unset_attribute = node.unset_attribute -local slide_node_list = node.slide +local find_node_tail = node.tail or node.slide local free_node = node.free local copy_node = node.copy local insert_node_before = node.insert_before @@ -66,7 +66,7 @@ local function process(namespace,attribute,head,force) local c = start.components if c then local s = start - local tail = slide_node_list(c) + local tail = find_node_tail(c) if s.prev then s.prev.next = c c.prev = s.prev @@ -128,7 +128,7 @@ local function process(namespace,attribute,head,force) end if post then -- must pair with start local after = copy_node(disc.next) - local tail = slide_node_list(post) + local tail = find_node_tail(post) tail.next = after after.prev = tail after.next = nil @@ -140,7 +140,7 @@ local function process(namespace,attribute,head,force) if replace then -- must pair with start and start.prev local before = copy_node(disc.prev) local after = copy_node(disc.next) - local tail = slide_node_list(replace) + local tail = find_node_tail(replace) replace.prev = before before.next = replace before.prev = nil diff --git a/tex/context/base/typo-mir.lua b/tex/context/base/typo-mir.lua index fb575d093..f2cbbb4fa 100644 --- a/tex/context/base/typo-mir.lua +++ b/tex/context/base/typo-mir.lua @@ -172,7 +172,7 @@ function mirror.process(namespace,attribute,start) -- todo: make faster local attr = has_attribute(current,attribute) if attr and attr > 0 then unset_attribute(current,attribute) -- slow, needed? - --~ set_attribute(current,attribute,0) -- might be faster +--~ set_attribute(current,attribute,0) -- might be faster if attr == 1 then -- bidi parsing mode elseif attr ~= prevattr then @@ -319,8 +319,8 @@ function mirror.process(namespace,attribute,start) -- todo: make faster local subtype = current.subtype if subtype == 6 then local dir = current.dir - local d = dir:sub(2,2) - if dir:find(".R.") then + local d = dir:sub(2,2) -- -- -- -- -- why is this not used + if dir:find(".R.") then -- -- d == "R" or just dir == "TRT" autodir = -1 else autodir = 1 diff --git a/tex/context/base/unic-000.tex b/tex/context/base/unic-000.mkii index cb4c1fe8a..cb4c1fe8a 100644 --- a/tex/context/base/unic-000.tex +++ b/tex/context/base/unic-000.mkii diff --git a/tex/context/base/unic-001.tex b/tex/context/base/unic-001.mkii index e37de9136..e37de9136 100644 --- a/tex/context/base/unic-001.tex +++ b/tex/context/base/unic-001.mkii diff --git a/tex/context/base/unic-002.tex b/tex/context/base/unic-002.mkii index ae7deb12a..ae7deb12a 100644 --- a/tex/context/base/unic-002.tex +++ b/tex/context/base/unic-002.mkii diff --git a/tex/context/base/unic-003.tex b/tex/context/base/unic-003.mkii index d37563d26..d37563d26 100644 --- a/tex/context/base/unic-003.tex +++ b/tex/context/base/unic-003.mkii diff --git a/tex/context/base/unic-004.tex b/tex/context/base/unic-004.mkii index b6e210193..b6e210193 100644 --- a/tex/context/base/unic-004.tex +++ b/tex/context/base/unic-004.mkii diff --git a/tex/context/base/unic-005.tex b/tex/context/base/unic-005.mkii index d15b74dbe..d15b74dbe 100644 --- a/tex/context/base/unic-005.tex +++ b/tex/context/base/unic-005.mkii diff --git a/tex/context/base/unic-030.tex b/tex/context/base/unic-030.mkii index ef42c807a..ef42c807a 100644 --- a/tex/context/base/unic-030.tex +++ b/tex/context/base/unic-030.mkii diff --git a/tex/context/base/unic-031.tex b/tex/context/base/unic-031.mkii index ae6bc1b8e..ae6bc1b8e 100644 --- a/tex/context/base/unic-031.tex +++ b/tex/context/base/unic-031.mkii diff --git a/tex/context/base/unic-032.tex b/tex/context/base/unic-032.mkii index 32c25e4e2..32c25e4e2 100644 --- a/tex/context/base/unic-032.tex +++ b/tex/context/base/unic-032.mkii diff --git a/tex/context/base/unic-033.tex b/tex/context/base/unic-033.mkii index 91311a029..91311a029 100644 --- a/tex/context/base/unic-033.tex +++ b/tex/context/base/unic-033.mkii diff --git a/tex/context/base/unic-034.tex b/tex/context/base/unic-034.mkii index fece26bff..fece26bff 100644 --- a/tex/context/base/unic-034.tex +++ b/tex/context/base/unic-034.mkii diff --git a/tex/context/base/unic-035.tex b/tex/context/base/unic-035.mkii index 272799512..272799512 100644 --- a/tex/context/base/unic-035.tex +++ b/tex/context/base/unic-035.mkii diff --git a/tex/context/base/unic-037.tex b/tex/context/base/unic-037.mkii index 87f655a68..87f655a68 100644 --- a/tex/context/base/unic-037.tex +++ b/tex/context/base/unic-037.mkii diff --git a/tex/context/base/unic-039.tex b/tex/context/base/unic-039.mkii index bcf649090..bcf649090 100644 --- a/tex/context/base/unic-039.tex +++ b/tex/context/base/unic-039.mkii diff --git a/tex/context/base/unic-251.tex b/tex/context/base/unic-251.mkii index 150ade456..150ade456 100644 --- a/tex/context/base/unic-251.tex +++ b/tex/context/base/unic-251.mkii diff --git a/tex/context/base/unic-cjk.tex b/tex/context/base/unic-cjk.mkii index 786546318..786546318 100644 --- a/tex/context/base/unic-cjk.tex +++ b/tex/context/base/unic-cjk.mkii diff --git a/tex/context/base/unic-exp.tex b/tex/context/base/unic-exp.mkii index 027aedab8..027aedab8 100644 --- a/tex/context/base/unic-exp.tex +++ b/tex/context/base/unic-exp.mkii diff --git a/tex/context/base/unic-ini.mkii b/tex/context/base/unic-ini.mkii index 0e4d9d391..f386494f2 100644 --- a/tex/context/base/unic-ini.mkii +++ b/tex/context/base/unic-ini.mkii @@ -533,7 +533,7 @@ \def\douseunicodevector#1% {\ifundefined{\@@univector#1}% % \readsysfile{\f!unicprefix\threedigits{#1}} - \readsysfile{\f!unicprefix\doifnumberelse{#1}{\threedigits{#1}}{#1}} + \readsysfile{\f!unicprefix\doifnumberelse{#1}{\threedigits{#1}}{#1}.mkii} {\writestatus{unicode}{loading vector #1}} {\writestatus{unicode}{unknown vector #1}}% \fi} @@ -761,8 +761,8 @@ %D Goodies: -\fetchruntimecommand \showunicodevector {\f!unicprefix\s!run} -\fetchruntimecommand \showunicodetable {\f!unicprefix\s!run} +\fetchruntimecommand \showunicodevector {\f!unicprefix\s!run.mkii} +\fetchruntimecommand \showunicodetable {\f!unicprefix\s!run.mkii} %D Well, let's at least preload a few familiar ones. Here we %D also load the \UTF\ regime. diff --git a/tex/context/base/unic-run.tex b/tex/context/base/unic-run.mkii index b8e154fd4..b8e154fd4 100644 --- a/tex/context/base/unic-run.tex +++ b/tex/context/base/unic-run.mkii diff --git a/tex/context/base/verb-c.tex b/tex/context/base/verb-c.mkii index 1ecb0afc2..1ecb0afc2 100644 --- a/tex/context/base/verb-c.tex +++ b/tex/context/base/verb-c.mkii diff --git a/tex/context/base/verb-eif.tex b/tex/context/base/verb-eif.mkii index 5904abc6e..5904abc6e 100644 --- a/tex/context/base/verb-eif.tex +++ b/tex/context/base/verb-eif.mkii diff --git a/tex/context/base/verb-ini.tex b/tex/context/base/verb-ini.mkii index 4726d0eac..4726d0eac 100644 --- a/tex/context/base/verb-ini.tex +++ b/tex/context/base/verb-ini.mkii diff --git a/tex/context/base/verb-js.tex b/tex/context/base/verb-js.mkii index 3d1b69f8b..3d1b69f8b 100644 --- a/tex/context/base/verb-js.tex +++ b/tex/context/base/verb-js.mkii diff --git a/tex/context/base/verb-jv.tex b/tex/context/base/verb-jv.mkii index 197b37ee7..197b37ee7 100644 --- a/tex/context/base/verb-jv.tex +++ b/tex/context/base/verb-jv.mkii diff --git a/tex/context/base/verb-mp.tex b/tex/context/base/verb-mp.mkii index 7affaf0c4..7affaf0c4 100644 --- a/tex/context/base/verb-mp.tex +++ b/tex/context/base/verb-mp.mkii diff --git a/tex/context/base/verb-pas.tex b/tex/context/base/verb-pas.mkii index 0c9850abf..0c9850abf 100644 --- a/tex/context/base/verb-pas.tex +++ b/tex/context/base/verb-pas.mkii diff --git a/tex/context/base/verb-pl.tex b/tex/context/base/verb-pl.mkii index 47ce9a54f..47ce9a54f 100644 --- a/tex/context/base/verb-pl.tex +++ b/tex/context/base/verb-pl.mkii diff --git a/tex/context/base/verb-raw.tex b/tex/context/base/verb-raw.mkii index 32903db77..32903db77 100644 --- a/tex/context/base/verb-raw.tex +++ b/tex/context/base/verb-raw.mkii diff --git a/tex/context/base/verb-sql.tex b/tex/context/base/verb-sql.mkii index a00841d73..a00841d73 100644 --- a/tex/context/base/verb-sql.tex +++ b/tex/context/base/verb-sql.mkii diff --git a/tex/context/base/verb-tex.tex b/tex/context/base/verb-tex.mkii index 75e99fcef..75e99fcef 100644 --- a/tex/context/base/verb-tex.tex +++ b/tex/context/base/verb-tex.mkii diff --git a/tex/context/base/verb-xml.tex b/tex/context/base/verb-xml.mkii index dbf6635f6..dbf6635f6 100644 --- a/tex/context/base/verb-xml.tex +++ b/tex/context/base/verb-xml.mkii diff --git a/tex/context/base/xetx-chr.tex b/tex/context/base/xetx-chr.mkii index 31f15a0cb..31f15a0cb 100644 --- a/tex/context/base/xetx-chr.tex +++ b/tex/context/base/xetx-chr.mkii diff --git a/tex/context/base/xetx-cls.tex b/tex/context/base/xetx-cls.mkii index 6ce696f71..6ce696f71 100644 --- a/tex/context/base/xetx-cls.tex +++ b/tex/context/base/xetx-cls.mkii diff --git a/tex/context/base/xetx-ini.tex b/tex/context/base/xetx-ini.mkii index db3cccabd..db3cccabd 100644 --- a/tex/context/base/xetx-ini.tex +++ b/tex/context/base/xetx-ini.mkii diff --git a/tex/context/base/xetx-utf.tex b/tex/context/base/xetx-utf.mkii index 79bd00745..79bd00745 100644 --- a/tex/context/base/xetx-utf.tex +++ b/tex/context/base/xetx-utf.mkii diff --git a/tex/context/base/xtag-exp.tex b/tex/context/base/xtag-exp.tex index 72e956199..337b49348 100644 --- a/tex/context/base/xtag-exp.tex +++ b/tex/context/base/xtag-exp.tex @@ -37,12 +37,19 @@ \fi \decrement \XMLfilenesting \relax} -\def\enableXMLfiledata - {\prependtoks \enableXMLelements \to \mainoutput % brrr, will change - \appendtoks \startXMLreading \to \everybeforeutilityread - \appendtoks \stopXMLreading \to \everyafterutilityread - \appendtoks \forcefileexpansiontrue \to \everyenableXML - \let\enableXMLfiledata\relax} +\ifnum\texengine=\luatexengine + \def\enableXMLfiledata + {\prependtoks \enableXMLelements \to \mainoutput % brrr, will change + \appendtoks \forcefileexpansiontrue \to \everyenableXML + \let\enableXMLfiledata\relax} +\else + \def\enableXMLfiledata + {\prependtoks \enableXMLelements \to \mainoutput % brrr, will change + \appendtoks \startXMLreading \to \everybeforeutilityread + \appendtoks \stopXMLreading \to \everyafterutilityread + \appendtoks \forcefileexpansiontrue \to \everyenableXML + \let\enableXMLfiledata\relax} +\fi \setupXMLprocessing[\c!state=\v!start] @@ -52,26 +59,30 @@ %D Here we overload the mark handler. -\def\XMLexpanded#1% - {\bgroup - \honorunexpanded - \dontexpandencoding - \xdef\@@globalexpanded{\noexpand#1}% why \noexpand? - \egroup - \@@globalexpanded} - -\let\normalsetnormalmark\setnormalmark - -\long\def\setnormalmark#1% overloaded - {\ifprocessingXML - \expandafter\setXMLexpandedmark - \else - \expandafter\normalsetnormalmark - \fi#1} - -\def\setXMLexpandedmark#1#2% using a tok prevents unwanted expansion in mark - {\XMLexpanded{\scratchtoks{\enableXMLelements#2}}% - \setxvalue{\@@crk\string#1}{\the\scratchtoks}% - \normalmarks#1{\the\scratchtoks}} +\ifnum\texengine=\luatexengine \else + + \def\XMLexpanded#1% + {\bgroup + \honorunexpanded + \dontexpandencoding + \xdef\@@globalexpanded{\noexpand#1}% why \noexpand? + \egroup + \@@globalexpanded} + + \let\normalsetnormalmark\setnormalmark + + \long\def\setnormalmark#1% overloaded + {\ifprocessingXML + \expandafter\setXMLexpandedmark + \else + \expandafter\normalsetnormalmark + \fi#1} + + \def\setXMLexpandedmark#1#2% using a tok prevents unwanted expansion in mark + {\XMLexpanded{\scratchtoks{\enableXMLelements#2}}% + \setxvalue{\@@crk\string#1}{\the\scratchtoks}% + \normalmarks#1{\the\scratchtoks}} + +\fi \protect \endinput diff --git a/tex/context/base/xtag-ext.tex b/tex/context/base/xtag-ext.tex index 1a9e3e058..9a132c677 100644 --- a/tex/context/base/xtag-ext.tex +++ b/tex/context/base/xtag-ext.tex @@ -382,6 +382,8 @@ % \processXMLfilegrouped{test.xml} % \stoptext +% obsolete in mkiv + \chardef\xmlexpandmode\plusone \def\defexpandedxmlargumentcmd {\chardef\xmlexpandmode\plusone\defexpandedxmlargument\defconvertedcommand} @@ -392,7 +394,7 @@ \installexpander {xml} \defexpandedxmlargumentcmd \gdefexpandedxmlargumentcmd \installexpander {xml:cmd} \defexpandedxmlargumentcmd \gdefexpandedxmlargumentcmd \installexpander {xml:utf} \defexpandedxmlargumentutf \gdefexpandedxmlargumentutf - + \def\XMLtexmath#1{\begingroup\setnormalcatcodes\scantokens{\mathematics{#1}\ignorespaces}\endgroup} % \defineXMLargument[tm]{\XMLtexmath} @@ -403,4 +405,35 @@ % % \processXMLbuffer[test] +%D Undocumented ... + +\def\defineXMLstore {\doquadrupleargument\dodefineXMLstore[\saveXMLasdata]} +\def\defineXMLgstore{\doquadrupleargument\dodefineXMLstore[\gsaveXMLasdata]} + +\def\dodefineXMLstore[#1][#2][#3][#4]% element attribute prefix % will become faster + {\defineXMLargument[#2][#3=\s!dummy]{#1{#4:\XMLop{#3}}}} + +\def\countXMLchildren[#1]#2% + {\startnointerference + \doglobal\newcounter\nofXMLchildren + \defineXMLargument[#1]{\doglobal\increment\nofXMLchildren}% + \startXMLignore + #2% + \stopXMLignore + \stopnointerference} + +% Typical \MKII. We will not explore this route any further as in \MKIV\ we +% have better ways. + +\prependtoks \setnormalcatcodes \to \everyTEXinputmode +\appendtoks \processingXMLfalse \to \everyTEXinputmode + +\let\normalenableXML\enableXML % some day we move the normal \enableXML into the toks + +\prependtoks \normalenableXML \to \everyXMLinputmode +\appendtoks \processingXMLtrue \to \everyXMLinputmode + +\unexpanded\def\enableXML {\setinputmode[XML]} % \enableXML is used in edef's and marks +\unexpanded\def\disableXML{\setinputmode[TEX]} + \protect \endinput diff --git a/tex/context/base/xtag-hyp.tex b/tex/context/base/xtag-hyp.tex index 573b546c7..e4e048e2b 100644 --- a/tex/context/base/xtag-hyp.tex +++ b/tex/context/base/xtag-hyp.tex @@ -16,13 +16,21 @@ %D This filter is kind of obsolete, since \UTF\ is not %D limited to \XML. So, here we only enable \UTF\ support. -\defineXMLenvironment [hyphenations] [language=\currentlanguage,regime=utf,encoding=\defaultencoding] - {\startnointerference - \defineXMLargument [hyphenation] \hyphenation - \language[\XMLop{language}]% - \enableregime[\XMLop{regime}]% - \enableencoding[\XMLop{encoding}]} - {\stopnointerference} +\ifnum\texengine=\luatexengine + \defineXMLenvironment [hyphenations] [language=\currentlanguage,regime=utf,encoding=\defaultencoding] + {\startnointerference + \defineXMLargument [hyphenation] \hyphenation + \language[\XMLop{language}]} + {\stopnointerference} +\else + \defineXMLenvironment [hyphenations] [language=\currentlanguage,regime=utf,encoding=\defaultencoding] + {\startnointerference + \defineXMLargument [hyphenation] \hyphenation + \language[\XMLop{language}]% + \enableregime[\XMLop{regime}]% + \enableencoding[\XMLop{encoding}]} + {\stopnointerference} +\fi \defineXMLsingular [hyphenate] {\-} diff --git a/tex/context/base/xtag-ini.tex b/tex/context/base/xtag-ini.tex index 495f4ea07..e48ef3da6 100644 --- a/tex/context/base/xtag-ini.tex +++ b/tex/context/base/xtag-ini.tex @@ -1275,9 +1275,14 @@ \def\simpleXMLencoding{raw} -\def\simplifyXMLentities - {\fastenableencoding\simpleXMLencoding - \XMLsimpleentitiestrue} +\ifnum\texengine=\luatexengine + \def\simplifyXMLentities + {\XMLsimpleentitiestrue} +\else + \def\simplifyXMLentities + {\fastenableencoding\simpleXMLencoding + \XMLsimpleentitiestrue} +\fi \def\defineXMLentity {\dodoubleempty\dodefineXMLentity} @@ -2181,7 +2186,7 @@ %D Interesting what kind of things are needed \unknown \appendtoks - \disablelanguagespecifics + \ifdefined\disablelanguagespecifics\disablelanguagespecifics\fi \to \everyenableXML \long\def\longempty{} diff --git a/tex/context/base/xtag-pre.tex b/tex/context/base/xtag-pre.tex index 3f1d4dca0..94a213d94 100644 --- a/tex/context/base/xtag-pre.tex +++ b/tex/context/base/xtag-pre.tex @@ -37,8 +37,13 @@ %D We can use the default handler to implement automatic %D element hiding. Beware: this overloads the tracer. -\def\startXMLignore{\dododefineXMLignore \s!default} -\def\stopXMLignore {\dododefineXMLprocess\s!default} +% \def\startXMLignore{\dododefineXMLignore \s!default} +% \def\stopXMLignore {\dododefineXMLprocess\s!default} + +\newcount\xmlignoredepth + +\def\startXMLignore{\ifcase\xmlignoredepth\dododefineXMLignore\s!default\fi\advance\xmlignoredepth\plusone} +\def\stopXMLignore {\advance\xmlignoredepth\minusone\ifcase\xmlignoredepth\dododefineXMLprocess\s!default\fi} %D The following entities need to be defined anyway. They %D may be overloaded later. diff --git a/tex/context/bib/bibl-ams.tex b/tex/context/bib/bibl-ams.tex index ddfe927c3..77008a66b 100644 --- a/tex/context/bib/bibl-ams.tex +++ b/tex/context/bib/bibl-ams.tex @@ -282,30 +282,30 @@ } \setuppublicationlayout[incollection]{% - \insertartauthors{}{}{\insertthekey{}{, }{}}% -% \insertarttitle{\bgroup }{\egroup. }{}% - \inserttitle - {, in % - \bgroup\it}% - {\egroup - \inserteditors{, edited by }% - {}% - {} - \insertseries - {\insertvolume{, number }{~in }{ }}% - {}% - {}% - \insertchap{\unskip, }{ }{ }% - \insertpubyear{(% - \insertpublisher{}%{, }%{}% - }{)\insertEdition{, }{ ed. }{}}{}% - \insertpages{\unskip, p.~}{. }{\unskip. }% - }% - {In \insertcrossref{}{}{}% - \insertchap{\unskip, }{ }{ }% - \insertpages{\unskip, p.~}{. }{\unskip. }% - }% - \insertNote{ }{.}{}% + \insertartauthors{}{}{\insertthekey{}{, }{}}% + \insertarttitle{, \bgroup }{\egroup}{}% + \inserttitle + {, in % + \bgroup\it}% + {\egroup + \inserteditors{, edited by }% + {}% + {} + \insertseries + {\insertvolume{, number }{~in }{ }}% + {}% + {}% + \insertchap{\unskip, }{ }{ }% + \insertpubyear{(% + \insertpublisher{}%{, }%{}% + }{)\insertEdition{, }{ ed. }{}}{}% + \insertpages{\unskip, p.~}{. }{\unskip. }% + }% + {In \insertcrossref{}{}{}% + \insertchap{\unskip, }{ }{ }% + \insertpages{\unskip, p.~}{. }{\unskip. }% + }% + \insertNote{ }{.}{}% } \setuppublicationlayout[inproceedings]{% diff --git a/tex/context/bib/t-bib.mkiv b/tex/context/bib/t-bib.mkiv index 4316d380e..9a01bc7cd 100644 --- a/tex/context/bib/t-bib.mkiv +++ b/tex/context/bib/t-bib.mkiv @@ -18,8 +18,6 @@ bibtexhacks = { } \stopluacode -\unprotect - % HACK WILL GO: \def\namedlistparameter#1#2{\csname\dolistparameter{\??li#1}#2\endcsname} diff --git a/tex/context/bib/t-bib.tex b/tex/context/bib/t-bib.tex index 35a3de6ca..05b2d0b3e 100644 --- a/tex/context/bib/t-bib.tex +++ b/tex/context/bib/t-bib.tex @@ -1,6 +1,6 @@ %D \module %D [ file=t-bib, -%D version=2009.04.27, +%D version=2009.06.08, %D title=\CONTEXT\ Publication Module, %D subtitle=Publications, %D author=Taco Hoekwater, @@ -133,6 +133,8 @@ %D \item Added a patch to \type{t-bib.mkiv} from Hans to make the %D cross referencing between multiple citations an %D bibliographies work (27/04/2009) +%D \item Remove a superfluous \type{\unprotect} in t-bib.mkiv (11/05/2009). +%D \item Patch of incollection in bibl-ams.tex from Xan (08/06/2009). %D \stopitemize %D %D \subject{WISHLIST} diff --git a/tex/context/interface/cont-cs.xml b/tex/context/interface/cont-cs.xml index 15700ee08..a94af8caf 100644 --- a/tex/context/interface/cont-cs.xml +++ b/tex/context/interface/cont-cs.xml @@ -5356,6 +5356,9 @@ <cd:constant type="ano"/> <cd:constant type="ne"/> </cd:parameter> + <cd:parameter name="volba"> + <cd:constant type="zhustene"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-de.xml b/tex/context/interface/cont-de.xml index ace1fb315..b70518625 100644 --- a/tex/context/interface/cont-de.xml +++ b/tex/context/interface/cont-de.xml @@ -5356,6 +5356,9 @@ <cd:constant type="ja"/> <cd:constant type="nein"/> </cd:parameter> + <cd:parameter name="option"> + <cd:constant type="gepackt"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-en.xml b/tex/context/interface/cont-en.xml index 6e3ac4db7..354bdab81 100644 --- a/tex/context/interface/cont-en.xml +++ b/tex/context/interface/cont-en.xml @@ -5356,6 +5356,9 @@ <cd:constant type="yes"/> <cd:constant type="no"/> </cd:parameter> + <cd:parameter name="option"> + <cd:constant type="packed"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-fr.xml b/tex/context/interface/cont-fr.xml index bd14281c9..bdec329eb 100644 --- a/tex/context/interface/cont-fr.xml +++ b/tex/context/interface/cont-fr.xml @@ -5356,6 +5356,9 @@ <cd:constant type="oui"/> <cd:constant type="non"/> </cd:parameter> + <cd:parameter name="option"> + <cd:constant type="groupe"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-it.xml b/tex/context/interface/cont-it.xml index 47ec1ffdd..e0f77e265 100644 --- a/tex/context/interface/cont-it.xml +++ b/tex/context/interface/cont-it.xml @@ -5356,6 +5356,9 @@ <cd:constant type="si"/> <cd:constant type="no"/> </cd:parameter> + <cd:parameter name="opzione"> + <cd:constant type="impaccato"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-nl.xml b/tex/context/interface/cont-nl.xml index df538ad8f..d6a236795 100644 --- a/tex/context/interface/cont-nl.xml +++ b/tex/context/interface/cont-nl.xml @@ -5356,6 +5356,9 @@ <cd:constant type="ja"/> <cd:constant type="nee"/> </cd:parameter> + <cd:parameter name="optie"> + <cd:constant type="opelkaar"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-pe.xml b/tex/context/interface/cont-pe.xml index df7d55387..c2e43dc32 100644 --- a/tex/context/interface/cont-pe.xml +++ b/tex/context/interface/cont-pe.xml @@ -5356,6 +5356,9 @@ <cd:constant type="بله"/> <cd:constant type="نه"/> </cd:parameter> + <cd:parameter name="گزینه"> + <cd:constant type="Ùشرده"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-ro.xml b/tex/context/interface/cont-ro.xml index 726c3f272..61dd00f59 100644 --- a/tex/context/interface/cont-ro.xml +++ b/tex/context/interface/cont-ro.xml @@ -5356,6 +5356,9 @@ <cd:constant type="da"/> <cd:constant type="nu"/> </cd:parameter> + <cd:parameter name="optiune"> + <cd:constant type="impachetat"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/keys-cs.xml b/tex/context/interface/keys-cs.xml index 40d1aa60d..352245d6b 100644 --- a/tex/context/interface/keys-cs.xml +++ b/tex/context/interface/keys-cs.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='poslednistrana'/> <cd:variable name='lastpagenumber' value='lastpagenumber'/> <cd:variable name='lastsubpage' value='poslaednipodstranka'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='vlevo'/> <cd:variable name='leftedge' value='levahrana'/> <cd:variable name='lefthanging' value='lefthanging'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='cislooddilu'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml index 7bada6e26..521a731c6 100644 --- a/tex/context/interface/keys-de.xml +++ b/tex/context/interface/keys-de.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='letzteseite'/> <cd:variable name='lastpagenumber' value='lastpagenumber'/> <cd:variable name='lastsubpage' value='letzteunterseite'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='links'/> <cd:variable name='leftedge' value='linkekante'/> <cd:variable name='lefthanging' value='lefthanging'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='abschnittsnummer'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml index 18a56ac76..2b7c68915 100644 --- a/tex/context/interface/keys-en.xml +++ b/tex/context/interface/keys-en.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='lastpage'/> <cd:variable name='lastpagenumber' value='lastpagenumber'/> <cd:variable name='lastsubpage' value='lastsubpage'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='left'/> <cd:variable name='leftedge' value='leftedge'/> <cd:variable name='lefthanging' value='lefthanging'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='sectionnumber'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml index aaba0e4cb..d03d72a88 100644 --- a/tex/context/interface/keys-fr.xml +++ b/tex/context/interface/keys-fr.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='dernierepage'/> <cd:variable name='lastpagenumber' value='derniernumeropage'/> <cd:variable name='lastsubpage' value='dernieresouspage'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='gauche'/> <cd:variable name='leftedge' value='bordgauche'/> <cd:variable name='lefthanging' value='lefthanging'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='numerosection'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml index 5f3ef93e4..b2c01b916 100644 --- a/tex/context/interface/keys-it.xml +++ b/tex/context/interface/keys-it.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='ultimapagina'/> <cd:variable name='lastpagenumber' value='lastpagenumber'/> <cd:variable name='lastsubpage' value='ultimasottopagina'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='sinistra'/> <cd:variable name='leftedge' value='bordosinistro'/> <cd:variable name='lefthanging' value='lefthanging'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='numerosezione'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml index 52e98c157..9bb953e9b 100644 --- a/tex/context/interface/keys-nl.xml +++ b/tex/context/interface/keys-nl.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='laatstepagina'/> <cd:variable name='lastpagenumber' value='laatstepaginanummer'/> <cd:variable name='lastsubpage' value='laatstesubpagina'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='links'/> <cd:variable name='leftedge' value='linkerrand'/> <cd:variable name='lefthanging' value='linkshangend'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='sectienummer'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/interface/keys-pe.xml b/tex/context/interface/keys-pe.xml index b0771b5b0..0086e5d13 100644 --- a/tex/context/interface/keys-pe.xml +++ b/tex/context/interface/keys-pe.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='صÙØه‌آخر'/> <cd:variable name='lastpagenumber' value='شماه‌صÙØه‌آخر'/> <cd:variable name='lastsubpage' value='زیرصÙØه‌آخر'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='Ú†Ù¾'/> <cd:variable name='leftedge' value='لبه‌چپ'/> <cd:variable name='lefthanging' value='آویزان‌چپ'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='شماره‌بخش'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml index bc55773b4..964c8a714 100644 --- a/tex/context/interface/keys-ro.xml +++ b/tex/context/interface/keys-ro.xml @@ -236,6 +236,7 @@ <cd:variable name='lastpage' value='ultimapagina'/> <cd:variable name='lastpagenumber' value='lastpagenumber'/> <cd:variable name='lastsubpage' value='ultimasubpagina'/> + <cd:variable name='layer' value='layer'/> <cd:variable name='left' value='stanga'/> <cd:variable name='leftedge' value='bordurastanga'/> <cd:variable name='lefthanging' value='lefthanging'/> @@ -849,6 +850,7 @@ <cd:constant name='sectionconversion' value='sectionconversion'/> <cd:constant name='sectionconversionset' value='sectionconversionset'/> <cd:constant name='sectionnumber' value='numarsectiune'/> + <cd:constant name='sectionresetset' value='sectionresetset'/> <cd:constant name='sectionsegments' value='sectionsegments'/> <cd:constant name='sectionseparatorset' value='sectionseparatorset'/> <cd:constant name='sectionset' value='sectionset'/> diff --git a/tex/context/sample/demo-cld.cld b/tex/context/sample/demo-cld.cld new file mode 100644 index 000000000..7e470da62 --- /dev/null +++ b/tex/context/sample/demo-cld.cld @@ -0,0 +1,74 @@ +-- context.enabletrackers {"tud.trace"} + +context.setuplayout( { + width = "middle", + height = "middle", +}) + +context.showframe() + +context.starttext() + +context.chapter({ "someref" }, "Hello There") + +context.readfile("tufte","","not found") + +context.startitemize({ "packed" }) + for i=1,10 do + context.startitem() + context("this is item %i",i) + context.stopitem() + end +context.stopitemize() + +context.startchapter({ title = "test" }, { more = "oeps" }) + + context["in"]("chapter",{ "someref" }) + + context.startlinecorrection( { "blank" }) + context.bTABLE() + for i=1,10 do + context.bTR() + for i=1,20 do + context.bTD({ align= "middle", style = "type" }) + context("%#2i",math.random(99)) + context.eTD() + end + context.eTR() + end + context.eTABLE() + context.stoplinecorrection() + + context.mathematics("x^{2 \\times 4}") + + context.placefigure("caption", function() + context.externalfigure( { "cow.pdf" } ) + end) + + context.placefigure("caption", function() + context.bTABLE() + context.bTR() + context.bTD() + context.externalfigure( { "cow.pdf" }, { width = "3cm", height = "3cm" } ) + context.eTD() + context.bTD({ align = "{lohi,middle}" } ) + context("and") + context.eTD() + context.bTD() + context.externalfigure( { "cow.pdf" }, { width = "4cm", height = "3cm" } ) + context.eTD() + context.eTR() + context.eTABLE() + end) + +context.stopchapter() + +context.chapter("Speed Test 1") + +for i=1,50 do + context.readfile("tufte","","not found") + context.par() +end + +context.stoptext() + diff --git a/tex/context/sample/sample.tex b/tex/context/sample/sample.tex index f39c328ee..d54d8b747 100644 --- a/tex/context/sample/sample.tex +++ b/tex/context/sample/sample.tex @@ -40,12 +40,15 @@ used in testing bibliographic references and citations. Thomas Dunne Books, 2007, p.160 \NC \NR \NC montgomery.tex \NC David R Montgomery \NC Dirt, The Erosion of Civilizations, \endgraf University of California Press, 2007, p.199 \NC \NR +\NC carrol.tex \NC Sean B. Carrol \NC The Making of the Fittest, \endgraf + Quercus, London, 2006 \NC \NR \stoptabulate % Tufte: This quote will always produce hyphenated text, apart from the content, % it's a pretty good test case for protruding. -% Ward: I should find a quote in the extremely well written Rare Earth as well. +% Ward: I should find a quote in the extremely well written Rare Earth as well. All Wards +% books excell. % A Short History of Nearly Everything: I wish that I had the memory to remember this book % verbatim. @@ -62,4 +65,7 @@ used in testing bibliographic references and citations. % Dirt, The Erosion of Civilizations: one of those books that you buy immediately after % reading a few sentences. Also one of those books that every politician should read. +% The Making of the Fittest: nice sample for color ans subsentence testing. A very +% readable book but unfortunately it has inter-character spacing. + \stoptext diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index 1726750f1..e369b6746 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts.lua --- merge date : 06/13/09 14:05:57 +-- merge date : 07/17/09 13:18:01 do -- begin closure to overcome local limits and interference @@ -1138,7 +1138,7 @@ function table.insert_after_value(t,value,str) end local function are_equal(a,b,n,m) -- indexed - if #a == #b then + if a and b and #a == #b then n = n or 1 m = m or #a for i=n,m do @@ -2033,7 +2033,6 @@ local whatsit = node.id('whatsit') local traverse_id = node.traverse_id local traverse = node.traverse -local slide_nodes = node.slide local free_node = node.free local remove_node = node.remove @@ -2055,10 +2054,10 @@ function nodes.delete(head,current) return nodes.remove(head,current,true) end -nodes.before = node.insert_before -- broken +nodes.before = node.insert_before nodes.after = node.insert_after --- we need to test this, as it might be fixed +-- we need to test this, as it might be fixed now function nodes.before(h,c,n) if c then @@ -2168,7 +2167,7 @@ if not modules then modules = { } end modules ['node-res'] = { } local gmatch, format = string.gmatch, string.format -local copy_node, free_node, new_node = node.copy, node.free, node.new +local copy_node, free_node, free_list, new_node = node.copy, node.free, node.flush_list, node.new --[[ldx-- <p>The next function is not that much needed but in <l n='context'/> we use @@ -2212,7 +2211,6 @@ function nodes.usage() return t end -local pdfliteral = nodes.register(new_node("whatsit",8)) pdfliteral.mode = 1 local disc = nodes.register(new_node("disc")) local kern = nodes.register(new_node("kern",1)) local penalty = nodes.register(new_node("penalty")) @@ -2221,6 +2219,7 @@ local glue_spec = nodes.register(new_node("glue_spec")) local glyph = nodes.register(new_node("glyph",0)) local textdir = nodes.register(new_node("whatsit",7)) local rule = nodes.register(new_node("rule")) +local latelua = nodes.register(new_node("whatsit",35)) function nodes.glyph(fnt,chr) local n = copy_node(glyph) @@ -2252,11 +2251,6 @@ end function nodes.disc() return copy_node(disc) end -function nodes.pdfliteral(str) - local t = copy_node(pdfliteral) - t.data = str - return t -end function nodes.textdir(dir) local t = copy_node(textdir) t.dir = dir @@ -2269,6 +2263,11 @@ function nodes.rule(w,h,d) if d then n.depth = d end return n end +function nodes.latelua(code) + local n = copy_node(latelua) + n.data = code + return n +end statistics.register("cleaned up reserved nodes", function() return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"])) @@ -2398,7 +2397,7 @@ end function nodes.trace_injection(head) local function dir(n) - return (n<0 and "r-to-l") or (n>0 and "l-to-r") or ("unset") + return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or ("unset") end local function report(...) logs.report("nodes finisher",...) @@ -2416,9 +2415,9 @@ function nodes.trace_injection(head) if kp then local k = kerns[kp] if k[3] then - report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2],k[3],k[4],k[5]) + report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?") else - report(" kern: dir=%s, dx=%s",dir(k[1]),k[2]) + report(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?") end end if mb then @@ -2429,13 +2428,13 @@ function nodes.trace_injection(head) if mb then local m = m[mb] if m then - report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,j,m[1],m[2]) + report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?") else report(" markmark: bound=%s, missing index",mm) end else m = m[1] - report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1],m[2]) + report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?") end end if cb then @@ -2443,7 +2442,7 @@ function nodes.trace_injection(head) end if cc then local c = cursives[cc] - report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2],c[3]) + report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?") end end end @@ -2452,18 +2451,24 @@ end -- todo: reuse tables (i.e. no collection), but will be extra fields anyway -function nodes.inject_kerns(head,tail,where,keep) - if trace_injections then - nodes.trace_injection(head) - end +function nodes.inject_kerns(head,where,keep) local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns) if has_marks or has_cursives then + if trace_injections then + nodes.trace_injection(head) + end -- in the future variant we will not copy items but refs to tables - local done, ky, rl, valid, cx, wx = false, { }, { }, { }, { }, { } + local done, ky, rl, valid, cx, wx, mk = false, { }, { }, { }, { }, { }, { } if has_kerns then -- move outside loop + local nf, tm = nil, nil for n in traverse_id(glyph,head) do if n.subtype < 256 then valid[#valid+1] = n + if n.font ~= nf then + nf = n.font + tm = fontdata[nf].marks + end + mk[n] = tm[n.char] local k = has_attribute(n,kernpair) if k then local kk = kerns[k] @@ -2482,9 +2487,15 @@ function nodes.inject_kerns(head,tail,where,keep) end end else + local nf, tm = nil, nil for n in traverse_id(glyph,head) do if n.subtype < 256 then valid[#valid+1] = n + if n.font ~= nf then + nf = n.font + tm = fontdata[nf].marks + end + mk[n] = tm[n.char] end end end @@ -2498,22 +2509,15 @@ function nodes.inject_kerns(head,tail,where,keep) end -- todo: reuse t and use maxt if has_cursives then - local n_cursbase, n_curscurs, p_cursbase, n, p, nf, tm = nil, nil, nil, nil, nil, nil, nil + local p_cursbase, p = nil, nil -- since we need valid[n+1] we can also use a "while true do" local t, d, maxt = { }, { }, 0 for i=1,#valid do -- valid == glyphs - n = valid[i] - if n.font ~= nf then - nf = n.font ---~ print(n.font,nf,fontdata[nf]) - tm = fontdata[nf].marks - -- maybe flush - maxt = 0 - end - if not tm[n.char] then - n_cursbase = has_attribute(n,cursbase) - n_curscurs = has_attribute(n,curscurs) + local n = valid[i] + if not mk[n] then + local n_cursbase = has_attribute(n,cursbase) if p_cursbase then + local n_curscurs = has_attribute(n,curscurs) if p_cursbase == n_curscurs then local c = cursives[n_curscurs] if c then @@ -2541,7 +2545,8 @@ function nodes.inject_kerns(head,tail,where,keep) local ny = n.yoffset for i=maxt,1,-1 do ny = ny + d[i] - t[i].yoffset = t[i].yoffset + ny + local ti = t[i] + ti.yoffset = ti.yoffset + ny end maxt = 0 end @@ -2549,7 +2554,8 @@ function nodes.inject_kerns(head,tail,where,keep) local ny = n.yoffset for i=maxt,1,-1 do ny = ny + d[i] - t[i].yoffset = ny + local ti = t[i] + ti.yoffset = ny end maxt = 0 end @@ -2560,7 +2566,8 @@ function nodes.inject_kerns(head,tail,where,keep) local ny = n.yoffset for i=maxt,1,-1 do ny = ny + d[i] - t[i].yoffset = ny + local ti = t[i] + ti.yoffset = ny end maxt = 0 end @@ -2569,14 +2576,13 @@ function nodes.inject_kerns(head,tail,where,keep) end end if has_marks then - local p_markbase, n_markmark = nil, nil for i=1,#valid do local p = valid[i] - p_markbase = has_attribute(p,markbase) + local p_markbase = has_attribute(p,markbase) if p_markbase then local mrks = marks[p_markbase] for n in traverse_id(glyph,p.next) do - n_markmark = has_attribute(n,markmark) + local n_markmark = has_attribute(n,markmark) if p_markbase == n_markmark then local index = has_attribute(n,markdone) or 1 local d = mrks[index] @@ -2585,9 +2591,17 @@ function nodes.inject_kerns(head,tail,where,keep) -- if rlmode and rlmode < 0 then -- n.xoffset = p.xoffset + d[1] -- else - n.xoffset = p.xoffset - d[1] + n.xoffset = p.xoffset - d[1] +--~ local k = wx[p] +--~ if k then +--~ wx[n] = k +--~ end -- end - n.yoffset = p.yoffset + d[2] + if mk[p] then + n.yoffset = p.yoffset + d[2] + else + n.yoffset = n.yoffset + p.yoffset + d[2] + end end else break @@ -2642,224 +2656,9 @@ function nodes.inject_kerns(head,tail,where,keep) kerns, cursives, marks = { }, { }, { } end elseif has_kerns then - -- we assume done is true because there are kerns - for n in traverse_id(glyph,head) do - local k = has_attribute(n,kernpair) - if k then - local kk = kerns[k] - if kk then - -- only w can be nil, can be sped up when w == nil - local rl, x, y, w = kk[1], kk[2] or 0, kk[3] or 0, kk[4] or 0 - if y ~= 0 then - n.yoffset = y -- todo: h ? - end - local wx = w - x - if rl < 0 then - if wx ~= 0 then - insert_node_before(head,n,newkern(wx)) - end - if x ~= 0 then - insert_node_after (head,n,newkern(x)) - end - else - -- if wx ~= 0 then - -- insert_node_after(head,n,newkern(wx)) - -- end - if x ~= 0 then - insert_node_before(head,n,newkern(x)) - end - end - end - end - end - if not keep then - kerns = { } - end - return head, true - end - return head, false -end - --- -- -- KEEP OLD ONE, THE NEXT IS JUST OPTIMIZED -- -- -- - -function nodes.XXXXXXXxinject_kerns(head,tail,keep) - if trace_injections then - nodes.trace_injection(head) - end - local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns) - if has_marks or has_cursives then - -- in the future variant we will not copy items but refs to tables - local done, ky, valid, cx, wx = false, { }, { }, { }, { } - for n in traverse_id(glyph,head) do - if n.subtype < 256 then - valid[#valid+1] = n - if has_kerns then -- move outside loop - local k = has_attribute(n,kernpair) - if k then - local kk = kerns[k] - if kk then - local x, y, w, h = kk[2], kk[3], kk[4], kk[5] - local dy = y - h - if dy ~= 0 then - ky[n] = dy - end - if w ~= 0 or x ~= 0 then - wx[n] = kk - end - end - end - end - end - end - if #valid > 0 then - -- we can assume done == true because we have cursives and marks - local cx = { } - if has_kerns and next(ky) then - for n, k in next, ky do - n.yoffset = k - end - end - -- todo: reuse t and use maxt - if has_cursives then - local n_cursbase, n_curscurs, p_cursbase, n, p, nf, tm = nil, nil, nil, nil, nil, nil, nil - -- since we need valid[n+1] we can also use a "while true do" - local t, d, maxt = { }, { }, 0 - for i=1,#valid do -- valid == glyphs - n = valid[i] - if n.font ~= nf then - nf = n.font - tm = fontdata[nf].marks - -- maybe flush - maxt = 0 - end - if not tm[n.char] then - n_cursbase = has_attribute(n,cursbase) - n_curscurs = has_attribute(n,curscurs) - if p_cursbase then - if p_cursbase == n_curscurs then - local c = cursives[n_curscurs] - if c then - local rlmode, dx, dy, ws, wn = c[1], c[2], c[3], c[4], c[5] - if rlmode >= 0 then - dx = dx - ws - else - dx = dx + wn - end - if dx ~= 0 then -if rlmode < 0 then - cx[n] = -dx -else - cx[n] = dx -end - end - -- if rlmode and rlmode < 0 then - dy = -dy - -- end - maxt = maxt + 1 - t[maxt] = p - d[maxt] = dy - else - maxt = 0 - end - end - elseif maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - t[i].yoffset = t[i].yoffset + ny - end - maxt = 0 - end - if not n_cursbase and maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - t[i].yoffset = ny - end - maxt = 0 - end - p_cursbase, p = n_cursbase, n - end - end - if maxt > 0 then - local ny = n.yoffset - for i=maxt,1,-1 do - ny = ny + d[i] - t[i].yoffset = ny - end - maxt = 0 - end - if not keep then - cursives = { } - end - end - if has_marks then - local p_markbase, n_markmark = nil, nil - for i=1,#valid do - local p = valid[i] - p_markbase = has_attribute(p,markbase) - if p_markbase then - local mrks = marks[p_markbase] - for n in traverse_id(glyph,p.next) do - n_markmark = has_attribute(n,markmark) - if p_markbase == n_markmark then - local index = has_attribute(n,markdone) or 1 - local d = mrks[index] - if d then - local d1, d2 = d[1], d[2] - if d1 ~= 0 then - n.xoffset = p.xoffset - d[1] - end - if d2 ~= 0 then - n.yoffset = p.yoffset + d[2] - end - end - else - break - end - end - end - end - if not keep then - marks = { } - end - end - -- todo : combine - if next(wx) then - for n, k in next, wx do - -- only w can be nil, can be sped up when w == nil - local rl, x, w = k[1], k[2] or 0, k[4] or 0 - local wx = w - x - if rl < 0 then - if wx ~= 0 then - insert_node_before(head,n,newkern(wx)) - end - if x ~= 0 then - insert_node_after (head,n,newkern(x)) - end - else - -- if wx ~= 0 then - -- insert_node_after(head,n,newkern(wx)) - -- end - if x ~= 0 then - insert_node_before(head,n,newkern(x)) - end - end - end - end - if next(cx) then - for n, k in next, cx do - insert_node_before(head,n,newkern(k)) - end - end - if not keep then - kerns = { } - end - return head, true - elseif not keep then - kerns, cursives, marks = { }, { }, { } + if trace_injections then + nodes.trace_injection(head) end - elseif has_kerns then -- we assume done is true because there are kerns for n in traverse_id(glyph,head) do local k = has_attribute(n,kernpair) @@ -2894,6 +2693,8 @@ end kerns = { } end return head, true + else + -- no tracing needed end return head, false end @@ -3124,17 +2925,17 @@ if not modules then modules = { } end modules ['node-dum'] = { nodes = nodes or { } function nodes.simple_font_dummy(head,tail) - return tail + -- ligaturing, kerning + return head, tail end function nodes.simple_font_handler(head) - local tail = node.slide(head) --- lang.hyphenate(head,tail) - head = nodes.process_characters(head,tail) +-- lang.hyphenate(head) + head = nodes.process_characters(head) nodes.inject_kerns(head) nodes.protect_glyphs(head) - tail = node.ligaturing(head,tail) - tail = node.kerning(head,tail) + head = node.ligaturing(head) + head = node.kerning(head) return head end @@ -3486,7 +3287,7 @@ function tfm.do_scale(tfmtable, scaledpoints) end -- status local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized - local hasmath = tfmtable.math_parameters ~= nil or tfmtable.MathConstants ~= nil + local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= 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 @@ -3534,6 +3335,7 @@ function tfm.do_scale(tfmtable, scaledpoints) local scaledheight = defaultheight * delta local scaleddepth = defaultdepth * delta local stackmath = tfmtable.ignore_stack_math ~= true +local private = fonts.private for k,v in next, characters do local chr, description, index if ischanged then @@ -3596,7 +3398,7 @@ function tfm.do_scale(tfmtable, scaledpoints) -- logs.report("define font","t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-') -- end if tounicode then - local tu = tounicode[index] + local tu = tounicode[index] -- nb: index! if tu then chr.tounicode = tu end @@ -3769,6 +3571,7 @@ function tfm.do_scale(tfmtable, scaledpoints) end -- needed for \high cum suis local tpx = tp.x_height +if hasmath then if not tp[13] then tp[13] = .86*tpx end -- mathsupdisplay if not tp[14] then tp[14] = .86*tpx end -- mathsupnormal if not tp[15] then tp[15] = .86*tpx end -- mathsupcramped @@ -3776,11 +3579,22 @@ function tfm.do_scale(tfmtable, scaledpoints) if not tp[17] then tp[17] = .48*tpx end -- mathsubcombined if not tp[22] then tp[22] = 0 end -- mathaxisheight if t.MathConstants then t.MathConstants.AccentBaseHeight = nil end -- safeguard +end t.tounicode = 1 t.cidinfo = tfmtable.cidinfo -- we have t.name=metricfile and t.fullname=RealName and t.filename=diskfilename -- when collapsing fonts, luatex looks as both t.name and t.fullname as ttc files -- can have multiple subfonts + if hasmath then + if trace_defining then + logs.report("define font","math enabled for: %s %s %s",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename") + end + else + if trace_defining then + logs.report("define font","math disabled for: %s %s %s",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename") + end + t.nomath, t.MathConstants = true, nil + end return t, delta end @@ -3955,7 +3769,7 @@ function tfm.set_features(tfmdata) local value = features[f] if value and fi.tfm[f] then -- brr if tfm.trace_features then - logs.report("define tfm","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown') + logs.report("define font","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown') end fi.tfm[f](tfmdata,value) mode = tfmdata.mode or fonts.mode @@ -4157,6 +3971,7 @@ local function locate(registry,ordering,supplement) logs.report("load otf","using cidmap file %s",filename) end fonts.cid.map[filename] = cidmap + cidmap.usedname = file.basename(filename) return cidmap end end @@ -5164,12 +4979,13 @@ local concat, getn, utfbyte = table.concat, table.getn, utf.byte local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip local type, next, tonumber, tostring = type, next, tonumber, tostring -local trace_private = false trackers.register("otf.private", function(v) trace_private = v end) -local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) -local trace_features = false trackers.register("otf.features", function(v) trace_features = v end) -local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end) -local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end) -local trace_math = false trackers.register("otf.math", function(v) trace_math = v end) +local trace_private = false trackers.register("otf.private", function(v) trace_private = v end) +local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) +local trace_features = false trackers.register("otf.features", function(v) trace_features = v end) +local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end) +local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end) +local trace_math = false trackers.register("otf.math", function(v) trace_math = v end) +local trace_unimapping = false trackers.register("otf.unimapping", function(v) trace_unimapping = v end) --~ trackers.enable("otf.loading") @@ -5233,7 +5049,7 @@ otf.features.default = otf.features.default or { } otf.enhancers = otf.enhancers or { } otf.glists = { "gsub", "gpos" } -otf.version = 2.626 -- beware: also sync font-mis.lua +otf.version = 2.628 -- beware: also sync font-mis.lua otf.pack = true -- beware: also sync font-mis.lua otf.syncspace = true otf.notdef = false @@ -5616,15 +5432,18 @@ otf.enhancers["analyse marks"] = function(data,filename) end end -local other = lpeg.C((1 - lpeg.S("_."))^0) -local ligsplitter = lpeg.Ct(other * (lpeg.P("_") * other)^0) +local separator = lpeg.S("_.") +local other = lpeg.C((1 - separator)^1) +local ligsplitter = lpeg.Ct(other * (separator * other)^0) ---~ print(splitter:match("this")) ---~ print(splitter:match("this.that")) ---~ print(splitter:match("such_so_more")) ---~ print(splitter:match("such_so_more.that")) +--~ print(table.serialize(ligsplitter:match("this"))) +--~ print(table.serialize(ligsplitter:match("this.that"))) +--~ print(table.serialize(ligsplitter:match("japan1.123"))) +--~ print(table.serialize(ligsplitter:match("such_so_more"))) +--~ print(table.serialize(ligsplitter:match("such_so_more.that"))) otf.enhancers["analyse unicodes"] = function(data,filename) + local tounicode16, tounicode16sequence = fonts.map.tounicode16, fonts.map.tounicode16sequence local unicodes = data.luatex.unicodes -- we need to move this code unicodes['space'] = unicodes['space'] or 32 -- handly later on @@ -5634,53 +5453,113 @@ otf.enhancers["analyse unicodes"] = function(data,filename) -- the tounicode mapping is sparse and only needed for alternatives local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?")) data.luatex.tounicode, data.luatex.originals = tounicode, originals + local lumunic, uparser, oparser + if false then -- will become an option + lumunic = fonts.map.load_lum_table(filename) + lumunic = lumunic and lumunic.tounicode + end + local cidinfo, cidnames, cidcodes = data.cidinfo + local usedmap = cidinfo and cidinfo.usedname + usedmap = usedmap and fonts.cid.map[usedmap] + if usedmap then + oparser = usedmap and fonts.map.make_name_parser(cidinfo.ordering) + cidnames = usedmap.names + cidcodes = usedmap.unicodes + end + uparser = fonts.map.make_name_parser() for index, glyph in next, data.glyphs do local name, unic = glyph.name, glyph.unicode or -1 -- play safe if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then - -- a.whatever or a_b_c.whatever or a_b_c - local split = ligsplitter:match(name) - if #split == 0 then - -- skip - elseif #split == 1 then - local u = unicodes[split[1]] - if u then - if type(u) == "table" then - u = u[1] - end - if u < 0x10000 then - originals[index], tounicode[index] = u, format("%04X",u) - else - originals[index], tounicode[index] = u, format("%04X%04X",u/1024+0xD800,u%1024+0xDC00) + local unicode = lumunic and lumunic[name] + if unicode then + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + end + -- cidmap heuristics, beware, there is no guarantee for a match unless + -- the chain resolves + if not unicode and usedmap then + local foundindex = oparser:match(name) + if foundindex then + unicode = cidcodes[foundindex] -- name to number + if not unicode then + local reference = cidnames[foundindex] -- number to name + if reference then + local foundindex = oparser:match(reference) + if foundindex then + unicode = cidcodes[foundindex] + if unicode then + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + end + end + if not unicode then + local foundcodes, multiple = uparser:match(reference) + if foundcodes then + if multiple then + originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true + else + originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes + end + end + end + end end - ns = ns + 1 - else - originals[index], tounicode[index] = 0xFFFD, "FFFD" end - else - local as = { } - for l=1,#split do - local u = unicodes[split[l]] - if not u then - as[l], split[l] = 0xFFFD, "FFFD" - else - if type(u) == "table" then - u = u[1] + end + -- a.whatever or a_b_c.whatever or a_b_c (no numbers) + if not unicode then + local split = ligsplitter:match(name) + local nplit = (split and #split) or 0 + if nplit == 0 then + -- skip + elseif nplit == 1 then + unicode = unicodes[split[1]] + if unicode then + if type(unicode) == "table" then + unicode = unicode[1] end - if u < 0x10000 then - as[l], split[l] = u, format("%04X",u) + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + end + else + local done = true + for l=1,nplit do + local u = unicodes[split[l]] + if not u then + done = false + break + elseif type(u) == "table" then + split[l] = u[1] else - as[l], split[l] = u, format("%04X%04X",u/1024+0xD800,u%1024+0xDC00) + split[l] = u end end + if done then + originals[index], tounicode[index], nl, unicode = split, tounicode16sequence(split), nl + 1, true + end end - split = concat(split) - if split ~= "" then - originals[index], tounicode[index] = as, split - nl = nl + 1 - else - originals[index], tounicode[index] = 0xFFFD, "FFFD" + end + -- last resort + if not unicode then + local foundcodes, multiple = uparser:match(name) + if foundcodes then + if multiple then + originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true + else + originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes + end end end + if not unicode then + originals[index], tounicode[index] = 0xFFFD, "FFFD" + end + end + end + if trace_unimapping then + for index, glyph in table.sortedpairs(data.glyphs) do + local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe + if toun then + logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun) + else + logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic) + end end end if trace_loading and (ns > 0 or nl > 0) then @@ -5698,16 +5577,14 @@ otf.enhancers["analyse subtables"] = function(data,filename) for _, g in next, { data.gsub, data.gpos } do for k=1,#g do local gk = g[k] - -local typ = gk.type -if typ == "gsub_contextchain" or typ == "gpos_contextchain" then - gk.chain = 1 -elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then - gk.chain = -1 -else - gk.chain = 0 -end - + local typ = gk.type + if typ == "gsub_contextchain" or typ == "gpos_contextchain" then + gk.chain = 1 + elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then + gk.chain = -1 + else + gk.chain = 0 + end local features = gk.features if features then sequences[#sequences+1] = gk @@ -5762,8 +5639,9 @@ otf.enhancers["merge cid fonts"] = function(data,filename) local cidinfo = data.cidinfo local verbose = fonts.verbose if cidinfo.registry then - local cidmap = fonts.cid.getmap and fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement) + local cidmap, cidname = fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement) if cidmap then + cidinfo.usedname = cidmap.usedname local glyphs, uni_to_int, int_to_uni, nofnames, nofunicodes = { }, { }, { }, 0, 0 local unicodes, names = cidmap.unicodes, cidmap.names for n, subfont in next, data.subfonts do @@ -6495,7 +6373,7 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th } -- indices maps from unicodes to indices for u, i in next, indices do - characters[u] = { } -- we need this because for instance we add protruding info + characters[u] = { } -- we need this because for instance we add protruding info and loop over characters descriptions[u] = glyphs[i] end -- math @@ -7370,7 +7248,7 @@ trackers.register("*otf.sample","otf.steps,otf.actions,otf.analyzing") local insert_node_after = node.insert_after local delete_node = nodes.delete local copy_node = node.copy -local slide_node_list = node.slide +local find_node_tail = node.tail or node.slide local set_attribute = node.set_attribute local has_attribute = node.has_attribute @@ -9125,7 +9003,7 @@ function fonts.methods.node.otf.features(head,font,attr) local handler = handlers[typ] local thecache = featuredata[typ] or { } -- we need to get rid of this slide ! - start = slide_node_list(head) -- slow (we can store tail because there's always a skip at the end): todo + start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo while start do local id = start.id if id == glyph then @@ -11010,6 +10888,229 @@ end -- closure do -- begin closure to overcome local limits and interference +if not modules then modules = { } end modules ['font-map'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local match, format, find, concat = string.match, string.format, string.find, table.concat + +local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) + +local ctxcatcodes = tex.ctxcatcodes + +--[[ldx-- +<p>Eventually this code will disappear because map files are kind +of obsolete. Some code may move to runtime or auxiliary modules.</p> +<p>The name to unciode related code will stay of course.</p> +--ldx]]-- + +fonts = fonts or { } +fonts.map = fonts.map or { } +fonts.map.data = fonts.map.data or { } +fonts.map.encodings = fonts.map.encodings or { } +fonts.map.done = fonts.map.done or { } +fonts.map.loaded = fonts.map.loaded or { } +fonts.map.direct = fonts.map.direct or { } +fonts.map.line = fonts.map.line or { } + +function fonts.map.line.pdfmapline(tag,str) + return "\\loadmapline[" .. tag .. "][" .. str .. "]" +end + +function fonts.map.line.pdftex(e) -- so far no combination of slant and stretch + if e.name and e.fontfile then + local fullname = e.fullname or "" + if e.slant and e.slant ~= 0 then + if e.encoding then + return fonts.map.line.pdfmapline("=",format('%s %s "%g SlantFont" <%s <%s',e.name,fullname,e.slant,e.encoding,e.fontfile)) + else + return fonts.map.line.pdfmapline("=",format('%s %s "%g SlantFont" <%s',e.name,fullname,e.slant,e.fontfile)) + end + elseif e.stretch and e.stretch ~= 1 and e.stretch ~= 0 then + if e.encoding then + return fonts.map.line.pdfmapline("=",format('%s %s "%g ExtendFont" <%s <%s',e.name,fullname,e.stretch,e.encoding,e.fontfile)) + else + return fonts.map.line.pdfmapline("=",format('%s %s "%g ExtendFont" <%s',e.name,fullname,e.stretch,e.fontfile)) + end + else + if e.encoding then + return fonts.map.line.pdfmapline("=",format('%s %s <%s <%s',e.name,fullname,e.encoding,e.fontfile)) + else + return fonts.map.line.pdfmapline("=",format('%s %s <%s',e.name,fullname,e.fontfile)) + end + end + else + return nil + end +end + +function fonts.map.flush(backend) -- will also erase the accumulated data + local flushline = fonts.map.line[backend or "pdftex"] or fonts.map.line.pdftex + for _, e in pairs(fonts.map.data) do + tex.sprint(ctxcatcodes,flushline(e)) + end + fonts.map.data = { } +end + +fonts.map.line.dvips = fonts.map.line.pdftex +fonts.map.line.dvipdfmx = function() end + +function fonts.map.convert_entries(filename) + if not fonts.map.loaded[filename] then + fonts.map.data, fonts.map.encodings = fonts.map.load_file(filename,fonts.map.data, fonts.map.encodings) + fonts.map.loaded[filename] = true + end +end + +function fonts.map.load_file(filename, entries, encodings) + entries = entries or { } + encodings = encodings or { } + local f = io.open(filename) + if f then + local data = f:read("*a") + if data then + for line in gmatch(data,"(.-)[\n\t]") do + if find(line,"^[%#%%%s]") then + -- print(line) + else + local stretch, slant, name, fullname, fontfile, encoding + line = line:gsub('"(.+)"', function(s) + stretch = find(s,'"([^"]+) ExtendFont"') + slant = find(s,'"([^"]+) SlantFont"') + return "" + end) + if not name then + -- name fullname encoding fontfile + name, fullname, encoding, fontfile = match(line,"^(%S+)%s+(%S*)[%s<]+(%S*)[%s<]+(%S*)%s*$") + end + if not name then + -- name fullname (flag) fontfile encoding + name, fullname, fontfile, encoding = match(line,"^(%S+)%s+(%S*)[%d%s<]+(%S*)[%s<]+(%S*)%s*$") + end + if not name then + -- name fontfile + name, fontfile = match(line,"^(%S+)%s+[%d%s<]+(%S*)%s*$") + end + if name then + if encoding == "" then encoding = nil end + entries[name] = { + name = name, -- handy + fullname = fullname, + encoding = encoding, + fontfile = fontfile, + slant = tonumber(slant), + stretch = tonumber(stretch) + } + encodings[name] = encoding + elseif line ~= "" then + -- print(line) + end + end + end + end + f:close() + end + return entries, encodings +end + +function fonts.map.load_lum_table(filename) + local lumname = file.replacesuffix(file.basename(filename),"lum") + local lumfile = resolvers.find_file(lumname,"map") or "" + if lumfile ~= "" and lfs.isfile(lumfile) then + if trace_loading or trace_unimapping then + logs.report("load otf","enhance: loading %s ",lumfile) + end + lumunic = dofile(lumfile) + return lumunic, lumfile + end +end + +local hex = lpeg.R("AF","09") +local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end +local dec = (lpeg.R("09")^1) / tonumber +local period = lpeg.P(".") + +local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true)) +local index = lpeg.P("index") * dec * lpeg.Cc(false) + +local parser = unicode + index + +local parsers = { } + +function fonts.map.make_name_parser(str) + if not str or str == "" then + return parser + else + local p = parsers[str] + if not p then + p = lpeg.P(str) * period * dec * lpeg.Cc(false) + parsers[str] = p + end + return p + end +end + +--~ local parser = fonts.map.make_name_parser("Japan1") +--~ local function test(str) +--~ local b, a = parser:match(str) +--~ print((a and table.serialize(b)) or b) +--~ end +--~ test("uni1234") +--~ test("uni1234.xx") +--~ test("uni12349876") +--~ test("index1234") +--~ test("Japan1.123") + +function fonts.map.tounicode16(unicode) + if unicode < 0x10000 then + return format("%04X",unicode) + else + return format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00) + end +end + +function fonts.map.tounicode16sequence(unicodes) + local t = { } + for l=1,#unicodes do + local unicode = unicodes[l] + if unicode < 0x10000 then + t[l] = format("%04X",unicode) + else + t[l] = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00) + end + end + return concat(t) +end + +--~ This is quite a bit faster but at the cost of some memory but if we +--~ do this we will also use it elsewhere so let's not follow this route +--~ now. I might use this method in the plain variant (no caching there) +--~ but then I need a flag that distinguishes between code branches. +--~ +--~ local cache = { } +--~ +--~ function fonts.map.tounicode16(unicode) +--~ local s = cache[unicode] +--~ if not s then +--~ if unicode < 0x10000 then +--~ s = format("%04X",unicode) +--~ else +--~ s = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00) +--~ end +--~ cache[unicode] = s +--~ end +--~ return s +--~ end + + +end -- closure + +do -- begin closure to overcome local limits and interference + if not modules then modules = { } end modules ['font-dum'] = { version = 1.001, comment = "companion to luatex-*.tex", diff --git a/tex/generic/context/luatex-fonts.lua b/tex/generic/context/luatex-fonts.lua index be565c7b3..690a6e599 100644 --- a/tex/generic/context/luatex-fonts.lua +++ b/tex/generic/context/luatex-fonts.lua @@ -120,6 +120,7 @@ else loadmodule('font-otc.lua') loadmodule('font-def.lua') loadmodule('font-xtx.lua') + loadmodule('font-map.lua') -- for loading lum file (will be stripped) loadmodule('font-dum.lua') end @@ -127,8 +128,8 @@ end -- In order to deal with the fonts we need to initialize some -- callbacks. One can overload them later on if needed. -callback.register('ligaturing', nodes.simple_font_dummy) -callback.register('kerning', nodes.simple_font_dummy) +callback.register('ligaturing', nodes.simple_font_dummy) -- better: false +callback.register('kerning', nodes.simple_font_dummy) -- better: false callback.register('pre_linebreak_filter', nodes.simple_font_handler) callback.register('hpack_filter', nodes.simple_font_handler) callback.register('define_font' , fonts.define.read) diff --git a/tex/generic/context/mptopdf.tex b/tex/generic/context/mptopdf.tex index fe3ad2ed9..1f229678d 100644 --- a/tex/generic/context/mptopdf.tex +++ b/tex/generic/context/mptopdf.tex @@ -70,7 +70,7 @@ %D allocation macros, we preload plain \TEX. We don't load %D fonts yet. -\input syst-tex +\input syst-tex.mkii %D We check for the usage of \PDFTEX, and quit if another %D \TEX\ is used. @@ -83,9 +83,9 @@ %D The conversion to \PDF\ is carried out by macros, that %D are collected in the file: -\input supp-mis -\input supp-pdf -\input supp-mpe \MPcmykcolorstrue \MPspotcolorstrue +\input supp-mis.mkii +\input supp-pdf.mkii +\input supp-mpe.mkii \MPcmykcolorstrue \MPspotcolorstrue %D We use no output routine. diff --git a/tex/generic/context/ppchtex.noc b/tex/generic/context/ppchtex.noc index 8819de024..99d073255 100644 --- a/tex/generic/context/ppchtex.noc +++ b/tex/generic/context/ppchtex.noc @@ -30,8 +30,8 @@ %D First we load some auxiliary macro's: -\input supp-mis.tex \let\writestatus\undefined -\input syst-gen.tex +\input supp-mis.mkii \let\writestatus\undefined +\input syst-gen.mkii \input syst-fnt.mkii %D after which we can go on with: diff --git a/tpm/t-bib.tpm b/tpm/t-bib.tpm index 9f426e53e..8c0ac1dff 100644 --- a/tpm/t-bib.tpm +++ b/tpm/t-bib.tpm @@ -11,9 +11,9 @@ A bibliographic subsystem for ConTeXt </TPM:Description> <TPM:Author>Taco Hoekwater</TPM:Author> - <TPM:Size>575117</TPM:Size> + <TPM:Size>575221</TPM:Size> <TPM:Build/> - <TPM:RunFiles size="258315"> + <TPM:RunFiles size="258419"> tex/context/bib/bibl-ams.tex tex/context/bib/bibl-apa-de.tex tex/context/bib/bibl-apa-fr.tex diff --git a/web2c/context.cnf b/web2c/context.cnf index 13c385ba4..07ca3f7f5 100644 --- a/web2c/context.cnf +++ b/web2c/context.cnf @@ -146,7 +146,9 @@ shell_escape = t openout_any = p openin_any = a parse_first_line = f -allow_multiple_suffixes = f + +% allow_multiple_suffixes = f +try_std_extension_first = f shell_escape.context = t shell_escape_commands.context = mtxrun,luatools,texmfstart,texexec,mpost |